08b

Transkrypt

08b
1
Zarys architektury MIPS
Procesory rmy MIPS Technologies u»ywane s¡ w komputerach (Silicon Graphics), skomputeryzowanych zabawkach (Nintendo, Sony) oraz w systemach wbudowanych (w jakie wyposa»one
s¡ np.
telefony komórkowe).
Dwie podsawowe architektury: 32-bitowa (MIPS32) i 64-bitowa
(MIPS64).
My zajmiemy si¦ 32-bitow¡ wersj¡ MIPSa wszystkie rejestry s¡ 32-bitowe, wszystkie rozkazy
maj¡ dªugo±¢ 32 bitów, przestrze« adresowa jest adresowana adresami 32-bitowymi, co pozwala
zaadresowa¢ 4 GB.
Mimo, »e procesory MIPS s¡ typowymi architekturami RISC-owymi (reduced
set computers
instruction
- komputery o zredukowanej liczbie rozkazów) ich lista rozkazów jest w miar¦
bogata (RISC to mo»e nie tyle maªo rozkazów co raczejproste i regularne rozkazy). Zawiera
rozkazy arytmetyczne, logiczne, porównuj¡ce, instrukcje przesyªu danych, rozgaª¦zienia, skoki.
Jest architektur¡ typu ªaduj-zapisz, co znaczy, »e wszystkie instrukcje (poza wczytywaniem
danych i zapisywaniem) dziaªaj¡ na rejestrach (a nie na komórkach pami¦ci gªónej).
MIPS32 ma 168 32-bitowych rozkazów, ale wiele z nich jest do siebie podobnych (jest np. 6
ró»nych rozkazów dodawania). Posiada m.in. instrukcje NOP (nic nie rób, zajmuje tylko czas
procesora, co czasem mo»e by¢ sensowne). Mamy 32 rejstry ogólnego przeznaczenia: oznaczane
od $0 do $31. Rejestr $0 ma na staªe wpisan¡ warto±¢ 0, a rejestr $31 ($ra) jest domy±lny dla wielu
rozkazów. Rejestr $1 ($at) jest zarezerwowany, rejestry $27 ($k1)i $26 ($k0) u»ywane s¡ przez
j¡dro systemu operacyjnego. Rejestry $28, $29, $30 ($gp, $sp, $fp) s¡ rejestrami wska¹nikowymi.
Numeracja pozostaªych rejestrów podana jest na rysunku 1.
Ich znaczenie zebrane jest tak»e
poni»ej:
•
$at, $k0, $k1 - zarezerwowane dla asemblera i systemu operacyjnego (programista nie
powinien ich uzywac)
•
$a0-$a3 - przekazywanie argumentow do funkcji
•
$v0, $v1 - zwracanie wynikow przez funkcje
•
$t0-$t9 - rejestry pomocniecze
•
$s0-$s7 - rejestry danych
•
$gp - global pointer
•
$sp - stack pointer
•
$fp - frame pointer
•
$ra - return address ($31)
•
$0 - staªa zero
Warto podkre±li¢, »e podane zastosowania rejestrów s¡ tylko konwencj¡ i nic nie stoi na
przeszkodzie, aby wykorzystywa¢ je inaczej.
Dodatkowo mamy dwa rejestry specjalne HI i LO przechowuj¡ce wyniki pewnych operacji
na liczbach caªkowitych. Oczywi±cie jest te» licznik rozkazów PC. Inny zestaw 32 rejestrów to
rejestry do operacji na liczbach zmiennoprzecikowych.
W trybie podwójnej precyzji warto±ci
s¡ przechowywane w parach rejestrów o kolejnych numerach.
Jednostka zmiennoprzecikowa
dysponuje te» 4 rejestrami specjalnego przeznaczenia.
Ze strony
http://www.cs.wisc.edu/ larus/spim.html
w wersjach dla ró»nych systemów operacyjnych.
linków.
1
mo»na ±ci¡gn¡¢ emulator MIPS32,
Znajduje si¦ tam równie» sporo ciekawych
Rysunek 1: Konwencja nazewnictwa rejestrów MIPS32
2
Programowanie MIPSa
Jak wspomnieli±my wszystkie rozkazy (z wyj¡tkiem rozkazów przesyªania danych) operuj¡ tylko
na rejestrach. Konwencja: rejestry $s0-$s7 przechowuj¡ dane (odpowiadaj¡ zmiennym programu
wysokiego poziomu). Przykªad rozkazu:
add $s0, $s1, $s2
#
$s0=$s1+$s2
Grupa rejestrów $t0-$t7 przechowuje zgodnie z konwencj¡ warto±ci tymczasowe. Np. licz¡c
wyra»enie:
s0 = (s1 + s2) − (s3 + s4)
napiszemy:
add $t0, $s1, $s2
add $t1, $s3, $s4
sub $s0, $t0, $t1.
Rozró»nienie mi¦dzy rejestrami $si i $ti jest umowne i nikt nie zabrania u»ywa¢ ich inaczej.
Operacja przesyªania z pami¦ci do rejestru to
load word:
lw $s0,40($s1)
W powy»szym przykªadzie zawarto±¢ pami¦ci o adresie $s1+40 ªadowana jest do rejestru $s0.
Zauwa»my, »e mamy tu do czynienia z adresowaniem bazowym. Jako bazy mo»emy u»y¢ dowolnego rejestru ogólnego przeznaczenia. Przesuni¦cie jest podane jako argumnet natychmiastowy
staªa (nie wolno w tym miejscu u»y¢ rejestru).
W druga stron¦ mamy analogicznie dziaªaj¡c¡ operacj¦
store word:
sw $s0, 40($s1)
Uwaga o adresowaniu: pami¦¢ jest adresowana bajtowo, ale sªowo ma dªugo±¢ 4 bajtów, a
wi¦c adres z jakiego pobieramy lub do jakiego zapisujemy powinien by¢ wielokrotno±ci¡ 4. Staªa
w rozkazach
2.1
lw, sw
jest pami¦tana na 16 bitach.
Przykªad 1. Operacje na tablicy liczb caªkowitych
Adres pocz¡tku tablicy (czyli elementu
Zaªadowanie elementu
A[12]
A[0])
liczb 32-bitowych przechowujemy w rejestrze $s0.
do rejestru $s1 wygl¡da tak (pami¦tamy o tym, »e adresujemy
bajtami):
lw $s1, 48($s0)
2
W jaki sposób odwoªa¢ si¦ do elementu tablicy, którego indeks jest przechowywany w rejestrze
$s2 (typowa sytuacja w programowaniu!)? Problem polega na tym, »e nie mamy adresowania
po±redniego...
Przykªadowe rozwi¡zanie:
add
add
add
lw
2.2
$t0,
$t0,
$t0,
$s1,
$s2, $s2
$t0, $t0
$t0, $s0
0($t0)
# t0 = 4*i
# ªadujemy A[i] do s1
Formaty rozkazów MIPSa
Poznali±my ju» troch¦ rozkazów MIPS-a. Wszystkie rozkazy mo»na podzieli¢ na trzy rodzaje:
typu I (immediate), typu R (register) oraz typu J (jump) (rozkazów z tej ostatniej grupy jeszcze
nie widzieli±y). Jak te rozkazy wygl¡daj¡ w j¦zyku maszynowym?
•
Rozkazy typu R. Pierwszych 6 bitów to kod operacji (op). Nast¦pnie mamy trzy razy po 5
bitów wskazuj¡cych rejestry (rs, rt, rd), 5 bitów przesuni¦cia (shift ammount, shamt) oraz
6 bitów funkcji (okre±laj¡ dodatkowe szczegóªy operacji). Np.
add i sub maj¡ te same bity
add $t0, $s1,
kodu operacji, rozrózniaj¡ je dopiero bity funkcji. W przypadku rozkazu
$s2
kolejne pola przyjmuj¡ warto±ci (dziesi¡tkowo): 0, 17, 18, 8, 0, 32. Zauwa», »e rejestr
przeznaczenia $t0 jest w kodzie maszynowym zapisany jako trzeci, a nie jako pierwszy.
•
Rozkazy typu I. Np.
lw $s0, 8($t1).
Kod operacji zajmuje 6 bitów. Potem dwa razy
po 5 bitów na numery rejestrów i 16 bitów na adres (zapisany w kodzie dopeªnie« do
2). Nasz rozkaz przykªadowy zostanie zakodowany jako 35, 9, 16, 8. Inny przykªad rozkazu natychmiastowego:
addi $s0, $s1, 3, czyli add immediate
subi.
dodaj staª¡ (argument
natychmiastowy). Uwaga: nie ma
•
Rozkazy typu J. Np.:
j addr.
Kod operacji:
6 bitów.
Adres:
26 bitów.
Adres jest
numerem sªowa a nie bajtu i jest adresem wzgl¦dnym. Rzeczywisty adres do jakiego si¦
odwoªujemy: 4 najbardziej znacz¡ce bity s¡ takie same jak w adresie rozkazu, nast¦pnie 26
bitów zakodowanych w adresie i na ko«cu 2 zera.
2.3
•
Kodowanie podstawowych konstrukcji z j¦zyków wysokiego poziomu
Konstrukcj¦:
if (i==j) s1=s2+s3 ;
if (i!=j) s1=s2-s3;
tªumaczymy na (przy zaªo»eniu, »e
bne
add
E1: beq
sub
E2:
i
jest w $s4, a j w $s5):
$s4 $s5 E1
$s1, $s2, $s3
$s4, $s5, E2
$s1, $s2, $s3
3
Uwaga: rozkazy skoku warunkowego:
bne (branch if not equal ), beq (branch if equal )
s¡
typu I. Zatem adres ma w takim rozkazie ma tylko 16 bitów i mówi o ile trzeba skoczy¢ w
stosunku do aktualnego miejsca w pami¦ci.
•
Konstrukcja
if (i==j) s1=s2+s3
else s1=s2+s3
tªumaczy si¦ na:
bne $s4, $s5 Else
add $s1, $s2, $s3
j EXIT
Else: sub $s1, $s2, $s3
Exit:
•
Nie ma rozkazu
branch on less then.
if (i<j)
s1=s2+s3
mo»na za to u»y¢ rozkazu
DALEJ:
Do naturalnego przetªumaczenia konstrukcji
set on less then:
slt $t0, $s1, $s2 #set less than s1<s2 -> t0=1 else t0=0
beq $t0, $zero, DALEJ
add $s1, $s2, $s3
Innym rozwi¡zaniem jest u»ycie rozkazu
$i E (branch on greater or equal zero).
•
bgtz $i E (branch on greater than zero) lub bgez
P¦tla while:
while (s4 < s5)
s1=s2+s3
mo»e wygl¡da¢ tak:
Loop: slt $t0, $s4, $s5
beq $zero, $t0, EXIT
add $s1, $s2, $s3
j LOOP
EXIT:
2.4
Tryby adresowania MIPS podsumowanie
W architekturze MIPS spotykamy w zasadzie 5 trybów adresowania:
1. Rejestrowe (np.
2. Bazowe (np.
add)
lw)
4
3. Natychmiastowe (np.
addi)
4. Wzgl¦dem licznika rozkazów (np.
5. Pseudobezp±rednie (np.
j)
bne)
(pseudo, bo pierwsze czetery bity s¡ jednak brane z licznika
rozkazów)
Rysunek 2: Tryby adresowania MIPS
5