目录
跳转指令
@方式一
@方式二
@方式三
@程序返回
ARM指令的条件码
@比较指令
内存访问指令(一)
load(LD加载)/srore(ST存储)指令:访问(读写)内存
@写内存
@读内存
ARM指令的寻址方式
@立即寻址
@寄存器寻址
@寄存器移位寻址
@寄存器间接寻址
@基址加变址寻址
@基址加变址寻址的索引方式
@前索引
@后索引
@自动索引
跳转指令
实现程序的的跳转,本质就是修改了PC寄存器
@方式一
直接去修改pc寄存器的值(不建议使用,需要我们自己去计算)
MOV PC, #0x18
@方式二
B FUNC
不带返回的跳转指令,本质就是将pc寄存器的值修改成跳转标号下第一条指令的地址
@方式三
带返回的跳转指令,本质就是将pc寄存器的值修改成跳转标号下第一条指令的地址
BL FUNC
@程序返回
MOV PC, LR
ARM指令的条件码
不是指令,指令的后缀,通过添加后缀能够决定指令在什么条件下执行
@比较指令
CMP R1,R2
@CMP的本质就是一条减法指令(SUNS),只是没有将运算的结果存入寄存器
没有目标寄存器,结果放在CPSR中的n、z、c、v中
@== z=1
@!= z=0
@< c=0
@<= c=0或z=1
@> c=1且z=0
@>= c=1
条件码助记后缀可以放在B后,
如BEQ FUNC @if(EQ){B FUNC} 本质:if(z==1){B FUNC}
如BNE FUNC @if(EQ){B FUNC} 本质:if(z==0){B FUNC}
ARM指令集中大多数指令都可以带条件码后缀
内存访问指令(一)
load(LD加载)/srore(ST存储)指令:访问(读写)内存
@写内存
MOV R1, #0xFF000000
MOV R2, #0x40000000
STR R1,[R2]
将R1寄存器中的数据存储到R2的内存空间
@读内存
LDR R3,[R2]
将内存中R2指向的内存空间中的数据读取到R3寄存器
MOV R1, #0xFFFFFFFF
MOV R2, #0x40000000
STRB R1,[R2]写入最后一个字节
STRH R1,[R2]写入最后两个字节
LDR指令同样支持以上两个指令
ARM指令的寻址方式
寻址方式就是CPU去寻找一个操作数的方式
@立即寻址
MOV R1 , #1
ADD R1, R2, #1
@寄存器寻址
ADD R1, R2, R3
@寄存器移位寻址
MOV R1, R2, LSL #1
@寄存器间接寻址
STR R1, [R2]
@基址加变址寻址
MOV R1, #0xFFFFFFFF
MOV R2, #40000000
MOV R3, #4
STR R1, [R2,R3]
将R1寄存器中的数据写入到R1+R3指向的内存空间
STR R1, [R2, R3, LSL #1]
将R1寄存器中的数据写入到R2+(R3<<1)指向的内存空间
@基址加变址寻址的索引方式
@前索引
MOV R1, #0xFFFFFFFF
MOV R2, #40000000
STR R1, [R2,#8]
将R1寄存器中的数据写入到R2+8指向的内存空间
@后索引
MOV R1, #0xFFFFFFFF
MOV R2, #40000000
STR R1, [R2],#8
将R1寄存器中的数据写入到R2指向的内存空间,然后R2自增8
@自动索引
MOV R1, #0xFFFFFFFF
MOV R2, #40000000
STR R1, [R2,#8]!
将R1寄存器中的数据写入到R2+8指向的内存空间,然后R2自增8
以上寻址方式和索引方式同样适用于LDR