2016-02-28 64 views
2

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

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值)。

当我将数组更改为四字节整数时,我也遇到访问冲突,以尝试访问同一地址处的数组的第五个元素。

+0

阵列有多大,每个值是16位,但您允许多少个值? –

+0

编辑:更新代码以添加更多信息。 – hudspero

+0

查看我的回答下面 –

回答

1
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

+1

非常感谢。我会考虑这一点。 – hudspero

-1

Hudspero

,因为你试图写过去阵列边界你得到一个访问冲突。

几件事情:

  1. 你似乎并不被初始化ecx。您应该将其初始化为数组的大小。
  2. 正如你cmp ecx,0你应该比较
  3. 你保证你不会写过去的边界后,您应该移动esi地址调整前递减ecx。我会重组代码来测试ECX零,如果真的跳出来,否则递减esi和跳回ArrFill
+0

我包括行 ;使用ecx作为计数器 专门用于引用我使用ECX的事实。我不认为有必要包括它,但现在我会。 – hudspero