GLOBAL calc ; Hiermit wird die Funktion calc externen ; Programmen zugänglich gemacht. section .data eps1 DD 0.0000000000088542 ; air eps2 DD 0.00000000002036466 ; oil zwei DD 2.0 calc: ; Einsprungadresse für Funktionsaufruf init: push ebp ; save EBP register mov ebp, esp ; put Stackpointer to EBP push eax ; save further used registers push ebx push ecx push edx push esi mov eax, [ebp + 8] ; >a< pointer on array data1[]. mov ebx, [ebp + 12] ; >r< pointer on array data2[]. mov edx, [ebp + 16] ; pointer on array result1[]. mov esi, [ebp + 20] ; pointer on array result2[]. mov ecx, 0 ; 0 to ECX start: finit ; FPU initialisieren ; this is equal for both epsilons ----------------------------------- fldpi ; pi fld dword [zwei] ; 2,pi fmulp st1 ; 2pi,pi fld dword [ebx+ecx*4] ; r,2pi,pi fmulp st1 ; 2rpi,2pi,pi fld dword [eax+ecx*4] ; a,2rpi,2pi,pi fld dword [ebx+ecx*4] ; r,a,2rpi,2pi,pi fmul st1 ; ar,a,2rpi,2pi,pi fld dword [ebx+ecx*4] ; r,ar,a,2rpi,2pi,pi fld st0 ; r,r,ar,a,2rpi,2pi,pi fmul st1 ; r*r,r,ar,a,2rpi,2pi,pi fld dword [eax+ecx*4] ; a,r*r,r,ar,a,2rpi,2pi fmul st4 ; a*a,r*r,r,ar,a,2rpi,2pi fxch st1 ; r*r,a*a,r,ar,a,2rpi,2pi fsubp st1 ; a*a-r*r,r,ar,a,2rpi,2pi fld st0 ; a*a-r*r,a*a-r*r,r,a*r,a,2*pi*r fxch st3 ; a*r,a*a-r*r,r,a*a-r*r,a,2*pi*r fsubp st3 ; a*a-r*r, r, a*a-r*r-a*r, a, 2*pi*r fdivrp st2 ; r, (a*a-r*r)/(a*a-r*r-a*r), a, 2*pi*r fdivrp st2 ; (a*a-r*r)/(a*a-r*r-a*r), r/a, 2*pi*r fmulp st1 ; r(a*a-r*r)/a(a*a-r*r-a*r), 2*pi*r fld1 ; 1,r(a*a-r*r)/a(a*a-r*r-a*r), 2*pi*r faddp st1 ; 1+r(a*a-r*r)/a(a*a-r*r-a*r)=H, 2*pi*r fmulp st1 ; 2*pi*r*H = K ;------------------------------------------------------------------------- ; now we gonna mult this with the epsilons! fld dword [eps1] ; load epsilon1 fmul st1 ; multiply with epsilon1 fstp dword [edx+ecx*4] ; put the result back to the Memory, pop fld dword [eps2] ; load epsilon2 fmulp st1 ; multiply with epsilon2, pop fstp dword [esi+ecx*4] ; put the result back to the Memory, pop ;------------------------------------------------------------------------- ; the loop: checking if all entries have been processed inc ecx ; Increment counter cmp ecx, 100 ; compare with 100 je ende ; if 100 we have finished jmp start ; else start again ;------------------------------------------------------------------------- ; recover registers ende: pop esi pop edx pop ecx pop ebx pop eax pop ebp ;------------------------------------------------------------------------- ; And return to the main prog! ret