8086大会中的星号金字塔

时间:2018-12-29 13:07:45

标签: assembly dos x86-16

1

我应该在8086汇编中进行此练习

    *
   ***
  *****
 *******
*********

但是作为输出,我只得到第一个星号。问题出在哪里?

他们告诉我使用弹出和推入,但没有研究它们,我不知道该怎么做。我希望有人能给我有效的帮助来解决此代码。我也在做dosbox上的代码,这是我的代码:

.MODEL SMALL
.STACK
.DATA
nl db 0dh,0ah, '$'
. CODE
mov ax,@data
mov ds,ax
mov cx,5
mov bx,1

for1: 
push cx
mov dl,20h
mov ah,2
for2:
int 21h
loop for2
mov cx,bx
mov dl,'*'
mov ah,2
for3:
int 21h
loop for3
lea dx,nl
mov ah,9
int 21h
inc bx
inc dx
inc cx

loop for1

mov ah,4ch
int 21h

END

这是我们与TASM合作开发的一个学校问题,我们尚未研究复杂的指令,仅研究了我编写的代码中使用的那些指令。 有人可以纠正吗?

1 个答案:

答案 0 :(得分:0)

  

问题出在哪里?

您通过多种方式使用@Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "ID") private int id; @Column(name = "NAME", nullable = false, unique = true) private String name; 注册错误。

查看所需的金字塔,您会发现:

CX

您的代码已尝试执行的操作是在 * 5 leading spaces and 1 asterisk *** 4 leading spaces and 3 asterisks ***** 3 leading spaces and 5 asterisks ******* 2 leading spaces and 7 asterisks ********* 1 leading space and 9 asterisks 寄存器中保持星号的连续计数。纠正错字BX并将其更改为inc dx后,就可以了。

在控制前导空格的数量时,对inc bx寄存器的选择使事情变得复杂,以至于程序陷入困境。
为此,您应该选择一个额外的寄存器。我建议选择CX

BP

如果由于某种原因您不希望底线以单个空格开头,那么下一个版本就是这样:

    mov     bp, 5       ; first line has 5 spaces
    mov     bx, 1       ; first line has 1 asterisk
next: 

    mov     cx, bp      ; current number of spaces
spaces:
    mov     dl, " "
    mov     ah, 02h
    int     21h
    loop    spaces

    mov     cx, bx      ; current number of asterisks
asterisks:
    mov     dl, "*"
    mov     ah, 02h
    int     21h
    loop    asterisks

    lea     dx, nl
    mov     ah, 09h
    int     21h

    add     bx, 2       ; 2 asterisks more each line
    dec     bp          ; 1 space less each line
    jnz     next        ; until no more leading space needed