[Asembler]Znaczek

0

Witam mam problem ze zrobieniem wielkiego znaczka backslash z malych backslash'y, a mianowicie backslash'e pojawiaja sie w pionie. Wiem ze nalezy dorzucic do tego spacje, aby utworzyly one duzy znak backslash leczy to stanowi dla mnie problem.

.model small
.386
.data
.stack 100h
.code
.startup
;dane początkowe
mov dl,'\' ;definicja znaku 
mov dh, 1 ;ilość znaków na danym poziomie 
mov cx, 20 ;ilość poziomów 
mov bl, 0 ;ilość spacji na danym poziomie 
poziom:
push cx ;ilość poziomów na stos
mov ch, 0 ;wyzerowanie starszego bajtu rejestru cx
mov cl, dh ;wpisanie do rejestru cl ilości znaków na danym poziomie
mov al, dl ;wpisanie do rejestru al znaku
mov bh, 0 ;wpisanie do rejestru bh strony ekranu = 0
mov ah, 0Ah ;załadowanie do ah numeru właściwej funkcji przerwania 10h
int 10h ;wywołanie przerwania obsługującego grafikę
;przejście do kolejnego poziomu cr + lf
mov al, 0Ah ;wpisanie do rejestru al znaku lf (do lewej)
mov bh, 0 ;wpisanie do rejestru bh strony ekranu = 0
mov ah, 0Eh ;załadowanie do ah numeru właściwej funkcji przerwania 10h
int 10h ;wywołanie przerwania obsługującego grafikę
mov al, 0Dh ;wpisanie do rejestru al znaku cr (nowa linia)
mov bh, 0 ;wpisanie do rejestru bh strony ekranu = 0
mov ah, 0Eh ;załadowanie do ah numeru właściwej funkcji przerwania 10h
int 10h ;wywołanie przerwania obsługującego grafikę
pop cx ;pobranie ze stosu rejestru cx (licznik pętli)
loop poziom ;
.exit
end
0

po push cx dajesz:

spacje:
inc cx
push cx
mov ch, 0 ;wyzerowanie starszego bajtu rejestru cx
mov cl, dh ;wpisanie do rejestru cl ilości znaków na danym poziomie
mov al, dl ;wpisanie do rejestru al znaku
mov bh, 0 ;wpisanie do rejestru bh strony ekranu = 0
mov ah, 20h ;załadowanie do ah numeru właściwej funkcji przerwania 10h
int 10h ;wywołanie przerwania obsługującego grafikę
pop cx
loop spacje
0

Po co inc cx? W ten sposob to zapetlisz w nieskonczonosc, bo loop bedzei zmniejszal cx, a inc zwiekszal i beda sie "znosic"...

0

mov cx,20 ;ile
more:
mov dx,cx

mov al,''
mov ah,0x0E
mov cx,1
int 0x10

mov al,0x0A
mov ah,0x0E
mov cx,1
int 0x10

mov cx,dx
loopw more

0

Ja pierniczę, teraz się h3x za asma zabrał, oczywiście kolejny raz spierdolił...

0
cyriel napisał(a)

Po co inc cx? W ten sposob to zapetlisz w nieskonczonosc, bo loop bedzei zmniejszal cx, a inc zwiekszal i beda sie "znosic"...

Oczywiście tego tam nie miało być (nie chciało mi się zmieniać loopa i tak średnio to wyszło - ogólnie loop nie pasuje do tego zadania)
tak powinno być:

sub cx,20
neg cx
spacje:
sub cx,1
jz end
push cx
movzx cx,dh ;wpisanie do rejestru cl ilości znaków na danym poziomie
mov al, dl ;wpisanie do rejestru al znaku
mov bh, 0 ;wpisanie do rejestru bh strony ekranu = 0
mov ah, 20h ;załadowanie do ah numeru właściwej funkcji przerwania 10h
int 10h ;wywołanie przerwania obsługującego grafikę
pop cx
jmp spacje
end:

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