在 x86-64 中为外部函数传递参数 NASM

Passing arguments for external functions in x86-64 NASM

在 x86-32 中,你 push 参数到堆栈,而在 x86-64 中,它也使用一些特定的寄存器,并且仅在它之后堆栈。也就是说,我不明白为什么我在尝试打印整数时得到 Segmentation faultka 未使用):

    global _main
    extern _printf
    section .data
format:  db "%d"
b:  dw 10
blen: equ $-b
lenlen: equ $-blen
k:  dw 6
    section .bss
a:  resw 1
    section .text
_main:
    sub rsp, 8
    mov rax, 0
    mov rdi, format
    mov rsi, b
    call _printf
    mov rax, 0x2000001
    mov rdi, 0
    syscall

在这种情况下,printf 需要 2 个参数,指向格式字符串的指针 (rdi) 和值 (rsi)。


可能需要:

default  rel                   ; make [format] be [rel format] by default
format  db      "%d", 0        ;the 0 terminates the C string

;       ...
        lea     rdi, [rel format]  ; put format address in first arg reg
        movsx   esi, word [b]      ; load a value from b, not its address

您只定义了一个值为 10 的字,因此使用 movsx 将其符号扩展为双字(或使用 movzx 进行零扩展)以获得 32 位整数以匹配 %d 格式字符串。

如果您想要打印一个带有mov rsi, b作为绝对地址的指针,您可以使用"%p", 0