assembly x86 nasm输出浮点值

时间:2012-02-23 18:09:07

标签: ubuntu gcc assembly nasm x86-64

我正在处理一个项目,我需要使用C中的printf输出浮点值。

我现在可以打印出这些值,但我不确定打印是如何进行的。

对于打印int值,我只需按下数据类型和位置,打印就可以了。

但对浮动来说,这是一个完全不同的故事。

以下是打印浮动的代码

mov qword rdi, float_format                          
push qword 0                                         
push r14                                            
movsd xmm0, [rsp]                                    
mov qword rax, 1                                     
call printf                                          
pop rax                                               
pop rax

这将有效地打印出从键盘输入的值。但是,当我使用faddfdiv之类的浮点命令操作数字时,为了打印输出,在调用print float函数之前,我必须mov 1, rax

想法?为了简单起见?或解释为什么我使用xmm0?

1 个答案:

答案 0 :(得分:1)

您需要知道正在使用的调用约定。 AMD64上的Linux使用System V AMD64 ABI。从该文件中我们了解到:

  • 整数参数在rdi,rsi,rdx,rcx,r8和r9中传递
  • 浮点数以xmm0传递到xmm7
  • 对于varargs函数,使用的SSE寄存器的数量放在rax

所以对于电话

printf (format, float_value)

你有rdi = format,xmm0 = float_value和rax = 1.