C使用float调用32位到NASM的约定(movups / movupd difference)

我在C中使用了这个函数。当我使用像:movss,movaps,movups这样的函数时,所有工作都是正确的,而当我使用像:movupd,movapd,ecc这样的函数时…它不起作用..并返回奇怪的值

与movaps,movups,ecc一起工作的代码。

C:

extern float test(float* a,float* b, int num, int spuri, float* res); int main(int argc, char** argv) { float a[] = { 1.0, 2.0, 3.0, 4.0, 6.0, 9.0 }; float b[] = { 3.0, 4.0, 4.0, 5.0, 5.0, 8.0 }; int d=6; int num=d/4; int spuri=d-(num*4); float res=-1.0; test(a,b,num,spuri,&res); printf("res: %f\n",res); return 1; } 

NASM:

 %include "sseutils.nasm" section .data section .bss alignb 16 A: resd 1 T: resd 4 section .text global test a equ 8 b equ 12 num equ 16 spuri equ 20 result equ 24 test: push ebp mov ebp, esp push ebx push esi push edi mov esi, [ebp+a] mov edi, [ebp+b] mov ebx, 0 mov ecx, [ebp+num] mov edx, [ebp+spuri] mov eax,[ebp+result] xorps xmm1,xmm1 xorps xmm3,xmm3 loop1: cmp ecx,0 je loop2 movups xmm0, [esi+ebx] movups xmm6, [edi+ebx] subps xmm0, xmm6 mulps xmm0, xmm0 sqrtps xmm0, xmm0 addps xmm1, xmm0 add ebx, 16 dec ecx jnz loop1 loop2: cmp edx,0 je end movss xmm2,[esi+ebx] movss xmm7,[edi+ebx] subps xmm2, xmm7 mulps xmm2, xmm2 sqrtps xmm2, xmm2 addps xmm3, xmm2 add ebx,4 dec edx jnz loop2 end: haddps xmm1,xmm1 haddps xmm1,xmm1 addps xmm1,xmm3 movups [eax],xmm1 pop edi pop esi pop ebx mov esp, ebp pop ebp ret 

这返回正确的值,但我需要更高的精度,因为数字是浮点数,需要使用movupd或类似的结构。

它如何修改以前的代码以使用MOVUPD,MOVAPD或类似的指令?