пирамида звездочек в сборке 8086 - PullRequest
0 голосов
/ 29 декабря 2018

1

Я должен выполнить это упражнение в сборке 8086

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

, но в качестве вывода я получаю только первую звездочку.в чем проблема?

они сказали мне использовать pop and push, но не изучив их, я не знаю, как это сделать.Я надеюсь, что кто-нибудь поможет мне решить этот код.Также я делаю код на 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 голосов
/ 31 декабря 2018

в чем проблема?

Вы неправильно используете регистр 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

Если по какой-то причине вы не хотите, чтобы нижняя строка начиналась с одного пробела, следующая версия делает именно это:

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

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

    ...

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