当前位置: 代码迷 >> 汇编语言 >> 关于win32汇编的有关问题,为什么小弟我的win32汇编程序编译通过,当小弟我调试到while循环时就出错
  详细解决方案

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

热度:4765   发布时间:2013-02-26 00:00:00.0
关于win32汇编的问题,为什么我的win32汇编程序编译通过,当我调试到while循环时就出错
错误提示: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

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