Как вывести два треугольника, отражающих друг друга на ассемблере

INCLUDE Irvine32.inc
.code
main PROC
        mov ecx, 1
        mov ebp, 6  ;used as reverse counter for blank spaces

L1:         call proc2
        call Proc1

        call CRLF           ;New line
        inc ecx             ;increments ecx
        cmp ecx, 6          ;Limits ecx to n
        jbe L1              ;If (CX <= n) Repeat

        exit
main ENDP

proc1 PROC  USES ecx
        mov  al, 'A'        ;Stores character in al
L2:         call WriteChar      ;Writes character
        inc al              ;Increments al
        loop L2
        ret
proc1 ENDP

proc2 PROC  
        push ebp    ;Preserve current spaces counter
        mov al, ' '         ;Space to print
L3:         call WriteChar      ;Print space
        dec ebp             ;Decrease counter
        jnz L3              ;If counter > 0 repeat
        pop ebp             ;Restore spaces counter
        dec ebp      ;Decrease one space for the next line
        ret
proc2 ENDP

END main

Я пытаюсь вывести два треугольника, как показано ниже. Я не могу заставить оба треугольника зеркально отражать друг друга, я просто получаю дрожь на правой стороне. Любая помощь будет очень ценится.

A            A
AB          BA
ABC        CBA
ABCD      DCBA
ABCDE    EDCBA
ABCDEF  FEDCBA

1 ответ

Есть много проблем с приведенным выше кодом. proc1 выводит N первых символов из ABCDEF, а proc2 выводит 6-N пробелов. Так что вы должны получить:

     A
    AB
   ABC
  ABCD
 ABCDE

Обратите внимание, что в шестой строке ebp равен 0, поэтому proc 2 выведет 2^32 пробела.

У вас должно быть что-то вроде этого в главном цикле (примечание: я предполагаю, что вам нужно 6 строк, поэтому сравните ecx с 7 и инициализируйте ebp с 7):

L1:     call proc1
        mov  ah, al
        call Proc2
        mov  al, ah
        call Proc3
        call CRLF           ;New line
        inc ecx             ;increments ecx
        cmp ecx, 7          ;Limits ecx to n
        jbe L1              ;If (CX <= n) Repeat

Где proc3 находится:

proc3 PROC  USES ecx
        dec al              ;al already contains the last output char+1
L2:     call WriteChar      ;Writes character
        dec al              ;Decrements al
        loop L2
        ret
proc1 ENDP

И в proc2 вы должны вывести 2 пробела в каждой итерации, как в:

L3:     call WriteChar      ;Print space
        call WriteChar      ;Print space
        dec ebp             ;Decrease counter
        jnz L3              ;If counter > 0 repeat
Другие вопросы по тегам