在 x86-64 中为外部函数传递参数 NASM
Passing arguments for external functions in x86-64 NASM
在 x86-32 中,你 push
参数到堆栈,而在 x86-64 中,它也使用一些特定的寄存器,并且仅在它之后堆栈。也就是说,我不明白为什么我在尝试打印整数时得到 Segmentation fault
(k
和 a
未使用):
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
在 x86-32 中,你 push
参数到堆栈,而在 x86-64 中,它也使用一些特定的寄存器,并且仅在它之后堆栈。也就是说,我不明白为什么我在尝试打印整数时得到 Segmentation fault
(k
和 a
未使用):
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