关于win32汇编的问题,为什么我的win32汇编程序编译通过,当我调试到while循环时就出错

时间:2022-03-23 02:15:53
错误提示:Project.exe中的0x0040101C 处未处理的异常:0xC00000005:读取位置0x0080a034时发生访问冲突。


TITLE  College Registration Example         (Regist.asm)

; Simple demonstration of MASM's .IF,
; .ENDIF, and .ELSEIF directives.
; Last update: 06/01/2006

INCLUDE Irvine32.inc

.data
sample sdword 50
array sdword 10,60,20,33,72,89,45,65,72,18
ArraySize sdword ($-array) / type sample
index sdword 0
sum sdword 0


.code
main PROC
mov eax,ArraySize
mov esi,offset array
.while index < eax
mov ebx,[esi+index]
.if ebx <= sample
add sum,ebx
.endif
;inc index
.endw

;显示求和结果
mov eax,sum
;call writedec

;exit
main ENDP

END main

1 个解决方案

#1


看下生成的代码就会发现问题了,mov ebx,[esi+index] 指令成了  mov ebx,[esi+402030] ,显然是将 指令里的 index 解释成了 index 的地址而非 index 所存放的数值。而且,index 作为数组里的索引的话,[esi+index] 从逻辑上来说也是不对的,汇编里必须自己计算数组元素的大小,即应该是[esi+index*4] 。
当然了,你这里,要么将 index 赋予个寄存器,要么就别用 index 了,直接将 esi 加 4 以指向下一个元素。

#1


看下生成的代码就会发现问题了,mov ebx,[esi+index] 指令成了  mov ebx,[esi+402030] ,显然是将 指令里的 index 解释成了 index 的地址而非 index 所存放的数值。而且,index 作为数组里的索引的话,[esi+index] 从逻辑上来说也是不对的,汇编里必须自己计算数组元素的大小,即应该是[esi+index*4] 。
当然了,你这里,要么将 index 赋予个寄存器,要么就别用 index 了,直接将 esi 加 4 以指向下一个元素。