Advertisement
Guest User

Untitled

a guest
Apr 3rd, 2018
95
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ;============================================
  2. ;Osnovne operacije su start,peek,poke,stop
  3. ;Izbor pozicije je da se setas po ekranu
  4. ;60h (to nam ne radi)
  5. ;============================================
  6.  
  7. ;TSR problem nosi 5 poena
  8. ;Reentrancy nosi 3 poena
  9.  
  10.  
  11.  
  12. ESC     equ  1bh ; escape
  13. F1      equ  3bh ; levo
  14. F2      equ  3ch ; desno
  15. F3      equ  3dh ; gore
  16. F4      equ  3eh ; dole
  17.  
  18. org 100h
  19. segment .code
  20.  
  21. main:   cld
  22.         mov     cx, 0080h                   ; Maksimalni broj izvrsavanja instrukcije sa prefiksom REPx
  23.         mov     di, 81h                     ; Pocetak komandne linije u PSP.
  24.         mov     al, ' '                     ; String uvek pocinje praznim mestom (razmak izmedju komande i parametra)
  25. repe    scasb                               ; Trazimo prvo mesto koje nije prazno (tada DI pokazuje na lokaciju iza njega)
  26.  
  27. ; Instukcija SCASB
  28. ; ------------------
  29. ; Skenira string (po jedan bajt) na koji pokazuje ES:DI, trazeci znak (bajt) koji je zadat sadrzajem AL.
  30. ; DI se inkrementira nakon svakog poziva ove instrukcije, kada je zadato CLD (podrazumevani smer).
  31. ; Koristi se u kombinaciju sa prefiksima ponavljanja instrukcije: REPE i REPNE.
  32. ;   REPNE - nalazi prvi bajt koji je jednak sa bajtom u AL
  33. ;   REPE  - nalazi prvi bajt koji NIJE jednak sa bajtom u AL
  34.  
  35.         dec     di                          ; Vracamo DI da pokazuje gde treba
  36.         mov     si, di                      ; Pocetak stringa u SI
  37.         mov     al, 0dh                     ; Trazimo kraj stringa (pritisnut Enter)
  38. repne   scasb                               ; (tada DI pokazuje na lokaciju iza njega)
  39.         mov byte [di-1], 0                  ; string zavrsavamo nulom  
  40.  
  41.  
  42.     ; Uporedjujem unosne stringove
  43.  
  44.  
  45.     ;Da li je unos start
  46.  
  47.     mov [string1], si
  48.     mov si, start
  49.     mov [string2], si
  50.     call uporedi_stringove
  51.  
  52.     cmp al, 0
  53.     je start_metod
  54.  
  55.     ;Da li je unos stop
  56.  
  57.     mov si, stop
  58.     mov [string2], si
  59.     call uporedi_stringove
  60.  
  61.     cmp al, 0
  62.     je stop_metod
  63.  
  64.     ;Da li je unos poke ili peek
  65.     call peek_poke
  66.     cmp ah,1
  67.     je peek_metod
  68.     cmp ah,0
  69.     je poke_metod
  70.  
  71.     ret ;da ne bi isvrsavao funkcije dole
  72.  
  73.  
  74.  
  75.  
  76. start_metod:
  77.     mov si, msg_start
  78.     call _print
  79.     ret
  80.  
  81. stop_metod:
  82.     mov si, msg_stop
  83.     call _print
  84.     ret
  85.  
  86. peek_metod:
  87.     mov si, msg_peek
  88.     call _print
  89.     ret
  90.  
  91. poke_metod:
  92.     mov si, msg_poke
  93.     call _print
  94.     ret
  95.  
  96. ; Metod koji proverava da li je unos peek/poke
  97. ; Uzecu string do prvog razmaka i uporediti uz pomoc
  98. ; metode "uporedi_stringove"
  99. peek_poke:
  100.     push si
  101.     add si, 2; inkrementujem si na dva mesta
  102.     cmp byte[si],'e' ;ako je drugo slovo e onda je peek u suprotnom mora biti poke
  103.     je .peek_je
  104.     jmp .poke_je
  105.     .peek_je:
  106.         mov ah,1
  107.         ret
  108.     .poke_je:
  109.         mov ah,0
  110.         ret
  111.  
  112.  
  113.  
  114. _print:
  115.       pusha
  116.       cld
  117.       .prn:
  118.             lodsb                                     ; Ucitavati znakove sve do nailaska prve nule
  119.             or   al,al                          
  120.             jz  .end                                  ; Kraj stringa
  121.             mov  ah,0eh                               ; BIOS 10h: ah = 0eh (Teletype Mode), al = znak koji se ispisuje
  122.             int  10h                                  ; BIOS prekid za rad sa ekranom
  123.             jmp .prn    
  124.       .end:
  125.             popa
  126.             ret  
  127.  
  128.  
  129. ; Metod koji poredi dva stringa da li su jednaka
  130. ;(Koristicu je samo kada je start/stop)
  131.  
  132. uporedi_stringove:
  133.     push si     ;pushujem na stek registre
  134.     push di     ;pushujem na stek registre
  135.  
  136.     mov si, [string1]
  137.     mov di, [string2]
  138.  
  139.     mov al,0    ;u al vracam vrednost
  140.     .petlja:
  141.         mov ah, 0
  142.         cmp byte[di], 0; ako je nula onda je kraj
  143.  
  144.         jne .first_nf
  145.             add ah, 1 ;prvi string je gotov
  146.         .first_nf:
  147.         cmp byte[si], 0
  148.         jne .second_nf
  149.             add ah,2 ;drugi string je gotov
  150.         .second_nf:
  151.         cmp ah, 0
  152.         jne .string_end;
  153.  
  154.         mov ah, [di]
  155.         cmp ah, [si]
  156.  
  157.         jne .not_eq
  158.  
  159.         inc si
  160.         inc di
  161.         jmp .petlja
  162.  
  163.     .string_end:
  164.         cmp ah, 3; to znaci da su oba stringa gotova
  165.         je .eq
  166.         jmp .not_eq
  167.  
  168.     .eq:
  169.         mov ah, 0
  170.         mov al, 0
  171.         jmp .kraj
  172.  
  173.     .not_eq:
  174.         mov ah, 0
  175.         mov al, 1
  176.         jmp .kraj
  177.  
  178.     .kraj:
  179.         pop di
  180.         pop si
  181.  
  182.     ret
  183.  
  184.  
  185. segment .data
  186.  
  187.  
  188. start:  db '-start', 0
  189. peek:   db '-peek', 0
  190. poke:   db '-poke', 0
  191. stop:   db '-stop', 0
  192.  
  193. msg_start:  db 'Start...', 0x0A,0x0D,0
  194. msg_stop:   db 'Stop...', 0x0A,0x0D,0
  195. msg_peek:   db 'Peek...', 0x0A,0x0D,0
  196. msg_poke:   db 'Poke...', 0x0A,0x0D,0
  197.  
  198. string2:  dw 0
  199. string1:  dw 0
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement