此问题在此处已有答案:
Using printf in assembly leads to empty output when piping, but works on the terminal(2个答案)
20天前关闭。
我试图写一个程序,打印每一个比用户输入的小的素数。因此,我首先尝试了程序的一部分,它打印一条消息,让用户使用printf
诱导用户输入,但它没有打印任何内容。有问题的代码如下:
; Nasm v 2.15.05 (on Linux x64)
extern printf
SYS_EXIT EQU 0x3C
section .data
notificationMessage DB "Enter the upper limit: ", 0x0
notificationFormatString DB "%s", 0x0
section .text
global main
main:
; initialize
push rbp
mov rbp, rsp
mov rdi, notificationFormatString
mov rsi, notificationMessage
call printf ; it doesn't print anything. why?
; end program
mov rsp, rbp
pop rbp
mov rax, SYS_EXIT
mov rdi, 0x0
syscall
字符串
(As据我所知,我应该把格式字符串放到rdi
寄存器,把下面的消息放到rsi
寄存器,然后按照Linux x64上的SYSV调用约定继续。
prime_numbers_linux_x64: prime_numbers_linux_x64.asm
nasm -f elf64 -o prime_numbers_linux_x64.o prime_numbers_linux_x64.asm
gcc -o prime_numbers_linux_x64 prime_numbers_linux_x64.o -no-pie
clean:
rm -f ./prime_numbers_linux_x64
rm -f ./prime_numbers_linux_x64.o
型
当我运行程序时,它什么也没有显示,并立即结束。
knightchaser@3rdfr13nds:~/assembly/loop$ ./prime_numbers_linux_x64
knightchaser@3rdfr13nds:~/assembly/loop$
型
你能告诉我哪一点我做错了吗?先谢了。
我的环境是Windows 11上的WSL2(Ubuntu 22.04),64位CPU。
1条答案
按热度按时间kzmpq1sx1#
感谢@ecm的帮助,终于解决了。当我在汇编代码中使用外部C库时,强烈建议不要使用
system exit
的直接系统调用。建议使用ret
(本例中为retn
)。字符串
更多参考阅读