C呼叫约定32位到NASM与浮动(movups / movupd差异)

时间:2016-05-16 15:32:54

标签: c nasm

我在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或类似的指令?

0 个答案:

没有答案