Advertisement
Guest User

Untitled

a guest
Jan 18th, 2018
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.  
  2. ORG 100H                    ; informacja dla kompilatora, ze program bedzie typu *.com (stos 100H)
  3.    
  4.         MOV AH, 9           ; informacja w AH okresla jak zadziala przerwanie INT 21h
  5.         MOV DX, lbl_1       ; przeniesienie do DX adresu lancucha lbl_1
  6.         INT 21H             ; wywolanie funkcji AH, 9 przerwania INT 21H - wyswietlanie znakow ze zmiennej, do czasu napotkania dolara
  7.    
  8.     START:                  ; etykieta oznaczajaca poczatek programu - w kompilatorze NASM jest nieobowiązkowa, :),
  9.                             ; ale tutaj wykorzystujemy ją jako etykietę do skoku w przypadku podania zlej wartosci z klawiatury
  10.         CALL    ENTER       ; wywolanie procedury robiacej linie odstepu
  11.  
  12.         MOV AH, 9  
  13.         MOV DX, lbl_2      
  14.         INT 21H             ; informacja o mozliwosci wpisania tekstu
  15.  
  16.         CALL    ENTER
  17.  
  18.         MOV AH, 9  
  19.         MOV DX, lbl_3          
  20.         INT 21H             ; informacja o mozliwosci zakonczenia programu
  21.  
  22.         CALL    ENTER
  23.  
  24.         MOV AH, 1          
  25.         INT 21H             ; wywolanie funkcji AH, 1 przerwania INT 21H - pobranie znaku do rejestru AL
  26.        
  27.         CMP AL, 49          ; sprawdzanie pobranego znaku
  28.         JE  GETTXT          ; jesli to 1 (49 w ASCII), program przechodzi do pobierania tekstow
  29.        
  30.         CMP AL, 13          ; sprawdzanie pobranego znaku
  31.         JE  KONIEC          ; jesli to ENTER (13 w ASCII), program przechodzi do zakonczenia dzialania
  32.        
  33.         CALL    ENTER
  34.        
  35.         MOV AH, 9
  36.         MOV DX, lbl_zlyznak ; jesli to inny znak to wypisujemy ostrzezenie, ze nie podano zadnego z powyzszych
  37.         INT 21H
  38.        
  39.         CALL    ENTER
  40.        
  41.         JMP START           ; jesli znak to zaden z powyzszych, program wraca do etykiety START
  42. ;========================================================================================================================================================= 
  43.     GETTXT:                 ; etykieta oznaczajaca procedure wprowadzanie tekstu
  44.         CALL    ENTER
  45.            
  46.         MOV AH, 9
  47.         MOV DX, lbl_txt
  48.         INT 21H             ; wyswietlenie prosby o podanie pierwszego tekstu
  49.  
  50.         MOV AH, 10          ; informacja w AH okresla jak zadziała przerwanie INT 21H
  51.         MOV DX, text        ; skopiowanie do DX adresu zmiennej, gdzie trafi pobrany tekst
  52.         INT 21H             ; wywolanie funkcji AH, 10 przerwania INT 21H - pobranie tekstu do zmiennej
  53.  
  54.         MOV AL, [text+1]
  55.         CMP AL, 0           ; sprawdzenie, czy nie wprowadzono pustego lancucha (czy ilosc pobranych znakow nie wskazuje 0)
  56.         JE  BLAD            ; jeśli tak, przechodzimy do etykiety(procedury)BLAD
  57.        
  58.         MOV AL, [text+1]
  59.         CMP AL, 1           ; sprawdzenie, czy nie wprowadzono tylko jednego znaku (czy ilosc pobranych znakow nie wskazuje 1)
  60.         JE  JEDENZNAK       ; jeśli tak, przechodzimy do etykiety(procedury)JEDENKZNAK
  61.  
  62.         CALL    ENTER
  63.  
  64.         MOV AH, 9
  65.         MOV DX, wynik  
  66.         INT 21H             ; informacja o podaniu wyniku
  67.  
  68.         CALL    WYPISZ      ; wywolanie procedury wyswietlajacej znaki lancucha od tylu
  69.  
  70.         JMP START           ; program wraca do etykiety START  
  71. ;=========================================================================================================================================================         
  72.     JEDENZNAK:
  73.         CALL ENTER          ; etykieta oznaczajaca obsluge bledu
  74.        
  75.         MOV AH, 9
  76.         MOV DX, lbl_jznak
  77.         INT 21H
  78.        
  79.         CALL ENTER          ; wyswietlenie powiadomienia, ze uzytkownik podal pusty tekst
  80.         JMP START
  81.     BLAD:                   ; etykieta oznaczajaca obsluge bledu
  82.         CALL ENTER
  83.        
  84.         MOV AH, 9
  85.         MOV DX, lbl_err
  86.         INT 21H
  87.        
  88.         CALL ENTER          ; wyswietlenie powiadomienia, ze uzytkownik podal pusty tekst
  89.         JMP START           ; program wraca do etykiety START
  90.     KONIEC:                 ; etykieta oznaczajaca przejscie do zakonczenia programu
  91.  
  92.         MOV AX, 4C00H       ; informacja w AH okresla jak zadziała przerwanie INT 21h
  93.         INT 21h             ; wywolanie funkcji AH, 4Ch przerwania INT 21h - zakonczenie procesu
  94. ;=========================================================================================================================================================
  95. WYPISZ:                     ; procedura wypisujaca znaki od tylu
  96.     XOR AX, AX
  97.     XOR DX, DX
  98.     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
  99.     XOR CL, CL              ; pomocniczy licznik do przechowywania ilosci znakow polozonych na stosie
  100.  
  101.     NASTOS:                 ; petla do wrzucania wartosci na stos
  102.         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
  103.         CMP DL, 13          ; sprawdzanie, czy znak nie jest 13, czyli enterem, ktorym uzytkownik zakonczyl wprowadzanie znakow
  104.         JE  ZESTOSU
  105.         CMP DL, 32          ; sprawdzanie, czy znak nie jest 13, czyli enterem, ktorym uzytkownik zakonczyl wprowadzanie znakow
  106.         JE  SKIP    ; jesli tak, nastepuje skok do petli wypisujacej
  107.         PUSH    DX          ; umieszczenie wartosci z DX na stosie (nie mozna wrzucic tylko DL), trzeba 16 bit
  108.         INC SI              ; zwiekszenie wskaznika
  109.         INC CL              ; zwiekszenie licznika
  110.         JMP NASTOS          ; skok od poczatku petli
  111.            
  112.             SKIP:
  113.             INC SI          ; zwiekszenie wskaznika
  114.             XOR DX, DX      ; wyzerowanie rejestru DX
  115.             jmp NASTOS      ; skok od poczatku petli
  116.        
  117.     ZESTOSU:
  118.         POP DX              ; zdjecie ze stosu wartosci - ostatnio wlozona wartosc jest na gorze stosu, wiec wystarczy je zdejmowac, aby uzyskac tekst od tylu
  119.         MOV AH, 2      
  120.         INT 21H             ; wywolanie funkcji AH, 2 przerwania INT 21H - wypisanie znaku z rejestru DL
  121.         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
  122.  
  123.         XOR AX, AX
  124.         XOR DX, DX
  125.         XOR CL, CL
  126.         XOR SI, SI          ; zerowanie rejestrow przy wyjsciu z procedury
  127.        
  128. RET                         ; przy wywolaniu procedury WYPISZ, na stos trafia adres miejsca, do ktorego powraci procedura po jej zakonczeniu
  129.                             ; dyrektywa RET zdejmuje ze stosu wartosc i na jej podstawie wraca do miejsca wywolania
  130. ;=========================================================================================================================================================
  131. ENTER:                      ; procedura robiaca linie odstepu
  132.     MOV AH, 9
  133.     MOV DX, ent1            ; przeniesienie do DX adresu lancucha ent1
  134.     INT 21H                 ; wywolanie funkcji AH, 9 przerwania INT 21H
  135.    
  136.     XOR AH, AH
  137.     XOR DX, DX
  138. RET                         ; przy wywolaniu procedury ENTER, na stos trafia adres miejsca, do ktorego powraci procedura po jej zakonczeniu
  139.                             ; dyrektywa RET zdejmuje ze stosu wartosc i na jej podstawie wraca do miejsca wywolania
  140. ;=========================================================================================================================================================
  141.  
  142. text    db  250             ; zmienna text - bajt zmiennej o indeksie 0 (pierwszy) okresla maksymalna ilosc znakow jaka mozna wpisac
  143.     db  0                   ; bajt o indeksie 1 (drugi) ma wartosc 0, ale po wprowadzeniu tekstu bedzie zawieral wartosc odpowiadajaca ilosci wprowadzonych znakow
  144.     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
  145.  
  146. lbl_1   db  "Projekt nr  1: wyswietlanie lancucha znakow od tylu $"
  147. lbl_2   db  "Aby wprowadzic tekst nacisnij 1 $"
  148. lbl_3   db  "Aby zakonczyc nacisnij ENTER $"
  149. lbl_err db  "Nie wprowadzono tekstu! $"
  150. lbl_txt db  "Prosze wpisac tekst, maks. 250 znakow: $"
  151. lbl_jznak db "Wprowadzono tylko jeden znak!$"
  152. lbl_zlyznak db "Nie wybrano zadnego z powyzszych!$"
  153. wynik   db  "Tekst od napisany od tylu to: $"
  154. koniec  db  "Koniec programu.$"
  155. ent1    db  10, 13, 36
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement