2016-06-09 117 views
1

我是64位汇编编码的新手。于是,我尝试了一些简单的programms的:无法在汇编器中移动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 

我需要一个不同的指令来加载一个Immed在64位注册?

+0

底部示例只显示工作,但已损坏。第一个汇编代码中的代码将整数值10移动到rax,然后尝试将rax中的整数值移动到xmm0。问题是movq不会将通用寄存器中的整数转换为double,并将其保存到xmm0。您需要使用像[CVTSI2SD](http://www.felixcloutier.com/x86/CVTSI2SD.html)这样的指令来转换寄存器中的整数值并将其存储在xmm0中。这应该工作'bla:; mov eax,10; cvtsi2sd xmm0,rax; ret' –

+0

该示例将整数值10移动到EAX中(自动零延伸到RAX中),但您也可以执行'mov rax,10'。 'cvtsi2sd xmm0,rax'将RAX中的标量整数转换为标量double(单个浮点数double)并将其存储在xmm0中。 –

+0

还有另一种选择。您可以让NASM在汇编时将10.0转换为64位浮点常量(10.0),并将其存储在64位通用寄存器中。这可以直接移动到像这样的XMM寄存器:'bla:; mov rax,__ float64 __(10.0); movq xmm0,rax; ret' –

回答

1

这里的问题是,OP试图移动10成浮点寄存器用下面的代码:

mov rax,10 
movq xmm0,rax 

这不能工作,因为movqxmm0假定的比特模式源代码是已经是浮点格式的 - 当然它不是:它是一个整数。

@迈克尔佩奇的建议是使用(NASM)汇编程序的浮点转换器如下:

mov rax,__float64__(10.0) 
movq xmm0,rax 

也就是说然后产生预期的输出。