在装配8086的NIM游戏中打印桩

时间:2015-01-28 16:32:12

标签: assembly x86-16

我在程序集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 =桩)正确完成(尽管它是最后一个条目)并打印正确的木棒数量。但在第二个循环(si = 1,cx = piles-1)中,它将0x7C(十进制124)复制到bl并打印124个。它始终是0x7C。

我不知道使用数组是否是存储棒的有效方式。但我想到了一种使用堆栈来存储它们的方法。 我想数组pile1 []会有问题。

PS。我的完整代码(截至目前)可见here。     抱歉我的英语。

PS。我不知道它是否有帮助,但我正在使用emu8086模拟器。

2 个答案:

答案 0 :(得分:1)

在整个代码的第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 dw ?的单词 在第82行,您只用mov b. piles,al写了的低位字节 汇编程序可能没有在 piles 中写入ZEROES,因为它可以自由地解释 dw 中使用的。更好的代码piles dw 0

答案 1 :(得分:1)

我看不到您发布的代码存在问题。链接代码具有(至少;-))两个错误

1)第29行:

更改

pile1 db 5 dup ?

pile1 db 5 dup (?)

2)第108行:

插入

inc si

如user3144770所述。