尝试用汇编语言翻转三角形

Trying to flip a triangle in assembly language

INCLUDE Irvine32.inc
.code
main PROC

        mov ecx, 6 
L1:
        call Proc1
        call CRLF
        loop L1

        exit
main ENDP

proc1 PROC  USES ecx
        mov  al, 'A'
L2:     call WriteChar
        inc al
        loop L2
        ret
proc1 ENDP

END main

我的代码的输出是

ABCDEF
ABCDE
ABCD
ABC
AB
A

呈三角形向下,但我需要将其翻转到原来的位置

A
AB
ABC
ABCD
ABCDE
ABCDEF

编辑:

正在尝试镜像直角三角形。

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

正如@Jester 所建议的那样,向上计数是解决方案,但只能在一个循环中进行(我对您的代码做了一点改动):

INCLUDE Irvine32.inc
.code
main PROC

        mov ecx, 1     ;<=============================
L1:
        call Proc1
        call CRLF
;       loop L1        ;<============================= NO MORE LOOP HERE.
        inc  ecx       ;<============================= CX++.
        cmp  ecx, 6    ;<============================= 
        jbe  L1        ;<============================= IF (CX <= 6) REPEAT.

        exit
main ENDP

proc1 PROC  USES ecx
        mov  al, 'A'
L2:     call WriteChar
        inc al
        loop L2
        ret
proc1 ENDP

END main

现在的输出是:

A
AB
ABC
ABCD
ABCDE
ABCDEF

现在镜像:想法是在字母前打印空格:

INCLUDE Irvine32.inc
.code
main PROC

        mov ecx, 1     ;<=============================
        mov ebp, 6     ;EBP IS USED AS REVERSE COUNTER FOR BLANK SPACES.

L1:     call spaces    ;</////////////////////////////
        call Proc1
        call CRLF
;       loop L1        ;<============================= NO MORE LOOP HERE.
        inc  ecx       ;<============================= CX++.
        cmp  ecx, 6    ;<============================= 
        jbe  L1        ;<============================= IF (CX <= 6) REPEAT.

        exit
main ENDP

proc1 PROC  USES ecx
        mov  al, 'A'
L2:     call WriteChar
        inc al
        loop L2
        ret
proc1 ENDP

spaces 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              ;</////////////////////////////
spaces ENDP              ;</////////////////////////////

END main

两个三角形 :只需在空格前后调用 "Proc1" 即可显示两个三角形,而且非常重要的是,空格计数器 "EBP",必须是 12(为了适当的分离),并且在 proc "Spaces" 中,EBP 必须减少 2 :

INCLUDE Irvine32.inc
.code
main PROC

        mov ecx, 1     ;<=============================
        mov ebp, 12     ;EBP IS USED AS REVERSE COUNTER FOR BLANK SPACES.

L1:     call Proc1     ;LEFT TRIANGLE ! ! !
        call spaces    ;</////////////////////////////
        call Proc1     ;RIGHT TRIANGLE ! ! !
        call CRLF
;       loop L1        ;<============================= NO MORE LOOP HERE.
        inc  ecx       ;<============================= CX++.
        cmp  ecx, 6    ;<============================= 
        jbe  L1        ;<============================= IF (CX <= 6) REPEAT.

        exit
main ENDP

proc1 PROC  USES ecx
        mov  al, 'A'
L2:     call WriteChar
        inc al
        loop L2
        ret
proc1 ENDP

spaces 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.
        sub  ebp, 2      ;DECREASE 2 SPACES FOR THE NEXT LINE.
        ret              ;</////////////////////////////
spaces ENDP              ;</////////////////////////////

END main

替代解决方案:

proc1 PROC  USES ecx
        neg ecx
        add ecx, 7   ; print 7-ecx letters
        mov  al, 'A'
L2:     call WriteChar
        inc al
        loop L2
        ret
proc1 ENDP