x86汇编循环每次迭代入栈均为最后输入数字的原因是什么?
问题根因
- 核心错误:代码中
push x指令压入栈的是缓冲区x的内存地址常量,而非x地址中存储的用户输入值。四次循环压入的都是完全相同的地址,而每次输入都会覆盖该地址对应的2字节内存空间,最终所有栈上存储的地址指向的内容都是最后一次输入的结果,自然出现全量覆盖的现象。 - 隐藏问题:代码未初始化
edi寄存器,程序启动时edi残留值不确定,会导致循环执行次数不符合4次的设计预期。
修复方案
调整两处代码即可:
- 在
_start入口处添加寄存器初始化指令xor edi, edi,将循环计数器清零 - 将入栈指令修改为
push word [x],直接压入x地址中存储的2字节输入值,而非地址本身
修正后完整代码
section .data msg_x db 'Enter coordinate:', 0xa len_x equ $ - msg_x section .bss x resb 2 section .text global _start _start: xor edi, edi ; 初始化循环计数器为0 enter: mov eax, 4 mov ebx, 1 mov ecx, msg_x mov edx, len_x int 80h mov eax, 3 mov ebx, 0 mov ecx, x mov edx, 2 int 80h push word [x] ; 压入x存储的2字节值,而非x的地址 inc edi cmp edi, 4 jb enter
内容的提问来源于stack exchange,提问作者felix
相关产品推荐
相关产品推荐

