Sve ovo mozemo da zamenimo samo sa jednom linijom. Ovo cini kod manje opterecenim, jasnijim i laksim za pamcenje.mov dx,OFFSET MojaPoruka mov ax,SEG MojaPoruka mov ds,ax
Da bi ovo radilo na pocetku koda se dodaju ove linije:mov dx,OFFSET MojaPoruka
Bitno: za A86 prva linija izgleda ovako:mov ax,@data mov ds,ax
Ovo je tako zato sto svi podaci u segmentu imaju istu vrednost SEG-a. Stavljanjem segmenta u DS nas spasava ponovnog i ponovnog smestanja kada hocemo da koristimo neku drugu promenljivu iz istog segmenta.mov ax,data
Sve o cemu sada moramo da brinemo je ASCII vrednost koja je u AL.xor ah,ah ; funkcija 00h - uzmi karakter sa tastature int 16h ; prekid 16h
Bitno: XOR je naredba ekskluzivno ILI. Cesto se koristi da obrise registar
ili promenljivu.
Prikaz karaktera
Problem je sto mi imamo karakter koji je pritisnut na tastaturi u ah.
Kako cemo ga prikazati na ekranu? Ne mozemo da koristimo funkciju 9h
jer za nju moramo da imamo vec definisan string sa "$" na kraju.
Umesto toga radimo ovo:
Ako zelite da sacuvate vrednost AX onda uradite push AX pre i pop AX posle izvrsavanja naredbi.... ; posle poziva funkcije 00h prekida 16h mov dl,al ; smesti al (ascii kod) u dl mov ah,02h ; funkcija 02h prekida 21h int 21h ; poziv prekida 21h
Sve sto ova komanda uradi je da preskoci sve komande od nje do labele na koju skace i tu nastavlja sa programom. Kao na primer:jmp Labela
Sta radimo kada hocemo nesto da uporedimo? Imamo ulazni podatak od korisnika i hocemo nesto da uradimo sa tim. Hajde da podatak stampamo na ekran ako su neke vrednosti jednake. Kako se to radi? Veoma prosto. Koristimo instrukcije za uslovni skok.jmp LabelaSkoka . . . LabelaSkoka:
Prvo uporedjujemo operanda sa podatkom a onda koristimo odgovarajucu komandu:
Ovo je spisak instrukcija uslovnog skoka:cmp ax,3 ; da li je AX = 3? je Jeste ; ako jeste skok na labelu Jeste
JA | Skok ako je prvi brpj veci od drugog |
JAE | Isto kao predhodno, ali skocice i ako su isti |
JB | Skok ako je prvi broj manji od drugog |
JBE | Isto kao predhodno, ali skocice i ako su isti |
JNA | Skok ako prvi broj NIJE veci od drugog (JBE) |
JNAE | Skok ako prvi broj NIJE veci ili jednak od drugog (JB) |
JNB | Skok ako prvi broj NIJE manji od drugog (JAE) |
JNBE | Skok ako prvi broj NIJE manji ili jednak od drugog (JA) |
JZ | Skok ako su brojevi jednaki |
JE | Isto kao prethodno (JZ) |
JNZ | Skok ako brojevi nisu jednadi |
JNE | Isto kao prethodno (JNE) |
JC | Skok ako je postavljen fleg za prenos (carry flag) |
Bitno: skok moze da bude maksimalno 127 bajtova u oba smera.
CMP: poredi vrednosti (compare)
Sintaksa:
CMP registar ili promenljiva, neka vrednost jxx odredistePrimer:
Svaka instrukcija zauzima odredjeni kodni prostor. AKo pokusavate da skocite preko 127 bajtova, kompajler ce vas obavestiti o tome kao o gresci. Mozete resiti taj problem tako sto ce te promeniti sekvencu naredbi od ovakvog:cmp al,'Y' ; uporedjuje vrednost koja se nalazi u al sa Y je YES ; ako je jednako onda skace na labelu YES
u nesto ovakvo:cmp ax,10 ; da li je AX=10? je OK ; ako jeste, skok na OK
Takodje ako hocete da resite taj problem, mozete da preuredite kod ili da koristite procedure, ako se to desava prilicno cesto.cmp ax,10 ; is AX 10? jne NijeOk ; ako nije skok na NijeOk jmp OK ; ako jeste na skok na OK ... NijeOk: ...
Primer
Sada cemo pogledati program koji u sebi sadrzi input/output i kontrolu toka:
Listing 2: 2.asm ; program koji demonstrira tok programa i input/output .model small .stack .data CR equ 13 ; enter LF equ 10 ; sledeci red Poruka DB CR,LF,"Jednostavan Input/Output program.$" Prolaz DB CR,LF,CR,LF,"Ovo je tvoj prvi prolaz kroz program.$" Pitanje DB CR,LF,"Hocete li da prodjete ponovo? (y/n) $" Ponovo DB CR,LF,"Sada ste prosli ponovo!$" Zdravo DB CR,LF,CR,LF," ** Ajd' zdravo. **",CR,LF,"$" .code mov ax,@data mov ds,ax mov dx,OFFSET Poruka ; prikazuje poruku na ekranu mov ah,9 ; koristeci funkciju 09h int 21h ; prekida 21h mov dx,OFFSET Prolaz ; prikazuje poruku na ekranu mov ah,9 ; koristeci funkciju 09h int 21h ; prekida 21h jmp PrviPut PonovljeniProlaz: mov dx,OFFSET Ponovo ; prikazuje poruku na ekranu mov ah,9 ; koristeci funkciju 09h int 21h ; prekida 21h PrviPut: mov dx,OFFSET Pitanje ; prikazuje poruku na ekranu mov ah,9 ; koristeci funkciju 09h int 21h ; prekida 21h xor ah,ah ; function 00h of int 16h ; prekid 16h uzima karakter sa tastature u al mov bl,al ; sacuva ga u bl mov dl,al ; smesti ga u dl mov ah,02h ; funkcija 02h - prikazi karakter na ekranu int 21h ; poziv DOS servisa cmp bl,'Y' ; da li je al=Y? je PonovljeniProlaz ; ako jeste onda skacemo na PonovljenProlaz cmp bl,'y' ; da li je al=y? je PonovljeniProlaz ; ako jeste onda skacemo na PonovljenProlaz mov dx,OFFSET Zdravo ; prikazuje poruku za kraj mov ah,9 ; koristeci funkciju 09h int 21h ; prekida 21h mov ah,4Ch ; gasi program int 21h end