Académique Documents
Professionnel Documents
Culture Documents
STUDIJ RAUNARSTVA
Goran Kraljevi
Kazalo:
Osnovna arhitektura 8086 procesora ....................................................4
Izvrna jedinica i njezini registri .......................................................................... 5
N a r e d b e ......................................................................................... 23
Naredbe za manipuliranje podacima ................................................................... 24
Zbrajanje ..................................................................................................... 28
Oduzimanje .................................................................................................. 28
Mnoenje ..................................................................................................... 29
Dijeljenje...................................................................................................... 29
Logike operacije .............................................................................................. 30
Operacije za pomak i rotiranje bitova ................................................................. 31
Pomak bitova................................................................................................ 31
Rotiranje bitova ............................................................................................ 31
Usporedba i testiranje stringova ......................................................................... 32
P r i m j e r i ......................................................................................... 33
Primjeri asemblerskog programiranja - zadaci s rjeenjima ................................... 34
Primjeri prevoenja i povezivanja programa ........................................................ 44
AX
BX
CX
DX
AL
BL
CL
DL
Accumulator
Base
Count
Data
Podatkovni
registri
SP
BP
SI
DI
Stack pointer
Base pointer
Source index
Destination index
Pokazivaki
registri
Indeksni
registri
Registar zastavica
Registar zastavica u mikroprocesoru 8086 je takoer 16-bitni registar, no
stvarno se upotrebljava samo 9 bitova:
6 kao zastavice statusa (status flags)
3 kao upravljake zastavice
15
14
13
12
11
10
O D
T S Z
Registar
zastavica
Upravljake zastavice:
IF [interrupt flag] ako je IF u stanju 1 znai da e zahtjevi za prekid biti
prihvaeni (STI -> Set I; CLI -> Clear I)
TF [trap flag] ako je TF u stanju 1 omogueno je izvoenje programa korak
po korak tj. izvoenje jedne po jedne naredbe. (koristi se kod debugger-a).
DF [direction flag] odreuje smjer u kojem e se pristupati uzastopnim byteovima stringa.
0 podrazumijeva da je sljedei byte na veoj adresi
1 podrazumijeva da je sljedei byte na nioj adresi
Code segment
Data segment
Stack segment
Extra segment
IP
Instruction pointer
Segmentni
registri
Stog
Stog je dio memorije koji se koristi za privremenu pohranu podataka.
Postoje 2 instrukcije koje rade sa stogom:
PUSH xxx postavlja 16-bitnu vrijednost (1 rije) iz xxx na stog.
POP xxx uzima 16-bitnu vrijednost (1 rije) sa stoga i sprema je u xxx
(16-bitna varijabla, registar ili segmentni registar).
Stog koristi LIFO (Last In First Out) princip.
Primjer:
Ako punimo stog (PUSH) sljedeim vrijednostima: 1, 2, 3, 4, 5
prva vrijednost koju emo naredbom POP preuzeti sa stoga je 5, zatim 4,
3, 2, 1.
Nibble 4 bita
Byte 8 bita
Word 16 bita
Adresa svakog byte-a u memoriji je odreena sa 20 bita, ali kako su svi registri
16-bitni cijela adresa se ne moe pohraniti u jedan registar, pa se dijeli na
dva dijela:
Adresa segmenta (SEGMENT),
Adresa byte-a u segmentu (OFFSET).
U heksadecimalnoj notaciji ta adresa izgleda ovako:
SEGMENT:OFFSET
Primjer:
0040:0002 je adresa 3 byte-a u segmentu 40h.
adresi
Za pristup memoriji mogu se koristiti sljedei registri: BX, SI, DI, BP.
Kombinirajui ove registre unutar simbola [ ] mogu se dobiti razliite memorijske
lokacije.
Sve mogue kombinacije se mogu lako upamtiti koristei formulu...
10
Modovi adresiranja
Procesor 8086 ne dozvoljava operacije izmeu dvije memorijske lokacije
U primjerima s adresiranjem se koristi naredba
MOV odredite,
MOV
izvor
Direktno adresiranje
Postoji vie naina direktnog adresiranja:
preko imena varijable
MOV
MOV
ax, var1
var2, bl
preko vrijednosti
MOV
ax, 2Ch
ax, [2Ch]
MOV
MOV
ax, DS:[2Ch]
ax, ES:[2Ch]
preko registara
MOV
MOV
ax, di
cl, dh
11
Indirektno adresiranje
Ovo adresiranje se naziva indirektno jer se vrijednosti pristupa preko njene
adrese.
registarski mod adresa sa koje se podatak prebacuje nalazi se u
"nekom" registru.
MOV
MOV
MOV
MOV
si, 0
al, polje[si]
MOV
MOV
ax, polje
bx, OFFSET polje
12
Programiranje u asembleru
Programerski model
Programerski model obuhvaa memoriju i registre.
Memorija se dijeli u blokove od 64 K u kojima se nalaze kod, program,
podaci i stog.
Registri se dijele na:
podatkovne (AX, BX, CX, DX)
segmentne (CS, DS, ES, SS)
indeksne (SI, DI)
pokazivake (SP, BP, IP)
registar zastavica
Predloak za pisanje asemblerskog programa
.MODEL mem_model
.DATA
--.STACK
.CODE
start:
----END start
podaci 64k
podaci 64k
podaci > 64k (ali polje 64k)
podaci > 64k (ali polje 64k)
podaci > 64k (polje > 64k)
kod 64k
kod > 64k
kod 64k
kod > 64k
kod 64k
13
int 21h
int 21h je DOS prekid (interrupt) koji sadri 100-tinjak osnovnih funkcija
potrebnih za normalan rad korisnikih aplikacija.
Izmeu ostalog on omoguava otvaranje, zatvaranje, pisanje i itanje datoteka;
itanje znakova s tastature, ispis znakova na ekran, uzimanje i postavljanje
sistemskog vremena,
Svaka od tih funkcija ima svoj broj i kada se pozove int 21h, on ita broj funkcije
iz registra ah. to znai da se prije poziva prekida broj eljene funkcije mora
staviti u registar ah.
Ah
4c
01h
Al
00h
02h
09h
Funkcija
kraj programa
skuplja znak s tastature i sprema ga u AL
uzima znak koji se nalazi u DL i ispisuje ga
na ekran
uzima string s poetnom adresom u DX i
ispisuje ga na ekran
14
Tipovi varijabli
.DATA
Oznaava poetak segmenta u kojem se nalaze podaci.
Sintaksa:
naziv_var
direktiva
inicializator
Direktiva
Veliina____________
DB
1B (define byte)
DW
2B (define word)
DD
DF
6B (define farword)
DQ
8B (define qadword)
DT
10B
Cijeli brojevi
DB (Define Byte) opseg vrijednosti od -128 do 127 ili 0 255
DW (Define Word) bez predznaka 0 65 535 ili
sa predznakom od -32768 do 32767
DD (Define Double Word) bez predznaka od 0 do 4 294 967 295 ili
sa predznakom od - 2 147 483 648 do 2 147 483 647
...
Primjer:
broj1
broj2
DB
DB
16
?
broj1 = 16
broj2 nije inicijaliziran
Stringovi
Uglavnom se koristi DB direktiva.
Primjer:
pod1
pod2
pod3
DB
DB
DB
"abc$"
'a', 'b', 'c', '$'
97, 98, 99, 36
15
Pokazivai
Uglavnom se koristi:
DW - za adresiranje unutar istog segmenta
DD - za adresiranje u neki drugi segment
Primjer:
pod
DB
"Tekst$"
string
pok1
pok2
DW
DD
pod
pod
pokaziva
pokaziva
tip
broj
DUP (vrijednost)
Polja
Sintaksa:
ime
~
~
polje1 DB 1,1,1,1,1
polje1 DB 1,2,1,2,1,2,1,2,1,2
rezervira se prostor u memoriji za 5 DB ali
nisu inicijalizirani na poetnu vrijednost.
16
Konstante
EQU koristi se za definiranje konstanti
Sintaksa:
konst EQU izraz
Primjer:
Ukoliko se radi o brojanim konstantama:
kolona EQU 80 kolona = 80
red
EQU 40 red = 40
Ukoliko se radi o stringu:
kr1 EQU kolona-redak
kr1 = 40
kr2 EQU <kolona-redak> kr2 = "kolona-redak"
@DATA
@DATA ita adresu na kojoj se nalazi poetak podatkovnog segmenta koji je
inicijaliziran naredbom .DATA.
Ta adresa se prvo kopira u AX a tek onda u DS jer 8086 procesor ne dozvoljava
direktno kopiranje konstante u segmentni registar.
mov ax, @DATA
mov ds, ax
17
Skokovi
Bezuvjetni skokovi
JMP - bezuvjetni skok na navedenu memorijsku adresu
DIREKTNI
Sintaksa:
JMP labela
JMP SHORT labela
JMP FAR PTR labela
INDIREKTNI
Sintaksa:
JMP
reg_ili_mem
mov ax, 2
Uvjetni skokovi
Uvjetni skokovi slijede iza naredbi CMP ili TEST.
Sintaksa:
CMP vrijednost1, vrijednost2
NAREDBA labela
NAREDBA labela
18
Naredba
Opis
Zastavice
Suprotna
naredba
JE , JZ
ZF = 1
JNE, JNZ
JNE , JNZ
ZF = 0
JE, JZ
JG , JNLE
JL , JNGE
JGE , JNL
JLE , JNG
ZF = 0
and
SF = OF
JNG, JLE
SF <> OF
JNL, JGE
SF = OF
JNGE, JL
ZF = 1
or
SF <> OF
JNLE, JG
19
Procedure
Sintaksa:
ime_proc PROC {NEAR/FAR}
------RET [konst]
ime_proc ENDP
PROC i ENDP su direktive kompajleru tako da se one ne prevode u strojni kod.
Kompajler samo pamti adresu procedure.
NEAR - ako je kod procedure u istom segmentu kao i poziv procedure (CALL
naredba). Na stog se pohranjuje sadraj IP (Instruction Pointer) registra.
FAR - ako kod procedure moe biti u razliitom segmentu od poziva procedure
(CALL naredba). Na stog se pohranjuje sadraj registara CS (Code Segment) i
IP (Instruction Pointer).
CALL naredba se koristi za poziv procedure.
.model
--.code
ime_proc PROC NEAR
--ime_proc ENDP
start:
--CALL ime_proc
--end start
dat2.asm
.model
--.code
.model
--.code
PUBLIC ime_proc
ime_proc PROC
---
EXTRN
ime_proc: NEAR/FAR
start:
--CALL
--end start
ime_proc
RET
ime_proc ENDP
END
20
Makroi
Sintaksa:
ime_makroa
-------
MACRO
[arg1, arg2, ]
ENDM
start:
--ime_makroa [vr1, vr2, ]
--end start
21
varijabla
registar
konstanta
LOCAL.
.MODEL small
.DATA
.STACK
.CODE
MyMacro MACRO
LOCAL label1, label2
cmp ax, 2
je label1
cmp ax, 3
je label2
label1:
inc ax
label2:
add ax, 2
--ENDM
Start:
--MyMacro
MyMacro
--mov ax, 4c00h
int 21h
END Start
22
Naredbe
23
ZADATAK
NAREDBE
MOV, XCHG
LDS, LEA, LES
Upravljanje stogom
izvor
1
8-bitni
registar
3
7
MEMORIJA
(varijabla)
16-bitni
registar
KONSTANTA
seg. registar
bez CS
XCHG odredite,
izvor
var
24
LDS registar,
far_ptr
far_ptr
Skida 1 rije s stoga i sprema u xxx (16-bitna varijabla, registar ili seg.
registar).
PUSH xxx
Skida sa stoga 8 rijei i sprema ih u DI, SI, BP, SP, BX, DX, CX, AX.
PUSHA
Stavlja na stog sadraj registara AX, CX, DX, BX, SP, BP, SI, DI.
25
MOVSB
MOVSW
izvor
LODS operand
LODSB
LODSW
DS:SI
AL/AX.
Nakon prebacivanja
SI
se
STOS operand
STOSB
STOSW
ES:[DI]
AL/AX
na adresu
ES:DI.
Nakon prebacivanja
STOS
AX
MOVS
DS:[SI]
Ah
Al
LODS
26
DI
Uvjetne petlje
LOOP labela
ili
LOOPZ labela
ili
LOOPNZ labela
27
Aritmetike operacije
U ovu grupu operacija spadaju operacije za zbrajanje, oduzimanje, mnoenje i
dijeljenje. Svaka od operacija radi s 8 i 16 bitnim vrijednostima, s tim da
operacije za mnoenje i dijeljenje postoje odvojeno za rad s brojevima s
predznakom (signed) i brojevima bez predznaka (unsigned).
Zbrajanje
ADD op1,
Zbraja dva broja pri emu operandi mogu biti veliine 8 ili 16 bita, ali
oba moraju biti iste veliine. Za ovu naredbu oba broja su pozitivna, tj.
MSB (Most Significant Bit) nije bit predznaka.
ADC op1,
Oduzima dva broja pri emu operandi mogu biti veliine 8 ili 16 bita,
ali oba moraju biti iste veliine. Za ovu naredbu uzima se da su oba broja
pozitivna.
SBB op1,
28
Mnoenje
MUL op2
Dijeljenje
DIV djelitelj
29
Logike operacije
AND op1,
AND
AND
AND
AND
1
0
1
0
=
=
=
=
1
0
0
0
OR
OR
OR
OR
1
0
1
0
=
=
=
=
1
1
1
0
XOR
XOR
XOR
XOR
1
0
1
0
=
=
=
=
0
1
1
0
NOT op
30
broja
CF
SHR odredite,
broja
broja
broja
Rotiranje bitova
RCL odredite,
broja
MSB
LSB
31
RCR odredite,
broja
broja
ROR odredite,
MSB
LSB
broja
CMPSB
CMPSW
CMPSD
32
Primjeri
33
34
Primjer 3: Napisati program koji na ekran ispisuje broj 3 (koristiti prekid za ispis
znaka).
.MODEL small
.DATA
.STACK
.CODE
Start:
mov ax, @DATA
mov ds, ax
mov dl, '3'
mov ah, 02h
int 21h
mov ax, 4c00h
int 21h
END Start
35
b)
c)
.MODEL small
.STACK
.CODE
.MODEL small
.STACK
.CODE
.MODEL small
.STACK
.CODE
Start:
mov dl, '5'
mov ah, 02h
int 21h
Start:
mov dl, 5
mov ah, 02h
int 21h
Start:
mov dl, 53
mov ah, 02h
int 21h
Rjeenje: a) i c)
36
37
Primjer 9: Napii program koji simulira FOR petlju. Npr. program koji 10 puta
na ekranu ispisuje 3.
.MODEL small
.DATA
.STACK
.CODE
Start:
mov ax, @DATA
mov ds, ax
mov cx, 0
ponovo:
cmp cx, 10
jge kraj
mov dl, '3'
mov ah, 02h
int 21h
inc cx
jmp ponovo
kraj:
mov ax, 4c00h
int 21h
END Start
38
Primjer 10: Napii program koji simulira IF-ELSE grananje. Npr. program koji
unosi broj s tastature i nakon toga provjerava da li je uneseni broj vei od 5,
manji od 5 ili jednak 5. Na ekran je potrebno ispisati odgovarajuu poruku: "Broj
je veci od 5 !", "Broj je manji od 5 !" ili "Unijeli ste broj 5 !" .
.MODEL small
.DATA
string1 DB "Broj je manji od 5 !$"
string2 DB "Broj je veci od 5 !$"
string3 DB "Unijeli ste broj 5 !$"
.STACK
.CODE
Start:
mov ax, @DATA
mov ds, ax
mov ah, 01h
int 21h
cmp al, '5'
je pet
jg veci
mov dx, OFFSET string1
mov ah, 09h
int 21h
jmp kraj
pet:
mov dx, OFFSET string3
mov ah, 09h
int 21h
jmp kraj
veci:
mov dx, OFFSET string2
mov ah, 09h
int 21h
kraj:
mov ax, 4c00h
int 21h
END Start
39
Primjer 11: Napisati program koji unosi znak s tastature i odmah ga zatim
ispisati dva puta na ekran. Za unos znaka s tastature koristiti makro (unos
MACRO), a ispis znaka na ekran realizirati kroz proceduru (ispis PROC).
.MODEL small
.DATA
.STACK
.CODE
unos MACRO
mov ah, 01h
int 21h
ENDM
ispis PROC NEAR
mov ah, 02h
int 21h
ret
ispis ENDP
Start:
unos
mov dl, al
call ispis
call ispis
mov ax, 4c00h
int 21h
END Start
40
Rjeenje:
AX = 048Ch
BX = 4h
CX = 28ACh
DX = 2h
41
Primjer 13: Definirajte u memoriji jedan 16-bitni i jedan 32-bitni broj te ih nakon
toga uitajte u procesor (registre unutar CPU 8086).
.MODEL small
.DATA
a DW 789Ah
b DD 2959ED51h
.STACK
.CODE
Start:
mov ax, @DATA
mov ds, ax
mov si, OFFSET a
mov cx, [si]
mov
mov
inc
inc
mov
si, OFFSET b
bx, [si]
si
si
ax, [si]
42
Prilog
ASCII kod (American Standard Code for Information Interchange)
Char Dec Oct Hex | Char Dec Oct Hex | Char Dec Oct Hex | Char Dec Oct Hex
------------------------------------------------------------------------------------(nul)
0 0000 0x00 | (sp)
32 0040 0x20 | @
64 0100 0x40 | `
96 0140 0x60
(soh)
1 0001 0x01 | !
33 0041 0x21 | A
65 0101 0x41 | a
97 0141 0x61
(stx)
2 0002 0x02 | "
34 0042 0x22 | B
66 0102 0x42 | b
98 0142 0x62
(etx)
3 0003 0x03 | #
35 0043 0x23 | C
67 0103 0x43 | c
99 0143 0x63
(eot)
4 0004 0x04 | $
36 0044 0x24 | D
68 0104 0x44 | d
100 0144 0x64
(enq)
5 0005 0x05 | %
37 0045 0x25 | E
69 0105 0x45 | e
101 0145 0x65
(ack)
6 0006 0x06 | &
38 0046 0x26 | F
70 0106 0x46 | f
102 0146 0x66
(bel)
7 0007 0x07 | '
39 0047 0x27 | G
71 0107 0x47 | g
103 0147 0x67
(bs)
8 0010 0x08 | (
40 0050 0x28 | H
72 0110 0x48 | h
104 0150 0x68
(ht)
9 0011 0x09 | )
41 0051 0x29 | I
73 0111 0x49 | i
105 0151 0x69
(nl)
10 0012 0x0a | *
42 0052 0x2a | J
74 0112 0x4a | j
106 0152 0x6a
(vt)
11 0013 0x0b | +
43 0053 0x2b | K
75 0113 0x4b | k
107 0153 0x6b
(np)
12 0014 0x0c | ,
44 0054 0x2c | L
76 0114 0x4c | l
108 0154 0x6c
(cr)
13 0015 0x0d | 45 0055 0x2d | M
77 0115 0x4d | m
109 0155 0x6d
(so)
14 0016 0x0e | .
46 0056 0x2e | N
78 0116 0x4e | n
110 0156 0x6e
(si)
15 0017 0x0f | /
47 0057 0x2f | O
79 0117 0x4f | o
111 0157 0x6f
(dle) 16 0020 0x10 | 0
48 0060 0x30 | P
80 0120 0x50 | p
112 0160 0x70
(dc1) 17 0021 0x11 | 1
49 0061 0x31 | Q
81 0121 0x51 | q
113 0161 0x71
(dc2) 18 0022 0x12 | 2
50 0062 0x32 | R
82 0122 0x52 | r
114 0162 0x72
(dc3) 19 0023 0x13 | 3
51 0063 0x33 | S
83 0123 0x53 | s
115 0163 0x73
(dc4) 20 0024 0x14 | 4
52 0064 0x34 | T
84 0124 0x54 | t
116 0164 0x74
(nak) 21 0025 0x15 | 5
53 0065 0x35 | U
85 0125 0x55 | u
117 0165 0x75
(syn) 22 0026 0x16 | 6
54 0066 0x36 | V
86 0126 0x56 | v
118 0166 0x76
(etb) 23 0027 0x17 | 7
55 0067 0x37 | W
87 0127 0x57 | w
119 0167 0x77
(can) 24 0030 0x18 | 8
56 0070 0x38 | X
88 0130 0x58 | x
120 0170 0x78
(em)
25 0031 0x19 | 9
57 0071 0x39 | Y
89 0131 0x59 | y
121 0171 0x79
(sub) 26 0032 0x1a | :
58 0072 0x3a | Z
90 0132 0x5a | z
122 0172 0x7a
(esc) 27 0033 0x1b | ;
59 0073 0x3b | [
91 0133 0x5b | {
123 0173 0x7b
(fs)
28 0034 0x1c | <
60 0074 0x3c | \
92 0134 0x5c | |
124 0174 0x7c
(gs)
29 0035 0x1d | =
61 0075 0x3d | ]
93 0135 0x5d | }
125 0175 0x7d
(rs)
30 0036 0x1e | >
62 0076 0x3e | ^
94 0136 0x5e | ~
126 0176 0x7e
(us)
31 0037 0x1f | ?
63 0077 0x3f | _
95 0137 0x5f | (del) 127 0177 0x7f
ASCII Opis
-----------------------nul
null byte
bel
bell character
bs
backspace
ht
horizontal tab
np
formfeed
nl
newline
cr
carriage return
vt
vertical tab
esc
escape
sp
space
43
44
Turbo Debugger
Za analiziranje ponaanja napisanog programa (liniju po liniju koda) koristiti
emo Turbo Debugger.
td.exe se nalazi u BIN direktoriju
45
46
47