Professional Documents
Culture Documents
Bijeljina
nakon unosa
objektni kod
rezultat rada asemblera programa
pokretanje se
postiže klikom na
-2-
Zbirka zadataka iz asemblera
Zbog segmentiranog pristupa memoriji struktura programa je takva da START PROC FAR
se direktivama SEGMENT i ENDS u okviru programa posebno
definišu segmenti: ; Store return address to OS:
- podataka , PUSH DS
- steka (magacina) i MOV AX, 0
- koda. PUSH AX
Evo primera kostura programa koji se dobije kao File->New->EXE ; set segment registers:
Teplate: MOV AX, DSEG
MOV DS, AX
MOV ES, AX
TITLE 8086 Code Template (for EXE file)
; TODO: add your data here! Kao što se u gornjem primeru vidi program se sastoji od samo jedne
procedure koja se zove START. Ona je ujedno i glavna procedura, tj
DSEG ENDS ona sa kojom započinje izvršenje programa. Koja procedura će biti
-3-
Zbirka zadataka iz asemblera
glavna zavisi od toga šta (tačnije - ime koje procedure) se navede iza INT 21H
poslednje direktive u programu END (set entry point).
U okviru programa koristićemo često poziv int 21h. To je poziv upućen
Znači pravilo za definiciju segmenta je da se upotrebi par direktiva operativnom sistemu koji kontroliše sve uređaje da za potrebe našeg
SEGMENT - ENDS uz zadavanje nekog imena. Npr ovako: programa učita znak sa tastature ili pak da ispiše string na monitoru.
Šta tačno zahtevamo određeno je sadržajem registra AH u trenutku
podaci SEGMENT poziva prekida (interapta) int 21h. Ako je naprimer u programu
brojac DB ? napisano:
suma DW ?
poruka DB ' Kraj programa D / N ? ','$' MOV AH , 9
podaci ENDS LEA DX , poruka
INT 21H
Glavna procedura mora na svom početku imati nekoliko instrukcija
koje su zadužene za postavljanje adrese povratka nakon izvršenja to znači da hoćemo da se na monitoru ispiše string poruka.
programa i za inicijalizaciju segmentnih registara CS,DS,ES i SS. U
gornjem primeru :
ZAKLJUČAK
; Store return address to OS:
PUSH DS U nastavku će rešenja zadataka biti data u obliku potrebne definicije
MOV AX, 0 podataka i odgovarajućim kodom. Zadaci će biti takvi da kreću od onih
PUSH AX koji se mogu realizovati prostom sekvencom instrukcija, preko onih za
koje su potrebni programski skokovi, petlje do onih za koje ćemo
; set segment registers: koristiti potprograme (u vidu procedura).
MOV AX, DSEG
MOV DS, AX Da bi se postigao maksimalan efekat preporučljivo je samostalno raditi
MOV ES, AX zadatke pogotovo što je redak slučaj da dva programera napišu vrlo
sličan program. Jedino u nedostaku ideje naravno nije loše pogledati
Treba reći da nema značaja da li se piše velikim ili malim slovima. Ono dato rešenje. Pošto je ovo zamišljeno kao pomoć u prvim koracima
što je navedeno iza znaka " ; " je komentar i ne utiče na izvršenje asemblerskog programiranja algoritmi u rešenjima često neće biti
progarma. optimalni (ni sa stanovišta brzine izvršavanja ni sa stanovišta utroška
resursa).
Gornji "kostur" programa se može koristiti kao polazna podloga za
pisanje programa. Ono što treba ugraditi jeste definicija podataka na Autor
mestu označenom sa:
-4-
Zbirka zadataka iz asemblera
data SEGMENT
br1 DB 3
br2 DB 5
br3 DB 2
rez DB ?
data ENDS
MOV AL , br1
MOV BL , br2
ADD AL , BL
MOV BL , br3
-5-
Zbirka zadataka iz asemblera
SUB AL , BL log1 DB ?
MOV rez , AL log2 DB ?
log3 DB ?
data ENDS
-6-
Zbirka zadataka iz asemblera
;unos hiljada
MOV AH , 1
INT 21h 6. Prikazati naziv dana u zavisnosti od pritisnutog tastera od 1
SUB AL , 48 do 7 . Npr za unos 1 prikazati "ponedeljak".
MOV BX , 1000
MUL BX DSEG SEGMENT 'DATA'
ADD godina , AX ulaz db 'broj 1-7 : $'
novired db 10,13,'$'
;unos stotina greska db '* broj nije od 1 do 7 *$'
MOV AH , 1 dan1 db ' Ponedeljak$'
INT 21h dan2 db ' Utorak$'
SUB AL , 48 dan3 db ' Sreda$'
MOV BL , 100 dan4 db ' Cetvrtak$'
MUL BL dan5 db ' Petak$'
ADD godina , AX dan6 db ' Subota$'
dan7 db ' Nedelja$'
;unos desetina DSEG ENDS
MOV AH , 1
INT 21h
SUB AL , 48 MOV AH , 9
MOV BL , 10 LEA DX , ulaz
MUL BL INT 21h
ADD godina , AX MOV AH , 1
-7-
Zbirka zadataka iz asemblera
-8-
Zbirka zadataka iz asemblera
-9-
Zbirka zadataka iz asemblera
- 10 -
Zbirka zadataka iz asemblera
☞ IF...(var1=var2)...THEN.......ELSE..........ENDIF
WHILE : CMP var1 , var2
JNG WEND
DO : ................
................
IF : CMP var1 , var2 ................
JNE ELSE JMP WHILE
THEN : ............... WEND : NOP
...............
JMP ENDIF
ELSE : ................
................
ENDIF : NOP
☞ REPEAT................UNTIL..(var1<var2)..ENDREPAET
☞ CASE..var...OF........ELSE....ENDCASE
REPEAT : ...............
...............
...............
CASE : NOP UNTIL : CMP var1 , var2
C1 : CMP var , var_case1 JGE REPEAT
JNE C2 ENDREPEAT : NOP
...............
...............
JMP ENDSACE
C2 : CMP var , var_case2
JNE C3
☞
............... FOR...var1=var2..TO..var3..STEP..var4...........NEXT..ENDFOR
...............
JMP ENDSACE MOV var1 , var2
C3 : CMP var , var_case3 FOR : CMP var1 , var3
JNE ELSE JG ENDFOR
............... .................
............... .................
JMP ENDSACE .................
ELSE : ................ STEP : ADD var1 , var4
................ NEXT : JMP FOR
ENDCASE : NOP ENDFOR : NOP
- 11 -
Zbirka zadataka iz asemblera
Gornji primeri su napisani tako da bi se što lakše uočila ista 9. Sabrati prvih 50 prirodnih brojeva i rezultat prikazati sa
funkcionalnost asemblerskog koda sa konkretnom kontrolnom odgovarajućim tekstom.
strukturom. Jasno je naravno da u gornjim primerima ima labela koje
nemaju nikakav značaj i mogu se jednostavno izbaciti.
DSEG SEGMENT 'DATA'
Osim opisanih načina za izvođenje petlje postoji i mogućnost da se tekst db 10,13,'Suma je : $'
iskoristi naredba LOOP : DSEG ENDS
Decrease CX, jump to label if CX not zero. ; organizacija petlje upotrebom naredbe LOOP
MOV CX , 50
Algorithm: MOV AX , 0
CX = CX - 1 MOV BX , 1
if CX <> 0 then NEXT: ADD AX , BX
jump INC BX
else LOOP NEXT
no jump, continue
; određivanje cifara rezultata uz pomoć steka
Example: ; najvažnija cifra biće na vrhu steka i ona treba
include 'emu8086.inc' ; prva da se prikaže
MOV DL , 10
MOV BX , 0
MOV CX, 5
PUSH BX
label1:
SLED: CMP AL , 0
PRINTN 'loop!'
JE REZ
LOOP label1
DIV DL
; korekcija prema ASCII tabeli
Gore je navedeno objašnjenje naredbe LOOP iz Helpa emulatora. ADD AH , 48
Ono što je iz gornjeg primera možda nejasno je linija koja glasi PUSH AX
PRINTN 'loop!' . ; ostatak od prethodnog delenje više ne treba
XOR AH , AH
Radi se o takozvanom MAKRO-u koji se nalazi u fajlu 'emu8086.inc'. JMP SLED
Mehanizam makro-a je sledeći - na mestu u programu gde se nalazi
REZ: MOV AH , 9
njegovo ime prilikom prevođenja programa ugrađuje se kod njegove
LEA DX , tekst
definicije (u ovom slučaju iz fajla emu8086.inc). Znači nešto slično
INT 21H
potprogramu.
; iskoristićemo funkciju AH=2 interapta 21h
Inače ovaj makro < PRINTN string > radi prikaz stringa na monitoru i
; koja prikazuje znak čiji se ASCII kod nalazi
prelazi u novi red.
; u registru DL
- 12 -
Zbirka zadataka iz asemblera
- 13 -
Zbirka zadataka iz asemblera
MOV DL , NIZ[SI]
LAB4: INC SI MOV AH , 9
LOOP LAB2 LEA DX , P_SUM
INT 21H
ADD DL , 48 LEA DX , SUM
MOV MIN , DL INT 21H
ADD DH , 48
MOV MAX , DH LEA DX , P_PRO
INT 21H
LEA DX , PRO
; priprema cifara rezultata za INT 21H
; proizvod i sumu
LEA DX , P_MIN
; ocekujemo trocifreni rezultat za INT 21H
; proizvod LEA DX , MIN
INT 21H
MOV CX , 3
MOV SI , 2 LEA DX , P_MAX
MOV DL , 10 INT 21H
LAB5: DIV DL LEA DX , MAX
ADD AH , 48 INT 21H
MOV PRO[SI] , AH
XOR AH , AH
DEC SI 11. Uneti niz od N<10 jednocifrenih brojeva a zatim iz niza izbaciti
LOOP LAB5 brojeve koji su neparni. Prikazati novi niz.
- 14 -
Zbirka zadataka iz asemblera
LEA DX , P_REZ
MOV AH , 1 INT 21H
INT 21H
SUB AL , 48 MOV CX , N
XOR AH , AH MOV SI , 0
MOV N , AX MOV AH , 2
LAB4:MOV DL , NIZ[SI]
MOV AH , 9 INT 21H
LEA DX , P_NIZ MOV DL , ' '
INT 21H INT 21H
INC SI
MOV SI , 0 LOOP LAB4
MOV CX , N
LAB1:MOV AH , 1 LAB5:NOP
INT 21H
MOV NIZ[SI] , AL
INC SI
MOV AH , 2 12. Uneti niz od N<10 brojeva , a zatim izvršiti rotiranje članova
MOV DL , ' ' niza oko simetralnog člana. Prikazati rezultantni niz.
INT 21H
LOOP LAB1
DSEG SEGMENT 'DATA'
MOV DI , 0 n dw ?
MOV CX , N niz db 9 dup(?)
MOV SI , 0
LAB2:MOV BL , NIZ[SI] p_n db 'Broj clanova niza : $'
SHR BL , 1 p_niz db 10,13,'Uneti niz : ',10,13,'$'
JC LAB3 p_rez db 10,13,'Rezultat : ',10,13,'$'
MOV AL , NIZ[SI] DSEG ENDS
MOV NIZ[DI] , AL
INC DI
LAB3:INC SI
LOOP LAB2 MOV AH , 9
LEA DX , P_N
MOV N , DI INT 21H
CMP N , 0 MOV AH , 1
JE LAB5 INT 21H
SUB AL , 48
MOV AH , 9 XOR AH , AH
- 15 -
Zbirka zadataka iz asemblera
- 16 -
Zbirka zadataka iz asemblera
MOV AH , 1 MOV AH , 2
INT 21H LAB3:MOV DL , NIZ[SI]
SUB AL , 48 INT 21H
DEC AL MOV DL , ' '
XOR AH , AH INT 21H
MOV K , AX INC SI
CMP SI , N
MOV AH , 9 JLE LAB3
LEA DX , P_NIZ
INT 21H
LAB2:MOV DL , NIZ[SI]
MOV NIZ[SI+1] , DL
DEC SI
CMP SI , K MOV AH , 9
JGE LAB2 LEA DX , P_N
INC SI INT 21H
MOV NIZ[SI] , 48
MOV AH , 1
INT 21H
MOV AH , 9 SUB AL , 48
LEA DX , P_REZ DEC AL
INT 21H XOR AH , AH
MOV N , AX
MOV SI , 0
- 17 -
Zbirka zadataka iz asemblera
MOV AH , 9 MOV SI , 0
LEA DX , P_NIZ MOV AH , 2
INT 21H LAB4:MOV DL , NIZ[SI]
INT 21H
MOV SI , 0 MOV DL , ' '
LAB1:MOV AH , 1 INT 21H
INT 21H INC SI
MOV NIZ[SI] , AL CMP SI , N
INC SI JLE LAB4
MOV AH , 2
MOV DL , ' '
INT 21H 15. Napisati program za izračunavanje i prikaz tabele faktorijela
CMP SI , N prvih 8 prirodnih brojeva. Faktorijele računati rekurzivnim
JLE LAB1 postupkom.
; uredjivanje niza
- 18 -
Zbirka zadataka iz asemblera
- 19 -
Zbirka zadataka iz asemblera
loop l2
naslov db 'G R A F$' gotoxy 8 , 1
naslov1 db 'F U N K C I J E$' mov dl , 'y'
DSEG ENDS int 21h
call ulaz
; naslov ; funkcija
;======= ;=========
gotoxy 41 , 5 mov bl , 15
mov ah , 9 mov bh , 10
lea dx , naslov mov dl , znak
int 21h mov cx ,15
gotoxy 38 , 7 gotoxy bh , bl
lea dx , naslov1 l3: int 21h
int 21h inc bh
call vr_fn
gotoxy bh , bl
; horizontalna osa loop l3
;=================
mov cx , 40
mov ah , 2
mov dl , hl vr_fn proc near
gotoxy 10 , 15 push ax
l1: int 21h push dx
loop l1 mov al , bh
gotoxy 49 , 16 sub al , 10
mov dl , 'x' mov dl , 1
int 21h mul dl
mov dl , koef
; vertikalna osa div dl
;=============== mov bl , 15
mov cx , 15 sub bl , al
mov ah , 2 pop dx
mov dl , vl pop ax
mov bl , 1 ret
gotoxy 10 , bl vr_fn endp
l2: int 21h
inc bl ulaz proc near
gotoxy 10 , bl push ax
- 20 -
Zbirka zadataka iz asemblera
25 (redovi)
- 21 -
Zbirka zadataka iz asemblera
ZADACI ZA VEŽBANJE 7. Za dati prirodni broj N i niz celih brojeva x 1, x2, ... xn, napisati
program za izračunavanje:
1. Napisati program za sabiranje niza jednobajtnih brojeva. Broj
članova niza i članovi niza su zadati u segmentu podataka.
xi xj
2. Napisati program za izračunavanje: 1i j n
n
S K k x 2k
8. Dat je prirodni broj k i k celih brojeva a1, a2, ..., ak. Neka je M
najveći, a m najmanji u datom nizu. Napisati program za
k 1 pronalaženje svih celih brojeva iz intervala (m , M) koji ne
pripadaju datom nizu celih brojeva.
gde su x i n dati jednobajtni brojevi. 9. Dati su celi brojevi a1, a2, ..., a10. Ako važi :
3. Dati su prirodni brojevi n i k i niz celih brojeva x 1, x2 , ... xn . b1 = a1 , ..... , b10 = a10 i bk = bk-1 + bk-2 + ..... bk-10 za
Napisati program za određivanje k najvećih članova datog k = 11, 12, ... , m (m je dati prirodni broj), izračunati članove
niza. (k < n). niza b.
4. Dato je 20 celih brojeva. Napisati program za formiranje 2 niza 10. Dat je prirodan broj N. Napisati program za određivanje
čiji su elementi: prirodnog broja iz intervala [1 , N] koji ima najveći broj faktora.
11. Dat je kvadrat [(0,0) , (0,10) , (10,10) , (10,0)] i tačka M(x,y)
(1. niz) x1, x11, x3, x13, ......, x9, x19 gde su x i y dati brojevi. Napisati program za određivanje
(2. niz) x 12, x2, x14, x4, ......, x20, x10 kvadrata minimalnog rastojanja date tačke od ruba datog
kvadrata.
5. Napisati program za određivanje n-tog člana Fibonačijevog
niza: 12. Dati su prirodan broj n i kvadratna matrica A formata nxn.
Matrica A je zapisana u memoriji u obliku jednodimenzionog
niza po kolonama. Napisati program za prikaz te matrice u
u0 = 0 , u1 = 1 , un = un-1 + un-2 (n = 2, 3, 4, ......)
originalnom obliku.
6. Napisati program za formiranje niza Y na sledeći način: 13. Uneti nisku u memoriju završivši je znakom <CR>. Napisati
program za ispitivanje da li je data niska palindrom.
xi xn i 1 14. Uneti nisku u memoriju završivši je znakom <CR>. Napisati
, n 2k program za određivanje broja blanko znakova.
yi 2
, n 2k 1 15. Uneti nisku u memoriju završivši je znakom <CR>. Napisati
x 2i 1 program za određivanje broja samoglasnika.
16. Uneti nisku u memoriju završivši je znakom <CR>. Napisati
od elemenata niza x1, x2, ......, xn. Deljenje izvesti kao program za određivanje broja reči.
celobrojno.
- 22 -
Zbirka zadataka iz asemblera
PRILOG A
8086 CPU ima 8 registara opšte namene :
Segmentni registri :
- 23 -
Zbirka zadataka iz asemblera
Kombinovanjem ovih registra unutar [ ] simbola, možemo Po default-u DS segment registar se koristi za sve modove
prići različitim memorijskim lokacijama. Sledeće kombinacije izuzev onih sa BP registrom, za koje se koristi SS segment
su podržane (addressing modes (načini adresiranja)): registar.
- 24 -
Zbirka zadataka iz asemblera
Varijable (promenjljive)
Postoji lagan način da se zapamte sve moguće kombinacije
uz pomoć tabele:
Varijabla je memorijska lokacija. Za programera je mnogo
lakše da se vrednost pohrani u varijablu nazvanu npr "var1"
nego da tu vrednost "proziva" preko adrese npr 5A73:235B,
pogotovo ako program ima više varijabli.
- 25 -
Zbirka zadataka iz asemblera
Adresa varijable
Takođe se mogu koristiti registri BX, SI, DI, BP, npr: MOV AL , VAR1 ; vrednost VAR1 se kopira u AL.
MOV SI , 3
MOV AL , a[SI] LEA BX , VAR1 ; adresa VAR1 se upisuje u BX.
Ako je potrebno deklarisati veliki niz koristimo DUP operator. MOV BYTE PTR [BX] , 44h ; sadržaj VAR1 postaje 44h.
Sintaksa za DUP je:
Npr:
c DB 5 DUP(9)
je isto što i: MOV AL, VAR1 ; vrednost VAR1 se kopira u AL
c DB 9, 9, 9, 9, 9
MOV BX, OFFSET VAR1 ; adresa VAR1 se upisuje u BX.
Npr:
d DB 5 DUP(1, 2) MOV BYTE PTR [BX], 44h ; sadržaj VAR1 postaje 44h.
je isto što i:
d DB 1, 2, 1, 2, 1, 2, 1, 2, 1, 2
Oba primera imaju isto dejstvo.
- 26 -
Zbirka zadataka iz asemblera
Za definisanje konstanti koristimo direktivu EQU : Da bi pozvali prekid koristimo INT instrkciju, sa vrlo prostom
sintksom:
name EQU < any expression >
INT value
Npr:
gde je value broj između 0 i 255 ( 0 do 0FFh).
- 27 -
Zbirka zadataka iz asemblera
Postoji 16 bitova, koje zovemo flag-ovima (zastavica , Postoje 3 grupe ovih instrukcija.
marker):
Sign Flag (SF) - setovan na 1 kada je rezultat REG: AX, BX, CX, DX, AH, AL, BL, BH, CH, CL, DH, DL, DI,
negativan. Vrednost ovog flega je most significant bit. SI, BP, SP.
memory: [BX], [BX+SI+7], variable, itd...
Overflow Flag (OF) - setovan na 1 kada se desi immediate: 5, -24, 3Fh, 10001101b, itd...
signed overflow. Npr, kada saberemo bajtove 100
+ 50 (rezultat nije u opsegu -128..127). Rezultat je upisan u prvi operand. CMP i TEST ne upisuju
rezultat nigde.
Parity Flag (PF) - setovan na 1 kada je paran broj
jedinica u rezultatu. Analizira se samo 8 donjih bitova Flagovi koji se menjaju zbog ovih instrukcija su:
za word! CF, ZF, SF, OF, PF, AF.
Auxiliary Flag (AF) - setovan na 1 kada se desi ADD - dodaj drugi operand prvom.
unsigned overflow za niža 4 bita. SUB - oduzmi drugi operand od prvog.
CMP - oduzmi drugi operand od prvog.
Interrupt enable Flag (IF) - kada je setovan na 1 AND - logčko I između svih bita oba operanda
CPU reaguje na interpte iz spoljnih uređaja. TEST - kao logičko I.
OR - logičko ILI između svih bita oba operanda.s 1.
Direction Flag (DF) - kada je 0 - obrada je XOR - logičko ekskluzivno ILI između svih bita oba
završena u smeru forward, kada je 1 obrada je operanda.
završena u smeru backward.
- 28 -
Zbirka zadataka iz asemblera
operand je byte:
REG
memory
REG: AX, BX, CX, DX, AH, AL, BL, BH, CH, CL, DH, DL, DI,
✍ Treća grupa: INC, DEC, NOT, NEG
REG
MUL i IMUL instrukcije menjaju sadržaj flagova: memory
CF, OF
DIV i IDIV ne menjaju flegove. REG: AX, BX, CX, DX, AH, AL, BL, BH, CH, CL, DH, DL, DI,
SI, BP, SP.
memory: [BX], [BX+SI+7], variable, itd...
MUL - neoznačeno množenje:
operand je byte: INC, DEC menjaju flegove:
AX = AL * operand.
ZF, SF, OF, PF, AF.
operand je word: NOT ne menja flegove!
(DX AX) = AX * operand.
NEG menja flegove:
IMUL - označeno množenje:
CF, ZF, SF, OF, PF, AF.
operand je byte:
AX = AL * operand.
NOT - negira svaki bit operanda.
operand je word: NEG - operand pravi negativnim (drugi komplement).
(DX AX) = AX * operand.
DIV - neoznačeno deljenje:
operand je byte:
AL = AX / operand
AH = ostatak (modul). .
operand je word:
AX = (DX AX) / operand
DX = ostatak (modul). .
IDIV - označeno deljenje:
- 29 -
Zbirka zadataka iz asemblera
Kontrola programskog toka druga upoređuje brojeve kao označene, a treća upoređuje
brojeve kao neoznačene.
✍ Bezuslovni skokovi
Instrukcije skoka koje testiraju jedan fleg
Sintaksa JMP instrucije:
JMP label Inverzna
Instrukcija Opis Uslov
instrukcija
Deklaracija labe-el u programu, se postiže
navođenjem njenog imena praćenog sa ":" , a ime ne
JZ , JE Jump if Zero (Equal). ZF = 1 JNZ, JNE
može početi brojem, npr:
label1:
label2: Jump if Carry
a: JC , JB, JNC, JNB,
(Below, Not Above CF = 1
Labela se može koristiti na dva načina ako u primeru: JNAE JAE
Equal).
x1:
MOV AX, 1
JS Jump if Sign. SF = 1 JNS
x2: MOV AX, 2
Primer JMP instrukcije: JO Jump if Overflow. OF = 1 JNO
JMP može vršiti skok i unapred i unazad. Skok može biti bilo Jump if Not
JNO OF = 0 JO
Overflow.
gde u okviru tekućeg kod segmenta (65,535 bajtova).
- 30 -
Zbirka zadataka iz asemblera
Ima instrukcija koje rade istu stvar, ali je programeru Instrukcije skoka za neoznačene brojeve
nekad lakše da zbog logike upotrebi npr JE a nekad JZ.
Inverzna
Instrukcija Opis Uslov
instrukcija
Instrukcije skoka za označene brojeve
Jump if Equal (=).
JE , JZ ZF = 1 JNE, JNZ
Inverzna Jump if Zero.
Instrukcija Opis Uslov
instrukcija
Jump if Not Equal
Jump if Equal (=). JNE , JNZ (<>). ZF = 0 JE, JZ
JE , JZ ZF = 1 JNE, JNZ
Jump if Zero. Jump if Not Zero.
- 31 -
Zbirka zadataka iz asemblera
Naprimer:
MOV AL , var1
MOV BL , var2 include emu8086.inc
CMP AL , BL
JE dalje ORG 100h
..........
MOV AL, 25 ; set AL to 25.
..........
MOV BL, 10 ; set BL to 10.
dalje:
.......... CMP AL, BL ; compare AL - BL.
..........
JNE not_equal ; jump if AL <> BL (ZF = 0).
Sve instrukcije uslovnog skoka imaju ograničenje - skok JMP equal
može biti najviše 127 bajtova napred odnosno 128 bajtova not_equal:
nazad.
; pretpostavimo da ovde
; postoji kod koji asembliran
; ima više od 127 bajtova...
No ovo ograničenje se može zaobići upotrebom trika:
PUTC 'N' ; if it gets here, then AL <> BL,
JMP stop ; so print 'N', and jump to stop.
o Upotrebiti inverznu instrukciju, skočiti na
label_x. equal: ; if gets here,
o Upotrebiti JMP instrukciju za skok na željenu PUTC 'Y' ; then AL = BL, so print 'Y'.
lokaciju.
o Definisati label_x: neposredno posle JMP stop:
instrukcije.
RET ; gets here no matter what.
label_x: - može biti bilo koja labela.
END
Evo primera:
- 32 -
Zbirka zadataka iz asemblera
m1 PROC
MOV BX, 5 "b." - prefiks ispred [SI] znači da hoćemo da uporedimo
RET bajtove, a ne reči. Da je trebalo teči stavili bi smo "w."
m1 ENDP prefiks. Kada je jedan od operanada registar to nije potrebno.
END
- 33 -
Zbirka zadataka iz asemblera
Stek (Magacin)
Sintaksa za POP instrukciju:
Sintaksa za PUSH instrukciju: Stek radi po LIFO (Last In First Out) algoritmu:
PUSH REG
PUSH SREG
PUSH memory
PUSH immediate
- 34 -
Zbirka zadataka iz asemblera
Evo primera:
ORG 100h
Makroi
MOV AX, 1234h
PUSH AX
; .................
; sada se AX može upotrebiti za
druge svrhe Makroi su slični procedurama, ali oni postoje samo dok
; .................. program nije kompajlovan. Posle toga svi makroi su
zamenjeni sa realnim instrukcijama. Ako se makro deklariše
POP AX ali se nigde ne pozove u programu, kompajler će ga prosto
zanemariti.
RET
name MACRO
[parameters,...]
Stek memorija je definisana SS (Stack Segment) registrom, i
SP (Stack Pointer) registrom. Operativni sistem postavlja ove <instructions>
ENDM
registre na startu programa.
- 35 -
Zbirka zadataka iz asemblera
MyMacro2 MACRO
Kada se koriste procedure koristi se CALL instrukcija,
LOCAL label1, label2
naprimer:
CMP AX, 2
CALL MyProc JE label1
CMP AX, 3
Kada se koristi makro, samo se navodi njegovo ime.
JE label2
Naprimer:
label1:
MyMacro INC AX
label2:
Procedura je locirana na nekoj specifičnoj adresi u memoriji, i ADD AX, 2
ako se koristi ista procedura 100 puta, CPU će uvek preneti ENDM
kontrolu na ovaj deo memorije. Kontrola će biti vraćena nazad ORG 100h
RET naredbom. Stek se koristi za čuvanje povratne adrese. MyMacro2
CALL instrukcija zauzima oko 3 bajta, pa veličina izlaznog
MyMacro2
izvršnog fajla raste beznačajno, bez obzira kolko puta pozivali RET
proceduru.
- 36 -
Zbirka zadataka iz asemblera
input:
BH = page number.
return:
Lista podržanih prekida DH = row.
DL = column.
CH = cursor start line.
INT 10h / AH = 00h - set video mode. CL = cursor bottom line.
- 37 -
Zbirka zadataka iz asemblera
INT 10h / AH = 09h - write character and attribute at cursor position. DL,DH = column, row at which to start writing.
ES:BP points to string to be printed.
input:
AL = character to display. INT 10h / AX = 1003h - toggle intensity/blinking.
BH = page number.
BL = attribute. input:
CX = number of times to write character. BL = write mode:
0: enable intensive colors.
1: enable blinking (not supported by emulator!).
INT 10h / AH = 0Ah - write character only at cursor position. BH = 0 (to avoid problems on some adapters).
- 38 -
Zbirka zadataka iz asemblera
Currently this function can be used to determine the INT 13h / AH = 03h - write disk sectors.
number of installed number of floppy disk drives.
input:
return: return:
AX = kilobytes of contiguous memory starting at
absolute address 00000h, this call returns the
contents of the word at 0040h:0013h.
- 39 -
Zbirka zadataka iz asemblera
CF clear if successful (wait interval stops the execution, to boot from floppy drive select
elapsed), from the menu: 'Virtual Drive' -> 'Boot from Floppy'
CF set on error or when wait function
is already in progress. INT 1Ah / AH = 00h - get system time.
return:
Note:
CX:DX = number of clock ticks since
the resolution of the wait period is 977 midnight.
microseconds on many systems, AL = midnight counter, advanced
emu8086 uses 1000 microseconds each time midnight passes.
period.
Notes:
There are approximately 18.20648 clock ticks per second,
INT 16h / AH = 00h - get keystroke from keyboard (no echo). and 1800B0h per 24 hours.
AL is not set by emulator yet!
return:
- 40 -