8086 asembler
description
Transcript of 8086 asembler
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.
• Moguć pristup riječi – dva uzastopna bajta.
• Little-endian – viši bajt na višoj adresi.
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.
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].
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]
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.
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
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
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
Proširivanje operanda
• CBW ;proširuje AH sa znakom iz AL
• CWD ;pročiruje DX sa znakom iz AX
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
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
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)
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),
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)
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.
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: …
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: …
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
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
Bezuslovni skok
• JMP lab ;skace na lab
• Za lab se mogu koristiti modovi adresiranja kao i za podatke.
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
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.
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)
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
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).
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).
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
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
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.
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
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
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
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
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
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
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)
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.
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.
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
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
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.
Uslovno prevođenje
• IFDEF name – uslovno preveđenje.
• ELSE
• ENDIF
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.
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
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.
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
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: ...
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:...
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:...
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:...
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: ...
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: ...
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:...
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.
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: ...
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:...
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: ...
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:...
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 '$'.
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
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