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 instruction set computers - 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 mo»na ±ci gn emulator MIPS32, w wersjach dla ró»nych systemów operacyjnych. Znajduje si tam równie» sporo ciekawych linków. 1
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 lw, sw jest pami tana na 16 bitach. 2.1 Przykªad 1. Operacje na tablicy liczb caªkowitych Adres pocz tku tablicy (czyli elementu A[0]) liczb 32-bitowych przechowujemy w rejestrze $s0. Zaªadowanie elementu A[12] 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 $t0, $s2, $s2 add $t0, $t0, $t0 # t0 = 4*i add $t0, $t0, $s0 lw $s1, 0($t0) # ªadujemy A[i] do s1 2.2 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 kodu operacji, rozrózniaj je dopiero bity funkcji. W przypadku rozkazu add $t0, $s1, $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 dodaj staª (argument natychmiastowy). Uwaga: nie ma subi. 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 i jest w $s4, a j w $s5): bne $s4 $s5 E1 E1: beq $s4, $s5, E2 sub $s1, $s2, $s3 E2: 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 j EXIT Else: sub $s1, $s2, $s3 Exit: Nie ma rozkazu branch on less then. Do naturalnego przetªumaczenia konstrukcji if (i<j) s1=s2+s3 mo»na za to u»y rozkazu set on less then: slt $t0, $s1, $s2 #set less than s1<s2 -> t0=1 else t0=0 beq $t0, $zero, DALEJ DALEJ: Innym rozwi zaniem jest u»ycie rozkazu bgtz $i E (branch on greater than zero) lub bgez $i E (branch on greater or equal zero). P tla while: while (s4 < s5) s1=s2+s3 mo»e wygl da tak: Loop: slt $t0, $s4, $s5 beq $zero, $t0, EXIT j LOOP EXIT: 2.4 Tryby adresowania MIPS podsumowanie W architekturze MIPS spotykamy w zasadzie 5 trybów adresowania: 1. Rejestrowe (np. add) 2. Bazowe (np. lw) 4
3. Natychmiastowe (np. addi) 4. Wzgl dem licznika rozkazów (np. bne) 5. Pseudobezp±rednie (np. j) (pseudo, bo pierwsze czetery bity s jednak brane z licznika rozkazów) Rysunek 2: Tryby adresowania MIPS 5