无法在汇编程序中移动64位立即数

时间:2016-06-09 21:47:04

标签: gcc nasm

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

C-PROGRAMM:

#include <stdio.h>

extern double bla();
double x=0;
int main() {
    x=bla();
    printf(" %f",x);
    return 0;
 }

大会:

   section .data
   section .text 
   global bla

   bla:
   mov rax,10
   movq xmm0,rax 
   ret

结果是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

我是否需要一个不同的指令来加载64位寄存器中的立即数?

1 个答案:

答案 0 :(得分:1)

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

mov rax,10
movq xmm0,rax 

这不起作用,因为movq进入xmm0假设源的位模式已经以浮点格式 - 当然它不是:这是一个整数。

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

mov rax,__float64__(10.0)
movq xmm0,rax 

然后产生预期的输出。

相关问题