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
相关产品推荐
相关产品推荐

