NASM x86 32位程序输入缓冲区异常修改问题排查与修复
问题原因与修复方案
问题根源
你的mov_dd宏逻辑完全错误,它把输入缓冲区的地址覆盖到了input变量本身,直接破坏了用户输入的内容:
- 初始时
input_ptr存储的是input缓冲区的起始地址(比如0x804a010) - 调用
mov_dd input_ptr, input时,宏会把input_ptr里的地址值写入到input的前4字节 - 原本输入的
'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
相关产品推荐
相关产品推荐

