使用 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 所述。
我在汇编 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 所述。