首页/计算机组成原理/指令系统/循环结构的机器级表示 🔗 在 Obsidian 中打开
计算机组成原理 · 指令系统

循环结构的机器级表示

重要度 ⭐⭐⭐⭐指令系统循环条件跳转计数循环机器级表示
速查
循环的机器级本质 = 条件跳转回跳。for 展开为「初始化 → 条件判断 → 循环体 → 更新 → 跳回」;while 先判断后执行(可能 0 次)、do-while 先执行后判断(至少 1 次);关键指令 CMP + Jcc

核心概念

循环结构在机器级通过条件跳转指令回跳实现:在循环体末尾用条件跳转指令跳回循环起始位置(或条件判断处),形成循环。

for 循环的机器级模式

    MOV  R1, 0        ; 初始化 i = 0
L1: CMP  R1, n         ; 判断 i < n
    JGE  L2            ; i >= n 则退出循环
    ; 循环体代码
    ADD  R1, 1         ; i++
    JMP  L1            ; 跳回循环条件判断
L2: ; 循环结束后的代码

while 循环(先判断后执行)

L1: CMP  R1, n         ; 判断条件
    JGE  L2            ; 条件不满足则退出
    ; 循环体
    JMP  L1            ; 跳回判断
L2:

do-while 循环(先执行后判断)

L1: ; 循环体
    CMP  R1, n         ; 判断条件
    JL   L1            ; 条件满足则继续循环
编译器优化编译器常将 while 转换为 do-while 形式(条件跳转放在底部),减少一次额外的跳转。

关键性质

循环类型条件判断位置至少执行一次对应汇编模式
for循环开始初始化 + 条件判断在前,更新在后
while循环开始条件判断在循环体前
do-while循环结束条件判断在循环体后

常见考法

考法解题套路
给定 C 循环写汇编转为初始化→判断→循环体→更新→跳回的模式
读汇编还原 C 代码找条件跳转的回跳点,确定循环边界
循环次数分析分析循环变量的初始值、终止条件、步长
循环优化识别识别循环不变量外提、强度削弱等优化

易错点

必记
  • for 和 while 先判断后执行:循环体可能一次都不执行(条件一开始就不满足)。
  • do-while 先执行后判断:循环体至少执行一次。
  • 编译器会变换循环形式:实际编译结果可能与源码结构不完全对应(常优化 while 为 do-while + 前置判断)。
  • 循环条件的方向:$for(i=0;\ i<n;\ i++)$ 的退出条件是 $i \geq n$,对应跳转指令是 JGE(有符号)或 JAE(无符号)。
  • JMP 是无条件跳转(跳回循环头),Jcc 是条件跳转(退出循环)。

核心结论

  1. 循环的机器级实现 = 条件跳转回跳,本质是选择结构的特殊应用。
  2. for 循环展开为:初始化、条件判断、循环体、更新、跳回判断五部分。
  3. 编译器优化可能改变循环的机器级结构,但语义不变
  4. 循环的时间复杂度 = 循环次数 $\times$ 每次循环体的复杂度。

记忆卡片

while 和 do-while 的区别?
while 先判断后执行(可能 0 次),do-while 先执行后判断(至少 1 次)。
循环的机器级本质?
条件跳转指令回跳形成循环。
for 循环的五部分?
初始化、条件判断、循环体、更新、跳回。
编译器如何优化 while?
常转换为 do-while 形式以减少跳转;循环中 JMP 无条件跳回循环起始位置。

交互动画 · for 循环回跳流程

初始化MOV R1, 0 条件判断CMP R1,n; JGE 循环体执行操作 更新ADD R1, 1 退出JGE → L2 for (i=0; i<n; i++) — 条件不满足时经 JGE 退出
点击步骤按钮,沿 for 循环的流动路径观察回跳
点击上方按钮开始
示意图:初始化 → 判断 → 循环体 → 更新 → 回跳(JMP)形成循环;只有条件不满足时才走「JGE → L2」退出(绿色)。

相关知识点

selection-machine-level procedure-call-machine-level addressing-modes

↑ 以上为站内 HTML 相对链接(纯网页可浏览);本页右上「在 Obsidian 中打开」跳回源笔记。