assembly - assembly 中的二维数组

标签 assembly x86-16

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

相关文章:

assembly - 将 8086 上的 %EAX 寄存器清零

assembly - int 13h 不从虚拟磁盘读取扇区

loops - 汇编8086,LOOP指令不停

windows - 如何将 .asm 文件汇编并链接到 Win32 可执行文件?

c++ - 让编译器生成 adc 指令

linux - 检查地址在 x86 程序集中是否可写

assembly - 来自 AT&T 语法的 Intel Assembly ljmp 语法

assembly - NASM:如何正确访问 ssd 驱动器?

assembly - LW 和 LB 结果相同

assembly - 为什么会生成如此奇怪的代码?