运行循环时MASM x86访问冲突

时间:2016-02-28 17:41:23

标签: arrays exception assembly masm irvine32

我有一个双字节整数数组,我用随机的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个元素而获得访问冲突。

2 个答案:

答案 0 :(得分:1)

push    OFFSET list
mov     esi, [esp] ;GET ADDRESS OF FIRST ELEMENT INTO ESI

为什么不简单地使用mov esi, OFFSET list

将偏移分配给ESI
mov     [esi], eax ;THIS IS THE LINE THAT THROWS THE EXCEPTION

由于数组包含单词,您只能编写AX的内容,而不是EAX!使用mov [esi], ax

sub     esi, 2

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

答案 1 :(得分:-1)

Hudspero

您正在尝试访问 过去 数组边界。

少数事情:

  1. 您似乎没有初始化ecx。您应该将其初始化为数组的大小。
  2. 当您cmp ecx,0时,您应该在比较之前递减ecx
  3. 在确保不会越过边界后,应移动esi地址调整。我会重构代码以测试ecx为零,如果为true则跳出,否则递减esi并跳回ArrFill
相关问题