我想用printf打印一个浮点值
global main extern printf section .data string: db `%f\n`,0 section .bss rs: resq 1 [...] movq xmm0,[rs] mov rdi,string mov rax,0 call printf
rs包含浮点值1.6
(gdb) x/fg &rs 0x600ad8 <rs>: 1.6000000000000001
但程序打印
[username@localhost folder]$./programname 0.000000
谁能让程序打印1.6?我究竟做错了什么?
解决方法
我怀疑问题与您的代码设置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字节对齐,但如果你解决这个问题,程序运行正常.下面是我的测试程序(注意子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