一、立即数
(1)立即数的定义
ARM 汇编中的立即数特指12 位立即数(imm12),是指令中直接包含的常量数值,无需从寄存器或内存读取,可直接参与 ADD、SUB、MOV 等指令的运算。
(2)12位立即数的判断标准
1.将待判断数值展开为 32 位二进制形式。
-
尝试对其进行偶数次(2N,N∈0-15)循环右移。
-
如果存在一种移位方式,使得移位后的数值满足「高 24 位全为 0,低 8 位为有效数据」,则该数为合法 12 位立即数;否则为非法。
二、b,bl,bx指令的区别
| 指令 | 英文全称 | 中文名称 | 核心功能与特点 |
|---|---|---|---|
| B | Branch | 无条件分支指令 | 单纯执行地址跳转,修改 PC 寄存器值,无任何附加操作 |
| BL | Branch with Link | 带链接的分支指令 | 跳转 + 自动保存返回地址,修改 PC 寄存器值 |
| BX | Branch and Exchange | 带状态切换的分支指令 | 跳转 + 处理器指令集切换,修改 PC 寄存器值 |
三、ARM内核采用栈
ARM 内核(ARM7/ARM9/Cortex-A/R/M 全系列)统一采用【满递减栈 FD (Full Descending)】这是 ARM 的标准规定、默认配置、唯一主流栈模式。
满栈 (Full):SP(R13) 栈指针寄存器,永远指向「栈顶的有效数据」,不是空闲地址;
递减栈 (Descending):ARM 的栈空间从高地址分配,数据入栈时地址越来越小,栈向低地址生长。
四、CPSR中条件标志位
| 标志位 | 中文名称 | 置位条件 |
|---|---|---|
| N | 负数标志位 | 运算结果的最高位 (bit31) 为 1 时,N 被置位 |
| Z | 零标志位 | 运算的最终结果等于 0 时,Z 被置位 |
| C | 进位 / 借位标志位 | 1.无符号数加法:运算结果产生进位(超过 32 位,最高位向外溢出 1) 2. 无符号数减法:运算时没有产生借位(被减数 ≥ 减数 |
| V | 溢出标志位 | 针对有符号数的加减运算,出现 正溢出 或 负溢出 时,V 被置位 |
五、arm汇编调用c语言函数以及c语言函数调用汇编编写的函数,函数参数和返回值如何处理
两者相互调用严格遵循 ATPCS 标准,规则完全通用,无差异。
1.函数参数传递规则
- 函数的第 1 个参数 → R0 、第 2 个参数 → R1 、第 3 个参数 → R2 、第 4 个参数 → R3;
- 第 5 个及更多参数:剩余参数入栈传递;
2.函数返回值传递规则
- 唯一规则:无论返回值是整型 / 字符 / 指针(32 位内),统一通过 R0 寄存器返回;超过 32 位的返回值,R0 存对应内存地址。