Advertisement
Guest User

Untitled

a guest
Jan 16th, 2017
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.  
  2. ENTER_KEY EQU 0DH
  3.  
  4. ;uproszczone dyrektywy segmentowe, oraz model tiny - program typu COM
  5. .MODEL TINY
  6. .CODE
  7.     .386        ;to znaczy ze bedziemy uzywac instrukcji zgodnych z procesorem x386
  8.     ORG 100H    ;pomijamy nie duzy przedrostek programu
  9.  
  10. START:
  11.     JMP MAIN
  12.    
  13. ;tu sa zdefiniowane tablice znakow do wyswietlenia za pomoca funkcji 09h przerwania 21h
  14. ;ktora to wyswietla az do znaku $
  15. ;0ah - znak powrotu karetki
  16. ;0dh - znak nowej lini
  17. PASSWORD_OK DB 0AH, 0Dh, 'Password Ok$'
  18. PASSWORD_FAIL DB 0AH, 0Dh, 'Password Fail$'
  19. NEW_LINE DB 0AH, 0DH, '$'
  20.  
  21. ;bufor na znaki wprowadzane
  22. ;16+1 poniewaz moze byc 16 znako i znak $
  23. ;DB X DUP(Y)  oznacza: zdefinuj X bajt?w o wartosci Y
  24. BUFOR DB 16+1 DUP(0)
  25.    
  26.    
  27. ;tutaj teraz definiujemy sobie nasze dane w pamieci programu
  28. ;ktore bedziemy wykozystywac podczas resztyo programu.
  29.  
  30. ;glowna procedura programu
  31. MAIN PROC NEAR
  32.     XOR SI,SI           ;zerujemy rejestr SI operacja xor, najszybsze zerowanie
  33.                         ;rej. SI bedzie nam slozyl jako licznik wprowadzonych znakow
  34. MAIN_START:             ;etykieta
  35.     MOV AX,1000H        ;funkcja przerwania 16h czekajaca na nacisniecie klawisza
  36.     INT 16H             ;wywolujemy przerwanie 16h, funkcja zwraca do rej. AL znak klawisza
  37.                         ;a do rej. AH kod klawisza
  38.     INC SI              ;zwieksz licznik wprowadzonych znakow
  39.  
  40.     ;sprawdzamy czy to enter
  41.     CMP AL,ENTER_KEY    ;porownanie rej. AL z wartoscia 0Dh
  42.     JE MAIN_START1      ;gdy jest rowne, gdy znak to klawisz enter to skacz do main_end
  43.    
  44.     CMP SI,16           ;porwnanie SI z 16
  45.     JA MAIN_START0      ;gdy Si > 16 to skacz do MAIN_END
  46.    
  47.     ;zapisujemy znak do bufora
  48.     PUSH AX             ;zapisz na sto wartosc rejestru AX, ktory ma w sobie rej AL ze znakiem odczytanym
  49.    
  50.    
  51.     MOV DL,'*'          ;do DL znak gwiazdki do wyswietlenia
  52.     MOV AH,02H          ;funkcja 02h przerwania dosa 21h ktora wyswietla podany znak z rej. DL
  53.     INT 21h
  54.     JMP MAIN_START      ;skok na poczatek programu
  55.  
  56. MAIN_START0:
  57.     ;gdy wpisano wiecej niz 16 i 17 nie byl enter
  58.     ;to wypsiz password_fail
  59.     MOV AH,09H              ;do AH kod funkcji do wypisywanie tesktu na ekran
  60.     LEA DX,PASSWORD_FAIL    ;do DX adres tablicy ze znakami
  61.     INT 21H                 ;wywolujemy przerwanie wykonujac wypisanie na ekran
  62.     JMP MAIN_START2         ;skacz
  63.  
  64. MAIN_START1:
  65.     ;gdy wcisnieto enter to password napewno jest ok
  66.     MOV AH,09H              ;do AH kod funkcji do wypisywanie tesktu na ekran
  67.     LEA DX,PASSWORD_OK      ;do DX adres tablicy ze znakami
  68.     INT 21H                 ;wywolujemy przerwanie wykonujac wypisanie na ekran
  69.     JMP MAIN_START2         ;skacz
  70.    
  71. MAIN_START2:
  72.     XOR DI,DI               ;zerujemy DI to bedzien asz nowy iterator do bufora
  73.  
  74. MAIN_START3:    
  75.     CMP SI,1                ;porownanie SI z 1
  76.     JB MAIN_START4          ;jezeli mniejszy od 1 to skacz
  77.  
  78.     ;jezeli wiekszy to znaczy ze sa jeszcze znaki na stosie do odebrania
  79.     POP AX      ;odbieramy znak ze sotsu, po tym rozkazie bedzie on w AL
  80.    
  81.     MOV BUFOR[DI],AL    ;DI jako iterator do tablicy BUFOR, operacja mOV kkopiuje znak z AL
  82.     INC DI              ;zwiekszamy iterator
  83.     DEC SI              ;zmniejsz ilosc
  84.     JMP MAIN_START3     ;do petli skok
  85.  
  86. MAIN_START4:
  87.     ;zapisujemy znak $ do bufora
  88.     ;BYTE PTR m?wi ze nalezy kopiwoac znak w zakresie 1 bajta do pamieci
  89.     ;wtedy ta instrukcja zapisze tylko bajt do pamieci i nie zmieni innych sasiadujacych
  90.     ;bajt?w w pamieci
  91.     MOV BYTE PTR BUFOR[DI],'$'  ;DI jako iterator do tablicy BUFOR, operacja mOV kkopiuje znak z AL
  92.  
  93.     ;wyswietlamy nowa linie
  94.     MOV AH,09H              ;do AH kod funkcji do wypisywanie tesktu na ekran
  95.     LEA DX,NEW_LINE         ;do DX adres tablicy ze znakami
  96.     INT 21H                 ;wywolujemy przerwanie wykonujac wypisanie na ekran
  97.  
  98.     ;wyswietlamy bufor
  99.     MOV AH,09H              ;do AH kod funkcji do wypisywanie tesktu na ekran
  100.     LEA DX,BUFOR            ;do DX adres tablicy ze znakami
  101.     INT 21H                 ;wywolujemy przerwanie wykonujac wypisanie na ekran
  102.  
  103.     MOV AX,4C00H        ;funkcja przerwania 21h zakonczajaca program ze statusem = 0
  104.     INT 21H            
  105. MAIN ENDP
  106.  
  107.  
  108. END START
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement