【发布时间】:2017-04-10 17:49:49
【问题描述】:
为什么下面的 x64 程序集给我“地址边界错误”?只有当我在call _print_string 之后添加代码时才会发生这种情况。我假设某些寄存器已被修改,但是一旦_print_string 函数返回,它们不应该被恢复吗?
我使用的是 Mac OS X
obj_size = 8
.data
hello_world: .asciz "hello world!"
.text
.globl _main
_main:
pushq %rbp
movq %rsp, %rbp
leaq hello_world(%rip), %rdi
callq _print_string
subq obj_size, %rsp
movq 1, %rax
movq %rax, obj_size(%rsp)
addq obj_size, %rsp
leave
ret
而C程序是:
void
print_string(char *str)
{
printf("%s\n", str);
}
【问题讨论】:
-
哪个操作系统?有些寄存器没有保留,而保留的寄存器因操作系统而异。
-
@RudyVelthuis 我正在使用 Mac OS X
标签: macos gcc assembly x86-64 att