在介绍之前,先把ARM中常见的寄存器及其别名截图,如下:
其中的r1,r2,r3常用作传递参数,r4至r11保存局部变量,r13常用作数据栈指针,别名sp;r14寄存器称作连接寄存器,别名lr,常用保存子程序返回地址;寄存器r15是程序计数器,别名pc
(1)相对跳转指令:b、bl
这俩条指令的不同之处在于bl指令除了跳转之外,还将返回地址(bl的下一条指令的地址)保存再lr寄存器中
这俩条指令可跳转范围是当前指令的前后32MB,并且这俩条指令是与位置无关的指令
例如:
/* 死循环 */
halt:
b halt
(2)数据传送指令mov,地址读取伪指令ldr
mov可以把一个寄存器的值(或一个常数)赋值给寄存器
例如:
mov r1,r2 /*把寄存器r2的值赋值给r1*/
mov r1,#4096
/*把4096写到寄存器r1中,#号后面的常数必须为立即数,当不确定这个常数是不是可以用立即数表示,
我们一般用ldr命令赋值*/
ldr r1,=4097
/*这种形式的ldr为伪指令,伪指令的意思是不存在这条指令,这条指令在执行时会自动拆分成多条指令去执行,
一般这种形式用于比较大的数给寄存器赋值的情况*/
(3)内存访问指令:ldr,str,ldm,stm
ldr指令从内存中读取数据到寄存器,str指令把寄存器的值存储到内存中,他们操作的数据都是32位的。
例如:
ldr r1,[r2,#4] /*将地址为r2+4的内存单元数据读取到r1中*/
ldr r1,[r2] /*将地址为r2的内存单元数据读取到r1中*/
ldr r1,[r2],#4 /*将地址为r2的内存单元数据读取到r1中,然后r2=r2+4*/
str r1,[r2,#4] /*将寄存器r1中的数据存到地址为r2+4的内存单元*/
str r1,[r2] /*将寄存器r1中的数据存到地址为r2的内存单元*/
str r1,[r2],#4 /*将寄存器r1中的数据存到地址为r2的内存单元,然后r2=r2+4*/
ldm,stm则是对多个寄存器操作,前置读内存,将数据写入多个寄存器中,后者把多个寄存器的值写入内存
(4)加减指令:add,sub
add r1,r2,#1 /*r1 =r2+1*/
sub r1,r2,#1 /*r1=r2-1*/
关于其他汇编指令,请参照ARM指令集手册学习,下载地址如下:
链接:https://pan.baidu.com/s/1AHf-et7M8mCRCTAUIy3OAw
提取码:d6qn