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 以指向下一个元素。
当然了,你这里,要么将 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 以指向下一个元素。
当然了,你这里,要么将 index 赋予个寄存器,要么就别用 index 了,直接将 esi 加 4 以指向下一个元素。