一、算术指令
1. add指令
功能: 将两个操作数相加,并将结果存储在目标寄存器中。
ADD R0, R1, R2 // R0 = R1 + R2
2. sub指令
功能: 将第二个操作数从第一个操作数中减去,并将结果存储在目标寄存器中。
SUB R0, R1, R2 // R0 = R1 - R2
3.ADC指令- 带进位加法
功能: 将两个操作数相加并加上进位标志的值。
ADC R0, R1, R2 // R0 = R1 + R2 + CARRY
4.SBC指令 - 带借位减法
功能: 将第二个操作数从第一个操作数中减去,并考虑借位标志的值。
SBC R0, R1, R2 // R0 = R1 - R2 - BORROW
5.MUL - 乘法
功能: 将两个操作数相乘,并将结果存储在目标寄存器中。
MUL R0, R1, R2 // R0 = R1 * R2
6.MULS - 有符号乘法
功能: 执行有符号乘法,将结果存储在目标寄存器中。
MULS R0, R1, R2 // R0 = R1 * R2 (有符号)
7.UDIV - 无符号除法
功能: 计算两个无符号整数的商,并将结果存储在目标寄存器中。
UDIV R0, R1, R2 // R0 = R1 / R2 (无符号)
8.SDIV - 有符号除法
功能: 计算两个有符号整数的商,并将结果存储在目标寄存器中。
SDIV R0, R1, R2 // R0 = R1 / R2 (有符号)
9.cmp -比较
功能: 将两个操作数相减,并更新条件标志(不存储结果)。
CMP R0, R1 // 更新标志位,根据 R0 - R1 的结果
10.条件标志位
标志位 | 含义 | 描述 | PSR中的位置 |
---|---|---|---|
N或S | Negative | 当操作结果为负数时设置该标志位,不为负不设置,表示正数 | 第31位 |
Z | Zero | 当操作结果为零时设置该标志位 | 第30位 |
C | Carry | 当操作结果产生进位或无符号溢出时设置该标志位 | 第29位 |
V或O | Overflow | 当操作结果产生有符号溢出时设置该标志位 | 第28位 |
二、跳转指令
- 在ARM汇编语言中,跳转指令用于改变程序的执行流。
- B指令
- 无条件跳转,B 指令会将 PC 寄存器的值设置为跳转目标地址, 一旦执行 B 指 令,ARM 处理器就会立即跳转到指定的目标地址。如果要调用的函数不会再返回到原来的执行 处,那就可以用 B 指令。
B loop_start // 无条件跳转到 loop_start 标签
--------------------------------------------------
B stat
start:
mov r0,#1;
mov r1,r0;
- BL指令
- 带链接跳转,跳转到指定的标签,并将返回地址存储在链接寄存器(LR)也就是R14
- 用于实现函数调用或子程序调用。
// 主程序部分
MOV R0, #5 // 将值5存储到R0寄存器中
BL my_function // 跳转到my_function标签,并保存返回地址到LR
// my_function 执行完后,继续执行这里的指令
// 继续的代码
B end // 跳转到程序的结束标签
my_function:
// 函数体
ADD R0, R0, #10 // 将寄存器R0的值加上10
MOV PC, LR // 从LR寄存器加载返回地址,并跳转回主程序
// 函数执行结束
end:
// 程序结束
三、逻辑运算指令
1. AND指令
功能: 对两个操作数执行按位与(如果两个对应的二进制位都为1,则结果位为1;否则结果位为0。)操作,并将结果存储在目标寄存器中。
AND R0, R1, R2 // R0 = R1 & R2,同一为一,否则为0
2. ORR指令
功能: 对两个操作数执行按位或操作,并将结果存储在目标寄存器中。
ORR R0, R1, R2 // R0 = R1 | R2,有1则为1,否则为0
3. EOR指令
功能:对两个操作数执行按位异或操作,并将结果存储在目标寄存器中。
EOR R0, R1, R2 // R0 = R1 ^ R2,相同为1,不相同为0
4. BIC指令
功能: 对第一个操作数执行按位清除操作(与第二个操作数的反码按位与)。简单的说是清除第一个操作数中在第二个操作数为1的那些位。
BIC R0, R1, R2 // R0 = R1 & ~R2
A = 11001010
B = 10101100
01000010
四、条件执行指令
- 在ARM汇编中,许多指令可以根据条件执行。这些指令通过在指令后添加条件代码后缀来实现条件执行。
条件后缀 | 条件代码 | 含义 |
---|---|---|
EQ | 0000 | 相等(Z标志位设置)Equal |
NE | 0001 | 不相等(Z标志位未设置) Not Equal |
CS/HS | 0010 | 无符号数大于或等于(C标志位设置)Carry Set / Higher or Same |
CC/LO | 0011 | 无符号数小于(C标志位未设置)MI |
MI | 0100 | 负数Minus |
- 条件指令通常是基于前一条指令(如 CMP 或其他算术/逻辑运算指令)设置的条件标志位(flags)来决定是否执行的。一般是CMP指令
- 代码示例
CMP R1, R2 // 比较R1和R2的值
ADDEQ R0, R1, R2 // 如果R1等于R2,则执行R0 = R1 + R2
SUBNE R0, R1, R2 // 如果R1不等于R2,则执行R0 = R1 - R2