Gcc Can';t在汇编程序中移动64位立即数
我是64位汇编代码的新手。所以我尝试了一些简单的程序: c程序: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
#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
intoxmm0
假设源的位模式已经是浮点格式的——当然不是:它是一个整数
@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