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.