19.04.2013 Views

Programiranje u asembleru

Programiranje u asembleru

Programiranje u asembleru

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

FAKULTET STROJARSTVA I RAČUNARSTVA<br />

STUDIJ RAČUNARSTVA<br />

Arhitektura digitalnog računala<br />

V j e ž b e<br />

Goran Kraljević<br />

Akademska godina 2008/2009


K a z a l o :<br />

Arhitektura digitalnog računala<br />

Osnovna arhitektura 8086 procesora ....................................................4<br />

Izvršna jedinica i njezini registri .......................................................................... 5<br />

Registri za podatke ........................................................................................ 5<br />

Pokazivački i indeksni registri .......................................................................... 5<br />

Registar zastavica .......................................................................................... 6<br />

Sučelje prema sabirnici ...................................................................................... 7<br />

Segmentni registri .......................................................................................... 7<br />

Stog ................................................................................................................. 8<br />

Načini upotrebe memorije i adresiranja ................................................................ 9<br />

Modovi adresiranja ........................................................................................... 11<br />

Direktno adresiranje ...................................................................................... 11<br />

Indirektno adresiranje ................................................................................... 12<br />

<strong>Programiranje</strong> u <strong>asembleru</strong> ................................................................ 13<br />

Programerski model .......................................................................................... 13<br />

Predložak za pisanje asemblerskog programa ...................................................... 13<br />

PrevoĎenje i povezivanje programa .................................................................... 14<br />

int 21h ............................................................................................................. 14<br />

Tipovi varijabli .................................................................................................. 15<br />

Cijeli brojevi ................................................................................................. 15<br />

Stringovi ...................................................................................................... 15<br />

Pokazivači .................................................................................................... 16<br />

Polja ............................................................................................................ 16<br />

Konstante ..................................................................................................... 17<br />

@DATA ........................................................................................................ 17<br />

Skokovi ............................................................................................................ 18<br />

Bezuvjetni skokovi ........................................................................................ 18<br />

Uvjetni skokovi ............................................................................................. 18<br />

Procedure ........................................................................................................ 20<br />

Makroi ............................................................................................................. 21<br />

2


Arhitektura digitalnog računala<br />

N a r e d b e ......................................................................................... 23<br />

Naredbe za manipuliranje podacima ................................................................... 24<br />

Registar registar ili registar memorija .................................................... 24<br />

Postavljanje registara za pristup adresama u memoriji ..................................... 24<br />

Naredbe za rad sa stogom ............................................................................. 25<br />

Upravljanje blokovima podataka ..................................................................... 26<br />

Uvjetne petlje ................................................................................................... 27<br />

Aritmetičke operacije ........................................................................................ 28<br />

Zbrajanje ..................................................................................................... 28<br />

Oduzimanje .................................................................................................. 28<br />

Množenje ..................................................................................................... 29<br />

Dijeljenje ...................................................................................................... 29<br />

Logičke operacije .............................................................................................. 30<br />

Operacije za pomak i rotiranje bitova ................................................................. 31<br />

Pomak bitova................................................................................................ 31<br />

Rotiranje bitova ............................................................................................ 31<br />

Usporedba i testiranje stringova ......................................................................... 32<br />

P r i m j e r i ......................................................................................... 33<br />

Primjeri asemblerskog programiranja - zadaci s rješenjima ................................... 34<br />

Primjeri prevoĎenja i povezivanja programa ........................................................ 44<br />

3


Osnovna arhitektura 8086 procesora<br />

8086 procesor ima dva glavna dijela:<br />

Arhitektura digitalnog računala<br />

Sučelje prema sabirnici – dohvaća podatke i naredbe iz memorije,<br />

Izvršna jedinica – dekodira i izvršava naredbe.<br />

Ova dva dijela rade istovremeno, tj. ciklus izvršavanja se poklapa s ciklusom<br />

dohvata (paralelizam) što ubrzava rad mikroprocesora.<br />

Izvršna jedinica (Execution Unit – skraćeno EU)<br />

obavlja sve poslove potrebne da bi se izvršavale pojedine instrukcije<br />

sastoji se od aritmetičko-logičke jedinice, registra zastavica i još osam<br />

registara za različite podatke, te odgovarajuće upravljačke logike.<br />

Svi navedeni elementi su međusobno povezani jednom 16-bitnom sabirnicom<br />

za izmjenu podataka.<br />

Jedinica za sučelje prema sabirnici (Bus Interface Unit – skraćeno BIU)<br />

obavlja sve potrebne radnje za komuniciranje mikroprocesora s vanjskim<br />

svijetom<br />

dovodi instrukcije iz memorije, dohvaća operande iz memorije, upisuje u<br />

memoriju, prihvaća i predaje podatke vanjskim jedinicama i slično.<br />

Komuniciranje mikroprocesora sa vanjskim svijetom se obavlja preko 20-bitne<br />

adresne sabirnice i 16-bitne sabirnice za podatke.<br />

4


Izvršna jedinica i njezini registri<br />

Registri za podatke<br />

Arhitektura digitalnog računala<br />

Registri za podatke (registri opće namjene) A, B, C i D mogu se upotrebljavati<br />

kao registri za rad s cjelovitim 16-bitnim riječima ili kao dva pojedinačna bajta.<br />

Npr. ako se registar A upotrebljava kao cjelina, označava se sa AX, a ako se on<br />

sastoji od dva razdvojena bajta, označava se sa AH i AL, tj. bajt veće težine<br />

(High) i bajt manje težine (Low). Isto vrijedi i za registre B, C i D.<br />

AX AH AL Accumulator<br />

BX BH BL Base<br />

CX CH CL Count<br />

DX DH DL Data<br />

Ovo su registri opće namjene, služe kod izvršavanja aritmetičko–logičkih<br />

operacija, ali neki od njih služe i za specifične operacije.<br />

AX [Accumulator] – koristi se za aritmetičke operacije (množenje,<br />

dijeljenje) i kod ulazno-izlaznih operacija.<br />

BX [Base] – često se koristi za adresiranje podataka u memoriji.<br />

CX [Count] – služi kao brojač u petljama.<br />

DX [Data] – služi za pristup podacima, sadržava adresu ulazno-izlaznih<br />

vrata (porta).<br />

Pokazivački i indeksni registri<br />

Dva pokazivačka registra SP i BP se koriste za rad sa stogom, dok se dva<br />

indeksna registra SI i DI koriste za rad sa stringovima.<br />

15 0<br />

SP Stack pointer<br />

BP Base pointer<br />

SI Source index<br />

DI Destination index<br />

Podatkovni<br />

registri<br />

SP [Stack pointer] – sadrži adresu vrha stoga SS:SP<br />

Pokazivački<br />

registri<br />

Indeksni<br />

registri<br />

BP [Base pointer] – koristi se za pristup podacima unutar stoga SS:BP<br />

SI [Source index] – koristi se za rad sa stringovima s tim da sadrži<br />

adresu izvorišta podataka DS:SI ili ES:SI<br />

DI [Destination index] – koristi se za rad sa stringovima s tim da sadrži<br />

adresu odredišta podataka DS:DI ili ES:DI<br />

5


Registar zastavica<br />

Arhitektura digitalnog računala<br />

Registar zastavica u mikroprocesoru 8086 je također 16-bitni registar, no<br />

stvarno se upotrebljava samo 9 bitova:<br />

6 kao zastavice statusa (status flags)<br />

3 kao upravljačke zastavice<br />

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

O D I T S Z A P C<br />

Statusne zastavice: Ove zastavice su direktno povezane sa ALU i prate<br />

rezultate pojedinih operacija.<br />

Budući da se statusne zastavice postavljaju u odgovarajuće stanje kao rezultat<br />

izvedbe pojedinih programerskih naredaba, njihovo se stanje može testirati i na<br />

temelju stanja zastavice može se usmjeravati daljnje izvođenje programa.<br />

CF [carry flag] – postavlja se u stanje 1 ako se dogodi prijenos iz<br />

najznačajnijeg bita pri izvedbi aritmetičkih operacija. Isto se događa pri<br />

«posuđivanju». Inače je ovaj bistabil u stanju 0.<br />

PF [parity flag] – postavlja se u stanje 1, ako rezultat dobiven izvođenjem<br />

instrukcije ima parni paritet, tj. ako je broj jedinica u rezultatu paran broj. Ako je<br />

broj jedinica neparan, PF se postavlja u 0.<br />

AF [auxiliary carry] – postavlja se u stanje 1 ako se dogodi prijenos iz nibla<br />

(nibl=4 bita) manje težine u nibl veće težine ili posuđivanje iz nibla veće težine<br />

niblu manje težine u bajtu manje težine 16-bitne riječi (važno kod BCD<br />

aritmetike).<br />

ZF [zero flag] – postavlja se u stanje 1 kada je rezultat izvođenja instrukcije<br />

jednak 0. Inače je u stanju 0.<br />

SF [sign flag] – kopija je bita najveće težine. Prema tome on je u stanju 1 ako<br />

je rezultat negativan, a u stanju 0, ako je pozitivan.<br />

OF [overflow flag] – postavlja se u 1 ako je rezultat (tretiran kao broj s<br />

predznakom – aritmetika dvojnog komplementa) izvan dopuštenoga područja.<br />

Upravljačke zastavice:<br />

Registar<br />

zastavica<br />

IF [interrupt flag] – ako je IF u stanju 1 znači da će zahtjevi za prekid biti<br />

prihvaćeni (STI -> Set I; CLI -> Clear I)<br />

TF [trap flag] – ako je TF u stanju 1 omogućeno je izvođenje programa korak<br />

po korak tj. izvođenje jedne po jedne naredbe. (koristi se kod debugger-a).<br />

DF [direction flag] – određuje smjer u kojem će se pristupati uzastopnim byteovima<br />

stringa.<br />

0 – podrazumijeva da je sljedeći byte na većoj adresi<br />

1 – podrazumijeva da je sljedeći byte na nižoj adresi<br />

6


Sučelje prema sabirnici<br />

Segmentni registri<br />

Arhitektura digitalnog računala<br />

Adresna sabirnica mikroprocesora 8086 ima 20 bita. To omogućava adresiranje<br />

memorije od 1 Megabajta.<br />

Od cijelog memorijskog područja (1M) u svakom trenutku su aktivna 4<br />

segmenta od po 64K.<br />

Memorija je podijeljena na segmente, a početna adresa svakog segmenta<br />

određena je odgovarajućim segmentnim registrom.<br />

Početnu adresu segmenta za instrukcije, podatke, stog i posebni segment<br />

određuju segmentni registri CS, DS, SS i ES, a adresa unutar segmenta dobije<br />

se tako da se početnoj adresi segmenta doda pomak, tj. sadržaj odgovarajućeg<br />

registra.<br />

CS Code segment<br />

DS Data segment<br />

SS Stack segment<br />

ES Extra segment<br />

IP Instruction pointer<br />

Segmentni<br />

registri<br />

CS [Code segment] – adresa segmenta u kojem se nalazi kod<br />

programa.<br />

DS [Data segment] – adresa segmenta u kojem se nalaze podaci.<br />

SS [Stack segment] – adresa segmenta u kojem se nalazi stog.<br />

ES [Extra segment] – adresa dodatnog segmenta koji se koristi za<br />

pohranu podataka.<br />

IP [Instruction pointer] – kombiniranjem sadržaja IP registra i registra<br />

CS dobije se adresa instrukcije (sljedeće naredbe) – CS:IP.<br />

7


Stog<br />

Arhitektura digitalnog računala<br />

Stog je dio memorije koji se koristi za privremenu pohranu podataka.<br />

Postoje 2 instrukcije koje rade sa stogom:<br />

PUSH xxx – postavlja 16-bitnu vrijednost (1 riječ) iz xxx na stog.<br />

POP xxx – uzima 16-bitnu vrijednost (1 riječ) sa stoga i sprema je u xxx<br />

(16-bitna varijabla, registar ili segmentni registar).<br />

Stog koristi LIFO (Last In First Out) princip.<br />

Primjer:<br />

Ako punimo stog (PUSH) sljedećim vrijednostima: 1, 2, 3, 4, 5 <br />

prva vrijednost koju ćemo naredbom POP preuzeti sa stoga je 5, zatim 4,<br />

3, 2, 1.<br />

Za pristup stogu se koriste 2 registra:<br />

SS:SP (SP – offset koji pokazuje na vrh stoga)<br />

SS:BP (BP – pristupa podacima unutar stoga)<br />

8


Arhitektura digitalnog računala<br />

Načini upotrebe memorije i adresiranja<br />

Organizaciju memorije koja se može upotrebljavati s mikroprocesorom 8086<br />

prikazuje sljedeća slika ...<br />

Adresno se područje sastoji od 1 Megabajta s adresama pisanim<br />

heksadecimalno od 00000 do FFFFF.<br />

Dužina podatka u svakoj lokaciji je 8-bita. Koristiti se može ili takav 1-bajtni<br />

podatak ili dva uzastopna bajta koji predstavljaju jednu 16-bitnu riječ.<br />

Osnovne jedinice za rad s memorijom su byte i word.<br />

Nibble – 4 bita<br />

Byte – 8 bita<br />

Word – 16 bita<br />

9


Arhitektura digitalnog računala<br />

Adresa svakog byte-a u memoriji je određena sa 20 bita, ali kako su svi registri<br />

16-bitni cijela adresa se ne može pohraniti u jedan registar, pa se dijeli na<br />

dva dijela:<br />

Adresa segmenta (SEGMENT),<br />

Adresa byte-a u segmentu (OFFSET).<br />

U heksadecimalnoj notaciji ta adresa izgleda ovako:<br />

Primjer:<br />

SEGMENT:OFFSET<br />

0040:0002 je adresa 3 byte-a u segmentu 40h.<br />

Procesor izvodi jednostavnu kalkulaciju da odredi 20-bitnu fizičku adresu u<br />

memoriji kada su poznati SEGMENT i OFFSET.<br />

Fiz.adresa = (segment


Modovi adresiranja<br />

Arhitektura digitalnog računala<br />

Procesor 8086 ne dozvoljava operacije između dvije memorijske lokacije<br />

U primjerima s adresiranjem se koristi naredba MOV<br />

MOV odredište, izvor<br />

Napomena: MOV naredba se ne može koristiti da se postavi vrijednost CS ili IP<br />

registra.<br />

Direktno adresiranje<br />

Postoji više načina direktnog adresiranja:<br />

preko imena varijable<br />

MOV ax, var1<br />

MOV var2, bl<br />

preko vrijednosti<br />

MOV ax, 2Ch<br />

preko adrese varijable<br />

preko registara<br />

MOV ax, [2Ch] - u ovom slučaju se podrazumijeva da pristupamo<br />

adresi u DS.<br />

MOV ax, DS:[2Ch]<br />

MOV ax, ES:[2Ch]<br />

MOV ax, di<br />

MOV cl, dh<br />

11


Indirektno adresiranje<br />

Arhitektura digitalnog računala<br />

Ovo adresiranje se naziva indirektno jer se vrijednosti pristupa preko njene<br />

adrese.<br />

registarski mod – adresa sa koje se podatak prebacuje nalazi se u<br />

"nekom" registru.<br />

MOV ah, [bx] -> prebacuje se byte s adrese DS:[BX] u ah<br />

MOV ah, [si]<br />

MOV ah, [di]<br />

MOV ah, [bp] -> vezan je uz SS<br />

indeksni mod – koristi se za pristupanje elementima polja.<br />

[SI|DI + konst.]<br />

MOV si, 0<br />

MOV al, polje[si]<br />

bazni mod – koristi se kod pristupanja elementima strukture podataka.<br />

[BP|BX + konst.]<br />

bazno-indeksni mod – koristi se ukoliko nije poznato ime niza brojeva<br />

već samo adresa prvog elementa.<br />

MOV al, [bx][si] -> DS:[bx + si]<br />

MOV ax, polje<br />

MOV bx, OFFSET polje<br />

bazno-indeksni mod s pomakom – koristi se za pristup elementima<br />

polja koji su članovi strukture.<br />

[BP|BX + SI|DI + konst.]<br />

12


<strong>Programiranje</strong> u <strong>asembleru</strong><br />

Programerski model<br />

Arhitektura digitalnog računala<br />

Programerski model obuhvaća memoriju i registre.<br />

Memorija se dijeli u blokove od 64 K u kojima se nalaze kod, program,<br />

podaci i stog.<br />

Registri se dijele na:<br />

podatkovne (AX, BX, CX, DX)<br />

segmentne (CS, DS, ES, SS)<br />

indeksne (SI, DI)<br />

pokazivačke (SP, BP, IP)<br />

registar zastavica<br />

Predložak za pisanje asemblerskog programa<br />

.MODEL mem_model<br />

.DATA<br />

---<br />

.STACK<br />

.CODE<br />

start:<br />

---<br />

---<br />

END start<br />

.MODEL ova direktiva definira memorijski model:<br />

small podaci 64k kod 64k<br />

medium podaci 64k kod > 64k<br />

compact podaci > 64k (ali polje 64k) kod 64k<br />

large podaci > 64k (ali polje 64k) kod > 64k<br />

huge podaci > 64k (polje > 64k) kod 64k<br />

.STACK rezervira prostor za stog (exe programi trebaju stog).<br />

Treba biti potencija broja 2.<br />

.STACK [size]<br />

size - definira veličinu stoga u byte-ovima. Ako nije navedeno ništa veličina<br />

stoga je 1K.<br />

.CODE označava početak koda programa.<br />

13


Prevođenje i povezivanje programa<br />

Arhitektura digitalnog računala<br />

Prvi korak je prevođenje programa u strojni kod (kompajliranje).<br />

masm ime_programa.asm<br />

Kao rezultat prevođenja se dobiju tri datoteke:<br />

*.obj - datoteka s prevedenim programom,<br />

*.lst - tekstualna datoteka u kojoj se nalazi i strojni kod i linije programa,<br />

*.crf - tekstualna datoteka s strojnim kodom.<br />

Nakon uspješnog prevođenja ide povezivanje (linkanje) i stvara se izvršni<br />

program.<br />

link ime_programa.obj<br />

Kao rezultat prevođenja se dobiju dvije datoteke:<br />

*.exe - izvršna datoteka,<br />

*.map - datoteka koja definira početni offset, kraj i duljinu (u byte-ovima)<br />

svakog segmenta u programu<br />

int 21h<br />

int 21h je DOS prekid (interrupt) koji sadrži 100-tinjak osnovnih funkcija<br />

potrebnih za normalan rad korisničkih aplikacija.<br />

Između ostalog on omogućava otvaranje, zatvaranje, pisanje i čitanje datoteka;<br />

čitanje znakova s tastature, ispis znakova na ekran, uzimanje i postavljanje<br />

sistemskog vremena,…<br />

Svaka od tih funkcija ima svoj broj i kada se pozove int 21h, on čita broj funkcije<br />

iz registra ah. Što znači da se prije poziva prekida broj željene funkcije mora<br />

staviti u registar ah.<br />

Ah Al Funkcija<br />

4c 00h kraj programa<br />

01h skuplja znak s tastature i sprema ga u AL<br />

02h <br />

uzima znak koji se nalazi u DL i ispisuje ga<br />

09h <br />

na ekran<br />

uzima string s početnom adresom u DX i<br />

ispisuje ga na ekran<br />

14


Tipovi varijabli<br />

.DATA<br />

Sintaksa:<br />

Cijeli brojevi<br />

Primjer:<br />

Stringovi<br />

Arhitektura digitalnog računala<br />

Označava početak segmenta u kojem se nalaze podaci.<br />

naziv_var direktiva inicializator<br />

Direktiva Veličina____________<br />

DB 1B (define byte)<br />

DW 2B (define word)<br />

DD 4B (define double word)<br />

DF 6B (define farword)<br />

DQ 8B (define qadword)<br />

DT 10B<br />

DB (Define Byte) opseg vrijednosti od -128 do 127 ili 0 – 255<br />

DW (Define Word) bez predznaka 0 – 65 535 ili<br />

sa predznakom od -32768 do 32767<br />

DD (Define Double Word) bez predznaka od 0 do 4 294 967 295 ili<br />

sa predznakom od - 2 147 483 648 do 2 147 483 647<br />

...<br />

broj1 DB 16 broj1 = 16<br />

broj2 DB ? broj2 nije inicijaliziran<br />

Uglavnom se koristi DB direktiva.<br />

Primjer:<br />

pod1 DB "abc$" pod1 = 'abc$' (string)<br />

pod2 DB 'a', 'b', 'c', '$' pod2 = 'abc$' (znakovi)<br />

pod3 DB 97, 98, 99, 36 pod3 = 'abc$' (ascii vrijednosti)<br />

15


Pokazivači<br />

Uglavnom se koristi:<br />

Primjer:<br />

Polja<br />

Sintaksa:<br />

Primjer:<br />

Arhitektura digitalnog računala<br />

DW - za adresiranje unutar istog segmenta<br />

DD - za adresiranje u neki drugi segment<br />

pod DB "Tekst$" string<br />

pok1 DW pod pokazivač<br />

pok2 DD pod pokazivač<br />

ime tip broj DUP (vrijednost)<br />

broj broj elemenata polja<br />

vrijednost vrijednost(i) koju će DUP duplicirati<br />

polje1 DB 5 DUP (1) ~ polje1 DB 1,1,1,1,1<br />

polje1 DB 5 DUP (1,2) ~ polje1 DB 1,2,1,2,1,2,1,2,1,2<br />

polje1 DB 5 DUP (?) rezervira se prostor u memoriji za 5 DB ali<br />

nisu inicijalizirani na početnu vrijednost.<br />

a DB 48h, 65h, 6Ch, 6Ch, 6Fh, 00h<br />

b DB 'Hello', 0<br />

a i b su dva identična polja. Kada kompajler vidi string unutar jednostrukih<br />

navodnika prevodi ga kao set byte-ova ...<br />

Elementima polja se može pristupiti na sljedeći način:<br />

polje1[0]<br />

polje1[1]<br />

...<br />

Također se može iskoristiti vrijednost pojedinih registara: BX, SI, DI, BP<br />

polje1[SI]<br />

...<br />

16


Konstante<br />

Sintaksa:<br />

Primjer:<br />

Arhitektura digitalnog računala<br />

EQU koristi se za definiranje konstanti<br />

konst EQU izraz<br />

Ukoliko se radi o brojčanim konstantama:<br />

kolona EQU 80 kolona = 80<br />

red EQU 40 red = 40<br />

Ukoliko se radi o stringu:<br />

@DATA<br />

kr1 EQU kolona-redak kr1 = 40<br />

kr2 EQU kr2 = "kolona-redak"<br />

@DATA čita adresu na kojoj se nalazi početak podatkovnog segmenta koji je<br />

inicijaliziran naredbom .DATA.<br />

Ta adresa se prvo kopira u AX a tek onda u DS jer 8086 procesor ne dozvoljava<br />

direktno kopiranje konstante u segmentni registar.<br />

mov ax, @DATA<br />

mov ds, ax<br />

17


Skokovi<br />

Bezuvjetni skokovi<br />

Arhitektura digitalnog računala<br />

JMP - bezuvjetni skok na navedenu memorijsku adresu<br />

DIREKTNI<br />

Sintaksa:<br />

INDIREKTNI<br />

Sintaksa:<br />

JMP labela<br />

JMP SHORT labela<br />

JMP FAR PTR labela<br />

JMP reg_ili_mem<br />

Da bi deklarirali labelu potrebno je unijeti naziv labele i dodati “:” na kraj. Npr.<br />

labela1:<br />

labela2:<br />

a:<br />

Naziv labele ne smije početi brojem.<br />

Labela se može deklarirati u posebnom retku programa ili prije bilo koje<br />

instrukcije.<br />

x1:<br />

mov ax, 1<br />

x2: mov ax, 2<br />

Uvjetni skokovi<br />

Uvjetni skokovi slijede iza naredbi CMP ili TEST.<br />

Sintaksa:<br />

CMP vrijednost1, vrijednost2<br />

NAREDBA labela<br />

uspoređuje ove dvije vrijednosti (vrijednost1 i vrijednost2) i obje ostaju<br />

nepromijenjene.<br />

TEST vrijednost1, vrijednost2<br />

NAREDBA labela<br />

radi logičko I s operandima.<br />

18


Arhitektura digitalnog računala<br />

Općenito, kada je potrebno usporediti dvije numeričke vrijednosti - koristi se<br />

naredba CMP. Obavljaju se iste akcije kao pri naredbi oduzimanja, ali se ne<br />

pohranjuje rezultat, nego se samo postavljaju vrijednosti zastavica.<br />

Primjer:<br />

Kada je potrebno usporediti 5 i 2,<br />

5 - 2 = 3<br />

Rezulat nije nula (Zero Flag=0)<br />

Kada je potrebno usporediti 7 i 7,<br />

7 - 7 = 0<br />

Rezulat je nula! Zero Flag (ZF) = 1 JZ i JE će izvršiti skok.<br />

Naredba Opis Zastavice Suprotna<br />

naredba<br />

JE , JZ<br />

JNE , JNZ<br />

JG , JNLE<br />

JL , JNGE<br />

JGE , JNL<br />

JLE , JNG<br />

Jump if Equal (=).<br />

Jump if Zero.<br />

Jump if Not Equal ().<br />

Jump if Not Zero.<br />

Jump if Greater (>).<br />

Jump if Not Less or Equal (not =).<br />

Jump if Not Less (not


Procedure<br />

Sintaksa:<br />

ime_proc PROC {NEAR/FAR}<br />

---<br />

---<br />

---<br />

RET [konst]<br />

ime_proc ENDP<br />

Arhitektura digitalnog računala<br />

PROC i ENDP su direktive kompajleru tako da se one ne prevode u strojni kod.<br />

Kompajler samo pamti adresu procedure.<br />

NEAR - ako je kod procedure u istom segmentu kao i poziv procedure (CALL<br />

naredba). Na stog se pohranjuje sadržaj IP (Instruction Pointer) registra.<br />

FAR - ako kod procedure može biti u različitom segmentu od poziva procedure<br />

(CALL naredba). Na stog se pohranjuje sadržaj registara CS (Code Segment) i<br />

IP (Instruction Pointer).<br />

CALL naredba se koristi za poziv procedure.<br />

.model<br />

---<br />

.code<br />

ime_proc PROC NEAR<br />

---<br />

ime_proc ENDP<br />

start:<br />

---<br />

CALL ime_proc<br />

---<br />

end start<br />

Procedura se može nalaziti i u odvojenoj datoteci, što se označava korištenjem<br />

ključne riječi EXTRN:<br />

dat1.asm dat2.asm<br />

.model .model<br />

--- ---<br />

.code .code<br />

EXTRN ime_proc: NEAR/FAR PUBLIC ime_proc<br />

start: ime_proc PROC<br />

--- ---<br />

CALL ime_proc RET<br />

--- ime_proc ENDP<br />

end start END<br />

20


Makroi<br />

Sintaksa:<br />

Arhitektura digitalnog računala<br />

ime_makroa MACRO [arg1, arg2, …]<br />

---<br />

---<br />

---<br />

ENDM<br />

Makro se poput procedure koristi kako bi se izbjeglo višestruko pisanje koda<br />

koji se ponavlja, te kako bi se povećala čitljivost programa.<br />

Makroi izgledaju kao procedure, ali oni postoje samo dok vaš kod nije<br />

kompajliran. Nakon kompajliranja svi makroi se zamjenjuju stvarnim<br />

naredbama. Ako je u programu deklariran makro koji se nikada ne poziva iz<br />

programa, kompajler će ignorirati cijeli makro.<br />

.model<br />

---<br />

.code<br />

ime_makroa<br />

---<br />

ENDM<br />

start:<br />

---<br />

ime_makroa [vr1, vr2, …]<br />

---<br />

end start<br />

Usporedba makroa i procedura:<br />

Za razliku od procedura koje se pozivaju CALL naredbom kada se želi<br />

koristiti makro upiše se samo naziv makroa.<br />

Procedura se nalazi na određenoj adresi u memoriji i ako program poziva<br />

istu proceduru 100 puta, procesor će svaki put prebaciti kontrolu nad<br />

izvršavanjem u taj dio memorije. Stog se koristi za pohranu adrese na<br />

koje se program treba vratiti nakon završetka izvođenja procedure.<br />

Makro se ekspandira direktno u kod programa. Ako program koristi isti<br />

makro 100 puta, kompajler umeće makro isto toliko puta čineći krajnji<br />

exe-fajl sve većim i većim.<br />

Potrebno je koristiti stog ili neki od registara opće namjene da bi se<br />

poslali parametri u proceduru.<br />

21


Arhitektura digitalnog računala<br />

Makro može uzimati i argumente. Argument može biti:<br />

varijabla<br />

registar<br />

konstanta<br />

Da bi se poslali parametri u makro dovoljno ih je pri pozivu navesti nakon<br />

naziva makroa.<br />

MyMacro 1,2,3<br />

Direktiva ENDM označava kraj makroa, dok se kraj procedure označava<br />

imenom procedure iza kojeg ide direktiva ENDP.<br />

Kod makroa treba biti oprezan s korištenjem skokova i labeli jer ako se makro<br />

pozove na nekoliko mjesta u programu (a makro se umeće direktno u kod<br />

programa) imati ćemo više labeli s istim imenom.<br />

Da bi se to izbjeglo potrebno je tu labelu definirati kao LOCAL.<br />

.MODEL small<br />

.DATA<br />

.STACK<br />

.CODE<br />

MyMacro MACRO<br />

LOCAL label1, label2<br />

cmp ax, 2<br />

je label1<br />

cmp ax, 3<br />

je label2<br />

label1:<br />

inc ax<br />

label2:<br />

add ax, 2<br />

---<br />

ENDM<br />

Start:<br />

---<br />

MyMacro<br />

MyMacro<br />

---<br />

mov ax, 4c00h<br />

int 21h<br />

END Start<br />

22


Arhitektura digitalnog računala<br />

N a r e d b e<br />

23


Naredbe za manipuliranje podacima<br />

Arhitektura digitalnog računala<br />

ZADATAK NAREDBE<br />

Prebacuje podatke iz jednog reg. u drugi ili<br />

iz registra u memoriju.<br />

Postavlja registre za adresiranje<br />

memorijske lokacije<br />

Upravljanje stogom<br />

MOV, XCHG<br />

LDS, LEA, LES<br />

POP, POPF, POPA,<br />

PUSH, PUSHF, PUSHA<br />

Prebacivanje niza znakova ili riječi LODS, MOVS, STOS<br />

Registar registar ili registar memorija<br />

MOV odredište, izvor<br />

XCHG odredište, izvor<br />

6<br />

MEMORIJA<br />

( varijabla)<br />

KONSTANTA<br />

zamjenjuje sadržaj izvorišta i odredišta.<br />

3<br />

5<br />

4<br />

8-bitni<br />

registar<br />

16-bitni<br />

registar<br />

seg. registar<br />

bez CS<br />

Postavljanje registara za pristup adresama u memoriji<br />

LEA registar, var<br />

Load Effective Address – Koristi se za spremanje adrese varijable u<br />

registar. (Alternativa LEA naredbi je korištenje OFFSET operatora).<br />

7<br />

8<br />

1<br />

2<br />

9<br />

24


LDS registar, far_ptr<br />

Arhitektura digitalnog računala<br />

Load memory double word into word register and DS.<br />

LES registar, far_ptr<br />

Load memory double word into word register and ES.<br />

Ova naredba se koristi kada podaci ne mogu stati unutar jednog<br />

segmenta i far_ptr je pokazivač na podatke u nekom drugom segmentu.<br />

Ona mijenja trenutnu adresu DS (LDS) ili ES (LES) registru u adresu<br />

segmenta na kojeg pokazuje far_ptr, a u registar se upisuje adresa na<br />

koju pokazuje far_ptr.<br />

Naredbe za rad sa stogom<br />

POP xxx<br />

PUSH xxx<br />

POPF<br />

PUSHF<br />

POPA<br />

PUSHA<br />

Skida 1 riječ s stoga i sprema u xxx (16-bitna varijabla, registar ili seg.<br />

registar).<br />

Stavlja 1 riječ iz xxx na stog.<br />

Skida 1 riječ s stoga i sprema je u registar zastavica.<br />

Stavlja registar zastavica na stog.<br />

Skida sa stoga 8 riječi i sprema ih u DI, SI, BP, SP, BX, DX, CX, AX.<br />

Stavlja na stog sadržaj registara AX, CX, DX, BX, SP, BP, SI, DI.<br />

25


Upravljanje blokovima podataka<br />

MOVS odredište, izvor<br />

MOVSB<br />

MOVSW<br />

Arhitektura digitalnog računala<br />

kopira 8 ili 16 bita s adrese DS:SI na adresu ES:DI, nakon čega se SI i DI<br />

inkrementiraju/dekrementiraju za 1 ili 2 ovisno o tome da li se prebacuje 8 ili<br />

16 bita.<br />

LODS operand<br />

LODSB<br />

LODSW<br />

kopira 8/16 bita s adrese DS:SI u AL/AX. Nakon prebacivanja SI se<br />

inkrementira/dekrementira.<br />

STOS operand<br />

STOSB<br />

STOSW<br />

kopira 8/16 bita iz registra AL/AX na adresu ES:DI. Nakon prebacivanja DI<br />

se inkrementira/dekrementira.<br />

ES:[DI]<br />

DS:[SI]<br />

STOS<br />

MOVS<br />

LODS<br />

AX<br />

Ah Al<br />

26


Uvjetne petlje<br />

LOOP labela<br />

Arhitektura digitalnog računala<br />

ova naredba dekrementira registar CX i radi skok na labelu, sve dok CX<br />

ne postane 0.<br />

LOOPE labela ili<br />

LOOPZ labela<br />

ova naredba dekrementira registar CX i radi skok na labelu sve dok je<br />

postavljena Zero Flag zastavica (ZF=1) i dok je CX 0.<br />

LOOPNE labela ili<br />

LOOPNZ labela<br />

ova naredba dekrementira registar CX i radi skok na labelu sve dok<br />

nije postavljena Zero Flag zastavica (ZF=0) i dok je CX 0.<br />

REP naredba_za_rad_sa_stringom<br />

Koristi se za ponavljanje jedne naredbe za rad sa stringom onoliko<br />

puta koliko piše u CX.<br />

U kombinaciji s naredbom REP mogu se koristiti naredbe:<br />

MOVSB, MOVSW, LODSB, LODSW, STOSB, STOSW.<br />

27


Aritmetičke operacije<br />

Arhitektura digitalnog računala<br />

U ovu grupu operacija spadaju operacije za zbrajanje, oduzimanje, množenje i<br />

dijeljenje. Svaka od operacija radi s 8 i 16 bitnim vrijednostima, s tim da<br />

operacije za množenje i dijeljenje postoje odvojeno za rad s brojevima s<br />

predznakom (signed) i brojevima bez predznaka (unsigned).<br />

Zbrajanje<br />

ADD op1, op2 op1 = op1 + op2<br />

Zbraja dva broja pri čemu operandi mogu biti veličine 8 ili 16 bita, ali<br />

oba moraju biti iste veličine. Za ovu naredbu oba broja su pozitivna, tj.<br />

MSB (Most Significant Bit) nije bit predznaka.<br />

ADC op1, op2 op1 = op1 + op2 + CF<br />

Zbraja dva broja s tim da ako je u prethodnoj operaciji došlo do<br />

preljeva uzima to u obzir i zbraja i CF (Carry Flag).<br />

INC var/reg var = var + 1 ili reg = reg + 1<br />

Oduzimanje<br />

Increase - Uvećava vrijednost u registru ili varijablu za 1.<br />

SUB op1, op2 op1 = op1 - op2<br />

Oduzima dva broja pri čemu operandi mogu biti veličine 8 ili 16 bita,<br />

ali oba moraju biti iste veličine. Za ovu naredbu uzima se da su oba broja<br />

pozitivna.<br />

SBB op1, op2 op1 = op1 - op2 - CF<br />

Oduzima dva broja s tim da ako je u prethodnoj operaciji došlo do<br />

posudbe uzima to u obzir i oduzima i CF.<br />

DEC var/reg var = var - 1 ili reg = reg - 1<br />

Decrease - Umanjuje vrijednost u registru ili varijablu za 1.<br />

NEG var/reg var = var * (-1) ili reg = reg * (- 1)<br />

Dvostruki komplement. Npr. 5 postaje -5, a -2 postaje 2 ...<br />

28


Množenje<br />

MUL op2<br />

Arhitektura digitalnog računala<br />

Unsigned multiply - Koristi se za množenje brojeva (bez predznaka) s<br />

tim da se jedan operand nalazi u registru AL a drugi se piše iza naredbe<br />

MUL. Rezultat ide u registar AX.<br />

To vrijedi samo ako su operandi 8-bitni, dok se za 16 bitne operande prvi<br />

operand nalazi u AX, drugi se piše iza naredbe i rezultat ide u registre DX<br />

(viših 16 bita) i AX (nižih 16 bita). op2 može biti ili registar ili varijabla.<br />

Kada je operand byte (8 bita)<br />

AX = AL * operand<br />

Kada je operand word (16 bita)<br />

IMUL op2<br />

Dijeljenje<br />

DIV djelitelj<br />

(DX AX) = AX * operand<br />

Signed multiply - Koristi se za množenje brojeva s predznakom, a<br />

princip je isti kao kod naredbe MUL.<br />

Unsigned divide - Koristi se za dijeljenje cjelobrojno pozitivnih brojeva<br />

s tim da se djeljenik nalazi ili u registru AX (ako je djelitelj 8-bitni) ili u<br />

DXAX (ako je djelitelj 16-bitni).<br />

Djelitelj može biti ili registar ili varijabla.<br />

Kada je djelitelj byte (8 bita)<br />

AL = AX / operand<br />

AH - ostatak<br />

Kada je djelitelj word (16 bita)<br />

IDIV djelitelj<br />

AX = (DX AX) / operand<br />

DX - ostatak<br />

Signed divide - Koristi se za dijeljenje brojeva s predznakom, a princip<br />

je isti kao kod naredbe DIV.<br />

29


Logičke operacije<br />

AND op1, op2 op1 = op1 AND op2<br />

Arhitektura digitalnog računala<br />

Ova naredba izvršava logičko I između operanda1 i operanda2.<br />

1 AND 1 = 1<br />

1 AND 0 = 0<br />

0 AND 1 = 0<br />

0 AND 0 = 0<br />

OR op1, op2 op1 = op1 OR op2<br />

Ova naredba izvršava logičko OR između operanda1 i operanda2.<br />

1 OR 1 = 1<br />

1 OR 0 = 1<br />

0 OR 1 = 1<br />

0 OR 0 = 0<br />

XOR op1, op2 op1 = op1 XOR op2<br />

Ova naredba izvršava logičko XOR između operanda1 i operanda2.<br />

NOT op<br />

1 XOR 1 = 0<br />

1 XOR 0 = 1<br />

0 XOR 1 = 1<br />

0 XOR 0 = 0<br />

Ova naredba izvršava logičku negaciju, tj sve 01 i sve 10.<br />

30


Operacije za pomak i rotiranje bitova<br />

Pomak bitova<br />

SHL odredište, brojač<br />

Arhitektura digitalnog računala<br />

Shift Left – Ova naredba se koristi za pomicanje bitova na odredištu<br />

ulijevo za onoliko puta koliko piše u brojaču. Kako se bitovi odredišta<br />

pomiču ulijevo na prazna mjesta dolaze 0. Najznačajniji bit ide u CF.<br />

Odredište je ili varijabla ili registar. Brojač može biti ili konstanta ili<br />

registar CL.<br />

SHR odredište, brojač<br />

CF … 0<br />

Shift Right – Ova naredba se koristi za pomicanje svih bitova na<br />

odredištu (računajući MSB) u desno za onoliko puta koliko piše u brojaču.<br />

Kako se bitovi odredišta pomiču udesno na prazna mjesta dolaze 0.<br />

SAL odredište, brojač<br />

Shift Arithmetic Left<br />

SAR odredište, brojač<br />

Shift Arithmetic Right<br />

Ove naredbe se koriste za pomicanje bitova na odredištu udesno za<br />

onoliko puta koliko piše u brojaču, s tim da bit predznaka zadržava svoju<br />

vrijednost.<br />

Rotiranje bitova<br />

RCL odredište, brojač<br />

Rotate (operand) left through Carry Flag – Ova naredba se koristi za<br />

rotiranje bitova odredišta ulijevo za onoliko mjesta koliko je navedeno u<br />

brojaču.<br />

Odredište može biti ili varijabla ili registar, dok je brojač ili CL registar ili<br />

konstanta.<br />

RCL koristi kao proširenje i CF, tako da se vrijednost CF pomiče u LSB, a<br />

MSB ide u CF.<br />

CF MSB LSB<br />

31


RCR odredište, brojač<br />

Arhitektura digitalnog računala<br />

Rotate (operand) right through Carry Flag – Ova naredba se koristi za<br />

rotiranje bitova odredišta udesno za onoliko mjesta koliko je navedeno u<br />

brojaču.<br />

RCR koristi kao proširenje i CF, tako da se vrijednost CF pomiče u MSB, a<br />

LSB ide u CF.<br />

ROL odredište, brojač<br />

Rotate Left – Ova naredba se koristi za rotiranje bitova odredišta<br />

ulijevo za onoliko mjesta koliko je navedeno u brojaču, s tim da se MSB<br />

prebacuje i u LSB i u CF.<br />

Odredište može biti ili varijabla ili registar, dok je brojač ili CL registar ili<br />

konstanta.<br />

ROR odredište, brojač<br />

CF MSB LSB<br />

Rotate Right – Ova naredba se koristi za rotiranje bitova odredišta<br />

udesno za onoliko mjesta koliko je navedeno u brojaču, s tim da se LSB<br />

prebacuje i u MSB i u CF.<br />

Usporedba i testiranje stringova<br />

CMPS<br />

Ova naredba se koristi za usporedbu 1, 2 ili 4 byte-a na adresi DS:SI<br />

sa 1, 2 ili 4 byte-a na adresi ES:DI na način da se te dvije vrijednosti<br />

oduzimaju. Rezultat se nigdje ne sprema nego se samo postavljaju<br />

zastavice.<br />

Nakon usporedbe registri SI i DI se inkrementiraju/dekrementiraju.<br />

Da li će se uspoređivati 1, 2 ili 4 byte-a – određuje se odabirom naredbe:<br />

CMPSB – Copmare String Byte<br />

CMPSW – Copmare String Word<br />

CMPSD – Copmare String Doubleword<br />

32


Arhitektura digitalnog računala<br />

P r i m j e r i<br />

33


Arhitektura digitalnog računala<br />

Primjeri asemblerskog programiranja - zadaci s rješenjima<br />

Primjer 1: Napisati program koji u registar bx upisuje broj 5, a onda ga iz<br />

registra bx prebacuje u ax.<br />

.MODEL small<br />

.DATA<br />

.STACK<br />

.CODE<br />

Start:<br />

mov bx, 5<br />

mov ax, bx<br />

END Start<br />

mov ax, 4c00h<br />

int 21h<br />

Primjer 2: Napisati program koji ispisuje poruku "Zdravo svima!" na ekran.<br />

.MODEL small<br />

.DATA<br />

string DB "Zdravo svima!$"<br />

.STACK<br />

.CODE<br />

Start:<br />

mov ax, @DATA<br />

mov ds, ax<br />

END Start<br />

mov dx, OFFSET string<br />

mov ah, 09h<br />

int 21h<br />

mov ax, 4c00h<br />

int 21h<br />

34


Arhitektura digitalnog računala<br />

Primjer 3: Napisati program koji na ekran ispisuje broj 3 (koristiti prekid za ispis<br />

znaka).<br />

.MODEL small<br />

.DATA<br />

.STACK<br />

.CODE<br />

Start:<br />

mov ax, @DATA<br />

mov ds, ax<br />

END Start<br />

mov dl, '3'<br />

mov ah, 02h<br />

int 21h<br />

mov ax, 4c00h<br />

int 21h<br />

Primjer 4: Napisati program koji unosi znak s tastature i odmah ga zatim<br />

ispisuje na ekran.<br />

.MODEL small<br />

.DATA<br />

.STACK<br />

.CODE<br />

Start:<br />

mov ax, @DATA<br />

mov ds, ax<br />

END Start<br />

mov ah, 01h<br />

int 21h<br />

mov dl, al<br />

mov ah, 02h<br />

int 21h<br />

mov ax, 4c00h<br />

int 21h<br />

35


Arhitektura digitalnog računala<br />

Primjer 5: Zaokružite programe koji će na ekran ispisati broj 5.<br />

a) b) c)<br />

.MODEL small<br />

.STACK<br />

.CODE<br />

Start:<br />

mov dl, '5'<br />

mov ah, 02h<br />

int 21h<br />

mov ax, 4c00h<br />

int 21h<br />

END Start<br />

Rješenje: a) i c)<br />

.MODEL small<br />

.STACK<br />

.CODE<br />

Start:<br />

mov dl, 5<br />

mov ah, 02h<br />

int 21h<br />

mov ax, 4c00h<br />

int 21h<br />

END Start<br />

.MODEL small<br />

.STACK<br />

.CODE<br />

Start:<br />

mov dl, 53<br />

mov ah, 02h<br />

int 21h<br />

mov ax, 4c00h<br />

int 21h<br />

END Start<br />

Primjer 6: Napiši program koji sadržaj registra AX zapisuje u BX, a sadržaj iz<br />

BX u AX. Pri tome koristiti stog.<br />

.MODEL small<br />

.DATA<br />

.STACK<br />

.CODE<br />

Start:<br />

mov ax, 1212h<br />

mov bx, 3434h<br />

push ax<br />

push bx<br />

pop ax<br />

pop bx<br />

END Start<br />

mov ax, 4c00h<br />

int 21h<br />

36


Arhitektura digitalnog računala<br />

Primjer 7: Što će ispisati sljedeći program?<br />

.MODEL small<br />

.STACK<br />

.CODE<br />

Start:<br />

mov cx, 0<br />

mov ax, '3'<br />

ponovo:<br />

cmp cx, 6<br />

jge kraj<br />

inc ax<br />

mov dl, al<br />

mov ah, 02h<br />

int 21h<br />

add cx, 3<br />

jmp ponovo<br />

kraj:<br />

mov ax, 4c00h<br />

int 21h<br />

END Start<br />

Rješenje: 45<br />

Primjer 8: Što će ispisati sljedeći program?<br />

.MODEL small<br />

.DATA<br />

str DB 5 DUP ('5')<br />

.STACK<br />

.CODE<br />

Start:<br />

mov ax, @DATA<br />

mov ds, ax<br />

mov si, 0<br />

mov str[si], '0'<br />

inc si<br />

inc si<br />

mov str[si], '1'<br />

mov str[5], '$'<br />

mov dx, OFFSET str<br />

mov ah, 09h<br />

int 21h<br />

mov ax, 4c00h<br />

int 21h<br />

END Start<br />

Rješenje: 05155<br />

37


Arhitektura digitalnog računala<br />

Primjer 9: Napiši program koji simulira FOR petlju. Npr. program koji 10 puta<br />

na ekranu ispisuje 3.<br />

.MODEL small<br />

.DATA<br />

.STACK<br />

.CODE<br />

Start:<br />

mov ax, @DATA<br />

mov ds, ax<br />

mov cx, 0<br />

ponovo:<br />

cmp cx, 10<br />

jge kraj<br />

kraj:<br />

END Start<br />

mov dl, '3'<br />

mov ah, 02h<br />

int 21h<br />

inc cx<br />

jmp ponovo<br />

mov ax, 4c00h<br />

int 21h<br />

38


Arhitektura digitalnog računala<br />

Primjer 10: Napiši program koji simulira IF-ELSE grananje. Npr. program koji<br />

unosi broj s tastature i nakon toga provjerava da li je uneseni broj veći od 5,<br />

manji od 5 ili jednak 5. Na ekran je potrebno ispisati odgovarajuću poruku: "Broj<br />

je veci od 5 !", "Broj je manji od 5 !" ili "Unijeli ste broj 5 !" .<br />

.MODEL small<br />

.DATA<br />

string1 DB "Broj je manji od 5 !$"<br />

string2 DB "Broj je veci od 5 !$"<br />

string3 DB "Unijeli ste broj 5 !$"<br />

.STACK<br />

.CODE<br />

Start:<br />

mov ax, @DATA<br />

mov ds, ax<br />

pet:<br />

veci:<br />

kraj:<br />

END Start<br />

mov ah, 01h<br />

int 21h<br />

cmp al, '5'<br />

je pet<br />

jg veci<br />

mov dx, OFFSET string1<br />

mov ah, 09h<br />

int 21h<br />

jmp kraj<br />

mov dx, OFFSET string3<br />

mov ah, 09h<br />

int 21h<br />

jmp kraj<br />

mov dx, OFFSET string2<br />

mov ah, 09h<br />

int 21h<br />

mov ax, 4c00h<br />

int 21h<br />

39


Arhitektura digitalnog računala<br />

Primjer 11: Napisati program koji unosi znak s tastature i odmah ga zatim<br />

ispisati dva puta na ekran. Za unos znaka s tastature koristiti makro (unos<br />

MACRO), a ispis znaka na ekran realizirati kroz proceduru (ispis PROC).<br />

.MODEL small<br />

.DATA<br />

.STACK<br />

.CODE<br />

unos MACRO<br />

mov ah, 01h<br />

int 21h<br />

ENDM<br />

ispis PROC NEAR<br />

mov ah, 02h<br />

int 21h<br />

ret<br />

ispis ENDP<br />

Start:<br />

unos<br />

END Start<br />

mov dl, al<br />

call ispis<br />

call ispis<br />

mov ax, 4c00h<br />

int 21h<br />

40


Arhitektura digitalnog računala<br />

Primjer 12: Ispitajte sadržaj registara AX, BX, CX i DX u naznačenom trenutku<br />

izvođenja programa.<br />

.MODEL small<br />

.DATA<br />

a DW 3<br />

b DW 4<br />

.STACK<br />

.CODE<br />

Start:<br />

mov ax, @DATA<br />

mov ds, ax<br />

mov si, OFFSET a<br />

mov dx, [si]<br />

mov si, OFFSET b<br />

mov bx, [si]<br />

mov ax, 8123h<br />

mov cx, 1456h<br />

shl cx, 1<br />

mul bx<br />

=> Upišite sadržaj registara AX, BX, CX, DX u ovom trenutku<br />

izvršavanja programa.<br />

END Start<br />

Rješenje:<br />

AX = 048Ch<br />

BX = 4h<br />

CX = 28ACh<br />

DX = 2h<br />

mov ax, 4C00h<br />

int 21h<br />

41


Arhitektura digitalnog računala<br />

Primjer 13: Definirajte u memoriji jedan 16-bitni i jedan 32-bitni broj te ih nakon<br />

toga učitajte u procesor (registre unutar CPU 8086).<br />

.MODEL small<br />

.DATA<br />

a DW 789Ah<br />

b DD 2959ED51h<br />

.STACK<br />

.CODE<br />

Start:<br />

mov ax, @DATA<br />

mov ds, ax<br />

END Start<br />

mov si, OFFSET a<br />

mov cx, [si]<br />

mov si, OFFSET b<br />

mov bx, [si]<br />

inc si<br />

inc si<br />

mov ax, [si]<br />

mov ax, 4C00h<br />

int 21h<br />

42


Prilog<br />

Arhitektura digitalnog računala<br />

ASCII kod (American Standard Code for Information Interchange)<br />

Char Dec Oct Hex | Char Dec Oct Hex | Char Dec Oct Hex | Char Dec Oct Hex<br />

-------------------------------------------------------------------------------------<br />

(nul) 0 0000 0x00 | (sp) 32 0040 0x20 | @ 64 0100 0x40 | ` 96 0140 0x60<br />

(soh) 1 0001 0x01 | ! 33 0041 0x21 | A 65 0101 0x41 | a 97 0141 0x61<br />

(stx) 2 0002 0x02 | " 34 0042 0x22 | B 66 0102 0x42 | b 98 0142 0x62<br />

(etx) 3 0003 0x03 | # 35 0043 0x23 | C 67 0103 0x43 | c 99 0143 0x63<br />

(eot) 4 0004 0x04 | $ 36 0044 0x24 | D 68 0104 0x44 | d 100 0144 0x64<br />

(enq) 5 0005 0x05 | % 37 0045 0x25 | E 69 0105 0x45 | e 101 0145 0x65<br />

(ack) 6 0006 0x06 | & 38 0046 0x26 | F 70 0106 0x46 | f 102 0146 0x66<br />

(bel) 7 0007 0x07 | ' 39 0047 0x27 | G 71 0107 0x47 | g 103 0147 0x67<br />

(bs) 8 0010 0x08 | ( 40 0050 0x28 | H 72 0110 0x48 | h 104 0150 0x68<br />

(ht) 9 0011 0x09 | ) 41 0051 0x29 | I 73 0111 0x49 | i 105 0151 0x69<br />

(nl) 10 0012 0x0a | * 42 0052 0x2a | J 74 0112 0x4a | j 106 0152 0x6a<br />

(vt) 11 0013 0x0b | + 43 0053 0x2b | K 75 0113 0x4b | k 107 0153 0x6b<br />

(np) 12 0014 0x0c | , 44 0054 0x2c | L 76 0114 0x4c | l 108 0154 0x6c<br />

(cr) 13 0015 0x0d | - 45 0055 0x2d | M 77 0115 0x4d | m 109 0155 0x6d<br />

(so) 14 0016 0x0e | . 46 0056 0x2e | N 78 0116 0x4e | n 110 0156 0x6e<br />

(si) 15 0017 0x0f | / 47 0057 0x2f | O 79 0117 0x4f | o 111 0157 0x6f<br />

(dle) 16 0020 0x10 | 0 48 0060 0x30 | P 80 0120 0x50 | p 112 0160 0x70<br />

(dc1) 17 0021 0x11 | 1 49 0061 0x31 | Q 81 0121 0x51 | q 113 0161 0x71<br />

(dc2) 18 0022 0x12 | 2 50 0062 0x32 | R 82 0122 0x52 | r 114 0162 0x72<br />

(dc3) 19 0023 0x13 | 3 51 0063 0x33 | S 83 0123 0x53 | s 115 0163 0x73<br />

(dc4) 20 0024 0x14 | 4 52 0064 0x34 | T 84 0124 0x54 | t 116 0164 0x74<br />

(nak) 21 0025 0x15 | 5 53 0065 0x35 | U 85 0125 0x55 | u 117 0165 0x75<br />

(syn) 22 0026 0x16 | 6 54 0066 0x36 | V 86 0126 0x56 | v 118 0166 0x76<br />

(etb) 23 0027 0x17 | 7 55 0067 0x37 | W 87 0127 0x57 | w 119 0167 0x77<br />

(can) 24 0030 0x18 | 8 56 0070 0x38 | X 88 0130 0x58 | x 120 0170 0x78<br />

(em) 25 0031 0x19 | 9 57 0071 0x39 | Y 89 0131 0x59 | y 121 0171 0x79<br />

(sub) 26 0032 0x1a | : 58 0072 0x3a | Z 90 0132 0x5a | z 122 0172 0x7a<br />

(esc) 27 0033 0x1b | ; 59 0073 0x3b | [ 91 0133 0x5b | { 123 0173 0x7b<br />

(fs) 28 0034 0x1c | < 60 0074 0x3c | \ 92 0134 0x5c | | 124 0174 0x7c<br />

(gs) 29 0035 0x1d | = 61 0075 0x3d | ] 93 0135 0x5d | } 125 0175 0x7d<br />

(rs) 30 0036 0x1e | > 62 0076 0x3e | ^ 94 0136 0x5e | ~ 126 0176 0x7e<br />

(us) 31 0037 0x1f | ? 63 0077 0x3f | _ 95 0137 0x5f | (del) 127 0177 0x7f<br />

ASCII Opis<br />

------------------------<br />

nul null byte<br />

bel bell character<br />

bs backspace<br />

ht horizontal tab<br />

np formfeed<br />

nl newline<br />

cr carriage return<br />

vt vertical tab<br />

esc escape<br />

sp space<br />

Treba uočiti da pojedine znamenke prikazane kao znak ne odgovaraju po<br />

binarnom prikazu odgovarajućem cijelom broju.<br />

Npr. znamenka 7 prikazana kao cijeli broj u 1 byte-u iznosi 0000 0111, a<br />

prikazana kao ASCII znak 0011 0111.<br />

Pretvorba:<br />

broj = znak - 48<br />

broj = znak - '0'<br />

broj = znak & 0x0f<br />

43


Arhitektura digitalnog računala<br />

Primjeri prevođenja i povezivanja programa<br />

U primjerima koji slijede korišten je Microsoft Macro Assembler (MASM).<br />

Prevođenje programa u strojni kod (kompajliranje):<br />

Povezivanje programa (linkanje) – stvaranje izvršnog programa:<br />

Dobili smo izvršnu datoteku vj1.exe<br />

44


Turbo Debugger<br />

Arhitektura digitalnog računala<br />

Za analiziranje ponašanja napisanog programa (liniju po liniju koda) koristiti<br />

ćemo Turbo Debugger.<br />

td.exe se nalazi u BIN direktoriju<br />

Nakon pokretanja Turbo Debugger-a može se učitati izvršna datoteka vj1.exe<br />

(prethodno kreirana - primjer 1)<br />

File => Open ...<br />

Može se pojaviti poruka o grešci: «Program has no symbol table»<br />

Zanemarite ovu vrstu pogreške. Kliknite OK.<br />

45


Arhitektura digitalnog računala<br />

Na ekranu se mogu uočiti pojedina područja ...<br />

1 – kod vašeg programa<br />

2 – registri<br />

3 – registar zastavica<br />

4 – memorijske lokacije<br />

5 – stog<br />

Da bi vidjeli ponašanje programa liniju po liniju koda (step by step) pritisnite F8<br />

(Run => Step Over)<br />

Konkretno u primjeru 1 – izvrši se prva naredba ...<br />

mov bx, 5<br />

Na gornjoj slici se vidi da je sadržaj registra bx promijenio vrijednost:<br />

bx=0005h<br />

46


Arhitektura digitalnog računala<br />

Nakon što se još jednom pritisne F8 izvrši se druga linija programa ...<br />

mov ax, bx<br />

Nakon toga vrijednost registra ax i bx je postavljena na 5.<br />

Iduća naredba postavlja vrijednost registra ax=4C00h<br />

Na kraju program poziva int21 – kraj programa.<br />

Na isti način kao u prvom primjeru izvrši se kompajliranje i linkanje drugog<br />

našeg primjera:<br />

masm vj2<br />

link vj2<br />

Nakon što se pokrene program ispiše se poruka: «Zdravo svima!»<br />

47

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!