You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Intel汇编带IO的循环异常求助:无限循环且ECX值随机变动

问题分析与解决

你的代码存在两个核心问题,直接导致ECX值异常、循环无限执行:

1. ECX初始化错误

mov ecx, counter这条指令把变量counter的内存地址加载到了ECX,而非用户输入的循环次数数值。正确做法是通过方括号[]访问内存中的实际值:

mov ecx, [counter]  ; 加载counter变量存储的输入数值到ECX

2. 调用C标准库函数后未维护栈平衡

printf和scanf遵循CDECL调用约定,调用者必须在函数返回后手动清理栈上的参数。你的代码在调用这两个函数后未清理栈,导致栈结构混乱,后续pop操作无法正确恢复之前保存的ECX值。

修正后的循环代码如下:

inp_loop:               
    push ecx            ; 保存ECX的循环计数到栈
    lea eax, msg2
    push eax
    call printf         ; 输出提示信息
    add esp, 4          ; 清理printf的1个参数(栈指针+4)

    lea eax, test1
    push eax
    lea eax, inp_fmt
    push eax
    call scanf          ; 读取用户输入
    add esp, 8          ; 清理scanf的2个参数(栈指针+8)

    pop ecx             ; 从栈中恢复ECX的循环计数
loop inp_loop

注意:你之前写的pop eax是多余的——已经通过add esp, x清理了函数参数,栈顶此时就是之前保存的ECX值,直接pop ecx即可。

额外说明

CDECL调用约定中,printf、scanf这类函数会破坏EAX、ECX、EDX寄存器的值,你提前将ECX压栈保存的思路是正确的,但必须保证栈操作严格平衡,否则会出现寄存器值被垃圾数据覆盖的情况。


内容的提问来源于stack exchange,提问作者Big Man

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 18:05:12