Warning
This page is located in archive.

3. Cvičení - Návrh jednoduché řídicí jednotky procesoru

Znění úloh na cvičení je zde: 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;


courses/a4m36pap/tutorials/03/start.txt · Last modified: 2015/09/30 08:41 by stepami9