ARM指令尋址方式之: 數(shù)據(jù)處理指令的尋址方式
2.寄存器方式
寄存器的值可以被直接用于數(shù)據(jù)操作指令,如:
MOV r2,r0 ;r0的值送r2
ADD r4,r3,r2 ;r2加r3,結果送r4
CMP r7,r8 ;比較r7和r8的值
3.寄存器移位方式
寄存器的值在被送到ALU之前,可以事先經(jīng)過桶形移位寄存器的處理。預處理和移位發(fā)生在同一周期內,所以有效的使用移位寄存器,可以增加代碼的執(zhí)行效率。
具體的移位(或者循環(huán)移位)方式有下面幾種。
· ASR:算術右移。
· LSL:邏輯左移。
· LSR:邏輯右移。
· ROR:循環(huán)右移。
· RRX:擴展的循環(huán)右移。
以上5種移位方式,移位值均可以由立即數(shù)或寄存器指定。下面是一些在指令中使用了移位操作的例子。
ADD r2,r0,r1,LSR #5
MOV r1,r0,LSL #2
RSB r9,r5,r5,LSL #1
SUB r1,r2,r0,LSR #4
MOV r2,r4,ROR r0
4.1.4 尋址方式分類詳解
數(shù)據(jù)處理指令的尋址方式根據(jù)shifter_operand>的不同,相應的分為11種。詳見表4.1。下面對各類尋址方式進行詳細說明。
1.#immediate>
(1)編碼格式
指令的編碼格式如圖4.2所示。
圖4.2 數(shù)據(jù)處理指令——立即數(shù)尋址編碼格式
立即數(shù)尋址為數(shù)據(jù)處理指令提供了一個可直接操作的立即數(shù)。立即數(shù)的生成方法見前面章節(jié)介紹。如果移位值為0,則移位進位值為程序狀態(tài)寄存器CPSR的C標志位;否則,為32-bit立即數(shù)的bit[31]。
(2)操作偽代碼
Shifter_operand = immed_8 Rotate_Right (rotate_imm*2)
if rotate_imm == 0 then
shifter_carry_out = C flag
else /* rotate_imm != 0*/
shifter_carry_out = shifter_operand[31]
(3)說明
① 并不是所有的32-bit立即數(shù)都是可以使用的合法立即數(shù)。只有那些通過將一個8-bit的立即數(shù)循環(huán)右移偶數(shù)位可以得到的立即數(shù)才可以在指令中使用。
② 有些立即數(shù)可以通過不止一種方法得到。由于立即數(shù)的構造方法中移位包含了循環(huán)操作,而循環(huán)移位操作會影響CPSR的條件標志位C。因此,同一個合法的立即數(shù)由于采用了不同的編碼方式,將使這些指令的執(zhí)行產(chǎn)生不同的結果,這是不能允許的。ARM匯編器按照下面的規(guī)則來生成立即數(shù)的編碼。
· 當立即數(shù)數(shù)值在0和0xFF范圍時,令immed_8=immediate>,immed_4=0。
· 其他情況下,匯編編譯器選擇使用immed_4數(shù)值最小的編碼方式。
③ 為了更精確地控制立即數(shù)的生成,可以使用下面的語法格式控制立即數(shù)的生成。
#immed_8>,rotate_amout>
其中,rotate_amout> = 2*rotate_imm
(4)舉例
SUBS r0,r0,#1 ;寄存器r0中的數(shù)值減1,結果保存到r0
MOV r0,#0xff00 ; 0xff00 → r0 ;將立即數(shù)0xff00放入r0保存
評論