运行 循环时 MASM x86 访问冲突

MASM x86 Access Violation While Running Loop

我有一个双字节整数数组,我用随机的 3 位数字填充它,使用 ESI 遍历数组。当我尝试访问数组的第 9 个元素并将其存储在 ESI 中时出现访问冲突。

ARRAYSIZE = 200

.data
list        WORD    ARRAYSIZE   DUP(?)

fillArray PROC
    push    OFFSET list
    mov     esi, [esp] ;GET ADDRESS OF FIRST ELEMENT INTO ESI
    mov     ecx, request ;NUMBER OF ELEMENTS TO BE ADDED

ArrFill:
    ;calculate random 3-digit number, store in eax
    dec     ecx
    mov     [esi], eax ;THIS IS THE LINE THAT THROWS THE EXCEPTION
    sub     esi, 2
    cmp     ecx, 0
    jnz     ArrFill

抛出异常:访问冲突写入位置0x00405FFE(抛出时ESI的值)。

当我将数组更改为四字节整数时,我还遇到访问冲突,因为我试图访问同一地址的数组的第 5 个元素。

哈德斯佩罗

您遇到了访问冲突,因为您试图写入超过数组边界。

几件事:

  1. 您似乎没有在初始化 ecx。您应该将其初始化为数组的大小。
  2. 因为你是 cmp ecx,0 你应该在比较之前递减 ecx
  3. 在确保不会越过边界后,您应该移动 esi 地址调整。我将重组代码以测试 ecx 是否为零,如果为真则跳出,否则递减 esi 并跳回 ArrFill
push    OFFSET list
mov     esi, [esp] ;GET ADDRESS OF FIRST ELEMENT INTO ESI

为什么不简单地将偏移量分配给 ESI mov esi, OFFSET list

mov     [esi], eax ;THIS IS THE LINE THAT THROWS THE EXCEPTION

由于数组包含个字所以只能写入AX的内容,不能写入EAX!使用 mov [esi], ax

sub     esi, 2

要在数组中前进,您需要添加到指针而不是从中减去。使用 add esi, 2