8086 asembler Stek Raste ka niim adresama SP
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: 1 MB. • 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, 20 h. . . 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+88 h], 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 op 1, op 2 ; mijenja vrijednosti u operandima op 1 i op 2
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 src 1, src 2 ; setuje flegove na osnovu ; src 1 -src 2
Množenje i dijeljenje • MUL src • IMUL src ; neoznaceno množenje ; 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 • IDIV src ; neoznačeno dijeljenje ; 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 op 1, op 2 ; setuje flegove na osnovu ; op 1 & op 2
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=0 F 00 Fh, CF=0, CL=2 SHL AX, CL ; 0 C 03 Ch, CF=1 (bit koji je ispao) SAL AX, CL ; 0 C 03 Ch, CF=1 (bit koji je ispao) SHR AX, CL ; 03 C 03 h, CF=1 (bit koji je ispao) SAL AX, CL ; 0 FC 03 h, CF=1 (bit koji je ispao) ROR AX, CL ; 0 FC 03 h, CF=1 (poslednji ROL AX, CL ; 0 C 03 Fh, CF=1 rotirani bit) RCR AX, CL ; 0 BC 03 h, CF=1 (poslednj RCL AX, CL ; 0 C 03 Dh, 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) { blok 1 } else { blok 2 } – Blok 1 i blok 2 nizovi instrukcija Izračunavanje uslova. • Asembler: Ako je tačan, skače na blok 1. U suprotnom na blok 2. CMP CX, 0 JE blok 1 JMP blok 2 blok 1: … JMP dalje blok 2: … dalje: …
Optimizacija • Moguća samo u slučaju malih blokova (bar jedan manji od 127 B). • Izbačen prvi bezuslovni skok, i blokovi zamijenili mjesta. CMP CX, 0 ; izračunavanje uslova JE blok 1 ; CX==0 => blok 1 blok 2: … ; u suprotnom nastavlja JMP dalje ; kraj else grane blok 1: … ; then grana dalje: …
Obrtanje uslova i zamjena blokova • Naredni segment koda je ekvivalentan prethodnom: CMP CX, 0 ; izračunavanje uslova JNE blok 2 ; CX!=0 => blok 2 blok 1: … ; u suprotnom nastavlja JMP dalje blok 2: … 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 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. . +127 B 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 sume LOOP 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 POP dst PUSHF POPF ; stavlja na stek src ; sa steka upisuje u dst ; čuva PSW na steku ; 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 reda nl DB 10, 13, ‘$’. . . new. Line PROC NEAR push DX push DS mov DX, SEG nl mov DS, DX mov DX, OFFSET mov AH, 9 int 21 h pop DS pop DX ret new. Line ENDP ; rezervacija 3 B sa datim početnim ; vrijednostima ; čuvanje originalnih vrijednosti ; registara koji se mijenjaju ; učitavanje segmenta simbola nl ; u registar DS nl ; i ofseta u DX – usluga ispisa ; kod usluge za ispis stringa ; poziv servisa ; vraćanje originalnih vrijednosti ; povratak iz potprograma, pop PC
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 BP mov BP, SP – Na kraju pop BP • Ovako je obezbjeđeno da svaki poziv funkcije ima svoj zapis na steku (prikaz na sledećem slajdu).
Zapis poziva funkcije Bliski poziv SP Loc[m] Daleki poziv -2*m . . . Loc[1] BPstaro SP Loc[m] -2*m . . . -2 BP Loc[1] BPstaro -2 BP ret. PC +2 Param[1] +4 ret. CS +4 Param[1] +6 . . . Param[n] +2+2*n . . . Param[n] +4+2*n
Primjer prosleđivanja parametara preko steka – ispis stringa new. Line PROC NEAR push BP mov BP, SP push DX push DS mov DX, [BP+6] mov DS, DX mov DX, [BP+4] mov AH, 9 int 21 h pop DS pop DX pop BP ret new. Line ENDP ; čuvanje originalnih vrijednosti ; registara koji se mijenjaju ; učitavanje segmenta sa steka ; u registar DS ; i ofseta sa steka u DX ; kod usluge za ispis stringa ; poziv servisa ; vraćanje originalnih vrijednosti ; povratak iz potprograma, pop PC
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 21 h ; 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 pozivu. • primjer na sledećem slajdu
Primjer readc 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 vrijednost mov AH, 1 ; usluga čitanja jednog znaka int 21 h ; poziv DOS servisa mov [BP+6], AL ; povratna vrijednost mov BYTE PTR [BP+7], 0 ; mora biti najmanje riječ pop AX ; restauriranje starih vrijednosti pop BP ret readc ENDP ; primjer poziva SUB SP, 2 ; rezervisanje prostora za povratnu vrijednost call readc ; poziv potprograma pop AX ; primjer uzimanja povratne vrijednosti sa steka
Primjer – rekurzija, sabiranje N. . 0 suma PROC FAR push BP mov BP, SP mov AX, [BP+4] ; čitanje 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, [BP+4] ; na tekucu sumu (0. . i-1) dodaj i dalje: pop BP ret 2 ; po povratku oslobodi prostor rezervisan ; za parametar na steku suma ENDP
Definicija segmenata • • name SEGMENT [align][combine][class] ; sadržaj segmenta name ENDS align: (poravnanje u memoriji) – – BYTE WORD PARA PAGE – – poravnanje na na bajt riječ 16 bajtova 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
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č) – mnemonik. B ili mnemonik. W • 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 niz 1 mov DS, AX mov SI, OFFSET niz 1 mov AX, SEG niz 2 mov ES, AX mov DI, OFFSET niz 2 mov CX, LENGTH niz 1 ; LENGTH je direktiva! jcxz dalje petlja: mov AL, [SI] mov ES: [DI], AL inc SI inc DI loop petlja dalje: . . . mov AX, SEG niz 1 mov DS, AX mov SI, OFFSET niz 1 mov AX, SEG niz 2 mov ES, AX mov DI, OFFSET niz 2 mov CX, LENGTH niz 1 jcxz dalje ; LENGTH "vraća" veličinu ; rezervisanog prostora jcxz dalje cld petlja: movsb loop petlja dalje: . . .
Traženje zadate vrijednosti u nizu mov AX, SEG niz 1 mov DS, AX mov AL, 'a' mov SI, OFFSET niz 1 mov CX, LENGTH niz 1 jcxz dalje petlja: cmp [SI], AL je nadjen inc SI loop petlja jmp dalje nadjen: . . . dalje: . . . mov AX, SEG niz 1 mov DS, AX mov AL, 'a' mov SI, OFFSET niz 1 mov CX, LENGTH niz 1 jcxz dalje cld dec SI petlja: inc SI cmp [SI], AL loopne petlja jne dalje nadjen: . . . dalje: . . .
Traženje zadate vrijednosti u nizu mov AX, SEG niz 1 mov DS, AX mov AL, 'a' mov SI, OFFSET niz 1 mov CX, LENGTH niz 1 jcxz dalje cld dec SI petlja: inc SI cmp [SI], AL mov AX, SEG niz 1 mov DS, AX mov BL, 'a' mov SI, OFFSET niz 1 mov CX, LENGTH niz 1 jcxz dalje cld petlja: lodsb cmp AL, BL loopne petlja jne dalje nadjen: . . . dalje: . . . loopne petlja jne dalje nadjen: dec SI. . . dalje: . . .
Traženje zadate vrijednosti u nizu mov AX, SEG niz 1 mov DS, AX mov AL, 'a' mov SI, OFFSET niz 1 mov CX, LENGTH niz 1 jcxz dalje cld dec SI petlja: inc SI cmp [SI], AL loopne petlja jne dalje nadjen: . . . dalje: . . . mov AX, SEG niz 1 mov ES, AX mov AL, 'a' mov DI, OFFSET niz 1 mov CX, LENGTH niz 1 jcxz dalje cld petlja: scasb loopne petlja jne dalje nadjen: dec DI. . . dalje: . . .
Poređenje dva niza mov AX, SEG niz 1 mov DS, AX mov SI, OFFSET niz 1 mov AX, SEG niz 2 mov ES, AX mov DI, OFFSET niz 2 mov CX, LENGTH niz 1 ; LENGTH je direktiva! jcxz dalje petlja: mov AL, [SI] cmp ES: [DI], AL jne razliciti inc SI inc DI loop petlja jednaki: razliciti: . . . dalje: . . . mov AX, SEG niz 1 mov DS, AX mov SI, OFFSET niz 1 mov AX, SEG niz 2 mov ES, AX mov DI, OFFSET niz 2 mov CX, LENGTH niz 1 ; LENGTH "vraća" veličinu ; rezervisanog prostora jcxz dalje cld petlja: cmpsb jne razliciti loop petlja jednaki: razliciti: dalje: . . .
Poređenje dva niza mov AX, SEG niz 1 mov DS, AX mov SI, OFFSET niz 1 mov AX, SEG niz 2 mov ES, AX mov DI, OFFSET niz 2 mov CX, LENGTH niz 1 ; LENGTH je direktiva! jcxz dalje petlja: mov AL, [SI] cmp ES: [DI], AL jne razliciti inc SI inc DI loop petlja jednaki: razliciti: . . . dalje: . . . mov AX, SEG niz 1 mov DS, AX mov SI, OFFSET niz 1 mov AX, SEG niz 2 mov ES, AX mov DI, OFFSET niz 2 mov CX, LENGTH niz 1 ; LENGTH "vraća" veličinu ; rezervisanog prostora jcxz dalje cld petlja: cmpsb loope petlja jne razliciti jednaki: razliciti: dalje: . . .
Inicijalizovanje niza mov AX, SEG niz 1 mov DS, AX mov AL, 0 mov SI, OFFSET niz 1 mov CX, LENGTH niz 1 jcxz dalje petlja: mov [SI], AL inc SI loop petlja dalje: . . . mov AX, SEG niz 1 mov ES, AX mov AL, 0 mov SI, OFFSET niz 1 mov CX, LENGTH niz 1 jcxz dalje cld petlja: stosb loop petlja dalje: . . .
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 niz 1 mov DS, AX mov SI, OFFSET niz 1 mov AX, SEG niz 2 mov ES, AX mov DI, OFFSET niz 2 mov CX, LENGTH niz 1 jcxz dalje ; LENGTH "vraća" veličinu ; rezervisanog prostora jcxz dalje cld petlja: movsb mov AX, SEG niz 1 mov DS, AX mov SI, OFFSET niz 1 mov AX, SEG niz 2 mov ES, AX mov DI, OFFSET niz 2 mov CX, LENGTH niz 1 rep movsb loop petlja dalje: . . . ; LENGTH "vraća" veličinu ; rezervisanog prostora jcxz dalje cld
Traženje zadate vrijednosti u nizu mov AX, SEG niz 1 mov ES, AX mov AL, 'a' mov DI, OFFSET niz 1 mov CX, LENGTH niz 1 jcxz dalje cld petlja: scasb mov AX, SEG niz 1 mov ES, AX mov AL, 'a' mov DI, OFFSET niz 1 mov CX, LENGTH niz 1 repne scasb loopne petlja jne dalje nadjen: dec DI. . . dalje: . . . cld
Poređenje dva niza mov AX, SEG niz 1 mov DS, AX mov SI, OFFSET niz 1 mov AX, SEG niz 2 mov ES, AX mov DI, OFFSET niz 2 mov CX, LENGTH niz 1 ; LENGTH "vraća" veličinu ; rezervisanog prostora jcxz dalje cld petlja: cmpsb jne razliciti loop petlja jednaki: razliciti: dalje: . . . mov AX, SEG niz 1 mov DS, AX mov SI, OFFSET niz 1 mov AX, SEG niz 2 mov ES, AX mov DI, OFFSET niz 2 mov CX, LENGTH niz 1 ; LENGTH "vraća" veličinu ; rezervisanog prostora jcxz dalje cld repe cmpsb jne razliciti jednaki: razliciti: dalje: . . .
Inicijalizovanje niza mov AX, SEG niz 1 mov ES, AX mov AL, 0 mov SI, OFFSET niz 1 mov CX, LENGTH niz 1 jcxz dalje cld petlja: stosb loop petlja dalje: . . . mov AX, SEG niz 1 mov ES, AX mov AL, 0 mov SI, OFFSET niz 1 mov CX, LENGTH niz 1 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 1 trazi PROC NEAR inc BX push BP scasb mov BP, SP push BX jne ponovo push CX mov CX, BX push DI jmp ponovo push ES cld kraj: mov AX, CX mov AL, [BP+4] pop ES LES DI, [BP+6] ; ES=BP[8], DI=BP[6] pop DI mov CX, -1 ; indeks poslednjeg nadj. pop CX mov BX, -1 ; indeks tekućeg elementa pop BX pop BP ponovo: cmp ES: BYTE PTR[DI], '$' ret je kraj trazi ENDP
Rešenje 1 trazi 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 ; 0 ffffh 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 BP ret trazi ENDP
- Slides: 63