簡體   English   中英

嘗試以匯編語言翻轉三角形

[英]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(用於適當分隔),而在過程“空格”中則為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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM