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(大于跳转),等于时不跳转
  • 会插入到相等元素的前面位置
相关推荐
万岳科技系统开发2 小时前
外卖小程序中的高并发处理:如何应对大流量订单的挑战
算法·小程序·开源
TL滕2 小时前
从0开始学算法——第二天(时间、空间复杂度)
数据结构·笔记·学习·算法
旺仔老馒头.4 小时前
【数据结构与算法】手撕排序算法(二)
c语言·数据结构·算法·排序算法
好学且牛逼的马4 小时前
【Hot100 | 2 LeetCode49 字母异位词分组问题】
算法
2301_795167204 小时前
Rust 在内存安全方面的设计方案的核心思想是“共享不可变,可变不共享”
算法·安全·rust
czhc11400756635 小时前
Java117 最长公共前缀
java·数据结构·算法
java 乐山5 小时前
蓝牙网关(备份)
linux·网络·算法
云泽8085 小时前
快速排序算法详解:hoare、挖坑法、lomuto前后指针与非递归实现
算法·排序算法
数字化脑洞实验室5 小时前
智能决策算法的核心原理是什么?
人工智能·算法·机器学习