当前位置: 代码迷 >> 汇编语言 >> 谁帮小弟我看看上面的win32汇编程序为什么会出错?
  详细解决方案

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

热度:8003   发布时间:2013-02-26 00:00:00.0
哪位高手帮我看看下面的win32汇编程序为什么会出错???
Assembly code
;程序的功能是求数组中小雨50的和并输出来;此程序编译通过,运行时会出错,出错的语句是mov ebx,[esi+index],为什么?????INCLUDE Irvine32.inc.datasample        sdword    50array        sdword    10,60,20,33,72,89,45,65,72,18ArraySize    sdword    ($-array) / type sampleindex        sdword    0sum            sdword    0.codemain 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    exitmain ENDPEND main


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

  相关解决方案