Lista Rozkazów:

Transkrypt

Lista Rozkazów:
Lista Rozkazów:
Język komputera (cd.)
Stałe 32-bitowe

Większość stałych jest mała


16-bitowe stałe wystarczają
Czasem potrzeba stałej 32-bitowej
lui rt, constant


Wstawia 16-bitową stałą do bardziej
znaczącej części rejestru rt
Pozostałe bity rejestru ustawia na 0
lui $s0, 61
0000 0000 0111 1101 0000 0000 0000 0000
ori $s0, $s0, 2304 0000 0000 0111 1101 0000 1001 0000 0000
Rozkazy – język komputera
Adresy w skokach branch

Rozkaz skoku (typ I)


Opcode, dwa rejestry, adres skoku
Zazwyczaj potrzebna ,,krótkie skoki’’ do
przodu lub do tyłu

op
rs
rt
constant or address
6 bits
5 bits
5 bits
16 bits
Adresowanie względem PC


Adres skoku = PC + offset × 4
PC zwiększony o 4 przed obliczeniem adr.
Rozkazy – język komputera
Adresy w skokach Jump

Skoki bezwarunkowe (j, jal – ten drugi
poznamy wkrótce) skaczą ,,daleko’’


Pełny adres zakodowany w rozkazie
op
address
6 bits
26 bits
Adresowanie (pseudo)bezpośrednie:

Adres docelowy = PC31…28 : (address × 4)
Rozkazy – język komputera
Przykład adresowania

Pętla z jednego z przykładów

Zakładamy, że Loop etykietuje 80000
$t1, $s3, 2
80000
0
0
19
9
4
0
add
$t1, $t1, $s6
80004
0
9
22
9
0
32
lw
$t0, 0($t1)
80008
35
9
8
0
bne
$t0, $s5, Exit
80012
5
8
21
2
addi $s3, $s3, 1
80016
8
19
19
1
j
80020
2
Loop: sll
Exit: …
Loop
80024
Rozkazy – język komputera
20000
Dalekie ,,branche’’


Jeśli adres docelowy jest daleki asembler
przeorganizuje kod.
Przykład:
beq $s0,$s1, L1
↓
bne $s0,$s1, L2
j L1
L2: …
Rozkazy – język komputera
Tryby adresowania MIPS
Rozkazy – język komputera
Procedury
int funkcja (int n){
int i,j;
(...)
return j;
}
main () {
int i,j;
i=funkcja(i);
...
j=funkcja(i);
}
• funkcja operuje na pewnych rejestrach, być może na tych samych co program
główny
• po skoku do funkcji musimy wrócić do miejsca z którego skakaliśmy -- funkcja
jest wywoływana z różnych miejsc; musimy zapamiętać adres powrotu
• do funkcji w jakiś sposób musimy przekazać parametry i w jakiś sposób musimy
otrzymać wyniki.
Rozkazy – język komputera
Procedury

Wymagane kroki
1.
2.
3.
4.
5.
6.
Przekaż parametry do procedury
Przekaż sterowanie do procedury
Przygotuj miejsce na dane procedury
Wykonaj procedurę
Przekaż wyniki stronie wywołującej
Powróć do miejsca wywołania
Rozkazy – język komputera
Użycie rejestrów




$a0 – $a3: parametry wywołania (rej. 4 – 7)
$v0, $v1: zwracane wyniki (rej. 2 i 3)
$t0 – $t9: zmienne tymczasowe, mogą być
zmienione przez procedurę
$s0 – $s7: muszą być odtworzone po
zakończeniu procedury

$gp: global pointer (rej. 28)

$sp: stack pointer (rej. 29)

$fp: frame pointer (rej. 30)

$ra: return address (rej. 31)
Rozkazy – język komputera
Wywołanie procedury

Wywołanie: jump and link
jal ProcedureLabel
 Adres kolejnego rozkazu umieszczany w $ra
 Skok pod wskazaną etykietę

Powrót z procedury: jump register
jr $ra
 Kopiuje $ra do licznika rozkazów PC
 Może być użyty do innych celów

Np. konstrukcje case/switch
Rozkazy – język komputera
Procedura ,,liść’’


Procedura nie wywołująca innych procedur
Kod C:
int leaf_example (int g, h, i, j)
{ int f;
f = (g + h) - (i + j);
return f;
}
 Parametry g, …, j w $a0, …, $a3
 f w $s0 (musimy zachować $s0 na stosie)
 Wynik w $v0
Rozkazy – język komputera
Procedura ,,liść’’

Kod MIPS:
leaf_example:
addi $sp, $sp, -4
sw
$s0, 0($sp)
add $t0, $a0, $a1
add $t1, $a2, $a3
sub $s0, $t0, $t1
add $v0, $s0, $zero
lw
$s0, 0($sp)
addi $sp, $sp, 4
jr
$ra
Rozkazy – język komputera
odłóż $s0 na stosie
kod procedury
Wynik
odtworzenie $s0
Powrót
Procedury wywołujące inne


W szczególności procedury rekurencyjne
Strona wywołująca musi odłożyć na stosie:



Swój adres powrotu
Parametry i zmienne tymczasowe, które będą
potrzebne po powrocie
Po powrocie z wywoływanej procedury
odtwarza powyższe
Rozkazy – język komputera
Przykład procedury rekuren.

Kod C:
int fact (int n)
{
if (n < 1) return f;
else return n * fact(n - 1);
}
 Parametr n w $a0
 Wynik w $v0
Rozkazy – język komputera
Przykład procedury rekuren.

Kod MIPS:
fact:
addi
sw
sw
slti
beq
addi
addi
jr
L1: addi
jal
lw
lw
addi
mul
jr
$sp,
$ra,
$a0,
$t0,
$t0,
$v0,
$sp,
$ra
$a0,
fact
$a0,
$ra,
$sp,
$v0,
$ra
$sp, -8
4($sp)
0($sp)
$a0, 1
$zero, L1
$zero, 1
$sp, 8
$a0, -1
0($sp)
4($sp)
$sp, 8
$a0, $v0
#
#
#
#
zrób 2 miejsca na stosie
zachowaj adres powrotu
zachowaj parametr
czy n < 1
#
#
#
#
#
#
#
#
#
#
jeśli tak, wynik = 1
usuń 2 elementy ze stosu
i wróć
wpp. zmniejsz n
wywołanie rekurencyjne
odtwórz oryginalne n
i adres powrotu
usuń 2 elementy ze stosu
wykonaj domnożenie do wyniku
i wróć
Rozkazy – język komputera
Dane lokalne na stosie



Dane lokalne procedury
Ramka procedury (rekord aktywacji)
Niekiedy, oprócz $sp, wygodnie użyć $fp, ale nie
jest to niezbędne
Rozkazy – język komputera
Układ pamięci


Text: kod programu
Static data: zmienne
globalne



Dynamic data: sterta


Np. zmienne globalne w C,
tablice, napisy…
$gp zainicjowany tak, aby
łatwo było się odwoływać
do danych za pomocą
ujemnego/dodatniego
przesunięcia
Np. malloc w C, new w
Javie
Stack: zmienne lokalne
Rozkazy – język komputera
Dane tekstowe

Znaki kodowane bajtowo

ASCII: 128 znaków


Latin-1: 256 znaków


95 graficzne, 33 sterujące
ASCII, +96 znaków graficznych
Unicode: kod 32-bit



Używany m.in. w Javie,
Większość światowych alfabetów, plus inne
symbole
UTF-8, UTF-16: kodowania zmiennej długości
Rozkazy – język komputera
Operacje bajtowe/półsłowowe


Można użyć operacji na bitach
Operacje na bajtach i połowach słów:

Przetwarzanie tekstów
lb rt, offset(rs)

Roszerzenie arytm. do 32 bitów rt
lbu rt, offset(rs)

lhu rt, offset(rs)
Uzupełniane zerami rt
sb rt, offset(rs)

lh rt, offset(rs)
sh rt, offset(rs)
Wysyła mniej znaczącą część rejestru
Rozkazy – język komputera
Przykład: kopiowanie napisu

Kod C:
Zakładamy, że łańcuch zakończony zerem
void strcpy (char x[], char y[])
{ int i;
i = 0;
while ((x[i]=y[i])!='\0')
i += 1;
}
 Adresy x, y w $a0, $a1
 i w $s0

Rozkazy – język komputera
Przykład: kopiowanie napisu

Kod MIPS:
strcpy:
addi
sw
add
L1: add
lbu
add
sb
beq
addi
j
L2: lw
addi
jr
$sp,
$s0,
$s0,
$t1,
$t2,
$t3,
$t2,
$t2,
$s0,
L1
$s0,
$sp,
$ra
$sp, -4
0($sp)
$zero, $zero
$s0, $a1
0($t1)
$s0, $a0
0($t3)
$zero, L2
$s0, 1
0($sp)
$sp, 4
#
#
#
#
#
#
#
#
#
#
#
#
#
1 miejsce na stosie
zachowaj $s0
i = 0
adres y[i] w $t1
$t2 = y[i]
adres x[i] w $t3
x[i] = y[i]
kończ pętlę gdy y[i] == 0
i = i + 1
na początek pętli
odtwórz $s0
zwolnij miejsce na stosie
powrót
Rozkazy – język komputera