2011-01-11 5 views
3

J'ai défini dans la section de données un tableau 2d et deux tableaux 1d (un pour la somme des colonnes et un pour la somme des lignes) et j'ai écrit une fonction qui additionne le tableau 2d dans le tableau 1d. J'utilise à la fois eax et ebx comme index pour le tableau 2d, mais mon programme échoue quand eax ou ebx devient 1 et essaye d'accéder à une adresse inconnue dans la mémoire. comment puis-je corriger l'accès à la mémoire dans cette ligne:Tableau 2D dans l'ensemble

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

c'est mon programme:

.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. 

Répondre

5

Vous ajoutez le décalage pour les tableaux de somme au mauvais endroit.

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

lire:

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

qui vous devez d'abord charger le pointeur de la pile à un décalage connu de ebp, puis ajouter le décalage de l'élément requis.