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