[英]printf float in nasm assembly 64-bit
我想用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
因为您传递了浮点参数(有关详细信息,请参见此处 )。 基本上rax
应该包含在xmmN
寄存器中传递的变量参数的数量。
编辑:
printf
的崩溃似乎是由于堆栈错配引起的,因为该程序在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
开头是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
我究竟做错了什么?
首先 :确保使用正确的调用约定(堆栈,寄存器,从左至右,从右至左等)。 如果您的程序确实打印了一个浮点数,尽管它不是您所需要的浮点数,那么至少格式字符串已正确传递(或者您很幸运, printf
在右侧找到了格式字符串的地址)即使您没有在此处放置它的地址也可以)。
第二 :您要打印的数字...是浮点数还是双精度数? rs
定义为保留四字值(64位),但浮点数为32位。 因此,如果已经检查了第一点并且没问题,我建议您使用"%lf"
作为格式,而不是"%f"
。
顺便说一句:为什么你把RAX = 0
? 关于调用printf
是什么意思?
更新:这可能对您有帮助。 反汇编一个愚蠢的程序( fc
):
#include <stdio.h>
main()
{
float x;
x = 1.6;
printf ("%f\n", x);
}
$ gcc -c -S fc
$ less fs
.file "f.c"
.section .rodata
.LC1:
.string "%f\n"
.text
.globl main
.type main, @function
main:
.LFB0:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
movq %rsp, %rbp
.cfi_offset 6, -16
.cfi_def_cfa_register 6
subq $16, %rsp
movl $0x3fcccccd, %eax
movl %eax, -4(%rbp)
movss -4(%rbp), %xmm0
cvtps2pd %xmm0, %xmm0
movl $.LC1, %eax
movq %rax, %rdi
movl $1, %eax
call printf
leave
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.