谁帮小弟我看看下面的win32汇编程序为什么会出错?

哪位高手帮我看看下面的win32汇编程序为什么会出错???

;程序的功能是求数组中小雨50的和并输出来
;此程序编译通过,运行时会出错,出错的语句是mov ebx,[esi+index],为什么?????
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


------解决方案--------------------
上调试软件必然 Ollydbg 之类的,你看下 mov ebx,[esi+index] 指令成什么了:MOV EBX,DWORD PTR DS:[ESI+403030] ,其中的 index=403030 显然不是你所想的数组索引吧,而是那个索引变量的地址,所以就错了。而且其中对 index 的使用也是错误的,这个不是高级语言,会自动根据数组单元的大小自动计算相应索引指向单元的地址,必须自己来进行计算,即从算法上来说,应是 [esi+index*4] (这是示例,基于 esi 指向起始地址,index 确实是索引而非索引的地址)。
你这里吧,index 完全是多余,直接给 esi 加 4 以指向下一个数据就可以了。