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

NASM x86 32位程序输入缓冲区异常修改问题排查与修复

问题原因与修复方案

问题根源

你的mov_dd宏逻辑完全错误,它把输入缓冲区的地址覆盖到了input变量本身,直接破坏了用户输入的内容:

  1. 初始时input_ptr存储的是input缓冲区的起始地址(比如0x804a010)
  2. 调用mov_dd input_ptr, input时,宏会把input_ptr里的地址值写入到input的前4字节
  3. 原本输入的'1'、'2'、'\n'被这个4字节地址覆盖,后续读取到的自然是0x00

你修改inc dword [input_ptr]为inc byte [input_ptr]没用,因为问题根本不在指针递增的宽度,而在错误的内存覆盖操作。

修复方法

直接废弃错误的mov_dd宏,在convert函数里正确读取当前指针指向的字符:

修改后的convert函数:

convert:
    mov eax, [input_ptr]  ; 取出当前指针地址
    mov bl, [eax]         ; 读取指针指向的字符

    cmp bl, 10          ; 10 ≙ '\n'
    je return_func

    call to_int

    inc dword [input_ptr]

    jmp convert

同时删除整个mov_dd宏定义,因为它的逻辑完全不符合你的需求——你需要的是通过指针读取字符,而不是把指针地址覆盖到输入缓冲区。

额外提示

你提到知道代码转换顺序有误(当前是按高位到低位计算,结果会是反向的),后续可以先遍历输入找到'\n',再从后往前转换,或者先反转输入字符串再转换,这样才能得到正确的数值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 01:27:05