使用 8086 组件在 NIM 游戏中打印桩

printing piles in NIM game with assembly 8086

我在汇编 8086 中写了一个 NIM game(有任意数量的桩和棍子,最多 45 个),但我是汇编语言的新手。 它还没有完成,现在我想用一些 ASCII 字符打印这些堆。

所以我写了一个打印它们的程序。 这是我的那部分代码:

cr equ 0dh
nl equ 0ah
shape db '| ', '$'
new db cr, nl, '$'
pile1 db 5 dup ?

print_pile  proc
pusha 
mov si, 0
mov cx, piles ;copy number of piles to cx
xor bl, bl

pile_loop:
lea dx, shape 
mov bl, pile1[si] ;I have prompted user to enter the number of 
                  ;sticks for each pile beforehand.

    print_loop:
    call print_msg ;a proc for printing strings
    dec bl
    cmp bl, 0
    jnz print_loop

lea dx, new ;print new line
call print_msg     
inc si    
dec cx
cmp cx, 0
jnz pile_loop

popa
ret
print_pile endp

当我运行它时,它首先建立pile1数组,每堆都有木棍。但我面临两个问题:

1- 当它将 pile1[0] 复制到 bl (mov bl, pile1[si]) 时,它从我的最后一个条目开始。我想它应该从第一个开始?

2- 第一个循环(si = 0,cx = piles)正确完成(虽然它是最后一个条目)并且打印了正确数量的木棍。但在第二个循环(si = 1,cx = piles-1)中,它将 0x7C(十进制 124)复制到 bl 并打印 124 根木棍。它总是 0x7C。

我不知道使用数组是否是存储木棍的有效方式。但我可以想到一种使用堆栈来存储它们的方法。 我想数组 pile1[].

有问题

PS。我的完整代码(到目前为止)可以看到here。 对不起我的英语。

PS。不知道有没有用,我用的是emu8086模拟器

在整个代码的第 107 行,您总是将 AL 移动到同一地址,因为您忘记增加 SI。

mov     pile1[si], al
inc     si  ; <-- Forgotten
inc     bx

1- 当它将 pile1[0] 复制到 bl (mov bl, pile1[si]) 时,它从我的最后一个条目开始。我想它应该从第一个开始?

我不明白你的意思。 mov bl,pile1[si] 只需填写一个计数器即可重复显示相同的形状。你在哪里看到它从最后一个条目开始?

编辑

在第 28 行,您将 piles 定义为 piles dw ? 的单词。
在第 82 行你只用 mov b. piles,al.
写了 piles 的低字节 汇编程序可能没有在 piles 处写入零,因为它可以自由解释 dw[=37= 中使用的 ? ].更好的代码 piles dw 0

我看不出你发布的代码有问题。链接代码有(至少 ;-) )两个错误

1) 第 29 行:

改变

pile1 db 5 dup ?

pile1 db 5 dup (?)

2) 第 108 行:

插入

inc si

如 user3144770 所述。