汇编跳转指令使用总结

一、状态寄存器

PSW(Program Flag)程序状态字寄存器,是一个16位寄存器,由条件码标志(flag)和控制标志构成,如下所示:

条件码:
①OF(Overflow Flag)溢出标志。溢出时为1,否则置0。
②SF(Sign Flag)符号标志。结果为负时置1,否则置0.
③ZF(Zero Flag)零标志,运算结果为0时ZF位置1,否则置0.
④CF(Carry Flag)进位标志,进位时置1,否则置0.
⑤AF(Auxiliary carry Flag)辅助进位标志,记录运算时第3位(半个字节)产生的进位置。有进位时1,否则置0.
⑥PF(Parity Flag)奇偶标志。结果操作数中1的个数为偶数时置1,否则置0.

控制标志位:
⑦DF(Direction Flag)方向标志,在串处理指令中控制信息的方向。
⑧IF(Interrupt Flag)中断标志。
⑨TF(Trap Flag)陷井标志。

二、比较指令

test  逻辑与运算结果为零,就把ZF(零标志)置1;
cmp 算术减法运算结果为零,就把ZF(零标志)置1.

三、JCC(Jump if Condition is met)跳转指令

JCC实际上是一类指令的通用名称,其中 "CC" 是 "Condition Code" 的缩写

3.1、跳转指令

指 令

描 述

条 件

别 名

相 反 指 令

JC

如果进位位被置位则跳转

进位标志=1

JB,JNAE

JNC

JNC

如果进位位没有置位则跳转

进位标志=0

JNB,JAE

JC

JZ

如果0标志被置位则跳转

0标志=1

JE

JNZ

JNZ

如果0标志没有置位则跳转

0标志=0

JNE

JZ

指 令

描 述

条 件

别 名

相反指令

JS

如果符号位被置位则跳转

符号标志=1

JNS

JNS

如果符号位没有被置位则跳转

符号标志=0

JS

JO

如果溢出标志置位则跳转

溢出标志=1

JNO

JNO

如果溢出标志没有置位则跳转

溢出标志=0

JO

JP

如果奇偶校验位被置位则跳转

奇偶校验标志=1

JPE

JNP

JPE

如果奇偶校验位为偶校验则跳转

奇偶校验标志=1

JP

JPO

JNP

如果奇偶校验位没有被置位则跳转

奇偶校验标志=0

JPO

JP

JPO

如果奇偶校验位为奇校验则跳转

奇偶校验标志=0

JNP

JPE

3.2、使用无符号数比较的JCC指令

指 令

描 述

条 件

别 名

相反指令

JA

如果超过(>)则跳转

进位标志=0,0标志=0

JNBE

JNA

JNBE

如果不低于或等于(不 <=)则跳转

进位标志=0,0标志=0

JA

JBE

JAE

如果超过或等于(>=)则跳转

进位标志=0

JNC,JNB

JNAE

JNB

如果不低于则跳转(不 <)

进位标志=0

JNC,JAE

JB

JB

如果低于(<)则跳转

进位标志=1

JC,JNAE

JNB

JNAE

如果不超过或等于(不>=)则跳转

进位标志=1

JC,JB

JAE

JBE

如果低于或等于(<=)则跳转

进位标志=1或0标志=1

JNA

JNBE

JNA

如果不超过(不>)则跳转

进位标志=1或0标志=1

JBE

JA

JE

如果相等(=)则跳转

0标志=1

JZ

JNE

JNE

如果不相等(<>)则跳转

0标志=0

JNZ

JE

3.3、使用有符号数比较的JCC指令

指 令

描 述

条 件

别 名

相反指令

JG

如果大于(>)则跳转

符号标志=溢出标志或0标志=0

JNLE

JNG

JNLE

如果小于或等于(<=)则跳转

符号标志=溢出标志或0标志=0

JG

JLE

JGE

如果大于或等于(>=)则跳转

符号标志=溢出标志

JNL

JGE

JNL

如果不小于(不<)则跳转

符号标志=溢出标志

JGE

JL

JL

如果小于(<)则跳转

符号标志<>溢出标志

JNGE

JNL

JNGE

如果大于或等于(>=)跳转

符号标志<>溢出标志

JL

JGE

JLE

如果小于或等于(<=)跳转

符号标志<>溢出标志或0标志=1

JNG

JNLE

JNG

如果不大于(不>)则跳转

符号标志<>溢出标志或0标志=1

JLE

JG

JE

如果等于(=)则跳转

0标志=1

JZ

JNE

JNE

如果不等于(<>)则跳转

0标志=0

JNZ

JE

以上就是本文的全部内容

<think> 我们正在处理一个关于ARM汇编跳转指令的查询。用户要求提供跳转指令的大全及使用方法。根据之前的对话历史,用户已经了解了一些基础概念(如基于PC相对偏移的地址加载),现在需要更全面的跳转指令汇总。 参考引用: [^1] 提到了条件分支指令b.pl(基于N标志位) [^2] 介绍了B和BL指令的基本语法和功能(BL会保存返回地址到LR) [^3] 提到了ARM/Thumb混合编程中目标地址bit[0]的作用 [^4] 展示了栈操作指令(如stmfd)但非跳转指令 因此,我们需要系统整理ARM汇编中的跳转指令,包括: 1. 无条件跳转(B, BL) 2. 条件跳转(BEQ, BNE等) 3. 间接跳转(BX, BLX) 4. 特殊跳转(如CBZ/CBNZ) 注意要点: - 每种指令的格式、功能、使用场景 - 条件码的应用条件(如EQ, NE等) - 跳转范围限制(相对偏移范围) - 混合指令集(ARM/Thumb)处理 结构设计: 第一部分:无条件跳转指令 第二部分:条件跳转指令(附带条件码表) 第三部分:间接跳转与模式切换 第四部分:其他跳转指令(如比较跳转) 第五部分:常见问题与使用技巧 最后生成相关问题。 </think> ### ARM汇编跳转指令大全及使用方法 #### 一、无条件跳转指令 1. **B指令(Branch)** 基础跳转指令,直接跳转到目标地址: ```assembly B label ; 跳转到label处执行 ``` - 跳转范围:±32MB(ARM模式)[^2] - 特点:不保存返回地址 - 示例: ```assembly loop: ADD R0, R0, #1 CMP R0, #10 B loop ; 循环跳转 ``` 2. **BL指令(Branch with Link)** 带链接的跳转,用于函数调用: ```assembly BL subroutine ; 跳转前将下条指令地址存入LR(R14) ``` - 保存返回地址:$ \text{LR} = \text{PC} + 4 $ - 函数返回:`MOV PC, LR` 或 `BX LR` - 示例: ```assembly main: BL delay ; 调用延时函数 B main ; 循环 delay: ; 子函数 ... ; 函数体 BX LR ; 返回 ``` #### 二、条件跳转指令 基于CPSR标志位跳转指令格式:`B{cond} label` **条件码对照表**: | 条件码 | 含义 | 标志位条件 | 典型应用 | |--------|---------------|-------------------------|----------------------| | EQ | 相等 | Z=1 | `CMP R0, R1` 后使用 | | NE | 不等 | Z=0 | 循环控制 | | MI | 负数 | N=1 | 符号检查 | | PL | 非负 | N=0 | 绝对值处理[^1] | | HI | 无符号大于 | C=1且Z=0 | 无符号比较 | | LS | 无符号小于等于 | C=0或Z=1 | 范围检查 | | GE | 有符号大于等于 | N=V | 有符号比较 | | LT | 有符号小于 | N≠V | 排序算法 | | GT | 有符号大于 | Z=0且N=V | 数据筛选 | | LE | 有符号小于等于 | Z=1或N≠V | 边界判断 | | AL | 无条件执行 | 始终成立 | 默认条件 | **条件跳转示例**: ```assembly ; 判断R0是否大于10 CMP R0, #10 ; 设置标志位 BGT greater_than ; 若 R0>10 则跳转 BLT less_than ; 若 R0<10 则跳转 BEQ equal ; 若 R0=10 则跳转 ``` #### 三、间接跳转指令 1. **BX指令(Branch Exchange)** 通过寄存器跳转并支持指令集切换: ```assembly BX Rm ; PC = Rm, 根据Rm[0]切换ARM/Thumb模式[^3] ``` - 模式切换:若Rm[0]=1进入Thumb模式,Rm[0]=0进入ARM模式 - 典型应用:函数指针调用 ```assembly LDR R0, =function_ptr BX R0 ; 跳转到函数指针地址 ``` 2. **BLX指令(Branch with Link Exchange)** 结合BL和BX的功能: ```assembly BLX Rm ; LR = PC+4, PC = Rm, 切换模式 ``` - 常用于动态链接库调用 #### 四、特殊跳转指令 1. **CBZ/CBNZ(Compare and Branch if Zero/Nonzero)** Thumb-2特有指令,零值判断跳转: ```assembly CBZ R0, label ; 若R0=0则跳转 CBNZ R1, label ; 若R1≠0则跳转 ``` - 优势:单条指令完成比较+跳转 - 跳转范围:±126字节 2. **TBB/TBH(Table Branch)** 查表跳转(Thumb-2): ```assembly TBB [PC, R0] ; 跳转偏移量 = 内存[PC+R0] ``` - 用于实现switch-case语句 #### 五、栈相关跳转 结合栈操作实现上下文切换[^4]: ```assembly ; 函数入口保存寄存器 STMFD SP!, {R0-R3, LR} ; 入栈保护 ; 函数退出恢复并跳转 LDMFD SP!, {R0-R3, PC} ; 出栈并跳转到返回地址 ``` - `STMFD`(满递减栈):地址减小前存储 - `LDMFD`:地址增大后加载 #### 六、使用注意事项 1. **跳转范围限制** - B/BL:±32MB(ARM),±4MB(Thumb) - 超范围时需使用`LDR PC, =label`加载绝对地址 2. **流水线影响** PC值 = 当前指令地址 + 8(ARM)或 +4(Thumb) 3. **位置无关代码(PIC)** 优先使用PC相对跳转确保地址无关性: $$ \text{目标地址} = \text{PC} + \text{offset} $$ 4. **混合模式编程** 跨模式跳转必须用BX/BLX且正确设置目标地址最低位: ```assembly ADR R0, thumb_code+1 ; +1标记Thumb模式 BX R0 ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值