Pojednostavljivanje stvari

Nacin na koji smo uneli adresu stringa koji hocemo da prikazemo na ekranu je bio malo nezgrapan, bile su nam potrebne tri linije koda a i nije bas najlaksa stvar za pamcenje.
mov dx,OFFSET MojaPoruka
mov ax,SEG MojaPoruka 
mov ds,ax 
Sve ovo mozemo da zamenimo samo sa jednom linijom. Ovo cini kod manje opterecenim, jasnijim i laksim za pamcenje.
mov dx,OFFSET MojaPoruka
Da bi ovo radilo na pocetku koda se dodaju ove linije:
mov ax,@data 
mov ds,ax
Bitno: za A86 prva linija izgleda ovako:
mov ax,data
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.

Unos sa tastature

Koristicemo prekid 16h, funkciju 00h da bi smo citali sa tastature. Ova funkcija uzima karakter iz bafera tastature. Ako nema karaktera (ako nije pritisnut nijedan karakter na tastauri), ceka dok neko ne pritisne taster. Vraca SCAN kod u AH i ASCII prevod u AL.
xor ah,ah          ; funkcija 00h - uzmi karakter sa tastature
int 16h            ; prekid 16h
Sve o cemu sada moramo da brinemo je ASCII vrednost koja je u AL.

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:
...                ; 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
Ako zelite da sacuvate vrednost AX onda uradite push AX pre i pop AX posle izvrsavanja naredbi.

Kontrola toka

U asembleru postoji set komadi za kontrolu toka kao sto ih ima i u svakom drugom programskom jeziku. Prvo najosnovnija naredba:
jmp Labela 
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 LabelaSkoka
.
.
. 
LabelaSkoka:
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.

Prvo uporedjujemo operanda sa podatkom a onda koristimo odgovarajucu komandu:

cmp ax,3           ; da li je AX = 3?
je Jeste           ; ako jeste skok na labelu Jeste
Ovo je spisak instrukcija uslovnog skoka:

Instrukcije uslovnog skoka

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 odrediste
Primer:
cmp al,'Y'         ; uporedjuje vrednost koja se nalazi u al sa Y
je YES             ; ako je jednako onda skace na labelu YES
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 ax,10          ; da li je AX=10?
je OK              ; ako jeste, skok na OK
u nesto ovakvo:
cmp ax,10          ; is AX 10?
jne NijeOk         ; ako nije skok na NijeOk
jmp OK             ; ako jeste na skok na OK
...
NijeOk:
...
Takodje ako hocete da resite taj problem, mozete da preuredite kod ili da koristite procedure, ako se to desava prilicno cesto.

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 

Sadrzaj