Assembly 用8086汇编实现NIM游戏中的打印桩
我正在用汇编语言8086编写一个程序集(具有任意数量的堆和棒,最大限制为45个),但我对汇编语言还不熟悉。 它还没有完成,现在我想打印一些ASCII字符的桩 所以我写了一个程序来打印它们。 以下是我对该部分的代码:Assembly 用8086汇编实现NIM游戏中的打印桩,assembly,x86-16,Assembly,X86 16,我正在用汇编语言8086编写一个程序集(具有任意数量的堆和棒,最大限制为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
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=1)中,它将0x7C(124位小数)复制到bl,并打印124条。它总是0x7C
我不知道使用数组是否是存储棍棒的有效方法。但我可以想出一种使用堆栈存储它们的方法。
我想数组pile1[]有问题
注:我的完整代码(到目前为止)可以看到。
对不起我的英语
另外,我不知道它是否有用,但我使用的是emu8086 emulator。在整个代码的第107行,您总是将AL移动到同一地址,因为您忘记了递增SI
mov pile1[si], al
inc si ; <-- Forgotten
inc bx
mov-pile1[si],al
国际公司 我看不出你发布的代码有问题。链接的代码有(至少;-)两个错误
1) 第29行:
改变
pile1 db 5 dup ?
到
2) 第108行:
插入
inc si
如用户3144770所述。谢谢。问题解决了。关于这个问题,假设我想有3个桩,我分别输入每个桩的杆数:first=4,second=5,last=7。它会在第一个循环时间将最后一个(7)正确复制到bl。正如你提到的,我的代码总是移动到同一个地址,导致两个第一个输入的数字被第三个覆盖。在我看来,数组的第一个索引是(7)。第二个索引是一个垃圾号(0x7C)。谢谢。改变?解决了另一个问题。你能解释一下使用“?”(不带括号)意味着什么吗?因为汇编程序没有返回任何错误,但它会打印一些垃圾,而不是我定义的“|”。@Pooya:语法是:number DUP(values)
,意思是:number
bytes/words/else(db
//code>dw
/else)和值。问号的意思是:任何事(都不重要)。如果没有括号,表达式是错误的,但在这种情况下,emu8086
只保留一个字节。因此,下面的形状
将被第二堆和第三堆覆盖。然后,new
将被覆盖,依此类推。
inc si