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(大于跳转),等于时不跳转
  • 会插入到相等元素的前面位置
相关推荐
lxh011312 小时前
螺旋数组题解
前端·算法·js
czlczl2002092512 小时前
算法:二叉树的公共祖先
算法
小白程序员成长日记13 小时前
2025.11.23 力扣每日一题
算法·leetcode·职场和发展
16_one14 小时前
autoDL安装Open-WebUi+Rag本地知识库问答+Function Calling
人工智能·后端·算法
散峰而望15 小时前
C++数组(三)(算法竞赛)
开发语言·c++·算法·github
q***952215 小时前
SpringMVC 请求参数接收
前端·javascript·算法
初级炼丹师(爱说实话版)16 小时前
多进程与多线程的优缺点及适用场景总结
算法
hetao173383716 小时前
2025-11-25~26 hetao1733837的刷题记录
c++·算法
历程里程碑16 小时前
各种排序法大全
c语言·数据结构·笔记·算法·排序算法
少许极端16 小时前
算法奇妙屋(十四)-简单多状态dp问题
算法·动态规划·图解算法·简单多状态dp·打家劫舍问题·买卖股票问题全解