2016-05-15 9 views
0

Gibt es eine Möglichkeit, um Bit-Verschiebung einen unmittelbaren Wert wie folgt aus:Wie Bit-Verschiebung einen unmittelbaren Wert

MOV R0, #N, LSR #1 (nicht funktioniert)

oder muss ich diese Anweisungen in zwei tun?

MOV R0, #N MOV R0, R0, LSR #1

+0

Warum möchten Sie das tun? –

+0

Ich möchte den Wert von N/2 in R0 – DBLouis

+0

Nun, verwenden Sie einfach eine sofortige, die der Wert von N/2 ist! –

Antwort

1

die Sorge Assembler Lassen Sie über immediates in Maschinencode mit dem Barrel-Shifter codiert.

Wie Michael sagt, unterstützen Montierer Ausdrücke auf zusammenbauen-Zeitkonstanten, so sollten Sie in der Lage sein

MOV R0, #(N >> 1) 

so lange zu schreiben, wie das in einem Wert führt, die mit der begrenzten Anzahl von unmittelbaren Bits codiert werden kann und rotiere die Anzahl.

Wenn Sie nicht sicher sind, wird es immer montieren und sind in Ordnung, die Wahl des Assembler zu verlassen, verwenden Sie die Pseudo-Instruktion, die Art und Weise in welchem ​​eine Konstante in ein Register wird am effizientesten ist:

ldr r0, =(N >> 1)  @ I think I have the right syntax here 

Dies wird entweder zu einer mov-unmittelbaren oder einer PC-relativen Last von einer nahegelegenen Konstanten oder einer anderen Wahl zusammengestellt.


Wenn Sie sich interessieren, um die Kodierung für mov r0, #value verwendet wird (zB 0x4 ROR 2 vs. 0x1 ROR 0), verwenden Sie dann:

mov r0, #0x4, #2  @ rotates to the right by 2. 

Im Gegensatz zu mov mit Registeroperanden, mov -immediate nicht bieten eine Auswahl an Barrel-Shifter-Optionen wie LSL, LSR, ROL, ROR. Es ist immer rechtsdrehend, und die Zählung muss für die ARM-Codierung gleich sein.

IIRC, Daumen erlaubt jede Zählung, aber es gibt weniger unmittelbare Bits.

Weitere Informationen finden Sie unter ARMv7 reference manual.

+1

Die Syntax für eine explizite unmittelbare Codierung lautet '# imm8, # rot', z. 'mov r0, # 4, # 2' für einen Nicht-Standard' mov r0, # 1' (die Drehung ist rechts, nicht links). – Notlikethat