我有一个双字节整数数组,我用随机的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个元素而获得访问冲突。
答案 0 :(得分:1)
push OFFSET list mov esi, [esp] ;GET ADDRESS OF FIRST ELEMENT INTO 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 :(得分:-1)
Hudspero
您正在尝试访问 过去 数组边界。
少数事情:
ecx
。您应该将其初始化为数组的大小。cmp ecx,0
时,您应该在比较之前递减ecx
esi
地址调整。我会重构代码以测试ecx为零,如果为true则跳出,否则递减esi
并跳回ArrFill