ZADATAK 1:
Neka je dat
sledeći asemblerski kod:
Title
zad1
sseg
segment stack
db 256 dup (?)
sseg
ends
dseg
segment
broj
db 121
por1
db 'sadr ax :'
sad1
db ?
dseg
ends
cseg
segment
assume
cs:cseg, ds:dseg, ss:sseg
zad1
proc far
push ds
mov
ax, 0
push ax
;
mov
bx, dseg
mov
ds, bx
;
mov al, broj
inc al
xor bl, bl
dec bl
add al, bl
mov sad1, al
ret
zad1
endp
cseg ends
end zad1
Koji će biti sadržaj lokacije sad1 nakon izvršenja programa?
Rešenje:
Nakon učitanja broja
121 u registra al vrši se njegovo inkrementiranje za 1 pa je njegov sadržaj
122. Nakon toga se čisti registar bl (xor bl, bl), a zatim se on umanjuje za
1(0-1=-1). Na kraju se sadržaj bl doda na al i upiše u lokaciju sad1, pa je
sadržaj ove lokacije 122-1=121=79(heksa).
ZADATAK 2:
Neka su dati
brojevi broj1=77 i broj2=22 u data segmentu. Napisati program kojim se nalazi
njihov zbir(zbir), razlika(raz), proizvod(pro) i odnos(del)
Rešenje:
Program za rešenje ovog
zadataka je:
Title
zad2
;
;Definisanje
stek-segmenta
;
sseg
segment stack
db 256 dup (?) ;Rezervisanje prostora za stek
sseg
ends
dseg
segment
broj1
db 77
broj2
db 22
por1
db 'zbir :'
zbir
db ?
por2
db 'razlika :'
raz
db ?
por3
db 'proizvod :'
pro
dw ?
por4
db 'odnos :'
del
db ?
dseg
ends
cseg
segment
assume
cs:cseg, ds:dseg, ss:sseg
zad2
proc far
;
push ds
mov
ax, 0
push ax
;
mov
bx, dseg
mov
ds, bx
;
mov al, broj1
add al, broj2
mov zbir, al
mov al, broj1
sub al, broj2
mov raz, al
xor ax, ax
mov al, broj1
mul broj2
mov pro, ax
xor ax, ax
mov al, broj1
div broj2
mov del, al
ret
;
zad2
endp
cseg ends
end zad2
Za množenje ovih bojeva bilo je neophodno da se
rezerviše lokacija u dužini jedne reči (pro dw ?), budući da je rezultat
množenja veći od jednog bajta.
ZADATAK 3:
Napisati program kojim se sabiraju neparni brojevi od 1
do 100.
Rešenje:
Program za rešenje ovog
zadataka je:
Title
zad3
;
;Definisanje
stek-segmenta
;
sseg
segment stack
db 256 dup (?) ;Rezervisanje prostora za stek
sseg
ends
dseg
segment
por1
db 'zbir :'
zbir
dw ?
broj
db ?
dseg
ends
cseg
segment
assume
cs:cseg, ds:dseg, ss:sseg
zad3
proc far
;
push ds
mov
ax, 0
push ax
;
mov
bx, dseg
mov
ds, bx
;
mov cx, 100
mov zbir, 0
mov broj, 1
a1:
mov bl, 2
mov al, broj
div bl
cmp ah, 0
je a2
xor ax, ax
mov al, broj
add zbir, ax
a2:
inc broj
loop
a1
ret
;
zad3
endp
cseg ends
end zad3
Rešenje zadataka se nalazi upotrebom loop ciklusa
ostvarenog pomoću cx registra. Na početku programa lokacija za zbir se postalja
na nulu kao i početni broj na 1. Instrukcijama div bl i cmp ah, 0 ispitujemo da
li se radi o parnom broju. Ako je paran ide se na labelu a2 inače se sabira
broj u zbir. Na kraju se uvećava broj za 1 (uzima sledeći broj). Primetite da
bi podelili broj sa 2 nismo mogli pisati div
2 budući da to nije dozvoljeno. Traženi rezultat je 2500 što je heksa
9C4.
U slučaju ako bi se tražio zbir parnih brojeva onda bi
bila potrebna mala modifikacija koda i to:
a1:
mov bl, 2
mov al, broj
div bl
cmp ah, 1
je a2
xor ax, ax
mov al, broj
add zbir, ax
a2:
inc broj
taj je zbir 2550 ili u heksa kodu 9F6.
ZADATAK 5:
Neka su data dva broja broj=1234 i broj1=142. Napisati
program kojim se oni dele. Rezultat delenja stavi u lokaciju kol1 a ostatatak
delenja u lokaciju ost1.
Rešenje:
Program za rešenje ovog
zadataka je:
Title
zad5
sseg
segment stack
db 256 dup (?) ;Rezervisanje prostora za stek
sseg
ends
dseg
segment
broj
dw 1234
broj1
dw 142
por1
db 'kolic :'
kol1
dw ?
por2
db 'ost :'
ost1
dw ?
dseg
ends
cseg
segment
assume
cs:cseg, ds:dseg, ss:sseg
zad5
proc far
push ds
mov
ax, 0
push ax
;
mov
bx, dseg
mov
ds, bx
;
mov ax, broj
div broj1
mov kol1, ax
mov ost1, dx
;
ret
;
zad5 endp
cseg ends
end zad5
ZADATAK 6:
Neka je dat registar ax u koji je upisan broj 791. Napiši program kojim će biti
pomnožen sadržaj ovog registra sa 4 ne koristeći instrukciju mul. Rezultat upiši
u lokaciju mno.
Rešenje:
Program za rešenje ovog
zadataka je:
Title
zad6
sseg
segment stack
db 256 dup (?) ;Rezervisanje prostora za stek
sseg
ends
dseg
segment
broj
dw 791
por1
db 'proizvod :'
mno
dw ?
dseg
ends
cseg
segment
assume
cs:cseg, ds:dseg, ss:sseg
zad6
proc far
;
push ds
mov
ax, 0
push ax
;
mov
bx, dseg
mov
ds, bx
;
mov ax, broj
mov cx, 2
a1:
shl ax,1
loop a1
mov mno, ax
ret
;
zad6 endp
cseg ends
end zad6
Množenje sa brojem 4 znači pomeranje u levo za dva mesta
sadržaja registra ax, a što smo ostvarili uputrebom loop instrukcije i
instrukcije za pomeranje u levo registra ax, shl. Traženi rezultat je
791*4=3164=C5C(heksa).
ZADATAK 7:
Neka je dat registar ax u koji je upisan broj 791. Napiši program kojim će biti
nađen broj binarnih jedinica u tome registru, kao i broj nula. Broj jedinica
upiši u lokaciju brojjed a
nula u brojnul.
Rešenje:
Program za rešenje ovog
zadataka je:
Title
zad7
sseg
segment stack
db 256 dup (?) ;Rezervisanje prostora za stek
sseg
ends
dseg
segment
broj
dw 791
por1
db 'broj jedinica :'
brojjed
db ?
por2
db 'broj nula :'
brojnul
db ?
dseg
ends
cseg
segment
assume
cs:cseg, ds:dseg, ss:sseg
zad7
proc far
;
push ds
mov
ax, 0
push ax
;
mov
bx, dseg
mov
ds, bx
;
mov ax, broj
mov cx, 16
mov brojjed, 0
a1:
shl ax,1
jc a2
jmp a3
a2:
add brojjed, 1
a3:
loop a1
mov al, 16
sub al, brojjed
mov brojnul, al
ret
;
zad7 endp
cseg ends
end zad7
Broj 791 je binarno 0000 0011 0001 0111 i takav je
zapisan u ax registrar. Koristićemo instrukcije shr za pomeranje u desno. Tada
će bnarna cifra koja
izlazi iz registra ax ulaziti u CF fleg. Ispitujemo da li je on jednak 0 (jc
a3). Ako jeste brojjed uvećavamo za 1. Inače navedeni ciklus radimo 16 puta dok
svi brojevi neizađu iz registra. Broj nula se dobija kada se od broja 16 odbije
brojjedinica.
U slučaju da je zadati broj bio -791 onda bi taj broj
bio prestavljen u njegovom komplementu dva:
1111
1100 1110 1000
+ 1
-----------------------------
1111 1100 1110 1001
pa bi broj jedinica bio 11(heksa B) a broj nula 5.
ZADATAK 8:
Šta kao rezultat daju sledeće instrukcije:
not
ax
inc ax
pod uslovom da je u registru ax upisan ceo neoznačen
broj.
Rešenje:
Instrukcija not ax negira svaki bit u
registru ax a dodavanjem na kraju jedinice (inc ax) dobićemo komplement 2 datog
broja u registru.
U slučaju da
je bio označen broj u registru ax onda bi instrukcije:
dec ax
not ax
dale ceo broj od
njegovog komplementa 2.
ZADATAK 9:
Neka su date sledeće instrukcije:
mov al, 66
mov cx, 2
a1:
ror al,1
loop a1
inc al
Koji će biti broj
upisan u registar al.
Rešenje:
Broj 66 u binarnom
obliku je 01000010. Iz instrukcija se vidi da će biti izvrešena dvostruka
rotacija u desno registra al pa je njegov sadržaj:
00100001 - posle prve rotacije
10010000
- posle druge
+ 1
(inc al)
------------------
10010001
(budući da je označen)
-
- 1
-------------------
10010000
01101111=111 decimalno
ZADATAK 10:
Neka je data promenljiva niz sa elementima -12, 44,17, 11, -13. Napiši program kojim će biti
prebrojan ukupan broj negativnih elemenata i taj broj upiši u memorijsku
lokaciju brneg. Brojevi su zapisani
u data segmentu na nivou bajta.
Rešenje:
Program za rešenje ovog
zadataka je:
Title
zad10
sseg
segment stack
db 256 dup (?)
sseg
ends
dseg
segment
niz
db -12, 44, 17, 11, -13
por1
db 'broj negativnih :'
brneg
db ?
dseg
ends
cseg
segment
assume
cs:cseg, ds:dseg, ss:sseg
zad10
proc far
;
push ds
mov
ax, 0
push ax
;
mov
bx, dseg
mov
ds, bx
;
mov brneg, 0
mov cx, 5
mov si, 0
a1:
mov al, niz[si]
cmp al, 0
jge a2
add brneg, 1
a2: inc si
loop a1
ret
;
zad10 endp
cseg ends
end zad10
Iz
programa se vidi da smo na početku poništili memorijsku lokaciju brneg, stavili
brojač na 5(pet članova niza) i indeks registar si na nulu kako bi počeli
ispitivanje od prvog člana. Nakon toga smo u registar al upisivali element niza
i ispitivali da li je veći ili jednak nuli. Ako jeste išli smo na sledeći član
inače uvećavali smo broj negativnih za 1 (add brneg, 1).
ZADATAK 11:
Neka je data promenljiva niz sa elementima 11, 22, 8, 98, 102, 13. Napiši program kojim će
biti prebrojan ukupan broj parnih brojeva u nizu i taj broj upiši u memorijsku
lokaciju brpar. Brojevi su zapisani
u data segmentu na nivou bajta.
Rešenje:
Program za rešenje ovog
zadataka je:
Title
zad11
sseg
segment stack
db 256 dup (?)
sseg
ends
dseg
segment
niz
db 11, 22, 8, 98, 102, 13
por1
db 'broj parnih :'
brpar
db ?
dseg
ends
cseg
segment
assume
cs:cseg, ds:dseg, ss:sseg
zad11
proc far
;
push ds
mov
ax, 0
push ax
;
mov
bx, dseg
mov
ds, bx
;
mov brpar, 0
mov cx, 6
mov si, 0
a1:
mov al, niz[si]
mov bl, 2
div bl
cmp ah, 0
ja a2
add brpar, 1
a2: inc si
loop a1
ret
;
zad11 endp
cseg ends
end zad11
Suština
rešenja ovog zadatka je slična prethodnom stom razlikom što ispitujemo da li je
član niza paran ili nije (div bl). Ako je paran lokaciju blpar uvećavamo za 1.
ZADATAK 12:
Neka je data promenljiva niz sa elementima 11, 22, 8, 98, 102, 13. Napiši program kojim će
biti formiran niz1 od elemenata niza
koji su veći od 20. Brojevi su zapisani u data segmentu na nivou bajta.
Rešenje:
Program za rešenje ovog
zadataka je:
Title zad11
sseg
segment stack
db 256 dup (?)
sseg
ends
dseg
segment
niz
db 11, 22, 8, 98, 102, 13
por1
db 'novi niz :'
niz1
db 6 dup (?)
dseg
ends
cseg
segment
assume
cs:cseg, ds:dseg, ss:sseg
zad12
proc far
;
push ds
mov
ax, 0
push ax
;
mov
bx, dseg
mov
ds, bx
;
mov cx, 6
mov si, 0
mov di, 0
a1:
mov al, niz[si]
cmp al, 20
jbe a2
mov niz1[di], al
inc di
a2: inc si
loop a1
ret
;
zad12 endp
cseg ends
end zad12
Iz
rešenja se vidi da smo rezervisali prostor za niz1 od 6 bajta. Na početku
programa oba indeksa si i di su postavljena na nulu. Ako je broj veći od
dvadest taj član niza se upisuje u niz1 a istovremeno uveća odredišni indeks za
1.
ZADATAK 13:
Neka su data dva
niza ito: niz sa elementima 11, 22, 8, 98, 102, 13 i niz1 sa lementima 7, 33,
8, 21,102, 67. Napiši program kojim će biti prebrojan ukupan broj istih brojeva
u obadva niza na istoj pozicij i taj broj upiši u memorijsku lokaciju bristi. Brojevi su zapisani u data
segmentu na nivou bajta.
Rešenje:
Program za rešenje ovog
zadataka je:
Title
zad11
sseg
segment stack
db 256 dup (?)
sseg
ends
dseg
segment
niz
db 11, 22, 8, 98, 102, 13
niz1
db 7, 33, 8, 21, 102, 67
por1
db 'broj isti :'
bristi
db ?
dseg
ends
cseg
segment
assume
cs:cseg, ds:dseg, ss:sseg
zad13
proc far
;
push ds
mov
ax, 0
push ax
;
mov
bx, dseg
mov
ds, bx
;
mov cx, 6
mov si, 0
mov bristi, 0
a1:
mov al, niz[si]
cmp al, niz1[si]
jne a2
add bristi, 1
a2: inc si
loop a1
ret
;
zad13 endp
cseg ends
end zad13
Suština rešenja
ovog zadatka se nalazi u uzimanju jednog po jednog člana niza i njihovom
ispitivanju da li su jednaki. Ako su jednaki lokacija bristi se uvaćava za 1. Jasno je da je rezultat 2(isti su članovi 8
i 102).
ZADATAK 14:
Neka su data dva
niza ito: niz sa elementima a1, a2, a3, a4, a5, i a6 (11, 22, 8, 98, 102,
13) i niz1 sa elementima b1, b2, b3, b4,
b5 i b6 (7, 33, 8, 21,102, 67). Napiši program kojim će biti formiran niz2 kao:
a1, b1, a2, b2, ... a6, b6.
Brojevi su zapisani u data segmentu na nivou bajta.
Rešenje:
Program za rešenje ovog
zadataka je:
Title
zad14
sseg
segment stack
db 256 dup (?)
sseg
ends
dseg
segment
niz
db 11, 22, 8, 98, 102, 13
niz1
db 7, 33, 8, 21, 102, 67
por1
db 'novi niz :'
niz2
db 12 dup (?)
dseg
ends
cseg
segment
assume
cs:cseg, ds:dseg, ss:sseg
zad14
proc far
;
push ds
mov
ax, 0
push ax
;
mov
bx, dseg
mov
ds, bx
;
mov cx, 6
mov si, 0
mov di, 0
a1:
mov al, niz[si]
mov niz2[di], al
inc di
mov al, niz1[si]
mov niz2[di], al
inc di
a2: inc si
loop a1
ret
;
zad14 endp
cseg ends
end zad14
Rešenje zadatka se nalazi u tome da se posle učitavanja
elementa niza a u niz2 uveća za jedan odredišni indeks, a zatim uzima odgovarjući
element iz niza b i premešta u niz2, kada se tako|e uveđa za jedan odredišni
indeks.
ZADATAK 15:
Neka je dat niz sa elementima 11, 131, -456, 1234,
-12, 567, 1050. Napiši program kojim će biti sabrani njegovi članovi i taj broj
upiši u memorijsku lokaciju zbir.
Brojevi su zapisani u data segmentu na nivou reči.
Rešenje:
Program za rešenje ovog
zadataka je:
Title
zad15
sseg
segment stack
db 256 dup (?)
sseg
ends
dseg
segment
niz
dw 11, 131, -456, 1234, -12, 567, 1050
por1
db 'zbir je :'
zbir
dw ?
dseg
ends
cseg
segment
assume
cs:cseg, ds:dseg, ss:sseg
zad15
proc far
;
push ds
mov
ax, 0
push ax
;
mov
bx, dseg
mov
ds, bx
;
mov cx, 7
mov si, 0
mov zbir, 0
a1:
mov ax, niz[si]
add zbir, ax
add si, 2
a2:
loop a1
ret
;
zad15 endp
cseg ends
end zad15
Rešenje zadatka je prosto. U memorijsku lokaciju zbir sabiramo članove niza. Budući da
su brojevi upisani na nivou reči to se izvorišni indeks mora uvećavati za dva.
Inače je traženi zbir 2525=9DD(heksa).
ZADATAK 16:
Neka
je data niska znakova definisana u data segmentu. Napisati program koji će:
a) &nbs