laborator2 mips
DESCRIPTION
MIPSTRANSCRIPT
-
1
REGITII. UNITATEA ARITMETICO-LOGIC. INSTRUCIUNI / PSEUDOINSTRUCIUNI ARITMETICE I LOGICE
I. Regitrii
Regitrii reprezint locaii de memorie situate pe procesor. Acetia se gsesc n vrful ierarhiei de memorie, fiind accesai cu vitez maxim de ctre procesor, ns prezint o capacitate de stocare redus.
Nu toi regitrii procesorului sunt accesibili prin limbajul de asamblare, unii dintre acetia fiind folosii strict pentru anumite operaii (regitrii speciali). Regitrii accesibili din limbaj de asamblare sunt de 2 tipuri: regitri generali (general registers) i regitri n virgul mobil (floating point registrers).
1. Regitrii generali
Intern, regitrii generali sunt adresai prin coduri de bii. La nivelul limbajului de asamblare, regitrii sunt referii prin cod, precedat de semnul $: $1, $17, $20, etc. n plus, acetia pot fi accesai printr-un mnemonic unic, care s evidenieze scopul pentru care sunt folosii (n general prin convenie, n unele cazuri i din constrngeri hardware): $t1, $s2, etc.
n QtSpim, se gsesc grupai n fereastra principal, sub denumirea de General Registers:
-
2
Figura 1. Regitrii generali
ntrebri: 1) Ci regitri generali sunt? 2) Ce dimensiune are un registru general? 3) Ci bii sunt necesari pentru reprezentarea codului unui registru general? 4) Cum se reprezint n binar codul registrul t1? Dar s1?
n tabelul urmtor sunt prezentai regitrii generali:
Nume Mnemonic Utilizare convenional $0 $zero Zero register conine ntotdeauna valoarea 0. $1 $at Assembler Temporary este rezervat pentru asamblor.
$2; $3 $v0; $v1 Value registers - folosii pentru reinerea rezultatelor ntregi ale evalurilor unor expresii sau funcii.
$4$7 $a0$a3 Arguments folosii pentru transmiterea argumentelor unor subrutine (parametrii actuali). Valorile acestora nu se pstreaz dupa apelul de procedur.
$8$15 $t0$t7 Temporary registers folosii pentru evaluarea expresiilor. Valorile acestora nu se pstreaz la apeluri de proceduri. $16$23 $s0$s7 Saved registers - valorile acestora sunt pstrate la apeluri de proceduri. $24; $25 $t8; $t9 Temporary registers folosii pentru evaluarea expresiilor. Valorile acestora nu se pstreaz la apeluri de proceduri. $26; $27 $k0; $k1 Kernel registers - rezervai pentru sistemul de operare.
$28 $gp Global Pointer indic spre mijlocul unui bloc de memorie care pstreaz constante i variabile globale.
$29 $sp Stack Pointer indic ultima locaie utilizat n stiv. $30 $fp Frame Pointer - pointer spre cadrul curent n stiv. $31 $ra Return Address conine adresa de ntoarcere, fiind folosit pentru evaluarea expresiilor.
Tabelul 1. Regitrii generali
Registrii $0 i $31 sunt singurii diferii: registrul general $0 conine ntotdeauna valoarea 0, iar registrul general $31 servete implicit pentru instruciunile de salt i de legtur. Pentru toi ceilali regitri nu exist restricii hardware, ns scopul prezentat este cel destinat utilizrii.
-
3
2. Regitrii speciali
Procesorul MIPS prezint 3 regitri speciali, prezeni n partea de sus a ferestrei Int Regs a simulatorului QtSpim:
Nume Descriere PC Program Counter HI Higher registru special de nmulire/mprire n care se depoziteaz cei
mai semnificativi 32 de bii ai produsului, respectiv restul mpririi. LO Lower - registru special de nmulire/mprire n care se depoziteaz cei mai
puini semnificativi 32 de bii ai produsului, respectiv ctul mpririi.
Tabelul 2. Regitrii speciali
Semnificaia EPC, Cause, BadVAddr, Status va fi discutata ulterior, la tratarea excepiilor.
3. Regitrii n virgul mobil
Regitrii n virgul mobil sunt utilizai de FPU (Floting Point Unit). Acetia nu vor fi tratai in cadrul laboratorului.
Mai multe informaii se gsesc la: http://www.cs.cornell.edu/courses/cs3410/2008fa/mips_vol1.pdf
II. Unitatea logico-aritmetic (ALU)
1. Regitrii i ALU
Unitatea aritmetico-logic este componenta procesorului care realizeaz operaii aritmetice i logice.
Pentru execuia unei astfel de operaii, este nevoie de unul sau mai muli operanzi (ntregi folosii ca intrare). Acetia sunt meninui n regitri. Ei nu pot fi preluai din memorie i utilizai pentru calcul ntr-o singur instruciune. n cazul n care valorile operanzilor se gsesc n memorie, atunci:
1. Se ncarc datele din memorie n regitri, utiliznd instruciuni de transfer din memorie n regitri;
2. Se realizeaz calculele, utiliznd instruciuni aritmetice sau logice;
-
4
3. Rezultatul este obinut ntr-un registru. n cazul n care se dorete salvarea rezultatului n memorie se utilizeaz o instruciune de transfer din registru n memorie.
n consecin, pentru execuia unei operaii de ctre ALU este nevoie s se specifice:
Operaia care s se execute; 2 operanzi, pstrai de obicei n regitri; 1 registru n care se va stoca rezultatul obinut.
Este posibil ca un operand s nu fie specificat printr-un registru, ci s fie direct indicat de instruciunea main.
Lund de exemplul instruciunea add $10,$8,$12 operaia este adunarea; locaiile n care se gsesc cei 2 operanzi sunt regitrii $8 i $12; registrul n care se va stoca rezultatul este $10.
Figura 2. Regitrii i unitatea aritmetico-logic ALU
2. Formatul instruciunilor
Exerciiu:
1. ncrcai n QtSpim programul urmtor:
.data # declaratii date .text
ALU
$0 $1 $2
$8
$10
$12
$30 $31
-
5
# cod main: # eticheta marcand punctul de start # cod add $t1,$t2,$t3 li $v0,10 syscall
2. Care este codul main corespunztor instruciunii add $t1,$t2,$t3? Gsii reprezentarea sa n binar.
3. Adugai n cod linia urmtoare: sub $t1,$t2,$t3. 4. Care este codul main corespunztor acestei instruciuni? Gsii
reprezentarea sa n binar. 5. Cum se difereniaz cele 2 operaii? 6. Adugai n cod linia urmtoare: add $s1,$t2,$t3. 7. Care este codul main corespunztor acestei instruciuni? Gsii
reprezentarea sa n binar 8. Putei deduce poziiile biilor care indic registrul destinaie? 9. Adugai in cod linia urmtoare: add $t1,$s2,$s3. 10. Care este codul main corespunztor acestei instruciuni? Gsii
reprezentarea sa n binar. 11. Putei deduce poziiile biilor care indic regitrii celor 2 operanzi?
n limbajul de asamblare pentru MIPS32, instruciunile ocup ntotdeauna 32 de bii (= 4 octei = 1 word). Acestea respect unul dintre urmtoarele 3 formate:
Figura 3. Formatul instruciunilor
-
6
Cmpurile au urmtoarele specificaii: op = operaia de baz (opcod)
o n cazul instruciunilor n format R, op este ntotdeauna 000000. o n cazul instruciunilor n format J, op este ntotdeauna de forma
00001x, cu x cifr binar; o n cazul instruciunilor n format I, op difer, ns nu este niciodat
de forma 000000, 00001x sau 0100xx, cu x cifr binar. rs = registru surs registrul care conine primul argument; rt = registru surs registrul care conine al doilea argument (n cazul
instruciunilor n format R) sau registrul destinaie (n cazul instruciunilor n format I);
rd = registru destinaie registrul n care se stocheaz rezultatul obinut n urma operaiei;
shamt = shift amount folosit la operaiile de deplasare (shiftare); func = funcia combinat cu op indic operaia/funcia care se aplic; address = adres; imm = valoare imediat.
ntrebri: 1) Ce format respect instruciunile add i sub folosite n exemplul precedent? 2) Completai urmtorul tabel pentru instruciunile folosite n exerciiul precedent:
Instruciune op rs rt rd shamt func add $t1,$t2,$t3 000000 01010 01011 01001 00000 100000 sub $t1,$t2,$t3 01011 add $s1,$t2,$t3 00000 add $t1,$s2,$s3 10010
3. Instruciuni cu i fr depire
Cum dimensiunea unui registru general este de 32 de bii, exist 232 de combinaii binare posibile pe care un astfel de registru le poate conine. Operanzii care se pstreaz n regitri se pot considera:
Numere naturale, fr semn : de la 0 la 232-1; Numere ntregi, cu semn: de la 231 la 231-1.
Instruciunile se mpart n instruciuni care: nu genereaz niciodat excepie de overflow (fr depire): dac
rezultatul iese din intervalul considerat, se face trunchiere; pot genera excepie de owerflow (cu depire): daca rezultatul iese
din intervalul considerat se genereaz eroare de overflow;
-
7
Astfel: add $t1,$t2,$t3
- consider operanzii din regitrii $t2 i $t3 numere cu semn; - ntoarce overflow n cazul n care se obine o valoare care nu
este n intervalul [231 , 231-1] (este o instruciune cu depire); addu $t1,$t2,$t3
- consider operanzii din regitrii $t2 i $t3 numere fr semn (sufixul u provine de la unsigned);
- nu genereaz niciodat excepie (overflow), ci trunchiaz rezultatul (este instruciune fr depire).
- rezultatul este corect numai cnd bitul de transport obinut dup efectuarea calculului este 0; n caz contrar s-a realizat trunchiere si rezultatul nu este cel corect aritmetic.
Exerciiu: 1. ncrcai n QtSpim programul de mai jos:
.data # declaratii date .text # cod main: # eticheta marcand punctul de start # cod li $t2,0x7fffffff li $t3,0x00000001 addu $t1,$t2,$t3 add $t0,$t2,$t3 li $v0,10 syscall
2. Rulai programul pas cu pas. Observai c: 2.1. Se poate folosi li (load immediate) pentru a pune direct ntr-un registru o
valoare. 2.2. n registrul $t2 se introduce valoarea maxim pozitiv n cazul n care se
consider numere cu semn; 2.3. Instruciunea addu realizeaz corect adunarea ntruct nu se depete
valoarea maxim a numerelor fr semn i deci nu se realizeaz trunchiere.
2.4. Instruciunea add genereaz excepie ntruct suma (231-1) + 1 depsete valoarea maxim a numerelor cu semn.
3. Modificai programul de mai sus astfel nct n $t2 s fie valoarea 231 i n $t3 valoarea 1:
li $t2,0x80000000 li $t3,0xffffffff
4. Rulai programul pas cu pas. Observai c:
-
8
4.1. Instruciunea addu nu genereaz excepie, ns nu calculeaz corect suma (trunchiaz rezultatul);
4.2. Instruciunea add genereaz excepie, ntruct suma 231-1 iese din intervalul [231 , 231-1].
Instruciunile add i addu (add unsigned) utilizeaz ca operanzi valorile din regitri. Cei 3 regitri prezeni n instruciune nu trebuie s fie neaprat distinci.
Exist operaii de adunare care permit adunarea unei valori imediate la o valoare stocat ntr-un registru. Acestea sunt instruciunile:
addi (add immediate): addi $t1,$t2,12 - realizeaz adunare imediat cu semn, cu depire (genereaz
excepie de overflow cnd se depete intervalul [231 , 231-1]);
- adun la valoarea dintr-un registru o valoare imediat i stocheaz rezultatul ntr-un registru;
addiu (add immediate unsigned): addiu $t1,$t2,12 - realizeaz adunare imediat fr semn, fr depire (nu
genereaz niciodat excepie de overflow); - adun la valoarea dintr-un registru o valoare imediat i
stocheaz rezultatul ntr-un registru. Spre deosebire de instruciunile add i addu care sunt n format R, instruciunile
addi i addiu sunt n format I.
4. Instruciuni aritmetice
Instruciunile aritmetice sunt cuprinse n Tabelul 3. Pentru fiecare dintre ele se specific dac poate ntoarce sau nu excepie de overflow, modul de realizare al operaiei, formatul i cte un exemplu.
Instruciune Tip Operaia efectuat Format Exemplu
add rd, rs, rt Cu semn, cu depire
rd rs + rt R add $t1, $t2, $t3
addu rd, rs, rt Fr semn, fr depire
rd rs + rt R addu $t1, $t2, $t3
addi rt, rs, imm Cu semn, cu depire
rt rs + imm I addi $t1, $t2, 1
addiu rt, rs, imm Far semn, fr depire
rt rs + imm I addiu $t1, $t2, 1
sub rd, rs, rt Cu semn, cu depire
rd rs - rt R sub $t1, $t2, $t3
subu rd, rs, rt Fr semn, fr depire
rd rs - rt R subu $t1, $t2, $t3
mult rs, rt Cu semn, fr depire
HI,LO rs * rt R mult $t1, $t2
-
9
multu rs, rt Fr semn, fr depire
HI,LO rs * rt R multu $t1, $t2
div rs, rt Cu semn, cu depire
LO rs / rt HI rs % rt
R div $t1, $t2
divu rs, rt Fr semn, fr depire
LO rs / rt HI rs % rt
R divu $t1, $t2
Tabelul 3. Instruciuni aritmetice
Formatul exact al instruciunilor se gsete la http://www.cs.sunysb.edu/~cse320/MIPS_Instruction_Coding_With_Hex.pdf
Valorile coninute n regitri HI i LO nu pot fi direct utilizate n instruciuni logice sau aritmetice. Pentru utilizarea informaiilor meninute n HI i LO, acestea trebuie mai nti mutate n regitrii generali. Instruciunile care permit accesarea informaiei din cei 2 regitri speciali sunt urmtoarele:
Instruciune Abrevieri Operaia efectuat Format Exemplu
mthi rs Move To HI HI rs R mthi $t1 mfhi rd Move From HI rd HI R mfhi $t1 mtlo rs Move To LO LO rs R mtlo $t1 mflo rd Move From LO rd LO R mflo $t1
Tabelul 4. Instruciuni pentru utilizarea regitrilor speciali HI i LO
ntrebri: 1) Observai c spre deosebire de adunare i scdere, nmulirea utilizeaz pentru
pstrarea rezultatelor 2 regitri (regitrii speciali HI i L0). De ce credei c se ntmpl asta?
2) De ce n cazul nmulirii, nici una dintre instruciunile mult i multu nu ntorc excepii de overflow?
Pe lng instruciuni aritmetice, exist i pseudoinstructiuni. Acestea sunt linii de cod care se convertesc la asamblare n una sau mai multe instruciuni. Pseudoinstruciunile nu fac parte din ISA. Ele au rolul de a uura scrierea unui program prin adugarea unui surplus de claritate.
Pentru mai multe informaii despre pseudoinstruciuni se poate accesa: http://www.cs.umd.edu/class/spring2003/cmsc311/Notes/Mips/pseudo.html
-
10
Pseudoinstruciune Tip Operaia efectuat Exemplu
abs rd, rs Cu semn rd |rs| abs $t1, $t2 neg rd, rs Cu depire rd - rs neg $t1, $t2 negu rd, rs Fr depire rd - rs negu $t1, $t2 add rd, rs, imm Cu semn, cu
depire rd rs + imm add $t1, $t2, 1
addu rd, rs, imm Fr semn, fr depire
rd rs + imm addu $t1, $t2, 1
add rd, imm Cu semn, cu depire
rd rd + imm add $t1, 1
addu rd, imm Fr semn, fr depire
rd rd + imm addu $t1, 1
sub rd, rs, imm Cu semn, cu depire
rd rs - imm sub $t1, $t2, 1
subu rd, rs, imm Fr semn, fr depire
rd rs - imm subu $t1, $t2, 1
sub rd, imm Cu semn, cu depire
rd rd - imm sub $t1, 1
subu rd, imm Fr semn, fr depire
rd rd + imm subu $t1, 1
mulo rd, rs, rt Cu semn, cu depire
rd rs * rt mulo $t1, $t2, $t3
mulou rd, rs, rt Fr semn, fr depire
rd rs * rt mulou $t1, $t2, $t3
div rd, rs, rt Cu semn, cu depire
rd rs / rt div $t1, $t2, $t3
divu rd, rs, rt Fr semn, fr depire
rd rs / rt div $t1, $t2, $t3
rem rd, rs, rt Cu semn, cu depire
rd rs % rt rem $t1, $t2, $t3
remu rd, rs, rt Fr semn, fr depire
rd rs % rt remu $t1, $t2, $t3
Tabelul 5. Pseudoinstruciuni aritmetice
Problem rezolvat: S se calculeze n $t4 suma valorilor din $t1 i $ t2 minus valoarea din $t3.
.data
.text main: add $t4,$t1,$t2 #$t4 = $t1+$t2 sub $t4,$t4,$t3 #$t4 = $t4-$t3 li $v0,10 syscall
-
11
Problem rezolvat: S se obin n $t3 expresia 8*x [y/16] , unde x este valoarea din $t1 i y este valoarea din $t2.
.data
.text main: li $t0,8 mulo $t3,$t1,$t0 #se obtine $t3 = 8*$t1 li $t0,16 div $t2, $t2, $t0 #se obtine $t2 = $t2/16 sub $t3, $t3, $t2 #se obtine $t3 = 8*$t1 - [$t2/16] li $v0,10 syscall
Probleme propuse: 1) S se obin in $t3 valoarea: [x/y] * {y/x}, unde x este valoare stocat n $t1 i y
este valoarea stocat n $t2, unde s-a notat cu [ ] ctul i cu {} restul mpririi. 2) S se obin n $t3 valoarea |x-y| , unde x este valoarea din registrul $t1 i y este
valoarea din registrul $t2.
5. Instruciuni logice
ntrebri: 1) Care sunt operaiile logice pe bii? 2) Care sunt tabelele de adevr corespunztoare?
Instruciunile logice sunt cuprinse n Tabelul 6:
Tabel 6. Instruciuni logice
Instruciune Operaia efectuat Format Exemplu
and rd, rs, rt rd rs AND rt R and $t1, $t2, $t3 andi rt, rs, imm rt rs AND imm I andi $t1, $t2, 10 or rd, rs, rt rd rs OR rt R or $t1, $t2, $t3 ori rt, rs, imm rt rs OR imm I ori $t1, $t2, 10 xor rd, rs, rt rd rs XOR rt R xor $t1, $t2, $t3 xori rt,rs,imm rt rs XOR imm I xori $t1, $t2, 10 nor rd, rs, rt rd rs NOR rt R nor $t1, $t2, $t3
-
12
ntruct 0 OR a = a, pentru orice a binar, instruciunea ori se folosete pentru introducerea unei valori ntr-un registru. De exemplu, pentru introducerea valorii 0x2A n registrul $t0:
ori $t0, $0, 0x2A Observai utilizarea registrului zero, care conine ntotdeauna valoarea 0.
Formatul exact al instruciunilor se gsete la http://www.cs.sunysb.edu/~cse320/MIPS_Instruction_Coding_With_Hex.pdf
Pseudoinstructiunile logice sunt prezentate n tabelul urmtor:
Tabelul 7. Pseudoinstruciuni logice
Probleme propuse: 1) S se evalueze expresia logic (x OR y) AND (NOT z) XOR w, unde x este
valoarea din $t1, y din $t2, z din $t3 i w din $t4 i s se memoreze rezultatul n $t5.
2) Introducei n registrul $t1 valoarea 0x25, folosind numai instruciuni logice.
6. Instruciuni de shiftare
Instruciunile de shiftare sunt prezentate n tabelul urmtor:
Instruciune Operaia efectuat Format Exemplu sll rd, rt, imm Shift Left Logical
rd rt > imm
R srl $t1, $t2, 2
Pseudoinstruciune Operaia efectuat Exemplu not rd, rs rd NOT rs not $t1, $t2 nor rd, rs, imm rd rs NOR imm nor $t1, $t2, 10 and rd, rs, imm rd rs AND imm and $t1, $t2, 10
-
13
- se deplaseaz biii la dreapta cu imm poziii; - biii care ies din word prin dreapta se pierd; - locurile goale ramase in stnga se completeaz cu 0.
sra rd, rt, imm Shift Right Arithmetic
rd rt >> imm
- se deplaseaz biii la dreapta cu imm poziii; - biii care ies din word prin dreapta se pierd; - locurile goale ramase in stnga se completeaz cu 0, cu excepia bitului de semn, care se pstreaz.
R sra $t1, $t2, 2
sllv rd, rt, rs Shift Left Logical Variable rd rt > rs
R srlv $t1, $t2, $t3
srav rd, rt, rs Shift Right Arithmetic Variable rd rt >> rs
R srav $t1, $t2, $t3
Tabelul 8. Instruciuni de shiftare
Formatul exact al instruciunilor se gsete la http://www.cs.sunysb.edu/~cse320/MIPS_Instruction_Coding_With_Hex.pdf
ntrebri: 1) Ce operaii aritmetice se pot realiza prin operaii de shiftare? 2) Care este diferena dintre utilizarea unei shiftri logice spre dreapta i a unei
shiftri aritmetice spre dreapta n cazul numerelor negative?
7. Pseudoinstruciuni de rotaie
Pseudoistruciunile de rotaie sunt prezentate n tabelul urmtor:
Pseudoinstruciune Operaia efectuat Exemplu rol rd, rt, rs Rotation On Left
- se pune n rd configuraia de bii din rt deplasat spre stnga cu nr. de bii din rs, a.. biii care ies din word spre stnga sunt introdui n aceeai ordine n locul gol creat n dreapta.
rol $t2, $t1, $t0
-
14
ror rd, rt, rs Rotation On Right - se pune n rd configuraia de bii din rt deplasat spre dreapta cu nr. de bii din rs, a.. biii care ies din word spre dreapta sunt introdui n aceeai ordine n locul gol creat n stnga.
ror $t2, $t1, $t0
Tabelul 9. Pseudoinstruciuni de rotaie
Probleme propuse: 1) n registrul t0 se gsete valoarea 0x1234. Obinei n registrul t2 valoarea
0x91a0 utiliznd o instruciune de shiftare sau rotaie. 2) n registrul t0 se gsete valoarea 0x12345678. Obinei n registrul t1 valoarea
0xc091a2b3 utiliznd o instruciune de shiftare sau rotaie.
Mai multe informaii
Regitrii CPU MIPS http://www.doc.ic.ac.uk/lab/secondyear/spim/node10.html
MIPS32 Architecture For Programmers Volume I: Introduction to the MIPS32 Architecture http://www.cs.cornell.edu/courses/cs3410/2008fa/mips_vol1.pdf
MIPS Assembly Language Programmers Guide http://www.cs.unibo.it/~solmi/teaching/arch_2002-2003/AssemblyLanguageProgDoc.pdf
Programmed Introduction to MIPS Assembly Language http://chortle.ccsu.edu/AssemblyTutorial/index.html
MIPS Instruction Coding http://www3.cs.stonybrook.edu/~lw/spim/MIPSinstHex.pdf