无法在汇编器中移动64位立即数
问题描述:
我是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位注册?
答
这里的问题是,OP试图移动10
成浮点寄存器用下面的代码:
mov rax,10
movq xmm0,rax
这不能工作,因为movq
到xmm0
假定的比特模式源代码是已经是浮点格式的 - 当然它不是:它是一个整数。
@迈克尔佩奇的建议是使用(NASM)汇编程序的浮点转换器如下:
mov rax,__float64__(10.0)
movq xmm0,rax
也就是说然后产生预期的输出。
底部示例只显示工作,但已损坏。第一个汇编代码中的代码将整数值10移动到rax,然后尝试将rax中的整数值移动到xmm0。问题是movq不会将通用寄存器中的整数转换为double,并将其保存到xmm0。您需要使用像[CVTSI2SD](http://www.felixcloutier.com/x86/CVTSI2SD.html)这样的指令来转换寄存器中的整数值并将其存储在xmm0中。这应该工作'bla:; mov eax,10; cvtsi2sd xmm0,rax; ret' –
该示例将整数值10移动到EAX中(自动零延伸到RAX中),但您也可以执行'mov rax,10'。 'cvtsi2sd xmm0,rax'将RAX中的标量整数转换为标量double(单个浮点数double)并将其存储在xmm0中。 –
还有另一种选择。您可以让NASM在汇编时将10.0转换为64位浮点常量(10.0),并将其存储在64位通用寄存器中。这可以直接移动到像这样的XMM寄存器:'bla:; mov rax,__ float64 __(10.0); movq xmm0,rax; ret' –