Как вывести два треугольника, отражающих друг друга на ассемблере
INCLUDE Irvine32.inc
.code
main PROC
mov ecx, 1
mov ebp, 6 ;used as reverse counter for blank spaces
L1: call proc2
call Proc1
call CRLF ;New line
inc ecx ;increments ecx
cmp ecx, 6 ;Limits ecx to n
jbe L1 ;If (CX <= n) Repeat
exit
main ENDP
proc1 PROC USES ecx
mov al, 'A' ;Stores character in al
L2: call WriteChar ;Writes character
inc al ;Increments al
loop L2
ret
proc1 ENDP
proc2 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
proc2 ENDP
END main
Я пытаюсь вывести два треугольника, как показано ниже. Я не могу заставить оба треугольника зеркально отражать друг друга, я просто получаю дрожь на правой стороне. Любая помощь будет очень ценится.
A A
AB BA
ABC CBA
ABCD DCBA
ABCDE EDCBA
ABCDEF FEDCBA
1 ответ
Есть много проблем с приведенным выше кодом. proc1 выводит N первых символов из ABCDEF, а proc2 выводит 6-N пробелов. Так что вы должны получить:
A
AB
ABC
ABCD
ABCDE
Обратите внимание, что в шестой строке ebp равен 0, поэтому proc 2 выведет 2^32 пробела.
У вас должно быть что-то вроде этого в главном цикле (примечание: я предполагаю, что вам нужно 6 строк, поэтому сравните ecx с 7 и инициализируйте ebp с 7):
L1: call proc1
mov ah, al
call Proc2
mov al, ah
call Proc3
call CRLF ;New line
inc ecx ;increments ecx
cmp ecx, 7 ;Limits ecx to n
jbe L1 ;If (CX <= n) Repeat
Где proc3 находится:
proc3 PROC USES ecx
dec al ;al already contains the last output char+1
L2: call WriteChar ;Writes character
dec al ;Decrements al
loop L2
ret
proc1 ENDP
И в proc2 вы должны вывести 2 пробела в каждой итерации, как в:
L3: call WriteChar ;Print space
call WriteChar ;Print space
dec ebp ;Decrease counter
jnz L3 ;If counter > 0 repeat