32位汇编:实验9分支程序结构使用

知识回顾

一、什么是分支跳转?

分支跳转是根据条件改变程序执行流程 的机制,是实现 if、else、while、for 等高级结构的基础。


二、跳转指令分类

1. 无条件跳转

复制代码
jmp label; 直接跳转到标签处
jmp reg; 跳转到寄存器指定的地址
jmp mem; 跳转到内存地址

2. 条件跳转

基于标志位的状态决定是否跳转。


三、条件跳转指令详解(重点)

🔹 1. 无符号比较跳转(用于地址、索引、数组长度等)

指令 含义 条件(标志位)
ja jump if above CF=0 且 ZF=0(大于)
jae jump if above or equal CF=0(大于或等于)
jb jump if below CF=1(小于)
jbe jump if below or equal CF=1 或 ZF=1(小于或等于)
je / jz jump if equal / zero ZF=1
jne / jnz jump if not equal / not zero ZF=0

🔹 2. 有符号比较跳转(用于负数、温度、坐标等)

指令 含义 条件(标志位)
jg jump if greater ZF=0 且 SF=OF(大于)
jge jump if greater or equal SF=OF(大于或等于)
jl jump if less SF≠OF(小于)
jle jump if less or equal ZF=1 或 SF≠OF(小于或等于)

四、分支结构实现方式

🔹 1. 单分支(if)

cmp eax, ebx jle skip ; 执行 if 语句块 skip:

🔹 2. 双分支(if-else)

cmp eax, ebx jle else_part ; if 语句块 jmp end_if else_part: ; else 语句块 end_if:

🔹 3. 多分支(if-else if-else)

cmp eax, 1 je case1 cmp eax, 2 je case2 cmp eax, 3 je case3 jmp default_case


五、循环结构中的跳转

🔹 1. while 循环

while_start: cmp eax, 10 jge while_end ; 循环体 inc eax jmp while_start while_end:

🔹 2. for 循环(计数器控制)

asm复制

mov ecx, 0 for_start: cmp ecx, 10 jge for_end ; 循环体 inc ecx jmp for_start for_end:


六、标志位与跳转关系(底层机制)

标志位 含义 影响跳转
ZF 零标志 je, jne, jz, jnz
CF 进位标志 ja, jb, jae, jbe
SF 符号标志 jl, jg, jle, jge
OF 溢出标志 jl, jg, jle, jge

✅ 总结:条件跳转指令本质上是对标志位的判断,而这些标志位由 cmp、sub、add、test 等指令设置。

示例

调试

dArray定义后,$指向数组结束后的下一个字节地址

**($-dArray)/4**数组元素个数计算,(40字节) ÷ 4 = 10个元素

并预留出了一个位置方便后续插入。

先初始话要插入的元素和比较索引

进入循环比较过程

每次循环进行比较,CF=1,则说明小于不发生ja无符号大于跳转,向下执行,索引+1,jb无符号小于跳转开始下一次循环。

第6次循环时,CF值变为1,索引值为5(插入位置),进行ja跳转

将EDI索引赋值从最后开始移动。

进入循环比较

比较当前移动位置与插入位置,如果SF≠OF(小于)完成JI有符号跳转,否则向下继续运行,去除当前元素,向下移动一个位置。EDI-1,继续回到循环。

第6次循环时,EDI<ESIjl有符号小于跳转,当移动位置到达插入位置之前时停止并完成跳转。

将要插入新元素放入索引为5的数组中

最终得到的插入新数组符合预期

特殊情况分析

1. 插入最小值的情况

如果要插入的值小于所有现有元素(如插入25):

  • 第一次比较:50 vs 25 → 50>25 → 立即跳转到c20
  • ESI=0,表示插入到数组开头
  • 所有元素向后移动一位

2. 插入最大值的情况

如果要插入的值大于所有现有元素(如插入3000):

  • 所有比较都不满足ja条件
  • ESI增加到10(等于ITEMS)
  • 元素不需要移动,直接插入到末尾

3. 插入重复值的情况

如果要插入的值等于某个现有元素:

  • 由于使用ja(大于跳转),等于时不跳转
  • 会插入到相等元素的前面位置
相关推荐
2301_785403525 分钟前
代码随想录算法营总结
算法
yeflx5 分钟前
三维空间坐标转换早期笔记
人工智能·算法·机器学习
格林威25 分钟前
C++ 工业视觉实战:Bayer 图转 RGB 的 3 种核心算法(邻域平均、双线性、OpenCV 源码级优化)
开发语言·c++·人工智能·opencv·算法·计算机视觉·工业相机
Frostnova丶26 分钟前
LeetCode 3643.子矩阵垂直翻转算法解析
算法·leetcode·矩阵
2401_8512729928 分钟前
C++中的模板方法模式
开发语言·c++·算法
2401_8942419228 分钟前
C++中的策略模式进阶
开发语言·c++·算法
爱丽_34 分钟前
G1 深入:Region、Remembered Set、三色标记与“可预测停顿”
java·数据库·算法
sprite_雪碧34 分钟前
简单模拟问题
算法
2401_8747325335 分钟前
C++中的装饰器模式
开发语言·c++·算法
j_xxx404_39 分钟前
力扣--分治(快速排序)算法题II:数组中的第K个最大元素(Top K问题),LCR159.库存管理III
数据结构·c++·算法·leetcode