Zadaci rađeni na redovnom dvočasu 7.12.2006.

IIIe - ZA KONTROLNI pogledati SVE zadatke

 

1. NAP (napisati asemblerski program) koji unosi broj sa ulaza i ispisuje ga u izlazni prozor(output prozor u programu SIMx86).

 

GET  ;upisuje broj sa ulaza u AX

PUT  ;upisuje program iz AX u izlaz

 

RESENJE:

GET

PUT

HALT

 

Uporedite sa C kôdom:

#include <stdio.h>

main()

{

    unsigned a;

    scanf(“%u”, &a);

    printf(“%u”,a);

}

 

2. NAP  koji unosi broj sa ulaza i ispisuje ga u  memorijske lokacije (1000)16

 

GET

MOV [1000],AX

HALT

 

Kako bi ovo uradili u C-u? Moze li to?

 

3. NAP  koji unosi broj sa ulaza i ispisuje broj za 15 veci u izlazni prostor. Ne zaboravite (15)10 = (F)16

 

 

GET

ADD AX,f

PUT

HALT

 

4. NAP koji ispisuje u izlazni prostor broj za 15 veci od broja koji se nalazi na memorijskoj lokaciji (1000)16.

 

MOV AX, [1000]

ADD AX,f

PUT

HALT

 

5. NAP koji broj sa memorijske lokacije (1000)16 uvecava za 1.

 

Nekorektno resenje (sintaksna greska u naredbi ADD, jer [1000] nije CPU registar):

 

ADD [1000], 1

HALT

 

Korektno resenje:

MOV AX, [1000]

ADD AX,1

MOV [1000], AX

HALT

 

6. NAP koji sa ulaza unosi dva broja, a na izlaz ispisuje njihov maksimum.

 

GET
MOV BX,AX    ; BX=prviBroj

GET        ; AX=drugiBroj

CMP AX, BX   ; rez=prviBroj-drugiBroj

JA k                 ; if (rez >0) goto a;  tj, ispisi AX, tj. ispisi drugiBroj

MOV AX, BX   ; else AX=prviBroj

k: PUT             ; ispisi AX

HALT

 

7.  NAP koji poredi sadrzaj sa dve memorijske lokacije (1000)16 i (1002)16 i na izlaz ispisuje veci sadrzaj.

 

MOV AX, [1000]

MOV BX, [1002]

CMP AX,BX

JA k                ; if (AX >BX) goto k

MOV AX, BX   ; else AX=BX

k: PUT           ; ispisi AX

HALT

 

8. NAP koji ispisuje na standardni izlaz 0, ako sadrzaj sa memorijske lokacije [1000] je paran, a u suprotnom ispisuje 1

 

 

IDEJA: Ako je broj AX paran onda test and ax,1 ce dati AX=0, jer se parni broj AX zavrsava sa 0

 

MOV AX, [1000]

and ax,1 ;provera da li broj u ax je paran putem provere najnizeg bita

PUT

HALT

 

9. NAP koji ispisuje na standardni izlaz 1, ako sadrzaj sa memorijske lokacije [1000] je paran, a u suprotnom ispisuje 0

 

 

IDEJA: Ako je broj AX paran onda test and ax,1 ce dati AX=0, jer se parni broj AX zavrsava sa 0

 

MOV AX, [1000]

and ax,1 ;provera da li broj u ax je paran putem provere najnizeg bita

CMP AX,0

JE k  ;tad treba u AX upisati 1 i zavrsiti program

MOV AX,0 ; u suprotnom treba upisati 0 u AX i zavrsiti program

JMP g

k: MOV AX,1

g: PUT

HALT

 

 

10. Sastaviti program za hipotetički procesor x86 koji bi izračunavao vrednost izraza:

            AX:=2*(2a+3b-c)

gde su a, b c simbolička imena za memorijske reči koje se nalaze na adresama 1000, 1002 i 1004.

 

;upotreba registara AX, BX, CX

mov ax,[1000]

mov bx,[1002]

mov cx,[1004]

add ax,ax  ;ax=2a

add ax,bx ;ax=2a+b

add bx,bx; bx=2b

add ax,bx  ;ax=2a+3b

sub ax,cx  ;ax=2a+3b-c

add ax,ax  ;ax=2(2a+3b-c)

halt

 

 

RESENJE br.2

;upotreba registara AX, BX

 

mov bx,[1000]  ;bx=a

add bx,[1002]   ;bx=a+b

add bx,bx       ;bx=2(a+b)

add bx,[1002]   ;bx=2a+3b

sub bx,[1004]   ;bx=2a+3b-c

mov ax,bx        ;ax=2a+3b-c

add ax,ax        ;ax=2(2a+3b-c)

halt

 

 

 

11. Sastaviti program za hipotetički procesor x86 koji bi za ulazne podatke x1, x2 i x3 i izračunavao i prikazivao vrednost izraza:

y = min (x1, x2, x3)

 

get          ;ax=x1

mov bx,ax    ;bx=x1

 

get      ;ax=x2

cmp bx,ax  ;cmp x1,x2

jb a        ;ako x1<x2 labela a

 

mov bx,ax   ;ako x1>=x2, neka bx=min(x1,x2)=x2

a: get      ;ax=x3    

cmp ax,bx   ;cmp x3, min(x1,x2)

jb b         ; ako min=x3 u AXu, skoci na stampu

 

mov ax,bx    ;inace BX cuva min, te premesti ga tako da AX=min(x1,x2,x3)

 

b:put       ;stampaj AX

halt

 

 

12. Sastaviti program za hipotetički procesor x86 koji bi izračunavao vrednost izraza:

            AX:=(a+b)-(c+d)

gde su a, b, c, d simbolička imena za memorijske reči koje se nalaze na adresama 1000, 1002, 1004 i 1006.

 

mov ax,[1000] ; a->ax

add ax,[1002] ; a+b ->ax

sub ax,[1004] ;a+b –c ->ax

sub ax,[1006] ;a+b –c-d ->ax

halt