Download as pdf or txt
Download as pdf or txt
You are on page 1of 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 arhitekture
procesora
Arhitektura obuhvata u osnovi:

skup registara
memorijski model
kodove instrukcija
na ine adresiranja

Mainski jezik

Procesor izvrava mainske instrukcije naredbe obrazovane od re i


odre enog broja bitova
Jezik koji procesor "razume" se naziva mainskim jezikom
Program na mainskom jeziku se zapisuje u binarnom obliku
Kompaktniji, ali jo manje razumljiv, oblik zapisa je oktalni ili heksadecimalni
Prvi ra unari su programirani upravo na mainskom jeziku
Za programera je ovakav oblik neprihvatljivo neudoban

Simboli ni mainski (asemblerski) jezik i asembler

Programiranje na mainskom jeziku se moralo prilagoditi programeru


Definisani su simboli za instrukcijske kodove, na ine adresiranja, registre
Simboli su mnemoni ki tako da je nivo razumljivosti programa prihvatljiv
Jezik koji koristi simbole nazvan je simboli kim mainskim ili asemblerskim
jezikom
Prevodilac sa simboli kog mainskog na mainski jezik naziva se asembler
U argonu se asemblerski jezik esto zove tako e asemblerom ("program na
asembleru")
Jedna instrukcija simboli kog mainskog jezika se prevodi u ta no jednu
instrukciju MJ
Jedna instrukcija vieg programskog jezika (npr. C) se prevodi u vie
instrukcija MJ

Kao i vii programski jezici, asemblerski jezik definie svoju sintaksu i


semantiku

Procesor i8086

Na kursu se izu ava jezik za Intelov procesor i8086 iz slede ih razloga:


rasprostranjenost Intelove familije procesora (IBM PC se temelji na ovim
procesorima)
asembler za i8086 je baza za modernije procesore Intelove familije (npr. Pentium I,
II, III)
nisu potrebna znanja nekih sofisti nih koncepata arhitekture ra unara

Dvoadresna maina instrukcija moe imati 0, 1 ili 2 operanda


Segmentni model memorije postoje segmentni registri koji omogu avaju
relokaciju
Procesor i8086 nema ortogonalnu arhitekturu
ne moe se svaki na in adresiranja primeniti na svaku instrukciju

Instrukcije, direktive, deklaracije i definicije

Naredbe koje se prevode u mainske 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

Registri

i8086 ima 4 grupe registara:

optenamenski registri (general registers)


segmentni registri (segment registers)
programski broja (pokaziva instrukcije instruction pointer)
registar indikatora (flags)

Optenamenski registri

i8086 ima 8 optenamenskih 16-bitnih registara:


Registri su podeljeni u dve grupe:
registri podataka
pokaziva ki i indeksni registri

Slika prikazuje skup svih optenamenskih registara procesora i8086:


H
L
15
7
8
0
(AH)
AX
(AL)
akumulator (accumulator)
(BH)
BX
(BL)
bazni (base)
(CH)
CX
(CL)
broja (count)
(DH)
DX
(DL)
registar podataka (data)
SP
pokaziva steka (stack pointer)
BP
pokaziva baze (base pointer)
SI
indeks izvora (source index)
DI
indeks odredita (destination index)
Registri podataka se mogu koristiti na dva na ina:
kao 16 bitne jedinice (AX)
kao dva 8-bitna registra (AH i AL)

Pokaziva ki 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 logi ke segmente veli ine 64K
Procesor moe pristupati istovremeno do 4 segmenta

registri
podataka

pokaziva i i
indeksi

Bazne adrese ta 4 segmenta nalaze se u 4 specijalizovana 16-bitna segmentna


registra
Slika prikazuje skup segmentnih registara procesora i8086:
15
0
CS
segment koda (code segment)
DS
segment podataka (data segment)
SS
segment steka (stack segment)
ES
ekstra segment (extra segment)
Registar CS ukazuje na teku i segment sa instrukcijama
instrukcije se dohvataju iz ovog segmenta memorije

Registar DS ukazuje na teku i segment sa podacima


u optem slu aju segment sadri programske promenljive

Registar SS ukazuje na teku i stek


operacije nad stekom se izvravaju nad ovim segmentom

Registar ES ukazuje na teku i ekstra segment


tipi no se koristi za dodatni prostor za podatke (prostor za dinami ku alokaciju - heap)

Segmentni registri su pristupa ni programeru


Dobra programerska praksa nalae da se segmentni registri koriste na disciplinovan
na in

Pokaziva instrukcije

Pokaziva instrukcije (Instruction Pointer) IP je 16-bitni i sadri adresu naredne


instrukcije
Ova adresa je tzv. "ofset" adresa, t.j. relativna adresa u odnosu na po etak segmenta
koda
IP odgovara konvencionalnom pojmu programskog broja a (Program Counter) PC
On se automatski inkrementira pri izvrenju (dohvatanju) svake instrukcije

Ne moe se direktno pristupati IP, ali odre ene instrukcije njime manipuliu
Indikatori

Procesor i8086 ima 6 1-bitnih statusnih indikatora i 3 1-bitna kontrolna indikatora


Indikatore statusa postavlja izvrna jedinica da reflektuju osobine rezultata ALU
operacije
Postoji grupa instrukcija koje omogu avaju da program menja tok na osnovu ovih
indikatora

Programi mogu postavljati ili brisati kontrolne indikatore da menjaju procesorske


operacije
kontrolni
statusni
T D IF O S Z A P C
F F
F F F F F F
prenos (carry)
parnost (parity)
dodatni prenos (auxiliary carry)
nula (zero)
znak (sign)
prekora enje (overflow)
omogu en prekid (interrupt-enable)
smer (direction)
zamka (trap)
CF: ako je 1 bio je prenos iz najvieg ili pozajmica u najvii bit 8- ili 16-bitnog
rezultata
indikator se koristi iz instrukcija koje sabiraju/oduzimaju viebajtne 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 moe koristiti za proveru greaka pri prenosu podataka

AF: ako je 1 bio je prenos/pozajmica izme u gornja i donja 4 bita u bajtu


koristi se iz decimalnih aritmeti kih instrukcija

ZF: ako je 0 rezultat operacije je 0


SF: ako je 1 najvii bit rezultata je 1
negativni brojevi su predstavljeni u komplementu dvojke pa SF predstavlja znak (1
negativan)

OF: ako je 1 dogodilo se aritmeti ko prekora enje


zna ajna cifra je izgubljena jer veli ina rezultata prevazilazi kapacitet odredita
postoji instrukcija Interrupt On Overflow koja e generisati prekid u ovakvoj situaciji

IF: ako je 1- dozvoljava procesoru da prepoznaje spoljanje maskabilne prekide


nema uticaja na spoljanje 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 reimu za testiranje
u ovom reimu procesor generie interni prekid posle svake instrukcije

Memorija

Memorija je organizovana u niz 8-bitnih bajtova (adresibilna jedinica je 1 bajt)


Instrukcije, podaci duine 1 bajta ili 2 bajta (re i) mogu biti smeteni na
proizvoljnoj adresi
Promenljive duine re i koje su na neparnim adresama nazivaju se neporavnatim
(unaligned)
nije mogu 16-bitni prenos neporavnatih re i

Intelova konvencija: re i se smetaju tako da je vii bajt na vioj adresi


Primer: vrednost re i koja po inje na adresi 322H je: 7412H
322H 000 001
1
0
323H 011 010
1
0
Dvostruke re i su specijalna kategorija podataka koji se nazivaju pokaziva i
(pointers)
koriste se da adresiraju podatke i instrukcije koji su izvan teku ih segmenata
nia re pokaziva a sadri ofset-adresu, a via segment-adresu
re i pokaziva a se smetaju konvencionalno: bajt na vioj adresi sadri 8 zna ajnijih bita
re i

Primer: vrednost pokaziva a koji po inje na adresi 104H je:


7490H(segment):6512H(ofset)
104H 000 001
1
0
105H 011 010
0
1
106H 100 000
1
0
107H 011 010
1
0

Segmentacija

Segment je logi ka jedinica memorije koja moe biti do veli ine 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 memorijskom
prostoru

Segmenti po inju na 16-bajtnim memorijskim jedincama (paragrafima)


Nema drugih ograni enja segmenti mogu biti:

susedni, razdvojeni, delimi no ili potpuno preklopljeni

Fizi ka lokacija u memoriji moe pripadati ve em broju logi kih segmenata


Segmentni registri pokazuju (sadre bazne adrese) na 4 teku a adresibilna segmenta
Program obezbe uje pristup drugim segmentima tako to menja sadraj segmentnih
registara
Segmentna organizacija podrava modularno projektovanje softvera

Generisanje fizi ke adrese

Fizi ka adresa je 20-bitna vrednost koja jednistveno identifikuje svaku bajt-lokaciju


Fizi ka adresa je u opsegu 0-FFFFFH t.j. unutar 1M adresnog prostora
Programi radije manipuliu logi kim umesto fizi kim adresama
na taj na in nije potrebno a priori znanje o mestu na koje se locira program u memoriji
tako e, tako se olakava dinami ko upravljanje memorijskim resursima

Logi ka adresa se sastoji od ofset-adrese i segment-adrese


Obe adrese su neozna ene 16-bitne veli ine
Bajt adresiran najmanjom adresom u segmentu ima ofset-adresu 0
Vie razli itih logi kih adresa se moe mapirati u istu fizi ku adresu
Na primer: 2C1:3H =2C0:13H (sintaksa: < segment-adresa>:< ofset-adresa>H)
Uvek kada procesor pristupa memoriji fizi ka adresa se izra unava iz logi ke
to se doga a kada procesor dohvata instrukciju ili ita/pie podatak

Fizi ka adresa se izra unava 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 logi ke adrese zavisi od vrste pristupa memoriji:
Vrsta pristupa
Podrazumevan Alternativna
a
baza
baza segmenta segmenta
Dohvatanje instrukcije
CS
Operacija na steku
SS
Promenljiva (osim
DS
CS,ES,SS
donjih)
Izvor string
DS
CS,ES,SS
Odredite string
ES
BP kori en kao bazni
SS
CS,DS,ES
reg.

Ofset
IP
SP
efektivna adresa
SI
DI
efektivna adresa

Ofset memorijske promenljive se izra unava na osnovu na ina adresiranja


na in adresiranja se zadaje u instrukciji
rezultat se zove efektivna adresa (EA) operanda

Stringovi se adresiraju druga ije 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 mainska instrukcija
ona kae procesoru koji segment-registar da koristi za pristup promenljivoj u slede oj
instrukciji

Implementacija steka

Stek se implementira u memoriji i pristupa mu se pomo u SS i SP registara


Sistem moe imati proizvoljan broj stekova, a max veli ina steka je 64K
Pokuaj prekora enja steka zavrava "gaenjem" po etka steka
SP pokazuje na vrh steka (Top Of the Stack - TOS)

SP sadri ofset TOS-a u odnosu na baznu adresu segmenta koju sadri SS

Stek raste od viih prema niim adresama


Bazna adresa steka koju sadri SS nije dno steka stek raste prema baznoj adresi
Lokacije na steku su 16-bitne (na stek se stavljaju i sa njega uzimaju re i od 16 bita)
Re se stavlja na stek dekrementiranjem SP za 2 i upisom re i na novi TOS
Re se uzima sa steka itanjem sa TOS i inkrementiranjem SP za 2

Posve ene i rezervisane lokacije

Dve oblasti na ekstremno niskim i visokim adresama su posve ene specifi nim
funkcijama
Lokacije od 0 do 7FH (128 bajtova) su posve ene tabeli prekidnih vektora
Lokacije od FFFF0H do FFFFFH (16 bajtova) su posve ene za "boot" sistema

Ulaz/izlaz

Ulazno/izlazni prostor je razdvojen od memorijskog


U/I prostor moe da se prilagodi na 64K 8-bitnih portova ili 32K 16-bitnih
IN i OUT instrukcije prenose podatke izme u 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 16


adresnih linija
Razni oblici U/I instrukcija doputaju da U/I adresa bude specificirana
kao fiksna vrednost u instrukciji

kao promenljiva vrednost u DX registru

Lokacije na U/I adresama od F8H do FFH su rezervisane od strane proizvo a a

Memorijski mapiran ulaz/izlaz

U/I ure aji mogu biti smeteni i u memorijski adresni prostor procesora
Ukoliko ure aj odgovara kao memorijska komponenta CPU ne zna za razliku
Memorijski mapiran U/I obezbe uje ve u fleksibilnost programiranja

proizvoljna instrukcija koja pristupa memoriji se moe koristiti za pristup U/I portu
MOV instrukcija moe prenositi podatke izme u U/I porta i proizvoljnog registra
AND i OR se mogu koristiti da se manipulie bitima u registrima U/I ure aja
mogu se koristiti prednosti raznovrsnosti adresnih na ina

Na ini adresiranja
Uvod

Procesor i8086 nudi ve i broj razli itih na ina adresiranja


Operandi mogu biti u registrima, u instrukciji samoj, u memoriji i na U/I
portovima
Adresa operanada u memoriji i na U/I portovima moe biti izra unata na vie
na ina

Ra unanje adrese operanda u memoriji

Fizi ka adresa se ra una dodavanjem ofset-adrese na ulevo pomerenu segmentadresu


Izra unata ofset-adresa se naziva efektivnom adresom (EA)
EA je 16-bitna adresa koja odre uje pomeraj u odnosu na po etak segmenta
Na in ra unanja adrese operanda u memoriji odre en je u drugom bajtu instrukcije
EA = pomeraj (displacement) + sadraj baznog registra + sadraj indeksnog
registra
Kodirano
u

BX
ili
BP
ili

BX
ili
BP

SI
ili
Eksplicitn
o

SI
ili
DI
+

DI
pomer
aj
000

+
CS

Efektivn
a

ili
SS

000
ili

Podrazumeva
no

DS
ili
+

ES

000
000

fizi ka adresa

Pomeraj je 8- ili 16-bitni broj koji se sadri u instrukciji


Izvodi se iz pozicije imena operanda (promenljive ili labele) u programu
Programer moe i eksplicitno da specificira pomeraj

Za razliku od pomeraja koji je konstantan bazni, odnosno indeksni, registar je


promenljiv
To omogu uje 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 i
najbre
adrese registara se kodiraju u instrukciji sa par bitova
operacija se u celini obavlja unutar CPU (nema ciklusa na magistrali)

Registri mogu sadrati izvorne, odredine ili obe vrste operanada


Primer: MOV AX, CX ; kopira se sadraj registra CX u
registar AX

Neposredno adresiranje

U instrukciji se neposredno zadaju sami operandi koji su konstante


Podaci mogu biti 8 ili 16 bita duine
Pristup neposrednim operandima je brz jer se dohvataju iz instrukcijskog reda
ekanja
Operandi mogu biti samo izvorni i moraju sadrati konstantne vrednosti
Primer: MOV AX, 5 ; kopira se 5 u registar AX

Direktno adresiranje

EA se izra unava samo na osnovu pomeraja


Ovo je najjednostavnije memorijsko adresiranje nisu uklju eni nikakvi registri
Tipi no se koristi za pristup jednostavnim promenljivama skalarima
Primer: MOV AX, X ; kopira se sadraj X u registar AX
OpCod
e

Mod
R/M

Displacement
EA

Registarsko indirektno adresiranje

EA se izra unava na osnovu jednog baznog ili indeksnog registra


Jedna instrukcija moe pristupati razli itim memorijskim lokacijama
postie se tako to se vrednost baznog ili indeksnog registra menja
LEA (Load Effective Address) ili aritmeti ke instrukcije se mogu koristiti za auriranje
registra

Kod JMP i CALL instrukcije se proizvoljan registar moe koristiti za indirektno


adresiranje
Primer: MOV AX,[BX]; kopira se sadraj sa adrese iz BX u
AX
OpCod
e

Mod
R/M

BX
or
BP
or
SI
or
DI

Bazno adresiranje

EA

EA se ra una kao suma pomeraja i sadraja registra BX ili BP


Ako se BP specificira kao bazni registar to izaziva da se pristupa operandu u stek
segmentu
Bazno adresiranje pomo u BP je pogodan na in pristupa podacima na steku
podaci na steku mogu biti parametri koji se prenose u potprogram

Bazno adresiranje omogu ava i jednostavno pristupanje


jednakim strukturama koje su locirane na razna mesta u memoriji
bazni registar se menja da pokazuje na strukturu, a pomeraj odre uje odgovaraju i lan
strukture
razli itim instancama strukture se pristupa jednostavnom izmenom baznog registra

Primeri:
adrese
MOV
MOV
MOV

MOV AX,[BX]+X ; kopira se sadraj sa efektivne


AX,X[BX] ;
AX,[BX+X]
AX,[BX].X

OpCod
e

sadrzaj(BX)+ofset(X) u AX

Mod
R/M

Displacement
or

BX
BP

EA

Indeksirano adresiranje

EA se ra una kao suma pomeraja i sadraja indeksnog registra SI ili DI


Indeksno adresiranje se esto koristi za pristup elemetu nekog niza
pomeraj locira po etak niza a vrednost indeksnog registra selektuje jedan element
poto su svi elementi jednake veli ine, primenjuje se jednostavna indeksna aritmetika

Primeri:
MOV AX,[SI]+X
efektivne adrese
MOV AX,X[SI] ;
OpCod
e

Mod
R/M

; kopira se sadraj sa
sadrzaj(SI)+ofset(X)
Displacement

or

SI
DI

EA

u AX
MOV AX,[SI+X]
MOV AX,[SI].X
Bazno indeksirano adresiranje

EA se ra una kao suma pomeraja, sadraja baznog i sadraja indeksnog registra


Veoma fleksibilan na in adresiranja, jer se dve komponente mogu menjati u vreme
izvrenja
Pogodan na in za proceduru da adresira niz alociran na steku
BP sadri ofset referentne ta ke na steku (TOS nakon smetanja parametara i povratne
adrese)
pomeraj (displacement) sadri ofset po etka niza u odnosu na referentnu ta ku
indeksni registar se koristi da adresira pojedine elemente niza

Takodje, nizovi koji se nalaze u strukturama i matrice se mogu efikasno obra ivati
ovako
Primer:
MOV AX,[BX].X[SI] ; kopira se sadraj sa EA
;
sadr(BX)+sadr(SI)+ofset(X) u AX
OpCod
e

Mod
R/M

Displacement
or

BX
BP

or

SI
DI

EA

Adresiranje stringova

String instrukcije ne koriste normalne na ine memorijskog adresiranja za pristup


operandima
Indeksni registri se koriste implicitno: SI za EA izvornog operanda i DI za EA
odredinog
Na po etku string instrukcije, podrazumeva se da
SI pokazuje na 1. bajt ili re izvornog stringa
DI pokazuje na 1. bajt ili re odredinog 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 na


adresu ES:DI

OpCod
e
SI
DI

Source
EA
Destination
EA

Adresiranje U/I portova

Ako je U/I port memorijski mapiran,


proizvoljan na in adresiranja memorijskog operanda se moe primeniti ( ak i
string)
Za U/I portove koji su locirani u U/I adresni prostor mogu se koristiti dva na ina
adresiranja
direktno adresiranje porta
indirektno adresiranje porta

U direktnom adresiranju broj porta je 8-bitni neposredni operand


ovo omogu ava fiksni pristup portovima od 0 do 255

Indirektno adresiranje porta je sli no registarskom indirektnom adresiranju


memorijskog op.
U indirektnom adresiranju broj porta se uzima iz DX registra
ovo omogu ava fleksibilni pristup portovima od 0 do 65535
program najpre definie adresu porta upisom u DX, a zatim IN/OUT instrukcijom
pristupa portu

Primeri:
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
e

Data

Port
address
Direktno adresiranje
porta

OpCod
e
DX
Port
address
Indirektno adresiranje
porta

Skup instrukcija
Uvod

U ve ini instrukcija mogu figurisati registarski, memorijski i neposredni operandi


Nad memorijskim lokacijama se mogu vriti operacije nije potrebno
prebacivanje u registre
8086 ima repertoar od oko 100 instrukcija simboli kog mainskog jezika
Procesor raspoznaje oko 300 razli itih mainskih instrukcija
MOV instrukcija prenosi bajt ili re iz registra ili memorije ili neposredno u registar ili
memoriju
procesor raspoznaje 28 razli itih mainskih MOV instrukcija (npr. "prenos bajta iz R u
M")

Na ovaj na in se kombinuje
jednostavnost programiranja na simboli kom nivou
efikasnost smetanja instrukcija na mainskom nivou

Jednoj SMJ (ASM) instrukciji odgovaraju razli iti formati (kra i i dui) mainske
instrukcije
Npr. programer pie INC, a asembler na osnovu operanda odre uje mainsku
instrukciju

Instrukcije za prenos podataka


Postoji 14 instrukcija

za prenos podataka izme u memorije i registara i izme u registara i U/I porta


za manipulisanje stekom i za prenos indikatora
za punjenje segmentnih registara

Optenamenske instrukcije za prenos

MOV odredite, izvorite (Move)


prenosi bajt ili re od izvornog do odredinog operanda

PUSH izvorite

(Push)

dekrementira SP za 2 pa prenosi re od izvorita do vrha steka na koji ukazuje SP


esto se koristi za smetanje parametara na stek pre poziva procedure
osnovni na in za smetanje privremenih podataka na stek

POP odredite

(Pop)

prenosi re sa vrha steka na koji ukazuje SP do odredita, pa tada inkrementira SP za 2


moe se koristiti za prenos privremenih promenljivih sa steka u registre ili memoriju

XCHG odredite, izvorite (Exchange)


zamenjuje sadraje izvorita i odredita (bajt ili re )

kada se koristi sa LOCK prefiksom moe testirati i postaviti (test and set) semafor

semafor se korsiti da zatiti zajedni ki resurs u multiprocesorskom okruenju


XLAT translaciona_tabela (Translate)

menja bajt u AL registru sa bajtom iz 256-bajtne translacione tabele


AL treba pre izvrenja instrukcije da sadri ofset u tabeli
podrazumeva se da e se BX koristiti da ukae na po etak 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 moe biti specificiran pomo u neposredne bajt-konstante ili pomo u DX
registra
neposredno adresiranje porta doputa portove 0-255, a adresiranje preko DX portove 065535

OUT port, akumulator (Output)


prenosi bajt ili re iz AL ili AX registra na izlazni port
broj porta moe biti specificiran pomo u neposredne bajt-konstante ili pomo u DX
registra

Prenos adresa

Instrukcije ne manipuliu sadrajem ve adresom promenljivih


Najkorisnije su za obradu lista, bazne promenljive i operacije nad stringovima
LEA odredite, izvorite (Load Effective Address)

prenosi ofset izvorinog operanda (ne njegovu vrednost) u odredite


izvorini operand mora biti memorijski operand
odredini operand mora biti 16-bitni optenamenski registar
ne uti e na indikatore
koristi se da napuni neke registre za potrebe drugih instrukcija
(npr. BX registar adresom translacione tabele koju koristi XLAT instrukcija)

LDS odredite, izvorite (Load pointer using DS)


prenosi 32-bitnu pokaziva ku promenljivu iz izvorinog operanda u odredini operand i
DS
izvorini operand mora biti u memoriji
re ofseta pokaziva a se prenosi u odredite koje moe biti 16-bitni optenamenski
registar
re segmenta pokaziva a se prenosi u DS

za obradu stringa koji nije u teku em segmentu podataka pogodno je specificirati SI


kao odredite
(string instrukcije smatraju da je izvorini string u teku em segmentu podataka, a SI
sadri ofset)

LES odredite, izvorite (Load pointer using ES)


prenosi 32-bitnu pokaziva ku promenljivu iz izvorinog operanda u odredini operand i
ES
izvorini operand mora biti u memoriji
re ofseta pokaziva a se prenosi u odredite koje moe biti 16-bitni optenamenski
registar
re segmenta pokaziva a se prenosi u ES
za obradu stringa koji nije u teku em ekstra segmentu pogodno je specificirati DI kao
odredite
(odredini string mora biti u ekstra segmentu podataka, a DI mora sadrati ofset)

Prenos indikatora

Indikatori imaju slede e pozicije:


O D IF T
S
Z
F
F
F
F
F
15 14 13 12 11 10 9
8
7
6
LAHF (Load register AH from Flags)

A
F
4

P
F
2

kopira SF, ZF, AF, PF i CF u bite 7, 6, 4, 2 i 0 registra AH


sadraj 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
slui za smetanje indikatora na stek pri pozivu potprograma
na in za izmenu TF indikatora (nema direktne instrukcije): PUSHF, izmena na steku,
POPF

POPF (Pop Flags)


prenosi specifi ne bite iz re i na vrhu steka u indikatore, a zatim inkrementira SP za 2
slui za restauraciju indikatora pri povratku iz potprograma

C
F
0

Aritmeti ke instrukcije

Postoji 20 aritmeti kih instrukcija podeljenih u grupe:

sabiranje
oduzimanje
mnoenje
delenje

Aritmeti ki formati podataka


Postoje 4 tipa podataka:

neozna eni binarni (cardinals)


ozna eni binarni (integers)
neozna eni pakovani decimalni
neozna eni nepakovani decimalni

Binarni brojevi mogu biti duine 8 ili 16 bita


Decimalni brojevi se smetaju u bajtove
dve cifre u bajt za pakovane decimalne
jedna cifra u bajt za nepakovane decimalne

Procesor uvek podrazumeva da operandi u aritmeti koj instrukciji sadre valjane


brojeve
Loi podaci mogu proizvesti nepredvidive rezultate

Neozna eni binarni brojevi

Mogu biti duine 8 ili 16 bita


Svi biti odre uju vrednost nenegativnog broja
Opseg 8-bitnih brojeva je 0-255
Opseg 16-bitnih brojeva je 0-65535
Mogu e su operacije sabiranja, oduzimanja, mnoenja i deljenja

Ozna eni binarni brojevi (integers)

Mogu biti duine 8 ili 16 bita


Najvii (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 vri pomo u instrukcija za neozna ene binarne brojeve
Za mnoenje i deljenje ozna enih brojeva postoje posebne instrukcije

Pakovani decimalni brojevi

Smetaju se kao neozna ene veli ine duine jednog bajta


Bajt sadri po jednu decimalnu cifru u svakoj svojoj polovini (nibli)
Cifra u gornjoj polovini je ve eg zna aja
Vrednosti u opsegu 0-9 su validne u svakoj polovini bajta, tako da je opseg broja
0-99
Sabiranje i oduzimanje se izvravaju u dva koraka:
izvrava se neozna ena binarna operacija koja proizvodi privremeni rezultat u AL
izvrava se instrukcija prilago enja koja menja vrednost u AL u finalni pakovani
decimalni broj

Ne postoje mnoenje i deljenje za pakovane decimalne brojeve

Nepakovani decimalni brojevi

Smetaju se kao neozna ene veli ine duine jednog bajta


Vrednost broja je odre ena donjom polovinom bajta (donja nibla)
Vrednosti u opsegu 0-9 su validne i interpretiraju se kao decimalni brojevi
Via nibla mora biti 0 za mnoenje i deljenje, a za sabiranje i oduzimanje je
proizvoljna
Sabiranje, oduzimanje i mnoenje se izvravaju u dva koraka:
izvrava se neozna ena binarna operacija koja proizvodi privremeni rezultat u AL
izvrava se instrukcija prilago enja koja menja AL u finalni nepakovani decimalni broj

Deljenje se obavlja tako e u dva koraka:


izvrava se prilago enje deljenika (brojioca) u AL
izvrava se neozna ena binarna operacija deljenja koja proizvodi finalni rezultat

ASCII cifre

ASCII karakteri koji sadre cifre "0"-"9" su sli ni nepakovanim decimalnim


brojevima
Razlika je u tome to gornja nibla ASCII cifre uvek sadri vrednost 3
Aritmetika za nepakovane decimalne brojeve se primenjuje za ASCII cifre pod
uslovima:
via nibla ASCII cifre se postavlja na 0 pre mnoenja ili deljenja
nakon izvrenja operacije mora se upisati 3 u gornju niblu rezultata da se dobije ASCII
cifra

Aritmeti ke instrukcije i indikatori

Aritmeti ke instrukcije postavljaju 6 indikatora da ukau na osobine rezultata


operacije

Ve ina indikatora se moe testirati nakon aritmeti ke instrukcije u instrukciji


uslovnog skoka
Moe se koristiti i INTO (Interrupt on Overflow) instrukcija
Razli ite instrukcije razli ito uti u na indikatore; ovde su navedena neka generalna
pravila
CF (Carry Flag)

postavlja se ako kod sabiranja do e do prenosa iz najvieg bita rezultata


postavlja se ako kod oduzimanja do e do pozajmice u najvii bit rezultata
za ozna eni prenos vai CFOF
CF se moe koristiti za detekciju neozna enog prekora enja
instrukcije ADC i SBB, kao i RCL i RCR uklju uju CF u operacije
ADC i SBB se koriste za viebajtno (32-bita, 64-bita) sabiranje i oduzimanje

AF (Auxiliary Carry Flag)


postavlja se ako kod sabiranja do e do prenosa iz najvieg bita donje nible u gornju
postavlja se ako kod oduzimanja do e do pozajmice iz gornje nible u najvii bit donje
nible
koristi se prakti no samo kod instrukcija za decimalno prilago enje

SF (Sign Flag)
aritmeti ke i logi ke instrukcije postavljaju SF da bude jednak najviem bitu (7. ili 15.)
rezultata
za ozna ene binarne brojeve SF e biti 0 za nenegativne i 1 za negativne brojeve
uslovna instrukcija skoka koja zavisi od SF se moe koristiti posle aritmeti ke operacije
na taj na in tok programa moe biti promenjen u zavisnosti od znaka rezultata operacije
nakon operacija sa neozna enim brojevima SF treba ignorisati

ZF (Zero Flag)
aritmeti ke i logi ke instrukcije ga postavljaju ako je rezultat operacije 0
postoji uslovna instrukcija skoka koja zavisi od ZF

PF (Parity Flag)
aritmeti ke i logi ke instrukcije ga postavljaju ako niih 8 bita rezultata sadri paran
broj 1
moe se koristiti za proveru parnosti (npr. kod ASCII karaktera)

OF (Overflow Flag)
postavlja se ako je rezultat operacije suvie veliki pozitivan ili suvie mali negativan
broj
"suvie" se odre uje prema duini odredita operacije
ukazuje na prekora enje u aritmetici sa znakom
moe se ignorisati kada se radi aritmetika neozna enih brojeva

moe se testirati uslovnom instrukcijom skoka ili INTO (Interrupt on Overflow)


instrukcijom

Sabiranje

ADD odredite, izvorite (Add)


suma dva operanda koji mogu biti 8- ili 16-bitni zamenjuje odredini operand
oba operanda mogu biti ozna ena ili neozna ena
ADD menja AF, CF, OF, PF, SF i ZF

ADC odredite, izvorite (Add with Carry)


sabira dva operanda (koji mogu biti 8- ili 16-bitni) i CF te zamenjuje odredini operand
rezultatom
oba operanda mogu biti ozna ena ili neozna ena
ADC menja AF, CF, OF, PF, SF i ZF
moe se koristiti da se piu rutine za sabiranje brojeva duih od 16 bita

INC odredite

(Increment)

dodaje 1 na odredini operand koji moe biti 8- ili 16-bitni


operand se tretira kao neozna eni binarni broj
INC menja AF, OF, PF, SF i ZF, a ne uti e na CF

AAA

(ASCII Adjust for Addition)

menja sadraj registra AL u ispravan nepakovani decimalni broj tako to uisuje 0 u


gornju niblu
AAA menja AF i CF, a sadraj 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 sadraj AL u par valjanih decimalnih cifara
DAA menja AF, CF, PF, SF i ZF, a sadraj OF je nedefinisan

Oduzimanje

SUB odredite, izvorite (Subtract)


izvorini operand se oduzima od odredinog i rezultat zamenjuje odredini operand
operandi mogu biti bajtovi ili re i i to ozna eni ili neozna eni binarni brojevi
SUB menja AF, CF, OF, PF, SF i ZF

SBB odredite, izvorite (Subtract with Borrow)


izvorini operand i CF se oduzimaju od odredinog i rezultat zamenjuje odredini
operand
operandi mogu biti bajtovi ili re i i to ozna eni ili neozna eni binarni brojevi
SBB menja AF, CF, OF, PF, SF i ZF

moe se koristiti da se piu rutine za oduzimanje brojeva duih od 16 bita

DEC odredite

(Decrement)

oduzima 1 od odredinog operanda koji moe biti 8- ili 16-bitni


DEC menja AF, OF, PF, SF i ZF, a ne uti e na CF

NEG odredite

(Negate)

oduzima odredini operand koji moe biti 8- ili 16-bitni od 0 i upisuje rezultat u
odredite
izra unava drugi komplement broja, efektivno menjaju i znak celobrojne vrednosti
ako je operand 0 znak se ne menja
ako je bajt-operand jednak 128 ili re -operand jednak 32768 nema promene
operanda, OF=1
NEG menja AF, CF, OF, PF, SF i ZF; CF je uvek postavljen na 1 izuzev kada je
operand jednak 0

CMP odredite, izvorite (Compare)


oduzima izvorini od odredinog operanda koji mogu biti 8- ili 16-bitni ali ne upisuje
rezultat
operandi su neizmenjeni, ali su indikatori postavljeni i mogu se testirati narednom
instrukcijom
CMP menja AF, CF, OF, PF, SF i ZF
komparacija koja se reflektuje na indikatore ima smer od odredita prema izvoritu
na primer: ako iza CMP ide JG (Jump if Greater) skok e se dogoditi ako je odredite >
izvorite

AAS

(ASCII Adjust for Subtraction)

menja sadraj registra AL u ispravan nepakovani decimalni broj tako to uisuje 0 u


gornju niblu
AAS menja AF i CF, a sadraj OF, PF, SF i ZF je nedefinisan

DAS

(Decimal Adjust for Subtraction)

koriguje rezulatat u AL prethodnog oduzimanja dva valjana pakovana decimalna


operanda
odredini operand je morao biti u registru AL
DAS menja sadraj AL u par valjanih decimalnih cifara
DAS menja AF, CF, PF, SF i ZF, a sadraj OF je nedefinisan

Mnoenje

MUL izvorite

(Multiply)

obavlja neozna eno mnoenje izvorinog operanda i akumulatora


ako je izvorini operand bajt tada se on mnoi sa AL, a rezultat (duple irine) se vra a u
AX

ako je izvorini operand re tada se on mnoi sa AX, a rezultat (duple irine) se vra a u
DX i AX
operandi se tretiraju kao neozna eni binarni brojevi
ako je via polovina rezultata (AH odnosno DX) razli ita od nule CF i OF se
postavljaju
sadraj AF, PF, SF i ZF je nedefinisan

IMUL izvorite

(Integer Multiply)

obavlja ozna eno mnoenje izvorinog operanda i akumulatora


ako je izvorini operand bajt tada se on mnoi sa AL, a rezultat (duple irine) se vra a u
AX
ako je izvorini operand re tada se on mnoi sa AX, a rezultat (duple irine) se vra a u
DX i AX
ako je via polovina rezultata (AH odnosno DX) nije ekstenzija znaka nie CF i OF se
postavljaju
kada su CF i OF postavljeni na 1 ukazuju da AH ili DX sadre zna ajne cifre
rezultata
sadraj AF, PF, SF i ZF je nedefinisan

AAM

(ASCII Adjust for Multiply)

koriguje rezultat prethodnog mnoenja dva valjana nepakovana decimalna operanda


valjan dvocifreni nepakovani decimalni broj se izvodi iz sadraja AH i AL i smeta u
AH i AL
vie nible mnoenih operanada moraju sadrati 0 da bi AAM proizveo dobar rezultat
AAM menja sadraj PF, SF i ZF; sadraj AF, CF i OF je nedefinisan

Deljenje

DIV izvorite

(Divide)

obavlja neozna eno deljenje akumulatora (i njegove ekstenzije) izvorinim operandom


ako je izvorini operand bajt njime se deli deljenik dvostruke irine koji je u AH i AL
koli nik se vra a u AL, a ostatak u AH
ako je izvorini operand re njime se deli deljenik dvostruke irine koji je u DX i AX
koli nik se vra a u AX, a ostatak u DX
ako koli nik prevazi e kapacitet odredinog registra, kao kada se pokua deljenje 0
generie se prekid tipa 0, a koli nik i rezultat su nedefinisani
necelobrojni koli nici se odsecaju na celobrojne
sadraj AF, CF, OF, PF, SF i ZF je nedefinisan

IDIV izvorite

(Integer Divide)

obavlja ozna eno deljenje akumulatora (i njegove ekstenzije) izvorinim operandom


ako je izvorini operand bajt njime se deli deljenik dvostruke irine koji je u AH i AL

koli nik se vra a u AL, a ostatak u AH


za celobrojno deljenje bajta maksimalni pozitivni koli nik je +127, a minimalni
negativni -127
ako je izvorini operand re njime se deli deljenik dvostruke irine koji je u DX i AX
koli nik se vra a u AX, a ostatak u DX
za celobrojno deljenje re i max pozitivni koli nik je +32767, a min negativni 32767
ako je koli nik pozitivan a prevazilazi maksimum, ili negativan a prevazilazi minimum,
koli nik i ostatak su nedefinisani, a generie se prekid tipa 0
ovo se deava kada se pokua deljenje 0
necelobrojni koli nici se odsecaju prema 0, a ostatak ima isti znak kao i deljenik
sadraj 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 koli nik dobijen deljenjem bude valjan nepakovani decimalni broj
AH mora biti 0 za naredni DIV da se dobije korektan rezultat
koli nik se vra a u AL, a ostatak u AH obe vie nible se anuliraju
AAD menja PF, SF i ZF; sadraj AF, CF i OF je nedefinisan

CBW

(Convert Byte to Word)

proiruje znak bajta u registru AL na registar AH


ne uti e na indikatore
moe se koristiti da se napravi deljenik duine re i od bajta pre deljenja bajtom

CWD

(Convert Word to Doubleword)

proiruje znak re i u registru AX na registar DX


ne uti e na indikatore
moe se koristiti da se napravi deljenik duine dvostruke re i od re i pre deljenja
jednom re i

Instrukcije koje manipuliu bitima

Postoje 3 kategorije instrukcija koje manipuliu bitima bajta ili re i:

logi ke instrukcije (NOT, AND, OR, XOR, TEST)


instrukcije pomeranja (SHL, SAL, SHR, SAR)
instrukcije rotacije (ROL, ROR, RCL, RCR)

Logi ke instrukcije

Realizuju 4 bulova operatora kao i TEST instrukciju koja samo postavlja


indikatore
AND, OR, XOR i TEST manipuliu indikatorima na slede i na in:
OF i CF se uvek postavljaju na 0

AF je uvek nedefinisan nakon logi ke instrukcije


SF, ZF i PF se uvek postavljaju tako da reflektuju rezultat i mogu se testirati uslovnim
skokom
interpretacija SF, ZF i PF je ista kao nakon aritmeti kih instrukcija
NOT ne uti e na indikatore

NOT odredite

(Not)

invertuje bite (ra una jedini ni komplement) operanda duine bajta ili re i

AND odredite, izvorite (And)


obavlja logi ku "I" operaciju izme u dva operanda (bajta ili re i) i vra a rezultat u
odredite
bit rezultata je 1 ako su oba odgovaraju a bita operanada 1, ina e je 0

OR odredite, izvorite

(Or)

obavlja logi ku "ILI" operaciju izme u dva operanda (bajta ili re i) i vra a rezultat u
odredite
bit rezultata je 1 ako je barem jedan od dva odgovaraju a bita operanada 1, ina e je 0

XOR odredite, izvorite (Exclusive Or)


obavlja logi ku "ekskluzivno ILI" operaciju izme u dva operanda i vra a rezultat u
odredite
bit rezultata je 1 ako dva odgovaraju a bita operanada imaju razli ite vrednosti, ina e je 0

TEST odredite, izvorite (Test)


obavlja logi ku "I" operaciju izme u dva operanda (bajta ili re i) i samo postavlja
indikatore
rezultat se ne upisuje, niti se operandi menjaju
ako se nakon TEST instrukcije izvri JNZ (Jump if Not Zero) do skoka e do i
ako postoji barem jedan bit jednak 1 na korespondentnim pozicijama u operandima

Instrukcije pomeranja

Biti u bajtu ili re i mogu biti pomerani aritmeti ki ili logi ki


Broj koji se navodi u instrukciji omogu ava do 255 pomeranja
Broj se moe specificirati kao neposredna konstanta 1 ili kao registar CL
(promenljivi broja )
Aritmeti ka pomeranja se mogu koristiti za mnoenje i deljenje binarnih brojeva
stepenima 2
Logi ka pomeranja se mogu koristiti da bi se izolovali biti u bajtovima ili re ima
Instrukcije pomeranja manipuliu indikatorima na slede i na in:
AF je uvek nedefinisan nakon instrukcije pomeranja
SF, ZF i PF se uvek postavljaju kao u logi kim instrukcijama
CF uvek sadri vrednost poslednjeg bita koji je pomeren izvan odredinog operanda

OF je uvek nedefinisan nakon viebitnog pomeranja


pri pomeranju za jednu poziciju OF je 1 ako se bit najvieg zna aja menja

SHL/SAL odredite, broj


Left)

(Shift Logical/Arithmetic

obavljaju istu operaciju i fizi ki su ista instrukcija


odredini bajt ili re se pomera ulevo za broj bita specificiran u operandu broj
sa desne strane ulaze 0 pri pomeranju ulevo
ako bit znaka (najvii bit odredita) zadrava vrednost OF se postavlja na 0

SHR odredite, broj

(Shift Logical Right)

pomera bite operanda odredita (bajt ili re ) u desno za broj bita specificiran
operandom broj
sa leve strane ulaze 0 pri pomeranju udesno
ako bit znaka (najvii bit odredita) zadrava vrednost OF se postavlja na 0

SAR odredite, broj

(Shift Arithmetic Right)

pomera bite operanda odredita (bajt ili re ) u desno za broj bita specificiran
operandom broj
sa leve strane ulaze biti jednaki originalnom najviem bitu (zadrava se predznak)
SAR odseca pozitivne brojeve prema 0, a negativne prema -
rezultat SAR i odgovaraju eg IDIV se razlikuju jer IDIV odseca sve vrednosti prema 0

Instrukcije rotacije

Biti koji pri rotaciji izlaze iz odredita se ne gube, ve se pojavljuju "sa druge
strane"
Kao kod instrukcija pomeranja, broj pozicija za rotaciju moe biti konstanta 1 ili
CL
CF se moe koristiti kao ekstenzija operanda u dve instrukcije
Tako se bit moe izolovati u CF pa zatim testirati pomo u JC (Jump if Carry) ili
JNC
Rotacije uti u samo na CF i OF
CF uvek sadri vrednost poslednjeg bita koji je pri rotaciji izaao iz odredita
Pri rotaciji za vie pozicija, OF je uvek nedefinisan
Pri rotaciji za jednu poziciju OF se postavlja na 1 ako operacija menja najvii bit
odredita
ROL odredite, broj

(Rotate Left)

rotira odredite (bajt ili re ) ulevo za specificirani broj pozicija

ROR odredite, broj

(Rotate Right)

rotira odredite (bajt ili re ) udesno za specificirani broj pozicija

RCL odredite, broj

(Rotate through Carry Left)

rotira odredite (bajt ili re ) ulevo za specificirani broj pozicija


CF se tretira kao deo odredita
vrednost CF se pomera u najnii bit odredita dok se CF puni najviim bitom odredita

RCR odredite, broj

(Rotate through Carry Right)

isto kao RCL, samo se rotira na desnu stranu

Instrukcije za kontrolu toka

Sekvenca izvravanja instrukcija odre ena je sadrajem CS i IP registara


Registar CS sadri baznu adresu teku eg segmenta koda iz kojeg se dohvataju
instrukcije
Registar IP sadri ofset u odnosu na po etak segmenta
Kombinacija CS i IP ukazuje na memorisjku lokaciju iz koje se dohvata naredna
instrukcija
Instrukcije za kontrolu toka menjaju sadraj 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 uti u na indikatore

Bezuslovni skokovi

Instrukcije bezuslovnih skokova mogu prenositi kontrolu


unutar segmenta (intrasegment transfer); u asembleru se ovi skokvi nazivaju NEAR
izme u segmenata (intersegment transfer); u asembleru se ovi skokvi nazivaju FAR

JMP cilj

(Jump)

bezuslovno prenosi kontrolu na ciljnu lokaciju


adresa cilja moe biti u samoj instrukciji (direktan skok) ili u memoriji/registru
(indirektan skok)
unutarsegmentni direktan skok menja IP dodaju i relativan pomeraj cilja iz JMP
instrukcije
ako asembler moe da odredi da je cilj unutar 127 bajtova od JMP on generie 2-bajtni
JMP
2-bajtna JMP instrukcija se naziva SHORT JMP
ina e, asembler generie NEAR JMP koji adresira cilj unutar 32K, a duina
instrukcije je 3-bajta

unutarsegmentni direktni skokovi su samo-relativni


oni su odgovaraju i u dinami ki relokatibilnim rutinama u kojima su JMP i cilj u istom
segmentu
unutarsegmentni indirektni skok moe biti kroz memorijsku lokaciju ili kroz 16-bitni
registar
memorijska lokacija ili registar koje adresira instrukcija sadre re kojom se zamenjuje
sadraj IP
me usegmentni direktan skok zamenjuje IP i CS vrednostima koje se sadre u
instrukciji
me usegmentni indirektan skok moe biti realizovan samo kroz memoriju
prva re dvore nog pokaziva a koji adresira instrukcija zamenjuje IP, a druga CS

CALL ime_procedure

(Call)

prenosi kontrolu proceduri i omogu ava da se prekinuti tok kontrole nastavi


instrukcijom RET
asembler generie razli it tip CALL instrukcije u zavisnosti od definisanja imena
procedure
ime_procedure moe biti NEAR (procedura u istom segmentu) ili FAR (u drugom
segmentu)
da bi se kontrola propisno vratila CALL i RET moraju biti upareni po tipu
CALL i RET mogu biti u nezavisno asembliranim programima pa moe do i do
neuparenosti
mogu i su direktni pozivi (adresa procedure u instrukciji) i indirektni (adresa u
memoriji/registru)
procesor automatski podeava IP da ukazuje na slede u instrukciju pre smetanja na
stek
unutarsegmentni direktan poziv dekrementira SP za 2 i tada IP smeta 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 dinami ki relokatibilne rutine
instrukcija CALL i procedura su u istom segmentu i relociraju se zajedno
unutarsegmentni indirektan poziv se moe realizovati kroz memorijsku lokaciju ili kroz
registar
ofset ciljne procedure se dohvata iz adresirane memorijske lokacije ili registra
me usegmentni direktan poziv dekrementira SP za 2 i smeta CS na stek
CS se puni segmentnom adresom iz instrukcije, pa se SP ponovo dekrementira za 2
IP se smeta na stek pa se zatim puni ofset adresom iz instrukcije
me usegmentni indirektan poziv se moe realizovati samo kroz memoriju
SP se dekrementira za 2, CS se smeta na stek

zatim se CS puni sadrajem druge re i pokaziva ke memorijske lokacije koja je


adresirana
SP se ponovo dekrementira za 2, pa se IP smeta na stek
na kraju se IP puni sadrajem prve re i pokaziva ke memorijske lokacije koja je
adresirana

RET opciona_pop_vrednost (Return)


vra a kontrolu iz procedure instrukciji koja je sledila CALL kojim je aktivirana
procedura
ako je procedura definisana kao NEAR asembler generie unutarsegmentni RET
ako je procedura definisana kao FAR asembler generie me usegmentni RET
RET uzima sa vrha steka re kojom puni IP i inkrementira SP za 2
ako je RET me usegmentni 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 SP
ova mogu nost 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" izvrava se naredna instrukcija
svi uslovni skokovi su SHORT
cilj mora biti u istom segmentu i to unutar -128 do +127 bajtova od naredne
instrukcije
uslovni skokovi su samo-relativni i tako pogodni za dinami ki relokatibilne
rutine
tabela prikazuje sve vrste uslovnih skokova:
Mnemonik

Testirani uslov

JA/JNBE

(CF or ZF)=0

JAE/JNB

CF=0

JB/JNAE

CF=1

JBE/JNA

(CF or ZF)=1

JC
JE/JZ

CF=1
ZF=1

Skok ako je...


iznad (above)/nije ispod ni jednako (not below
nor equal)
iznad ili jednako (above or equal) /nije ispod
(not below)
ispod (below)/nije iznad ni jednako (not above
nor equal)
ispod ili jednako (below or equal)/nije iznad
(not above)
prenos (carry)
jednako (equal)/nula (zero)

JG/JNLE

((SF xor OF) or ZF)=0

JGE/JNL

(SF xor OF)=0

JL/JNGE

(SF xor OF)=1

JLE-JNG

((SF xor OF) or ZF)=1

JNC
JNE/JNZ
JNO
JNP/JPO

CF=0
ZF=0
OF=0
PF=0

JNS
JO
JP/JPE
JS

SF=0
OF=1
PF=1
SF=1

ve e (greater)/ nije manje ni jednako (not less


nor equal)
ve e ili jednako (greater or equal)/ nije manje
(not less)
manje (less)/ nije ve e ni jednako (not greater
nor equal)
manje ili jednako (less or equal)/ nije ve e (not
greater)
nije prenos (not carry)
nije jednako (not equal)/nije nula (not zero)
nema prekora enja (not overflow)
nema parnosti (not parity)/ neparno (parity
odd)
ne znak (not sign)
prekora enje (overflow)
parnost (parity)/ parno (parity even)
znak (sign)

iznad (above) i ispod (below) se odnose na odnose neozna enih veli ina
ve e (greater) i manje (less) se odnose na odnose ozna enih veli ina

Kontrola iteracija

instrukcije za kontrolu iteracija se mogu koristiti za regulisanje ponavljanja petlji


instrukcije koriste CX kao broja ki 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
ina e, izvrava se naredna instrukcija

LOOPE/LOOPZ kratka-labela (Loop while Equal/Loop while


Zero)
CX se dekrementira za 1 i kontrola se prenosi na cilj ako CX nije 0 i ako je ZF=1
ina e, izvrava se naredna instrukcija

LOOPNE/LOOPNZ kratka-labela (Loop while Not Equal/Not


Zero)
CX se dekrementira za 1 i kontrola se prenosi na cilj ako CX nije 0 i ako je ZF=0
ina e, izvrava se naredna instrukcija

JCXZ kratka-labela

(Jump if CX Zero)

prenosi kontrolu na cilj ako je CX jednako 0


instrukcija je korisna na po etku petlje da se presko i petlja ako CX sadri 0

Instrukcije prekida

Omogu avaju da se prekidne procedure aktiviraju programski


Efekat softverskih prekida je sli an hardverski iniciranim prekidima
INT tip-prekida (Interrupt)
aktivira prekidnu proceduru specificiranu pomo u 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 ra una mnoe i 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 smeta u IP
ako je tip-prekida=3 asembler generie kratku formu instrukcije (1Byte)
ovakva instrukcija se naziva breakpoint prekidom
softverski prekidi se mogu koristiti za "supervizorske pozive" (pozive operativnog
sistema)
za svaku vrstu servisa koji operativni sistem prua aplikaciji se moe koristiti poseban
tip prekida
softverski prekidi se tako e mogu koristiti za testiranje rutina pisanih za hardverske
prekide

INTO

(Interrupt on Overflow)

generie softverski prekid ako je OF=1


ina e, kontrola se prenosi na slede u instrukciju bez izazivanja prekida
prenosi kontrolu prekidnoj proceduri preko vektora na adresi 10H (tip prekida = 4)
postavlja TF=0 i IF=0 i ina e se ponaa kao INT
pie se posle aritmeti ke/logi ke operacije da aktivira prekidnu rutinu ako do e do
prekora enja

IRET

(Interrupt Return)

vra a kontrolu na mesto gde se dogodio prekid, tako to sa steka skida IP, CS i
indikatore
IRET uti e na sve indikatore jer ih restaurira na prethodno sa uvane 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 uti e na ostale indikatore

korisna je zajedno sa RCL i RCR instrukcijama

CMC

(Complement Carry flag)

menja CF u suprotno stanje i ne uti e na ostale indikatore

STC

(Set Carry flag)

postavlja CF=1 i ne uti e na ostale indikatore

CLD

(Clear Direction flag)

postavlja DF=0 i ne uti e na ostale indikatore


uzrokuje da string instrukcije auto-inkrementiraju SI i/ili DI

STD

(Set Direction flag)

postavlja DF=1 i ne uti e na ostale indikatore


uzrokuje da string instrukcije auto-dekrementiraju SI i/ili DI

CLI

(Clear Interrupt-enable flag)

postavlja IF=0 i ne uti e na ostale indikatore


kada je IF resetovan procesor ne raspoznaje spoljanje prekide preko INTR ulaza
maskabilni prekidi su onemogu eni
nemaskabilni prekid preko NMI ulaza sa potuje, kao i softverski prekidi

STI

(Set Interrupt-enable flag)

postavlja IF=1 i ne uti e na ostale indikatore


omogu ava da procesor prepoznaje prekide koji se pojavljuju na INTR liniji
prekid koji eka se ne e stvarno raspoznati sve do izvrenja instrukcije koja sledi ST

String instrukcije

String instrukcije omogu avaju manipulisanje stringovima do 64K bajtova ili re i


Postoji 5 osnovnih string instrukcija za
prenos, komparaciju, traenje vrednosti i razmenu elemenata stringa sa akumulatorom

Osnovnim instrukcijama moe prethoditi jedno-bajtni prefiks


Prefiks uzrokuje hardversko ponavljanje instrukcije
Ovakvo ponavljanje instrukcije je bre od ponavljanja koje omogu ava softverska
petlja
Ponavljanje se moe zaustaviti pomo u raznih uslova, a moe biti i prekinuto pa
nastavljeno
String instrukcije na sli an na in (prikazan donjom tabelom) koriste registre i
indikatore
SI
Indeks (ofset) izvorinog stringa
DI
Indeks (ofset) odredinog stringa
CX
Broja ponavljanja

AL/A
Vrednost za traenje; odredite za LODS; izvorite za STOS
X
DF
0=autoinkrementiranje SI, DI; 1=autodekrementiranje SI, DI
ZF
terminator za traenje i komparaciju
Neke string instrukcije imaju izvorini, neke odredini, a neke oba operanda
Hardver podrazumeva da se izvorini operand nalazi u teku em segmentu
podataka
Segmentni prefiks (1 bajt) se moe koristiti da se promeni gornja pretpostavka
Odredini string mora biti u teku em ekstra segmentu (ne moe se promeniti
prefiksom)
Asembler proverava atribute operanada da utvrdi da li su elementi bajtovi ili re i
Asembler ne koristi imena operanada za adresiranje stringova
asembler koristi sadraj SI kao ofset adresu teku eg elementa izvorinog stringa
asembler koristi sadraj DI kao ofset adresu teku eg elementa odredinog stringa

Registri SI i DI moraju biti inicijalizovani da ukazuju na izvorine/odredine


stringove
instrukcije LDS, LES i LEA mogu biti korisne u ove svrhe

String instrukcije automatski modifikuju SI i DI da omogu e obradu slede eg


elementa
DF odre uje da li se SI i DI inkrementiraju ili dekrementiraju (0 inkrement,
1 dekrement)
veli ina inkrementa/dekrementa je odre ena tipom operanda (bajt 1, re 2)

Ako postoji prefiks ponavljanja CX registar se dekrementira za 1 nakon svakog


izvrenja
CX se mora inicijalizovati na broj ponavljanja pre izvrenja string instrukcije
Ako je CX=0 string instrukcija se ne izvrava i kontrola se prenosi na slede u
instrukciju
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 kontrolie ponavljanje naredne string
instrukcije
razli iti mnemonici su definisani zbog razumljivosti programa
prefiks ponavljanja ne uti e na indikatore
REP se interpretira se kao "ponavljanje dok se ne stigne do kraja stringa" (CX0)
REP se koristi sa MOVS (Move String) i STOS (Store String)
REPE i REPZ su fizi ki isti prefiksni bajt kao i REP

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 slede eg ponavljanja
ZF postavljaju CMPS i SCAS
REPNE i REPNZ su dva menmonika za isti prefiksni bajt
REPNE i REPNZ funkcioniu isto kao REPE i REPZ samo to zahtevaju da je ZF=0
ZF ne treba da bude inicijalizovan pre ponavljaju e string instrukcije
ponavljaju e string sekvence su prekidive: procesor prihvata prekid pre obrade slede eg
elementa
obrada prekida se ne remeti ni na koji na in izvrava se prekidna rutina u celini
posle obrade prekida ponavljaju a operacija se nastavlja od mesta gde je prekinuta
izuzetak: izvrenje se na nastavlja valjano ako je uba en jo neki prefiks (npr.
segmentni)
procesor "pamti" samo jedan prefiks i to samo onaj koji je neposredno ispred string
instrukcije
nakon povratka iz prekidne rutine, obrada se nastavlja, ali samo poslednji prefiks je
vae i
ako je potrebno koristiti vie od jednog prefiksa, mogu da se zabrane prekidi za vreme
instrukcije
ipak, zabrana prekida ne e spre iti nemaskabilne prekide
tako e, vreme za koje sistem ne odgovara na prekide moe biti predugo za duga ke
stringove

MOVS odredini-string, izvorini-string (Move String)


prenosi bajt ili re izvornog stringa (adresiranog kroz SI) u odredini string (adresiran
kroz DI)
na osnovu atributa operanada asembler odre uje da li se prenosi bajt ili re
instrukcija modifikuje SI i DI da ukazuju na slede e 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 odredini-string, izvorini-string (Compare String)


oduzima odredini bajt ili re (adresiran kroz DI) od izvorinog bajta ili re i
(adresiranog kroz SI)
CMPS ne menja ni jedan operand i modifikuje SI i DI da ukazuju na slede i element
stringa
CMPS modifikuje AF, CF, OF, PF, SF i ZF da reflektuju odnos odredita prema
izvoritu
ako se JG (Jump if Greater) izvri posle CMPS, sko i e se ako je odredite ve e od
izvorita

ako ispred CMPS stoji prefiks REPE ili REPZ operacija se interpretira kao
"kompariraj dok nije kraj stringa (CX0) i stringovi su jednaki (ZF=1)
ako ispred CMPS stoji prefiks REPNE ili REPNZ operacija se interpretira kao
"kompariraj dok nije kraj stringa (CX0) i stringovi nisu jednaki (ZF=0)
CMPS se koristi za pronalaenje jednakih ili razli itih podstringova u stringu

SCAS odredini-string

(Scan String)

oduzima element odredinog stringa (bajt ili re ) adresiran pomo u DI od sadraja AL


ili AX
ne menja ni odredini string ni akumulator, modifikuje DI da ukazuje na slede i
element
posatavlja AF, CF, OF, PF, SF i ZF da reflektuju odnos vrednosti iz AL/AX i elementa
stringa
ako ispred SCAS stoji prefiks REPE ili REPZ operacija se interpretira kao
"trai dok nije kraj stringa (CX0) i element stringa je jednak zadatoj vrednosti (ZF=1)
ako ispred SCAS stoji prefiks REPNE ili REPNZ operacija se interpretira kao
"trai dok nije kraj stringa (CX0) i element stringa nije jednak zadatoj vrednosti
(ZF=0)
SCAS se koristi za lociranje vrednosti u stringu

LODS izvorini-string

(Load String)

prenosi element stringa (bajt ili re ) koji pokazuje SI u AL ili AX


modifikuje SI da ukazuje na slede i element
instrukcja se ne ponavlja ordinarno (jer bi samo poslednji element ostao u AL/AX)
koristi se u programskim petljama

STOS odredini-string

(Store String)

prenosi bajt ili re iz registra AL ili AX u element stringa adresiran kroz DI


modifikuje DI da ukazuje na slede i element
kao ponavljaju a operacija se koristi da inicijalizuje ceo string na istu vrednost
elementa

Direktive
Uvod

Program se sastoji od instrukcija i direktiva


Instrukcije se prevode u naredbe mainskog jezika
Direktive su naredbe asembleru koje se ne prevode direktno u mainske naredbe
Direktive uti u na proces prevo enja i tako posredno na generisanje mainskih
naredbi
Deklaracije su vrsta direktiva koja uvodi imena
One deklaracje koje alociraju i memoriju nazivaju se definicijama

Leksi ki stil asemblera Asm86

Imena promenljivih i labela su ograni ena na 31 znak i nisu ograni ena na slova i
cifre
Znak "podvu eno" (_) se moe koristiti da se pove a itljivost
Proizvoljan broj praznina se moe umetati izme u identifikatora
Instrukcija se moe preneti u naredni red tako to se naredni red zapo ne znakom
&

Format instrukcija

Instrukcije imaju slede i format:


[labela:] [prefiks] mnemonik [operand(i)] [; komentar]
polje labele imenuje memorijsku lokaciju koja sadri mainsku instrukciju
(to omogu ava da se lokacija adresira simboli ki iz instrukcije JMP)
prefiks uzrokuje generisanje jednog prefiksnog bajta (segmentni, LOCK, REP) ispred
instrukcije
mnemonik identifikuje tip instrukcije (MOV, ADD, ...)
operandi (0, 1 ili 2) se piu razdvojeni zarezima
iza ta ke-zareza se pie komentar

Format direktiva

Direktive imaju slede i format:


[ime] mnemonik [operand(i)] [; komentar]
neke direktive zahtevaju ime dok ga druge zabranjuju
asembler prepoznaje direktivu na osnovu mnemonika

operandi koje zahteva direktiva se piu posle mnemonika i razdvajaju zarezima


kao i kod instrukcija, iza ta ke-zareza se pie komentar

Primeri direktiva su: PROC (definicija procedure), DB, DW, DD (definicije


podataka),...

Konstante

Mogu se definisati binarne, decimalne, oktalne i heksadecimalne numeri ke


vrednosti
Asembler moe obavljati osnovne aritmeti ke operacije sa numeri kim
konstantama
Svi brojevi moraju biti celi i mora biti mogu e predstaviti ih kao 16-bitne sa bitom
znaka
Negativni brojevi se asembliraju u standardnoj notaciji drugog komplementa
Znakovne konstante se piu izme u apostrofa
Mogu biti do 255 karaktera duga ke kad se koriste za inicijalizaciju memorije
Kada se koriste za neposredne operande mogu biti 1 ili 2 bajta duga ke
Primeri konstanti:
MOV
MOV

STRING[SI],'A'
STRING[SI],41H

; karakter
; ekvivalent u heksadecimalnom

ADD
EQU
EQU
EQU
EQU
EQU

AX,0C4H
10O
11Q
11111111B
-5
-6D

;
;
;
;
;
;

sistemu
OCTAL_8
OCTAL_9
ALL_ONES
MINUS_5
MINUS_6
-6

hex konstanta mora poceti cifrom


oktalna konstanta 8
alternativna oktalna konstanta
binarna konstanta
decimalna konstanta 5
alternativna decimalna konstanta

Definicije podataka

Direktive za deklarisanje i definisanje podataka su:


definisanje bajta - DB (define byte)
definisanje re i - DW (define word),
definisanje dvostruke re i - DD (define doubleword)

Operandi ovih direktiva govore koliko jedinica da se alocira i koje su im inicijalne


vrednosti
Sintaksa operanda:
<operand>::= <izraz> | <operand>,<izraz>
<izraz>::= <konstanta> | (<izraz>) | <broj_ponavljanja> DUP <izraz> | ?
< konstanta >::= <numeri ka konstanta> | <simboli ka konstanta> | <znakovna
konstanta>

Primeri definicija podataka:


A_SEG
SEGMENT
A_VAR
DB
?
B_VAR
DW
?,1
druga=1
C_VAR
DD
2 DUP 1
inicijalizovane na 1
D_VAR
DB
3 DUP (1,2)
E_VAR
DB
3 DUP (1, 2
A_SEG
ENDS
B_SEG
SEGMENT AT 55H
segmenta
F_VAR
DB
'ABC'
G_VAR
DW
'AB'
H_VAR
DD
B_SEG
55H 00H
I_VAR
DB
100 DUP 0
B_SEG
ENDS

; neinicijalizovani bajt
; dve reci, prva neinicijalizovana,
; dve dvostruke reci
; 1,2,1,2,1,2
DUP 2); 1,2,2,1,2,2,1,2,2
; specificirana bazna adresa
; 3 bajta sadrze: 41H, 42H, 43H
; 1 rec sadrzi: 42H, 41H
; dvostruka rec, sadrzi: 00H 00H
; 100 bajtova inicijalizovanih na 0

Atributi promenljive

Asembler vodi ra una o 3 atributa svake promenljive:


segment identifikuje segment koji sadri promenljivu
ofset distanca u bajtovima od po etka segmenta koji sadri promenljivu
tip identifikuje alokacionu jedinicu promenljive: 1 = bajt, 2 = re , 4 = dvostruka re

Na osnovu atributa promenljive u instrukciji asembler odre uje formu generisane


instrukcije
Ako su atributi promenljive u konfliktu sa kori enjem u instrukciji, generie se
greka
Primer: pokuaj da se promenljiva definisana kao DW sabere sa bajt-registrom

Konverzija tipa

U nekim slu ajevima asembleru se mora eksplicitno re i tip


Primer: MOVE [BX],5 ; proizvodi greku jer se ne zna tip lokacije na koju BX
pokazuje
Operatori koji eksplicitno definiu tip su: BYTE PTR, WORD PTR i DWORD
PTR
Primer: MOVE WORD PTR [BX],5 ; prenosi se re 5 u lokaciju na koju
pokazuje BX

Operatori

ASM-86 ima tri ugra ena operatora vezana za atribute promenljive


TYPE vra a 1 za bajt, 2 za re , 4 za dvostruka re

LENGTH odre uje broj alociranih jedinica (bajtova, re i ili dvostrukih re i) za vektor
SIZE odre uje broj bajtova koje zauzima skalar ili vektor (SIZE=LENGTH*TYPE)

Primer (prema gornjem primeru):


PROMENLJIV
A

SEGMENT

A_VAR

A_SEG

B_VAR

A_SEG

C_VAR

A_SEG

D_VAR

A_SEG

E_VAR

A_SEG

F_VAR

B_SEG
(0055)
B_SEG
(0055)
B_SEG
(0055)
B_SEG
(0055)

G_VAR
H_VAR
I_VAR

ATRIBUTI
OFFSET

OPERATORI

TYPE

LENGTH

SIZE

0
1
5
13
19
0

1
2
4
1
1
1

1
2
2
6
9
3

1
4
8
6
9
3

100

100

Atributi i operatori omogu avaju da se piu generalizovane sekvence instrukcija


koje ne moraju da se menjaju (samo se ponovo prevedu) ako se menjaju atributi
podataka

Primer

Sumiranje elemenata tabele


; sumiranje elemenata tabele u AX
TABELA
DW
50 DUP(?)
SUB
AX,AX
MOV
CX, LENGTH TABELA
MOV
SI, SIZE TABELA
tabele
DODAJ:
SUB
SI, TYPE TABELA
ADD
AX, TABELA[SI]
LOOP DODAJ
; AX sadrzi sumu

Kontrola segmenata

registru
; tabela ima 50 elemenata
; AX=0
; CX=50 , CX - brojac petlje
; SI=100 , SI pokazuje na kraj
; pomeranje za jedan element
; dodavanje elementa na sumu
; dok CX>0

Program na asembleru ASM-86 se organizuje u niz imenovanih "logi kih"


segmenata
Mapiranje logi kih u fizi ke (memorijske) segmente se obi no radi tek pri
lociranju programa

Segment po inje direktivom SEGMENT, a zavrava direktivom ENDS


Svi podaci i/ili instrukcije izme u SEGMENT i ENDS pripadaju segmentu
Nema ograni enja mogu se podaci, stek i instrukcije smestiti u isti logi ki
segment
Prve naredbe u programu obi no:
najpre uspostavljaju korespondenciju izme u imena segmenata i segmentnih registara,
a zatim pune segmentne registre baznim adresama odgovaraju ih segmenata

Direktiva ASSUME
Direktiva ASSUME govori koje adrese e biti u segmentnim registrima u vreme
izvrenja
Sintaksa ASSUME: ASSUME seg_reg:ime_seg{,
seg_reg:ime_seg}...
Asembler proverava svaki memorijski operand instrukcije odre uju i
u kom segmentu je promenljiva
koji segmentni registar sadri adresu tog segmenta

Ako je operand u segmentu na koji ukazuje "o ekivani" registar instrukcija se


generie
Ako je operand u segmentu na koji ukazuje "neo ekivni" registar ubacuje se seg.
prefiks
Ako segmentni registar ne moe biti promenjen prefiksom generie se poruka
greke
Primer:
ako se u instrukciji koristi BP, procesor o ekuje da je operand u segmentu na koji
ukazuje SS
program moe koristiti BP da adresira promenljivu u teku em segmentu podataka
direktiva ASSUME omogu ava asembleru da detektuje situaciju i generie segmentni
prefiks

Programer moe i eksplicitno da kodira segmentni prefiks da ne bi zavisio od


asemblera
primer: MOV ES:DATA_STRING[SI],AL
prednost je bolja samodokumentovanost koda

mana je to asembler ne proverava da li je operand fakti ki adresibilan kroz zadati


registar

Direktive SEGMENT, ENDS i END

Sintaksa direktive SEGMENT: [ime_segmenta] SEGMENT [lista_atributa]


Lista atributa slui da se definie kombinovanje logi kih u fizi ki segment

Omogu ava da se logi ki segmenti iz razli itih modula kombinuju u isti fizi ki
segment
Sintaksa liste atributa: [tip_poravnavanja] [tip_kombinovanja] ['klasa']
Tip poravnavanja odre uje granicu logi kog segmenta pri kombinovanju:
PARA poravnavanje po paragrafima (adresa deljiva sa 16) podrazumevani tip
WORD poravnavanje po re ima (logi ki segmenti se mapiraju na parne adrese)
BYTE poravnavanje po bajtovima (segment po inje od proizvoljne adrese) ne
preporu uje se
AT paragraf logi ki segment se mapira na fizi ku adresu definisanu paragrafom

Tip kombinovanja odre uje kako e se segment kombinovati sa segmentima istog


imena
ako se ne navede nema kombinovanja
PUBLIC nadovezivanje logi kih segmenata pogodno za logi ke code i data
segmente
STACK dodavanje logi kih segmenata pogodno za stack segmente
duina kombinovanog segmenta jednaka zbiru duina pojedinog segmenata
ofset vrha svakog steka je na vrhu kombinovanog steka

Klasa omogu ava da segmenti iste klase budu smeteni jedan iza drugog u
memoriji
npr: segment koda i segment konstanti u klasi 'ROM' mogu biti smeteni jedan iza
drugog
segment podataka i segment steka u klasi 'RAM' se tako e smetaju jedan iza drugog

Segment se zavrava direktivom ENDS: [ime_segmenta] ENDS


Direktivom END se zavrava kompilaciona celina; sintaksa: END [labela_po etka]
Samo u glavnom programu se u direktivi END navodi labela po etne instrukcije
programa

Definisanje procedura

Sintaksa: ime_procedure
ime_procedure

PROC [NEAR | FAR]


telo 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 moe vriti na jedan od slede ih na ina:
preko registara
preko promenljivih u segmentu podataka
preko steka

Smetanje parametara na odre eno mesto i dohvatanje rezultata su u nadlenosti


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 se
pristupa
Sintaksa: EXTRN simbol:tip [, simbol:tip]...
Simbol moe biti promenljiva, labela ili literalna konstanta
Tip moe biti:
za promenljive: BYTE, WORD, DWORD
za labele: NEAR, FAR
za literalne konstante: ABS

Primer:
u modulu A:

u modulu B:

EXTRN

DB
PUBLIC
P:BYTE

0
P

Ako eksterni simbol pripada nekom logi kom segmentu u izvornom modulu,
tada se EXTRN direktiva mora staviti u odgovaraju i logi ki segment u modulu gde
se koristi

Literalne konstante

Literalne konstante se definiu direktivom slede e sintakse: simbol EQU izraz


Primer:
PROMENLJIVA
DONJI_BAJT
GORNJI_BAJT
...

DW
EQU
EQU

0
BYTE PTR PROMENLJIVA
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:
PROMENLJIVA

ORG
DB

10
0

; PROMENLJIVA ima ofset 10

You might also like