Title: 8086 asembler
18086 asembler
2Stek
- Raste ka nižim adresama.
- SP pokazuje na zauzetu lokaciju na vrhu steka.
- BP bazni registar za pristum stvarnim
parametrima i lokalnim promjenljivim
3Memorijski adresni prostor
- Velicina memorijskog adresnog prostora 1MB.
- Adresibilna jedinica bajt.
- Moguc pristup rijeci dva uzastopna bajta.
- Little-endian viši bajt na višoj adresi.
4Segentni registri
- Segmentni dio adrese se uvijek uzima iz nekog
segmentnog registra. - CS segment sa kodom.
- SS segment sa stekom.
- DS podrazumjevani segment sa podacima.
- ES pomocni segment sa podacima.
- Podrazumijevani segment za podatke se može u
odredenim situacijama zamijeniti.
5Nacini adresiranja
- Neposredno 10, 20h ...
- Registarsko direktno (svi registri) AX, DS, BH
... - Memorijsko direktno suma, niz6 ...
- Registarsko indirektno (samo BX, SI i DI) BX.
- Registarsko indirektno sa pomjerajem (samo BX,
BP, SI i DI) BX88h, nizSI. - Bazno indeksno (adresa je zbir jednog baznog i
jednog indeksnog registra) BXSI - Bazno indeksno sa pomjerajem (kao prethodno plus
pomjeraj) nizBXDI.
6Ogranicenja i posebnosti
- Najviše jedan operand svake instrukcije može biti
u memoriji. - Ukoliko se za adresiranje koristi i registar BP,
podrazumijevani segmentni registar je SS. - Za zamjenu podrazumjevanog segmenta ispred
operanda dodati segmentni registar i dvotacku.
Primjer mov AX,DSBP0
7Asemblerske naredbe
- labela mnemonik operandi komentar
- Labela predstavlja adresu na kojoj se nalazi
naredba. - mnemonik je simbolicki zapisana komanda.
- Mogu biti do dva operanda.
- Prvi je uvijek odredište, a nekad i izvorište.
- Drugi je izvorište.
8Transfer podataka
- MOV dst, src dst src
- LEA dst, src dst offset(src)
- LDS dst, src dsdst src
- LES dst, src esdst src
- XCHG op1, op2 mijenja vrijednosti u operandima
op1 i op2
9Sabiranje i oduzimanje
- ADD dst, src dstdstsrc
- ADC dst, src dstdstsrcCF
- SUB dst, src dstdst-src
- SBB dst, src dstdst-src-CF
- NEG dst dst-dst
- INC dst dstdst1
- DEC dst dstdst-1
- CMP src1, src2 setuje flegove na osnovu
src1-src2
10Množenje i dijeljenje
- MUL src neoznaceno množenje
- IMUL src oznaceno množenje
- src (8-bitni) množi sa AL i rezultat ostavlja u
AX - src (16-bitni) množi sa AX i rezultat ostavlja u
DXAX - DIV src neoznaceno dijeljenje
- IDIV src oznaceno dijeljenje
- Dijeli AX sa src (8-bitni) i rezultat ostavlja u
AL, a ostatak u AH. - Dijeli DXAX sa src (16-bitni) i rezultat
ostavlja u AX, a ostatak u DX
11Proširivanje operanda
- CBW proširuje AH sa znakom iz AL
- CWD prociruje DX sa znakom iz AX
12Logicke operacije
- NOT dst dst dst
- AND dst, src dst dst src
- OR dst, src dst dst src
- XOR dst, src dst dst src
- TEST op1, op2 setuje flegove na osnovu
op1 op2
13Pomjeranje i rotiranje
- SHL dst, cnt pomjeranje logicki lijevo
- SAL dst, cnt pomjeranje aritmeticki lijevo
- SHR dst, cnt pomjeranje logicki desno
- SAR dst, cnt pomjeranje aritmeticki desno
- ROR dst, cnt rotiranje desno
- ROL dst, cnt rotiranje lijevo
- RCR dst, cnt rotiranje kroz CF desno
- RCL dst, cnt rotiranje kroz CF lijevo
- cnt mora biti 1 ili CL
14Primjer
- Stanje prije AX0F00Fh, CF0, CL2
- SHL AX, CL 0C03Ch, CF1 (bit koji je ispao)
- SAL AX, CL 0C03Ch, CF1 (bit koji je ispao)
- SHR AX, CL 03C03h, CF1 (bit koji je ispao)
- SAL AX, CL 0FC03h, CF1 (bit koji je
ispao) - ROR AX, CL 0FC03h, CF1 (poslednji
- ROL AX, CL 0C03Fh, CF1 rotirani bit)
- RCR AX, CL 0BC03h, CF1 (poslednj
- RCL AX, CL 0C03Dh, CF1 izbaceni bit)
15Uslovni skokovi 1/2
- Relativni skok sa 8-bitnim oznacenim pomjerajem.
- Test pojedinacnih flegova
- JZ (JE),
- JNZ (JNE),
- JS,
- JNS,
- JP (JPE),
- JNP (JPO),
16Uslovni skokovi 2/2
- Poredenje neoznacenih brojeva
- JB (JNAE, JC)
- JNB (JAE, JNC)
- JBE (JNA)
- JNBE (JA)
- Poredenje oznacenih brojeva
- JL (JNGE)
- JNL (JGE)
- JLE (JNG)
- JNLE (JG)
17if-then-else
Izracunavanje uslova.
- Viši programski jezici
- if (CX0) blok1 else blok2
- Blok1 i blok2 nizovi instrukcija
- Asembler
- CMP CX,0 JE blok1 JMP
blok2blok1 JMP daljeblok2 dalje
Ako je tacan, skace na blok1. U suprotnom na
blok2.
18Optimizacija
- Moguca samo u slucaju malih blokova (bar jedan
manji od 127B). - Izbacen prvi bezuslovni skok, i blokovi
zamijenili mjesta. - CMP CX,0 izracunavanje uslova JE blok1
CX0 gt blok1 - blok2 u suprotnom nastavlja
- JMP dalje kraj else grane
- blok1 then grana
- dalje
19Obrtanje uslova i zamjena blokova
- Naredni segment koda je ekvivalentan prethodnom
- CMP CX,0 izracunavanje uslova JNE blok2
CX!0 gt blok2 - blok1 u suprotnom nastavlja
- JMP dalje
- blok2
- dalje
20Petlje
- Više mogucnosti implementacije
- Pomocu instrukcija uslovnog skoka
- Pomogu namjenskih instrukcija za formiranje
petlji - Pomocu potprograma i manipulacije povratnom
adresom (strogo izbjegavati). - LOOP lab
- LOOPZ (LOOPE) lab
- LOOPNZ (LOOPNE) lab
- Sve instrukcije prvo CXCX-1
- Uslovi izlaska iz petlje su redom
- CX0
- CX0 ili ZF0
- CX0 ili ZF1
- Lab je labela pocetak petlje ili instrukcije
skoka na pocetak petlje. - Lab mora biti u opsegu -128..127B adrese sledece
instrukcije. - JCXZ lab skace na lab ako je CX0
21Primjer, suma prvih N brojeva
- MOV CX, N inicijalizacija brojaca
- JCXZ dalje ako je 0, preskace se petlja
- MOV AX, 0 pocetna vrijednost sume
- petlja ADD AX, CX racunanje sume
- LOOP petlja skok na pocetak petlje
ako je CXgt0 - dalje... prva sledeca instrukcija
22Bezuslovni skok
- JMP lab skace na lab
- Za lab se mogu koristiti modovi adresiranja kao
i za podatke.
23Rad sa stekom
- PUSH src stavlja na stek src
- POP dst sa steka upisuje u dst
- PUSHF cuva PSW na steku
- POPF restaurira PSW sa steka
24Definisanje potprograma
- name PROC FARNEAR start potprograma. Može
biti bliski (pri pozivu se koristi samo PC) ili
daleki (koriste se i CS i PC). Podrazumjevana
vrijednost zavisi od modela. - name ENDP kraj potprograma name. Ne proizvodi
nijednu instrukciju, pa je potrebno ispred
staviti red ili neku drugu instrukciju za
kontrolu toka, kako bi se osigurali da nikada
nece doci do neregularne situacije.
25Pozivanje potprograma
- CALL dst
- near poziv -gt na steku se cuva PC
- far poziv -gt na steku se cuvaju CS i PC
- skace na dst
- RETN exp bliski povratak (samo offset)
- RETF exp daleki povratak
- Ako postoji exp (aritmeticki izraz), po povratku
se oslobada toliko lokacija sa vrha steka
(oslobada se prostor koji su zauzimali parametri)
26Primjer ispis novog reda
- nl DB 10, 13, rezervacija 3B sa datim
pocetnim - vrijednostima
- ...
- newLine PROC NEAR
- push DX cuvanje originalnih
vrijednosti - push DS registara koji se mijenjaju
- mov DX, SEG nl ucitavanje segmenta simbola nl
- mov DS, DX u registar DS
- mov DX, OFFSET nl i ofseta u DX usluga
ispisa - mov AH, 9 kod usluge za ispis stringa
- int 21h poziv servisa
- pop DS vracanje originalnih
vrijednosti - pop DX
- ret povratak iz potprograma, pop
PC - newLine ENDP
27Proslijedivanje parametara u registrima i
globalnim promjenljivim
- Prije poziva se upisuje u registar ili globalno
dostupnu memorijsku lokaciju. - IZBJEGAVATI, osim ako je primarna brzina.
- U jednom trenutku smije postojati najviše jedan
poziv takve funkcije -gt - Nije moguca rekurzija u takvim funkcijama,
- Nije dozvoljeno pozivanje takvih funkcija u
prekidnim rutinama (osim ako su za vrijeme poziva
zabranjeni prekidi).
28Proslijedivanje parametara preko steka
- Parametri se prije poziva ostavljaju na steku.
- U funkciji im se pristupa pomocu registra BP.
- Zato svaka funkcija treba da ima sledeci kod
- Na pocetkupush BPmov BP, SP
- Na krajupop BP
- Ovako je obezbjedeno da svaki poziv funkcije ima
svoj zapis na steku (prikaz na sledecem slajdu).
29Zapis poziva funkcije
Bliski poziv
Daleki poziv
Locm
SP
-2m
Locm
SP
-2m
...
...
Loc1
-2
Loc1
-2
BP
BP
BPstaro
BPstaro
retPC
2
retPC
2
Param1
4
retCS
4
...
Param1
6
Paramn
22n
...
Paramn
42n
30Primjer prosledivanja parametara preko steka
ispis stringa
- newLine PROC NEAR
- push BP
- mov BP, SP
- push DX cuvanje originalnih
vrijednosti - push DS registara koji se mijenjaju
- mov DX, BP6 ucitavanje segmenta sa steka
- mov DS, DX u registar DS
- mov DX, BP4 i ofseta sa steka u DX
- mov AH, 9 kod usluge za ispis stringa
- int 21h poziv servisa
- pop DS vracanje originalnih
vrijednosti - pop DX
- pop BP
- ret povratak iz potprograma, pop
PC - newLine ENDP
31Povratna vrijednost potprograma u registrima
- Najcešce u registru.
- 1 bajt -gt AL (prethodni primjer)
- 2 bajta -gt AX
- 4 bajta -gt DXAX
- Sadržaj registara kroz koje se ocekuje povratna
vrijednost - sacuvati na steku prije poziva,
- restaurirati nekada posle preuzimanja povratne
vrijednosti.
32Primjer citanje jednog znaka i vracanje u
registru
- readc PROC FAR
- mov AH, 1 kod usluge
- ucitavanja znaka
- int 21h poziv DOS servisa
- ret
- readc ENDP
33Povratna vrijednost potprograma na steku
- Vracena vrijednost mora biti ispod povratne
adrese (ne može se ostaviti na vrhu steka). - Dvije mogucnosti
- prostor na steku rezervisati unutar funkcije
- teško, podložno greškama -gt ne koristi,
- prostor na steku rezervisati prije poziva
funkcije - rezervisani prostor može biti
- rezervisan namjenski,
- prostor u kojem su proslijedeni parametri pri
pozivu. - primjer na sledecem slajdu
34Primjer
- readc PROC FAR
- push BP sve registre koji se mijenjaju
- sacuvati na steku
- mov BP, SP da bi se moglo pristupiti lokaciji
za - povratnu vrijednost bez obzira na
- promjene SP
- push AX cuva se originalna vrijednost
- mov AH, 1 usluga citanja jednog znaka
- int 21h poziv DOS servisa
- mov BP6, AL povratna vrijednost
- mov BYTE PTR BP7, 0 mora biti najmanje
rijec - pop AX restauriranje starih vrijednosti
- pop BP
- ret
- readc ENDP
- primjer poziva
- SUB SP, 2 rezervisanje prostora za povratnu
vrijednost - call readc poziv potprograma
35Primjer rekurzija, sabiranje N..0
- suma PROC FAR
- push BP
- mov BP, SP
- mov AX, BP4 citanje parametra sa steka
- cmp AX, 0 da li se doslo do 0?
- je dalje ako jeste, skoci na kraj i
- vrati 0
- dec AX ako nije, pozovi suma(i-1)
- push AX
- call suma
- add AX, BP4 na tekucu sumu (0..i-1) dodaj i
- dalje pop BP
- ret 2 po povratku oslobodi prostor
rezervisan - za parametar na steku
- suma ENDP
36Definicija segmenata
- name SEGMENT aligncombineclass
- sadržaj segmenta
- name ENDS
- align (poravnanje u memoriji)
- BYTE poravnanje na bajt
- WORD poravnanje na rijec
- PARA poravnanje na 16 bajtova
- PAGE poravnanje na 256 bajtova
37Definisanje segmenata
- combine (nacin spajanja sa segmentima istog
imena iz drugih modula) - PUBLIC nadovezivanje segmenata
- STACK segment predviden za stek
- COMMON preklapanje segmenata slicnog imena
- AT poravnanje na zadatu adresu
- class klasa segmenta. Standardno
- STACK stek
- TEXT kod
- DATA podaci
- BSS neinicijalizovani podaci
38Start programa
- end label kraj programa
- ako postoji label, to je oznaka pocetka programa
- ako se više fajlova linkuje u jedan program, samo
jedan smije imati ulaznu tacku (pocetak)
39ASSUME direktiva
- assume sregnaziv_segmenta ,sregnaziv_segmenta..
. - Informacija asembleru koji segmentni registar
ukazuje na koji segment. - Pomaže prilikom pristupa promjenljivim, kako bi
se obezbjedilo korišcenje odgovarajuceg
segmentnog registra. - NE PROIZVODI NIJEDNU INSTRUKCIJU gt neophodno je
napisati kod za inicijalizovanje segmentnih
registara.
40Uvoženje i izvoženje simbola
- public name,name... izvoz iz fajla
- extrn nametype ,nametype... uvoz
- Tip može da bude
- za podatke
- BYTE
- WORD
- DWORD
- za labele
- NEAR
- FAR.
41Definisanje podataka i poravnavanje
- even poravnava sledecu promjenljivu na parnu
adresu. Dobra praksa zbog bržeg pristupa
memoriji. - name DB init ,init... rezerviše jedan bajt
u memoriji - name DW init ,init... rezerviše jednu rijec
(dva bajta) - name DD init ,init... rezerviše jednu duplu
rijec (cetiri bajta) - Rezervisanje se vrši za onoliko lokacija
(bajtova, rijeci ili duplih rijeci) koliko ima
inicijalnih vrijednosti. - count DUP (init ,init...) ponavlja ono što je
u () onoliko puta koliko je vrijednost count. - ? neinicijalizovana lokacija
42Primjer
- a DB 2
- jedan bajt kojem se pristupa sa a
- b DW 3 DUP(?)
- 3 neinicijalizovane rijeci, sa b se pristupa
prvoj, a sa b2 i b4 naredne dvije - c DB "Tekst"
- niz od 6 bajtova
- d DD c
- jedna dupla rijec sa segmentom i ofsetom od c
- f DB 4 DUP(0,1)
- 8 bajtova inicijalizovanih sa 0,1,0,1,0,1,0,1
43Direktive
- name EQU expr svako pojavljivanje name
zamjenjuje sa expr. - include file ukljucuje sadržaj fajla file na
poziciju ove direktive. - OFFSET expr vraca ofset izraza.
- SEG expr vraca segment izraza.
- BYTE PTR expr pristup bajtu.
- WORD PTR expr pristup rijeci.
- NEAR PTR expr expr tumaci kao bliski pokazivac.
- FAR PTR expr expr tumaci kao daleki pokazivac.
- LENGTH var broj elemenata u nizovnim prom.
44Uslovno prevodenje
- IFDEF name uslovno prevedenje.
- ELSE
- ENDIF
45Makroi 1/2
- name MACRO arg ,arg... pocetak makroa naziva
name sa odgovarajucim parametrima. - ENDM kraj makroa.
- LOCAL name ,name... lokalni simboli za makro.
Neophodno za labele u makrou, kako bi se jedan
makro mogao ekspandovati više puta u okviru
jednog koda bez problema dupliranih labela.
46Makroi 2/2
- IRP param, ltarg,,arg...gt
- ovaj segment koda se ponavlja onoliko puta
koliko ima - argumenata i to tako da se svaki put umjesto
svakog pojavljivanja - param zamjeni jedna vrijednost arg.
- ENDM
- IRPC param, ltstringgt
- isto kao prethodno, osim cto su argumenti slova
navedenog stringa - ENDM
- - operator prepoznavanja parametra u tekstu
47Instrukcije za rad sa stringovima
- 5 vrsta
- ne utici na flegove
- movs, kopira ESDI lt- DSSI
- lods, ucitava (AL/AX) lt- DSSI
- stos, upisuje u niz ESDI lt- (AL/AX)
- uticu na sve uslovne flegove
- cmps, setuje flegove na osnovu DSSI ESDI
- scas, setuje flegove na osnovu (AL/AX) ESDI
- 1 bajt-ne instrukcije.
- Oba operanda mogu biti u memoriji.
- Integrišu ažuriranje adresa za narednu iteraciju.
48Operandi
- Operandi su uvijek implicitno zadati.
- Instrukcije se koriste u jednom od dva oblika
- mnemonik operand(i)
- operandi služe samo za odredivanje velicine
operanada (bajt ili rijec) - mnemonikB ili mnemonikW
- sufiks B gt operandi su bajtovi
- sufiks W gt operandi su rijeci
- Adrese (registri SI i DI) mijenjaju na osnovu D
flega - 0 gt adrese se na kraju instrukcije uvecaju za
velicinu operanda, - 1 gtadrese se na kraju instrukcije umanjuju za
velicinu operanda
49Kopiranje niza(pp nizovi se ne preklapaju)
- mov AX, SEG niz1
- mov DS, AX
- mov SI, OFFSET niz1
- mov AX, SEG niz2
- mov ES, AX
- mov DI, OFFSET niz2
- mov CX, LENGTH niz1
- LENGTH je direktiva!
- jcxz dalje
-
- petlja
- mov AL, SI
- mov ESDI, AL
- inc SI
- inc DI
- loop petlja
- dalje...
- mov AX, SEG niz1
- mov DS, AX
- mov SI, OFFSET niz1
- mov AX, SEG niz2
- mov ES, AX
- mov DI, OFFSET niz2
- mov CX, LENGTH niz1
- jcxz dalje
- LENGTH "vraca" velicinu rezervisanog prostora
jcxz dalje - cld
- petlja
- movsb
- loop petlja
- dalje ...
50Traženje zadate vrijednosti u nizu
- mov AX, SEG niz1
- mov DS, AX
- mov AL, 'a'
- mov SI, OFFSET niz1
- mov CX, LENGTH niz1
- jcxz dalje
- petlja
- cmp SI, AL
- je nadjen
- inc SI
- loop petlja
- jmp dalje
- nadjen...
- dalje...
- mov AX, SEG niz1
- mov DS, AX
- mov AL, 'a'
- mov SI, OFFSET niz1
- mov CX, LENGTH niz1
- jcxz dalje
- cld
- dec SI
- petlja
- inc SI
- cmp SI, AL
- loopne petlja
- jne dalje
- nadjen ...
- dalje...
51Traženje zadate vrijednosti u nizu
- mov AX, SEG niz1
- mov DS, AX
- mov AL, 'a'
- mov SI, OFFSET niz1
- mov CX, LENGTH niz1
- jcxz dalje
- cld
- dec SI
- petlja
- inc SI
- cmp SI, AL
- loopne petlja
- jne dalje
- nadjen ...
- dalje...
- mov AX, SEG niz1
- mov DS, AX
- mov BL, 'a'
- mov SI, OFFSET niz1
- mov CX, LENGTH niz1
- jcxz dalje
- cld
- petlja
- lodsb
- cmp AL, BL
- loopne petlja
- jne dalje
- nadjen dec SI ...
- dalje...
52Traženje zadate vrijednosti u nizu
- mov AX, SEG niz1
- mov DS, AX
- mov AL, 'a'
- mov SI, OFFSET niz1
- mov CX, LENGTH niz1
- jcxz dalje
- cld
- dec SI
- petlja
- inc SI
- cmp SI, AL
- loopne petlja
- jne dalje
- nadjen ...
- dalje...
- mov AX, SEG niz1
- mov ES, AX
- mov AL, 'a'
- mov DI, OFFSET niz1
- mov CX, LENGTH niz1
- jcxz dalje
- cld
- petlja
- scasb
-
- loopne petlja
- jne dalje
- nadjen dec DI ...
- dalje...
53Poredenje dva niza
- mov AX, SEG niz1
- mov DS, AX
- mov SI, OFFSET niz1
- mov AX, SEG niz2
- mov ES, AX
- mov DI, OFFSET niz2
- mov CX, LENGTH niz1
- LENGTH je direktiva!
- jcxz dalje
-
- petlja
- mov AL, SI
- cmp ESDI, AL
- jne razliciti
- inc SI
- inc DI
- loop petlja
- jednaki
- razliciti...
- mov AX, SEG niz1
- mov DS, AX
- mov SI, OFFSET niz1
- mov AX, SEG niz2
- mov ES, AX
- mov DI, OFFSET niz2
- mov CX, LENGTH niz1
- LENGTH "vraca" velicinu rezervisanog prostora
jcxz dalje - cld
- petlja
- cmpsb
- jne razliciti
- loop petlja
- jednaki
- razliciti
- dalje ...
54Poredenje dva niza
- mov AX, SEG niz1
- mov DS, AX
- mov SI, OFFSET niz1
- mov AX, SEG niz2
- mov ES, AX
- mov DI, OFFSET niz2
- mov CX, LENGTH niz1
- LENGTH je direktiva!
- jcxz dalje
-
- petlja
- mov AL, SI
- cmp ESDI, AL
- jne razliciti
- inc SI
- inc DI
- loop petlja
- jednaki
- razliciti...
- mov AX, SEG niz1
- mov DS, AX
- mov SI, OFFSET niz1
- mov AX, SEG niz2
- mov ES, AX
- mov DI, OFFSET niz2
- mov CX, LENGTH niz1
- LENGTH "vraca" velicinu rezervisanog prostora
jcxz dalje - cld
- petlja
- cmpsb
-
- loope petlja
- jne razliciti
- jednaki
- razliciti
- dalje ...
55Inicijalizovanje niza
- mov AX, SEG niz1
- mov DS, AX
- mov AL, 0
- mov SI, OFFSET niz1
- mov CX, LENGTH niz1
- jcxz dalje
- petlja
- mov SI, AL
- inc SI
- loop petlja
- dalje...
- mov AX, SEG niz1
- mov ES, AX
- mov AL, 0
- mov SI, OFFSET niz1
- mov CX, LENGTH niz1
- jcxz dalje
- cld
- petlja
- stosb
- loop petlja
- dalje...
56REP prefiks
- Ponavljaju jednu string instrukciju CX puta.
- Postoje u dvije varijante
- bez dodatnog uslova
- REP
- sa dodatnim uslovom
- REPE, REPZ (uslov za ponavljanje je i Z1)
- REPNE, REPNZ (uslov za ponavljanje je i Z0)
- Algoritam rada
- ako je CX 0, izlazi iz petlje
- izvršava zadatu instrukciju
- umanjuje CX za 1
- (provjerava zadati uslov i ako nije ispunjen,
izlazi iz petlje) - ponavlja prethodne korake.
57Kopiranje niza(pp nizovi se ne preklapaju)
- mov AX, SEG niz1
- mov DS, AX
- mov SI, OFFSET niz1
- mov AX, SEG niz2
- mov ES, AX
- mov DI, OFFSET niz2
- mov CX, LENGTH niz1
- jcxz dalje
- LENGTH "vraca" velicinu rezervisanog prostora
jcxz dalje - cld
- petlja
- movsb
- loop petlja
- dalje ...
- mov AX, SEG niz1
- mov DS, AX
- mov SI, OFFSET niz1
- mov AX, SEG niz2
- mov ES, AX
- mov DI, OFFSET niz2
- mov CX, LENGTH niz1
-
- LENGTH "vraca" velicinu rezervisanog prostora
jcxz dalje - cld
- rep movsb
- dalje ...
58Traženje zadate vrijednosti u nizu
- mov AX, SEG niz1
- mov ES, AX
- mov AL, 'a'
- mov DI, OFFSET niz1
- mov CX, LENGTH niz1
- jcxz dalje
- cld
- petlja
- scasb
-
- loopne petlja
- jne dalje
- nadjen dec DI ...
- dalje...
- mov AX, SEG niz1
- mov ES, AX
- mov AL, 'a'
- mov DI, OFFSET niz1
- mov CX, LENGTH niz1
-
- cld
- repne scasb
-
- jne dalje
- nadjen dec DI ...
- dalje...
59Poredenje dva niza
- mov AX, SEG niz1
- mov DS, AX
- mov SI, OFFSET niz1
- mov AX, SEG niz2
- mov ES, AX
- mov DI, OFFSET niz2
- mov CX, LENGTH niz1
- LENGTH "vraca" velicinu rezervisanog prostora
jcxz dalje - cld
- petlja
- cmpsb
- jne razliciti
- loop petlja
- jednaki
- razliciti
- dalje ...
- mov AX, SEG niz1
- mov DS, AX
- mov SI, OFFSET niz1
- mov AX, SEG niz2
- mov ES, AX
- mov DI, OFFSET niz2
- mov CX, LENGTH niz1
- LENGTH "vraca" velicinu rezervisanog prostora
jcxz dalje - cld
- repe cmpsb
- jne razliciti
-
- jednaki
- razliciti
- dalje ...
60Inicijalizovanje niza
- mov AX, SEG niz1
- mov ES, AX
- mov AL, 0
- mov SI, OFFSET niz1
- mov CX, LENGTH niz1
- jcxz dalje
- cld
- petlja
- stosb
- loop petlja
- dalje...
- mov AX, SEG niz1
- mov ES, AX
- mov AL, 0
- mov SI, OFFSET niz1
- mov CX, LENGTH niz1
- jcxz dalje
- cld
- rep stosb
- dalje...
61Zadatak
- Napisati potprogram koji kao parametre prihvata
jedan znak i adresu niza u kojem treba da pronade
zadati znak. Ukoliko pronade znak, vraca indeks
znaka u stringu, racunajuci indekse od nula.
Ukoliko traženi znak ne postoji, treba vratiti
-1. String je niz znakova koji se završava znakom
''.
62Rešenje 1
- trazi PROC NEAR
- push BP
- mov BP, SP
- push BX
- push CX
- push DI
- push ES
- cld
- mov AL,BP4
- LES DI,BP6 ESBP8, DIBP6
- mov CX, -1 indeks poslednjeg
nadj. - mov BX, -1 indeks tekuceg
elementa - ponovo cmp ESBYTE PTRDI, ''
- je kraj
- inc BX
- scasb
- jne ponovo
- mov CX, BX
- jmp ponovo
- kraj mov AX, CX
- pop ES
- pop DI
- pop CX
- pop BX
- pop BP
- ret
- trazi ENDP
63Rešenje 1
- trazi PROC NEAR
- push BP
- mov BP, SP
- push BX
- push CX
- push DI
- push ES
- cld
- mov AL,''
- LES DI,BP6 ESBP8, DIBP6
- mov BX, -1 indeks tekuceg elementa
-
- mov CX, -1 0ffffh
- repne scasb CX-1 - (LEN1)
- mov AL, BP4
- std
- neg CX CXLEN2
- sub CX, 2 CXLEN
- DI ukazuje na znak posle ''
- sub DI, 2
- DI ukazuje na poslednji znak stringa
- repne scasb
- je nadjen
- mov CX, -1
- nadjen mov AX, CX
- pop ES
- pop DI
- pop CX
- pop BX
- pop BP
- ret
- trazi ENDP