Gcc Can';t在汇编程序中移动64位立即数

Gcc Can';t在汇编程序中移动64位立即数,gcc,nasm,Gcc,Nasm,我是64位汇编代码的新手。所以我尝试了一些简单的程序: c程序: #include <stdio.h> extern double bla(); double x=0; int main() { x=bla(); printf(" %f",x); return 0; } 结果是alwals 0.0而不是10.0 但是当我没有立即停止的时候,它工作的很好 #include <stdio.h> extern double bla(dou

我是64位汇编代码的新手。所以我尝试了一些简单的程序:

c程序:

#include <stdio.h>

extern double bla();
double x=0;
int main() {
    x=bla();
    printf(" %f",x);
    return 0;
 }
结果是alwals 0.0而不是10.0 但是当我没有立即停止的时候,它工作的很好

  #include <stdio.h>


 extern double bla(double y);
 double x=0;
 double a=10;
 int main() {
   x=bla(a);
   printf("add returned %f",x);
   return 0;
 }


 section .data
 section .text 
 global bla


 bla:
  movq rax,xmm0
  movq xmm0,rbx ;xmm0=0 now
  movq xmm0,rax ;xmm0=10 now
 ret
#包括
外部双bla(双y);
双x=0;
双a=10;
int main(){
x=bla(a);
printf(“添加返回的%f”,x);
返回0;
}
第二节数据
第节.案文
全球bla
布莱:
movq-rax,xmm0
movq-xmm0,rbx;现在xmm0=0
movq-xmm0,rax;现在xmm0=10
ret

是否需要其他指令才能在64位寄存器中加载立即数?

这里的问题是,OP试图使用以下代码将
10
移动到浮点寄存器中:

mov rax,10
movq xmm0,rax 
这是行不通的,因为
movq
into
xmm0
假设源的位模式已经是浮点格式的——当然不是:它是一个整数

@Michael Petch的建议是使用(NASM)汇编程序的浮点转换器,如下所示:

mov rax,__float64__(10.0)
movq xmm0,rax 

这将产生预期的输出。

下面的示例似乎只起作用,但已失效。第一个汇编代码中的代码将整数值10移动到rax中,然后尝试将rax中的整数值移动到xmm0。问题是movq不会将通用寄存器中的整数转换为double并将其保存到xmm0。您需要使用类似于转换寄存器中的整数值并将其存储在xmm0中的指令。这应该有效
bla:;mov-eax,10;cvtsi2sd xmm0,rax;ret
该示例将整数值10移动到EAX中(自动将零扩展到RAX),但您也可以执行
mov-RAX,10
cvtsi2sd xmm0,rax
将rax中的标量整数转换为标量双精度(单浮点双精度)并存储在xmm0中。还有另一种选择。您可以让NASM在汇编时将10.0转换为64位浮点常量(10.0),并将其存储在64位通用寄存器中。可以像这样直接移动到XMM寄存器:
bla:;mov-rax,浮点数64(10.0);movq-xmm0,rax;ret
mov rax,__float64__(10.0)
movq xmm0,rax