首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 汇编语言 >

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

2012-09-29 
哪位高手帮我看看下面的win32汇编程序为什么会出错???Assembly code程序的功能是求数组中小雨50的和并输

哪位高手帮我看看下面的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 以指向下一个数据就可以了。

热点排行