Я определил в разделе данных 2d массив и два 1d массива (один для суммы столбцов и один для суммы строк), и я написал функцию, которая суммирует 2d массив в массив 1d.
Я использую и eax, и ebx в качестве индексов для двумерного массива, но моя программа не работает, когда eax или ebx становятся равными 1, и пытаюсь получить доступ к неизвестному адресу в памяти.
как я могу исправить доступ к памяти в этой строке:
mov edx,[ebp+columnsSumArray+type dword*ebx]
это моя программа:
.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.