ARHITEKTURA
===========

*) OPSTE INFORMACIJE

-- 32-bitni RISC procesor (32-bitni registri, 32-bitne magistrale podataka i adresa).
-- Little endian arhitektura

*) SKUP REGISTARA:

-- 16 32-bitnih registara opste namene: r0-r15
-- 32bitni programski brojac: PC
-- 4bitni statusni registar: PSW

*) SKUP INSTRUKCIJA:

-- INSTRUKCIJE ZA MEMORIJSKE TRANSFERE:

LDR  reg, adr24 // (ucitava vrednost sa adrese u registar
LDC  reg, c24   // (ucitava konstantu)
STR  reg, adr24 // (cuva registar na datu adresu)
LDI dest_reg, adr_reg // (ucitava vrednost sa adrese koja je sadrzana u
                          adr_reg)
STI dest_reg, adr_reg // (cuva vrednost registra na adresu koja je
                      //  sadrzana u adr_reg)

KODIRANJE:
       adr + 3  adr + 2   adr + 1   adr
  LDR: aaaaaaaa aaaaaaaa aaaaaaaa 0000rrrr
  LDC: cccccccc cccccccc cccccccc 0001rrrr
  STR: aaaaaaaa aaaaaaaa aaaaaaaa 0010rrrr
  LDI: 00000000 00000000 aaaadddd 10110000  
  STI: 00000000 00000000 aaaadddd 10110001

-- ARITMETICKO LOGICKE INSTRUKCIJE:

MOV r1, r2    // (r1 = r2)
ADD r1, r2    // (r1 += r2)
ADC r1, r2   // (r1 += r2 + CF)
SUB r1, r2    // (r1 -= r2)
SHL r1, r2    // (r1 <<= r2)
SHR r1, r2    // (r1 >>= r2)
SAR r1, r2    // (r1 >>>= r2)
AND r1, r2    // (r1 &= r2)
OR  r1, r2    // (r1 |= r2)
XOR r1, r2    // (r1 ^= r2)
CMP r1, r2    //  (r1 - r2)
TST r1, r2   // (r1 & r2)

KODIRANJE:
     adr + 3  adr + 2   adr + 1   adr
MOV: 00000000 00000000 ssssdddd 10000000   
ADD: 00000000 00000000 ssssdddd 10000001 
ADC: 00000000 00000000 ssssdddd 10000010 
SUB: 00000000 00000000 ssssdddd 10000011 
SHL: 00000000 00000000 ssssdddd 10000100 
SHR: 00000000 00000000 ssssdddd 10000101 
SAR: 00000000 00000000 ssssdddd 10000110 
AND: 00000000 00000000 ssssdddd 10000111 
OR:  00000000 00000000 ssssdddd 10001000 
XOR: 00000000 00000000 ssssdddd 10001001 
CMP: 00000000 00000000 ssssdddd 10001010 
TST: 00000000 00000000 ssssdddd 10001011 


-- INSTRUKCIJE SKOKA SA RELATIVNOM ADRESOM

JMP adr24   // bezuslovni skok    
JE  adr24   // skace ako je =    
JNE adr24   // skace ako je !=
JA  adr24   // skace ako je > (neoznaceno)
JB  adr24   // skace ako je < (neoznaceno)
JAE adr24   // skace ako je >= (neoznaceno)
JBE adr24   // skace ako je <= (neoznaceno)
JL  adr24   // skace ako je < (oznaceno)
JG  adr24   // skace ako je > (oznaceno)
JLE adr24   // skace ako je <= (oznaceno)
JGE adr24   // skace ako je >= (oznaceno)

KODIRANJE:
     adr + 3  adr + 2   adr + 1   adr
JMP: aaaaaaaa aaaaaaaa aaaaaaaa 01000000 
JE:  aaaaaaaa aaaaaaaa aaaaaaaa 01000001 
JNE: aaaaaaaa aaaaaaaa aaaaaaaa 01000010   
JA:  aaaaaaaa aaaaaaaa aaaaaaaa 01000011   
JB:  aaaaaaaa aaaaaaaa aaaaaaaa 01000100   
JAE: aaaaaaaa aaaaaaaa aaaaaaaa 01000101   
JBE: aaaaaaaa aaaaaaaa aaaaaaaa 01000110   
JG:  aaaaaaaa aaaaaaaa aaaaaaaa 01000111   
JL:  aaaaaaaa aaaaaaaa aaaaaaaa 01001000   
JGE: aaaaaaaa aaaaaaaa aaaaaaaa 01001001   
JLE: aaaaaaaa aaaaaaaa aaaaaaaa 01001010   

-- INSTRUKCIJE SKOKA SA ADRESOM U REGISTRU

Znacenje ovih instrukcija je analogno prethodnim,
ali se (apsolutna) adresa zadaje u nekom registru

JMPI reg
JEI  reg       
JNEI reg
JAI  reg
JBI  reg
JAEI reg
JBEI reg
JLI  reg
JGI  reg
JLEI reg
JGEI reg

KODIRANJE:

       adr + 3  adr + 2   adr + 1   adr
JMPI: 00000000 00000000 rrrr0000 11000000 
JEI:  00000000 00000000 rrrr0000 11000001 
JNEI: 00000000 00000000 rrrr0000 11000010 
JAI:  00000000 00000000 rrrr0000 11000011 
JBI:  00000000 00000000 rrrr0000 11000100 
JAEI: 00000000 00000000 rrrr0000 11000101 
JBEI: 00000000 00000000 rrrr0000 11000110 
JGI:  00000000 00000000 rrrr0000 11000111 
JLI:  00000000 00000000 rrrr0000 11001000 
JGEI: 00000000 00000000 rrrr0000 11001001 
JLEI: 00000000 00000000 rrrr0000 11001010 


-- INSTRUKCIJA ZAUSTAVLJANJA:

HALT // prekida rad procesora, tj. dovodi ga u zavrsno stanje

KODIRANJE:
      adr + 3  adr + 2   adr + 1   adr
HALT: 00000000 00000000 00000000 11111111


*) FLEGOVI PROCESORA (REGISTAR PSW)

Azuriraju se samo prilikom izvrsavanja aritmetickih instrukcija

   -- z: aktivira se kada je rezultat operacije 0
   -- s: aktivira se kada je najvisi bit rezultata 1
   -- o: aktivira se kada se detektuje oznaceno prekoracenje
         pri sabiranju, oduzimanju i pomeranju u levo
   -- c: aktivira se kada se detektuje prekoracenje pri
         sabiranju, oduzimanju, kao i kada je poslednji
	 istisnuti bit prilikom pomeranja jednak 1
   

*) PRIMER PROGRAMA U ASEMBLERU DATOG PROCESORA

Sledeci primer racuna maksimum niza brojeva koji je
konstantno zadat u data sekciji svojom adresom (array).
Napomenimo da se instrukcija oblika:

ldc r1, array

cesto ne moze prevesti kao jedna masinska instrukcija, jer nama treba
apsolutna adresa, a instrukcija moze sadrzati samo 24-bitnu konstantu
koja moze biti pomeraj u odnosu na adresu tekuce instrukcije.
Zbog toga asembler ovu instrukciju prevodi u niz instrukcija kojima
se najpre ucita neka manja konstanta na osnovu koje se aritmetickim
instrukcijama preracunava apsolutna adresa.

.data

array: .int 5, 2, 7, 12, -5, 8, 1

result: .int 0

.text

start:
    ldc r1, array # ucitavamo adresu pocetka niza
    ldc r2, 7 # ucitavamo duzinu niza
    ldc r3, 0 # ucitavamo 0 u r3 (zbog poredjenja)
    ldc r5, 4 # ucitacamo 4 u r5 (zbog dodavanja)
    ldc r6, 1 # ucitavamo 1 u r6

    ldi r4, r1 # ucitavamo *r1, tj. 0-ti elem. niza 
    add r1, r5  # r1+=4
    sub r2, r6  # r2--
sledeci:
    cmp r2, r3    # ako je r2 == 0
    je poslednji

    ldi r8, r1 # ucitavamo *r1, tj. tekuci elem.

    cmp r8, r4  # poredimo tekuci i najveci
    jg veci
    jmp preskoci
veci:
    mov r4, r8  # ako je veci, sada je on novi najveci
preskoci:
    add r1, r5  # r1+=4
    sub r2, r6  # r2--
    jmp sledeci
poslednji:
    str r4, result
    halt

Jednostavan primer koji sabira dva cela broja:

.data
x: .int 6
y: .int 11
z: .int 0
.text
start:
   ldr r0, x
   ldr r1, y
   add r0, r1
   str r0, z
   halt

Izracunavanje maksimuma dva broja:

.data
x: .int 6
y: .int 11
z: .int 0
.text
start:
   ldr r0, x
   ldr r1, y
   cmp r0, r1
   jl Y
   jmp X
Y:
   mov r0, r1
X:
   str r0, z 
   halt


*) ORGANIZACIJA PROCESORA

Procesor ima:

-- dve interne 32-bitne magistrale za transfer podataka (A i B)
-- 32-bitnu ALU jedinicu 
-- 32-bitni registar MAR koji je povezan na magistralu adresa
-- 32-bitni registar MDR koji je povezan na magistralu podataka
-- Kolo sa registrima opste namene
-- Instrukcioni 16-bitni registar IR (sadrzi OPC i kodove registara po potrebi)
-- 32-bitni PC registar
-- 4-bitni PSW registar
-- 32-bitni AC registar (akumulator za privremeno cuvanje rezultata ALU jedinice)
-- Kontrolnu jedinicu
