Top Banner
8086 asembler
63

8086 asembler

Jan 12, 2016

Download

Documents

jerrod

8086 asembler. Stek. Raste ka nižim adresama. SP pokazuje na zauzetu lokaciju na vrhu steka. BP – bazni registar za pristum stvarnim parametrima i lokalnim promjenljivim. Memorijski adresni prostor. Veličina memorijskog adresnog prostora: 1MB. Adresibilna jedinica: bajt. - PowerPoint PPT Presentation
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: 8086 asembler

8086 asembler

Page 2: 8086 asembler

Stek

• Raste ka nižim adresama.

• SP pokazuje na zauzetu lokaciju na vrhu steka.

• BP – bazni registar za pristum stvarnim parametrima i lokalnim promjenljivim

Page 3: 8086 asembler

Memorijski adresni prostor

• Veličina memorijskog adresnog prostora: 1MB.

• Adresibilna jedinica: bajt.

• Moguć pristup riječi – dva uzastopna bajta.

• Little-endian – viši bajt na višoj adresi.

Page 4: 8086 asembler

Segentni 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 – pomoćni segment sa podacima.• Podrazumijevani segment za podatke se

može u određenim situacijama zamijeniti.

Page 5: 8086 asembler

Načini adresiranja

• Neposredno: 10, 20h ...• Registarsko direktno (svi registri): AX, DS, BH ...• Memorijsko direktno: suma, niz+6 ...• Registarsko indirektno (samo BX, SI i DI): [BX].• Registarsko indirektno sa pomjerajem (samo

BX, BP, SI i DI): [BX+88h], niz[SI].• Bazno indeksno (adresa je zbir jednog baznog i

jednog indeksnog registra): [BX][SI]• Bazno indeksno sa pomjerajem (kao prethodno

plus pomjeraj): niz[BX][DI].

Page 6: 8086 asembler

Ograničenja 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 dvotačku. Primjer: mov AX,DS:BP[0]

Page 7: 8086 asembler

Asemblerske naredbe

• [labela:] mnemonik [operandi] [;komentar]

• Labela predstavlja adresu na kojoj se nalazi naredba.

• mnemonik je simbolički zapisana komanda.

• Mogu biti do dva operanda.– Prvi je uvijek odredište, a nekad i izvorište.– Drugi je izvorište.

Page 8: 8086 asembler

Transfer podataka

• MOV dst, src ;dst = src

• LEA dst, src ;dst = offset(src)

• LDS dst, src ;ds:dst = src

• LES dst, src ;es:dst = src

• XCHG op1, op2 ;mijenja vrijednosti u operandima op1 i op2

Page 9: 8086 asembler

Sabiranje i oduzimanje

• ADD dst, src ;dst=dst+src• ADC dst, src ;dst=dst+src+CF• SUB dst, src ;dst=dst-src• SBB dst, src ;dst=dst-src-CF• NEG dst ;dst=-dst• INC dst ;dst=dst+1• DEC dst ;dst=dst-1• CMP src1, src2 ;setuje flegove na osnovu

;src1-src2

Page 10: 8086 asembler

Množenje i dijeljenje

• MUL src ;neoznaceno množenje• IMUL src ;označeno 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 DX:AX

• DIV src ;neoznačeno dijeljenje• IDIV src ;označeno dijeljenje

– Dijeli AX sa src (8-bitni) i rezultat ostavlja u AL, a ostatak u AH.

– Dijeli DX:AX sa src (16-bitni) i rezultat ostavlja u AX, a ostatak u DX

Page 11: 8086 asembler

Proširivanje operanda

• CBW ;proširuje AH sa znakom iz AL

• CWD ;pročiruje DX sa znakom iz AX

Page 12: 8086 asembler

Logičke 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

Page 13: 8086 asembler

Pomjeranje i rotiranje

• SHL dst, cnt ;pomjeranje logički lijevo• SAL dst, cnt ;pomjeranje aritmetički lijevo• SHR dst, cnt ;pomjeranje logički desno• SAR dst, cnt ;pomjeranje aritmetički 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

Page 14: 8086 asembler

Primjer

• Stanje prije: AX=0F00Fh, CF=0, CL=2• SHL AX, CL ;0C03Ch, CF=1 (bit koji je ispao)• SAL AX, CL ;0C03Ch, CF=1 (bit koji je ispao)• SHR AX, CL ;03C03h, CF=1 (bit koji je ispao)• SAL AX, CL ;0FC03h, CF=1 (bit koji je ispao)• ROR AX, CL ;0FC03h, CF=1 (poslednji• ROL AX, CL ;0C03Fh, CF=1 rotirani bit)• RCR AX, CL ;0BC03h, CF=1 (poslednj• RCL AX, CL ;0C03Dh, CF=1 izbačeni bit)

Page 15: 8086 asembler

Uslovni skokovi 1/2

• Relativni skok sa 8-bitnim označenim pomjerajem.

• Test pojedinačnih flegova:– JZ (JE),– JNZ (JNE),– JS,– JNS,– JP (JPE),– JNP (JPO),

Page 16: 8086 asembler

Uslovni skokovi 2/2

• Poređenje neoznačenih brojeva:– JB (JNAE, JC)– JNB (JAE, JNC)– JBE (JNA)– JNBE (JA)

• Poređenje označenih brojeva:– JL (JNGE)– JNL (JGE)– JLE (JNG)– JNLE (JG)

Page 17: 8086 asembler

if-then-else

• Viši programski jezici:– if (CX==0) {

blok1 } else { blok2}

– Blok1 i blok2 nizovi instrukcija

• Asembler: CMP CX,0 JE blok1 JMP blok2blok1: … JMP daljeblok2: …dalje: …

Izračunavanje uslova.

Ako je tačan, skače na blok1.U suprotnom na

blok2.

Page 18: 8086 asembler

Optimizacija

• Moguća samo u slučaju malih blokova (bar jedan manji od 127B).

• Izbačen prvi bezuslovni skok, i blokovi zamijenili mjesta.

CMP CX,0 ;izračunavanje uslovaJE blok1 ;CX==0 => blok1

blok2: … ;u suprotnom nastavljaJMP dalje ;kraj else grane

blok1: … ;then granadalje: …

Page 19: 8086 asembler

Obrtanje uslova i zamjena blokova

• Naredni segment koda je ekvivalentan prethodnom:

CMP CX,0 ;izračunavanje uslovaJNE blok2 ;CX!=0 => blok2

blok1: … ;u suprotnom nastavlja

JMP dalje

blok2: …

dalje: …

Page 20: 8086 asembler

Petlje• Više mogućnosti implementacije:

– Pomoću instrukcija uslovnog skoka– Pomogu namjenskih instrukcija za formiranje petlji– Pomoću potprograma i manipulacije povratnom adresom (strogo izbjegavati).

• LOOP lab• LOOPZ (LOOPE) lab• LOOPNZ (LOOPNE) lab• Sve instrukcije prvo: CX=CX-1• Uslovi izlaska iz petlje su redom:

– CX=0– CX=0 ili ZF=0– CX=0 ili ZF=1

• Lab je labela početak petlje ili instrukcije skoka na početak petlje.• Lab mora biti u opsegu -128..+127B adrese sledeće instrukcije.• JCXZ lab ;skače na lab ako je CX=0

Page 21: 8086 asembler

Primjer, suma prvih N brojeva

MOV CX, N ;inicijalizacija ;brojača

JCXZ dalje ;ako je 0, preskače se ;petlja

MOV AX, 0 ;početna vrijednost ;sume

petlja: ADD AX, CX ;računanje sumeLOOP petlja ;skok na početak

;petlje ako je; CX>0

dalje... ;prva sledeća instrukcija

Page 22: 8086 asembler

Bezuslovni skok

• JMP lab ;skace na lab

• Za lab se mogu koristiti modovi adresiranja kao i za podatke.

Page 23: 8086 asembler

Rad sa stekom

• PUSH src ;stavlja na stek src

• POP dst ;sa steka upisuje u dst

• PUSHF ;čuva PSW na steku

• POPF ;restaurira PSW sa steka

Page 24: 8086 asembler

Definisanje potprograma

• name PROC [FAR|NEAR] – 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 neće doći do neregularne situacije.

Page 25: 8086 asembler

Pozivanje potprograma

• CALL dst– near poziv -> na steku se čuva PC– far poziv -> na steku se čuvaju CS i PC– skače na dst

• RETN [exp] ;bliski povratak (samo offset)• RETF [exp] ;daleki povratak• Ako postoji exp (aritmetički izraz), po povratku

se oslobađa toliko lokacija sa vrha steka (oslobađa se prostor koji su zauzimali parametri)

Page 26: 8086 asembler

Primjer – ispis novog redanl DB 10, 13, ‘$’ ;rezervacija 3B sa datim početnim

;vrijednostima...newLine PROC NEAR

push DX ;čuvanje originalnih vrijednostipush DS ;registara koji se mijenjajumov DX, SEG nl ;učitavanje segmenta simbola nlmov DS, DX ;u registar DSmov DX, OFFSET nl ;i ofseta u DX – usluga ispisamov AH, 9 ;kod usluge za ispis stringaint 21h ;poziv servisapop DS ;vraćanje originalnih vrijednostipop DXret ;povratak iz potprograma, pop PC

newLine ENDP

Page 27: 8086 asembler

Proslijeđivanje 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 ->– Nije moguća rekurzija u takvim funkcijama,– Nije dozvoljeno pozivanje takvih funkcija u prekidnim

rutinama (osim ako su za vrijeme poziva zabranjeni prekidi).

Page 28: 8086 asembler

Proslijeđivanje parametara preko steka

• Parametri se prije poziva ostavljaju na steku.• U funkciji im se pristupa pomoću registra BP.• Zato svaka funkcija treba da ima sledeći kod:

– Na početku:push BPmov BP, SP

– Na krajupop BP

• Ovako je obezbjeđeno da svaki poziv funkcije ima svoj zapis na steku (prikaz na sledećem slajdu).

Page 29: 8086 asembler

Zapis poziva funkcije

Param[n]

Loc[m]

...

Loc[1]

BPstaro

retPC

Param[1]

...

SP

BP

+2

+4

-2*m

+2+2*n

-2

retCS

Param[n]

Loc[m]

...

Loc[1]

BPstaro

retPC

Param[1]

...

SP

BP

+2

+6

-2*m

+4+2*n

-2

+4

Bliski poziv Daleki poziv

Page 30: 8086 asembler

Primjer prosleđivanja parametara preko steka – ispis stringa

newLine PROC NEARpush BPmov BP, SPpush DX ;čuvanje originalnih vrijednostipush DS ;registara koji se mijenjajumov DX, [BP+6] ;učitavanje segmenta sa stekamov DS, DX ;u registar DSmov DX, [BP+4] ;i ofseta sa steka u DXmov AH, 9 ;kod usluge za ispis stringaint 21h ;poziv servisapop DS ;vraćanje originalnih vrijednostipop DXpop BPret ;povratak iz potprograma, pop PC

newLine ENDP

Page 31: 8086 asembler

Povratna vrijednost potprograma u registrima

• Najčešće u registru.– 1 bajt -> AL (prethodni primjer)– 2 bajta -> AX– 4 bajta -> DX:AX

• Sadržaj registara kroz koje se očekuje povratna vrijednost:– sačuvati na steku prije poziva,– restaurirati nekada posle preuzimanja

povratne vrijednosti.

Page 32: 8086 asembler

Primjer – čitanje jednog znaka i vraćanje u registru

readc PROC FAR

mov AH, 1 ;kod usluge

;učitavanja znaka

int 21h ;poziv DOS servisa

ret

readc ENDP

Page 33: 8086 asembler

Povratna vrijednost potprograma na steku

• Vraćena vrijednost mora biti ispod povratne adrese (ne može se ostaviti na vrhu steka).

• Dvije mogućnosti:– prostor na steku rezervisati unutar funkcije:

• teško, podložno greškama -> ne koristi,

– prostor na steku rezervisati prije poziva funkcije:• rezervisani prostor može biti:

– rezervisan namjenski,

– prostor u kojem su proslijeđeni parametri pri pozivu.

• primjer na sledećem slajdu

Page 34: 8086 asembler

Primjerreadc PROC FAR

push BP ;sve registre koji se mijenjaju ;sačuvati na steku

mov BP, SP ;da bi se moglo pristupiti lokaciji za ;povratnu vrijednost bez obzira na ;promjene SP

push AX ;čuva se originalna vrijednostmov AH, 1 ;usluga čitanja jednog znakaint 21h ;poziv DOS servisamov [BP+6], AL ;povratna vrijednostmov BYTE PTR [BP+7], 0 ;mora biti najmanje riječpop AX ;restauriranje starih vrijednostipop BPret

readc ENDP

;primjer pozivaSUB SP, 2 ;rezervisanje prostora za povratnu vrijednostcall readc ;poziv potprogramapop AX ;primjer uzimanja povratne vrijednosti sa steka

Page 35: 8086 asembler

Primjer – rekurzija, sabiranje N..0

suma PROC FARpush BP mov BP, SPmov AX, [BP+4] ;čitanje parametra sa stekacmp AX, 0 ;da li se doslo do 0?je dalje ;ako jeste, skoci na kraj i

;vrati 0dec AX ;ako nije, pozovi suma(i-1)push AXcall sumaadd AX, [BP+4] ;na tekucu sumu (0..i-1) dodaj i

dalje: pop BPret 2 ;po povratku oslobodi prostor rezervisan

;za parametar na stekusuma ENDP

Page 36: 8086 asembler

Definicija segmenata

• name SEGMENT [align][combine][class]• ;sadržaj segmenta• name ENDS• align: (poravnanje u memoriji)

– BYTE – poravnanje na bajt– WORD – poravnanje na riječ– PARA – poravnanje na 16 bajtova– PAGE – poravnanje na 256 bajtova

Page 37: 8086 asembler

Definisanje segmenata

• combine: (način spajanja sa segmentima istog imena iz drugih modula)– PUBLIC – nadovezivanje segmenata– STACK – segment predviđen za stek– COMMON – preklapanje segmenata sličnog imena– AT – poravnanje na zadatu adresu

• class: klasa segmenta. Standardno:– ‘STACK’ – stek– ‘TEXT’ – kod– ‘DATA’ – podaci– ‘BSS’ – neinicijalizovani podaci

Page 38: 8086 asembler

Start programa

• end [label] – kraj programa• ako postoji label, to je oznaka početka programa

• ako se više fajlova linkuje u jedan program, samo jedan smije imati ulaznu tačku (početak)

Page 39: 8086 asembler

ASSUME direktiva

• assume sreg:naziv_segmenta [,sreg:naziv_segmenta...]

• Informacija asembleru koji segmentni registar ukazuje na koji segment.

• Pomaže prilikom pristupa promjenljivim, kako bi se obezbjedilo korišćenje odgovarajućeg segmentnog registra.

• NE PROIZVODI NIJEDNU INSTRUKCIJU => neophodno je napisati kod za inicijalizovanje segmentnih registara.

Page 40: 8086 asembler

Uvoženje i izvoženje simbola

• public name[,name...] – izvoz iz fajla

• extrn name:type [,name:type...] – uvoz– Tip može da bude:

• za podatke:– BYTE– WORD– DWORD

• za labele:– NEAR– FAR.

Page 41: 8086 asembler

Definisanje podataka i poravnavanje

• even – poravnava sledeću 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 riječ (dva bajta)• [name] DD init [,init...] – rezerviše jednu duplu riječ (četiri

bajta)• Rezervisanje se vrši za onoliko lokacija (bajtova, riječi ili

duplih riječi) koliko ima inicijalnih vrijednosti.• count DUP (init [,init...]) – ponavlja ono što je u () onoliko

puta koliko je vrijednost count.• ? – neinicijalizovana lokacija

Page 42: 8086 asembler

Primjer

• a DB 2 – ;jedan bajt kojem se pristupa sa a

• b DW 3 DUP(?)– ;3 neinicijalizovane riječi, sa b se pristupa prvoj, a sa

b+2 i b+4 naredne dvije• c DB "Tekst$"

– ;niz od 6 bajtova• d DD c

– ;jedna dupla riječ sa segmentom i ofsetom od c• f DB 4 DUP(0,1)

– ;8 bajtova inicijalizovanih sa 0,1,0,1,0,1,0,1

Page 43: 8086 asembler

Direktive

• name EQU expr – svako pojavljivanje name zamjenjuje sa expr.

• include file – uključuje sadržaj fajla file na poziciju ove direktive.

• OFFSET expr – vraća ofset izraza.• SEG expr – vraća segment izraza.• BYTE PTR expr – pristup bajtu.• WORD PTR expr – pristup riječi.• NEAR PTR expr – expr tumači kao bliski pokazivač.• FAR PTR expr – expr tumači kao daleki pokazivač.• LENGTH var – broj elemenata u nizovnim prom.

Page 44: 8086 asembler

Uslovno prevođenje

• IFDEF name – uslovno preveđenje.

• ELSE

• ENDIF

Page 45: 8086 asembler

Makroi 1/2

• name MACRO arg [,arg...] – početak makroa naziva name sa odgovarajućim 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.

Page 46: 8086 asembler

Makroi 2/2

• IRP param, <arg,[,arg...]>• ;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, <string>• ;isto kao prethodno, osim čto su argumenti slova

navedenog stringa• ENDM• & - operator prepoznavanja parametra u tekstu

Page 47: 8086 asembler

Instrukcije za rad sa stringovima

• 5 vrsta:– ne utiči na flegove:

• movs, kopira ES:[DI] <- DS:[SI]• lods, učitava (AL/AX) <- DS:[SI]• stos, upisuje u niz ES:[DI] <- (AL/AX)

– utiču na sve uslovne flegove:• cmps, setuje flegove na osnovu DS:[SI] – ES:[DI]• scas, setuje flegove na osnovu (AL/AX) – ES:[DI]

• 1 bajt-ne instrukcije.• Oba operanda mogu biti u memoriji.• Integrišu ažuriranje adresa za narednu iteraciju.

Page 48: 8086 asembler

Operandi

• Operandi su uvijek implicitno zadati.• Instrukcije se koriste u jednom od dva oblika:

– mnemonik operand(i)• operandi služe samo za određivanje veličine operanada (bajt ili

riječ)– mnemonikB ili mnemonikW

• sufiks B => operandi su bajtovi• sufiks W => operandi su riječi

• Adrese (registri SI i DI) mijenjaju na osnovu D flega:– 0 => adrese se na kraju instrukcije uvećaju za veličinu

operanda,– 1 =>adrese se na kraju instrukcije umanjuju za veličinu

operanda

Page 49: 8086 asembler

Kopiranje 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 ES:[DI], AL inc SI inc DI loop petljadalje:...

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 "vraća" veličinu

; rezervisanog prostora jcxz dalje cldpetlja: movsb

loop petljadalje: ...

Page 50: 8086 asembler

Traž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 daljenadjen:...dalje:...

mov AX, SEG niz1 mov DS, AX mov AL, 'a' mov SI, OFFSET niz1 mov CX, LENGTH niz1 jcxz dalje cld dec SIpetlja: inc SI cmp [SI], AL

loopne petlja jne daljenadjen: ...dalje:...

Page 51: 8086 asembler

Traž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 SIpetlja: inc SI cmp [SI], AL

loopne petlja jne daljenadjen: ...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 daljenadjen: dec SI ...dalje:...

Page 52: 8086 asembler

Traž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 SIpetlja: inc SI cmp [SI], AL

loopne petlja jne daljenadjen: ...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 daljenadjen: dec DI ...dalje:...

Page 53: 8086 asembler

Poređenje 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 ES:[DI], AL jne razliciti inc SI inc DI loop petljajednaki: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 "vraća" veličinu

; rezervisanog prostora jcxz dalje cldpetlja: cmpsb jne razliciti

loop petljajednaki:razliciti:dalje: ...

Page 54: 8086 asembler

Poređenje 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 ES:[DI], AL jne razliciti inc SI inc DI loop petljajednaki: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 "vraća" veličinu

; rezervisanog prostora jcxz dalje cldpetlja: cmpsb

loope petlja jne razlicitijednaki:razliciti:dalje: ...

Page 55: 8086 asembler

Inicijalizovanje 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 petljadalje:...

mov AX, SEG niz1 mov ES, AX mov AL, 0 mov SI, OFFSET niz1 mov CX, LENGTH niz1 jcxz dalje cldpetlja: stosb

loop petljadalje:...

Page 56: 8086 asembler

REP 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 Z=1)• REPNE, REPNZ (uslov za ponavljanje je i Z=0)

• 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.

Page 57: 8086 asembler

Kopiranje 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 "vraća" veličinu

; rezervisanog prostora jcxz dalje cldpetlja: movsb

loop petljadalje: ...

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 "vraća" veličinu

; rezervisanog prostora jcxz dalje cld

rep movsb

dalje: ...

Page 58: 8086 asembler

Traž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 cldpetlja: scasb

loopne petlja jne daljenadjen: 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 daljenadjen: dec DI ...dalje:...

Page 59: 8086 asembler

Poređenje 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 "vraća" veličinu

; rezervisanog prostora jcxz dalje cldpetlja: cmpsb jne razliciti

loop petljajednaki: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 "vraća" veličinu

; rezervisanog prostora jcxz dalje cld

repe cmpsb jne razliciti

jednaki:razliciti:dalje: ...

Page 60: 8086 asembler

Inicijalizovanje niza

mov AX, SEG niz1 mov ES, AX mov AL, 0 mov SI, OFFSET niz1 mov CX, LENGTH niz1 jcxz dalje cldpetlja: stosb

loop petljadalje:...

mov AX, SEG niz1 mov ES, AX mov AL, 0 mov SI, OFFSET niz1 mov CX, LENGTH niz1 jcxz dalje cld

rep stosb

dalje:...

Page 61: 8086 asembler

Zadatak

• Napisati potprogram koji kao parametre prihvata jedan znak i adresu niza u kojem treba da pronađe zadati znak. Ukoliko pronađe znak, vraća indeks znaka u stringu, računajući indekse od nula. Ukoliko traženi znak ne postoji, treba vratiti -1. String je niz znakova koji se završava znakom '$'.

Page 62: 8086 asembler

Rešenje 1trazi PROC NEAR push BP mov BP, SP push BX push CX push DI push ES cld mov AL,[BP+4] LES DI,[BP+6] ;ES=BP[8], DI=BP[6] mov CX, -1 ;indeks poslednjeg nadj. mov BX, -1 ;indeks tekućeg elementa

ponovo: cmp ES:BYTE PTR[DI], '$' 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 rettrazi ENDP

Page 63: 8086 asembler

Rešenje 1trazi PROC NEAR push BP mov BP, SP push BX push CX push DI push ES cld mov AL,'$' LES DI,[BP+6] ;ES=BP[8], DI=BP[6] mov BX, -1 ;indeks tekućeg elementa mov CX, -1 ;0ffffh repne scasb ;CX=-1 - (LEN+1) mov AL, BP[4] std

neg CX ;CX=LEN+2 sub CX, 2 ;CX=LEN;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 rettrazi ENDP