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

x86汇编循环每次迭代入栈均为最后输入数字的原因是什么?

问题根因
  • 核心错误:代码中push x指令压入栈的是缓冲区x的内存地址常量,而非x地址中存储的用户输入值。四次循环压入的都是完全相同的地址,而每次输入都会覆盖该地址对应的2字节内存空间,最终所有栈上存储的地址指向的内容都是最后一次输入的结果,自然出现全量覆盖的现象。
  • 隐藏问题:代码未初始化edi寄存器,程序启动时edi残留值不确定,会导致循环执行次数不符合4次的设计预期。
修复方案

调整两处代码即可:

  1. 在_start入口处添加寄存器初始化指令xor edi, edi,将循环计数器清零
  2. 将入栈指令修改为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 13:15:03