【发布时间】:2016-06-09 21:47:04
【问题描述】:
我是 64 位汇编编码的新手。所以我尝试了一些简单的程序:
c 程序:
#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
结果总是 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 位寄存器中加载立即数是否需要不同的指令?
【问题讨论】:
-
底部的示例似乎只工作,但已损坏。第一个汇编代码中的代码将整数值 10 移动到 rax,然后您尝试将 rax 中的整数值移动到 xmm0。问题是 movq 不会将通用寄存器中的整数转换为双精度并将其保存到 xmm0。您需要使用类似CVTSI2SD 的指令来转换寄存器中的整数值并将其存储在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,__float64__(10.0) ; movq xmm0, rax ; ret