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
相关产品推荐
相关产品推荐

