【问题标题】:2D array in assembly组装中的二维数组
【发布时间】:2011-01-11 08:30:12
【问题描述】:

我在数据部分定义了一个二维数组和两个一维数组(一个用于列总和,一个用于行总和),我编写了一个函数,将二维数组求和到一维数组中。 我同时使用 eax 和 ebx 作为二维数组的索引,但是当 eax 或 ebx becase 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.

【问题讨论】:

    标签: assembly x86-16


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-27
      • 2017-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-18
      • 1970-01-01
      相关资源
      最近更新 更多