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

Linux下NASM汇编子程序问题:为何"Hello World 2"被打印两次?

问题:NASM汇编代码中"Hello World 2"重复打印的原因及修复

核心原因

你的代码里strlen子程序依赖**空字节(0)**判断字符串结束,但定义的msg和msg2未添加终止空字节,导致长度计算错误。

详细分析

  • strlen的逻辑是从eax指向的地址开始,逐个字节检查是否为0,找到0才停止计算长度。
  • 你定义的字符串仅包含文本和换行符0Ah,没有末尾的终止空字节:
    msg db "Hello World", 0Ah     ; 无终止空字节
    msg2 db "Hello World 2", 0Ah  ; 无终止空字节
    
  • 第一次调用strlen(msg)时,程序会从msg地址持续读取内存,直到找到第一个空字节(该位置在msg2之后的内存区域)。这导致第一个write系统调用的长度edx包含了msg+msg2的全部内容,第一次输出就打印了Hello World换行 + Hello World 2换行。
  • 随后第二个write又单独打印msg2,最终Hello World 2被打印两次。

修复方法

在字符串定义末尾添加终止空字节0,让strlen能正确识别字符串边界:

section .data
msg db "Hello World", 0Ah, 0     ; 添加0作为终止符
msg2 db "Hello World 2", 0Ah, 0  ; 添加0作为终止符

修改后,strlen会在正确位置停止计算长度,两次write调用分别输出对应字符串,不会出现重复打印问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 02:56:16