1、基本概念
汇编指令:机器指令(32位的二进制数)的助记符,需要经过编译得到机器指令,由cpu读取执行
伪指令:不是真正的汇编指令,是用来指导编译过程的,由编译器提供
立即数:就类似c语言的常量 1 2,在汇编中:#1
2、数据搬移指令
Mov r0, #1 @将立即数1拷贝到寄存器r0中
Mov r1,r0 @ r1 = r0
汇编指令的格式:
<opcode> {<cond>} {s} <rd>,<rn>,{<operand2>}
其中:<>内的项是必须的,{}是可选的
Opcode:汇编指令
Cond:执行条件
S:是否影响cpsr寄存器的高四位
Rd:目标寄存器
Rn:第一个操作数寄存器,只能是寄存器,mov没有
Operand2:第二操作数,可以是寄存器,也可以是立即数
为什么mov指令在使用的时候需要考虑立即数是否合法?
答:因为机器指令是32位,其中要体现出指令+目标寄存器+第二操作数,所以第二操作数肯定小于32位,其所占位数位12位,其中还包含移位指令,所能使用的位数位8位,也就是0到7位,所以立即数需要判断是否合法。
31-28:条件码
27-26:预留,默认是0
25:1 第二操作数是立即数 0 第二操作数是寄存器
24-21:汇编指令 mov:1101
20:1 影响cpsr的高四位 0 不影响cpsr的高四位
19-16:0000 第一操作数
15-12:目标寄存器
11-0:
如果是寄存器:3-0 第二操作数寄存器 5-6 移位方式 11-7 移动的位数
如果是立即数:0-7 一个立即数 8-11:0-7位的立即数要循环右移的位数
总结:
- 如果立即数在0-255之间肯定是合法
- 如果超出了255,就要看这个数能不能通过一个0-7位有值其他位为0的这个数循环右移偶数位得到,如果能就是合法,否则就是非法
- 非法的立即数可以ldr伪指令,ldr r3,=0x12345678
3、算术指令
Add r2,r1,r0 @r2 = r1+r0
Add r2,r2,r1 @r2 = r2+r1 -->add r2,r1 @r2 += r1
Add r2,r1,lsl #2 @r2 = r2 + r1 << 2; 注意:第二操作数只能是寄存器
Sub r2,r1,r0 @r2 = r1-r0
Mul r2,r1,r0 @r2 = r1 * r0
4、逻辑指令
And r2,r1,r0 @r2 = r1 & r0
Orr r2,r1,r0 @r2 = r1 | r0
Bic r2,#0x11 @将r2的第四位和第0位清0
5、比较指令
不加s都会影响cpsr的高四位
Cmp r0,r1 @比较r0和r1的大小
@判断r0和r1的大小
@r0=r1 r2 = 0xee
@r0 > r1 r2 = 0xdd
@r0 < r1 r2 = 0xcc
cmp r0,r1
moveq r2,#0xee
movhi r2,#0xdd
movcc r2,#0xcc
Tst r0,#0x10 @判断r0的第4位是否为0
ATPS标准规定:如果需要传参r0-r3就是用来传参的,r0是返回值,如果大于4个参数就要用到栈区
6、跳转指令
B 类似c语言的goto
b是无条件跳转指令
B aa
7、内存操作指令
b:将内存的内容(指令或者数据)拷贝到寄存器
Str:将寄存器的内容拷贝到内存
内存和内存拷贝:内存1--》寄存器--》内存2
ldr r0,=0x12345678 --->伪指令
ldr r0,[r1] -->汇编指令 此时r1寄存器中的值是一个内存地址
将r1这个内存地址处的内容拷贝到寄存器r0
r0 = *r1
Str r0,[r1] --> *r1 = r0
ldrh r2,[r0]
strh r2,[r1]
每次操作1个字节
ldrb r2,[r0]
strb r2,[r1]
Ldrb r2,[r0,#1] @r2 = *(r0+1)
Ldrb r2,[r0],#1 @r2 = *r0, r0 = r0+1
8、块存储指令
Ldm:将一整块连续内存空间的内容拷贝到一组寄存器中
Stm:将一组寄存器的内容拷贝到一整块连续的内存空间中
Ia:先访问内存,再增加地址 p++
Ib:先增加地址,再访问内存 ++p
Da:先访问内存,再减小地址 p--
Db:先减小地址,再访问内存 --p
Arm使用的是满减栈
F:满
E:空
A:增
D:减
满减栈:
sp!, {r0-r12} 入栈 寄存器内容拷贝到栈区
Ldmfd sp!, {r0-r12} 出栈 栈区内容拷贝到寄存器
9、种寻址方式
立即数寻址:mov r0,#1
寄存器寻址:mov r1,r0
寄存器间接寻址:ldr r1,[r0]
寄存器移位寻址:mov r0,r1,lsl #1
基址变址寻址:ldr r1,[r0,#4]
多寄存器寻址:ldmia r0, {r1-r3}
相对寻址:b aa
堆栈寻址:mrs sp!,{r0-r12}