我在程序集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模拟器。
答案 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所述。