在AVX x86中将int转换为double

Bab*_*age 0 x86 assembly x86-64 masm avx

我有一个外部功能:

extern "C" void calculateAreaUnderCurve_(double startPoint, double endPoint, int numberOfTrapezes, double* coefficients, double* result);
Run Code Online (Sandbox Code Playgroud)

我想在我的.asm文件中转换numberOfTrapezes为a double.

我试着用:vcvtsi2sdcvtsi2sd,但它不工作.

编辑:

这是我的.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
Run Code Online (Sandbox Code Playgroud)

我的函数调用:

int numberOfTrapezes=100;
//initialize other parameters
calculateAreaUnderCurve_(startPoint,endPoint,numberOfTrapezes, coefficients, &result);
Run Code Online (Sandbox Code Playgroud)

结果我得到了奇怪的数字 1.0761e+09

Fif*_*nik 6

vmovsd  xmm1,real8 ptr [ebp+8]      ;xmm1 = startPoint
vmovsd  xmm2,real8 ptr [ebp+16]     ;xmm2 = endPoint
mov     ebx, [ebp+20]               ;ebx  = numberOfTrapezez int value
Run Code Online (Sandbox Code Playgroud)

您正在从错误的地址检索numberOfTrapezez!的端点占用8个字节,所以改变偏移从20至24.

mov ebx, [ebp+24]
Run Code Online (Sandbox Code Playgroud)

并且

cvtsi2sd xmm3,dword [ebp+24]        ;convert to double
Run Code Online (Sandbox Code Playgroud)