嵌入式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

经验分享 程序员 微信小程序 职场和发展