Elad
Elad

Reputation: 479

2D array in assembly

I defined in the data section an 2d array and two 1d arrays (one for column sum and one for row sum) and i wrote a function that sum the 2d array into the 1d array. I'm using both eax and ebx as indexes to the 2d array but my program fail when eax or ebx becase 1 and trying to access to unknown address in the memory. how can i fix the access to the memory in this line:

mov edx,[ebp+columnsSumArray+type dword*ebx]

this is my program:

    .386
.MODEL flat,stdcall
.STACK 4096
extern ExitProcess@4:Near

.data                  ;Data area 
array2D     Dword 1,2,3,4           ; 3 Rows by 4 Columns
            Dword 5,6,7,8
            Dword 9,10,11,12

rowSumArray Dword 1,1,1             ; two sum init array's
columnSumArray Dword 1,1,1,1

.code                 ;Code area
_main:

    mov eax,offset columnSumArray
    push offset columnSumArray
    push offset rowSumArray
    push 4
    push 3
    push offset array2D

    call Sum2DimArray


    push    0                       ;Black box. Always terminate
    call    ExitProcess@4          ;program with this sequence


;----------------------------------------------------------------   
; Name: Sum2DimArray
; Input: 2d array pointer, rows, columns, rowSumArray, columnSumArray, 
; Description: this function sum the rows item in the 2d array and put it in the rowSumArray,
;              and sum the columns and put it in the columnSumArray
;----------------------------------------------------------------
Sum2DimArray PROC

    ParamSize = 5*4
    matrixAddress = 8
    rowsNumPlace = matrixAddress + 4
    columnsNumPlace = rowsNumPlace + 4
    rowsSumArray = columnsNumPlace + 4
    columnsSumArray = rowsSumArray + 4

    push ebp                            ; using the ebp as function variables pointer
    mov ebp,esp

    push ecx
    push eax
    push ebx
    push esi                            ; 2d array item pointer 
    push edx                    

    mov eax,0                           ; rows counter
    mov ebx,0                           ; columns counter

    mov esi,[ebp+matrixAddress]         ; esi points on the first 2d array value

    RowsLoop:                           ; rows loop
        mov ebx,0
        ColumnsLoop:                    ; columns loop

            mov ecx,[esi]               ; ecx is the current value

            mov edx,[ebp+rowsSumArray+type dword*eax]
            add [edx],ecx
            mov edx,[ebp+columnsSumArray+type dword*ebx]
            add [edx],ecx

            inc ebx
            add esi,sizeof Dword
            cmp ebx,[ebp+columnsNumPlace]
            jne ColumnsLoop

        inc eax
        cmp eax,[ebp+rowsNumPlace]
        jne RowsLoop

    pop edx
    pop esi
    pop ebx
    pop eax
    pop ecx
    pop ebp
    ret ParamSize

Sum2DimArray ENDP

end   _main              ;End of program. Label is the entry point.

Upvotes: 3

Views: 18913

Answers (1)

Jester
Jester

Reputation: 58762

You are adding the offset for the sum arrays in the wrong place.

mov edx,[ebp+rowsSumArray+type dword*eax]
add [edx],ecx
mov edx,[ebp+columnsSumArray+type dword*ebx]
add [edx],ecx

Should read:

mov edx,[ebp+rowsSumArray]
add [edx+type dword*eax],ecx
mov edx,[ebp+columnsSumArray]
add [edx+type dword*ebx],ecx

That is you should first load the pointer from the stack at a known offset from ebp, then add the offset for the required element.

Upvotes: 5

Related Questions