运行 循环时 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 个元素。
哈德斯佩罗
您遇到了访问冲突,因为您试图写入超过数组边界。
几件事:
- 您似乎没有在初始化
ecx
。您应该将其初始化为数组的大小。
- 因为你是
cmp ecx,0
你应该在比较之前递减 ecx
- 在确保不会越过边界后,您应该移动
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
我有一个双字节整数数组,我用随机的 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 个元素。
哈德斯佩罗
您遇到了访问冲突,因为您试图写入超过数组边界。
几件事:
- 您似乎没有在初始化
ecx
。您应该将其初始化为数组的大小。 - 因为你是
cmp ecx,0
你应该在比较之前递减ecx
- 在确保不会越过边界后,您应该移动
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