Assembly 尝试在汇编语言中翻转三角形
我的代码的输出是Assembly 尝试在汇编语言中翻转三角形,assembly,x86,masm,irvine32,Assembly,X86,Masm,Irvine32,我的代码的输出是 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
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
正如@Jester所建议的,计数是解决方案,但我只在一个循环中对您的代码做了一点更改:
A A
AB BA
ABC CBA
ABCD DCBA
ABCDE EDCBA
ABCDEF FEDCBA
现在镜子:想法是在字母前打印空白:
A
AB
ABC
ABCD
ABCDE
ABCDEF
两个三角形:只需在空格前后调用Proc1即可显示两个三角形,非常重要的是,空格计数器EBP必须为12,以便进行适当的分隔,并且在proc空格中,EBP必须减少2:
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
替代解决方案:
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
让我们看看,如果ecx=6,您要打印1个字符,如果ecx=2,您要打印2个字符,如果ecx=1,您要打印6个字符。要是有一个简单的数学运算就好了。或者,您可以向上计数而不是向下计数:您有两个嵌套循环,使用ecx作为计数器寄存器,而不使用堆栈。你是如何得到这个输出的?@owacoder使用ecx做的魔法:@Jester-ah。我已经习惯了NASM和GAS,那里的一切都是公开的-你的实际问题是什么?其他一切似乎都准备好了。非常感谢,现在我正试着倒转直角三角形,你知道怎么做吗?@Mr.Robot,mirror?你是说uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu!镜像三角形我编辑了我的答案,看看。你知道如何镜像三角形吗?当然知道。但是你也可以,只要你花5分钟在上面。这并不十分复杂,你只需要按正确的顺序打印一些空格和字母。
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