[英]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.