常用的汇编指令:
1、相对跳转指令:b、b1
这两条指令的不同之处在于bl指令除了跳转之外,还将返回地址(bl的下一条指令的地址)保存在lr寄存器中。都是位置无关指令。
2、数据传送指令mov,地址读取伪指令ldr
mov指令可以把一个寄存器的值赋给另一个寄存器,或者把一个常数赋给寄存器,mov指令传送的常数必须能用立即数来表表示。ldr是伪指令,它不是真实存在的指令,编译器会把它扩展成真正的指令,如果该常数能用立即数来标识,则使用mov,否则编译时将该常数保存在某个位置,使用内存读取指令把它读出来。
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] /*将r1的数据保存在地址为r2的内存单元中*/
4、加减指令:add、sub
add r1,r2,#1 表示r1=r2+1
sub r1,r2,#1 表示r1=r2-1
5、程序状态寄存器的访问指令:msr、mrs
ARM处理器有一个程序状态寄存器(cprs),她用来控制处理器的工作模块、设置中断的总开关。
msr cpsr,r0 复制r0到cpsr中
mrs r0,cprs 复制cprs到r0中
6、其他伪指令
.extern main :定义一个外部符合(可以是变量也可以是函数),这里的代码表示本文件中引用的main是一个外部函数。
.text: 表示下面的语句都属于代码段
.global _start:_start是一个全局函数
.start
7、跳转指令:
B 是最简单的分支。一旦遇到一个 B 指令,ARM 处理器将立即跳转到给定的地址,从那里继续执行。 BNE指令,是个条件跳转,即:是“不相等(或不为0)跳转指令”。如果不为0就跳转到后面指定的地址,继续执行
7、ARM-THUMB子程序调用规则ATPCS
子程序间通过寄存器r0-r3来传递参数,可以使用它们的别名a0-a3
子程序使用r4-r11来保存局部变量,可以使用它们的别名v1-v8
寄存器r12用作子程序间scratch寄存器,别名为ip
寄存器r13用作数据栈指针,别名为sp。在子程序寄存器r13不能用作其他用途。
寄存器r14称为连接寄存器,别名为lr。
寄存器r15是程序计数器,别名为pc,不能用作其他用途。
8、mov pc,lr 函数返回
ARM中LR存储的是PC的值,IR存储的是下一条将要执行的指令,有什么区别?
先看定义:
(1)PC是程序计数器,存储将要执行的指令地址
(2)LR是链接寄存器,是ARM处理器中一个有特殊用途的寄存器,当调用函数时,返回地址即PC的值被保存到LR中(mov lr,pc)。
(3)IR是指令寄存器,用来保存当前正在执行的一条指令。当执行一条指令时,先把它从内存取到数据寄存器(DR)中(有的书上叫做缓冲寄存器,BR),然后再传送至IR。
说白了,LR存的是指令地址,IR存的是指令内容。