Advertisement
Guest User

Untitled

a guest
Jan 18th, 2018
80
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.     JEDENZNAK:
  72.         CALL ENTER          ; etykieta oznaczajaca obsluge bledu
  73.        
  74.         MOV AH, 9
  75.         MOV DX, lbl_jznak
  76.         INT 21H
  77.        
  78.         CALL ENTER          ; wyswietlenie powiadomienia, ze uzytkownik podal pusty tekst
  79.         JMP START
  80.     BLAD:                   ; etykieta oznaczajaca obsluge bledu
  81.         CALL ENTER
  82.        
  83.         MOV AH, 9
  84.         MOV DX, lbl_err
  85.         INT 21H
  86.        
  87.         CALL ENTER          ; wyswietlenie powiadomienia, ze uzytkownik podal pusty tekst
  88.         JMP START           ; program wraca do etykiety START
  89.     KONIEC:                 ; etykieta oznaczajaca przejscie do zakonczenia programu
  90.  
  91.         MOV AX, 4C00H       ; informacja w AH okresla jak zadziała przerwanie INT 21h
  92.         INT 21h             ; wywolanie funkcji AH, 4Ch przerwania INT 21h - zakonczenie procesu
  93. ;=========================================================================================================================================================
  94. WYPISZ:                     ; procedura wypisujaca znaki od tylu
  95.     XOR AX, AX
  96.     XOR DX, DX
  97.     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
  98.     XOR CL, CL              ; pomocniczy licznik do przechowywania ilosci znakow polozonych na stosie
  99.  
  100.     NASTOS:                 ; petla do wrzucania wartosci na stos
  101.         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
  102.         CMP DL, 13          ; sprawdzanie, czy znak nie jest 13, czyli enterem, ktorym uzytkownik zakonczyl wprowadzanie znakow
  103.         JE  ZESTOSU         ; jesli tak, nastepuje skok do petli wypisujacej
  104.         PUSH    DX          ; umieszczenie wartosci z DX na stosie (nie mozna wrzucic tylko DL), trzeba 16 bit
  105.         INC SI              ; zwiekszenie wskaznika
  106.         INC CL              ; zwiekszenie licznika
  107.         JMP NASTOS          ; skok od poczatku petli
  108.        
  109.     ZESTOSU:
  110.         POP DX              ; zdjecie ze stosu wartosci - ostatnio wlozona wartosc jest na gorze stosu, wiec wystarczy je zdejmowac, aby uzyskac tekst od tylu
  111.         MOV AH, 2      
  112.         INT 21H             ; wywolanie funkcji AH, 2 przerwania INT 21H - wypisanie znaku z rejestru DL
  113.         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
  114.  
  115.         XOR AX, AX
  116.         XOR DX, DX
  117.         XOR CL, CL
  118.         XOR SI, SI          ; zerowanie rejestrow przy wyjsciu z procedury
  119.        
  120. RET                         ; przy wywolaniu procedury WYPISZ, na stos trafia adres miejsca, do ktorego powraci procedura po jej zakonczeniu
  121.                             ; dyrektywa RET zdejmuje ze stosu wartosc i na jej podstawie wraca do miejsca wywolania
  122. ;=========================================================================================================================================================
  123. ENTER:                      ; procedura robiaca linie odstepu
  124.     MOV AH, 9
  125.     MOV DX, ent1            ; przeniesienie do DX adresu lancucha ent1
  126.     INT 21H                 ; wywolanie funkcji AH, 9 przerwania INT 21H
  127.    
  128.     XOR AH, AH
  129.     XOR DX, DX
  130. RET                         ; przy wywolaniu procedury WYPISZ, na stos trafia adres miejsca, do ktorego powraci procedura po jej zakonczeniu
  131.                             ; dyrektywa RET zdejmuje ze stosu wartosc i na jej podstawie wraca do miejsca wywolania
  132. ;=========================================================================================================================================================
  133.  
  134. text    db  250             ; zmienna text - bajt zmiennej o indeksie 0 (pierwszy) okresla maksymalna ilosc znakow jaka mozna wpisac
  135.     db  0                   ; bajt o indeksie 1 (drugi) ma wartosc 0, ale po wprowadzeniu tekstu bedzie zawieral wartosc odpowiadajaca ilosci wprowadzonych znakow
  136.     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
  137.  
  138. lbl_1   db  "Projekt nr  1: wyswietlanie lancucha znakow od tylu $"
  139. lbl_2   db  "Aby wprowadzic tekst nacisnij 1 $"
  140. lbl_3   db  "Aby zakonczyc nacisnij ENTER $"
  141. lbl_err db  "Nie wprowadzono tekstu! $"
  142. lbl_txt db  "Prosze wpisac tekst, maks. 250 znakow: $"
  143. lbl_jznak db "Wprowadzono tylko jeden znak!$"
  144. lbl_zlyznak db "Nie wybrano zadnego z powyzszych!$"
  145. wynik   db  "Tekst od napisany od tylu to: $"
  146. ent1    db  10, 13, 36
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement