[英]Adding doubles in x86_64 assembly problems
您好,我正在尝试学习汇编语言,并学习如何在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打印$ xmm0给v2_double = {2.7000000000000002,0}但是当我的函数从main返回并调用
cvtsi2sd %eax,%xmm0
打印$ xmm0变为v2_double = {2,0}。 我不确定为什么gcc会调用它,或者为什么它使用32位寄存器而不是64位寄存器。 我尝试使用修饰符%lf和%f,它们两者都做相同的事情。
怎么了?
问题是您无法在调用前声明floatadd
。 因此,编译器假定它以%eax
返回int
并将该int转换为double。 添加声明:
double floatadd(double, double);
在主要之前。
使用-Wall
或您的编译器用来启用警告的等效项可能会告诉您有关此问题的信息...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.