汇编指令:
1、读内存:load
LDR R0,[R1,#4]; 读地址“R1+4”,得到的4字节数据存入R0
2、写内存:Store
STR R0,[R1,#4]; 把R0的四字节数据写入地址”R1+4“
3、加减
ADD R0,R1,R2; R0=R1+R2
ADD R0,R0,#1; R0=R0+1
SUB R0,R1,R2; R0=R1-R2
SUB R0,R0,#1; R0=R0-1
4、比较
CMP R0,R1; 将比较结果保存在PSR
5、跳转
B main; 直接跳转mian
BL main; 先把返回地址保存在BL寄存器里,再跳转到main
其中,在 ARM 汇编中,`CMP R0, R1` 指令执行的操作是 **比较 R0 和 R1 的值**,并将比较结果保存在 **程序状态寄存器(PSR)的条件标志位** 中。具体过程如下:
---
### 1. **实际执行的操作:**
- 计算 `R0 - R1`(不保存结果,只更新标志位)。
- 根据计算结果设置 PSR 中的 **4 个条件标志位**:
- **N (Negative)**:结果为负数时置 1。
- **Z (Zero)**:结果为零时置 1。
- **C (Carry)**:无符号运算发生借位时置 0,否则置 1。
- **V (oVerflow)**:有符号运算溢出时置 1。
---
### 2. **如何解释比较结果:**
比较结果通过组合标志位反映 `R0` 和 `R1` 的大小关系:
| 条件 | 含义 | 标志位组合 |
|-------------------|--------------------------|--------------------------|
| **`R0 == R1`** | 两数相等 | `Z=1` |
| **`R0 > R1`** | 无符号数:R0 更大 | `C=1` 且 `Z=0` |
| **`R0 < R1`** | 无符号数:R0 更小 | `C=0` |
| **`R0 > R1`** | 有符号数:R0 更大 | `N == V`(且 `Z=0`) |
| **`R0 < R1`** | 有符号数:R0 更小 | `N != V` |
---
### 3. **关键点:**
- **不保存具体数值**:`CMP` 只更新标志位,不修改任何寄存器(如 `R0`/`R1`)。
- **后续依赖**:结果需通过 **条件指令** 使用(如 `BEQ`、`BGT`):
```armasm
CMP R0, R1 ; 比较 R0 和 R1
BGT label ; 若 R0 > R1(有符号),跳转到 label
```
---
### 4. **与 `SUB` 指令的区别:**
- `SUB R2, R0, R1` → 计算 `R0 - R1`,结果存入 `R2` **并更新标志位**。
- `CMP R0, R1` → 计算 `R0 - R1`,**只更新标志位**,不保存结果。
---
### 示例:
```armasm
MOV R0, #5 ; R0 = 5
MOV R1, #3 ; R1 = 3
CMP R0, R1 ; 计算 5 - 3 = 2(正数)
; 标志位:N=0, Z=0, C=1, V=0
```
- **无符号比较**:`C=1` 且 `Z=0` → `R0 > R1`
- **有符号比较**:`N == V`(0==0)→ `R0 > R1`
---
### 总结:
`CMP R0, R1` 将比较结果保存在 **PSR 的条件标志位** 中,后续通过条件指令(如 `BGT`/`BLT`)判断 `R0` 和 `R1` 的大小关系。它不直接保存数值结果,而是通过标志位隐含比较结果。