Zadatsak: Objasnniti kod na asemblerskom jeziku. SP registar je inicijalno postavlen na 50.
Prikazati u svakom koraku sadrzaj memorijske lokacije u magacin na koji ukazuje SP. Upisati krajnje vrednosti u registre Ax, Bx Cx i Dx. mov ax,6 push ax mov bx,3 push bx mov cx,1 push cx mov dx,8 push dx pop ax pop bx pop dx pop cx odgovor: ax=8, bx=1, cx=3, dx=6
Zadatak. Prevesti sa viseg programskog jezika u asembler: Int x = 10; Int y = 7; Int z = 5;
For i = 1 to 3 { If ( x > y ) z = z + i; Else z = z i; }
pon:
x db 10 y db 7 z db 5 mov dl, z mov bl, 1 mov al, x mov cx, 3 cmp al, y jg skok sub dl, bl jmp kraj
skok: add dl, bl kraj: inc bl loop ponovi mov z, dl
Zadatak. Odrediti maksimalni i minimalni element niza, ako je broj elemenata dat na lokaciji broj, a elementi niza su 16-bitni brojevi. Minimalni i maksimalni element smestiti na memoriske lokacije min i max
Name MinMax Data segment Br1 dw 0af05 Broj db 0 Data ends
;heksadecimalni broj koji pocinje slovom mora imati 0 ispred
Code segment Assume cs:code, ds:data Start: Mov ax, data Mov ds, ax Lea si, niz Mov bx, [si] Mov dx, bx Mov cl, broj Mov ch,0 Petlja: Mov ax, [si] Cmp bx, ax Jna min_je_manji Mov bx, ax min_je_manji: Cmp dx, ax Ja max_je_veci Mov dx, ax Max_je veci: Add si,2 Loop petlja: Mov min, bx Mov max, dx ;uporedjujemo trenutni min sa trenutnim clanom niza ;ako je min manji skacemo ;ukoliko nije njega upisujemo kao minimum ;uporedjujemo trenutno najveci sa sledecim u nizu ;ukoliko je max veci skacemo ; ukoliko nije upisujemo novi max ;ispitivanje sledeceg elementa
Mov ax, 4c02H Int 21h Code ends End start
Zadatak Koridenjem logikih instrukcija odrediti zbir jedinica u zadatom 16-bitnom podatku na lokaciji BR1. Rezultat smestiti na adresu BROJ. Name logika Data segment Br1 dw 0af05 Broj db 0 Data ends Code segment Assume cs:code, ds:data Start: Mov ax, data Mov ds, ax Mov bx, br1
;heksadecimalni broj koji pocinje slovom mora imati 0 ispred
Mov ax,0 Mov dx,0001h Mov cx, 16 Adc al,0 Petlja: And dx, bx Add al, dl Shr bx, 1 mov dx, 0001h loop petlja mov broj, al Mov ax, 4c02H Int 21h Code ends End start
;priprema brojaa ;priprema maske ;priprema petlje ;izdvajamo cifru po cifru ;izdvajanje poslednje cifre ;sabiranje sa 0 ili 1 ;pomeranje podatka u bx za jednp mesto u desno ;ponovo postavljamo masku u dx
Zadatak. Odrediti razliku zbira dva niza 16-bitnih elemenata zadatih na memoriskim adresama niz1 i niz2 pri emu je broj elemenata niza isti i dat na memoriskoj adresi brojel. Rezultat smestiti na memoriskoj adresi RAZLIKA, a zbirove na ZBIR1 i ZBIR2. ....................... Mov si, offset niz1 Mov cl, brojel Mov ch,0 Xor dx, dx Petlja: Add dx, [si] Adc zbir1 + 2, 0 Add si, 2 Loop petlja1 Mov zbir1, dx Lea si, niz2 Mov cl, brojwl Mov ch,0 Xor dx, dx Petlja2: Add dx, [si] Adc zbir2 + 2, 0 Add si,2 Loop petlja Mov zbir2, dx ;oduzimanje Mov ax, zbir2 Sub ax, zbir1 Mov dx zbir2 +2 Sbb dx,0
Sub dx, zbir + 2 Jns rez_poz Neg ax Neg dx Rez_poz: Mov razlika, ax Mov razlika + 2, dx ........................ Zadatak: Za brojeve zadate na memoriskim lokacijma BR1, BR2, BR3, BR4, BR5 izraunati izraz (BR1 + BR2)*BR3 BR4/BR5 Ako su BR3 i BR4 16-bitni, dok su BR1, BR2 i BR5 8-bitni. Predpostaviti da su sva deljenja celobrojna. Name aritmetika Data segment Br1 db 5 Br2 db 10 Br3 dw 2 Br4 dw 20 Br5 db 10 Data ends Code segment Assume cs:code, ds:data Start: Mov ax, data Mov ds, ax Mov ax, br4 Mov cl, br5 Div cl Xor cx, cx Mov cl, al Mov ax,0 Mov al, br1 Add al, br2 Adc ah,0 Mov cx, br3 Mul cx Sub ax, cx Sbb dx,0 Mov ax, 4c02H Int 21h ; izracunavanje br4/br5 ;rezultat je u al, ostatak je u ah
;jer sabiranje 8bitnih podataka moze da ima prenos ;rezultat je u dx:ax ;oduzimanje ;jer oduzimanje moe da bude sa pozjmicom
Code ends End start
Zadatak 1: Dat je tekst koji je zapamcen u memoriji kao niz pocev od lokacije TEXT. Niz se zavrava bajtom 00h. Tekst se sastoji od malih, velikih slova i interpunkcijskih znakova. Napisati program na asemblerskom jeziku kojim se sva mala slova u tekstu konvertuju u velika, a sva velika slova se konvertuju u mala. Ostale karakere ne treba menjati.
name data data
Jun_2005_2 segment TEXT db ' ends prva Recenica. A ovo je druga .', 0h
code segment assume cs:code, ds:data start: mov ax,data mov ds,ax lea mov mov sub slova petlja: mov al, [si] cmp al, 0 je kraj ; provera da li je kraj niza si, ah, al, ah, TEXT 'a' 'A' al ; adresa prvog elementa niza ; u ah je razlika izmedju malog i odgovarajuceg velikog
cmp al, 'A' jb preskok ; nije slovo u pitanju cmp al, 'Z' ja mozdamalo ;nije veliko slovo u pitanju add al, ah ;konverzija u malo slovo jmp upis mozdamalo: ; ovde dosao zato sto je vece od 'Z' cmp al, 'a' jb preskok ; nije slovo u pitanju cmp al, 'z' ja preskok ; nije slovo u pitanju sub al, ah ;konverzija u veliko slovo upis: mov [si], al preskok: inc si jmp petlja kraj: code mov ah,4Ch int 21h ends
end
start
Zadatak: Napisati asemblerski program za izraunavanje izraza: (1*2 + 2*3 + 3*4 + ... + (n-1)*n) / (n*n) pri emu je n 8-bitni broj zadat na lokaciji N, proizvodi su 16-bitni brojevi, a zbir proizvoda je 32-bitni broj. Rezultat deljenja smestiti na lokaciju REZ, a ostatak na lokaciju OST. NAPOMENA: Nije dozvoljeno koridenje pomodnih memorijskih lokacija.
ame data Mart_2001_1 segment N db 5 REZ dw ? OST dw ? ends
data
code segment assume cs:code,ds:data start: mov ax,data mov ds,ax mov cl,N mov ch,0 dec cx xor dx,dx xor bp,bp petlja: mov al,cl mov bl,al inc bl mul bl add dx,ax adc bp,0 loop petlja mov al,N mul al mov bx,ax mov ax,dx mov dx,bp div bx mov REZ,ax mov OST,dx mov ah,4Ch int 21h ends start ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; (cl)=n (cx)=n (cx)=n-1 (dx)=0 (bp)=0 (al)=k (tekuci korak) (bl)=k (bl)=k-1 (ax)=k*(k-1) (dx)=(dx)+(ax) (bp)=(bp)+carry Skok ako je (cx)<>0 (al)=n (ax)=n*n (bx)=n*n u AX je niza rec zbira u DX je visa rec zbira (ax)=(dx:ax)div(bx),(dx)=(dx:ax)mod(bx)
code end
Zadatak: Dat je niz pakovanih BCD cifara na lokaciji NIZ. Kraj niza je oznaen binarnom etvorkom 1111. Napisati program na asemblerskom jeziku koji zadati niz prevodi u 32-bitni binarni broj na lokaciji BR.
name data data Mart_2001_2 segment NIZ db 12h,34h,56h,78h,0F0h BR dd ? ends
code segment assume cs:code,ds:data start: mov ax,data mov ds,ax xor ax,ax ; (ax)=0 - u AX je niza rec bin. broja xor cx,cx ; (cx)=0 - u CX je visa rec bin. broja mov di,10 ; koristi se kod mnozenja lea si,NIZ ; (si)=offset(NIZ) mov bl,NIZ[si] ; u BL se smesta k-ti bajt inc si ; (si)=(si)+1 - priprema za sledeci prolaz mov bh,bl ; pravi se kopija u BH shr bl,1 ; shiftuje u desno cetiri puta shr bl,1 shr bl,1 shr bl,1 ; posmatramo prvu BCD cifru u bajtu cmp bl,0Fh ; da li je to kraj niza je kraj ; ako jeste 1111 izlazi iz petlje ; OBRADA PRVE BCD CIFRE IZ UCITANOG BAJTA mul di ; (dx:ax)=(ax)*10 mov bp,ax ; prvi kopiju reg. AX u BP mov ax,cx ; CX ide u AX mov cx,dx ; rezultat iz DX je deo nove vise reci broja mul di ; mnozi staru visu rec sa 10 (dx:ax) add cx,ax ; (cx)=(cx)+(ax) mov ax,bp ; vraca nizu rec u AX (ostalo se odbacuje) add al,bl ; dodaje tekucu cifru adc ah,0 ; visem bajtu nize reci dodaje prenos adc cx,0 ; visoj reci dodaje eventualni prenos ; OBRADA DRUGE BCD CIFRE IZ UCITANOG BAJTA mov bl,bh ; kopira sacuvani bajt iz BH u BL and bl,0Fh ; postavlja visi polubajt na 0000 cmp bl,0Fh ; ispituje da li je to 1111 je kraj ; ako jeste izlazi iz petlje mul di ; mozenje je identicno kao malopre mov bp,ax mov ax,cx mov cx,dx mul di add cx,ax mov ax,bp add al,bl adc ah,0 adc cx,0 jmp lab ; bezuslovni skok na pocetak petlje mov word ptr BR,ax ; puni nizu rec u mem. iz AX
lab:
kraj:
mov word ptr BR+2,cx mov ah,4Ch int 21h ends start
; puni visu rec u mem. iz CX
code end
Zadatak: Napisati program na asemblerskom jeziku za izracunavanje izraza: ( 1! / 1 ) + ( 2! / 2 ) + ( 3! / 4 ) + . . . + ( n! / 2n-1 ) pri cemu je N osmobitni broj. Faktorijele tretirati kao 32-bitne brojeve, stepene broja dva kao 16-bitne brojeve. Dobijeni rezultat (32-bitni broj) smestiti na lokaciju REZ. Maksimizovati brzinu izvravanja programa.
name data data
Jun_2003_1 segment N db 9 REZ dd ? ends
code segment assume cs:code,ds:data start: mov ax,data mov ds,ax mov si, 1 xor di,di mov cl,1 xor ch,ch ; u SI je nizi 16-bitni deo faktorijela ; u DI je visi 16-bitni deo faktorijela ; pamti k, za racunanje faktorijela ; i CX = k takodje
petlja: mov ax, si ; treba pomnoziti 32b faktorijel (DI:SI) sa k (CX). Dva parcijalna proizvoda, koji se saberu mul cx ; prvi parcijalni proizvod u dx:ax mov bx, ax ; BP:BX privremeno cuva faktorijel mov bp, dx mov ax, di ; gornja rec faktorijela se mnozi mul cx add bp, ax ; donja rec drugog parc. proizvoda + gornja rec prvog parc. proizvoda. Gornja rec drugog parc. proizv. se odbacuje, po uslovu zadatka mov si, bx ; faktorijel spreman za sledecu iteraciju mov di, bp mov ax, cx ; u petlji cemo 32-bitni faktorijel dvojke. deljenje: sub ax, 1 ; petlja ce se ponavljati k-1 puta jz dalje deliti stepenom
rcr bp, 1 rcr bx, 1 jmp deljenje dalje: add word ptr REZ, bx adc word ptr REZ+2, bp inc cx cmp cl, N jle petlja mov ah,4Ch int 21h ends start
code end
Zadatak: Napisati program na asemblerskom jeziku koji od zadatog 32-bitnog broja zadatog poev od memorijske lokacije BROJ oduzima sve elemente niza 16-bitnih elemenata zapamdenog poev od memorijske lokacije NIZ. Broj elemenata niza je osmobitni broj zapamden na memorijskoj lokaciji N. Rezultat smestiti poev od memorijske lokacije BROJ. (15 poena) name oduz data segment broj dd 00010000h niz dw 1, 2, 3 n db 3 data ends code segment assume cs: code, ds: data start: mov ax, data mov ds, ax mov ax, word ptr broj mov dx, word ptr broj+2 mov cl, n xor ch, ch xor si, si petlja: sub ax, niz[si] sbb dx, 0 add si, 2 loop petlja mov word ptr broj, ax mov word ptr broj+2, dx code ends end start
Zadatak: Sabrati niz od K rei koje poinju od adrese RECI a rezultat tipa dupla re smestiti na lokaciju ZBIR. name zbir data segment reci dw 5 dup(1,2,3,4,5) k dw 25 zibr dd 0 data ends code segment assume cs: code, ds:data start: mov ax, data mov ds, ax mov cx, k mov ax, 0 mov si, ax lab1: add ax, reci[si] adc dx, 0 add si, 2 loop lab1 mov word ptr zbir, ax mov word ptr zbir+2, dx code ends end start
Zadaci za samostalno vebanje
Zadatak Odrediti broj pojavljivanja broja 25 u nizu elementa, zadatom na lokaciji niz i zameniti sva ta pojavljivanja brojem 50. Elementi niza su 16-bitni. Zadatak Odrediti zbir elemenata niza zadatog na memoriskoj lokaciji niz, pri emu je broj elemenata niza dat na lokaciji broj. Elementi niza su 32-bitni. Zbir elemenata treba smestiti na memoriskoj adresi zbir. Zadatak. Odrediti zbir elementata niza 16-bitnih elemenata zadatog na memoriskoj lokaciji niz, pri emu je dato da se niz zavrava elementom #. Zadatak Odrediti broj elemenata 16-bitnog niza koji se nalazi na memoriskoj adresi niz koji su manji od 100 i vedi od 10. Zadatak. Koridenjem logikih instrukcija odrediti broj nula u zadatom 16-bitnom podatku na lokaciji BR1. Rezultat smestiti na adresu BROJ.
Zadatak: Napisati program na asembleru koji sabira sve elemente niza a zatim dobijeni rezlutat oduzeti od vrednosti 50.Rezlutat sauvati u promenjivoj Rez. Elementi niza su: 56,34,200,23,69,100. Zadatak. Kopirati sve parne elemente niza Niz u drugi niz pom; Zadatak: Napisati program na asembleru koji odredjuje maksimalni i minimalni element niza a zatim oduzeti te dve vrednosti i rezlutat smesiti u promenjivoj REZ. Elementi niza su: 56,34,200,23,69,100. Zadatak. Napisati deo koda koji sabira podatke na memoriskim lokacijama DS:0001 i DS:0002 i smeta ih na lokaciju DS:001h. Zadatak: Sabrati dva 32 bitna broja x i y i smestiti rezultat na lokaciju z. Zadatak. Izraunati izraz x = A/B/C, svi operandi su 16-bitni neoznaeni brojevi. Rezultat treba da bude ceo broj, zanemariti ostatke koji nastanu pri deljenju.
Zadatak:Objasnniti kod na asemblerskom jeziku. SP registar je inicijalno postavljen na 500. Stack segment Bos dw 100 dup(?) Tos label word Stack ends Code segment: Start: Assume ss:stack Mov ax, stack Mov ss, ax Lea sp, tos
mov ax,1 push ax mov bx,2 push bx pop ax pop bx Code ends
Zadatak: Dat je kod na asemblerskom jeziku. Objasniti ulogu svake instrukcije i napisati krajnji rezlutat programa za promenjive pod1, pod2 i pod3
Niz db 10,2,8,3,6 Pod1 db ? Pod2 db ? Pod3 db ? Mov bx,offset niz Mov dl,[bx] Mov al,[bx] Mov cx,4 Inc bx Petlja: Cmp al,[bx] Jg Skok Mov al,[bx] Skok: Cmp dl,[bx] Jl Manji Mov dl,[bx] Manji Inc bx Loop Petlja Add al,dl Mov pod3,al Zadatak: Iskaz na visem programskom jeziku prevesti na asembler. x=100,y=200 For i= 1 to 5 { If(x<y) { x=x+1 { Else { y=y-1
} x++ y++ } rez=x+y
Zadatak: Iskaz na visem programskom jeziku prevesti na assembler. X=30; Y=20; For i= 1 to 5 { If(x<y) { Z= x+i { Else { Z=y-i } } Zadatak:. Napisati program koji pronalazi najmanji element niza. Niz sadrzi sledece cifre 5,10,11,50,100,3.