x86汇编字符串比较程序输出后出现垃圾内容的问题咨询
搞定x86汇编程序输出垃圾内容的问题
嘿,我来帮你揪出这个输出垃圾内容的bug!结合你给出的代码片段,大概率是这几个原因导致的:
1. 输出长度参数搞混了或者没定义对
你给每个字符串都配了equ $-xxx来计算长度,这个思路是对的,但你看代码里的Two只写了"Se..."就断了——这会导致TwoLen计算的是从Two标签到当前行的字节数,而后面的内容都是内存里的垃圾数据,要是你用这个TwoLen去做输出长度,自然会打出一堆乱码。
另外,要是你在调用sys_write时,不小心把长度参数传错了(比如本该传OneLen,结果写成了HelloLength),也会导致输出多读了额外的内存内容。
比如你要是写了这段错误的输出代码:
mov eax, 4 ; sys_write的系统调用号 mov ebx, 1 ; 指向标准输出 mov ecx, Two ; 要输出的字符串地址 mov edx, TwoLen ; 这里Two没写完,TwoLen的值完全不对 int 0x80
那输出必然会带一堆垃圾。
2. 程序跑完没正确退出
要是你的程序在输出完结果后,没调用exit系统调用让进程终止,CPU会接着执行代码段后面的内存内容——这些都是没定义的垃圾指令,搞不好会触发额外的输出操作,或者直接乱执行,最后就打出了一堆莫名其妙的内容。
一定要在程序逻辑结束后加上这段退出代码:
mov eax, 1 ; sys_exit的系统调用号 mov ebx, 0 ; 退出码0表示正常结束 int 0x80
让进程干干净净地终止,别让CPU瞎跑。
3. 字符串比较逻辑可能有隐藏问题
虽然你说比较功能正常,但也有可能比较过程中不小心修改了某个字符串的地址,或者误操作了寄存器里的输出参数,导致后续输出指向了错误的内存区域。
快速修复步骤
- 先把
Two字符串补全,比如改成"Second",10,确保TwoLen能算出正确的长度; - 逐个核对所有
sys_write调用里的edx寄存器值,确保每个输出都用了对应字符串的长度常量; - 给程序加上正确的退出代码,别让CPU乱跑;
- 如果还是搞不定,把完整的代码贴出来,我帮你精准定位。
内容的提问来源于stack exchange,提问作者Nikolay Atanasov
相关产品推荐
相关产品推荐

