Laborator2 MIPS

download Laborator2 MIPS

of 14

description

MIPS

Transcript of Laborator2 MIPS

  • 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