1 / 63

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.

jerrod
Download Presentation

8086 asembler

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


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

  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 – pomoćni segment sa podacima. • Podrazumijevani segment za podatke se može u određenim situacijama zamijeniti.

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

  6. 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]

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

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

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

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

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

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

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

  14. 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)

  15. 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),

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

  17. Viši programski jezici: if (CX==0) {blok1 } else { blok2} Blok1 i blok2 nizovi instrukcija Asembler: CMP CX,0JE blok1JMP blok2blok1: …JMP daljeblok2: …dalje: … if-then-else Izračunavanje uslova. Ako je tačan, skače na blok1. U suprotnom na blok2.

  18. 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 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 ;izračunavanje uslovaJNE blok2 ;CX!=0 => blok2 blok1: … ;u suprotnom nastavlja JMP dalje blok2: … dalje: …

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

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

  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 ;čuva PSW na steku • POPF ;restaurira PSW sa steka

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

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

  26. Primjer – ispis novog reda nl DB 10, 13, ‘$’ ;rezervacija 3B sa datim početnim ;vrijednostima ... newLine PROC NEAR push DX ;čuvanje originalnih vrijednosti push DS ;registara koji se mijenjaju mov DX, SEG nl ;učitavanje 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 ;vraćanje originalnih vrijednosti pop DX ret ;povratak iz potprograma, pop PC newLine ENDP

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

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

  29. Zapis poziva funkcije Bliski poziv Daleki poziv SP Loc[m] -2*m SP Loc[m] -2*m ... ... Loc[1] -2 Loc[1] -2 BP BP BPstaro BPstaro retPC +2 retPC +2 Param[1] +4 retCS +4 ... Param[1] +6 Param[n] +2+2*n ... Param[n] +4+2*n

  30. Primjer prosleđivanja parametara preko steka – ispis stringa newLine PROC NEAR push BP mov BP, SP push DX ;čuvanje originalnih vrijednosti push DS ;registara koji se mijenjaju mov DX, [BP+6] ;učitavanje segmenta sa steka mov DS, DX ;u registar DS mov DX, [BP+4] ;i ofseta sa steka u DX mov AH, 9 ;kod usluge za ispis stringa int 21h ;poziv servisa pop DS ;vraćanje originalnih vrijednosti pop DX pop BP ret ;povratak iz potprograma, pop PC newLine ENDP

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

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

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

  34. 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 21h ;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

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

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

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

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

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

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

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

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

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

  44. Uslovno prevođenje • IFDEF name – uslovno preveđenje. • ELSE • ENDIF

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

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

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

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

  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 ES:[DI], 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 "vraća" veličinu; 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:...

More Related