Programiranje u asembleru
Programiranje u asembleru
Programiranje u asembleru
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