簡體   English   中英

在x86_64組裝問題中添加雙打

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM