Assembly 用8086汇编实现NIM游戏中的打印桩

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

我正在用汇编语言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 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