尝试用汇编语言翻转三角形
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
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