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

x86_64汇编Hello World输出多余字节问题求助

解决x86_64汇编Hello World输出额外内容的问题

你的问题确实出在len的计算上——当前代码里len equ $-text的位置不对,导致它把后面text2的内容长度也包含进去了。

问题原因

在汇编阶段,$代表当前数据的地址。你的代码里len定义在text2之后,所以$指向text2结束后的地址,计算出来的len等于text的长度(12字节:"Hello World" + 末尾的null字节)加上text2的长度(2字节),总共14字节。而Linux的write系统调用(rax=1)会严格按照rdx指定的字节数输出内容,不管有没有null终止符,所以就把text和text2的内容一起输出了,导致出现Hello Worldhi。

修复方案

只需要把len的定义移到text之后、text2之前,这样$就指向text结束后的地址,计算出来的长度就是text本身的字节数。另外,因为write不需要字符串的null终止符,你可以直接去掉text末尾的0,避免输出多余的空字符:

BITS 64
section .data
    text db "Hello World"       ; 不需要null字节,write按指定长度输出
    len equ $-text              ; 此时$是text结束后的位置,len=11(正好是"Hello World"的长度)
    text2 db "hi"

section .text
global _start
_start:
    mov rax, 1
    mov rdi, 1
    mov rsi, text
    mov rdx, len
    syscall

    mov rax, 60
    mov rdi, 0
    syscall

如果你非要保留text末尾的null字节(比如后续有其他用途),可以把len改成$-text-1,手动排除那个null字节:

text db "Hello World", 0
len equ $-text-1  ; 12字节总长度减1,得到实际要输出的11字节

编译链接命令不变

nasm -f elf64 -o build/main.o src/main.asm
ld -m elf_x86_64 build/main.o -o main

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 07:15:58