====== 3. Cvičení - Návrh jednoduché řídicí jednotky procesoru ======
Znění úloh na cvičení je zde: {{courses:A4M36PAP:tutorials:03:03_cviceni_zadani.pdf|}}
\\ \\
\\
Druhá část cvičení - Význam a použití základních instrukcí
Bližší popis instrukcí:
^ Instrukce ^ Syntax ^ Operace ^ Význam ^
| Add | add d,s,t | d = s + t; | Add: Sečte dva registry s + t a výsledek uloží do registru d |
| Addi | addi t,s,C | t = s + C; | Add immediate: Sečte hodnotu v s a znaménkově rozšířenou přímou hodnotu, a výsledek uloží do t |
| Sub | sub d,s,t |d = s - t | Subtract: Odečte znaménkově obsah registru t od s a výsledek uloží do d |
| And | and d,s,t |d = s & t | Logický součin |
| Or | or d,s,t |d = s or t | Logický součet |
| Beq | beq s, t, offset | if s == t go to PC+4+4*offset; else go to PC+4 | Branch on equal: Skáče pokud si registry s a t jsou rovny |
| lw | lw t,C(s) | t = Memory[s + C] | Load word: Načte slovo z paměti a uloží jej do registru t |
| sw | sw t,C(s) | Memory[s + C] = t | Store word: Uloží obsah registru t do paměti |
| lui | lui t,C | t = C << 16 | Load upper immediate: Uloží předanou přímou hodnotu C do horní části registru. Registr je 32-bitový, C je 16-bitová. |
\\
==== Příklady přepisu krátkých fragmentů kódu z jazyka C do asembleru ====
^ Příkaz **//if//** ^^
|
if (i ==j)
f = g + h;
f = f – i;
|
// s0=f, s1=g, s2=h, s3=i, s4=j
bne s3, s4, L1 // Pokud i!=j, skoč na L1
add s0, s1, s2 // if blok: f=g+h
L1:
sub s0, s0, s3 // f = f-i
|
^ Příkaz **//if-else//** ^^
|
if (i ==j)
f = g + h;
else
f = f – i;
|
// s0=f, s1=g, s2=h, s3=i, s4=j
bne s3, s4, else // Když i!=j, skoč na else
add s0, s1, s2 // if blok: f=g+h
j L2 // přeskoč blok else
else:
sub s0, s0, s3 // blok else: f = f-i
L2:
|
^ Cyklus **//while//** ^^
|
int pow = 1;
int x = 0;
while(pow != 128)
{
pow = pow*2;
x = x + 1;
}
|
// s0=pow, s1=x
addi s0, $0, 1 // pow = 1
addi s1, $0, 0 // x = 0
addi t0, $0, 128 // t0 = 128 pro porovnávání
while:
beq s0, t0, done // Když pow==128, ukončení cyklu while
sll s0, s0, 1 // pow = pow*2
addi s1, s1, 1 // x = x+1
j while
done:
|
^ Cyklus **//for//** ^^
|
int sum = 0;
for(int i=0; i!=10; i++)
{
sum = sum + i;
}
|
//Ekvivalentní k následujícímu cyklu while:
int sum = 0;
int i = 0;
while(i!=10){
sum = sum + i;
i++;
}
|
^ Načtení slova z datové paměti ^^
|
// Jenom pro účely ukázky...
int a, *pa=0x80020040;
int b, *pb=0x80020044;
int c, *pc=0x00001234;
a = *pa;
b = *pb;
c = *pc;
|
// s0=pa (bazova adresa), s1=a, s2=b, s3=c
lui s0, 0x8002 // pa = 0x80020000;
lw s1, 0x40(s0) // a = *pa;
lw s2, 0x44(s0) // b = *pb;
addi s0, $0, 0x1234 // pc = 0x00001234;
lw s3, 0x0(s0) // c = *pc;
|
\\