Professional Documents
Culture Documents
MP Zadaci
MP Zadaci
Title zad1
sseg ends
dseg segment
sad1 db ?
dseg ends
cseg segment
inc al
dec bl
add al, bl
ret
zad1 endp
cseg ends
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:
Title zad2
;Definisanje stek-segmenta
sseg ends
dseg segment
broj1 db 77
broj2 db 22
zbir db ?
raz db ?
pro dw ?
del db ?
dseg ends
cseg segment
ret
zad2 endp
cseg ends
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:
Rešenje:
Program za rešenje ovog zadataka je:
Title zad3
;Definisanje stek-segmenta
sseg ends
dseg segment
zbir dw ?
broj db ?
dseg ends
cseg segment
a1:
div bl
je a2
a2:
loop a1
ret
zad3 endp
cseg ends
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:
je a2
a2:
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:
Title zad5
sseg ends
dseg segment
kol1 dw ?
ost1 dw ?
dseg ends
cseg segment
push ds
push ax
ret
zad5 endp
cseg ends
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:
Title zad6
sseg ends
dseg segment
mno dw ?
dseg ends
cseg segment
a1:
loop a1
ret
zad6 endp
cseg ends
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:
Title zad7
sseg ends
dseg segment
brojjed db ?
brojnul db ?
dseg ends
cseg segment
a1:
jc a2
jmp a3
a2:
a3:
loop a1
ret
zad7 endp
cseg ends
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:
+ 1
ZADATAK 8:
Šta kao rezultat daju sledeće instrukcije:
not ax
inc ax
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.
dec ax
not ax
ZADATAK 9:
a1:
loop a1
inc 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:
------------------
- - 1
-------------------
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:
Title zad10
dseg segment
brneg db ?
dseg ends
cseg segment
a1:
jge a2
a2: inc si
loop a1
ret
zad10 endp
cseg ends
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:
Title zad11
sseg ends
dseg segment
brpar db ?
dseg ends
cseg segment
a1:
div bl
ja a2
a2: inc si
loop a1
ret
zad11 endp
cseg ends
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:
sseg ends
dseg segment
dseg ends
cseg segment
;
push ds
a1:
jbe a2
inc di
a2: inc si
loop a1
ret
zad12 endp
cseg ends
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:
Title zad11
sseg ends
dseg segment
bristi db ?
dseg ends
cseg segment
;
mov bx, dseg
a1:
jne a2
a2: inc si
loop a1
ret
zad13 endp
cseg ends
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.
Rešenje:
Title zad14
sseg ends
dseg segment
dseg ends
cseg segment
a1:
inc di
inc di
a2: inc si
loop a1
ret
zad14 endp
cseg ends
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:
Title zad15
sseg ends
dseg segment
zbir dw ?
dseg ends
cseg segment
a1:
loop a1
ret
zad15 endp
cseg ends
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:
d) Odrediti ukupan broj slova u jednoj i drugoj niski koja su na istom mestu jednaka.
REŠENJE:
Budući da se niska mora premestiti iz data segmenta u ekstra segmenat to smo u ovom programu koristili sva četiri
segmenta registra. Za rešenje postavljenog zadataka korišćene su sledeće procedure:
- NISKA glavna programska procedura iz koje se pozivaju ostale i prikazuju dobijeni rezultati.
- PRENOS u kojoj se prenosi niska iz data u ekstra segment.
- DUZINA u kojoj se sračunava dužina niske.
- OBRNUT u kojoj se zadata niska formira naopako.
- ISTI u kojoj se računa broj slova koja su ista na istom mestu.
Procedura PRENOS
U ovoj proceduri se prenosi izvorišna niska(STR) iz data segmenta u odredišnu nisku(STR0) koristeći instrukciju
MOVSB, pri čemu je u registar CX upisana njena dužina. Ispred instrukcije MOVSB nalazi se instrukcija REP koja
ponavlja ovu instrukciju sve dok registra CX ne bude jednak nuli.
Procedura DUZINA
U ovoj proceduri koristimo instrukciju SCAB koja ispituje da li je tekući član niske([SI]) jednak sadržaju registra
AL, u koji smo prethodno upisali identifikaciju kraja niske '$'. U slučaju ako je jednak došli smo do kraja niske i
završavamo navedenu proceduru inače uvećavamo sadržaj registra CH za jedan i uzimamo sledeći član. Registar CH
nam služi kao brojač za sračunavanje njene dužine.
Procedura OBRNUT
U proceduri uzimamo prvi član niske STR i stavljamo ga na zadnje mesto niske STR1, drugi na predzadnji itd.,
dok će njen zadnji član biti premešten na prvo mesto u niski STR1. To smo postigli korićenjem registara SI i DI, pri
čemu se prvi inkrementira, dok se drugi dekrementira nakon izvršenog prenosa člana niske.
Procedura ISTI
U ovoj proceduri instrukcijom LODS prezimamo prvi član zadate niske STR i poredimo ga istim članom niske
napisane obrnuto. Ako su jednaki uvećavamo sadržaj brojača (registar DH), i prelazimo na sledeći član prve i druge
niske. Zbog korišđenja instrukcije LODS automatski je inkrementiran registar SI, dok smo registar DI morali sami
dekrementirati.
sseg ends
eseg segment
eseg ends
dseg segment
dseg ends
cseg segment
ret
niska endp
;-------------------------------------------
;-------------------------------------------
ret
prenos endp
;-------------------------------------------
;-------------------------------------------
push ax
push di
scasb
gotovo:
pop ax
ret
duzina endp
;-------------------------------------------
;-------------------------------------------
push ax
push di
push si
dec di
gotovo1:pop si
pop ax
ret
obrnut endp
;-------------------------------------------
;-------------------------------------------
push ax
push di
push si
pon3: inc dh
pon4:
inc di
pop si
pop ax
ret
isti endp
include bibl1.asm
cseg ends