c - Incorrect iteration of loop in Assembler -
using nasm 32bit assembler code yields unexpected result current attempts write loop swaps elements of vector. given esi , edi point 2 different vectors (storing double values) , ecx number n describing swap first n elements [esi] first n elements [edi] attempts far this:
; c-call: dswap(int n, double* dx, int unused1, double* dy, int unused2) _dswap: force ebp mov ebp, esp pusha mov esi, [ebp+12] ; dx mov edi, [ebp+20] ; dy mov ecx, [ebp+8] ; n ; unused1 , unused2 unused moment mainloop: cmp ecx, 0 je exitfunction mov eax, [esi + 4 * ecx] mov ebx, [edi + 4 * ecx] mov [esi + 4 * ecx], ebx mov [edi + 4 * ecx], eax dec ecx jmp mainloop exitfunction: popa mov esp, ebp pop ebp ret i getting unexpected behavior. calling dswap on (1,2,3) (4,5,6) , n=3 swaps first 2 elements in both vectors making me think did wrong here.
you dealing doubles, multiplying ecx 4 (the size of float). since size of double 8, should multiply 8.
another problem not decrement ecx before multiply it. assuming n passed 3, swapping dx[3] dy[3] on first iteration, beyond ends of arrays. prepare this, can decrement ecx before swaps.
c arrays loops assembly nasm
No comments:
Post a Comment