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