目录
跳转指令:实现程序的跳转,本质是修改了PC的寄存器
方式1:直接修改PC寄存器的值(不建议使用)
方式2.不带返回的(即不影响LR)跳转指令(本质修改PC寄存器的值修改成跳转标号下第一条指令的地址)
方式3.带返回的(LR为下一条指令的地址)跳转指令(本质修改PC寄存器的值修改成跳转标号下第一条指令的地址,同时将跳转指下一条指令的地址存储到LR)?
比较指令(存储在CPSR中NZCV中)(NZCV也可做关系运算)
CMP R1,R2??(CMP的本质就是一条减法指令(SUBS),只是没有将运算的结果存入寄存器中)
R1-R2? ????????① == , Z = 1
? ? ? ? ? ? ? ? ? ? ? ② != , Z = 0
? ? ? ? ? ? ? ? ? ? ? ?③ <? , C = 0(产生借位)
? ? ? ? ? ? ? ? ? ? ? ?④ <=?, C = 0 或 Z = 1
? ? ? ? ? ? ? ? ? ? ? ?⑤ <? ,C = 1 且 Z = 0
? ? ? ? ? ? ? ? ? ? ? ⑥ >=? ,C = 1?
ARM的条件码(后缀)
ARM 指令 中大多数指令都可以带条件码后缀
小练习:
练习:用汇编语言实现以下逻辑
int R1 = 9;
int R2 = 15;
START:
if(R1 == R2)
{
STOP();
}
else if(R1 > R2)
{
R1 = R1 - R2;
goto START;
}
else
{
R2 = R2 - R1;
goto START;
}
@ 练习答案
MOV R1, #9
MOV R2, #15
START:
CMP R1,R2
BEQ STOP
SUBGT R1, R1, R2
SUBLT R2, R2, R1
B START
STOP:
B STOP
Load/Srore 指令:访问(读写)内存? ? ?【LD/ST】
@ 1.3 Load/Store指令:访问(读写)内存
@ 写内存
@ MOV R1, #0xFF000000
@ MOV R2, #0x40000000 当前芯片支持读写代码的地址区(可在debug的MEmory map中查看)
@ STR R1, [R2]
@ 将R1寄存器中的数据写入到R2指向的内存空间
@ 读内存
@ LDR R3, [R2]
@ 将R2指向的内存空间中的数据读取到R3寄存器
@ 读/写指定的数据类型
@ MOV R1, #0xFFFFFFFF
@ MOV R2, #0x40000000
@ STRB R1, [R2]
@ 将R1寄存器中的数据的Bit[7:0]写入到R2指向的内存空间, B :byte
@ STRH R1, [R2]
@ 将R1寄存器中的数据的Bit[15:0]写入到R2指向的内存空间, H :halfword
@ STR R1, [R2]
@ 将R1寄存器中的数据的Bit[31:0]写入到R2指向的内存空间,word
@ LDR指令同样支持以上后缀
(不同处理器的寻址方式不同)
寻址方式就是CPU去寻找操作数的方式,不同的获取方式
1. 立即数寻址:参与运算的数是立即数,CPU去寻找的是立即数的寻找方式
??? ? MOV R1, #1
?? ?? ADD R1, R2, #1
2. 寄存器寻址
ADD R1, R2, R3
3. 寄存器移位寻址
? MOV R1, R2, LSL #1
4.? 寄存器间接寻址:R2不是直接参与运算的寄存器,通过指针R2操作内存
??? STR R1, [R2]
?5.基址 加 变址 寻址
MOV R1, #0xFFFFFFFF
MOV R2, #0x40000000
MOV R3, #4
STR R1, [R2,R3]
将R1寄存器中的数据写入到R2+R3指向的内存空间
STR R1, [R2,R3,LSL #1]
将R1寄存器中的数据写入到R2+(R3<<1)指向的内存空间
?6.基址 加 变址 寻址 的索引方式
前索引
MOV R1, #0xFFFFFFFF
MOV R2, #0x40000000
STR R1, [R2,#8]
将R1寄存器中的数据写入到R2+8指向的内存空间
后索引
MOV R1, #0xFFFFFFFF
MOV R2, #0x40000000
STR R1, [R2],#8
将R1寄存器中的数据写入到R2指向的内存空间,然后R2自增8
自动索引
MOV R1, #0xFFFFFFFF
MOV R2, #0x40000000
STR R1, [R2,#8]!
将R1寄存器中的数据写入到R2+8指向的内存空间,然后R2自增8
?以上寻址方式和索引方式同样适用于LDR