Upload
aleksandra-djuric
View
215
Download
0
Embed Size (px)
Citation preview
8/18/2019 124393592-Uvod-u-Asembler-8086
1/42
Uvod u Asembler 8086
Arhitektura procesora− Arhitektura procesora predstavlja programski model procesora
− Organizacija procesora predstavlja njegovu internu strukturu
− Programer mora biti svesan arhitekture, ali ne i organizacije procesora
− Na primer, keš memorija predstavlja element organizacije, ali ne i arhitektureprocesora
− Arhitektura obuhvata u osnovi:
− skup registara
− memorijski model
− kodove instrukcija
− na
ine adresiranja
Mašinski jezik− Procesor izvršava mašinske instrukcije – naredbe obrazovane od rei
odreenog broja bitova
− Jezik koji procesor "razume" se naziva mašinskim jezikom
− Program na mašinskom jeziku se zapisuje u binarnom obliku
− Kompaktniji, ali još manje razumljiv, oblik zapisa je oktalni ili heksadecimalni
− Prvi raunari su programirani upravo na mašinskom jeziku
− Za programera je ovakav oblik neprihvatljivo neudoban
Simbolini mašinski (asemblerski) jezik i asembler− Programiranje na mašinskom jeziku se moralo prilagoditi programeru
− Definisani su simboli za instrukcijske kodove, naine adresiranja, registre
− Simboli su mnemoniki tako da je nivo razumljivosti programa prihvatljiv
− Jezik koji koristi simbole nazvan je simbolikim mašinskim ili asemblerskim jezikom
− Prevodilac sa simbolikog mašinskog na mašinski jezik naziva se asembler
− U žargonu se asemblerski jezik esto zove takoe asemblerom ("program naasembleru")
− Jedna instrukcija simbolikog mašinskog jezika se prevodi u tano jednuinstrukciju MJ
− Jedna instrukcija višeg programskog jezika (npr. C) se prevodi u višeinstrukcija MJ
8/18/2019 124393592-Uvod-u-Asembler-8086
2/42
− Kao i viši programski jezici, asemblerski jezik definiše svoju sintaksu isemantiku
Procesor i8086− Na kursu se izuava jezik za Intelov procesor i8086 iz sledeih razloga:
− rasprostranjenost Intelove familije procesora (IBM PC se temelji na ovimprocesorima)
− asembler za i8086 je baza za modernije procesore Intelove familije (npr. Pentium I,II, III)
− nisu potrebna znanja nekih sofistinih koncepata arhitekture raunara
− Dvoadresna mašina – instrukcija može imati 0, 1 ili 2 operanda
− Segmentni model memorije – postoje segmentni registri koji omoguavajurelokaciju
− Procesor i8086 nema ortogonalnu arhitekturu
− ne može se svaki nain adresiranja primeniti na svaku instrukciju
Instrukcije, direktive, deklaracije i definicije− Naredbe koje se prevode u mašinske instrukcije nazivaju se asemblerskim
instrukcijama
− Direktive kojima se uvode imena nazivaju se deklaracije
− Deklaracije kojima se alocira memorija nazivaju se definicije
− Direktive kojima se uvode imena nazivaju se deklaracije
− Deklaracije kojima se alocira memorija nazivaju se definicije
Arhitektura procesora i8086
8/18/2019 124393592-Uvod-u-Asembler-8086
3/42
Registri− i8086 ima 4 grupe registara:
− opštenamenski registri (general registers)
− segmentni registri (segment registers)
− programski broja (pokaziva instrukcije – instruction pointer )− registar indikatora ( flags)
Opštenamenski registri− i8086 ima 8 opštenamenskih 16-bitnih registara:
− Registri su podeljeni u dve grupe:
− registri podataka
− pokazivaki i indeksni registri
− Slika prikazuje skup svih opštenamenskih registara procesora i8086:
H L15
8
7
0
(AH) AX (AL) akumulator (accumulator )
(BH) BX (BL) bazni (base)
(CH) CX (CL) broja (count )
(DH) DX (DL) registar podataka (data)
registri
podataka
SP pokaziva steka (stack pointer )
BP pokaziva baze (base pointer )
SI indeks izvora (source index)
DI indeks odredišta (destination index)
pokazivai i
indeksi
− Registri podataka se mogu koristiti na dva naina:
− kao 16 bitne jedinice (AX)
− kao dva 8-bitna registra (AH i AL)
− Pokazivaki i indeksni registri se uvek koriste kao 16-bitni
− Neki registri se koriste implicitno u nekim operacijama
Segmentni registri− Adresni prostor procesora i8086 je jedan megabajt (1M)
− Celokupan adresni prostor je podeljen u logike segmente veliine 64K
− Procesor može pristupati istovremeno do 4 segmenta
8/18/2019 124393592-Uvod-u-Asembler-8086
4/42
− Bazne adrese ta 4 segmenta nalaze se u 4 specijalizovana 16-bitna segmentnaregistra
− Slika prikazuje skup segmentnih registara procesora i8086:
15
0CS segment koda (code segment )
DS segment podataka (data segment )
SS segment steka (stack segment )
ES ekstra segment (extra segment )
− Registar CS ukazuje na tekui segment sa instrukcijama
− instrukcije se dohvataju iz ovog segmenta memorije
− Registar DS ukazuje na tekui segment sa podacima
− u opštem sluaju segment sadrži programske promenljive
− Registar SS ukazuje na tekui stek
− operacije nad stekom se izvršavaju nad ovim segmentom
− Registar ES ukazuje na tekui ekstra segment
− tipino se koristi za dodatni prostor za podatke (prostor za dinamiku alokaciju - heap)
− Segmentni registri su pristupani programeru
− Dobra programerska praksa nalaže da se segmentni registri koriste na disciplinovannain
Pokaziva instrukcije− Pokaziva instrukcije ( Instruction Pointer ) IP je 16-bitni i sadrži adresu naredne
instrukcije
− Ova adresa je tzv. "ofset" adresa, t.j. relativna adresa u odnosu na poetak segmentakoda
− IP odgovara konvencionalnom pojmu programskog brojaa (Program Counter ) PC
− On se automatski inkrementira pri izvršenju (dohvatanju) svake instrukcije
Ne može se direktno pristupati IP, ali odreene instrukcije njime manipulišu
Indikatori− Procesor i8086 ima 6 1-bitnih statusnih indikatora i 3 1-bitna kontrolna indikatora
− Indikatore statusa postavlja izvršna jedinica da reflektuju osobine rezultata ALUoperacije
− Postoji grupa instrukcija koje omoguavaju da program menja tok na osnovu ovihindikatora
8/18/2019 124393592-Uvod-u-Asembler-8086
5/42
− Programi mogu postavljati ili brisati kontrolne indikatore da menjaju procesorskeoperacije
kontrolni statusni
T
F
D
F
IF O
F
S
F
Z
F
A
F
P
F
C
Fprenos (carry)
parnost ( parity)
dodatni prenos (auxiliary carry)
nula ( zero)
znak (sign)
prekoraenje (overflow)
omoguen prekid (interrupt-enable)
smer (direction)
zamka (trap)
− CF: ako je 1 – bio je prenos iz najvišeg ili pozajmica u najviši bit 8- ili 16-bitnogrezultata
− indikator se koristi iz instrukcija koje sabiraju/oduzimaju višebajtne brojeve
− instrukcije rotacije mogu izolovati pojedini bit iz memorije ili registra u CF indikatoru
− PF: ako je 1- rezultat ima parnu parnost (paran broj jedinica)
− indikator se može koristiti za proveru grešaka pri prenosu podataka
− AF: ako je 1 – bio je prenos/pozajmica izmeu gornja i donja 4 bita u bajtu
− koristi se iz decimalnih aritmetikih instrukcija
− ZF: ako je 0 – rezultat operacije je 0
− SF: ako je 1 – najviši bit rezultata je 1
− negativni brojevi su predstavljeni u komplementu dvojke pa SF predstavlja znak (1 –negativan)
− OF: ako je 1 – dogodilo se aritmetiko prekoraenje
− znaajna cifra je izgubljena jer veliina rezultata prevazilazi kapacitet odredišta
− postoji instrukcija Interrupt On Overflow koja e generisati prekid u ovakvoj situaciji
− IF: ako je 1- dozvoljava procesoru da prepoznaje spoljašnje maskabilne prekide
− nema uticaja na spoljašnje nemaskabilne (NMI) i interno generisane prekide
− DF: ako je na 1 – izaziva autodekrementiranje kod string instrukcija (0 –autoinkrementiranje)
− TF: ako je 1 – procesor radi u single-step režimu za testiranje
− u ovom režimu procesor generiše interni prekid posle svake instrukcije
8/18/2019 124393592-Uvod-u-Asembler-8086
6/42
Memorija− Memorija je organizovana u niz 8-bitnih bajtova (adresibilna jedinica je 1 bajt)
− Instrukcije, podaci dužine 1 bajta ili 2 bajta (rei) mogu biti smešteni naproizvoljnoj adresi
− Promenljive dužine rei koje su na neparnim adresama nazivaju se neporavnatim(unaligned )
− nije mogu 16-bitni prenos neporavnatih rei
− Intelova konvencija: rei se smeštaju tako da je viši bajt na višoj adresi
− Primer: vrednost rei koja poinje na adresi 322H je: 7412H
322H 000
1
001
0
323H 011
1
010
0
− Dvostruke rei su specijalna kategorija podataka koji se nazivaju pokazivai( pointers)
− koriste se da adresiraju podatke i instrukcije koji su izvan tekuih segmenata
− niža re pokazivaa sadrži ofset-adresu, a viša segment-adresu
− rei pokazivaa se smeštaju konvencionalno: bajt na višoj adresi sadrži 8 znaajnijih bitarei
− Primer: vrednost pokazivaa koji poinje na adresi 104H je:7490H(segment):6512H(ofset)
104H 000
1
001
0105H 011
0
010
1
106H 100
1
000
0
107H 011
1
010
0
Segmentacija− Segment je logika jedinica memorije koja može biti do veliine od 64Kbyte
− Svaki segment obuhvata kontinualni adresni prostor
− Svakom segmentu je (programski) dodeljena bazna adresa
− bazna adresa predstavlja adresu prve lokacije koja pripada segmentu u memorijskomprostoru
− Segmenti poinju na 16-bajtnim memorijskim jedincama (paragrafima)
− Nema drugih ogranienja – segmenti mogu biti:
8/18/2019 124393592-Uvod-u-Asembler-8086
7/42
− susedni, razdvojeni, delimino ili potpuno preklopljeni
− Fizika lokacija u memoriji može pripadati veem broju logikih segmenata
− Segmentni registri pokazuju (sadrže bazne adrese) na 4 tekua adresibilna segmenta
− Program obezbeuje pristup drugim segmentima tako što menja sadržaj segmentnih
registara− Segmentna organizacija podržava modularno projektovanje softvera
Generisanje fizike adrese− Fizika adresa je 20-bitna vrednost koja jednistveno identifikuje svaku bajt-lokaciju
− Fizika adresa je u opsegu 0-FFFFFH t.j. unutar 1M adresnog prostora
− Programi radije manipulišu logikim umesto fizikim adresama
− na taj nain nije potrebno a priori znanje o mestu na koje se locira program u memoriji
− takoe, tako se olakšava dinamiko upravljanje memorijskim resursima
− Logika adresa se sastoji od ofset-adrese i segment-adrese− Obe adrese su neoznaene 16-bitne veliine
− Bajt adresiran najmanjom adresom u segmentu ima ofset-adresu 0
− Više razliitih logikih adresa se može mapirati u istu fiziku adresu
− Na primer: 2C1:3H =2C0:13H (sintaksa: < segment-adresa>:< ofset-adresa>H)
− Uvek kada procesor pristupa memoriji – fizika adresa se izraunava iz logike
− to se dogaa kada procesor dohvata instrukciju ili ita/piše podatak
− Fizika adresa se izraunava tako što se:
− 16-bitna segment-adresa pomera za 4 bita ulevo− pomerena segment-adresa sabere sa ofset-adresom
− Primer: 1234:0022H=12340H+0022H=12362H
− Dobijanje logike adrese zavisi od vrste pristupa memoriji:
Vrsta pristupa Podrazumevan
a
baza segmenta
Alternativna
baza
segmenta
Ofset
Dohvatanje instrukcije CS - IP
Operacija na steku SS - SP
Promenljiva (osimdonjih)
DS CS,ES,SS efektivna adresa
Izvor string DS CS,ES,SS SI
Odredište string ES - DI
BP korišen kao bazni
reg.
SS CS,DS,ES efektivna adresa
8/18/2019 124393592-Uvod-u-Asembler-8086
8/42
− Ofset memorijske promenljive se izraunava na osnovu naina adresiranja
− nain adresiranja se zadaje u instrukciji
− rezultat se zove efektivna adresa (EA) operanda
− Stringovi se adresiraju drugaije u odnosu na druge promenljive (videti tabelu)
− Kada se BP koristi kao bazni registar, podrazumeva se da je promenljiva na steku− Alternativni registar sa segment-adresom se zadaje kao prefiks instrukcije
− prefiks je jednobajtna mašinska instrukcija
− ona kaže procesoru koji segment-registar da koristi za pristup promenljivoj u sledeojinstrukciji
Implementacija steka− Stek se implementira u memoriji i pristupa mu se pomou SS i SP registara
− Sistem može imati proizvoljan broj stekova, a max veliina steka je 64K
− Pokušaj prekoraenja steka završava "gaženjem" poetka steka− SP pokazuje na vrh steka (Top Of the Stack - TOS )
− SP sadrži ofset TOS-a u odnosu na baznu adresu segmenta koju sadrži SS
− Stek raste od viših prema nižim adresama
− Bazna adresa steka koju sadrži SS nije dno steka – stek raste prema baznoj adresi
− Lokacije na steku su 16-bitne (na stek se stavljaju i sa njega uzimaju rei od 16 bita)
− Re se stavlja na stek dekrementiranjem SP za 2 i upisom rei na novi TOS
− Re se uzima sa steka itanjem sa TOS i inkrementiranjem SP za 2
Posveene i rezervisane lokacije− Dve oblasti na ekstremno niskim i visokim adresama su posveene specifinim
funkcijama
− Lokacije od 0 do 7FH (128 bajtova) su posveene tabeli prekidnih vektora
− Lokacije od FFFF0H do FFFFFH (16 bajtova) su posveene za "boot" sistema
Ulaz/izlaz− Ulazno/izlazni prostor je razdvojen od memorijskog
− U/I prostor može da se prilagodi na 64K 8-bitnih portova ili 32K 16-bitnih
− IN i OUT instrukcije prenose podatke izmeu akumulatora i portova u U/I prostoru− AL se koristi za bajt, a AX za re
− U/I prostor nije segmentiran – U/I adresa se jednostavno pojavljuje na donjih 16adresnih linija
− Razni oblici U/I instrukcija dopuštaju da U/I adresa bude specificirana
− kao fiksna vrednost u instrukciji
8/18/2019 124393592-Uvod-u-Asembler-8086
9/42
− kao promenljiva vrednost u DX registru
− Lokacije na U/I adresama od F8H do FFH su rezervisane od strane proizvoaa
Memorijski mapiran ulaz/izlaz− U/I ureaji mogu biti smešteni i u memorijski adresni prostor procesora
− Ukoliko ureaj odgovara kao memorijska komponenta – CPU ne zna za razliku
− Memorijski mapiran U/I obezbeuje veu fleksibilnost programiranja
− proizvoljna instrukcija koja pristupa memoriji se može koristiti za pristup U/I portu
− MOV instrukcija može prenositi podatke izmeu U/I porta i proizvoljnog registra
− AND i OR se mogu koristiti da se manipuliše bitima u registrima U/I ureaja
− mogu se koristiti prednosti raznovrsnosti adresnih naina
8/18/2019 124393592-Uvod-u-Asembler-8086
10/42
Naini adresiranja
Uvod− Procesor i8086 nudi vei broj razliitih naina adresiranja
−
Operandi mogu biti u registrima, u instrukciji samoj, u memoriji i na U/Iportovima
− Adresa operanada u memoriji i na U/I portovima može biti izraunata na višenaina
Raunanje adrese operanda u memoriji− Fizika adresa se rauna dodavanjem ofset-adrese na ulevo pomerenu segment-
adresu
− Izraunata ofset-adresa se naziva efektivnom adresom (EA)
− EA je 16-bitna adresa koja odreuje pomeraj u odnosu na poetak segmenta
− Nain raunanja adrese operanda u memoriji odreen je u drugom bajtu instrukcije
− EA = pomeraj (displacement ) + sadržaj baznog registra + sadržaj indeksnogregistra
− Pomeraj je 8- ili 16-bitni broj koji se sadrži u instrukciji
− Izvodi se iz pozicije imena operanda (promenljive ili labele) u programu
− Programer može i eksplicitno da specificira pomeraj
BX
BP
DI
SI
ili
ili
ili
+
BP DI
BX SI
ili ili
+ +
++
ili
pomer
CS 000
SS 000
DS 000
ES 000
ili
ili
fizika adresa
Efektivn
a
Kodiranou
Eksplicitno
Podrazumeva
no
8/18/2019 124393592-Uvod-u-Asembler-8086
11/42
− Za razliku od pomeraja koji je konstantan – bazni, odnosno indeksni, registar jepromenljiv
− To omoguuje da se iz jedne instrukcije pristupa raznim memorijskim lokacijama
Registarsko adresiranje− U instrukciji se navode adrese registara u kojima su operandi
− Instrukcije koje specificiraju samo operande u registrima su najkompaktnije inajbrže
− adrese registara se kodiraju u instrukciji sa par bitova
− operacija se u celini obavlja unutar CPU (nema ciklusa na magistrali)
− Registri mogu sadržati izvorne, odredišne ili obe vrste operanada
− Primer: MOV AX, CX ; kopira se sadržaj registra CX uregistar AX
Neposredno adresiranje− U instrukciji se neposredno zadaju sami operandi koji su konstante
− Podaci mogu biti 8 ili 16 bita dužine
− Pristup neposrednim operandima je brz jer se dohvataju iz instrukcijskog redaekanja
− Operandi mogu biti samo izvorni i moraju sadržati konstantne vrednosti
− Primer: MOV AX, 5 ; kopira se 5 u registar AX
Direktno adresiranje
− EA se izraunava samo na osnovu pomeraja
− Ovo je najjednostavnije memorijsko adresiranje – nisu ukljueni nikakvi registri
− Tipino se koristi za pristup jednostavnim promenljivama – skalarima
− Primer: MOV AX, X ; kopira se sadržaj X u registar AX
Registarsko indirektno adresiranje− EA se izraunava na osnovu jednog baznog ili indeksnog registra
− Jedna instrukcija može pristupati razliitim memorijskim lokacijama
− postiže se tako što se vrednost baznog ili indeksnog registra menja
− LEA ( Load Effective Address) ili aritmetike instrukcije se mogu koristiti za ažuriranjeregistra
OpCod
Mod Displacement
EA
8/18/2019 124393592-Uvod-u-Asembler-8086
12/42
− Kod JMP i CALL instrukcije se proizvoljan registar može koristiti za indirektnoadresiranje
− Primer: MOV AX,[BX]; kopira se sadržaj sa adrese iz BX uAX
Bazno adresiranje− EA se rauna kao suma pomeraja i sadržaja registra BX ili BP
− Ako se BP specificira kao bazni registar to izaziva da se pristupa operandu u steksegmentu
− Bazno adresiranje pomou BP je pogodan nain pristupa podacima na steku
− podaci na steku mogu biti parametri koji se prenose u potprogram
− Bazno adresiranje omoguava i jednostavno pristupanje jednakim strukturama koje su locirane na razna mesta u memoriji
− bazni registar se menja da pokazuje na strukturu, a pomeraj odreuje odgovarajui lanstrukture
− razliitim instancama strukture se pristupa jednostavnom izmenom baznog registra
− Primeri: MOV AX,[BX]+X ; kopira se sadržaj sa efektivneadrese
MOV AX,X[BX] ; sadrzaj(BX)+ofset(X) u AX
MOV AX,[BX+X]MOV AX,[BX].X
Indeksirano adresiranje− EA se rauna kao suma pomeraja i sadržaja indeksnog registra SI ili DI
−
Indeksno adresiranje seesto koristi za pristup elemetu nekog niza
− pomeraj locira poetak niza a vrednost indeksnog registra selektuje jedan element
− pošto su svi elementi jednake veliine, primenjuje se jednostavna indeksna aritmetika
Primeri: MOV AX,[SI]+X ; kopira se sadržaj saefektivne adrese
MOV AX,X[SI] ; sadrzaj(SI)+ofset(X)
EA
OpCod
Mod BX
BP
SI
DI
or
or
or
OpCod
Mod Displacement
EABX
BPor +
OpCod
Mod Displacement
EASI
DIor +
8/18/2019 124393592-Uvod-u-Asembler-8086
13/42
u AX
MOV AX,[SI+X]
MOV AX,[SI].X
Bazno indeksirano adresiranje
− EA se rauna kao suma pomeraja, sadržaja baznog i sadržaja indeksnog registra
− Veoma fleksibilan nain adresiranja, jer se dve komponente mogu menjati u vremeizvršenja
− Pogodan nain za proceduru da adresira niz alociran na steku
− BP sadrži ofset referentne take na steku (TOS nakon smeštanja parametara i povratneadrese)
− pomeraj (displacement ) sadrži ofset poetka niza u odnosu na referentnu taku
− indeksni registar se koristi da adresira pojedine elemente niza
− Takodje, nizovi koji se nalaze u strukturama i matrice se mogu efikasno obraivati
ovako
Primer: MOV AX,[BX].X[SI] ; kopira se sadržaj sa EA;
sadr(BX)+sadr(SI)+ofset(X) u AX
Adresiranje stringova− String instrukcije ne koriste normalne naine memorijskog adresiranja za pristup
operandima
− Indeksni registri se koriste implicitno: SI za EA izvornog operanda i DI za EAodredišnog
− Na poetku string instrukcije, podrazumeva se da
− SI pokazuje na 1. bajt ili re izvornog stringa
− DI pokazuje na 1. bajt ili re odredišnog stringa
− Tokom repetitivne string operacije
− CPU automatski menja SI i DI za pristup susednim elementima
Primer: MOVS D,S; kopira jedan bajt sa adrese DS:SI naadresu ES:DI
OpCod
Mod Displacement
EA
BX
BPor
SIDI
or
+
+
8/18/2019 124393592-Uvod-u-Asembler-8086
14/42
Adresiranje U/I portova− Ako je U/I port memorijski mapiran,
proizvoljan nain adresiranja memorijskog operanda se može primeniti (ak i
string)
− Za U/I portove koji su locirani u U/I adresni prostor mogu se koristiti dva nainaadresiranja
− direktno adresiranje porta− indirektno adresiranje porta
− U direktnom adresiranju broj porta je 8-bitni neposredni operand
− ovo omoguava fiksni pristup portovima od 0 do 255
− Indirektno adresiranje porta je slino registarskom indirektnom adresiranjumemorijskog op.
− U indirektnom adresiranju broj porta se uzima iz DX registra
− ovo omoguava fleksibilni pristup portovima od 0 do 65535
− program najpre definiše adresu porta upisom u DX, a zatim IN/OUT instrukcijom
pristupa portuPrimeri:
IN AX,15; direktno adresiranje porta 15 (cita se u AX)
OUT DX,AX; indirektno adresiranje porta sa adresom u DX
; (salje se sadrzaj AX)
OpCod
SI Source
DI Destination
Direktno adresiranje
Port
OpCod
Data
Indirektno adresiranje
Port
OpCod
DX
8/18/2019 124393592-Uvod-u-Asembler-8086
15/42
Skup instrukcija
Uvod− U veini instrukcija mogu figurisati registarski, memorijski i neposredni operandi
−
Nad memorijskim lokacijama se mogu vršiti operacije – nije potrebnoprebacivanje u registre
− 8086 ima repertoar od oko 100 instrukcija simbolikog mašinskog jezika
− Procesor raspoznaje oko 300 razliitih mašinskih instrukcija
− MOV instrukcija prenosi bajt ili re iz registra ili memorije ili neposredno u registar ilimemoriju
− procesor raspoznaje 28 razliitih mašinskih MOV instrukcija (npr. "prenos bajta iz R uM")
− Na ovaj nain se kombinuje
− jednostavnost programiranja na simbolikom nivou
− efikasnost smeštanja instrukcija na mašinskom nivou
− Jednoj SMJ (ASM) instrukciji odgovaraju razliiti formati (krai i duži) mašinskeinstrukcije
− Npr. programer piše INC, a asembler na osnovu operanda odreuje mašinskuinstrukciju
Instrukcije za prenos podataka− Postoji 14 instrukcija
− za prenos podataka izmeu memorije i registara i izmeu registara i U/I porta
− za manipulisanje stekom i za prenos indikatora
− za punjenje segmentnih registara
Opštenamenske instrukcije za prenos− MOV odredište, izvorište (Move)
− prenosi bajt ili re od izvornog do odredišnog operanda
− PUSH izvorište (Push)
− dekrementira SP za 2 pa prenosi re od izvorišta do vrha steka na koji ukazuje SP
− esto se koristi za smeštanje parametara na stek pre poziva procedure
− osnovni nain za smeštanje privremenih podataka na stek
− POP odredište (Pop)
− prenosi re sa vrha steka na koji ukazuje SP do odredišta, pa tada inkrementira SP za 2
− može se koristiti za prenos privremenih promenljivih sa steka u registre ili memoriju
− XCHG odredište, izvorište (Exchange)
− zamenjuje sadržaje izvorišta i odredišta (bajt ili re)
8/18/2019 124393592-Uvod-u-Asembler-8086
16/42
− kada se koristi sa LOCK prefiksom može testirati i postaviti (test and set ) semafor
− semafor se korsiti da zaštiti zajedniki resurs u multiprocesorskom okruženju XLAT translaciona_tabela (Translate)
− menja bajt u AL registru sa bajtom iz 256-bajtne translacione tabele
− AL treba pre izvršenja instrukcije da sadrži ofset u tabeli− podrazumeva se da e se BX koristiti da ukaže na poetak tabele
− prvi bajt u tabeli ima ofset 0
− korisno za translaciju karaktera iz jednog koda u drugi (npr ASCII u EBCIDIC)
Ulaz/izlaz− IN akumulator, port (Input)
− prenosi bajt ili re sa ulaznog porta u AL ili AX registar
− broj porta može biti specificiran pomou neposredne bajt-konstante ili pomou DXregistra
− neposredno adresiranje porta dopušta portove 0-255, a adresiranje preko DX portove 0-65535
− OUT port, akumulator (Output)
− prenosi bajt ili re iz AL ili AX registra na izlazni port
− broj porta može biti specificiran pomou neposredne bajt-konstante ili pomou DXregistra
Prenos adresa− Instrukcije ne manipulišu sadržajem ve adresom promenljivih
− Najkorisnije su za obradu lista, bazne promenljive i operacije nad stringovima− LEA odredište, izvorište (Load Effective Address)
− prenosi ofset izvorišnog operanda (ne njegovu vrednost) u odredište
− izvorišni operand mora biti memorijski operand
− odredišni operand mora biti 16-bitni opštenamenski registar
− ne utie na indikatore
− koristi se da napuni neke registre za potrebe drugih instrukcija(npr. BX registar adresom translacione tabele koju koristi XLAT instrukcija)
− LDS odredište, izvorište (Load pointer using DS)
− prenosi 32-bitnu pokazivaku promenljivu iz izvorišnog operanda u odredišni operand iDS
− izvorišni operand mora biti u memoriji
− re ofseta pokazivaa se prenosi u odredište koje može biti 16-bitni opštenamenskiregistar
− re segmenta pokazivaa se prenosi u DS
8/18/2019 124393592-Uvod-u-Asembler-8086
17/42
− za obradu stringa koji nije u tekuem segmentu podataka pogodno je specificirati SIkao odredište(string instrukcije smatraju da je izvorišni string u tekuem segmentu podataka, a SI
sadrži ofset)
− LES odredište, izvorište (Load pointer using ES)
− prenosi 32-bitnu pokazivaku promenljivu iz izvorišnog operanda u odredišni operand iES
− izvorišni operand mora biti u memoriji
− re ofseta pokazivaa se prenosi u odredište koje može biti 16-bitni opštenamenskiregistar
− re segmenta pokazivaa se prenosi u ES
− za obradu stringa koji nije u tekuem ekstra segmentu pogodno je specificirati DI kaoodredište
(odredišni string mora biti u ekstra segmentu podataka, a DI mora sadržati ofset)
Prenos indikatora− Indikatori imaju sledee pozicije:
- - - - OF
DF
IF TF
SF
ZF
- AF
- PF
- CF
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
− LAHF (Load register AH from Flags)
− kopira SF, ZF, AF, PF i CF u bite 7, 6, 4, 2 i 0 registra AH
− sadržaj bitova 5, 3 i 1 je nedefinisan
− indikatori se ne menjaju− primarna namena instrukcije je za konverziju 8080/8085 programa na 8086/8088
− SAHF (Store register AH into Flags)
− kopira bite 7, 6, 4, 2 i 0 registra AH u indikatore SF, ZF, AF, PF i CF
− OF, DF, IF i TF se ne menjaju
− primarna namena instrukcije je za konverziju 8080/8085 programa na 8086/8088
− PUSHF (Push Flags)
− dekrementira SP za 2 i tada prenosi sve indikatore u re na vrhu steka
− indikatori se ne menjaju
− služi za smeštanje indikatora na stek pri pozivu potprograma
− nain za izmenu TF indikatora (nema direktne instrukcije): PUSHF, izmena na steku,POPF
− POPF (Pop Flags)
− prenosi specifine bite iz rei na vrhu steka u indikatore, a zatim inkrementira SP za 2
− služi za restauraciju indikatora pri povratku iz potprograma
8/18/2019 124393592-Uvod-u-Asembler-8086
18/42
Aritmetike instrukcije− Postoji 20 aritmetikih instrukcija podeljenih u grupe:
− sabiranje
− oduzimanje
− množenje− delenje
Aritmetiki formati podataka− Postoje 4 tipa podataka:
− neoznaeni binarni (cardinals)
− oznaeni binarni (integers)
− neoznaeni pakovani decimalni
− neoznaeni nepakovani decimalni
− Binarni brojevi mogu biti dužine 8 ili 16 bita− Decimalni brojevi se smeštaju u bajtove
− dve cifre u bajt za pakovane decimalne
− jedna cifra u bajt za nepakovane decimalne
− Procesor uvek podrazumeva da operandi u aritmetikoj instrukciji sadrže valjanebrojeve
− Loši podaci mogu proizvesti nepredvidive rezultate
Neoznaeni binarni brojevi−
Mogu biti dužine 8 ili 16 bita− Svi biti odreuju vrednost nenegativnog broja
− Opseg 8-bitnih brojeva je 0-255
− Opseg 16-bitnih brojeva je 0-65535
− Mogue su operacije sabiranja, oduzimanja, množenja i deljenja
Oznaeni binarni brojevi (integers )− Mogu biti dužine 8 ili 16 bita
− Najviši (krajnje levi) bit se interpretira kao znak broja: 0=nenegativni, 1=negativni
brojevi− Negativni brojevi se predstavljaju u standardnoj notaciji drugog komplementa
− Opseg 8-bitnih brojeva je -128-+127
− Opseg 16-bitnih brojeva je -32768-+32767
− Sabiranje i oduzimanje se vrši pomou instrukcija za neoznaene binarne brojeve
− Za množenje i deljenje oznaenih brojeva postoje posebne instrukcije
8/18/2019 124393592-Uvod-u-Asembler-8086
19/42
Pakovani decimalni brojevi− Smeštaju se kao neoznaene veliine dužine jednog bajta
− Bajt sadrži po jednu decimalnu cifru u svakoj svojoj polovini (nibli)
− Cifra u gornjoj polovini je veeg znaaja
− Vrednosti u opsegu 0-9 su validne u svakoj polovini bajta, tako da je opseg broja0-99
− Sabiranje i oduzimanje se izvršavaju u dva koraka:
− izvršava se neoznaena binarna operacija koja proizvodi privremeni rezultat u AL
− izvršava se instrukcija prilagoenja koja menja vrednost u AL u finalni pakovanidecimalni broj
− Ne postoje množenje i deljenje za pakovane decimalne brojeve
Nepakovani decimalni brojevi−
Smeštaju se kao neoznaene veli
ine dužine jednog bajta
− Vrednost broja je odreena donjom polovinom bajta (donja nibla)
− Vrednosti u opsegu 0-9 su validne i interpretiraju se kao decimalni brojevi
− Viša nibla mora biti 0 za množenje i deljenje, a za sabiranje i oduzimanje jeproizvoljna
− Sabiranje, oduzimanje i množenje se izvršavaju u dva koraka:
− izvršava se neoznaena binarna operacija koja proizvodi privremeni rezultat u AL
− izvršava se instrukcija prilagoenja koja menja AL u finalni nepakovani decimalni broj
− Deljenje se obavlja takoe u dva koraka:
− izvršava se prilagoenje deljenika (brojioca) u AL
− izvršava se neoznaena binarna operacija deljenja koja proizvodi finalni rezultat
ASCII cifre− ASCII karakteri koji sadrže cifre "0"-"9" su slini nepakovanim decimalnim
brojevima
− Razlika je u tome što gornja nibla ASCII cifre uvek sadrži vrednost 3
− Aritmetika za nepakovane decimalne brojeve se primenjuje za ASCII cifre poduslovima:
− viša nibla ASCII cifre se postavlja na 0 pre množenja ili deljenjanakon izvršenja operacije mora se upisati 3 u gornju niblu rezultata da se dobije ASCIIcifra
Aritmetike instrukcije i indikatori− Aritmetike instrukcije postavljaju 6 indikatora da ukažu na osobine rezultata
operacije
8/18/2019 124393592-Uvod-u-Asembler-8086
20/42
− Veina indikatora se može testirati nakon aritmetike instrukcije u instrukcijiuslovnog skoka
− Može se koristiti i INTO ( Interrupt on Overflow) instrukcija
− Razliite instrukcije razliito utiu na indikatore; ovde su navedena neka generalna
pravila− CF (Carry Flag)
− postavlja se ako kod sabiranja doe do prenosa iz najvišeg bita rezultata
− postavlja se ako kod oduzimanja doe do pozajmice u najviši bit rezultata
− za oznaeni prenos važi CF≠OF
− CF se može koristiti za detekciju neoznaenog prekoraenja
− instrukcije ADC i SBB, kao i RCL i RCR ukljuuju CF u operacije
− ADC i SBB se koriste za višebajtno (32-bita, 64-bita) sabiranje i oduzimanje
− AF ( Auxiliary Carry Flag)
− postavlja se ako kod sabiranja doe do prenosa iz najvišeg bita donje nible u gornju
− postavlja se ako kod oduzimanja doe do pozajmice iz gornje nible u najviši bit donjenible
− koristi se praktino samo kod instrukcija za decimalno prilagoenje
− SF (Sign Flag)
− aritmetike i logike instrukcije postavljaju SF da bude jednak najvišem bitu (7. ili 15.)rezultata
− za oznaene binarne brojeve SF e biti 0 za nenegativne i 1 za negativne brojeve
− uslovna instrukcija skoka koja zavisi od SF se može koristiti posle aritmetike operacije
− na taj nain tok programa može biti promenjen u zavisnosti od znaka rezultata operacije
− nakon operacija sa neoznaenim brojevima SF treba ignorisati
− ZF ( Zero Flag)
− aritmetike i logike instrukcije ga postavljaju ako je rezultat operacije 0
− postoji uslovna instrukcija skoka koja zavisi od ZF
− PF (Parity Flag)
− aritmetike i logike instrukcije ga postavljaju ako nižih 8 bita rezultata sadrži paranbroj 1
− može se koristiti za proveru parnosti (npr. kod ASCII karaktera)
− OF (Overflow Flag)
− postavlja se ako je rezultat operacije suviše veliki pozitivan ili suviše mali negativanbroj
− "suviše" se odreuje prema dužini odredišta operacije
− ukazuje na prekoraenje u aritmetici sa znakom
− može se ignorisati kada se radi aritmetika neoznaenih brojeva
8/18/2019 124393592-Uvod-u-Asembler-8086
21/42
− može se testirati uslovnom instrukcijom skoka ili INTO ( Interrupt on Overflow)instrukcijom
Sabiranje− ADD odredište, izvorište (Add )
− suma dva operanda koji mogu biti 8- ili 16-bitni zamenjuje odredišni operand
− oba operanda mogu biti oznaena ili neoznaena
− ADD menja AF, CF, OF, PF, SF i ZF
− ADC odredište, izvorište (Add with Carry )
− sabira dva operanda (koji mogu biti 8- ili 16-bitni) i CF te zamenjuje odredišni operandrezultatom
− oba operanda mogu biti oznaena ili neoznaena
− ADC menja AF, CF, OF, PF, SF i ZF
− može se koristiti da se pišu rutine za sabiranje brojeva dužih od 16 bita
− INC odredište (Increment)
− dodaje 1 na odredišni operand koji može biti 8- ili 16-bitni
− operand se tretira kao neoznaeni binarni broj
− INC menja AF, OF, PF, SF i ZF, a ne utie na CF
− AAA (ASCII Adjust for Addition)
− menja sadržaj registra AL u ispravan nepakovani decimalni broj tako što uisuje 0 ugornju niblu
− AAA menja AF i CF, a sadržaj OF, PF, SF i ZF je nedefinisan
− DAA (Decimal Adjust for Addition)− koriguje rezulatat u AL prethodnog sabiranja dva valjana pakovana decimalna operanda
− DAA menja sadržaj AL u par valjanih decimalnih cifara
− DAA menja AF, CF, PF, SF i ZF, a sadržaj OF je nedefinisan
Oduzimanje− SUB odredište, izvorište (Subtract)
− izvorišni operand se oduzima od odredišnog i rezultat zamenjuje odredišni operand
− operandi mogu biti bajtovi ili rei i to oznaeni ili neoznaeni binarni brojevi
− SUB menja AF, CF, OF, PF, SF i ZF− SBB odredište, izvorište (Subtract with Borrow )
− izvorišni operand i CF se oduzimaju od odredišnog i rezultat zamenjuje odredišnioperand
− operandi mogu biti bajtovi ili rei i to oznaeni ili neoznaeni binarni brojevi
− SBB menja AF, CF, OF, PF, SF i ZF
8/18/2019 124393592-Uvod-u-Asembler-8086
22/42
− može se koristiti da se pišu rutine za oduzimanje brojeva dužih od 16 bita
− DEC odredište (Decrement)
− oduzima 1 od odredišnog operanda koji može biti 8- ili 16-bitni
− DEC menja AF, OF, PF, SF i ZF, a ne utie na CF
− NEG odredište (Negate)− oduzima odredišni operand koji može biti 8- ili 16-bitni od 0 i upisuje rezultat u
odredište
− izraunava drugi komplement broja, efektivno menjajui znak celobrojne vrednosti
− ako je operand 0 znak se ne menja
− ako je bajt-operand jednak –128 ili re-operand jednak –32768 nema promeneoperanda, OF=1
− NEG menja AF, CF, OF, PF, SF i ZF; CF je uvek postavljen na 1 izuzev kada jeoperand jednak 0
− CMP odredište, izvorište (Compare)− oduzima izvorišni od odredišnog operanda koji mogu biti 8- ili 16-bitni ali ne upisuje
rezultat
− operandi su neizmenjeni, ali su indikatori postavljeni i mogu se testirati narednominstrukcijom
− CMP menja AF, CF, OF, PF, SF i ZF
− komparacija koja se reflektuje na indikatore ima smer od odredišta prema izvorištu
− na primer: ako iza CMP ide JG ( Jump if Greater ) skok e se dogoditi ako je odredište > izvorište
− AAS (ASCII Adjust for Subtraction)− menja sadržaj registra AL u ispravan nepakovani decimalni broj tako što uisuje 0 u
gornju niblu
− AAS menja AF i CF, a sadržaj OF, PF, SF i ZF je nedefinisan
− DAS (Decimal Adjust for Subtraction)
− koriguje rezulatat u AL prethodnog oduzimanja dva valjana pakovana decimalnaoperanda
− odredišni operand je morao biti u registru AL
− DAS menja sadržaj AL u par valjanih decimalnih cifara
− DAS menja AF, CF, PF, SF i ZF, a sadržaj OF je nedefinisan
Množenje− MUL izvorište (Multiply )
− obavlja neoznaeno množenje izvorišnog operanda i akumulatora
− ako je izvorišni operand bajt tada se on množi sa AL, a rezultat (duple širine) se vraa uAX
8/18/2019 124393592-Uvod-u-Asembler-8086
23/42
− ako je izvorišni operand re tada se on množi sa AX, a rezultat (duple širine) se vraa uDX i AX
− operandi se tretiraju kao neoznaeni binarni brojevi
− ako je viša polovina rezultata (AH odnosno DX) razliita od nule CF i OF sepostavljaju
− sadržaj AF, PF, SF i ZF je nedefinisan
− IMUL izvorište (Integer Multiply )
− obavlja oznaeno množenje izvorišnog operanda i akumulatora
− ako je izvorišni operand bajt tada se on množi sa AL, a rezultat (duple širine) se vraa uAX
− ako je izvorišni operand re tada se on množi sa AX, a rezultat (duple širine) se vraa uDX i AX
− ako je viša polovina rezultata (AH odnosno DX) nije ekstenzija znaka niže CF i OF sepostavljaju
− kada su CF i OF postavljeni na 1 – ukazuju da AH ili DX sadrže znaajne cifrerezultata
− sadržaj AF, PF, SF i ZF je nedefinisan
− AAM (ASCII Adjust for Multiply )
− koriguje rezultat prethodnog množenja dva valjana nepakovana decimalna operanda
− valjan dvocifreni nepakovani decimalni broj se izvodi iz sadržaja AH i AL i smešta uAH i AL
− više nible množenih operanada moraju sadržati 0 da bi AAM proizveo dobar rezultat
− AAM menja sadržaj PF, SF i ZF; sadržaj AF, CF i OF je nedefinisan
Deljenje− DIV izvorište (Divide)
− obavlja neoznaeno deljenje akumulatora (i njegove ekstenzije) izvorišnim operandom
− ako je izvorišni operand bajt – njime se deli deljenik dvostruke širine koji je u AH i AL
− kolinik se vraa u AL, a ostatak u AH
− ako je izvorišni operand re – njime se deli deljenik dvostruke širine koji je u DX i AX
− kolinik se vraa u AX, a ostatak u DX
− ako kolinik prevazie kapacitet odredišnog registra, kao kada se pokuša deljenje 0
generiše se prekid tipa 0, a kolinik i rezultat su nedefinisani− necelobrojni kolinici se odsecaju na celobrojne
− sadržaj AF, CF, OF, PF, SF i ZF je nedefinisan
− IDIV izvorište (Integer Divide)
− obavlja oznaeno deljenje akumulatora (i njegove ekstenzije) izvorišnim operandom
− ako je izvorišni operand bajt – njime se deli deljenik dvostruke širine koji je u AH i AL
8/18/2019 124393592-Uvod-u-Asembler-8086
24/42
− kolinik se vraa u AL, a ostatak u AH
− za celobrojno deljenje bajta maksimalni pozitivni kolinik je +127, a minimalninegativni -127
− ako je izvorišni operand re – njime se deli deljenik dvostruke širine koji je u DX i AX
−
kolinik se vra
a u AX, a ostatak u DX
− za celobrojno deljenje rei max pozitivni kolinik je +32767, a min negativni –32767
− ako je kolinik pozitivan a prevazilazi maksimum, ili negativan a prevazilazi minimum,kolinik i ostatak su nedefinisani, a generiše se prekid tipa 0
− ovo se dešava kada se pokuša deljenje 0
− necelobrojni kolinici se odsecaju prema 0, a ostatak ima isti znak kao i deljenik
− sadržaj AF, CF, OF, PF, SF i ZF je nedefinisan
− AAD (ASCII Adjust for Division)
− modifikuje brojilac u AL pre deljenja dva valjana nepakovana decimalna operanda
tako da kolinik dobijen deljenjem bude valjan nepakovani decimalni broj
− AH mora biti 0 za naredni DIV da se dobije korektan rezultat
− kolinik se vraa u AL, a ostatak u AH – obe više nible se anuliraju
− AAD menja PF, SF i ZF; sadržaj AF, CF i OF je nedefinisan
− CBW (Convert Byte to Word )
− proširuje znak bajta u registru AL na registar AH
− ne utie na indikatore
− može se koristiti da se napravi deljenik dužine rei od bajta pre deljenja bajtom
− CWD (Convert Word to Doubleword )
− proširuje znak rei u registru AX na registar DX
− ne utie na indikatore
− može se koristiti da se napravi deljenik dužine dvostruke rei od rei pre deljenja jednom rei
Instrukcije koje manipulišu bitima− Postoje 3 kategorije instrukcija koje manipulišu bitima bajta ili rei:
− logike instrukcije (NOT, AND, OR, XOR, TEST)
− instrukcije pomeranja (SHL, SAL, SHR, SAR)
− instrukcije rotacije (ROL, ROR, RCL, RCR)
Logike instrukcije− Realizuju 4 bulova operatora kao i TEST instrukciju koja samo postavlja
indikatore
− AND, OR, XOR i TEST manipulišu indikatorima na sledei nain:
− OF i CF se uvek postavljaju na 0
8/18/2019 124393592-Uvod-u-Asembler-8086
25/42
− AF je uvek nedefinisan nakon logike instrukcije
− SF, ZF i PF se uvek postavljaju tako da reflektuju rezultat i mogu se testirati uslovnimskokom
− interpretacija SF, ZF i PF je ista kao nakon aritmetikih instrukcija
−
NOT ne utie na indikatore
− NOT odredište (Not)
− invertuje bite (rauna jedinini komplement) operanda dužine bajta ili rei
− AND odredište, izvorište (And )
− obavlja logiku "I" operaciju izmeu dva operanda (bajta ili rei) i vraa rezultat uodredište
− bit rezultata je 1 ako su oba odgovarajua bita operanada 1, inae je 0
− OR odredište, izvorište (Or )
− obavlja logiku "ILI" operaciju izmeu dva operanda (bajta ili rei) i vraa rezultat u
odredište− bit rezultata je 1 ako je barem jedan od dva odgovarajua bita operanada 1, inae je 0
− XOR odredište, izvorište (Exclusive Or )
− obavlja logiku "ekskluzivno ILI" operaciju izmeu dva operanda i vraa rezultat uodredište
bit rezultata je 1 ako dva odgovarajua bita operanada imaju razliite vrednosti, inae je 0
− TEST odredište, izvorište (Test)
− obavlja logiku "I" operaciju izmeu dva operanda (bajta ili rei) i samo postavljaindikatore
− rezultat se ne upisuje, niti se operandi menjaju
− ako se nakon TEST instrukcije izvrši JNZ ( Jump if Not Zero) do skoka e doiako postoji barem jedan bit jednak 1 na korespondentnim pozicijama u operandima
Instrukcije pomeranja− Biti u bajtu ili rei mogu biti pomerani aritmetiki ili logiki
− Broj koji se navodi u instrukciji omoguava do 255 pomeranja
− Broj se može specificirati kao neposredna konstanta 1 ili kao registar CL(promenljivi broja)
− Aritmeti
ka pomeranja se mogu koristiti za množenje i deljenje binarnih brojevastepenima 2
− Logika pomeranja se mogu koristiti da bi se izolovali biti u bajtovima ili reima
− Instrukcije pomeranja manipulišu indikatorima na sledei nain:
− AF je uvek nedefinisan nakon instrukcije pomeranja
− SF, ZF i PF se uvek postavljaju kao u logikim instrukcijama
− CF uvek sadrži vrednost poslednjeg bita koji je pomeren izvan odredišnog operanda
8/18/2019 124393592-Uvod-u-Asembler-8086
26/42
− OF je uvek nedefinisan nakon višebitnog pomeranja
− pri pomeranju za jednu poziciju OF je 1 ako se bit najvišeg znaaja menja
− SHL/SAL odredište, broj (Shift Logical/ArithmeticLeft)
− obavljaju istu operaciju i fiziki su ista instrukcija− odredišni bajt ili re se pomera ulevo za broj bita specificiran u operandu broj
− sa desne strane ulaze 0 pri pomeranju ulevo
− ako bit znaka (najviši bit odredišta) zadržava vrednost OF se postavlja na 0
− SHR odredište, broj (Shift Logical Right)
− pomera bite operanda odredišta (bajt ili re) u desno za broj bita specificiranoperandom broj
− sa leve strane ulaze 0 pri pomeranju udesno
− ako bit znaka (najviši bit odredišta) zadržava vrednost OF se postavlja na 0
− SAR odredište, broj (Shift Arithmetic Right)
− pomera bite operanda odredišta (bajt ili re) u desno za broj bita specificiranoperandom broj
− sa leve strane ulaze biti jednaki originalnom najvišem bitu (zadržava se predznak)
− SAR odseca pozitivne brojeve prema 0, a negativne prema -∞
− rezultat SAR i odgovarajueg IDIV se razlikuju jer IDIV odseca sve vrednosti prema 0
Instrukcije rotacije− Biti koji pri rotaciji izlaze iz odredišta se ne gube, ve se pojavljuju "sa druge
strane"− Kao kod instrukcija pomeranja, broj pozicija za rotaciju može biti konstanta 1 ili
CL
− CF se može koristiti kao ekstenzija operanda u dve instrukcije
− Tako se bit može izolovati u CF pa zatim testirati pomou JC ( Jump if Carry) iliJNC
− Rotacije utiu samo na CF i OF
− CF uvek sadrži vrednost poslednjeg bita koji je pri rotaciji izašao iz odredišta
− Pri rotaciji za više pozicija, OF je uvek nedefinisan
− Pri rotaciji za jednu poziciju OF se postavlja na 1 ako operacija menja najviši bitodredišta
− ROL odredište, broj (Rotate Left)
− rotira odredište (bajt ili re) ulevo za specificirani broj pozicija
− ROR odredište, broj (Rotate Right)
− rotira odredište (bajt ili re) udesno za specificirani broj pozicija
8/18/2019 124393592-Uvod-u-Asembler-8086
27/42
− RCL odredište, broj (Rotate through Carry Left)
− rotira odredište (bajt ili re) ulevo za specificirani broj pozicija
− CF se tretira kao deo odredišta
− vrednost CF se pomera u najniži bit odredišta dok se CF puni najvišim bitom odredišta
− RCR odredište, broj (Rotate through Carry Right)isto kao RCL, samo se rotira na desnu stranu
Instrukcije za kontrolu toka− Sekvenca izvršavanja instrukcija odreena je sadržajem CS i IP registara
− Registar CS sadrži baznu adresu tekueg segmenta koda iz kojeg se dohvatajuinstrukcije
− Registar IP sadrži ofset u odnosu na poetak segmenta
− Kombinacija CS i IP ukazuje na memorisjku lokaciju iz koje se dohvata naredna
instrukcija− Instrukcije za kontrolu toka menjaju sadržaj CS i IP registara i tako menjaju tok
programa
− Postoje 4 grupe instrukcija za kontrolu toka programa:
− bezuslovni skokovi
− uslovni skokovi
− instrukcije za kontrolu iteracija
− instrukcije prekida
− Samo instrukcije prekida utiu na indikatore
Bezuslovni skokovi− Instrukcije bezuslovnih skokova mogu prenositi kontrolu
− unutar segmenta (intrasegment transfer ); u asembleru se ovi skokvi nazivaju NEAR
− izmeu segmenata (intersegment transfer ); u asembleru se ovi skokvi nazivaju FAR
− JMP cilj (Jump)
− bezuslovno prenosi kontrolu na ciljnu lokaciju
− adresa cilja može biti u samoj instrukciji (direktan skok) ili u memoriji/registru(indirektan skok)
− unutarsegmentni direktan skok menja IP dodajui relativan pomeraj cilja iz JMP instrukcije
− ako asembler može da odredi da je cilj unutar 127 bajtova od JMP on generiše 2-bajtniJMP
− 2-bajtna JMP instrukcija se naziva SHORT JMP
− inae, asembler generiše NEAR JMP koji adresira cilj unutar ±32K, a dužinainstrukcije je 3-bajta
8/18/2019 124393592-Uvod-u-Asembler-8086
28/42
− unutarsegmentni direktni skokovi su samo-relativni
− oni su odgovarajui u dinamiki relokatibilnim rutinama u kojima su JMP i cilj u istomsegmentu
− unutarsegmentni indirektni skok može biti kroz memorijsku lokaciju ili kroz 16-bitniregistar
− memorijska lokacija ili registar koje adresira instrukcija sadrže re kojom se zamenjujesadržaj IP
− meusegmentni direktan skok zamenjuje IP i CS vrednostima koje se sadrže uinstrukciji
− meusegmentni indirektan skok može biti realizovan samo kroz memoriju
− prva re dvorenog pokazivaa koji adresira instrukcija zamenjuje IP, a druga CS
− CALL ime_procedure (Call)
− prenosi kontrolu proceduri i omoguava da se prekinuti tok kontrole nastaviinstrukcijomRET
− asembler generiše razliit tip CALL instrukcije u zavisnosti od definisanja imenaprocedure
− ime_procedure može biti NEAR (procedura u istom segmentu) ili FAR (u drugomsegmentu)
− da bi se kontrola propisno vratila CALL i RET moraju biti upareni po tipu
− CALL i RET mogu biti u nezavisno asembliranim programima pa može doi doneuparenosti
− mogui su direktni pozivi (adresa procedure u instrukciji) i indirektni (adresa umemoriji/registru)
− procesor automatski podešava IP da ukazuje na sledeu instrukciju pre smeštanja nastek
− unutarsegmentni direktan poziv dekrementira SP za 2 i tada IP smešta na stek
− tada se na IP dodaje relativni pomeraj (do ±32K) ciljne procedure od CALL instrukcije
− ova forma CALL instrukcije se naziva samo-relativnom
− samo-relativna CALL instrukcija je pogodna za dinamiki relokatibilne rutine
− instrukcija CALL i procedura su u istom segmentu i relociraju se zajedno
− unutarsegmentni indirektan poziv se može realizovati kroz memorijsku lokaciju ili krozregistar
− ofset ciljne procedure se dohvata iz adresirane memorijske lokacije ili registra
− meusegmentni direktan poziv dekrementira SP za 2 i smešta CS na stek
− CS se puni segmentnom adresom iz instrukcije, pa se SP ponovo dekrementira za 2
− IP se smešta na stek pa se zatim puni ofset adresom iz instrukcije
− meusegmentni indirektan poziv se može realizovati samo kroz memoriju
− SP se dekrementira za 2, CS se smešta na stek
8/18/2019 124393592-Uvod-u-Asembler-8086
29/42
− zatim se CS puni sadržajem druge rei pokazivake memorijske lokacije koja jeadresirana
− SP se ponovo dekrementira za 2, pa se IP smešta na stek
− na kraju se IP puni sadržajem prve rei pokazivake memorijske lokacije koja jeadresirana
− RET opciona_pop_vrednost (Return)
− vraa kontrolu iz procedure instrukciji koja je sledila CALL kojim je aktiviranaprocedura
− ako je procedura definisana kao NEAR asembler generiše unutarsegmentni RET
− ako je procedura definisana kao FAR asembler generiše meusegmentni RET
− RET uzima sa vrha steka re kojom puni IP i inkrementira SP za 2
− ako je RET meusegmentni ponovo se uzima re sa vrha steka i njom se puni CS,a SP inkrementira još jednom za 2
− ako je zadata opciona_pop_vrednost, RET je dodaje na SPova mogunost se koristi da se sa steka skinu parametri procedure stavljeni pre poziva
Uslovni skokovi− prenose kontrolu na ciljnu adresu u zavisnosti od stanja pojedinih indikatora
− postoji 18 instrukcija od kojih svaka testira drugu kombinaciju indikatora
− ako je uslov "true" kontrola se prenosi na ciljnu adresu
− ako je uslov "false" izvršava se naredna instrukcija
− svi uslovni skokovi su SHORT
− cilj mora biti u istom segmentu i to unutar -128 do +127 bajtova od naredneinstrukcije
− uslovni skokovi su samo-relativni i tako pogodni za dinamiki relokatibilnerutine
− tabela prikazuje sve vrste uslovnih skokova:
MnemonikTestirani uslov
Skok ako je...
JA/JNBE (CF or ZF)=0 iznad (above)/nije ispod ni jednako (not below
nor equal)
JAE/JNB CF=0 iznad ili jednako (above or equal) /nije ispod
(not below) JB/JNAE CF=1 ispod (below)/nije iznad ni jednako (not above
nor equal)
JBE/JNA (CF or ZF)=1 ispod ili jednako (below or equal)/nije iznad
(not above)
JC CF=1 prenos (carry)
JE/JZ ZF=1 jednako (equal)/nula ( zero)
8/18/2019 124393592-Uvod-u-Asembler-8086
30/42
JG/JNLE ((SF xor OF) or ZF)=0 vee (greater )/ nije manje ni jednako (not less
nor equal)
JGE/JNL (SF xor OF)=0 vee ili jednako (greater or equal)/ nije manje
(not less)
JL/JNGE (SF xor OF)=1 manje (less)/ nije vee ni jednako (not greater
nor equal)JLE-JNG ((SF xor OF) or ZF)=1 manje ili jednako (less or equal)/ nije vee (not
greater )
JNC CF=0 nije prenos (not carry)
JNE/JNZ ZF=0 nije jednako (not equal)/nije nula (not zero)
JNO OF=0 nema prekoraenja (not overflow)
JNP/JPO PF=0 nema parnosti (not parity)/ neparno ( parity
odd )
JNS SF=0 ne znak (not sign)
JO OF=1 prekoraenje (overflow)
JP/JPE PF=1 parnost ( parity)/ parno ( parity even)
JS SF=1 znak (sign)− iznad (above) i ispod (below) se odnose na odnose neoznaenih veliina
vee (greater ) i manje (less) se odnose na odnose oznaenih veliina
Kontrola iteracija− instrukcije za kontrolu iteracija se mogu koristiti za regulisanje ponavljanja petlji
− instrukcije koriste CX kao brojaki registar
− instrukcije su samo-relativne, prenose kontrolu za –128 do 127 bajtova (SHORT prenosi)
− LOOP kratka-labela (Loop)− dekrementira CX za 1 i prenosi kontrolu na cilj ako CX nije 0
− inae, izvršava se naredna instrukcija
− LOOPE/LOOPZ kratka-labela (Loop while Equal/Loop whileZero)
− CX se dekrementira za 1 i kontrola se prenosi na cilj ako CX nije 0 i ako je ZF=1
− inae, izvršava se naredna instrukcija
− LOOPNE/LOOPNZ kratka-labela (Loop while Not Equal/NotZero)
− CX se dekrementira za 1 i kontrola se prenosi na cilj ako CX nije 0 i ako je ZF=0
− inae, izvršava se naredna instrukcija
− JCXZ kratka-labela (Jump if CX Zero)
− prenosi kontrolu na cilj ako je CX jednako 0
− instrukcija je korisna na poetku petlje da se preskoi petlja ako CX sadrži 0
8/18/2019 124393592-Uvod-u-Asembler-8086
31/42
Instrukcije prekida− Omoguavaju da se prekidne procedure aktiviraju programski
− Efekat softverskih prekida je slian hardverski iniciranim prekidima
− INT tip-prekida (Interrupt)
− aktivira prekidnu proceduru specificiranu pomou tip-prekida
− dekrementira SP za 2, stavlja indikatore na stek
− postavlja TF=0 i IF=0 da zabrani single-step i maskabilne prekide
− indikatori se stavljaju na stek po formatu koji koristi PUSHF instrukcija
− SP se ponovo dekrementira za 2, pa se CS stavlja na stek
− adresa prekidnog vektora se rauna množei tip-prekida sa 4
− druga re prekidnog vektora se puni u CS
− SP se ponovo dekrementira za 2, pa se IP stavlja na stek
− prva re prekidnog vektora se smešta u IP
− ako je tip-prekida=3 asembler generiše kratku formu instrukcije (1Byte)
− ovakva instrukcija se naziva breakpoint prekidom
− softverski prekidi se mogu koristiti za "supervizorske pozive" (pozive operativnogsistema)
− za svaku vrstu servisa koji operativni sistem pruža aplikaciji se može koristiti posebantip prekida
softverski prekidi se takoe mogu koristiti za testiranje rutina pisanih za hardverske
prekide
− INTO (Interrupt on Overflow )
− generiše softverski prekid ako je OF=1
− inae, kontrola se prenosi na sledeu instrukciju bez izazivanja prekida
− prenosi kontrolu prekidnoj proceduri preko vektora na adresi 10H (tip prekida = 4)
− postavlja TF=0 i IF=0 i inae se ponaša kao INT
− piše se posle aritmetike/logike operacije da aktivira prekidnu rutinu ako doe doprekoraenja
− IRET (Interrupt Return)
− vraa kontrolu na mesto gde se dogodio prekid, tako što sa steka skida IP, CS iindikatore
− IRET utie na sve indikatore jer ih restaurira na prethodno sauvane vrednosti
− koristi se za izlazak iz prekidne procedure bez obzira da li je re o SW ili HW prekidu
Operacije sa indikatorima− CLC (Clear Carry flag )
− postavlja CF=0 i ne utie na ostale indikatore
8/18/2019 124393592-Uvod-u-Asembler-8086
32/42
− korisna je zajedno sa RCL i RCR instrukcijama
− CMC (Complement Carry flag )
− menja CF u suprotno stanje i ne utie na ostale indikatore
− STC (Set Carry flag )
− postavlja CF=1 i ne utie na ostale indikatore
− CLD (Clear Direction flag )
− postavlja DF=0 i ne utie na ostale indikatore
− uzrokuje da string instrukcije auto-inkrementiraju SI i/ili DI
− STD (Set Direction flag )
− postavlja DF=1 i ne utie na ostale indikatore
− uzrokuje da string instrukcije auto-dekrementiraju SI i/ili DI
− CLI (Clear Interrupt-enable flag )
− postavlja IF=0 i ne utie na ostale indikatore− kada je IF resetovan procesor ne raspoznaje spoljašnje prekide preko INTR ulaza
− maskabilni prekidi su onemogueni
− nemaskabilni prekid preko NMI ulaza sa poštuje, kao i softverski prekidi
− STI (Set Interrupt-enable flag )
− postavlja IF=1 i ne utie na ostale indikatore
− omoguava da procesor prepoznaje prekide koji se pojavljuju na INTR liniji
prekid koji eka se nee stvarno raspoznati sve do izvršenja instrukcije koja sledi ST
String instrukcije− String instrukcije omoguavaju manipulisanje stringovima do 64K bajtova ili rei
− Postoji 5 osnovnih string instrukcija za
− prenos, komparaciju, traženje vrednosti i razmenu elemenata stringa sa akumulatorom
− Osnovnim instrukcijama može prethoditi jedno-bajtni prefiks
− Prefiks uzrokuje hardversko ponavljanje instrukcije
− Ovakvo ponavljanje instrukcije je brže od ponavljanja koje omoguava softverskapetlja
− Ponavljanje se može zaustaviti pomou raznih uslova, a može biti i prekinuto panastavljeno
− String instrukcije na slian nain (prikazan donjom tabelom) koriste registre iindikatore
SI Indeks (ofset) izvorišnog stringa
DI Indeks (ofset) odredišnog stringa
CX Broja ponavljanja
8/18/2019 124393592-Uvod-u-Asembler-8086
33/42
AL/A
X
Vrednost za traženje; odredište za LODS; izvorište za STOS
DF 0=autoinkrementiranje SI, DI; 1=autodekrementiranje SI, DI
ZF terminator za traženje i komparaciju
− Neke string instrukcije imaju izvorišni, neke odredišni, a neke oba operanda− Hardver podrazumeva da se izvorišni operand nalazi u tekuem segmentu
podataka
− Segmentni prefiks (1 bajt) se može koristiti da se promeni gornja pretpostavka
− Odredišni string mora biti u tekuem ekstra segmentu (ne može se promenitiprefiksom)
− Asembler proverava atribute operanada da utvrdi da li su elementi bajtovi ili rei
− Asembler ne koristi imena operanada za adresiranje stringova
− asembler koristi sadržaj SI kao ofset adresu tekueg elementa izvorišnog stringa
− asembler koristi sadržaj DI kao ofset adresu tekueg elementa odredišnog stringa
− Registri SI i DI moraju biti inicijalizovani da ukazuju na izvorišne/odredišnestringove
− instrukcije LDS, LES i LEA mogu biti korisne u ove svrhe
− String instrukcije automatski modifikuju SI i DI da omogue obradu sledeegelementa
− DF odreuje da li se SI i DI inkrementiraju ili dekrementiraju (0inkrement,
1dekrement)
− veliina inkrementa/dekrementa je odreena tipom operanda (bajt1, re2)
− Ako postoji prefiks ponavljanja CX registar se dekrementira za 1 nakon svakogizvršenja
− CX se mora inicijalizovati na broj ponavljanja pre izvršenja string instrukcije
− Ako je CX=0 string instrukcija se ne izvršava i kontrola se prenosi na sledeuinstrukciju
− REP/REPE/REPZ/REPNE/REPNZ(Repeat/R. while Equal/R.w.Zero/R.w. Not Equal/R.w. Not
Zero)
− 5 mnemonika za 2 formata prefiksnog bajta koji kontroliše ponavljanje naredne string
instrukcije
− razliiti mnemonici su definisani zbog razumljivosti programa
− prefiks ponavljanja ne utie na indikatore
− REP se interpretira se kao "ponavljanje dok se ne stigne do kraja stringa" (CX≠0)
− REP se koristi sa MOVS ( Move String) i STOS (Store String)
− REPE i REPZ su fiziki isti prefiksni bajt kao i REP
8/18/2019 124393592-Uvod-u-Asembler-8086
34/42
− REPE i REPZ se koriste sa CMPS (Compare String) i SCAS (Scan String)
− REPE i REPZ zahtevaju da se ZF postavi na 1 pre iniciranja sledeeg ponavljanja
− ZF postavljaju CMPS i SCAS
− REPNE i REPNZ su dva menmonika za isti prefiksni bajt
− REPNE i REPNZ funkcionišu isto kao REPE i REPZ samo što zahtevaju da je ZF=0− ZF ne treba da bude inicijalizovan pre ponavljajue string instrukcije
− ponavljajue string sekvence su prekidive: procesor prihvata prekid pre obrade sledeegelementa
− obrada prekida se ne remeti ni na koji nain – izvršava se prekidna rutina u celini
− posle obrade prekida ponavljajua operacija se nastavlja od mesta gde je prekinuta
− izuzetak: izvršenje se na nastavlja valjano ako je ubaen još neki prefiks (npr.segmentni)
− procesor "pamti" samo jedan prefiks i to samo onaj koji je neposredno ispred stringinstrukcije
− nakon povratka iz prekidne rutine, obrada se nastavlja, ali samo poslednji prefiks jevažei
− ako je potrebno koristiti više od jednog prefiksa, mogu da se zabrane prekidi za vremeinstrukcije
− ipak, zabrana prekida nee spreiti nemaskabilne prekide
− takoe, vreme za koje sistem ne odgovara na prekide može biti predugo za dugakestringove
− MOVS odredišni-string, izvorišni-string (Move String )
− prenosi bajt ili re izvornog stringa (adresiranog kroz SI) u odredišni string (adresiran
kroz DI)
− na osnovu atributa operanada asembler odreuje da li se prenosi bajt ili re
− instrukcija modifikuje SI i DI da ukazuju na sledee elemente
− kada se koristi sa REP, MOVS obavlja blokovski prenos iz-memorije-u-memoriju
− MOVSB/MOVSW (Move Byte String/Move Word String )
− alternativni mnemonici za MOVS instrukciju, ali se koriste bez operanada
− CMPS odredišni-string, izvorišni-string (Compare String )
− oduzima odredišni bajt ili re (adresiran kroz DI) od izvorišnog bajta ili rei(adresiranog kroz SI)
− CMPS ne menja ni jedan operand i modifikuje SI i DI da ukazuju na sledei elementstringa
− CMPS modifikuje AF, CF, OF, PF, SF i ZF da reflektuju odnos odredišta premaizvorištu
− ako se JG ( Jump if Greater ) izvrši posle CMPS, skoie se ako je odredište vee odizvorišta
8/18/2019 124393592-Uvod-u-Asembler-8086
35/42
− ako ispred CMPS stoji prefiks REPE ili REPZ operacija se interpretira kao
"kompariraj dok nije kraj stringa (CX≠0) i stringovi su jednaki (ZF=1)
− ako ispred CMPS stoji prefiks REPNE ili REPNZ operacija se interpretira kao
"kompariraj dok nije kraj stringa (CX≠0) i stringovi nisu jednaki (ZF=0)
− CMPS se koristi za pronalaženje jednakih ili razliitih podstringova u stringu
− SCAS odredišni-string (Scan String )
− oduzima element odredišnog stringa (bajt ili re) adresiran pomou DI od sadržaja ALili AX
− ne menja ni odredišni string ni akumulator, modifikuje DI da ukazuje na sledeielement
− posatavlja AF, CF, OF, PF, SF i ZF da reflektuju odnos vrednosti iz AL/AX i elementastringa
− ako ispred SCAS stoji prefiks REPE ili REPZ operacija se interpretira kao
"traži dok nije kraj stringa (CX≠0) i element stringa je jednak zadatoj vrednosti (ZF=1)
− ako ispred SCAS stoji prefiks REPNE ili REPNZ operacija se interpretira kao"traži dok nije kraj stringa (CX≠0) i element stringa nije jednak zadatoj vrednosti
(ZF=0)
− SCAS se koristi za lociranje vrednosti u stringu
− LODS izvorišni-string (Load String )
− prenosi element stringa (bajt ili re) koji pokazuje SI u AL ili AX
− modifikuje SI da ukazuje na sledei element
− instrukcja se ne ponavlja ordinarno (jer bi samo poslednji element ostao u AL/AX)
− koristi se u programskim petljama
− STOS odredišni-string (Store String )
− prenosi bajt ili re iz registra AL ili AX u element stringa adresiran kroz DI
− modifikuje DI da ukazuje na sledei element
− kao ponavljajua operacija se koristi da inicijalizuje ceo string na istu vrednostelementa
8/18/2019 124393592-Uvod-u-Asembler-8086
36/42
Direktive
Uvod− Program se sastoji od instrukcija i direktiva
− Instrukcije se prevode u naredbe mašinskog jezika
− Direktive su naredbe asembleru koje se ne prevode direktno u mašinske naredbe
− Direktive utiu na proces prevoenja i tako posredno na generisanje mašinskihnaredbi
− Deklaracije su vrsta direktiva koja uvodi imena
− One deklaracje koje alociraju i memoriju nazivaju se definicijama
Leksiki stil asemblera Asm86− Imena promenljivih i labela su ograniena na 31 znak i nisu ograniena na slova i
cifre
− Znak "podvueno" ( _ ) se može koristiti da se povea itljivost
− Proizvoljan broj praznina se može umetati izmeu identifikatora
− Instrukcija se može preneti u naredni red tako što se naredni red zapone znakom&
Format instrukcija− Instrukcije imaju sledei format:
[labela:] [prefiks] mnemonik [operand(i)] [; komentar]
− polje labele imenuje memorijsku lokaciju koja sadrži mašinsku instrukciju
(što omoguava da se lokacija adresira simboliki iz instrukcije JMP)
− prefiks uzrokuje generisanje jednog prefiksnog bajta (segmentni, LOCK, REP) ispredinstrukcije
− mnemonik identifikuje tip instrukcije (MOV, ADD, ...)
− operandi (0, 1 ili 2) se pišu razdvojeni zarezima
− iza take-zareza se piše komentar
Format direktiva− Direktive imaju sledei format:
[ime] mnemonik [operand(i)] [; komentar]
− neke direktive zahtevaju ime dok ga druge zabranjuju
− asembler prepoznaje direktivu na osnovu mnemonika
8/18/2019 124393592-Uvod-u-Asembler-8086
37/42
− operandi koje zahteva direktiva se pišu posle mnemonika i razdvajaju zarezima
− kao i kod instrukcija, iza take-zareza se piše komentar
− Primeri direktiva su: PROC (definicija procedure), DB, DW, DD (definicijepodataka),...
Konstante− Mogu se definisati binarne, decimalne, oktalne i heksadecimalne numerike
vrednosti
− Asembler može obavljati osnovne aritmetike operacije sa numerikimkonstantama
− Svi brojevi moraju biti celi i mora biti mogue predstaviti ih kao 16-bitne sa bitomznaka
− Negativni brojevi se asembliraju u standardnoj notaciji drugog komplementa
− Znakovne konstante se pišu izmeu apostrofa
− Mogu biti do 255 karaktera dugake kad se koriste za inicijalizaciju memorije
− Kada se koriste za neposredne operande mogu biti 1 ili 2 bajta dugake
− Primeri konstanti:
MOV STRING[SI],'A' ; karakter
MOV STRING[SI],41H ; ekvivalent u heksadecimalnom
sistemu
ADD AX,0C4H ; hex konstanta mora poceti cifrom
OCTAL_8 EQU 10O ; oktalna konstanta 8
OCTAL_9 EQU 11Q ; alternativna oktalna konstanta
ALL_ONES EQU 11111111B ; binarna konstantaMINUS_5 EQU -5 ; decimalna konstanta –5
MINUS_6 EQU -6D ; alternativna decimalna konstanta
-6
Definicije podataka− Direktive za deklarisanje i definisanje podataka su:
− definisanje bajta - DB (define byte)
− definisanje rei - DW (define word ),
− definisanje dvostruke rei - DD (define doubleword )
− Operandi ovih direktiva govore koliko jedinica da se alocira i koje su im inicijalnevrednosti
− Sintaksa operanda:
::= | ,
::= | () | DUP | ?
< konstanta >::= | |
8/18/2019 124393592-Uvod-u-Asembler-8086
38/42
− Primeri definicija podataka:
A_SEG SEGMENT
A_VAR DB ? ; neinicijalizovani bajt
B_VAR DW ?,1 ; dve reci, prva neinicijalizovana,
druga=1
C_VAR DD 2 DUP 1 ; dve dvostruke reci
inicijalizovane na 1D_VAR DB 3 DUP (1,2) ; 1,2,1,2,1,2
E_VAR DB 3 DUP (1, 2 DUP 2); 1,2,2,1,2,2,1,2,2
A_SEG ENDS
B_SEG SEGMENT AT 55H ; specificirana bazna adresa
segmenta
F_VAR DB 'ABC' ; 3 bajta sadrze: 41H, 42H, 43H
G_VAR DW 'AB' ; 1 rec sadrzi: 42H, 41H
H_VAR DD B_SEG ; dvostruka rec, sadrzi: 00H 00H
55H 00H
I_VAR DB 100 DUP 0 ; 100 bajtova inicijalizovanih na 0
B_SEG ENDS
Atributi promenljive− Asembler vodi rauna o 3 atributa svake promenljive:
− segment – identifikuje segment koji sadrži promenljivu
− ofset – distanca u bajtovima od poetka segmenta koji sadrži promenljivu
− tip – identifikuje alokacionu jedinicu promenljive: 1 = bajt, 2 = re, 4 = dvostruka re
− Na osnovu atributa promenljive u instrukciji asembler odreuje formu generisaneinstrukcije
− Ako su atributi promenljive u konfliktu sa korišenjem u instrukciji, generiše segreška
− Primer: pokušaj da se promenljiva definisana kao DW sabere sa bajt-registrom
Konverzija tipa− U nekim sluajevima asembleru se mora eksplicitno rei tip
− Primer: MOVE [BX],5 ; proizvodi grešku jer se ne zna tip lokacije na koju BXpokazuje
− Operatori koji eksplicitno definišu tip su: BYTE PTR, WORD PTR i DWORDPTR
− Primer: MOVE WORD PTR [BX],5 ; prenosi se re 5 u lokaciju na kojupokazuje BX
Operatori− ASM-86 ima tri ugraena operatora vezana za atribute promenljive
− TYPE – vraa 1 za bajt, 2 za re, 4 za dvostruka re
8/18/2019 124393592-Uvod-u-Asembler-8086
39/42
− LENGTH – odreuje broj alociranih jedinica (bajtova, rei ili dvostrukih rei) za vektor
− SIZE – odreuje broj bajtova koje zauzima skalar ili vektor (SIZE=LENGTH*TYPE)
− Primer (prema gornjem primeru):
ATRIBUTI OPERATORI PROMENLJIV
A SEGMENT OFFSET TYPE LENGTH SIZEA_VAR A_SEG 0 1 1 1
B_VAR A_SEG 1 2 2 4
C_VAR A_SEG 5 4 2 8
D_VAR A_SEG 13 1 6 6
E_VAR A_SEG 19 1 9 9
F_VAR B_SEG(0055)
0 1 3 3
G_VAR B_SEG
(0055)
3 2 1 2
H_VAR B_SEG
(0055) 5 4 1 4
I_VAR B_SEG(0055)
9 1 100 100
− Atributi i operatori omoguavaju da se pišu generalizovane sekvence instrukcijakoje ne moraju da se menjaju (samo se ponovo prevedu) ako se menjaju atributi
podataka
Primer− Sumiranje elemenata tabele
; sumiranje elemenata tabele u AX registru
TABELA DW 50 DUP(?) ; tabela ima 50 elemenata
SUB AX,AX ; AX=0
MOV CX, LENGTH TABELA ; CX=50 , CX - brojac petlje
MOV SI, SIZE TABELA ; SI=100 , SI – pokazuje na kraj
tabele
DODAJ: SUB SI, TYPE TABELA ; pomeranje za jedan element
ADD AX, TABELA[SI] ; dodavanje elementa na sumu
LOOP DODAJ ; dok CX>0
; AX sadrzi sumu
Kontrola segmenata− Program na asembleru ASM-86 se organizuje u niz imenovanih "logikih"
segmenata
− Mapiranje logikih u fizike (memorijske) segmente se obino radi tek prilociranju programa
8/18/2019 124393592-Uvod-u-Asembler-8086
40/42
− Segment poinje direktivom SEGMENT, a završava direktivom ENDS
− Svi podaci i/ili instrukcije izmeu SEGMENT i ENDS pripadaju segmentu
− Nema ogranienja – mogu se podaci, stek i instrukcije smestiti u isti logikisegment
− Prve naredbe u programu obino:− najpre uspostavljaju korespondenciju izmeu imena segmenata i segmentnih registara,
− a zatim pune segmentne registre baznim adresama odgovarajuih segmenata
Direktiva ASSUME
− Direktiva ASSUME govori koje adrese e biti u segmentnim registrima u vremeizvršenja
− Sintaksa ASSUME: ASSUME seg_reg:ime_seg{,seg_reg:ime_seg}...
− Asembler proverava svaki memorijski operand instrukcije odreujui− u kom segmentu je promenljiva
− koji segmentni registar sadrži adresu tog segmenta
− Ako je operand u segmentu na koji ukazuje "oekivani" registar– instrukcija segeneriše
− Ako je operand u segmentu na koji ukazuje "neoekivni" registar – ubacuje se seg.prefiks
− Ako segmentni registar ne može biti promenjen prefiksom – generiše se porukagreške
− Primer:− ako se u instrukciji koristi BP, procesor oekuje da je operand u segmentu na koji
ukazuje SS
− program može koristiti BP da adresira promenljivu u tekuem segmentu podataka
− direktiva ASSUME omoguava asembleru da detektuje situaciju i generiše segmentniprefiks
− Programer može i eksplicitno da kodira segmentni prefiks da ne bi zavisio odasemblera
− primer: MOV ES:DATA_STRING[SI],AL
− prednost je bolja samodokumentovanost koda
mana je što asembler ne proverava da li je operand faktiki adresibilan kroz zadati
registar
Direktive SEGMENT, ENDS i END
− Sintaksa direktive SEGMENT: [ime_segmenta] SEGMENT [lista_atributa]
− Lista atributa služi da se definiše kombinovanje logikih u fiziki segment
8/18/2019 124393592-Uvod-u-Asembler-8086
41/42
− Omoguava da se logiki segmenti iz razliitih modula kombinuju u isti fizikisegment
− Sintaksa liste atributa: [tip_poravnavanja] [tip_kombinovanja] ['klasa']
− Tip poravnavanja odreuje granicu logikog segmenta pri kombinovanju:
− PARA – poravnavanje po paragrafima (adresa deljiva sa 16) – podrazumevani tip
− WORD – poravnavanje po reima (logiki segmenti se mapiraju na parne adrese)
− BYTE – poravnavanje po bajtovima (segment poinje od proizvoljne adrese) – nepreporuuje se
− AT paragraf – logiki segment se mapira na fiziku adresu definisanu paragrafom
− Tip kombinovanja odreuje kako e se segment kombinovati sa segmentima istogimena
− ako se ne navede – nema kombinovanja
− PUBLIC – nadovezivanje logikih segmenata – pogodno za logike code i data
segmente
− STACK – dodavanje logikih segmenata – pogodno za stack segmente
− dužina kombinovanog segmenta jednaka zbiru dužina pojedinog segmenata
− ofset vrha svakog steka je na vrhu kombinovanog steka
− Klasa omoguava da segmenti iste klase budu smešteni jedan iza drugog umemoriji
− npr: segment koda i segment konstanti u klasi 'ROM' mogu biti smešteni jedan izadrugog
− segment podataka i segment steka u klasi 'RAM' se takoe smeštaju jedan iza drugog
− Segment se završava direktivom ENDS: [ime_segmenta] ENDS
− Direktivom END se završava kompilaciona celina; sintaksa: END [labela_poetka]
− Samo u glavnom programu se u direktivi END navodi labela poetne instrukcijeprograma
Definisanje procedura− Sintaksa: ime_procedure PROC [NEAR | FAR]
telo procedure
ime_procedure ENDP
− Procedure koje se pozivaju samo u okviru istog segmenta su NEAR
− Procedure koje se pozivaju iz drugog segmenta su FAR
− Prenos parametara se može vršiti na jedan od sledeih naina:
− preko registara
− preko promenljivih u segmentu podataka
− preko steka
8/18/2019 124393592-Uvod-u-Asembler-8086
42/42
Smeštanje parametara na odreeno mesto i dohvatanje rezultata su u nadležnosti
programera.
Pristup modulima – direktive PUBLIC i EXTRN
− Direktiva PUBLIC uvodi listu simbola kojima je dozvoljen pristup iz drugih
modula
− Sintaksa: PUBLIC simbol [, simbol]...
− Direktiva EXTRN uvodi listu simbola (sa tipovima) iz drugih modula kojima sepristupa
− Sintaksa: EXTRN simbol:tip [, simbol:tip]...
− Simbol može biti promenljiva, labela ili literalna konstanta
− Tip može biti:
− za promenljive: BYTE, WORD, DWORD
− za labele: NEAR, FAR
− za literalne konstante: ABS
− Primer:
u modulu A: P DB 0
PUBLIC P
u modulu B: EXTRN P:BYTE
− Ako eksterni simbol pripada nekom logikom segmentu u izvornom modulu,
tada se EXTRN direktiva mora staviti u odgovarajui logiki segment u modulu gde
se koristi
Literalne konstante− Literalne konstante se definišu direktivom sledee sintakse: simbol EQU izraz
− Primer:
PROMENLJIVA DW 0
DONJI_BAJT EQU BYTE PTR PROMENLJIVA
GORNJI_BAJT EQU BYTE PTR PROMENLJIVA+1
...
MOV AH, GORNJI_BAJT
Eksplicitno definsanje ofseta− Za eksplicitno definisanje ofseta se koristi direktiva ORG
− Sintaksa: ORG ofset
− Naredni podatak ili instrukcija e imati navedeni ofset
− Primer:
ORG 10
PROMENLJIVA DB 0 ; PROMENLJIVA ima ofset 10