【发布时间】:2020-06-07 19:42:59
【问题描述】:
在 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
【问题讨论】:
-
你也忘了设置
rdi和rax。 -
@JosephSible-ReinstateMonica 谢谢,现在它可以工作了,但打印的是
8210而不是10。可能它与地址有关(尽管它一直打印8210,但它不会改变),但我不明白为什么我不能在这里使用lea(lea rsi, [b]让我@987654334 @)。我也设置了rdi和rax,我忘了更新问题。 -
@JosephSible-ReinstateMonica 你能解释一下为什么人们声明像
msg: db "Hello World!", 10, 0这样的变量吗?我不明白10和0是干什么用的,我找不到有关它的信息。也许它已经连接了。 -
10表示\n和0是 NUL 终止符 -
stdout 是行缓冲的。使用原始的
_exit系统调用,您可以在不以换行符结尾的 printf 之后退出而不给 stdio 更改刷新缓冲区。 Using printf in assembly leads to an empty ouput。不要那样做;如果调用 printf,则通过从 libc 调用 exit(3) 退出。 (或者,如果您正在编写 main 而不是 _start,则从main返回)
标签: macos assembly x86-64 nasm