一、指令格式
ARM指令的助记符
ARM指令在汇编程序中用助记符表示,一般ARM指令的助记符格式为:
{} {S} ,,
其中:
操作码,如ADD表示算术加操作指令;
{} 决定指令执行的条件域;
{S} 决定指令执行是否影响CPSR寄存器的值;
目的寄存器;
第一个操作数,为寄存器;
第二个操作数。
如果一个32位立即数直接用在32位指令编码中,就有可能完全占据32位指令编码空间。因此,ARM指令的32位立即数是通过循环右移偶数位得到的。
立即数是由一个8位的常数循环右移位偶数位得到的。
二、9种寻址方式
a)立即数寻址
在立即数寻址中,操作数本身直接在指令中给出,取出指令也就获得了操作数,这个操作数也称为立即数。 #后接0x或&表示十六进制数,0b表示二进制数,0d或缺省表示十进制数。
例:
ADD R0,R1,#5; R0=R1+5
MOV R0,#0x55; R0=0x55
其中:操作数5,0x55就是立即数,立即数在指令中要以“#”为前缀,后面跟实际数值。
b)寄存器寻址
在寄存器寻址方式下,寄存器的值即为操作数。ARM指令普遍采用此种寻址方式。
例:
ADD R0,R1,R2 ; R0=R1+R2
MOV R0,R1 ; R0=R1
c)寄存器移位寻址
寄存器移位寻址的操作数由寄存器的数值做相应移位而得到。移位的方式在指令中以助记符的形式给出,而移位的位数可用立即数或寄存器寻址方式表示。
例:
ADD R0,R1,R2,ROR #5
;R0=R1+R2循环右移5位
MOV R0,R1,LSL R3
;R0=R1逻辑左移R3位
移位操作在ARM指令集中不作为单独的指令使用,ARM指令集共有5种位移操作。
ARM指令集的5种位移操作
LSL逻辑左移 :Rx,LSL
LSR逻辑右移 : Rx,LSR
ASR算术右移 :Rx,ASR
ROR循环右移 :Rx,ROR
RRX带扩展的循环右移:Rx,RRX
d)寄存器间接寻址
寄存器中的值为操作数的物理地址,而实际的操作数存放在存储器中。
例:
STR R0,[R1] ; [R1]=R0
LDR R0,[R1] ; R0=[R1]
e)基址变址寻址
将寄存器(称为基址寄存器)的值与指令中给出的偏移地址量相加,所得结果作为操作数的物理地址。
例:
LDR R0,[R1,#5] ; R0=[R1+5]
LDR R0,[R1,R2] ; R0=[R1+R2]
f)相对寻址
相对寻址同基址变址寻址相似,区别只是将程序计数器PC作为基址寄存器,指令中的标记作为地址偏移量。
例:
BEQ process1
……
process1
……
g)多寄存器寻址
在多寄存器寻址方式中,一条指令可实现一组寄存器值的传送。连续的寄存器间用“-”连接,否则用“,”分隔。允许一条指令传送16个寄存器的任何子集或所有寄存器。
例:
LDMIA R0,{R1-R5}
;R1=[R0],R2=[R0+4],R3=[R0+8]
;R4=[R0+12],R5=[R0+16]
指令中IA表示在执行完一次Load操作后,R0自增4。该指令将以R0为起始地址的5个字数据分别装入R1,R2,R3,R4,R5中。
h)块拷贝寻址
块拷贝寻址可实现连续地址数据从存储器的某一位置拷贝到另一位置。
例:
LDMIA R0,{R1-R5};
STMIA R1,{R1-R5};
第一条指令从以R0的值为起始地址的存储单元中取出5个字的数据,第二条指令将取出的数据存入以R1的值为起始地址的存储单元中。
实际上是多寄存器寻址的组合。
j)堆栈寻址
堆栈寻址用于数据栈与寄存器组之间批量数据传输。 当数据写入和读出内存的顺序不同时,使用堆栈寻址可以很好的解决这问题。
例:
STMFD R13!,{R0,R1,R2,R3,R4};
LDMFD R13!,{R0,R1,R2,R3,R4}
第一条指令,将R0-R4中的数据压入堆栈,R13为堆栈指针;
第二条指令,将数据出栈,恢复R0-R4原先的值。
存储器堆栈可分为4种:
向上生长:向高地址方向生长,称为递增满(空)堆栈
阅读(1554) | 评论(0) | 转发(0) |