Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ORG 100H ; informacja dla kompilatora, ze program bedzie typu *.com (stos 100H)
- MOV AH, 9 ; informacja w AH okresla jak zadziala przerwanie INT 21h
- MOV DX, lbl_1 ; przeniesienie do DX adresu lancucha lbl_1
- INT 21H ; wywolanie funkcji AH, 9 przerwania INT 21H - wyswietlanie znakow ze zmiennej, do czasu napotkania dolara
- START: ; etykieta oznaczajaca poczatek programu - w kompilatorze NASM jest nieobowiązkowa, :),
- ; ale tutaj wykorzystujemy ją jako etykietę do skoku w przypadku podania zlej wartosci z klawiatury
- CALL ENTER ; wywolanie procedury robiacej linie odstepu
- MOV AH, 9
- MOV DX, lbl_2
- INT 21H ; informacja o mozliwosci wpisania tekstu
- CALL ENTER
- MOV AH, 9
- MOV DX, lbl_3
- INT 21H ; informacja o mozliwosci zakonczenia programu
- CALL ENTER
- MOV AH, 1
- INT 21H ; wywolanie funkcji AH, 1 przerwania INT 21H - pobranie znaku do rejestru AL
- CMP AL, 49 ; sprawdzanie pobranego znaku
- JE GETTXT ; jesli to 1 (49 w ASCII), program przechodzi do pobierania tekstow
- CMP AL, 13 ; sprawdzanie pobranego znaku
- JE KONIEC ; jesli to ENTER (13 w ASCII), program przechodzi do zakonczenia dzialania
- CALL ENTER
- MOV AH, 9
- MOV DX, lbl_zlyznak ; jesli to inny znak to wypisujemy ostrzezenie, ze nie podano zadnego z powyzszych
- INT 21H
- CALL ENTER
- JMP START ; jesli znak to zaden z powyzszych, program wraca do etykiety START
- GETTXT: ; etykieta oznaczajaca procedure wprowadzanie tekstu
- CALL ENTER
- MOV AH, 9
- MOV DX, lbl_txt
- INT 21H ; wyswietlenie prosby o podanie pierwszego tekstu
- MOV AH, 10 ; informacja w AH okresla jak zadziała przerwanie INT 21H
- MOV DX, text ; skopiowanie do DX adresu zmiennej, gdzie trafi pobrany tekst
- INT 21H ; wywolanie funkcji AH, 10 przerwania INT 21H - pobranie tekstu do zmiennej
- MOV AL, [text+1]
- CMP AL, 0 ; sprawdzenie, czy nie wprowadzono pustego lancucha (czy ilosc pobranych znakow nie wskazuje 0)
- JE BLAD ; jeśli tak, przechodzimy do etykiety(procedury)BLAD
- MOV AL, [text+1]
- CMP AL, 1 ; sprawdzenie, czy nie wprowadzono tylko jednego znaku (czy ilosc pobranych znakow nie wskazuje 1)
- JE JEDENZNAK ; jeśli tak, przechodzimy do etykiety(procedury)JEDENKZNAK
- CALL ENTER
- MOV AH, 9
- MOV DX, wynik
- INT 21H ; informacja o podaniu wyniku
- CALL WYPISZ ; wywolanie procedury wyswietlajacej znaki lancucha od tylu
- JMP START ; program wraca do etykiety START
- JEDENZNAK:
- CALL ENTER ; etykieta oznaczajaca obsluge bledu
- MOV AH, 9
- MOV DX, lbl_jznak
- INT 21H
- CALL ENTER ; wyswietlenie powiadomienia, ze uzytkownik podal pusty tekst
- JMP START
- BLAD: ; etykieta oznaczajaca obsluge bledu
- CALL ENTER
- MOV AH, 9
- MOV DX, lbl_err
- INT 21H
- CALL ENTER ; wyswietlenie powiadomienia, ze uzytkownik podal pusty tekst
- JMP START ; program wraca do etykiety START
- KONIEC: ; etykieta oznaczajaca przejscie do zakonczenia programu
- MOV AX, 4C00H ; informacja w AH okresla jak zadziała przerwanie INT 21h
- INT 21h ; wywolanie funkcji AH, 4Ch przerwania INT 21h - zakonczenie procesu
- ;=========================================================================================================================================================
- WYPISZ: ; procedura wypisujaca znaki od tylu
- XOR AX, AX
- XOR DX, DX
- MOV SI, 2 ; rejestr wskaznikowy SI nie dzieli sie na polowy, ustawiany jest na 2 (trzeci bajt) poniewaz od tego bajtu sa przechowywane znaki wczytane do zmiennej text
- XOR CL, CL ; pomocniczy licznik do przechowywania ilosci znakow polozonych na stosie
- NASTOS: ; petla do wrzucania wartosci na stos
- MOV DL, [text+SI] ; kopiowanie do DL wartosci znaku ze zmiennej txt o indeksie okreslonym przez SI (od 2 w gore), nie do calego DX, bo [text+SI] daje bajta, nie slowo
- CMP DL, 13 ; sprawdzanie, czy znak nie jest 13, czyli enterem, ktorym uzytkownik zakonczyl wprowadzanie znakow
- JE ZESTOSU ; jesli tak, nastepuje skok do petli wypisujacej
- PUSH DX ; umieszczenie wartosci z DX na stosie (nie mozna wrzucic tylko DL), trzeba 16 bit
- INC SI ; zwiekszenie wskaznika
- INC CL ; zwiekszenie licznika
- JMP NASTOS ; skok od poczatku petli
- ZESTOSU:
- POP DX ; zdjecie ze stosu wartosci - ostatnio wlozona wartosc jest na gorze stosu, wiec wystarczy je zdejmowac, aby uzyskac tekst od tylu
- MOV AH, 2
- INT 21H ; wywolanie funkcji AH, 2 przerwania INT 21H - wypisanie znaku z rejestru DL
- LOOP ZESTOSU ; LOOP powoduje powrto do petli ZESTOSU i jednoczesne zmniejszenie o 1 rejestru CL; mozna to zastapic np DEC CL i CMP/JE jesli ktos mialby takie zyczenie
- XOR AX, AX
- XOR DX, DX
- XOR CL, CL
- XOR SI, SI ; zerowanie rejestrow przy wyjsciu z procedury
- RET ; przy wywolaniu procedury WYPISZ, na stos trafia adres miejsca, do ktorego powraci procedura po jej zakonczeniu
- ; dyrektywa RET zdejmuje ze stosu wartosc i na jej podstawie wraca do miejsca wywolania
- ;=========================================================================================================================================================
- ENTER: ; procedura robiaca linie odstepu
- MOV AH, 9
- MOV DX, ent1 ; przeniesienie do DX adresu lancucha ent1
- INT 21H ; wywolanie funkcji AH, 9 przerwania INT 21H
- XOR AH, AH
- XOR DX, DX
- RET ; przy wywolaniu procedury WYPISZ, na stos trafia adres miejsca, do ktorego powraci procedura po jej zakonczeniu
- ; dyrektywa RET zdejmuje ze stosu wartosc i na jej podstawie wraca do miejsca wywolania
- ;=========================================================================================================================================================
- text db 250 ; zmienna text - bajt zmiennej o indeksie 0 (pierwszy) okresla maksymalna ilosc znakow jaka mozna wpisac
- db 0 ; bajt o indeksie 1 (drugi) ma wartosc 0, ale po wprowadzeniu tekstu bedzie zawieral wartosc odpowiadajaca ilosci wprowadzonych znakow
- times 251 db 36 ; times oznacza powielenie 251 razy bajtu zawierajacego wartosc 36 (dolara), a to oznacza, ze bajt o indeksie 2 (trzeci) i 250 nastepnych bedzie zawieralo dolara
- lbl_1 db "Projekt nr 1: wyswietlanie lancucha znakow od tylu $"
- lbl_2 db "Aby wprowadzic tekst nacisnij 1 $"
- lbl_3 db "Aby zakonczyc nacisnij ENTER $"
- lbl_err db "Nie wprowadzono tekstu! $"
- lbl_txt db "Prosze wpisac tekst, maks. 250 znakow: $"
- lbl_jznak db "Wprowadzono tylko jeden znak!$"
- lbl_zlyznak db "Nie wybrano zadnego z powyzszych!$"
- wynik db "Tekst od napisany od tylu to: $"
- ent1 db 10, 13, 36
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement