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)
Premestiti string iz data segmenta u ekstra segment
b)
Odrediti dužinu niske
c)
Napisati zadatu nisku naopako
d)
Odrediti ukupan broj slova u jednoj i drugoj niski koja su na istom
mestu jednaka.
Niska se završava znakom '$' koji ne ulazi u
njenu dužinu.
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.
Opisaćemo ukratko glavne programske procedure.
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.
TITLE prog16; Instrukcije za rad sa niskama
;
sseg segment stack
db 256
dup (?) ;Rezervisanje prostora za stek
sseg ends
;
eseg segment
str0 db 20 dup(?) ;Niska u ES
str1 db 19 dup(?) ;Niska napisana obrnuto
estr1 db '$'
eseg ends
;
dseg segment
str db 'Ovo je zadata
niska$' ;Zadata niska u DS
poruka0 db 'Zadata niska u DS
je : $'
;Poruka
poruka db 'Duzina date niske
je : $'
;Poruka
duz db 1 dup(?) ;Polje za duzinu
pp0 db ' $'
poruka1 db 'Niska napisana
obrnuto : $' ;Poruka
pp1 db ' $'
poruka2 db 'Broj slova na ist.
mes.: $' ;Poruka
brs
db 1 dup(?)
;Polje za broj isti
pp2 db ' $'
dseg ends
;
cseg segment
;
assume cs:cseg, ds:dseg, ss:sseg, es:eseg
;
niska proc far
;
push
ds ;Povratna adresa
segmenta ide u stek
mov ax, 0
push
ax ;Nula-povratna adresa
ide u stek
mov bx, dseg
mov ds, bx
mov bx, eseg ;Inicijalizacija ekstra segmenta
mov es, bx
mov ah,
00 ;Postavljanje video moda
mov al,
3
int 10h
mov ah,
11 ;Postavljanje palete boja
mov bh,
0
mov bl,
4
int 10h
call
prenos ;Poziv procedure za
prenos iz DS u ES
mov
dh, 10
mov dl, 15
call pozicija
mov dx, offset poruka0
call prikaz
mov bx, eseg
mov ds, bx
mov dx, offset str0
call prikaz ;Prikaz prenesene niske
mov
bx, dseg
mov ds, bx
mov bx, eseg
mov es, bx
mov dh, 12
mov dl, 15
call
pozicija
mov dx, offset poruka
call
prikaz ;Stampanje poruke
call
duzina ;Poziv procedure za
duzinu
xor ah, ah
mov al, duz
call
stampa ;Stampanje duzine
niske
mov dh, 14
mov dl, 15
call
pozicija
mov dx, offset poruka1
call
prikaz
call
obrnut ;Poziv procedure za
obrnuta slova
mov bx, eseg
mov ds, bx
mov dx, offset str1
call
prikaz ;Prikaz obrnute niske
mov bx, dseg
mov
ds, bx
mov bx, eseg
mov es, bx
mov dh, 16
mov dl, 15
call
pozicija
mov dx, offset poruka2
call
prikaz
call isti ;Poziv procedure za ista slova
xor ah, ah
mov al, brs
mov duz, al ;Broj ostih ide u ax
call
stampa ;Stampanje broja
istih
mov dh, 23
mov dl, 00
call pozicija
ret
niska endp
;
;-------------------------------------------
; Prenos
niske u ekstra segment |
;-------------------------------------------
prenos proc
near
lea si,
str
lea di,
es:str0
mov cx,
20
rep movsb
str0, str
ret
prenos endp
;
;-------------------------------------------
;
Odredjivanje duzine niske
|
;-------------------------------------------
duzina proc
near
push ax
push di
lea di, es:str0
cld ;Brise se fleg pravca
mov al, '$' ;Ogranicavac niske ide u al
xor cx, cx ;Brise se cx
cik:
mov bl, [di] ;Jedan znak ide u bl
scasb
je gotovo
inc ch ;Ako nije uvecaj cx i uzmi novi znak
jmp cik
gotovo:
mov duz, ch ;Pamti se duzina niske
pop di ;Vracanje registara sa steka
pop ax
ret
duzina endp
;
;-------------------------------------------
; Prenos
niske u obrnutom redosledu |
;-------------------------------------------
obrnut proc
near
push ax
push di
push si
mov cx, 19
mov si, 0
mov di, 18
cik1: mov al,
str[si]
mov str1[di], al ;Dan znak ide u bl
dec di
inc si ;Ako nije uvecaj cx i uzmi novi
znak
loop cik1
gotovo1:pop
si
pop di ;Vracanje registara sa steka
pop ax
ret
obrnut endp
;-------------------------------------------
; Procedura
za trazenje istih slova |
;-------------------------------------------
isti proc near
push ax
push di
push si
cld ;Brise se
fleg pravca
xor dx, dx
mov cx, 19
mov si, 0
mov di, 0
pon2: lods
str[si]
cmp al, str1[di]
je pon3
jmp pon4
pon3:
inc dh
pon4:
inc di
loop
pon2
mov brs, dh
pop si
pop di ;Vracanje registara sa steka
pop ax
ret
isti endp
;
include bibl1.asm
cseg ends
end niska