Top Banner
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 - naine 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 na asembleru") - Jedna instrukcija simbolikog mašinskog jezika se prevodi u tano jednu instrukciju MJ - Jedna instrukcija višeg programskog jezika (npr. C) se prevodi u više instrukcija MJ
42

Uvod u Asembler 8086

Aug 09, 2015

Download

Documents

spinkom

Prikaz osnovnih instrukcija ASM 8086
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Uvod u Asembler 8086

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

Mašinski jezik − Procesor izvršava mašinske instrukcije – naredbe obrazovane od re�i

odre�enog 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 ra�unari su programirani upravo na mašinskom jeziku − Za programera je ovakav oblik neprihvatljivo neudoban

Simboli�ni mašinski (asemblerski) jezik i asembler − Programiranje na mašinskom 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 mašinskim ili asemblerskim

jezikom − Prevodilac sa simboli�kog mašinskog na mašinski jezik naziva se asembler − U žargonu se asemblerski jezik �esto zove tako�e asemblerom ("program na

asembleru") − Jedna instrukcija simboli�kog mašinskog jezika se prevodi u ta�no jednu

instrukciju MJ − Jedna instrukcija višeg programskog jezika (npr. C) se prevodi u više

instrukcija MJ

Page 2: Uvod u Asembler 8086

− Kao i viši programski jezici, asemblerski jezik definiše 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 mašina – instrukcija može imati 0, 1 ili 2 operanda − Segmentni model memorije – postoje segmentni registri koji omogu�avaju

relokaciju − Procesor i8086 nema ortogonalnu arhitekturu

− ne može se svaki na�in 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

Page 3: Uvod u Asembler 8086

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 − pokaziva�ki i indeksni registri

− Slika prikazuje skup svih opštenamenskih registara procesora i8086: H L 15 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)

pokaziva�i i indeksi

− 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 može pristupati istovremeno do 4 segmenta

Page 4: Uvod u Asembler 8086

− 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 opštem slu�aju segment sadrži programske promenljive

− Registar SS ukazuje na teku�i stek − operacije nad stekom se izvršavaju 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 nalaže da se segmentni registri koriste na disciplinovan

na�in

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 po�etak segmenta

koda − IP odgovara konvencionalnom pojmu programskog broja�a (Program Counter) PC − On se automatski inkrementira pri izvršenju (dohvatanju) svake instrukcije

Ne može se direktno pristupati IP, ali odre�ene 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 ALU

operacije − Postoji grupa instrukcija koje omogu�avaju da program menja tok na osnovu ovih

indikatora

Page 5: Uvod u Asembler 8086

− Programi mogu postavljati ili brisati kontrolne indikatore da menjaju procesorske operacije

kontrolni statusni TF

DF

IF OF

SF

ZF

AF

PF

CF

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 najvišeg ili pozajmica u najviši bit 8- ili 16-bitnog rezultata − 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 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 – 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 aritmeti�ko prekora�enje − zna�ajna cifra je izgubljena jer veli�ina 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

Page 6: Uvod u Asembler 8086

Memorija − Memorija je organizovana u niz 8-bitnih bajtova (adresibilna jedinica je 1 bajt) − Instrukcije, podaci dužine 1 bajta ili 2 bajta (re�i) mogu biti smešteni na

proizvoljnoj adresi − Promenljive dužine re�i koje su na neparnim adresama nazivaju se neporavnatim

(unaligned) − nije mogu� 16-bitni prenos neporavnatih re�i

− Intelova konvencija: re�i se smeštaju tako da je viši bajt na višoj adresi − Primer: vrednost re�i koja po�inje na adresi 322H je: 7412H

322H 0001

0010

323H 0111

0100

− 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 − niža re� pokaziva�a sadrži ofset-adresu, a viša segment-adresu − re�i pokaziva�a se smeštaju konvencionalno: bajt na višoj adresi sadrži 8 zna�ajnijih bita

re�i

− Primer: vrednost pokaziva�a koji po�inje na adresi 104H je: 7490H(segment):6512H(ofset)

104H 0001

0010

105H 0110

0101

106H 1001

0000

107H 0111

0100

Segmentacija − Segment je logi�ka jedinica memorije koja može 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:

Page 7: Uvod u Asembler 8086

− susedni, razdvojeni, delimi�no ili potpuno preklopljeni

− Fizi�ka lokacija u memoriji može pripadati ve�em broju logi�kih segmenata − Segmentni registri pokazuju (sadrže bazne adrese) na 4 teku�a adresibilna segmenta − Program obezbe�uje pristup drugim segmentima tako što menja sadržaj segmentnih

registara − Segmentna organizacija podržava 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 manipulišu 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 olakšava 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 − Više razli�itih logi�kih adresa se može 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/piše 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

a baza segmenta

Alternativna baza segmenta

Ofset

Dohvatanje instrukcije CS - IP Operacija na steku SS - SP Promenljiva (osim donjih)

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

Page 8: Uvod u Asembler 8086

− 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 mašinska instrukcija − ona kaže 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 može imati proizvoljan broj stekova, a max veli�ina steka je 64K − Pokušaj prekora�enja steka završava "gaženjem" po�etka 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 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 može 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 dopuštaju da U/I adresa bude specificirana − kao fiksna vrednost u instrukciji

Page 9: Uvod u Asembler 8086

− 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 smešteni 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 može koristiti za pristup U/I portu − MOV instrukcija može prenositi podatke izme�u U/I porta i proizvoljnog registra − AND i OR se mogu koristiti da se manipuliše bitima u registrima U/I ure�aja − mogu se koristiti prednosti raznovrsnosti adresnih na�ina

Page 10: Uvod u Asembler 8086

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 može biti izra�unata na više

na�ina

Ra�unanje adrese operanda u memoriji − Fizi�ka adresa se ra�una dodavanjem ofset-adrese na ulevo pomerenu segment-

adresu − 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) + sadržaj baznog registra + sadržaj indeksnog

registra − 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

pomeraj

CS 000

SS 000

DS 000

ES 000

ili

ili

fizi�ka adresa

Efektivna

Kodirano u

Eksplicitno

Podrazumevano

Page 11: Uvod u Asembler 8086

− 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

najbrž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 u registar 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 reda �ekanja

− 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 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 sadržaj X u registar AX

Registarsko indirektno adresiranje − EA se izra�unava na osnovu jednog baznog ili indeksnog registra − Jedna instrukcija može pristupati razli�itim memorijskim lokacijama

− postiže se tako što se vrednost baznog ili indeksnog registra menja − LEA (Load Effective Address) ili aritmeti�ke instrukcije se mogu koristiti za ažuriranje

registra

OpCode

Mod R/M

Displacement

EA

Page 12: Uvod u Asembler 8086

− Kod JMP i CALL instrukcije se proizvoljan registar može koristiti za indirektno adresiranje

− Primer: MOV AX,[BX]; kopira se sadržaj sa adrese iz BX u AX

Bazno adresiranje − EA se ra�una kao suma pomeraja i sadržaja 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: MOV AX,[BX]+X ; kopira se sadržaj sa efektivne adrese MOV AX,X[BX] ; sadrzaj(BX)+ofset(X) u AX MOV AX,[BX+X] MOV AX,[BX].X

Indeksirano adresiranje − EA se ra�una kao suma pomeraja i sadržaja 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 − pošto su svi elementi jednake veli�ine, primenjuje se jednostavna indeksna aritmetika

Primeri: MOV AX,[SI]+X ; kopira se sadržaj sa efektivne adrese MOV AX,X[SI] ; sadrzaj(SI)+ofset(X)

EA

OpCode

Mod R/M BX

BP SI DI

or or or

OpCode

Mod R/M

Displacement

EA BX BP

or +

OpCode

Mod R/M

Displacement

EA SI DI

or +

Page 13: Uvod u Asembler 8086

u AX MOV AX,[SI+X] MOV AX,[SI].X

Bazno indeksirano adresiranje − EA se ra�una kao suma pomeraja, sadržaja baznog i sadržaja indeksnog registra − Veoma fleksibilan na�in adresiranja, jer se dve komponente mogu menjati u vreme

izvršenja − Pogodan na�in za proceduru da adresira niz alociran na steku

− BP sadrži ofset referentne ta�ke na steku (TOS nakon smeštanja parametara i povratne adrese)

− pomeraj (displacement) sadrži 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 sadržaj sa EA ; sadr(BX)+sadr(SI)+ofset(X) u AX

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

odredišnog − Na po�etku 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 na adresu ES:DI

OpCode

Mod R/M

Displacement

EA

BX BP

or

SI DI

or

+

+

Page 14: Uvod u Asembler 8086

Adresiranje U/I portova − Ako je U/I port memorijski mapiran,

proizvoljan na�in 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 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 definiše 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)

OpCode SI Source

EA DI Destination

EA

Direktno adresiranje porta

Port address

OpCode

Data

Indirektno adresiranje porta

Port address

OpCode

DX

Page 15: Uvod u Asembler 8086

Skup instrukcija

Uvod − U ve�ini instrukcija mogu figurisati registarski, memorijski i neposredni operandi − Nad memorijskim lokacijama se mogu vršiti operacije – nije potrebno

prebacivanje u registre − 8086 ima repertoar od oko 100 instrukcija simboli�kog mašinskog jezika − Procesor raspoznaje oko 300 razli�itih mašinskih instrukcija

− MOV instrukcija prenosi bajt ili re� iz registra ili memorije ili neposredno u registar ili memoriju

− procesor raspoznaje 28 razli�itih mašinskih MOV instrukcija (npr. "prenos bajta iz R u M")

− Na ovaj na�in se kombinuje − jednostavnost programiranja na simboli�kom nivou − efikasnost smeštanja instrukcija na mašinskom nivou

− Jednoj SMJ (ASM) instrukciji odgovaraju razli�iti formati (kra�i i duži) mašinske instrukcije

− Npr. programer piše INC, a asembler na osnovu operanda odre�uje mašinsku 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

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 na�in 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�)

Page 16: Uvod u Asembler 8086

− kada se koristi sa LOCK prefiksom može testirati i postaviti (test and set) semafor

− semafor se korsiti da zaštiti zajedni�ki 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 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 može biti specificiran pomo�u neposredne bajt-konstante ili pomo�u DX

registra − 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 pomo�u neposredne bajt-konstante ili pomo�u DX

registra

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 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 odredište, izvorište (Load pointer using DS)

− prenosi 32-bitnu pokaziva�ku promenljivu iz izvorišnog operanda u odredišni operand i DS

− izvorišni operand mora biti u memoriji − re� ofseta pokaziva�a se prenosi u odredište koje može biti 16-bitni opštenamenski

registar − re� segmenta pokaziva�a se prenosi u DS

Page 17: Uvod u Asembler 8086

− za obradu stringa koji nije u teku�em segmentu podataka pogodno je specificirati SI kao odredište (string instrukcije smatraju da je izvorišni string u teku�em segmentu podataka, a SI sadrži ofset)

− LES odredište, izvorište (Load pointer using ES)

− prenosi 32-bitnu pokaziva�ku promenljivu iz izvorišnog operanda u odredišni operand i ES

− izvorišni operand mora biti u memoriji − re� ofseta pokaziva�a se prenosi u odredište koje može biti 16-bitni opštenamenski

registar − re� segmenta pokaziva�a se prenosi u ES − za obradu stringa koji nije u teku�em ekstra segmentu pogodno je specificirati DI kao

odredište (odredišni string mora biti u ekstra segmentu podataka, a DI mora sadržati ofset)

Prenos indikatora − Indikatori imaju slede�e 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 − 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 − služi za restauraciju indikatora pri povratku iz potprograma

Page 18: Uvod u Asembler 8086

Aritmeti�ke instrukcije − Postoji 20 aritmeti�kih instrukcija podeljenih u grupe:

− sabiranje − oduzimanje − množenje − 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 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 aritmeti�koj instrukciji sadrže valjane brojeve

− Loši podaci mogu proizvesti nepredvidive rezultate

Neozna�eni binarni brojevi − Mogu biti dužine 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, množenja i deljenja

Ozna�eni 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 pomo�u instrukcija za neozna�ene binarne brojeve − Za množenje i deljenje ozna�enih brojeva postoje posebne instrukcije

Page 19: Uvod u Asembler 8086

Pakovani decimalni brojevi − Smeštaju se kao neozna�ene veli�ine dužine jednog bajta − Bajt sadrži 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 izvršavaju u dva koraka:

− izvršava se neozna�ena binarna operacija koja proizvodi privremeni rezultat u AL − izvršava se instrukcija prilago�enja koja menja vrednost u AL u finalni pakovani

decimalni broj

− Ne postoje množenje i deljenje za pakovane decimalne brojeve

Nepakovani decimalni brojevi − Smeštaju se kao neozna�ene veli�ine dužine 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 − Viša nibla mora biti 0 za množenje i deljenje, a za sabiranje i oduzimanje je

proizvoljna − Sabiranje, oduzimanje i množenje se izvršavaju u dva koraka:

− izvršava se neozna�ena binarna operacija koja proizvodi privremeni rezultat u AL − izvršava se instrukcija prilago�enja koja menja AL u finalni nepakovani decimalni broj

− Deljenje se obavlja tako�e u dva koraka: − izvršava se prilago�enje deljenika (brojioca) u AL − izvršava se neozna�ena binarna operacija deljenja koja proizvodi finalni rezultat

ASCII cifre − ASCII karakteri koji sadrže cifre "0"-"9" su sli�ni 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 pod

uslovima: − viša nibla ASCII cifre se postavlja na 0 pre množenja ili deljenja nakon izvršenja 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 ukažu na osobine rezultata

operacije

Page 20: Uvod u Asembler 8086

− Ve�ina indikatora se može testirati nakon aritmeti�ke instrukcije u instrukciji uslovnog skoka

− Može 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 najvišeg bita rezultata − postavlja se ako kod oduzimanja do�e do pozajmice u najviši bit rezultata − za ozna�eni prenos važi CF≠OF − CF se može 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 višebajtno (32-bita, 64-bita) sabiranje i oduzimanje

− AF (Auxiliary Carry Flag) − postavlja se ako kod sabiranja do�e do prenosa iz najvišeg bita donje nible u gornju − postavlja se ako kod oduzimanja do�e do pozajmice iz gornje nible u najviši 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 najvišem 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 može koristiti posle aritmeti�ke operacije − na taj na�in tok programa može 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 nižih 8 bita rezultata sadrži paran

broj 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 negativan

broj − "suviše" se odre�uje prema dužini odredišta operacije − ukazuje na prekora�enje u aritmetici sa znakom − može se ignorisati kada se radi aritmetika neozna�enih brojeva

Page 21: Uvod u Asembler 8086

− 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 ozna�ena ili neozna�ena − 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 operand rezultatom

− oba operanda mogu biti ozna�ena ili neozna�ena − 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 neozna�eni binarni broj − INC menja AF, OF, PF, SF i ZF, a ne uti�e na CF

− AAA (ASCII Adjust for Addition)

− menja sadržaj registra AL u ispravan nepakovani decimalni broj tako što uisuje 0 u gornju 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 re�i i to ozna�eni ili neozna�eni 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šni 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

Page 22: Uvod u Asembler 8086

− 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 uti�e 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

− 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 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 narednom instrukcijom

− 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 decimalna operanda

− 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 neozna�eno 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 vra�a u

AX

Page 23: Uvod u Asembler 8086

− ako je izvorišni operand re� tada se on množi sa AX, a rezultat (duple širine) se vra�a u DX i AX

− operandi se tretiraju kao neozna�eni binarni brojevi − ako je viša polovina rezultata (AH odnosno DX) razli�ita od nule CF i OF se

postavljaju − sadržaj AF, PF, SF i ZF je nedefinisan

− IMUL izvorište (Integer Multiply)

− obavlja ozna�eno 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 vra�a u

AX − ako je izvorišni operand re� tada se on množi sa AX, a rezultat (duple širine) se vra�a u

DX i AX − ako je viša polovina rezultata (AH odnosno DX) nije ekstenzija znaka niže CF i OF se

postavljaju − kada su CF i OF postavljeni na 1 – ukazuju da AH ili DX sadrže zna�ajne cifre

rezultata − 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 u

AH 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 neozna�eno 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 − koli�nik se vra�a u AL, a ostatak u AH − ako je izvorišni 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 odredišnog registra, kao kada se pokuša deljenje 0

generiše se prekid tipa 0, a koli�nik i rezultat su nedefinisani − necelobrojni koli�nici se odsecaju na celobrojne − sadržaj AF, CF, OF, PF, SF i ZF je nedefinisan

− IDIV izvorište (Integer Divide)

− obavlja ozna�eno 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

Page 24: Uvod u Asembler 8086

− 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 izvorišni 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 generiše se prekid tipa 0 − ovo se dešava kada se pokuša deljenje 0 − necelobrojni koli�nici 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 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 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 uti�e na indikatore − može se koristiti da se napravi deljenik dužine re�i od bajta pre deljenja bajtom

− CWD (Convert Word to Doubleword)

− proširuje znak re�i u registru AX na registar DX − ne uti�e na indikatore − može se koristiti da se napravi deljenik dužine dvostruke re�i od re�i pre deljenja

jednom re�i

Instrukcije koje manipulišu bitima − Postoje 3 kategorije instrukcija koje manipulišu 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 manipulišu indikatorima na slede�i na�in:

− OF i CF se uvek postavljaju na 0

Page 25: Uvod u Asembler 8086

− 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 odredište (Not)

− invertuje bite (ra�una jedini�ni komplement) operanda dužine bajta ili re�i

− AND odredište, izvorište (And)

− obavlja logi�ku "I" operaciju izme�u dva operanda (bajta ili re�i) i vra�a rezultat u odredište

− bit rezultata je 1 ako su oba odgovaraju�a bita operanada 1, ina�e je 0

− OR odredište, izvorište (Or)

− obavlja logi�ku "ILI" operaciju izme�u dva operanda (bajta ili re�i) i vra�a rezultat u odredište

− bit rezultata je 1 ako je barem jedan od dva odgovaraju�a bita operanada 1, ina�e je 0

− XOR odredište, izvorište (Exclusive Or)

− obavlja logi�ku "ekskluzivno ILI" operaciju izme�u dva operanda i vra�a rezultat u odredište

bit rezultata je 1 ako dva odgovaraju�a bita operanada imaju razli�ite vrednosti, ina�e je 0

− TEST odredište, izvorište (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 izvrši 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 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 brojeva

stepenima 2 − Logi�ka pomeranja se mogu koristiti da bi se izolovali biti u bajtovima ili re�ima − Instrukcije pomeranja manipulišu 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 sadrži vrednost poslednjeg bita koji je pomeren izvan odredišnog operanda

Page 26: Uvod u Asembler 8086

− OF je uvek nedefinisan nakon višebitnog pomeranja − pri pomeranju za jednu poziciju OF je 1 ako se bit najvišeg zna�aja menja

− SHL/SAL odredište, broj (Shift Logical/Arithmetic Left)

− obavljaju istu operaciju i fizi�ki 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 specificiran operandom 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 specificiran operandom 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 odgovaraju�eg 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 pomo�u JC (Jump if Carry) ili

JNC − Rotacije uti�u 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 bit

odrediš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

Page 27: Uvod u Asembler 8086

− 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 odre�ena je sadržajem CS i IP registara − Registar CS sadrži baznu adresu teku�eg segmenta koda iz kojeg se dohvataju

instrukcije − Registar IP sadrži 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 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 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 može 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 može da odredi da je cilj unutar 127 bajtova od JMP on generiše 2-bajtni JMP

− 2-bajtna JMP instrukcija se naziva SHORT JMP

− ina�e, asembler generiše NEAR JMP koji adresira cilj unutar ±32K, a dužina instrukcije je 3-bajta

Page 28: Uvod u Asembler 8086

− 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 može biti kroz memorijsku lokaciju ili kroz 16-bitni registar

− memorijska lokacija ili registar koje adresira instrukcija sadrže re� kojom se zamenjuje sadržaj IP

− me�usegmentni direktan skok zamenjuje IP i CS vrednostima koje se sadrže u instrukciji

− me�usegmentni indirektan skok može 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 generiše razli�it tip CALL instrukcije u zavisnosti od definisanja imena procedure

− ime_procedure može 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 može do�i do neuparenosti

− mogu�i su direktni pozivi (adresa procedure u instrukciji) i indirektni (adresa u memoriji/registru)

− procesor automatski podešava IP da ukazuje na slede�u instrukciju pre smeštanja na stek

− 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 dinami�ki 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 kroz registar

− ofset ciljne procedure se dohvata iz adresirane memorijske lokacije ili registra − me�usegmentni 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 − me�usegmentni indirektan poziv se može realizovati samo kroz memoriju − SP se dekrementira za 2, CS se smešta na stek

Page 29: Uvod u Asembler 8086

− zatim se CS puni sadržajem druge re�i pokaziva�ke memorijske lokacije koja je adresirana

− SP se ponovo dekrementira za 2, pa se IP smešta na stek − na kraju se IP puni sadržajem 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 generiše unutarsegmentni RET

− ako je procedura definisana kao FAR asembler generiše 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" izvršava 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 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)

Page 30: Uvod u Asembler 8086

JG/JNLE ((SF xor OF) or ZF)=0 ve�e (greater)/ nije manje ni jednako (not less nor equal)

JGE/JNL (SF xor OF)=0 ve�e ili jednako (greater or equal)/ nije manje (not less)

JL/JNGE (SF xor OF)=1 manje (less)/ nije ve�e ni jednako (not greater nor equal)

JLE-JNG ((SF xor OF) or ZF)=1 manje ili jednako (less or equal)/ nije ve�e (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 prekora�enja (not overflow) JNP/JPO PF=0 nema parnosti (not parity)/ neparno (parity

odd) JNS SF=0 ne znak (not sign) JO OF=1 prekora�enje (overflow) JP/JPE PF=1 parnost (parity)/ parno (parity even) JS SF=1 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, izvršava 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, izvršava 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, 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 po�etku petlje da se presko�i petlja ako CX sadrži 0

Page 31: Uvod u Asembler 8086

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 množe�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 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 operativnog

sistema) − za svaku vrstu servisa koji operativni sistem pruža aplikaciji se može koristiti poseban

tip prekida softverski prekidi se tako�e mogu koristiti za testiranje rutina pisanih za hardverske prekide

− INTO (Interrupt on Overflow)

− generiše 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 ponaša kao INT

− piše 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

Page 32: Uvod u Asembler 8086

− 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 spoljašnje prekide preko INTR ulaza − maskabilni prekidi su onemogu�eni − nemaskabilni prekid preko NMI ulaza sa poštuje, 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 izvršenja 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, 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 omogu�ava softverska

petlja − Ponavljanje se može zaustaviti pomo�u raznih uslova, a može biti i prekinuto pa

nastavljeno − String instrukcije na sli�an na�in (prikazan donjom tabelom) koriste registre i

indikatore SI Indeks (ofset) izvorišnog stringa DI Indeks (ofset) odredišnog stringa CX Broja� ponavljanja

Page 33: Uvod u Asembler 8086

AL/AX

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 teku�em segmentu

podataka − Segmentni prefiks (1 bajt) se može koristiti da se promeni gornja pretpostavka − Odredišni string mora biti u teku�em ekstra segmentu (ne može 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 sadržaj SI kao ofset adresu teku�eg elementa izvorišnog stringa − asembler koristi sadržaj DI kao ofset adresu teku�eg elementa odredišnog stringa

− Registri SI i DI moraju biti inicijalizovani da ukazuju na izvorišne/odredišne 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 izvrš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 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 kontroliše 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" (CX≠0) − REP se koristi sa MOVS (Move String) i STOS (Store String) − REPE i REPZ su fizi�ki isti prefiksni bajt kao i REP

Page 34: Uvod u Asembler 8086

− 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 funkcionišu 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 – izvršava se prekidna rutina u celini − posle obrade prekida ponavljaju�a operacija se nastavlja od mesta gde je prekinuta − izuzetak: izvršenje 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

važe�i − ako je potrebno koristiti više 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 može biti predugo za duga�ke

stringove

− 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 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 odredišni-string, izvorišni-string (Compare String)

− oduzima odredišni bajt ili re� (adresiran kroz DI) od izvorišnog 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 odredišta prema izvorištu

− ako se JG (Jump if Greater) izvrši posle CMPS, sko�i�e se ako je odredište ve�e od izvorišta

Page 35: Uvod u Asembler 8086

− 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 razli�itih podstringova u stringu

− SCAS odredišni-string (Scan String)

− oduzima element odredišnog stringa (bajt ili re�) adresiran pomo�u DI od sadržaja AL ili AX

− ne menja ni odredišni 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 "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 slede�i 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 slede�i element − kao ponavljaju�a operacija se koristi da inicijalizuje ceo string na istu vrednost

elementa

Page 36: Uvod u Asembler 8086

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 uti�u na proces prevo�enja i tako posredno na generisanje mašinskih

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 može koristiti da se pove�a �itljivost − Proizvoljan broj praznina se može umetati izme�u identifikatora − Instrukcija se može 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 sadrži mašinsku 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 pišu razdvojeni zarezima − iza ta�ke-zareza se piše 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

Page 37: Uvod u Asembler 8086

− operandi koje zahteva direktiva se pišu posle mnemonika i razdvajaju zarezima − kao i kod instrukcija, iza ta�ke-zareza se piše 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 može 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 pišu 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 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 konstanta MINUS_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 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>

Page 38: Uvod u Asembler 8086

− 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 1 D_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 ra�una o 3 atributa svake promenljive:

− segment – identifikuje segment koji sadrži promenljivu − ofset – distanca u bajtovima od po�etka segmenta koji sadrži 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, generiše se greška

− Primer: pokušaj 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 grešku jer se ne zna tip lokacije na koju BX pokazuje

− Operatori koji eksplicitno definišu 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�

Page 39: Uvod u Asembler 8086

− 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): ATRIBUTI OPERATORI PROMENLJIV

A SEGMENT OFFSET TYPE LENGTH SIZE A_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 omogu�avaju da se pišu 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 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 "logi�kih"

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

lociranju programa

Page 40: Uvod u Asembler 8086

− Segment po�inje direktivom SEGMENT, a završava 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

izvršenja

− 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 sadrži adresu tog segmenta

− Ako je operand u segmentu na koji ukazuje "o�ekivani" registar– instrukcija se generiše

− Ako je operand u segmentu na koji ukazuje "neo�ekivni" registar – ubacuje se seg. prefiks

− Ako segmentni registar ne može biti promenjen prefiksom – generiše se poruka greške

− Primer: − ako se u instrukciji koristi BP, procesor o�ekuje da je operand u segmentu na koji

ukazuje SS − program može koristiti BP da adresira promenljivu u teku�em segmentu podataka

− direktiva ASSUME omogu�ava asembleru da detektuje situaciju i generiše segmentni prefiks

− Programer može 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 služi da se definiše kombinovanje logi�kih u fizi�ki segment

Page 41: Uvod u Asembler 8086

− 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 − dužina kombinovanog segmenta jednaka zbiru dužina pojedinog segmenata − ofset vrha svakog steka je na vrhu kombinovanog steka

− Klasa omogu�ava da segmenti iste klase budu smešteni jedan iza drugog u memoriji − npr: segment koda i segment konstanti u klasi 'ROM' mogu biti smešteni jedan iza

drugog

− segment podataka i segment steka u klasi 'RAM' se tako�e smeštaju jedan iza drugog

− Segment se završava direktivom ENDS: [ime_segmenta] ENDS

− Direktivom END se završava 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 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 slede�ih na�ina:

− preko registara − preko promenljivih u segmentu podataka − preko steka

Page 42: Uvod u Asembler 8086

Smeštanje parametara na odre�eno 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 se pristupa

− 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 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 definišu direktivom slede�e 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