【发布时间】:2016-02-13 23:17:54
【问题描述】:
.text
.global main
main:
pushq $10
popq %rdx
movq $formatString, %rdi
call printf
mov $0,%rax
ret
.data
formatString:
.string "%d\n"
这段代码给了我一个分段错误。 这很简单。将 10 压入堆栈。从堆栈中弹出 10 并将其放入 rdx。将我的 formatString 移动到 rdi。调用 printf。就是这样。
为什么会出现分段错误?
谢谢!
【问题讨论】:
-
你知道你可以
mov $10, %edx,对吧?现在,这只是调用 var-args 函数问题之前许多忘记零的 rax 的副本。我将其中一个链接为您上一个问题的可能重复项。push使用虚拟寄存器是在call之前对齐堆栈的有用方法,在函数中不需要保留任何空间。另外,请阅读 ABI 文档。第二个参数没有进入%rdx。 -
堆栈还需要在 16 字节边界上对齐,在这种情况下,RAX 需要为零,因为您没有使用向量寄存器。
标签: assembly x86 printf x86-64 libc