x64 NASM Assembly extern printf不打印任何内容[重复]

laawzig2  于 2023-08-06  发布在  其他
关注(0)|答案(1)|浏览(122)

此问题在此处已有答案

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。

kzmpq1sx

kzmpq1sx1#

感谢@ecm的帮助,终于解决了。当我在汇编代码中使用外部C库时,强烈建议不要使用system exit的直接系统调用。建议使用ret(本例中为retn)。

; 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

                ; use this keyword to finish. (or just ret. assembler will code this into one of between retn or retf keyword, according to the situation.)
                retn

                ; delete
                ;mov     rax, SYS_EXIT
                ;mov     rdi, 0x0
                ;syscall

字符串
更多参考阅读

相关问题