Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ;============================================
- ;Osnovne operacije su start,peek,poke,stop
- ;Izbor pozicije je da se setas po ekranu
- ;60h (to nam ne radi)
- ;============================================
- ;TSR problem nosi 5 poena
- ;Reentrancy nosi 3 poena
- ESC equ 1bh ; escape
- F1 equ 3bh ; levo
- F2 equ 3ch ; desno
- F3 equ 3dh ; gore
- F4 equ 3eh ; dole
- org 100h
- segment .code
- main: cld
- mov cx, 0080h ; Maksimalni broj izvrsavanja instrukcije sa prefiksom REPx
- mov di, 81h ; Pocetak komandne linije u PSP.
- mov al, ' ' ; String uvek pocinje praznim mestom (razmak izmedju komande i parametra)
- repe scasb ; Trazimo prvo mesto koje nije prazno (tada DI pokazuje na lokaciju iza njega)
- ; Instukcija SCASB
- ; ------------------
- ; Skenira string (po jedan bajt) na koji pokazuje ES:DI, trazeci znak (bajt) koji je zadat sadrzajem AL.
- ; DI se inkrementira nakon svakog poziva ove instrukcije, kada je zadato CLD (podrazumevani smer).
- ; Koristi se u kombinaciju sa prefiksima ponavljanja instrukcije: REPE i REPNE.
- ; REPNE - nalazi prvi bajt koji je jednak sa bajtom u AL
- ; REPE - nalazi prvi bajt koji NIJE jednak sa bajtom u AL
- dec di ; Vracamo DI da pokazuje gde treba
- mov si, di ; Pocetak stringa u SI
- mov al, 0dh ; Trazimo kraj stringa (pritisnut Enter)
- repne scasb ; (tada DI pokazuje na lokaciju iza njega)
- mov byte [di-1], 0 ; string zavrsavamo nulom
- ; Uporedjujem unosne stringove
- ;Da li je unos start
- mov [string1], si
- mov si, start
- mov [string2], si
- call uporedi_stringove
- cmp al, 0
- je start_metod
- ;Da li je unos stop
- mov si, stop
- mov [string2], si
- call uporedi_stringove
- cmp al, 0
- je stop_metod
- ;Da li je unos poke ili peek
- call peek_poke
- cmp ah,1
- je peek_metod
- cmp ah,0
- je poke_metod
- ret ;da ne bi isvrsavao funkcije dole
- start_metod:
- mov si, msg_start
- call _print
- ret
- stop_metod:
- mov si, msg_stop
- call _print
- ret
- peek_metod:
- mov si, msg_peek
- call _print
- ret
- poke_metod:
- mov si, msg_poke
- call _print
- ret
- ; Metod koji proverava da li je unos peek/poke
- ; Uzecu string do prvog razmaka i uporediti uz pomoc
- ; metode "uporedi_stringove"
- peek_poke:
- push si
- add si, 2; inkrementujem si na dva mesta
- cmp byte[si],'e' ;ako je drugo slovo e onda je peek u suprotnom mora biti poke
- je .peek_je
- jmp .poke_je
- .peek_je:
- mov ah,1
- ret
- .poke_je:
- mov ah,0
- ret
- _print:
- pusha
- cld
- .prn:
- lodsb ; Ucitavati znakove sve do nailaska prve nule
- or al,al
- jz .end ; Kraj stringa
- mov ah,0eh ; BIOS 10h: ah = 0eh (Teletype Mode), al = znak koji se ispisuje
- int 10h ; BIOS prekid za rad sa ekranom
- jmp .prn
- .end:
- popa
- ret
- ; Metod koji poredi dva stringa da li su jednaka
- ;(Koristicu je samo kada je start/stop)
- uporedi_stringove:
- push si ;pushujem na stek registre
- push di ;pushujem na stek registre
- mov si, [string1]
- mov di, [string2]
- mov al,0 ;u al vracam vrednost
- .petlja:
- mov ah, 0
- cmp byte[di], 0; ako je nula onda je kraj
- jne .first_nf
- add ah, 1 ;prvi string je gotov
- .first_nf:
- cmp byte[si], 0
- jne .second_nf
- add ah,2 ;drugi string je gotov
- .second_nf:
- cmp ah, 0
- jne .string_end;
- mov ah, [di]
- cmp ah, [si]
- jne .not_eq
- inc si
- inc di
- jmp .petlja
- .string_end:
- cmp ah, 3; to znaci da su oba stringa gotova
- je .eq
- jmp .not_eq
- .eq:
- mov ah, 0
- mov al, 0
- jmp .kraj
- .not_eq:
- mov ah, 0
- mov al, 1
- jmp .kraj
- .kraj:
- pop di
- pop si
- ret
- segment .data
- start: db '-start', 0
- peek: db '-peek', 0
- poke: db '-poke', 0
- stop: db '-stop', 0
- msg_start: db 'Start...', 0x0A,0x0D,0
- msg_stop: db 'Stop...', 0x0A,0x0D,0
- msg_peek: db 'Peek...', 0x0A,0x0D,0
- msg_poke: db 'Poke...', 0x0A,0x0D,0
- string2: dw 0
- string1: dw 0
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement