2

您好我正在尝试学习汇编并学习如何在 x86_64 中使用浮点数。据我了解,参数在 xmm0、xmm1、xmm2 等中传递,结果在 xmm0 中返回。所以我正在尝试制作一个简单的汇编函数,将加倍加到一起。这是功能

.text

.global floatadd
.type floatadd,@function

floatadd:
    addsd %xmm1,%xmm0
    ret

这也是我正在使用的 C 代码。

#include<stdio.h>

int main(){
    double a = 1.5;
    double b = 1.2;
    double c = floatadd(a,b);
    printf("result = %f\n",c);
}

我一直在尝试关注 gdb 中发生的事情。当我在函数中设置断点时,我可以看到 xmm0 有 1.5,xmm1 有 1.2,当它们加在一起时,它们是 2.7。在 gdb print $xmm0 中给出 v2_double = {2.7000000000000002, 0} 但是当我的函数从 main 返回并调用

cvtsi2sd %eax,%xmm0 

打印 $xmm0 变为 v2_double = {2, 0}。我不知道为什么 gcc 调用它或为什么它使用 32 位寄存器而不是 64 位寄存器。我尝试过使用修饰符 %lf 和 %f,它们都做同样的事情。

怎么了?

4

1 回答 1

3

floatadd问题是您在调用它之前未能声明。因此编译器假定它返回一个intin%eax并将该 int 转换为 double。添加声明:

double floatadd(double, double);

在主要之前。

使用-Wall或您的编译器用于启用警告的任何等效项可能会告诉您有关此问题的信息...

于 2013-10-23T00:55:15.250 回答