gpt4 book ai didi

assembly - assembly 中的二维数组

转载 作者:行者123 更新时间:2023-12-02 19:01:41 27 4
gpt4 key购买 nike

我在数据部分定义了一个二维数组和两个一维数组(一个用于列总和,一个用于行总和),并且我编写了一个函数,将二维数组求和到一维数组中。我使用 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.

最佳答案

您在错误的位置添加了总和数组的偏移量。

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 已知偏移量处加载指针,然后添加所需元素的偏移量。

关于assembly - assembly 中的二维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4655608/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com