我是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位寄存器中的立即数?
答案 0 :(得分:1)
这里的问题是OP尝试使用以下代码将10
移动到浮点寄存器中:
mov rax,10
movq xmm0,rax
这不起作用,因为movq
进入xmm0
假设源的位模式已经以浮点格式 - 当然它不是:这是一个整数。
@Michael Petch的建议是使用(NASM)汇编程序的浮点转换器如下:
mov rax,__float64__(10.0)
movq xmm0,rax
然后产生预期的输出。