Program wyświetlający piramidkę w assemblerze

0

Witam
mam taki program w asemblerze który pobiera cyfrę wpisaną z konsoli i wyświetla znaki od 9 do tej cyfry. Wygląda to tak:

section .text
org 100h
start:

mov	ah,7
int	21h

mov	cl,58
sub	cl,al

mov	bl,57
mov	ah,2

petla:
mov	dl,bl
int	21h
dec 	bl
loop	petla

koniec:
mov	ax, 4C00h
int	21h

teraz muszę go przerobić w taki sposób aby wyświetlał wyniki jako piramidkę, np jeśli podamy 4 to wyświetli się:
9
88
777
6666
55555
444444

Jeśli ktoś mógłby coś podpowiedzieć, jakoś pomóc to będę bardzo wdzięczny.
Pozdrawiam

1

Musisz policzyc ile znaków ma być w danej linii. Potem zrobić drugą pętlę która wewnątrz tej pierwszej powieli dany znak odpowiednią ilośc razy a na koniec wypisze znak nowej linii.

0
Shalom napisał(a):

Musisz policzyc ile znaków ma być w danej linii. Potem zrobić drugą pętlę która wewnątrz tej pierwszej powieli dany znak odpowiednią ilośc razy a na koniec wypisze znak nowej linii.

Ale właśnie jak w assemblerze zrobić pętlę w pętli oraz przenieść tekst do nowej linii?
Możesz polecić jakieś konkretne stonki, książki albo kursy?

1

Każda pęta w asemblerze wygląda tak samo -> cmp a potem skok warunkowy. To makro loop label którego używasz rozwija sie po prostu do:

dec cx
cmp cx, 0
ja label

Możesz sobie tego makra używać o ile będziesz pushować i popować wartość cx tzn

mov cx, 10
zewnetrzna:
  push cx
  mov cx, 5
  wewnetrzna:
    jakieś_instrukcje
  loop wewnetrzna
  pop cx
loop zewnetrzna

Zewnętrzna pętla obróci się 10 razy a wewnętrzna 5 razy na każdy obrót zewnętrznej.

Nowa linia to po prostu znak 0xAh

1

tak jak @Shalom powiedział pętla w pętli.
Ad kursu to masz tu dobry: http://bogdro.ciki.me/
i dodam jescze że pomiędzy labelem petla: a instrukcją loop petla masz prawdopodobnie błąd, gdyż instrukcja loop za każdym "obrotem" dekrementuje cx i kończy się dopiero gdy cx == 0 więc de facto to co tam masz działa tylko fartem.

0

@Proxima i @Shalom dziękuje Wam bardzo za pomoc. Niestety na razie nie udało mi się jeszcze poradzić z tym programem. W tym momencie wygląda on tak:

section .text
org 100h
start:

mov	ah,7
int	21h

mov	cl,58
sub	cl,al

mov	bl,57
mov	ah,2
mov  bh,1

petla:
push cx 
mov cx,bh

wewnetrzna:
mov	dl,bl
int	21h
loop wewnetrzna
mov dx, label
int 21h

inc bh		
dec bl
pop cx
loop petla

koniec:
mov	ax, 4C00h
int	21h

section .data
label DB 0Dh,0Ah

Chciałem użyć bh jako drugiego licznika który będę przypisywał do cx jednak to nie działa, maci moze jakiś pomysł jak to powinienem poprawić?
Mam też problem z przejściem do nowej linii. Nie bardzo wiem jak mam użyć tego znaku "0xAh"

1

naskrobałem ci taki przykładzik, przyjrzyj się jak to zrobiłem tutaj, jest nieco inaczej niż ma być bo źle spojrzałem na to co chciałeś i już mi się potem poprawiać nie chciało xD.
program pod linuxa jest ale pętle się śmiało przenoszą.

section .text

putc:
	push eax
	push ebx
	push ecx
	push edx

	mov byte [buf], al
	mov eax, 4
	mov ebx, 1
	mov ecx, buf
	mov edx, 2
	int 0x80

	pop edx
	pop ecx
	pop ebx
	pop eax
	ret

global _start
_start:
	mov eax, 3
	mov ebx, 0
	mov ecx, liczba
	mov edx, 1
	int 0x80

	xor ecx, ecx
	mov cl, byte [liczba]
	sub cl, '0'

	xor ax, ax
	xor bx, bx
	mov al, '9'
	mov bl, 1

	petla0:
	
	pusha
		petla1:
		call putc 
		dec bl
		cmp bl, 0	; lepiej test bl, bl
		jne petla1

	; tu sobie wydrukuj nową linię
	push ax
	mov al, 10
	call putc
	pop ax

	popa
	inc bl
	dec al
	
	loop petla0

	mov eax, 1
	xor ebx, ebx
	int 0x80

section .data
nap db "1", 13, 10, 0
new_line db 13, 10, 0
liczba db 0
buf db 0
./main
7
9
88
777
6666
55555
444444
3333333
./main
3
9
88
777
1
  1. emu8086 :)
  2. Masz po prostu wypisać taki znak na konsole :)
1
  1. Nikt ci nie broni debugować programu za pomocą emu8086...
  2. Tak samo jak wypisujesz sobie znak '1' czy '2' wypisz znak o numerze ascii 0xAh

edit: jak dla mnie program działa ok, w czym problem? Jedyna rzecz że mov dx, napis powinno być mov dx, offset napis jeśli to masm

1

Nie wnikam dokładnie w kod, ale z tego co widzę to przecież go używasz. Nie chce mi się teraz dosboxa sciągać i tam tego testować, ale powiedz co robi ta linia mov dx, napis ? Nic innego jak "używa" znaku 0xa

0

Aaaa ok już teraz rozumiem.
@Proxima i @Shalom chciałem Wam bardzo podziękować za pomoc.

1 użytkowników online, w tym zalogowanych: 0, gości: 1