Linux x86_64(NASM)中write系统调用输出末尾为何带%?如何消除?
为什么我的Hello-World程序在zsh中输出末尾会显示%符号?怎么消除?
原因分析
这个%符号其实是zsh给你的小提示,根本不是程序输出的内容!
当你的程序输出结束后没有输出换行符时,zsh的命令提示符会直接跟在程序输出的末尾。为了让你能清楚区分“程序输出的内容”和“zsh的提示符”,zsh就会在提示符前显示一个%(部分配置下是>),告诉你当前行是程序未结束的输出,提示符直接接在了这一行后面。
看你的代码:
section .data msg db "hello, world!" ; 这里没有包含换行符\n(ASCII 0x0a) section .text global _start _start: mov rax, 1 ; syscall 1 (write) mov rdi, 1 ; arg 1 = 1 (stdout) mov rsi, msg ; arg 2 = msg ("hello, world!") mov rdx, 13 ; arg 3 = 13 (char count) syscall ; call write mov rax, 60 ; syscall 60 (exit) mov rdi, 0 ; arg 1 = 0 (OK) syscall ; call exit
你的msg里只有"hello, world!"这13个字符,没有换行符,write系统调用会严格按照你指定的长度输出,所以输出结束后光标还停在"hello, world!"的末尾,zsh就用%来标记这个边界。而bash不会做这个提示,所以你在bash里看不到这个符号。
解决方法
有两种常用的解决方式,推荐第一种彻底解决:
修改程序(彻底解决):在
msg末尾加上换行符,同时调整输出字符数:section .data msg db "hello, world!", 0xa ; 0xa就是换行符\n的ASCII值 section .text global _start _start: mov rax, 1 ; syscall 1 (write) mov rdi, 1 ; arg 1 = 1 (stdout) mov rsi, msg ; arg 2 = msg ("hello, world!\n") mov rdx, 14 ; arg 3 = 14(原来的13+换行符1个) syscall ; call write mov rax, 60 ; syscall 60 (exit) mov rdi, 0 ; arg 1 = 0 (OK) syscall ; call exit这样程序输出后会自动换行,zsh的提示符会出现在新的一行,就不会显示%了。
临时 workaround(不修改程序):运行程序时手动追加换行,比如:
./your-program; echoecho会输出一个换行,让zsh的提示符回到新行,也能消除%符号,但这只是临时办法,不如修改程序彻底。
内容的提问来源于stack exchange,提问作者PandaConda
相关产品推荐
相关产品推荐

