Klarer oberer 16-Bits in 1 ARM-Befehl
-
08-07-2019 - |
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
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