【发布时间】:2016-05-28 00:46:11
【问题描述】:
我有一个外部函数:
extern "C" void calculateAreaUnderCurve_(double startPoint, double endPoint, int numberOfTrapezes, double* coefficients, double* result);
我想在我的 .asm 文件中将 numberOfTrapezes 转换为 double。
我尝试过:vcvtsi2sd 和 cvtsi2sd,但它不起作用。
编辑:
这是我的 .asm 文件
.model flat,c
.code
; Function declatation:
; int calculateAreaUnderCurve_(double startPoint, double endPoint,
; int numberOfTrapezes, double* coefficients, double* result);
calculateAreaUnderCurve_ proc
push ebp
mov ebp,esp
; Load argument values
vmovsd xmm1,real8 ptr [ebp+8] ;xmm1 = startPoint
vmovsd xmm2,real8 ptr [ebp+16] ;xmm2 = endPoint
mov ebx, [ebp+20] ;ebx = numberOfTrapezez int value
mov eax, [ebp+28] ;eax = pointer to coefficients array
mov ecx, [ebp+32] ;ecx = pointer to result
cvtsi2sd xmm3,dword [ebp+20] ;convert to double
movsd real8 ptr [ecx],xmm3 ;save result
pop ebp
ret
calculateAreaUnderCurve_ endp
end
还有我的函数调用:
int numberOfTrapezes=100;
//initialize other parameters
calculateAreaUnderCurve_(startPoint,endPoint,numberOfTrapezes, coefficients, &result);
结果我得到一个奇怪的数字1.0761e+09
【问题讨论】:
-
你可能会因为破坏 ebx 而崩溃。如果您正在为像 32 位 x86 这样在堆栈上传递参数的蹩脚调用约定编写代码,只需将
vcvtsi2sd与内存操作数一起使用。 -
你用的是什么CPU?
vcvtsi2sd是 AVX-512,不是 AVX。 -
@PaulR 如果我是你,我会再看看指令集参考。
-
@EOF:嗯 - 一定是在线内在函数指南中的错误:software.intel.com/sites/landingpage/IntrinsicsGuide/…
-
@PaulR:
vcvtsi2sd只是 VEX 编码 of the SSE2 instruction。出于某种原因,它的 EVEX 编码有新的内在函数,没有舍入控制覆盖,即使它们仍然没有改变愚蠢的语义(合并到现有的 reg 中,而不是将上半部分归零以破坏依赖链常见的标量用例)。
标签: assembly x86 x86-64 masm avx