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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:57:17