2011-01-11 60 views
3

我在數據部分定義了一個2d數組和兩個1d數組(一個用於列和,另一個用於和總和),並且我寫了一個將2d數組合併到1d數組中的函數。 我使用eax和ebx作爲2d數組的索引,但是當eax或ebx becase 1並嘗試訪問內存中的未知地址時,我的程序失敗。 如何解決在此行中訪問內存:程序集中的二維數組

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

這是我的計劃:

.386 
.MODEL flat,stdcall 
.STACK 4096 
extern [email protected]: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 [email protected]   ;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. 

回答

5

您要添加的在錯誤的地方和陣列偏移。

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

應改爲:

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

這是你應該首先從堆棧在已知的從ebp偏移,然後添加了所需的元素偏載的指針。