汇编中有办法更改数组的变量吗?

问题描述 投票:0回答:1

我找到了一些解决方案,但它不起作用。
我不确定我的发现是否真的可能。

在代码的那部分我尝试进行更改:

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
arrays loops assembly x86-16
1个回答
2
投票

只要您通过 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
    
© www.soinside.com 2019 - 2024. All rights reserved.