Frage

In Armbaugruppe immediates werden durch einen 8-Bit-Wert codiert wird gedreht, was bedeutet, können wir nur codieren

(0-256)^2n.

Nun mein Problem ist, dass ich die oberen 16-Bits von r0 und ersetzen Sie es mit dem Halbwort gespeichert r1 löschen möchten. Aber wegen der begrenzten Reichweite der immediates ich tun muss: -

bic r0, r0, #0xff000000
bic r0, r0, #0x00ff0000
add r0, r0, r1, LSL #16

Ist es möglich, die 2 bic Anweisungen mit einem einzigen Befehl ersetzen? 0xffff0000 ist unencodable. Vielleicht sollte ich eine andere logische Operation sein mit den oberen 16 Bits löschen?

Danke

EDIT: Sorry, ich, dass die Top-16-Bits von r1 zu sagen vergessen sind leer, und ich bin mit einem ARM7TDMI

War es hilfreich?

Lösung

Wie wäre:

orr r0,r1,r0,lsl #16
mov r0,r0,ror #16

(Dies setzt voraus, dass das obere Halbwort von r1 leer ist, wie Ihr Referenzcode haben.) Je nach den Umständen können Sie in der Lage sein, die endgültige mov hier wegzulassen, indem sie es mit einem späteren Code zusammenführen.

Andere Tipps

Wenn Sie einen neuen genug ARM-Kern die gestellte Frage haben, ist einfach:

movt    r0, #0
orr     r0, r0, r1,lsl#16

Siehe http://www.keil.com/support/man /docs/armasm/armasm_cjagdjbf.htm

Wenn Sie jedoch ARMv6 tun haben + Sie eigentlich das ganze zitiertes Beispiel in einem Rutsch zu tun:

pkhbt   r0, r0, r1,lsl#16

Siehe http://www.keil.com/support/man /docs/armasm/armasm_cihjedjg.htm

„ersetzen Sie es mit dem Halbwort r1 gespeichert“ - bedeutet das Sie die Top-16 Bits von R1 Null annehmen kann? Wenn ja,

add r0, r1, r0 lsl #16
mov r0, r0 ror #16

Denken Sie an der mov als Platzhalter, da Sie hoffentlich die ror bewegen können, was auch immer neben r0 als Eingabe nehmen würde und tatsächlich tun nützliche Arbeit im gleichen Zyklus.

Auf ARMv6 (z MPCore), kann man sagen,

    uxth    r1, r1
    orr     r0, r1, r0, asl #16

Wenn Sie die ganze Sache klären können, können Sie es mit sich selbst xor.

Wenn Sie die untere Hälfte beibehalten müssen, können Sie in der Lage sein, die Register 8 Bits auf der linken zu verschieben und zurück? Das mag gleiche Anzahl von Anweisungen, aber sein.

Für den C-Code

 (a<<16)|((short)b)

gcc erzeugt

    mov     r1, r1, asl #16
    mov     r1, r1, asr #16
    orr     r0, r1, r0, asl #16

die verwendet keine immediates - es noch zwei Anweisungen ist, obwohl

.

Sie können BFC Anweisung verwenden. Bit-Feld löschen. Dieser Befehl löscht n Bits von m-Bit

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top