124393592-Uvod-u-Asembler-8086

Embed Size (px)

Citation preview

  • 8/18/2019 124393592-Uvod-u-Asembler-8086

    1/42

    Uvod u Asembler 8086

    Arhitektura procesora−  Arhitektura procesora predstavlja programski model procesora

    −  Organizacija procesora predstavlja njegovu internu strukturu

    −  Programer mora biti svesan arhitekture, ali ne i organizacije procesora

    −  Na primer, keš memorija predstavlja element organizacije, ali ne i arhitektureprocesora

    −  Arhitektura obuhvata u osnovi:

    −  skup registara

    −  memorijski model

    −  kodove instrukcija

    −  na

    ine adresiranja

    Mašinski jezik−  Procesor izvršava mašinske instrukcije – naredbe obrazovane od rei

    odreenog broja bitova

    −  Jezik koji procesor "razume" se naziva mašinskim jezikom

    −  Program na mašinskom jeziku se zapisuje u binarnom obliku

    −  Kompaktniji, ali još manje razumljiv, oblik zapisa je oktalni ili heksadecimalni

    −  Prvi raunari su programirani upravo na mašinskom jeziku

    −  Za programera je ovakav oblik neprihvatljivo neudoban

    Simbolini mašinski (asemblerski) jezik i asembler−  Programiranje na mašinskom jeziku se moralo prilagoditi programeru

    −  Definisani su simboli za instrukcijske kodove, naine adresiranja, registre

    −  Simboli su mnemoniki tako da je nivo razumljivosti programa prihvatljiv

    −  Jezik koji koristi simbole nazvan je simbolikim mašinskim ili asemblerskim jezikom

    −  Prevodilac sa simbolikog mašinskog na mašinski jezik naziva se asembler

    −  U žargonu se asemblerski jezik esto zove takoe asemblerom ("program naasembleru")

    −  Jedna instrukcija simbolikog mašinskog jezika se prevodi u tano jednuinstrukciju MJ

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

  • 8/18/2019 124393592-Uvod-u-Asembler-8086

    2/42

    −  Kao i viši programski jezici, asemblerski jezik definiše svoju sintaksu isemantiku

    Procesor i8086−  Na kursu se izuava jezik za Intelov procesor i8086 iz sledeih razloga:

    −  rasprostranjenost Intelove familije procesora (IBM PC se temelji na ovimprocesorima)

    −  asembler za i8086 je baza za modernije procesore Intelove familije (npr. Pentium I,II, III)

    −  nisu potrebna znanja nekih sofistinih koncepata arhitekture raunara

    −  Dvoadresna mašina – instrukcija može imati 0, 1 ili 2 operanda

    −  Segmentni model memorije – postoje segmentni registri koji omoguavajurelokaciju

    −  Procesor i8086 nema ortogonalnu arhitekturu

    −  ne može se svaki nain adresiranja primeniti na svaku instrukciju

    Instrukcije, direktive, deklaracije i definicije−  Naredbe koje se prevode u mašinske instrukcije nazivaju se asemblerskim

    instrukcijama

    −  Direktive kojima se uvode imena nazivaju se deklaracije

    −  Deklaracije kojima se alocira memorija nazivaju se definicije

    −  Direktive kojima se uvode imena nazivaju se deklaracije

    −  Deklaracije kojima se alocira memorija nazivaju se definicije

    Arhitektura procesora i8086

  • 8/18/2019 124393592-Uvod-u-Asembler-8086

    3/42

    Registri−  i8086 ima 4 grupe registara:

    −  opštenamenski registri (general registers)

    −  segmentni registri (segment registers)

    −  programski broja (pokaziva instrukcije – instruction pointer )−  registar indikatora ( flags)

    Opštenamenski registri−  i8086 ima 8 opštenamenskih 16-bitnih registara:

    −  Registri su podeljeni u dve grupe:

    −  registri podataka

    −  pokazivaki i indeksni registri

    −  Slika prikazuje skup svih opštenamenskih registara procesora i8086:

    H L15

    8

    7

    0

    (AH) AX (AL) akumulator (accumulator )

    (BH) BX (BL) bazni (base)

    (CH) CX (CL) broja (count )

    (DH) DX (DL) registar podataka (data)

    registri

    podataka

    SP pokaziva steka (stack pointer )

    BP pokaziva baze (base pointer )

    SI indeks izvora (source index)

    DI indeks odredišta (destination index)

    pokazivai i

    indeksi

    −  Registri podataka se mogu koristiti na dva naina:

    −  kao 16 bitne jedinice (AX)

    −  kao dva 8-bitna registra (AH i AL)

    −  Pokazivaki i indeksni registri se uvek koriste kao 16-bitni

    −  Neki registri se koriste implicitno u nekim operacijama

    Segmentni registri−  Adresni prostor procesora i8086 je jedan megabajt (1M)

    −  Celokupan adresni prostor je podeljen u logike segmente veliine 64K

    −  Procesor može pristupati istovremeno do 4 segmenta

  • 8/18/2019 124393592-Uvod-u-Asembler-8086

    4/42

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

    −  Slika prikazuje skup segmentnih registara procesora i8086:

    15

    0CS segment koda (code segment )

    DS segment podataka (data segment )

    SS segment steka (stack segment )

    ES ekstra segment (extra segment )

    −  Registar CS ukazuje na tekui segment sa instrukcijama

    −  instrukcije se dohvataju iz ovog segmenta memorije

    −  Registar DS ukazuje na tekui segment sa podacima

    −  u opštem sluaju segment sadrži programske promenljive

    −  Registar SS ukazuje na tekui stek

    −  operacije nad stekom se izvršavaju nad ovim segmentom

    −  Registar ES ukazuje na tekui ekstra segment

    −  tipino se koristi za dodatni prostor za podatke (prostor za dinamiku alokaciju - heap)

    −  Segmentni registri su pristupani programeru

    −  Dobra programerska praksa nalaže da se segmentni registri koriste na disciplinovannain

    Pokaziva instrukcije−  Pokaziva instrukcije ( Instruction Pointer ) IP je 16-bitni i sadrži adresu naredne

    instrukcije

    −  Ova adresa je tzv. "ofset" adresa, t.j. relativna adresa u odnosu na poetak segmentakoda

    −  IP odgovara konvencionalnom pojmu programskog brojaa (Program Counter ) PC

    −  On se automatski inkrementira pri izvršenju (dohvatanju) svake instrukcije

    Ne može se direktno pristupati IP, ali odreene instrukcije njime manipulišu

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

    −  Indikatore statusa postavlja izvršna jedinica da reflektuju osobine rezultata ALUoperacije

    −  Postoji grupa instrukcija koje omoguavaju da program menja tok na osnovu ovihindikatora

  • 8/18/2019 124393592-Uvod-u-Asembler-8086

    5/42

    −  Programi mogu postavljati ili brisati kontrolne indikatore da menjaju procesorskeoperacije

    kontrolni statusni

    T

    F

    D

    F

    IF O

    F

    S

    F

    Z

    F

    A

    F

    P

    F

    C

    Fprenos (carry)

    parnost ( parity)

    dodatni prenos (auxiliary carry)

    nula ( zero)

    znak (sign)

    prekoraenje (overflow)

    omoguen prekid (interrupt-enable)

    smer (direction)

    zamka (trap)

    −  CF: ako je 1 – bio je prenos iz najvišeg ili pozajmica u najviši bit 8- ili 16-bitnogrezultata

    −  indikator se koristi iz instrukcija koje sabiraju/oduzimaju višebajtne brojeve

    −  instrukcije rotacije mogu izolovati pojedini bit iz memorije ili registra u CF indikatoru

    −  PF: ako je 1- rezultat ima parnu parnost (paran broj jedinica)

    −  indikator se može koristiti za proveru grešaka pri prenosu podataka

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

    −  koristi se iz decimalnih aritmetikih instrukcija

    −  ZF: ako je 0 – rezultat operacije je 0

    −  SF: ako je 1 – najviši bit rezultata je 1

    −  negativni brojevi su predstavljeni u komplementu dvojke pa SF predstavlja znak (1 –negativan)

    −  OF: ako je 1 – dogodilo se aritmetiko prekoraenje

    −  znaajna cifra je izgubljena jer veliina rezultata prevazilazi kapacitet odredišta

    −  postoji instrukcija Interrupt On Overflow koja e generisati prekid u ovakvoj situaciji

    −  IF: ako je 1- dozvoljava procesoru da prepoznaje spoljašnje maskabilne prekide

    −  nema uticaja na spoljašnje nemaskabilne (NMI) i interno generisane prekide

    −  DF: ako je na 1 – izaziva autodekrementiranje kod string instrukcija (0 –autoinkrementiranje)

    −  TF: ako je 1 – procesor radi u single-step režimu za testiranje

    −  u ovom režimu procesor generiše interni prekid posle svake instrukcije

  • 8/18/2019 124393592-Uvod-u-Asembler-8086

    6/42

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

    −  Instrukcije, podaci dužine 1 bajta ili 2 bajta (rei) mogu biti smešteni naproizvoljnoj adresi

    −  Promenljive dužine rei koje su na neparnim adresama nazivaju se neporavnatim(unaligned )

    −  nije mogu 16-bitni prenos neporavnatih rei

    −  Intelova konvencija: rei se smeštaju tako da je viši bajt na višoj adresi

    −  Primer: vrednost rei koja poinje na adresi 322H je: 7412H

    322H 000

    1

    001

    0

    323H 011

    1

    010

    0

    −  Dvostruke rei su specijalna kategorija podataka koji se nazivaju pokazivai( pointers)

    −  koriste se da adresiraju podatke i instrukcije koji su izvan tekuih segmenata

    −  niža re pokazivaa sadrži ofset-adresu, a viša segment-adresu

    −  rei pokazivaa se smeštaju konvencionalno: bajt na višoj adresi sadrži 8 znaajnijih bitarei

    −  Primer: vrednost pokazivaa koji poinje na adresi 104H je:7490H(segment):6512H(ofset)

    104H 000

    1

    001

    0105H 011

    0

    010

    1

    106H 100

    1

    000

    0

    107H 011

    1

    010

    0

    Segmentacija−  Segment je logika jedinica memorije koja može biti do veliine od 64Kbyte

    −  Svaki segment obuhvata kontinualni adresni prostor

    −  Svakom segmentu je (programski) dodeljena bazna adresa

    −  bazna adresa predstavlja adresu prve lokacije koja pripada segmentu u memorijskomprostoru

    −  Segmenti poinju na 16-bajtnim memorijskim jedincama (paragrafima)

    −  Nema drugih ogranienja – segmenti mogu biti:

  • 8/18/2019 124393592-Uvod-u-Asembler-8086

    7/42

    −  susedni, razdvojeni, delimino ili potpuno preklopljeni

    −  Fizika lokacija u memoriji može pripadati veem broju logikih segmenata

    −  Segmentni registri pokazuju (sadrže bazne adrese) na 4 tekua adresibilna segmenta

    −  Program obezbeuje pristup drugim segmentima tako što menja sadržaj segmentnih

    registara−  Segmentna organizacija podržava modularno projektovanje softvera

    Generisanje fizike adrese−  Fizika adresa je 20-bitna vrednost koja jednistveno identifikuje svaku bajt-lokaciju

    −  Fizika adresa je u opsegu 0-FFFFFH t.j. unutar 1M adresnog prostora

    −  Programi radije manipulišu logikim umesto fizikim adresama

    −  na taj nain nije potrebno a priori znanje o mestu na koje se locira program u memoriji

    −  takoe, tako se olakšava dinamiko upravljanje memorijskim resursima

    −  Logika adresa se sastoji od ofset-adrese i segment-adrese−  Obe adrese su neoznaene 16-bitne veliine

    −  Bajt adresiran najmanjom adresom u segmentu ima ofset-adresu 0

    −  Više razliitih logikih adresa se može mapirati u istu fiziku adresu

    −  Na primer: 2C1:3H =2C0:13H (sintaksa: < segment-adresa>:< ofset-adresa>H)

    −  Uvek kada procesor pristupa memoriji – fizika adresa se izraunava iz logike

    −  to se dogaa kada procesor dohvata instrukciju ili ita/piše podatak

    −  Fizika adresa se izraunava tako što se:

    −  16-bitna segment-adresa pomera za 4 bita ulevo−  pomerena segment-adresa sabere sa ofset-adresom

    −  Primer: 1234:0022H=12340H+0022H=12362H

    −  Dobijanje logike adrese zavisi od vrste pristupa memoriji:

    Vrsta pristupa Podrazumevan

    a

    baza segmenta

    Alternativna

    baza

    segmenta

    Ofset

    Dohvatanje instrukcije CS - IP

    Operacija na steku SS - SP

    Promenljiva (osimdonjih)

    DS CS,ES,SS efektivna adresa

    Izvor string DS CS,ES,SS SI

    Odredište string ES - DI

    BP korišen kao bazni

    reg.

    SS CS,DS,ES efektivna adresa

  • 8/18/2019 124393592-Uvod-u-Asembler-8086

    8/42

    −  Ofset memorijske promenljive se izraunava na osnovu naina adresiranja

    −  nain adresiranja se zadaje u instrukciji

    −  rezultat se zove efektivna adresa (EA) operanda

    −  Stringovi se adresiraju drugaije u odnosu na druge promenljive (videti tabelu)

    −  Kada se BP koristi kao bazni registar, podrazumeva se da je promenljiva na steku−  Alternativni registar sa segment-adresom se zadaje kao prefiks instrukcije

    −  prefiks je jednobajtna mašinska instrukcija

    −  ona kaže procesoru koji segment-registar da koristi za pristup promenljivoj u sledeojinstrukciji

    Implementacija steka−  Stek se implementira u memoriji i pristupa mu se pomou SS i SP registara

    −  Sistem može imati proizvoljan broj stekova, a max veliina steka je 64K

    −  Pokušaj prekoraenja steka završava "gaženjem" poetka steka−  SP pokazuje na vrh steka (Top Of the Stack - TOS )

    −  SP sadrži ofset TOS-a u odnosu na baznu adresu segmenta koju sadrži SS

    −  Stek raste od viših prema nižim adresama

    −  Bazna adresa steka koju sadrži SS nije dno steka – stek raste prema baznoj adresi

    −  Lokacije na steku su 16-bitne (na stek se stavljaju i sa njega uzimaju rei od 16 bita)

    −  Re se stavlja na stek dekrementiranjem SP za 2 i upisom rei na novi TOS

    −  Re se uzima sa steka itanjem sa TOS i inkrementiranjem SP za 2

    Posveene i rezervisane lokacije−  Dve oblasti na ekstremno niskim i visokim adresama su posveene specifinim

    funkcijama

    −  Lokacije od 0 do 7FH (128 bajtova) su posveene tabeli prekidnih vektora

    −  Lokacije od FFFF0H do FFFFFH (16 bajtova) su posveene za "boot" sistema

    Ulaz/izlaz−  Ulazno/izlazni prostor je razdvojen od memorijskog

    −  U/I prostor može da se prilagodi na 64K 8-bitnih portova ili 32K 16-bitnih

    −  IN i OUT instrukcije prenose podatke izmeu akumulatora i portova u U/I prostoru−  AL se koristi za bajt, a AX za re 

    −  U/I prostor nije segmentiran – U/I adresa se jednostavno pojavljuje na donjih 16adresnih linija

    −  Razni oblici U/I instrukcija dopuštaju da U/I adresa bude specificirana

    −  kao fiksna vrednost u instrukciji

  • 8/18/2019 124393592-Uvod-u-Asembler-8086

    9/42

    −  kao promenljiva vrednost u DX registru

    −  Lokacije na U/I adresama od F8H do FFH su rezervisane od strane proizvoaa

    Memorijski mapiran ulaz/izlaz−  U/I ureaji mogu biti smešteni i u memorijski adresni prostor procesora

    −  Ukoliko ureaj odgovara kao memorijska komponenta – CPU ne zna za razliku

    −  Memorijski mapiran U/I obezbeuje veu fleksibilnost programiranja

    −  proizvoljna instrukcija koja pristupa memoriji se može koristiti za pristup U/I portu

    −  MOV instrukcija može prenositi podatke izmeu U/I porta i proizvoljnog registra

    −  AND i OR se mogu koristiti da se manipuliše bitima u registrima U/I ureaja

    −  mogu se koristiti prednosti raznovrsnosti adresnih naina

  • 8/18/2019 124393592-Uvod-u-Asembler-8086

    10/42

    Naini adresiranja

    Uvod−  Procesor i8086 nudi vei broj razliitih naina adresiranja

      Operandi mogu biti u registrima, u instrukciji samoj, u memoriji i na U/Iportovima

    −  Adresa operanada u memoriji i na U/I portovima može biti izraunata na višenaina

    Raunanje adrese operanda u memoriji−  Fizika adresa se rauna dodavanjem ofset-adrese na ulevo pomerenu segment-

    adresu

    −  Izraunata ofset-adresa se naziva efektivnom adresom (EA)

    −  EA je 16-bitna adresa koja odreuje pomeraj u odnosu na poetak segmenta

    −  Nain raunanja adrese operanda u memoriji odreen je u drugom bajtu instrukcije

    −  EA = pomeraj (displacement ) + sadržaj baznog registra + sadržaj indeksnogregistra

    −  Pomeraj je 8- ili 16-bitni broj koji se sadrži u instrukciji

    −  Izvodi se iz pozicije imena operanda (promenljive ili labele) u programu

    −  Programer može i eksplicitno da specificira pomeraj

    BX

    BP

    DI

    SI

    ili

    ili

    ili

    +

    BP DI

    BX SI

    ili ili

    + +

    ++

    ili

    pomer 

    CS 000

    SS 000

    DS 000

    ES 000

    ili

    ili

    fizika adresa

    Efektivn

    a

    Kodiranou

    Eksplicitno

    Podrazumeva

    no

  • 8/18/2019 124393592-Uvod-u-Asembler-8086

    11/42

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

    −  To omoguuje da se iz jedne instrukcije pristupa raznim memorijskim lokacijama

    Registarsko adresiranje−  U instrukciji se navode adrese registara u kojima su operandi

    −  Instrukcije koje specificiraju samo operande u registrima su najkompaktnije inajbrže

    −  adrese registara se kodiraju u instrukciji sa par bitova

    −  operacija se u celini obavlja unutar CPU (nema ciklusa na magistrali)

    −  Registri mogu sadržati izvorne, odredišne ili obe vrste operanada

    −  Primer: MOV AX, CX ; kopira se sadržaj registra CX uregistar AX 

    Neposredno adresiranje−  U instrukciji se neposredno zadaju sami operandi koji su konstante

    −  Podaci mogu biti 8 ili 16 bita dužine

    −  Pristup neposrednim operandima je brz jer se dohvataju iz instrukcijskog redaekanja

    −  Operandi mogu biti samo izvorni i moraju sadržati konstantne vrednosti

    −  Primer: MOV AX, 5 ; kopira se 5 u registar AX 

    Direktno adresiranje

    −  EA se izraunava samo na osnovu pomeraja

    −  Ovo je najjednostavnije memorijsko adresiranje – nisu ukljueni nikakvi registri

    −  Tipino se koristi za pristup jednostavnim promenljivama – skalarima

    −  Primer: MOV AX, X ; kopira se sadržaj X u registar AX 

    Registarsko indirektno adresiranje−  EA se izraunava na osnovu jednog baznog ili indeksnog registra

    −  Jedna instrukcija može pristupati razliitim memorijskim lokacijama

    −  postiže se tako što se vrednost baznog ili indeksnog registra menja

    −  LEA ( Load Effective Address) ili aritmetike instrukcije se mogu koristiti za ažuriranjeregistra

    OpCod 

    Mod Displacement

    EA

  • 8/18/2019 124393592-Uvod-u-Asembler-8086

    12/42

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

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

    Bazno adresiranje−  EA se rauna kao suma pomeraja i sadržaja registra BX ili BP

    −  Ako se BP specificira kao bazni registar to izaziva da se pristupa operandu u steksegmentu

    −  Bazno adresiranje pomou BP je pogodan nain pristupa podacima na steku

    −  podaci na steku mogu biti parametri koji se prenose u potprogram

    −  Bazno adresiranje omoguava i jednostavno pristupanje jednakim strukturama koje su locirane na razna mesta u memoriji

    −  bazni registar se menja da pokazuje na strukturu, a pomeraj odreuje odgovarajui lanstrukture

    −  razliitim instancama strukture se pristupa jednostavnom izmenom baznog registra

    −  Primeri: MOV AX,[BX]+X ; kopira se sadržaj sa efektivneadrese

    MOV AX,X[BX] ; sadrzaj(BX)+ofset(X) u AX

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

    Indeksirano adresiranje−  EA se rauna kao suma pomeraja i sadržaja indeksnog registra SI ili DI

      Indeksno adresiranje seesto koristi za pristup elemetu nekog niza

    −  pomeraj locira poetak niza a vrednost indeksnog registra selektuje jedan element

    −  pošto su svi elementi jednake veliine, primenjuje se jednostavna indeksna aritmetika

    Primeri: MOV AX,[SI]+X ; kopira se sadržaj saefektivne adrese

    MOV AX,X[SI] ; sadrzaj(SI)+ofset(X)

    EA

    OpCod 

    Mod BX

    BP

    SI

    DI

    or

    or

    or

    OpCod 

    Mod Displacement

    EABX

    BPor +

    OpCod 

    Mod Displacement

    EASI

    DIor +

  • 8/18/2019 124393592-Uvod-u-Asembler-8086

    13/42

    u AX

    MOV AX,[SI+X]

    MOV AX,[SI].X 

    Bazno indeksirano adresiranje

    −  EA se rauna kao suma pomeraja, sadržaja baznog i sadržaja indeksnog registra

    −  Veoma fleksibilan nain adresiranja, jer se dve komponente mogu menjati u vremeizvršenja

    −  Pogodan nain za proceduru da adresira niz alociran na steku

    −  BP sadrži ofset referentne take na steku (TOS nakon smeštanja parametara i povratneadrese)

    −  pomeraj (displacement ) sadrži ofset poetka niza u odnosu na referentnu taku

    −  indeksni registar se koristi da adresira pojedine elemente niza

    −  Takodje, nizovi koji se nalaze u strukturama i matrice se mogu efikasno obraivati

    ovako

    Primer: MOV AX,[BX].X[SI] ; kopira se sadržaj sa EA;

    sadr(BX)+sadr(SI)+ofset(X) u AX 

    Adresiranje stringova−  String instrukcije ne koriste normalne naine memorijskog adresiranja za pristup

    operandima

    −  Indeksni registri se koriste implicitno: SI za EA izvornog operanda i DI za EAodredišnog

    −  Na poetku string instrukcije, podrazumeva se da

    −  SI pokazuje na 1. bajt ili re izvornog stringa

    −  DI pokazuje na 1. bajt ili re odredišnog stringa

    −  Tokom repetitivne string operacije

    −  CPU automatski menja SI i DI za pristup susednim elementima

    Primer: MOVS D,S; kopira jedan bajt sa adrese DS:SI naadresu ES:DI 

    OpCod 

    Mod Displacement

    EA

    BX

    BPor

    SIDI

    or

    +

    +

  • 8/18/2019 124393592-Uvod-u-Asembler-8086

    14/42

     

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

    proizvoljan nain adresiranja memorijskog operanda se može primeniti (ak i

    string)

    −  Za U/I portove koji su locirani u U/I adresni prostor mogu se koristiti dva nainaadresiranja

    −  direktno adresiranje porta−  indirektno adresiranje porta

    −  U direktnom adresiranju broj porta je 8-bitni neposredni operand

    −  ovo omoguava fiksni pristup portovima od 0 do 255

    −  Indirektno adresiranje porta je slino registarskom indirektnom adresiranjumemorijskog op.

    −  U indirektnom adresiranju broj porta se uzima iz DX registra

    −  ovo omoguava fleksibilni pristup portovima od 0 do 65535

    −  program najpre definiše adresu porta upisom u DX, a zatim IN/OUT instrukcijom

    pristupa portuPrimeri:

    IN AX,15; direktno adresiranje porta 15 (cita se u AX)

    OUT DX,AX; indirektno adresiranje porta sa adresom u DX

    ; (salje se sadrzaj AX)

    OpCod 

    SI Source

    DI Destination

    Direktno adresiranje

    Port

    OpCod 

    Data

    Indirektno adresiranje

    Port

    OpCod 

    DX

  • 8/18/2019 124393592-Uvod-u-Asembler-8086

    15/42

    Skup instrukcija

    Uvod−  U veini instrukcija mogu figurisati registarski, memorijski i neposredni operandi

      Nad memorijskim lokacijama se mogu vršiti operacije – nije potrebnoprebacivanje u registre

    −  8086 ima repertoar od oko 100 instrukcija simbolikog mašinskog jezika

    −  Procesor raspoznaje oko 300 razliitih mašinskih instrukcija

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

    −  procesor raspoznaje 28 razliitih mašinskih MOV instrukcija (npr. "prenos bajta iz R uM")

    −  Na ovaj nain se kombinuje

    −   jednostavnost programiranja na simbolikom nivou

    −  efikasnost smeštanja instrukcija na mašinskom nivou

    −  Jednoj SMJ (ASM) instrukciji odgovaraju razliiti formati (krai i duži) mašinskeinstrukcije

    −  Npr. programer piše INC, a asembler na osnovu operanda odreuje mašinskuinstrukciju

    Instrukcije za prenos podataka−  Postoji 14 instrukcija

    −  za prenos podataka izmeu memorije i registara i izmeu registara i U/I porta

    −  za manipulisanje stekom i za prenos indikatora

    −  za punjenje segmentnih registara

    Opštenamenske instrukcije za prenos−  MOV odredište, izvorište (Move)

    −  prenosi bajt ili re od izvornog do odredišnog operanda

    −  PUSH izvorište (Push)

    −  dekrementira SP za 2 pa prenosi re od izvorišta do vrha steka na koji ukazuje SP

    −  esto se koristi za smeštanje parametara na stek pre poziva procedure

    −  osnovni nain za smeštanje privremenih podataka na stek

    −  POP odredište (Pop)

    −  prenosi re sa vrha steka na koji ukazuje SP do odredišta, pa tada inkrementira SP za 2

    −  može se koristiti za prenos privremenih promenljivih sa steka u registre ili memoriju

    −  XCHG odredište, izvorište (Exchange)

    −  zamenjuje sadržaje izvorišta i odredišta (bajt ili re)

  • 8/18/2019 124393592-Uvod-u-Asembler-8086

    16/42

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

    −  semafor se korsiti da zaštiti zajedniki resurs u multiprocesorskom okruženju XLAT translaciona_tabela (Translate)

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

    −  AL treba pre izvršenja instrukcije da sadrži ofset u tabeli−  podrazumeva se da e se BX koristiti da ukaže na poetak tabele

    −  prvi bajt u tabeli ima ofset 0

    −  korisno za translaciju karaktera iz jednog koda u drugi (npr ASCII u EBCIDIC)

    Ulaz/izlaz−  IN akumulator, port (Input)

    −  prenosi bajt ili re sa ulaznog porta u AL ili AX registar

    −  broj porta može biti specificiran pomou neposredne bajt-konstante ili pomou DXregistra

    −  neposredno adresiranje porta dopušta portove 0-255, a adresiranje preko DX portove 0-65535

    −  OUT port, akumulator (Output)

    −  prenosi bajt ili re iz AL ili AX registra na izlazni port

    −  broj porta može biti specificiran pomou neposredne bajt-konstante ili pomou DXregistra

    Prenos adresa−  Instrukcije ne manipulišu sadržajem ve adresom promenljivih

    −  Najkorisnije su za obradu lista, bazne promenljive i operacije nad stringovima−  LEA odredište, izvorište (Load Effective Address)

    −  prenosi ofset izvorišnog operanda (ne njegovu vrednost) u odredište

    −  izvorišni operand mora biti memorijski operand

    −  odredišni operand mora biti 16-bitni opštenamenski registar

    −  ne utie na indikatore

    −  koristi se da napuni neke registre za potrebe drugih instrukcija(npr. BX registar adresom translacione tabele koju koristi XLAT instrukcija)

    −  LDS odredište, izvorište (Load pointer using DS)

    −  prenosi 32-bitnu pokazivaku promenljivu iz izvorišnog operanda u odredišni operand iDS

    −  izvorišni operand mora biti u memoriji

    −  re ofseta pokazivaa se prenosi u odredište koje može biti 16-bitni opštenamenskiregistar

    −  re segmenta pokazivaa se prenosi u DS

  • 8/18/2019 124393592-Uvod-u-Asembler-8086

    17/42

    −  za obradu stringa koji nije u tekuem segmentu podataka pogodno je specificirati SIkao odredište(string instrukcije smatraju da je izvorišni string u tekuem segmentu podataka, a SI

    sadrži ofset)

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

    −  prenosi 32-bitnu pokazivaku promenljivu iz izvorišnog operanda u odredišni operand iES

    −  izvorišni operand mora biti u memoriji

    −  re ofseta pokazivaa se prenosi u odredište koje može biti 16-bitni opštenamenskiregistar

    −  re segmenta pokazivaa se prenosi u ES

    −  za obradu stringa koji nije u tekuem ekstra segmentu pogodno je specificirati DI kaoodredište

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

    Prenos indikatora−  Indikatori imaju sledee pozicije:

    - - - - OF

    DF

    IF TF

    SF

    ZF

    - AF

    - PF

    - CF

    15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

    −  LAHF (Load register AH from Flags)

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

    −  sadržaj bitova 5, 3 i 1 je nedefinisan

    −  indikatori se ne menjaju−  primarna namena instrukcije je za konverziju 8080/8085 programa na 8086/8088

    −  SAHF (Store register AH into Flags)

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

    −  OF, DF, IF i TF se ne menjaju

    −  primarna namena instrukcije je za konverziju 8080/8085 programa na 8086/8088

    −  PUSHF (Push Flags)

    −  dekrementira SP za 2 i tada prenosi sve indikatore u re na vrhu steka

    −  indikatori se ne menjaju

    −  služi za smeštanje indikatora na stek pri pozivu potprograma

    −  nain za izmenu TF indikatora (nema direktne instrukcije): PUSHF, izmena na steku,POPF

    −  POPF (Pop Flags)

    −  prenosi specifine bite iz rei na vrhu steka u indikatore, a zatim inkrementira SP za 2

    −  služi za restauraciju indikatora pri povratku iz potprograma

  • 8/18/2019 124393592-Uvod-u-Asembler-8086

    18/42

    Aritmetike instrukcije−  Postoji 20 aritmetikih instrukcija podeljenih u grupe:

    −  sabiranje

    −  oduzimanje

    −  množenje−  delenje

    Aritmetiki formati podataka−  Postoje 4 tipa podataka:

    −  neoznaeni binarni (cardinals)

    −  oznaeni binarni (integers)

    −  neoznaeni pakovani decimalni

    −  neoznaeni nepakovani decimalni

    −  Binarni brojevi mogu biti dužine 8 ili 16 bita−  Decimalni brojevi se smeštaju u bajtove

    −  dve cifre u bajt za pakovane decimalne

    −   jedna cifra u bajt za nepakovane decimalne

    −  Procesor uvek podrazumeva da operandi u aritmetikoj instrukciji sadrže valjanebrojeve

    −  Loši podaci mogu proizvesti nepredvidive rezultate

    Neoznaeni binarni brojevi−

      Mogu biti dužine 8 ili 16 bita−  Svi biti odreuju vrednost nenegativnog broja

    −  Opseg 8-bitnih brojeva je 0-255

    −  Opseg 16-bitnih brojeva je 0-65535

    −  Mogue su operacije sabiranja, oduzimanja, množenja i deljenja

    Oznaeni binarni brojevi (integers )−  Mogu biti dužine 8 ili 16 bita

    −  Najviši (krajnje levi) bit se interpretira kao znak broja: 0=nenegativni, 1=negativni

    brojevi−  Negativni brojevi se predstavljaju u standardnoj notaciji drugog komplementa

    −  Opseg 8-bitnih brojeva je -128-+127

    −  Opseg 16-bitnih brojeva je -32768-+32767

    −  Sabiranje i oduzimanje se vrši pomou instrukcija za neoznaene binarne brojeve

    −  Za množenje i deljenje oznaenih brojeva postoje posebne instrukcije

  • 8/18/2019 124393592-Uvod-u-Asembler-8086

    19/42

    Pakovani decimalni brojevi−  Smeštaju se kao neoznaene veliine dužine jednog bajta

    −  Bajt sadrži po jednu decimalnu cifru u svakoj svojoj polovini (nibli)

    −  Cifra u gornjoj polovini je veeg znaaja

    −  Vrednosti u opsegu 0-9 su validne u svakoj polovini bajta, tako da je opseg broja0-99

    −  Sabiranje i oduzimanje se izvršavaju u dva koraka:

    −  izvršava se neoznaena binarna operacija koja proizvodi privremeni rezultat u AL

    −  izvršava se instrukcija prilagoenja koja menja vrednost u AL u finalni pakovanidecimalni broj

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

    Nepakovani decimalni brojevi−

      Smeštaju se kao neoznaene veli

    ine dužine jednog bajta

    −  Vrednost broja je odreena donjom polovinom bajta (donja nibla)

    −  Vrednosti u opsegu 0-9 su validne i interpretiraju se kao decimalni brojevi

    −  Viša nibla mora biti 0 za množenje i deljenje, a za sabiranje i oduzimanje jeproizvoljna

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

    −  izvršava se neoznaena binarna operacija koja proizvodi privremeni rezultat u AL

    −  izvršava se instrukcija prilagoenja koja menja AL u finalni nepakovani decimalni broj

    −  Deljenje se obavlja takoe u dva koraka:

    −  izvršava se prilagoenje deljenika (brojioca) u AL

    −  izvršava se neoznaena binarna operacija deljenja koja proizvodi finalni rezultat

    ASCII cifre−  ASCII karakteri koji sadrže cifre "0"-"9" su slini nepakovanim decimalnim

    brojevima

    −  Razlika je u tome što gornja nibla ASCII cifre uvek sadrži vrednost 3

    −  Aritmetika za nepakovane decimalne brojeve se primenjuje za ASCII cifre poduslovima:

    −  viša nibla ASCII cifre se postavlja na 0 pre množenja ili deljenjanakon izvršenja operacije mora se upisati 3 u gornju niblu rezultata da se dobije ASCIIcifra

    Aritmetike instrukcije i indikatori−  Aritmetike instrukcije postavljaju 6 indikatora da ukažu na osobine rezultata

    operacije

  • 8/18/2019 124393592-Uvod-u-Asembler-8086

    20/42

    −  Veina indikatora se može testirati nakon aritmetike instrukcije u instrukcijiuslovnog skoka

    −  Može se koristiti i INTO ( Interrupt on Overflow) instrukcija

    −  Razliite instrukcije razliito utiu na indikatore; ovde su navedena neka generalna

    pravila−  CF (Carry Flag)

    −  postavlja se ako kod sabiranja doe do prenosa iz najvišeg bita rezultata

    −  postavlja se ako kod oduzimanja doe do pozajmice u najviši bit rezultata

    −  za oznaeni prenos važi CF≠OF

    −  CF se može koristiti za detekciju neoznaenog prekoraenja

    −  instrukcije ADC i SBB, kao i RCL i RCR ukljuuju CF u operacije

    −  ADC i SBB se koriste za višebajtno (32-bita, 64-bita) sabiranje i oduzimanje

    −  AF ( Auxiliary Carry Flag)

    −  postavlja se ako kod sabiranja doe do prenosa iz najvišeg bita donje nible u gornju

    −  postavlja se ako kod oduzimanja doe do pozajmice iz gornje nible u najviši bit donjenible

    −  koristi se praktino samo kod instrukcija za decimalno prilagoenje

    −  SF (Sign Flag)

    −  aritmetike i logike instrukcije postavljaju SF da bude jednak najvišem bitu (7. ili 15.)rezultata

    −  za oznaene binarne brojeve SF e biti 0 za nenegativne i 1 za negativne brojeve

    −  uslovna instrukcija skoka koja zavisi od SF se može koristiti posle aritmetike operacije

    −  na taj nain tok programa može biti promenjen u zavisnosti od znaka rezultata operacije

    −  nakon operacija sa neoznaenim brojevima SF treba ignorisati

    −  ZF ( Zero Flag)

    −  aritmetike i logike instrukcije ga postavljaju ako je rezultat operacije 0

    −  postoji uslovna instrukcija skoka koja zavisi od ZF

    −  PF (Parity Flag)

    −  aritmetike i logike instrukcije ga postavljaju ako nižih 8 bita rezultata sadrži paranbroj 1

    −  može se koristiti za proveru parnosti (npr. kod ASCII karaktera)

    −  OF (Overflow Flag)

    −  postavlja se ako je rezultat operacije suviše veliki pozitivan ili suviše mali negativanbroj

    −  "suviše" se odreuje prema dužini odredišta operacije

    −  ukazuje na prekoraenje u aritmetici sa znakom

    −  može se ignorisati kada se radi aritmetika neoznaenih brojeva

  • 8/18/2019 124393592-Uvod-u-Asembler-8086

    21/42

    −  može se testirati uslovnom instrukcijom skoka ili INTO ( Interrupt on Overflow)instrukcijom

    Sabiranje−  ADD odredište, izvorište (Add )

    −  suma dva operanda koji mogu biti 8- ili 16-bitni zamenjuje odredišni operand

    −  oba operanda mogu biti oznaena ili neoznaena

    −  ADD menja AF, CF, OF, PF, SF i ZF

    −  ADC odredište, izvorište (Add with Carry )

    −  sabira dva operanda (koji mogu biti 8- ili 16-bitni) i CF te zamenjuje odredišni operandrezultatom

    −  oba operanda mogu biti oznaena ili neoznaena

    −  ADC menja AF, CF, OF, PF, SF i ZF

    −  može se koristiti da se pišu rutine za sabiranje brojeva dužih od 16 bita

    −  INC odredište (Increment)

    −  dodaje 1 na odredišni operand koji može biti 8- ili 16-bitni

    −  operand se tretira kao neoznaeni binarni broj

    −  INC menja AF, OF, PF, SF i ZF, a ne utie na CF

    −  AAA (ASCII Adjust for Addition)

    −  menja sadržaj registra AL u ispravan nepakovani decimalni broj tako što uisuje 0 ugornju niblu

    −  AAA menja AF i CF, a sadržaj OF, PF, SF i ZF je nedefinisan

    −  DAA (Decimal Adjust for Addition)−  koriguje rezulatat u AL prethodnog sabiranja dva valjana pakovana decimalna operanda

    −  DAA menja sadržaj AL u par valjanih decimalnih cifara

    −  DAA menja AF, CF, PF, SF i ZF, a sadržaj OF je nedefinisan

    Oduzimanje−  SUB odredište, izvorište (Subtract)

    −  izvorišni operand se oduzima od odredišnog i rezultat zamenjuje odredišni operand

    −  operandi mogu biti bajtovi ili rei i to oznaeni ili neoznaeni binarni brojevi

    −  SUB menja AF, CF, OF, PF, SF i ZF−  SBB odredište, izvorište (Subtract with Borrow )

    −  izvorišni operand i CF se oduzimaju od odredišnog i rezultat zamenjuje odredišnioperand

    −  operandi mogu biti bajtovi ili rei i to oznaeni ili neoznaeni binarni brojevi

    −  SBB menja AF, CF, OF, PF, SF i ZF

  • 8/18/2019 124393592-Uvod-u-Asembler-8086

    22/42

    −  može se koristiti da se pišu rutine za oduzimanje brojeva dužih od 16 bita

    −  DEC odredište (Decrement)

    −  oduzima 1 od odredišnog operanda koji može biti 8- ili 16-bitni

    −  DEC menja AF, OF, PF, SF i ZF, a ne utie na CF

    −  NEG odredište (Negate)−  oduzima odredišni operand koji može biti 8- ili 16-bitni od 0 i upisuje rezultat u

    odredište

    −  izraunava drugi komplement broja, efektivno menjajui znak celobrojne vrednosti

    −  ako je operand 0 znak se ne menja

    −  ako je bajt-operand jednak –128 ili re-operand jednak –32768 nema promeneoperanda, OF=1

    −  NEG menja AF, CF, OF, PF, SF i ZF; CF je uvek postavljen na 1 izuzev kada jeoperand jednak 0

    −  CMP odredište, izvorište (Compare)−  oduzima izvorišni od odredišnog operanda koji mogu biti 8- ili 16-bitni ali ne upisuje

    rezultat

    −  operandi su neizmenjeni, ali su indikatori postavljeni i mogu se testirati narednominstrukcijom

    −  CMP menja AF, CF, OF, PF, SF i ZF

    −  komparacija koja se reflektuje na indikatore ima smer od odredišta prema izvorištu

    −  na primer: ako iza CMP ide JG ( Jump if Greater ) skok e se dogoditi ako je odredište > izvorište

    −  AAS (ASCII Adjust for Subtraction)−  menja sadržaj registra AL u ispravan nepakovani decimalni broj tako što uisuje 0 u

    gornju niblu

    −  AAS menja AF i CF, a sadržaj OF, PF, SF i ZF je nedefinisan

    −  DAS (Decimal Adjust for Subtraction)

    −  koriguje rezulatat u AL prethodnog oduzimanja dva valjana pakovana decimalnaoperanda

    −  odredišni operand je morao biti u registru AL

    −  DAS menja sadržaj AL u par valjanih decimalnih cifara

    −  DAS menja AF, CF, PF, SF i ZF, a sadržaj OF je nedefinisan

    Množenje−  MUL izvorište (Multiply )

    −  obavlja neoznaeno množenje izvorišnog operanda i akumulatora

    −  ako je izvorišni operand bajt tada se on množi sa AL, a rezultat (duple širine) se vraa uAX

  • 8/18/2019 124393592-Uvod-u-Asembler-8086

    23/42

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

    −  operandi se tretiraju kao neoznaeni binarni brojevi

    −  ako je viša polovina rezultata (AH odnosno DX) razliita od nule CF i OF sepostavljaju

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

    −  IMUL izvorište (Integer Multiply )

    −  obavlja oznaeno množenje izvorišnog operanda i akumulatora

    −  ako je izvorišni operand bajt tada se on množi sa AL, a rezultat (duple širine) se vraa uAX

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

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

    −  kada su CF i OF postavljeni na 1 – ukazuju da AH ili DX sadrže znaajne cifrerezultata

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

    −  AAM (ASCII Adjust for Multiply )

    −  koriguje rezultat prethodnog množenja dva valjana nepakovana decimalna operanda

    −  valjan dvocifreni nepakovani decimalni broj se izvodi iz sadržaja AH i AL i smešta uAH i AL

    −  više nible množenih operanada moraju sadržati 0 da bi AAM proizveo dobar rezultat

    −  AAM menja sadržaj PF, SF i ZF; sadržaj AF, CF i OF je nedefinisan

    Deljenje−  DIV izvorište (Divide)

    −  obavlja neoznaeno deljenje akumulatora (i njegove ekstenzije) izvorišnim operandom

    −  ako je izvorišni operand bajt – njime se deli deljenik dvostruke širine koji je u AH i AL

    −  kolinik se vraa u AL, a ostatak u AH

    −  ako je izvorišni operand re – njime se deli deljenik dvostruke širine koji je u DX i AX

    −  kolinik se vraa u AX, a ostatak u DX

    −  ako kolinik prevazie kapacitet odredišnog registra, kao kada se pokuša deljenje 0

    generiše se prekid tipa 0, a kolinik i rezultat su nedefinisani−  necelobrojni kolinici se odsecaju na celobrojne

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

    −  IDIV izvorište (Integer Divide)

    −  obavlja oznaeno deljenje akumulatora (i njegove ekstenzije) izvorišnim operandom

    −  ako je izvorišni operand bajt – njime se deli deljenik dvostruke širine koji je u AH i AL

  • 8/18/2019 124393592-Uvod-u-Asembler-8086

    24/42

    −  kolinik se vraa u AL, a ostatak u AH

    −  za celobrojno deljenje bajta maksimalni pozitivni kolinik je +127, a minimalninegativni -127

    −  ako je izvorišni operand re – njime se deli deljenik dvostruke širine koji je u DX i AX

      kolinik se vra

    a u AX, a ostatak u DX

    −  za celobrojno deljenje rei max pozitivni kolinik je +32767, a min negativni –32767

    −  ako je kolinik pozitivan a prevazilazi maksimum, ili negativan a prevazilazi minimum,kolinik i ostatak su nedefinisani, a generiše se prekid tipa 0

    −  ovo se dešava kada se pokuša deljenje 0

    −  necelobrojni kolinici se odsecaju prema 0, a ostatak ima isti znak kao i deljenik

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

    −  AAD (ASCII Adjust for Division)

    −  modifikuje brojilac u AL pre deljenja dva valjana nepakovana decimalna operanda

    tako da kolinik dobijen deljenjem bude valjan nepakovani decimalni broj

    −  AH mora biti 0 za naredni DIV da se dobije korektan rezultat

    −  kolinik se vraa u AL, a ostatak u AH – obe više nible se anuliraju

    −  AAD menja PF, SF i ZF; sadržaj AF, CF i OF je nedefinisan

    −  CBW (Convert Byte to Word )

    −  proširuje znak bajta u registru AL na registar AH

    −  ne utie na indikatore

    −  može se koristiti da se napravi deljenik dužine rei od bajta pre deljenja bajtom

    −  CWD (Convert Word to Doubleword )

    −  proširuje znak rei u registru AX na registar DX

    −  ne utie na indikatore

    −  može se koristiti da se napravi deljenik dužine dvostruke rei od rei pre deljenja jednom rei

    Instrukcije koje manipulišu bitima−  Postoje 3 kategorije instrukcija koje manipulišu bitima bajta ili rei:

    −  logike instrukcije (NOT, AND, OR, XOR, TEST)

    −  instrukcije pomeranja (SHL, SAL, SHR, SAR)

    −  instrukcije rotacije (ROL, ROR, RCL, RCR)

    Logike instrukcije−  Realizuju 4 bulova operatora kao i TEST instrukciju koja samo postavlja

    indikatore

    −  AND, OR, XOR i TEST manipulišu indikatorima na sledei nain:

    −  OF i CF se uvek postavljaju na 0

  • 8/18/2019 124393592-Uvod-u-Asembler-8086

    25/42

    −  AF je uvek nedefinisan nakon logike instrukcije

    −  SF, ZF i PF se uvek postavljaju tako da reflektuju rezultat i mogu se testirati uslovnimskokom

    −  interpretacija SF, ZF i PF je ista kao nakon aritmetikih instrukcija

      NOT ne utie na indikatore

    −  NOT odredište (Not)

    −  invertuje bite (rauna jedinini komplement) operanda dužine bajta ili rei

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

    −  obavlja logiku "I" operaciju izmeu dva operanda (bajta ili rei) i vraa rezultat uodredište

    −  bit rezultata je 1 ako su oba odgovarajua bita operanada 1, inae je 0

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

    −  obavlja logiku "ILI" operaciju izmeu dva operanda (bajta ili rei) i vraa rezultat u

    odredište−  bit rezultata je 1 ako je barem jedan od dva odgovarajua bita operanada 1, inae je 0

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

    −  obavlja logiku "ekskluzivno ILI" operaciju izmeu dva operanda i vraa rezultat uodredište

    bit rezultata je 1 ako dva odgovarajua bita operanada imaju razliite vrednosti, inae je 0

    −  TEST odredište, izvorište (Test)

    −  obavlja logiku "I" operaciju izmeu dva operanda (bajta ili rei) i samo postavljaindikatore

    −  rezultat se ne upisuje, niti se operandi menjaju

    −  ako se nakon TEST instrukcije izvrši JNZ ( Jump if Not Zero) do skoka e doiako postoji barem jedan bit jednak 1 na korespondentnim pozicijama u operandima

    Instrukcije pomeranja−  Biti u bajtu ili rei mogu biti pomerani aritmetiki ili logiki

    −  Broj koji se navodi u instrukciji omoguava do 255 pomeranja

    −  Broj se može specificirati kao neposredna konstanta 1 ili kao registar CL(promenljivi broja)

    −  Aritmeti

    ka pomeranja se mogu koristiti za množenje i deljenje binarnih brojevastepenima 2

    −  Logika pomeranja se mogu koristiti da bi se izolovali biti u bajtovima ili reima

    −  Instrukcije pomeranja manipulišu indikatorima na sledei nain:

    −  AF je uvek nedefinisan nakon instrukcije pomeranja

    −  SF, ZF i PF se uvek postavljaju kao u logikim instrukcijama

    −  CF uvek sadrži vrednost poslednjeg bita koji je pomeren izvan odredišnog operanda

  • 8/18/2019 124393592-Uvod-u-Asembler-8086

    26/42

    −  OF je uvek nedefinisan nakon višebitnog pomeranja

    −  pri pomeranju za jednu poziciju OF je 1 ako se bit najvišeg znaaja menja

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

    −  obavljaju istu operaciju i fiziki su ista instrukcija−  odredišni bajt ili re se pomera ulevo za broj bita specificiran u operandu broj

    −  sa desne strane ulaze 0 pri pomeranju ulevo

    −  ako bit znaka (najviši bit odredišta) zadržava vrednost OF se postavlja na 0

    −  SHR odredište, broj (Shift Logical Right)

    −  pomera bite operanda odredišta (bajt ili re) u desno za broj bita specificiranoperandom broj

    −  sa leve strane ulaze 0 pri pomeranju udesno

    −  ako bit znaka (najviši bit odredišta) zadržava vrednost OF se postavlja na 0

    −  SAR odredište, broj (Shift Arithmetic Right)

    −  pomera bite operanda odredišta (bajt ili re) u desno za broj bita specificiranoperandom broj

    −  sa leve strane ulaze biti jednaki originalnom najvišem bitu (zadržava se predznak)

    −  SAR odseca pozitivne brojeve prema 0, a negativne prema -∞ 

    −  rezultat SAR i odgovarajueg IDIV se razlikuju jer IDIV odseca sve vrednosti prema 0

    Instrukcije rotacije−  Biti koji pri rotaciji izlaze iz odredišta se ne gube, ve se pojavljuju "sa druge

    strane"−  Kao kod instrukcija pomeranja, broj pozicija za rotaciju može biti konstanta 1 ili

    CL

    −  CF se može koristiti kao ekstenzija operanda u dve instrukcije

    −  Tako se bit može izolovati u CF pa zatim testirati pomou JC ( Jump if Carry) iliJNC

    −  Rotacije utiu samo na CF i OF

    −  CF uvek sadrži vrednost poslednjeg bita koji je pri rotaciji izašao iz odredišta

    −  Pri rotaciji za više pozicija, OF je uvek nedefinisan

    −  Pri rotaciji za jednu poziciju OF se postavlja na 1 ako operacija menja najviši bitodredišta

    −  ROL odredište, broj (Rotate Left)

    −  rotira odredište (bajt ili re) ulevo za specificirani broj pozicija

    −  ROR odredište, broj (Rotate Right)

    −  rotira odredište (bajt ili re) udesno za specificirani broj pozicija

  • 8/18/2019 124393592-Uvod-u-Asembler-8086

    27/42

    −  RCL odredište, broj (Rotate through Carry Left)

    −  rotira odredište (bajt ili re) ulevo za specificirani broj pozicija

    −  CF se tretira kao deo odredišta

    −  vrednost CF se pomera u najniži bit odredišta dok se CF puni najvišim bitom odredišta

    −  RCR odredište, broj (Rotate through Carry Right)isto kao RCL, samo se rotira na desnu stranu

    Instrukcije za kontrolu toka−  Sekvenca izvršavanja instrukcija odreena je sadržajem CS i IP registara

    −  Registar CS sadrži baznu adresu tekueg segmenta koda iz kojeg se dohvatajuinstrukcije

    −  Registar IP sadrži ofset u odnosu na poetak segmenta

    −  Kombinacija CS i IP ukazuje na memorisjku lokaciju iz koje se dohvata naredna

    instrukcija−  Instrukcije za kontrolu toka menjaju sadržaj CS i IP registara i tako menjaju tok

    programa

    −  Postoje 4 grupe instrukcija za kontrolu toka programa:

    −  bezuslovni skokovi

    −  uslovni skokovi

    −  instrukcije za kontrolu iteracija

    −  instrukcije prekida

    −  Samo instrukcije prekida utiu na indikatore

    Bezuslovni skokovi−  Instrukcije bezuslovnih skokova mogu prenositi kontrolu

    −  unutar segmenta (intrasegment transfer ); u asembleru se ovi skokvi nazivaju NEAR 

    −  izmeu segmenata (intersegment transfer ); u asembleru se ovi skokvi nazivaju FAR 

    −  JMP cilj (Jump)

    −  bezuslovno prenosi kontrolu na ciljnu lokaciju

    −  adresa cilja može biti u samoj instrukciji (direktan skok) ili u memoriji/registru(indirektan skok)

    −  unutarsegmentni direktan skok menja IP dodajui relativan pomeraj cilja iz JMP instrukcije

    −  ako asembler može da odredi da je cilj unutar 127 bajtova od JMP on generiše 2-bajtniJMP 

    −  2-bajtna JMP instrukcija se naziva SHORT JMP 

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

  • 8/18/2019 124393592-Uvod-u-Asembler-8086

    28/42

    −  unutarsegmentni direktni skokovi su samo-relativni

    −  oni su odgovarajui u dinamiki relokatibilnim rutinama u kojima su JMP i cilj u istomsegmentu

    −  unutarsegmentni indirektni skok može biti kroz memorijsku lokaciju ili kroz 16-bitniregistar

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

    −  meusegmentni direktan skok zamenjuje IP i CS vrednostima koje se sadrže uinstrukciji

    −  meusegmentni indirektan skok može biti realizovan samo kroz memoriju

    −  prva re dvorenog pokazivaa koji adresira instrukcija zamenjuje IP, a druga CS

    −  CALL ime_procedure (Call)

    −  prenosi kontrolu proceduri i omoguava da se prekinuti tok kontrole nastaviinstrukcijomRET 

    −  asembler generiše razliit tip CALL instrukcije u zavisnosti od definisanja imenaprocedure

    −  ime_procedure može biti NEAR (procedura u istom segmentu) ili FAR (u drugomsegmentu)

    −  da bi se kontrola propisno vratila CALL i RET moraju biti upareni po tipu

    −  CALL i RET mogu biti u nezavisno asembliranim programima pa može doi doneuparenosti

    −  mogui su direktni pozivi (adresa procedure u instrukciji) i indirektni (adresa umemoriji/registru)

    −  procesor automatski podešava IP da ukazuje na sledeu instrukciju pre smeštanja nastek

    −  unutarsegmentni direktan poziv dekrementira SP za 2 i tada IP smešta na stek

    −  tada se na IP dodaje relativni pomeraj (do ±32K) ciljne procedure od CALL instrukcije

    −  ova forma CALL instrukcije se naziva samo-relativnom

    −  samo-relativna CALL instrukcija je pogodna za dinamiki relokatibilne rutine

    −  instrukcija CALL i procedura su u istom segmentu i relociraju se zajedno

    −  unutarsegmentni indirektan poziv se može realizovati kroz memorijsku lokaciju ili krozregistar

    −  ofset ciljne procedure se dohvata iz adresirane memorijske lokacije ili registra

    −  meusegmentni direktan poziv dekrementira SP za 2 i smešta CS na stek

    −  CS se puni segmentnom adresom iz instrukcije, pa se SP ponovo dekrementira za 2

    −  IP se smešta na stek pa se zatim puni ofset adresom iz instrukcije

    −  meusegmentni indirektan poziv se može realizovati samo kroz memoriju

    −  SP se dekrementira za 2, CS se smešta na stek

  • 8/18/2019 124393592-Uvod-u-Asembler-8086

    29/42

    −  zatim se CS puni sadržajem druge rei pokazivake memorijske lokacije koja jeadresirana

    −  SP se ponovo dekrementira za 2, pa se IP smešta na stek

    −  na kraju se IP puni sadržajem prve rei pokazivake memorijske lokacije koja jeadresirana

    −  RET opciona_pop_vrednost (Return)

    −  vraa kontrolu iz procedure instrukciji koja je sledila CALL kojim je aktiviranaprocedura

    −  ako je procedura definisana kao NEAR asembler generiše unutarsegmentni RET 

    −  ako je procedura definisana kao FAR asembler generiše meusegmentni RET 

    −  RET uzima sa vrha steka re kojom puni IP i inkrementira SP za 2

    −  ako je RET meusegmentni ponovo se uzima re sa vrha steka i njom se puni CS,a SP inkrementira još jednom za 2

    −  ako je zadata opciona_pop_vrednost, RET je dodaje na SPova mogunost se koristi da se sa steka skinu parametri procedure stavljeni pre poziva

    Uslovni skokovi−  prenose kontrolu na ciljnu adresu u zavisnosti od stanja pojedinih indikatora

    −  postoji 18 instrukcija od kojih svaka testira drugu kombinaciju indikatora

    −  ako je uslov "true" kontrola se prenosi na ciljnu adresu

    −  ako je uslov "false" izvršava se naredna instrukcija

    −  svi uslovni skokovi su SHORT

    −  cilj mora biti u istom segmentu i to unutar -128 do +127 bajtova od naredneinstrukcije

    −  uslovni skokovi su samo-relativni i tako pogodni za dinamiki relokatibilnerutine

    −  tabela prikazuje sve vrste uslovnih skokova:

    MnemonikTestirani uslov

    Skok ako je...

    JA/JNBE (CF or ZF)=0 iznad (above)/nije ispod ni jednako (not below

    nor equal)

    JAE/JNB CF=0 iznad ili jednako (above or equal) /nije ispod

    (not below) JB/JNAE CF=1 ispod (below)/nije iznad ni jednako (not above

    nor equal)

    JBE/JNA (CF or ZF)=1 ispod ili jednako (below or equal)/nije iznad

    (not above) 

    JC CF=1 prenos (carry)

    JE/JZ ZF=1  jednako (equal)/nula ( zero)

  • 8/18/2019 124393592-Uvod-u-Asembler-8086

    30/42

    JG/JNLE ((SF xor OF) or ZF)=0 vee (greater )/ nije manje ni jednako (not less

    nor equal)

    JGE/JNL (SF xor OF)=0 vee ili jednako (greater or equal)/ nije manje

    (not less) 

    JL/JNGE (SF xor OF)=1 manje (less)/ nije vee ni jednako (not greater

    nor equal)JLE-JNG ((SF xor OF) or ZF)=1 manje ili jednako (less or equal)/ nije vee (not

    greater ) 

    JNC CF=0 nije prenos (not carry)

    JNE/JNZ ZF=0 nije jednako (not equal)/nije nula (not zero)

    JNO OF=0 nema prekoraenja (not overflow)

    JNP/JPO PF=0 nema parnosti (not parity)/ neparno ( parity

    odd )

    JNS SF=0 ne znak (not sign)

    JO OF=1 prekoraenje (overflow)

    JP/JPE PF=1 parnost ( parity)/ parno ( parity even)

    JS SF=1 znak (sign)−  iznad (above) i ispod (below) se odnose na odnose neoznaenih veliina

    vee (greater ) i manje (less) se odnose na odnose oznaenih veliina

    Kontrola iteracija−  instrukcije za kontrolu iteracija se mogu koristiti za regulisanje ponavljanja petlji

    −  instrukcije koriste CX kao brojaki registar

    −  instrukcije su samo-relativne, prenose kontrolu za –128 do 127 bajtova (SHORT prenosi)

    −  LOOP kratka-labela (Loop)−  dekrementira CX za 1 i prenosi kontrolu na cilj ako CX nije 0

    −  inae, izvršava se naredna instrukcija

    −  LOOPE/LOOPZ kratka-labela (Loop while Equal/Loop whileZero)

    −  CX se dekrementira za 1 i kontrola se prenosi na cilj ako CX nije 0 i ako je ZF=1

    −  inae, izvršava se naredna instrukcija

    −  LOOPNE/LOOPNZ kratka-labela (Loop while Not Equal/NotZero)

    −  CX se dekrementira za 1 i kontrola se prenosi na cilj ako CX nije 0 i ako je ZF=0

    −  inae, izvršava se naredna instrukcija

    −  JCXZ kratka-labela (Jump if CX Zero)

    −  prenosi kontrolu na cilj ako je CX jednako 0

    −  instrukcija je korisna na poetku petlje da se preskoi petlja ako CX sadrži 0

  • 8/18/2019 124393592-Uvod-u-Asembler-8086

    31/42

    Instrukcije prekida−  Omoguavaju da se prekidne procedure aktiviraju programski

    −  Efekat softverskih prekida je slian hardverski iniciranim prekidima

    −  INT tip-prekida (Interrupt)

    −  aktivira prekidnu proceduru specificiranu pomou tip-prekida 

    −  dekrementira SP za 2, stavlja indikatore na stek

    −  postavlja TF=0 i IF=0 da zabrani single-step i maskabilne prekide

    −  indikatori se stavljaju na stek po formatu koji koristi PUSHF instrukcija

    −  SP se ponovo dekrementira za 2, pa se CS stavlja na stek

    −  adresa prekidnog vektora se rauna množei tip-prekida sa 4

    −  druga re prekidnog vektora se puni u CS

    −  SP se ponovo dekrementira za 2, pa se IP stavlja na stek

    −  prva re prekidnog vektora se smešta u IP

    −  ako je tip-prekida=3 asembler generiše kratku formu instrukcije (1Byte)

    −  ovakva instrukcija se naziva breakpoint prekidom

    −  softverski prekidi se mogu koristiti za "supervizorske pozive" (pozive operativnogsistema)

    −  za svaku vrstu servisa koji operativni sistem pruža aplikaciji se može koristiti posebantip prekida

    softverski prekidi se takoe mogu koristiti za testiranje rutina pisanih za hardverske

    prekide

    −  INTO (Interrupt on Overflow )

    −  generiše softverski prekid ako je OF=1

    −  inae, kontrola se prenosi na sledeu instrukciju bez izazivanja prekida

    −  prenosi kontrolu prekidnoj proceduri preko vektora na adresi 10H (tip prekida = 4)

    −  postavlja TF=0 i IF=0 i inae se ponaša kao INT 

    −  piše se posle aritmetike/logike operacije da aktivira prekidnu rutinu ako doe doprekoraenja

    −  IRET (Interrupt Return)

    −  vraa kontrolu na mesto gde se dogodio prekid, tako što sa steka skida IP, CS iindikatore

    −  IRET utie na sve indikatore jer ih restaurira na prethodno sauvane vrednosti

    −  koristi se za izlazak iz prekidne procedure bez obzira da li je re o SW ili HW prekidu

    Operacije sa indikatorima−  CLC (Clear Carry flag )

    −  postavlja CF=0 i ne utie na ostale indikatore

  • 8/18/2019 124393592-Uvod-u-Asembler-8086

    32/42

    −  korisna je zajedno sa RCL i RCR instrukcijama

    −  CMC (Complement Carry flag )

    −  menja CF u suprotno stanje i ne utie na ostale indikatore

    −  STC (Set Carry flag )

    −  postavlja CF=1 i ne utie na ostale indikatore

    −  CLD (Clear Direction flag )

    −  postavlja DF=0 i ne utie na ostale indikatore

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

    −  STD (Set Direction flag )

    −  postavlja DF=1 i ne utie na ostale indikatore

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

    −  CLI (Clear Interrupt-enable flag )

    −  postavlja IF=0 i ne utie na ostale indikatore−  kada je IF resetovan procesor ne raspoznaje spoljašnje prekide preko INTR ulaza

    −  maskabilni prekidi su onemogueni

    −  nemaskabilni prekid preko NMI ulaza sa poštuje, kao i softverski prekidi

    −  STI (Set Interrupt-enable flag )

    −  postavlja IF=1 i ne utie na ostale indikatore

    −  omoguava da procesor prepoznaje prekide koji se pojavljuju na INTR liniji

    prekid koji eka se nee stvarno raspoznati sve do izvršenja instrukcije koja sledi ST

    String instrukcije−  String instrukcije omoguavaju manipulisanje stringovima do 64K bajtova ili rei

    −  Postoji 5 osnovnih string instrukcija za

    −  prenos, komparaciju, traženje vrednosti i razmenu elemenata stringa sa akumulatorom

    −  Osnovnim instrukcijama može prethoditi jedno-bajtni prefiks

    −  Prefiks uzrokuje hardversko ponavljanje instrukcije

    −  Ovakvo ponavljanje instrukcije je brže od ponavljanja koje omoguava softverskapetlja

    −  Ponavljanje se može zaustaviti pomou raznih uslova, a može biti i prekinuto panastavljeno

    −  String instrukcije na slian nain (prikazan donjom tabelom) koriste registre iindikatore

    SI Indeks (ofset) izvorišnog stringa

    DI Indeks (ofset) odredišnog stringa

    CX Broja ponavljanja

  • 8/18/2019 124393592-Uvod-u-Asembler-8086

    33/42

    AL/A

    X

    Vrednost za traženje; odredište za LODS; izvorište za STOS

    DF 0=autoinkrementiranje SI, DI; 1=autodekrementiranje SI, DI

    ZF terminator za traženje i komparaciju

    −  Neke string instrukcije imaju izvorišni, neke odredišni, a neke oba operanda−  Hardver podrazumeva da se izvorišni operand nalazi u tekuem segmentu

    podataka

    −  Segmentni prefiks (1 bajt) se može koristiti da se promeni gornja pretpostavka

    −  Odredišni string mora biti u tekuem ekstra segmentu (ne može se promenitiprefiksom)

    −  Asembler proverava atribute operanada da utvrdi da li su elementi bajtovi ili rei

    −  Asembler ne koristi imena operanada za adresiranje stringova

    −  asembler koristi sadržaj SI kao ofset adresu tekueg elementa izvorišnog stringa

    −  asembler koristi sadržaj DI kao ofset adresu tekueg elementa odredišnog stringa

    −  Registri SI i DI moraju biti inicijalizovani da ukazuju na izvorišne/odredišnestringove

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

    −  String instrukcije automatski modifikuju SI i DI da omogue obradu sledeegelementa

    −  DF odreuje da li se SI i DI inkrementiraju ili dekrementiraju (0inkrement,

    1dekrement)

    −  veliina inkrementa/dekrementa je odreena tipom operanda (bajt1, re2)

    −  Ako postoji prefiks ponavljanja CX registar se dekrementira za 1 nakon svakogizvršenja

    −  CX se mora inicijalizovati na broj ponavljanja pre izvršenja string instrukcije

    −  Ako je CX=0 string instrukcija se ne izvršava i kontrola se prenosi na sledeuinstrukciju

    −  REP/REPE/REPZ/REPNE/REPNZ(Repeat/R. while Equal/R.w.Zero/R.w. Not Equal/R.w. Not

    Zero)

    −  5 mnemonika za 2 formata prefiksnog bajta koji kontroliše ponavljanje naredne string

    instrukcije

    −  razliiti mnemonici su definisani zbog razumljivosti programa

    −  prefiks ponavljanja ne utie na indikatore

    −  REP se interpretira se kao "ponavljanje dok se ne stigne do kraja stringa" (CX≠0)

    −  REP se koristi sa MOVS ( Move String) i STOS (Store String)

    −  REPE i REPZ su fiziki isti prefiksni bajt kao i REP

  • 8/18/2019 124393592-Uvod-u-Asembler-8086

    34/42

    −  REPE i REPZ se koriste sa CMPS (Compare String) i SCAS (Scan String)

    −  REPE i REPZ zahtevaju da se ZF postavi na 1 pre iniciranja sledeeg ponavljanja

    −  ZF postavljaju CMPS i SCAS

    −  REPNE i REPNZ su dva menmonika za isti prefiksni bajt

    −  REPNE i REPNZ funkcionišu isto kao REPE i REPZ samo što zahtevaju da je ZF=0−  ZF ne treba da bude inicijalizovan pre ponavljajue string instrukcije

    −  ponavljajue string sekvence su prekidive: procesor prihvata prekid pre obrade sledeegelementa

    −  obrada prekida se ne remeti ni na koji nain – izvršava se prekidna rutina u celini

    −  posle obrade prekida ponavljajua operacija se nastavlja od mesta gde je prekinuta

    −  izuzetak: izvršenje se na nastavlja valjano ako je ubaen još neki prefiks (npr.segmentni)

    −  procesor "pamti" samo jedan prefiks i to samo onaj koji je neposredno ispred stringinstrukcije

    −  nakon povratka iz prekidne rutine, obrada se nastavlja, ali samo poslednji prefiks jevažei

    −  ako je potrebno koristiti više od jednog prefiksa, mogu da se zabrane prekidi za vremeinstrukcije

    −  ipak, zabrana prekida nee spreiti nemaskabilne prekide

    −  takoe, vreme za koje sistem ne odgovara na prekide može biti predugo za dugakestringove

    −  MOVS odredišni-string, izvorišni-string (Move String )

    −  prenosi bajt ili re izvornog stringa (adresiranog kroz SI) u odredišni string (adresiran

    kroz DI)

    −  na osnovu atributa operanada asembler odreuje da li se prenosi bajt ili re 

    −  instrukcija modifikuje SI i DI da ukazuju na sledee elemente

    −  kada se koristi sa REP, MOVS obavlja blokovski prenos iz-memorije-u-memoriju

    −  MOVSB/MOVSW (Move Byte String/Move Word String )

    −  alternativni mnemonici za MOVS instrukciju, ali se koriste bez operanada

    −  CMPS odredišni-string, izvorišni-string (Compare String )

    −  oduzima odredišni bajt ili re (adresiran kroz DI) od izvorišnog bajta ili rei(adresiranog kroz SI)

    −  CMPS ne menja ni jedan operand i modifikuje SI i DI da ukazuju na sledei elementstringa

    −  CMPS modifikuje AF, CF, OF, PF, SF i ZF da reflektuju odnos odredišta premaizvorištu

    −  ako se JG ( Jump if Greater ) izvrši posle CMPS, skoie se ako je odredište vee odizvorišta

  • 8/18/2019 124393592-Uvod-u-Asembler-8086

    35/42

    −  ako ispred CMPS stoji prefiks REPE ili REPZ operacija se interpretira kao

    "kompariraj dok nije kraj stringa (CX≠0) i stringovi su jednaki (ZF=1)

    −  ako ispred CMPS stoji prefiks REPNE ili REPNZ operacija se interpretira kao

    "kompariraj dok nije kraj stringa (CX≠0) i stringovi nisu jednaki (ZF=0)

    −  CMPS se koristi za pronalaženje jednakih ili razliitih podstringova u stringu

    −  SCAS odredišni-string (Scan String )

    −  oduzima element odredišnog stringa (bajt ili re) adresiran pomou DI od sadržaja ALili AX

    −  ne menja ni odredišni string ni akumulator, modifikuje DI da ukazuje na sledeielement

    −  posatavlja AF, CF, OF, PF, SF i ZF da reflektuju odnos vrednosti iz AL/AX i elementastringa

    −  ako ispred SCAS stoji prefiks REPE ili REPZ operacija se interpretira kao

    "traži dok nije kraj stringa (CX≠0) i element stringa je jednak zadatoj vrednosti (ZF=1)

    −  ako ispred SCAS stoji prefiks REPNE ili REPNZ operacija se interpretira kao"traži dok nije kraj stringa (CX≠0) i element stringa nije jednak zadatoj vrednosti

    (ZF=0)

    −  SCAS se koristi za lociranje vrednosti u stringu

    −  LODS izvorišni-string (Load String )

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

    −  modifikuje SI da ukazuje na sledei element

    −  instrukcja se ne ponavlja ordinarno (jer bi samo poslednji element ostao u AL/AX)

    −  koristi se u programskim petljama

    −  STOS odredišni-string (Store String )

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

    −  modifikuje DI da ukazuje na sledei element

    −  kao ponavljajua operacija se koristi da inicijalizuje ceo string na istu vrednostelementa

  • 8/18/2019 124393592-Uvod-u-Asembler-8086

    36/42

     

    Direktive

    Uvod−  Program se sastoji od instrukcija i direktiva

    −  Instrukcije se prevode u naredbe mašinskog jezika

    −  Direktive su naredbe asembleru koje se ne prevode direktno u mašinske naredbe

    −  Direktive utiu na proces prevoenja i tako posredno na generisanje mašinskihnaredbi

    −  Deklaracije su vrsta direktiva koja uvodi imena

    −  One deklaracje koje alociraju i memoriju nazivaju se definicijama

    Leksiki stil asemblera Asm86−  Imena promenljivih i labela su ograniena na 31 znak i nisu ograniena na slova i

    cifre

    −  Znak "podvueno" ( _ ) se može koristiti da se povea itljivost

    −  Proizvoljan broj praznina se može umetati izmeu identifikatora

    −  Instrukcija se može preneti u naredni red tako što se naredni red zapone znakom& 

    Format instrukcija−  Instrukcije imaju sledei format:

    [labela:] [prefiks] mnemonik [operand(i)] [; komentar]

    −  polje labele imenuje memorijsku lokaciju koja sadrži mašinsku instrukciju

    (što omoguava da se lokacija adresira simboliki iz instrukcije JMP)

    −  prefiks uzrokuje generisanje jednog prefiksnog bajta (segmentni, LOCK, REP) ispredinstrukcije

    −  mnemonik identifikuje tip instrukcije (MOV, ADD, ...)

    −  operandi (0, 1 ili 2) se pišu razdvojeni zarezima

    −  iza take-zareza se piše komentar

    Format direktiva−  Direktive imaju sledei format:

    [ime] mnemonik [operand(i)] [; komentar]

    −  neke direktive zahtevaju ime dok ga druge zabranjuju

    −  asembler prepoznaje direktivu na osnovu mnemonika

  • 8/18/2019 124393592-Uvod-u-Asembler-8086

    37/42

    −  operandi koje zahteva direktiva se pišu posle mnemonika i razdvajaju zarezima

    −  kao i kod instrukcija, iza take-zareza se piše komentar

    −  Primeri direktiva su: PROC (definicija procedure), DB, DW, DD (definicijepodataka),...

    Konstante−  Mogu se definisati binarne, decimalne, oktalne i heksadecimalne numerike

    vrednosti

    −  Asembler može obavljati osnovne aritmetike operacije sa numerikimkonstantama

    −  Svi brojevi moraju biti celi i mora biti mogue predstaviti ih kao 16-bitne sa bitomznaka

    −  Negativni brojevi se asembliraju u standardnoj notaciji drugog komplementa

    −  Znakovne konstante se pišu izmeu apostrofa

    −  Mogu biti do 255 karaktera dugake kad se koriste za inicijalizaciju memorije

    −  Kada se koriste za neposredne operande mogu biti 1 ili 2 bajta dugake

    −  Primeri konstanti:

    MOV STRING[SI],'A' ; karakter

    MOV STRING[SI],41H ; ekvivalent u heksadecimalnom

    sistemu

    ADD AX,0C4H ; hex konstanta mora poceti cifrom

    OCTAL_8 EQU 10O ; oktalna konstanta 8

    OCTAL_9 EQU 11Q ; alternativna oktalna konstanta

    ALL_ONES EQU 11111111B ; binarna konstantaMINUS_5 EQU -5 ; decimalna konstanta –5

    MINUS_6 EQU -6D ; alternativna decimalna konstanta

    -6

    Definicije podataka−  Direktive za deklarisanje i definisanje podataka su:

    −  definisanje bajta - DB (define byte)

    −  definisanje rei - DW (define word ),

    −  definisanje dvostruke rei - DD (define doubleword )

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

    −  Sintaksa operanda:

    ::= | ,

    ::= | () | DUP  | ?

    < konstanta >::= | |

  • 8/18/2019 124393592-Uvod-u-Asembler-8086

    38/42

    −  Primeri definicija podataka:

    A_SEG SEGMENT

    A_VAR DB ? ; neinicijalizovani bajt

    B_VAR DW ?,1 ; dve reci, prva neinicijalizovana,

    druga=1

    C_VAR DD 2 DUP 1 ; dve dvostruke reci

    inicijalizovane na 1D_VAR DB 3 DUP (1,2) ; 1,2,1,2,1,2

    E_VAR DB 3 DUP (1, 2 DUP 2); 1,2,2,1,2,2,1,2,2

    A_SEG ENDS

    B_SEG SEGMENT AT 55H ; specificirana bazna adresa

    segmenta

    F_VAR DB 'ABC' ; 3 bajta sadrze: 41H, 42H, 43H

    G_VAR DW 'AB' ; 1 rec sadrzi: 42H, 41H

    H_VAR DD B_SEG ; dvostruka rec, sadrzi: 00H 00H

    55H 00H

    I_VAR DB 100 DUP 0 ; 100 bajtova inicijalizovanih na 0

    B_SEG ENDS

    Atributi promenljive−  Asembler vodi rauna o 3 atributa svake promenljive:

    −  segment – identifikuje segment koji sadrži promenljivu

    −  ofset – distanca u bajtovima od poetka segmenta koji sadrži promenljivu

    −  tip – identifikuje alokacionu jedinicu promenljive: 1 = bajt, 2 = re, 4 = dvostruka re 

    −  Na osnovu atributa promenljive u instrukciji asembler odreuje formu generisaneinstrukcije

    −  Ako su atributi promenljive u konfliktu sa korišenjem u instrukciji, generiše segreška

    −  Primer: pokušaj da se promenljiva definisana kao DW sabere sa bajt-registrom

    Konverzija tipa−  U nekim sluajevima asembleru se mora eksplicitno rei tip

    −  Primer: MOVE [BX],5 ; proizvodi grešku jer se ne zna tip lokacije na koju BXpokazuje

    −  Operatori koji eksplicitno definišu tip su: BYTE PTR, WORD PTR i DWORDPTR 

    −  Primer: MOVE WORD PTR [BX],5 ; prenosi se re 5 u lokaciju na kojupokazuje BX

    Operatori−  ASM-86 ima tri ugraena operatora vezana za atribute promenljive

    −  TYPE – vraa 1 za bajt, 2 za re, 4 za dvostruka re 

  • 8/18/2019 124393592-Uvod-u-Asembler-8086

    39/42

    −  LENGTH – odreuje broj alociranih jedinica (bajtova, rei ili dvostrukih rei) za vektor

    −  SIZE – odreuje broj bajtova koje zauzima skalar ili vektor (SIZE=LENGTH*TYPE)

    −  Primer (prema gornjem primeru):

    ATRIBUTI OPERATORI PROMENLJIV

    A SEGMENT  OFFSET  TYPE LENGTH SIZEA_VAR A_SEG  0 1 1 1

    B_VAR A_SEG  1 2 2 4

    C_VAR A_SEG  5 4 2 8

    D_VAR A_SEG  13 1 6 6

    E_VAR A_SEG  19 1 9 9

    F_VAR B_SEG(0055)

    0 1 3 3

    G_VAR B_SEG

    (0055) 

    3 2 1 2

    H_VAR B_SEG

    (0055) 5 4 1 4

    I_VAR B_SEG(0055) 

    9 1 100 100

    −  Atributi i operatori omoguavaju da se pišu generalizovane sekvence instrukcijakoje ne moraju da se menjaju (samo se ponovo prevedu) ako se menjaju atributi

    podataka

    Primer−  Sumiranje elemenata tabele

    ; sumiranje elemenata tabele u AX registru

    TABELA DW 50 DUP(?) ; tabela ima 50 elemenata

    SUB AX,AX ; AX=0

    MOV CX, LENGTH TABELA ; CX=50 , CX - brojac petlje

    MOV SI, SIZE TABELA ; SI=100 , SI – pokazuje na kraj

    tabele

    DODAJ: SUB SI, TYPE TABELA ; pomeranje za jedan element

    ADD AX, TABELA[SI] ; dodavanje elementa na sumu

    LOOP DODAJ ; dok CX>0

    ; AX sadrzi sumu

    Kontrola segmenata−  Program na asembleru ASM-86 se organizuje u niz imenovanih "logikih"

    segmenata

    −  Mapiranje logikih u fizike (memorijske) segmente se obino radi tek prilociranju programa

  • 8/18/2019 124393592-Uvod-u-Asembler-8086

    40/42

    −  Segment poinje direktivom SEGMENT, a završava direktivom ENDS 

    −  Svi podaci i/ili instrukcije izmeu SEGMENT i ENDS pripadaju segmentu

    −  Nema ogranienja – mogu se podaci, stek i instrukcije smestiti u isti logikisegment

    −  Prve naredbe u programu obino:−  najpre uspostavljaju korespondenciju izmeu imena segmenata i segmentnih registara,

    −  a zatim pune segmentne registre baznim adresama odgovarajuih segmenata

    Direktiva  ASSUME 

    −  Direktiva ASSUME govori koje adrese e biti u segmentnim registrima u vremeizvršenja

    −  Sintaksa ASSUME: ASSUME seg_reg:ime_seg{,seg_reg:ime_seg}... 

    −  Asembler proverava svaki memorijski operand instrukcije odreujui−  u kom segmentu je promenljiva

    −  koji segmentni registar sadrži adresu tog segmenta

    −  Ako je operand u segmentu na koji ukazuje "oekivani" registar– instrukcija segeneriše

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

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

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

    ukazuje SS

    −  program može koristiti BP da adresira promenljivu u tekuem segmentu podataka

    −  direktiva ASSUME omoguava asembleru da detektuje situaciju i generiše segmentniprefiks

    −  Programer može i eksplicitno da kodira segmentni prefiks da ne bi zavisio odasemblera

    −  primer: MOV ES:DATA_STRING[SI],AL 

    −  prednost je bolja samodokumentovanost koda

    mana je što asembler ne proverava da li je operand faktiki adresibilan kroz zadati

    registar

    Direktive SEGMENT, ENDS i END 

    −  Sintaksa direktive SEGMENT: [ime_segmenta] SEGMENT [lista_atributa]

    −  Lista atributa služi da se definiše kombinovanje logikih u fiziki segment

  • 8/18/2019 124393592-Uvod-u-Asembler-8086

    41/42

    −  Omoguava da se logiki segmenti iz razliitih modula kombinuju u isti fizikisegment

    −  Sintaksa liste atributa: [tip_poravnavanja] [tip_kombinovanja] ['klasa']

    −  Tip poravnavanja odreuje granicu logikog segmenta pri kombinovanju:

    −  PARA – poravnavanje po paragrafima (adresa deljiva sa 16) – podrazumevani tip

    −  WORD – poravnavanje po reima (logiki segmenti se mapiraju na parne adrese)

    −  BYTE – poravnavanje po bajtovima (segment poinje od proizvoljne adrese) – nepreporuuje se

    −  AT paragraf – logiki segment se mapira na fiziku adresu definisanu paragrafom

    −  Tip kombinovanja odreuje kako e se segment kombinovati sa segmentima istogimena

    −  ako se ne navede – nema kombinovanja

    −  PUBLIC – nadovezivanje logikih segmenata – pogodno za logike code i data 

    segmente

    −  STACK – dodavanje logikih segmenata – pogodno za stack  segmente

    − dužina kombinovanog segmenta jednaka zbiru dužina pojedinog segmenata

    − ofset vrha svakog steka je na vrhu kombinovanog steka

    −  Klasa omoguava da segmenti iste klase budu smešteni jedan iza drugog umemoriji

    −  npr: segment koda i segment konstanti u klasi 'ROM' mogu biti smešteni jedan izadrugog

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

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

    −  Direktivom END se završava kompilaciona celina; sintaksa: END [labela_poetka]

    −  Samo u glavnom programu se u direktivi END navodi labela poetne instrukcijeprograma

    Definisanje procedura−  Sintaksa: ime_procedure PROC [NEAR | FAR]

    telo procedure

    ime_procedure ENDP 

    −  Procedure koje se pozivaju samo u okviru istog segmenta su NEAR 

    −  Procedure koje se pozivaju iz drugog segmenta su FAR 

    −  Prenos parametara se može vršiti na jedan od sledeih naina:

    −  preko registara

    −  preko promenljivih u segmentu podataka

    −  preko steka

  • 8/18/2019 124393592-Uvod-u-Asembler-8086

    42/42

    Smeštanje parametara na odreeno mesto i dohvatanje rezultata su u nadležnosti

    programera.

    Pristup modulima – direktive PUBLIC i EXTRN 

    −  Direktiva PUBLIC uvodi listu simbola kojima je dozvoljen pristup iz drugih

    modula

    −  Sintaksa: PUBLIC simbol [, simbol]...

    −  Direktiva EXTRN uvodi listu simbola (sa tipovima) iz drugih modula kojima sepristupa

    −  Sintaksa: EXTRN simbol:tip [, simbol:tip]...

    −  Simbol može biti promenljiva, labela ili literalna konstanta

    −  Tip može biti:

    −  za promenljive: BYTE, WORD, DWORD 

    −  za labele: NEAR, FAR 

    −  za literalne konstante: ABS 

    −  Primer:

    u modulu A: P DB 0

    PUBLIC P

    u modulu B: EXTRN P:BYTE

    −  Ako eksterni simbol pripada nekom logikom segmentu u izvornom modulu,

    tada se EXTRN direktiva mora staviti u odgovarajui logiki segment u modulu gde

    se koristi

    Literalne konstante−  Literalne konstante se definišu direktivom sledee sintakse: simbol EQU izraz

    −  Primer:

    PROMENLJIVA DW 0

    DONJI_BAJT EQU BYTE PTR PROMENLJIVA

    GORNJI_BAJT EQU BYTE PTR PROMENLJIVA+1

    ...

    MOV AH, GORNJI_BAJT

    Eksplicitno definsanje ofseta−  Za eksplicitno definisanje ofseta se koristi direktiva ORG 

    −  Sintaksa: ORG ofset

    −  Naredni podatak ili instrukcija e imati navedeni ofset

    −  Primer:

    ORG 10

    PROMENLJIVA DB 0 ; PROMENLJIVA ima ofset 10