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

