I suspect the problem has something to do with your code setting rax
to 0
whereas it must be 1
because you pass a floating point argument (see here for details). Basically rax
should contain the number of variable arguments passed in xmmN
registers.
Edit:
The crash in printf
seems to be caused by stack miaslignment as the program crashes at a movaps
instruction (which expects the memory operand to be aligned on 16-byte boundary):
=> 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)
When entering main
the stack is not 16-byte aligned but if you fix this the program works fine. Below is my test program (notice the sub rsp, 8
in the beginning):
global main
extern printf
section .data
string db `%f
`, 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
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…