我怀疑问题有一些与你的代码设置rax
到0
做的,而必须是1
因为你传递了一个浮点参数(详见here)。基本上rax
应该包含在xmmN
寄存器中传递的可变参数的数量。
编辑:
在printf
碰撞似乎是由堆栈miaslignment引起作为在movaps
指令程序崩溃(其期望存储器的操作数上的16字节边界对齐):
=> 0x7ffff7a65f84 <__printf+36>: movaps %xmm0,0x50(%rsp)
0x7ffff7a65f89 <__printf+41>: movaps %xmm1,0x60(%rsp)
0x7ffff7a65f8e <__printf+46>: movaps %xmm2,0x70(%rsp)
0x7ffff7a65f93 <__printf+51>: movaps %xmm3,0x80(%rsp)
0x7ffff7a65f9b <__printf+59>: movaps %xmm4,0x90(%rsp)
0x7ffff7a65fa3 <__printf+67>: movaps %xmm5,0xa0(%rsp)
0x7ffff7a65fab <__printf+75>: movaps %xmm6,0xb0(%rsp)
0x7ffff7a65fb3 <__printf+83>: movaps %xmm7,0xc0(%rsp)
当输入main
堆栈不是16字节对齐,但如果你修复这个程序工作正常。下面是我的测试程序(请注意在开始sub rsp, 8
):
global main
extern printf
section .data
string db `%f\n`, 0
rs dq 1.6
section .text
main:
sub rsp, 8
movq xmm0, qword [rs]
mov rdi, string
mov rax, 1
call printf
add rsp, 8
mov eax, 0x60
xor edi, edi
syscall
来源
2013-12-15 13:37:03
szx
我真的不知道该调用约定的细节,但我没有料想到会需要的东西推到堆栈中。 –