8086 asembler - PowerPoint PPT Presentation

About This Presentation
Title:

8086 asembler

Description:

Title: PowerPoint Presentation Last modified by: sasa Created Date: 1/1/1601 12:00:00 AM Document presentation format: On-screen Show (4:3) Other titles – PowerPoint PPT presentation

Number of Views:54
Avg rating:3.0/5.0
Slides: 64
Provided by: etf74
Category:
Tags: asembler

less

Transcript and Presenter's Notes

Title: 8086 asembler


1
8086 asembler
2
Stek
  • Raste ka nižim adresama.
  • SP pokazuje na zauzetu lokaciju na vrhu steka.
  • BP bazni registar za pristum stvarnim
    parametrima i lokalnim promjenljivim

3
Memorijski 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.

4
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 pomocni segment sa podacima.
  • Podrazumijevani segment za podatke se može u
    odredenim situacijama zamijeniti.

5
Nacini 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.

6
Ogranicenja 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

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

8
Transfer 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

9
Sabiranje 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

10
Množ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

11
Proširivanje operanda
  • CBW proširuje AH sa znakom iz AL
  • CWD prociruje DX sa znakom iz AX

12
Logicke 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

13
Pomjeranje 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

14
Primjer
  • 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)

15
Uslovni skokovi 1/2
  • Relativni skok sa 8-bitnim oznacenim pomjerajem.
  • Test pojedinacnih flegova
  • JZ (JE),
  • JNZ (JNE),
  • JS,
  • JNS,
  • JP (JPE),
  • JNP (JPO),

16
Uslovni 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)

17
if-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.
18
Optimizacija
  • 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

19
Obrtanje 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

20
Petlje
  • 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

21
Primjer, 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

22
Bezuslovni skok
  • JMP lab skace na lab
  • Za lab se mogu koristiti modovi adresiranja kao
    i za podatke.

23
Rad 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

24
Definisanje 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.

25
Pozivanje 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)

26
Primjer 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

27
Proslijedivanje 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).

28
Proslijedivanje 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).

29
Zapis 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
30
Primjer 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

31
Povratna 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.

32
Primjer 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

33
Povratna 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

34
Primjer
  • 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

35
Primjer 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

36
Definicija 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

37
Definisanje 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

38
Start 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)

39
ASSUME 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.

40
Uvož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.

41
Definisanje 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

42
Primjer
  • 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

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

44
Uslovno prevodenje
  • IFDEF name uslovno prevedenje.
  • ELSE
  • ENDIF

45
Makroi 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.

46
Makroi 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

47
Instrukcije 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.

48
Operandi
  • 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

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

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

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

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

53
Poredenje 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 ...

54
Poredenje 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 ...

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

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

57
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 "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 ...

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

59
Poredenje 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 ...

60
Inicijalizovanje 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...

61
Zadatak
  • 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
    ''.

62
Reš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

63
Reš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
Write a Comment
User Comments (0)
About PowerShow.com