我找到了一些解决方案,但它不起作用。
我不确定我的发现是否真的可能。
在代码的那部分我尝试进行更改:
mov al, [bx+si]
inc ax
mov [bx+si], al
但是当我在调试器中查看它时,它并没有更改值。
完整代码如下:
proc printAllEnemies
mov cx, 4
mov si, 0
pritingLoop:
mov bx, offset enemiesXYCondition
push cx
inc si
mov al, [bx+si]
push ax
inc si
mov al, [bx+si]
push ax
mov [enemyColor], 0
call print_enemy
sub si, 2
mov al, [bx+si]
cmp ax,0
je endPritingLoop
inc si
mov al, [bx+si]
inc ax
mov [bx+si], al
push ax
inc si
mov al, [bx+si]
push ax
mov [enemyColor], 11
call print_enemy
endPritingLoop:
pop cx
add si, 2
loop pritingLoop
ret
endp printAllEnemies
只要您通过 ret 4
进行操作,那么对参数进行如此多的推送并在 print_enemy
过程中弹出它们并没有什么问题。但是这段代码中有些东西没有计算!从您使用数组字节的方式来看,似乎每个记录都包含
3 字节:某种状态、一个 X 和一个 Y。据此我想说您需要替换 add si,2
通过靠近循环底部的
add si,3
。目前,如果跳过增加数组字节的代码,那么您将以 2 步遍历数组,但如果执行该特定代码,则以 4 步遍历数组。并且这些步骤都不是适合记录大小为 3。
cmp ax,0
处理 16 位累加器,其中您的代码仅加载累加器的最低 8 位。你确定AH为零吗?更好地使用
cmp al,0
。
proc printAllEnemies
mov cx, 4
mov si, 0
pritingLoop:
mov bx, offset enemiesXYCondition
push cx
mov al, [bx+si+1]
push ax
mov al, [bx+si+2]
push ax
mov [enemyColor], 0
call print_enemy
cmp byte ptr [bx+si], 0
je endPritingLoop
inc byte ptr [bx+si+1]
mov al, [bx+si+1]
push ax
mov al, [bx+si+2]
push ax
mov [enemyColor], 11
call print_enemy
endPritingLoop:
pop cx
add si, 3
loop pritingLoop
ret
endp printAllEnemies