Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ENTER_KEY EQU 0DH
- ;uproszczone dyrektywy segmentowe, oraz model tiny - program typu COM
- .MODEL TINY
- .CODE
- .386 ;to znaczy ze bedziemy uzywac instrukcji zgodnych z procesorem x386
- ORG 100H ;pomijamy nie duzy przedrostek programu
- START:
- JMP MAIN
- ;tu sa zdefiniowane tablice znakow do wyswietlenia za pomoca funkcji 09h przerwania 21h
- ;ktora to wyswietla az do znaku $
- ;0ah - znak powrotu karetki
- ;0dh - znak nowej lini
- PASSWORD_OK DB 0AH, 0Dh, 'Password Ok$'
- PASSWORD_FAIL DB 0AH, 0Dh, 'Password Fail$'
- NEW_LINE DB 0AH, 0DH, '$'
- ;bufor na znaki wprowadzane
- ;16+1 poniewaz moze byc 16 znako i znak $
- ;DB X DUP(Y) oznacza: zdefinuj X bajt?w o wartosci Y
- BUFOR DB 16+1 DUP(0)
- ;tutaj teraz definiujemy sobie nasze dane w pamieci programu
- ;ktore bedziemy wykozystywac podczas resztyo programu.
- ;glowna procedura programu
- MAIN PROC NEAR
- XOR SI,SI ;zerujemy rejestr SI operacja xor, najszybsze zerowanie
- ;rej. SI bedzie nam slozyl jako licznik wprowadzonych znakow
- MAIN_START: ;etykieta
- MOV AX,1000H ;funkcja przerwania 16h czekajaca na nacisniecie klawisza
- INT 16H ;wywolujemy przerwanie 16h, funkcja zwraca do rej. AL znak klawisza
- ;a do rej. AH kod klawisza
- INC SI ;zwieksz licznik wprowadzonych znakow
- ;sprawdzamy czy to enter
- CMP AL,ENTER_KEY ;porownanie rej. AL z wartoscia 0Dh
- JE MAIN_START1 ;gdy jest rowne, gdy znak to klawisz enter to skacz do main_end
- CMP SI,16 ;porwnanie SI z 16
- JA MAIN_START0 ;gdy Si > 16 to skacz do MAIN_END
- ;zapisujemy znak do bufora
- PUSH AX ;zapisz na sto wartosc rejestru AX, ktory ma w sobie rej AL ze znakiem odczytanym
- MOV DL,'*' ;do DL znak gwiazdki do wyswietlenia
- MOV AH,02H ;funkcja 02h przerwania dosa 21h ktora wyswietla podany znak z rej. DL
- INT 21h
- JMP MAIN_START ;skok na poczatek programu
- MAIN_START0:
- ;gdy wpisano wiecej niz 16 i 17 nie byl enter
- ;to wypsiz password_fail
- MOV AH,09H ;do AH kod funkcji do wypisywanie tesktu na ekran
- LEA DX,PASSWORD_FAIL ;do DX adres tablicy ze znakami
- INT 21H ;wywolujemy przerwanie wykonujac wypisanie na ekran
- JMP MAIN_START2 ;skacz
- MAIN_START1:
- ;gdy wcisnieto enter to password napewno jest ok
- MOV AH,09H ;do AH kod funkcji do wypisywanie tesktu na ekran
- LEA DX,PASSWORD_OK ;do DX adres tablicy ze znakami
- INT 21H ;wywolujemy przerwanie wykonujac wypisanie na ekran
- JMP MAIN_START2 ;skacz
- MAIN_START2:
- XOR DI,DI ;zerujemy DI to bedzien asz nowy iterator do bufora
- MAIN_START3:
- CMP SI,1 ;porownanie SI z 1
- JB MAIN_START4 ;jezeli mniejszy od 1 to skacz
- ;jezeli wiekszy to znaczy ze sa jeszcze znaki na stosie do odebrania
- POP AX ;odbieramy znak ze sotsu, po tym rozkazie bedzie on w AL
- MOV BUFOR[DI],AL ;DI jako iterator do tablicy BUFOR, operacja mOV kkopiuje znak z AL
- INC DI ;zwiekszamy iterator
- DEC SI ;zmniejsz ilosc
- JMP MAIN_START3 ;do petli skok
- MAIN_START4:
- ;zapisujemy znak $ do bufora
- ;BYTE PTR m?wi ze nalezy kopiwoac znak w zakresie 1 bajta do pamieci
- ;wtedy ta instrukcja zapisze tylko bajt do pamieci i nie zmieni innych sasiadujacych
- ;bajt?w w pamieci
- MOV BYTE PTR BUFOR[DI],'$' ;DI jako iterator do tablicy BUFOR, operacja mOV kkopiuje znak z AL
- ;wyswietlamy nowa linie
- MOV AH,09H ;do AH kod funkcji do wypisywanie tesktu na ekran
- LEA DX,NEW_LINE ;do DX adres tablicy ze znakami
- INT 21H ;wywolujemy przerwanie wykonujac wypisanie na ekran
- ;wyswietlamy bufor
- MOV AH,09H ;do AH kod funkcji do wypisywanie tesktu na ekran
- LEA DX,BUFOR ;do DX adres tablicy ze znakami
- INT 21H ;wywolujemy przerwanie wykonujac wypisanie na ekran
- MOV AX,4C00H ;funkcja przerwania 21h zakonczajaca program ze statusem = 0
- INT 21H
- MAIN ENDP
- END START
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement