Sunteți pe pagina 1din 14

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:

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
$0
$1

Mnemonic
$zero
$at

$2; $3

$v0; $v1

$4$7

$a0$a3

$8$15

$t0$t7

$16$23

$s0$s7

$24; $25

$t8; $t9

$26; $27

$k0; $k1

$28

$gp

$29
$30

$sp
$fp

$31

$ra

Utilizare convenional
Zero register conine ntotdeauna valoarea 0.
Assembler Temporary este rezervat pentru asamblor.
Value registers - folosii pentru reinerea rezultatelor ntregi
ale evalurilor unor expresii sau funcii.
Arguments folosii pentru transmiterea argumentelor unor
subrutine (parametrii actuali). Valorile acestora nu se
pstreaz dupa apelul de procedur.
Temporary registers folosii pentru evaluarea expresiilor.
Valorile acestora nu se pstreaz la apeluri de proceduri.
Saved registers - valorile acestora sunt pstrate la apeluri de
proceduri.
Temporary registers folosii pentru evaluarea expresiilor.
Valorile acestora nu se pstreaz la apeluri de proceduri.
Kernel registers - rezervai pentru sistemul de operare.
Global Pointer indic spre mijlocul unui bloc de memorie
care pstreaz constante i variabile globale.
Stack Pointer indic ultima locaie utilizat n stiv.
Frame Pointer - pointer spre cadrul curent n stiv.
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.

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;

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.

3.


specifice:

n consecin, pentru execuia unei operaii de ctre ALU este nevoie s se

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.
$31
$30
$12
$10

ALU

$8
$2
$1
$0
Figura 2. Regitrii i unitatea aritmetico-logic ALU

2. Formatul instruciunilor
 Exerciiu:
1. ncrcai n QtSpim programul urmtor:
.data
# declaratii date
.text

# 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

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
add $t1,$t2,$t3
sub $t1,$t2,$t3
add $s1,$t2,$t3
add $t1,$s2,$s3

op
000000

rs

rt

rd

01010

01011
01011

01001

shamt
00000

func
100000

00000
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;

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:

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
add rd, rs, rt
addu rd, rs, rt
addi rt, rs, imm
addiu rt, rs, imm
sub rd, rs, rt
subu rd, rs, rt
mult rs, rt

Tip
Cu semn, cu
depire
Fr semn, fr
depire
Cu semn, cu
depire
Far semn, fr
depire
Cu semn, cu
depire
Fr semn, fr
depire
Cu semn, fr
depire

Operaia
efectuat
rd rs + rt

add $t1, $t2, $t3

rd rs + rt

addu $t1, $t2, $t3

rt rs + imm

addi $t1, $t2, 1

rt rs + imm

addiu $t1, $t2, 1

rd rs - rt

sub $t1, $t2, $t3

rd rs - rt

subu $t1, $t2, $t3

HI,LO rs * rt

mult $t1, $t2

Format

Exemplu

multu rs, rt

Fr semn, fr
R
HI,LO rs * rt
depire
Cu semn, cu
LO rs / rt
R
depire
HI rs % rt
Fr semn, fr
LO rs / rt
R
depire
HI rs % rt
Tabelul 3. Instruciuni aritmetice

div rs, rt
divu rs, rt

multu $t1, $t2


div $t1, $t2
divu $t1, $t2

 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
mthi rs
mfhi rd
mtlo rs
mflo rd

Abrevieri
Move To HI
Move From HI
Move To LO
Move From LO

Operaia
efectuat
HI rs
rd HI
LO rs
rd LO

Format
R
R
R
R

Exemplu
mthi $t1
mfhi $t1
mtlo $t1
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

Pseudoinstruciune
abs rd, rs
neg rd, rs
negu rd, rs
add rd, rs, imm
addu rd, rs, imm
add rd, imm
addu rd, imm
sub rd, rs, imm
subu rd, rs, imm
sub rd, imm
subu rd, imm
mulo rd, rs, rt
mulou rd, rs, rt
div rd, rs, rt
divu rd, rs, rt
rem rd, rs, rt
remu rd, rs, rt

Tip
Cu semn
Cu depire
Fr depire
Cu semn, cu
depire
Fr semn,
fr depire
Cu semn, cu
depire
Fr semn,
fr depire
Cu semn, cu
depire
Fr semn,
fr depire
Cu semn, cu
depire
Fr semn,
fr depire
Cu semn, cu
depire
Fr semn,
fr depire
Cu semn, cu
depire
Fr semn,
fr depire
Cu semn, cu
depire
Fr semn,
fr depire

Operaia
efectuat
rd |rs|
rd - rs
rd - rs
rd rs + imm

abs $t1, $t2


neg $t1, $t2
negu $t1, $t2
add $t1, $t2, 1

rd rs + imm

addu $t1, $t2, 1

rd rd + imm

add $t1, 1

rd rd + imm

addu $t1, 1

rd rs - imm

sub $t1, $t2, 1

rd rs - imm

subu $t1, $t2, 1

rd rd - imm

sub $t1, 1

rd rd + imm

subu $t1, 1

rd rs * rt

mulo $t1, $t2, $t3

rd rs * rt

mulou $t1, $t2, $t3

rd rs / rt

div $t1, $t2, $t3

rd rs / rt

div $t1, $t2, $t3

rd rs % rt

rem $t1, $t2, $t3

rd rs % rt

remu $t1, $t2, $t3

Exemplu

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
sub $t4,$t4,$t3
li $v0,10
syscall

#$t4 = $t1+$t2
#$t4 = $t4-$t3

10

 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:


Instruciune

and rd, rs, rt


andi rt, rs, imm
or rd, rs, rt
ori rt, rs, imm
xor rd, rs, rt
xori rt,rs,imm
nor rd, rs, rt

Operaia
Format
efectuat
rd rs AND rt
R
rt rs AND imm I
rd rs OR rt
R
rt rs OR imm
I
rd rs XOR rt
R
rt rs XOR imm I
rd rs NOR rt
R
Tabel 6. Instruciuni logice

11

Exemplu
and $t1, $t2, $t3
andi $t1, $t2, 10
or $t1, $t2, $t3
ori $t1, $t2, 10
xor $t1, $t2, $t3
xori $t1, $t2, 10
nor $t1, $t2, $t3

 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:

Pseudoinstruciune
not rd, rs
nor rd, rs, imm
and rd, rs, imm

Operaia efectuat
rd NOT rs
rd rs NOR imm
rd rs AND imm

Exemplu
not $t1, $t2
nor $t1, $t2, 10
and $t1, $t2, 10

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
sll rd, rt, imm

Operaia efectuat
Shift Left Logical

Format
Exemplu
R
sll $t1, $t2, 2

rd rt << imm

srl rd, rt, imm

- se deplaseaz biii la stnga cu imm poziii;


- biii care ies din word prin stnga se pierd;
- locurile goale ramase in dreapta se
completeaz cu 0.
Shift Right Logical
rd rt >> imm

12

srl $t1, $t2, 2

sra 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.
Shift Right Arithmetic

sra $t1, $t2, 2

sllv $t1, $t2, $t3

srlv $t1, $t2, $t3

srav $t1, $t2, $t3

rd rt >> imm

sllv rd, rt, rs


srlv rd, rt, rs
srav rd, rt, rs

- 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.
Shift Left Logical Variable
rd rt << rs
Shift Right Logical Variable
rd rt >> rs
Shift Right Arithmetic Variable
rd rt >> rs
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
rol rd, rt, rs

Operaia efectuat
Exemplu
Rotation On Left
rol $t2, $t1, $t0
- 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.

13

ror rd, rt, rs

Rotation On Right
ror $t2, $t1, $t0
- 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.
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_20022003/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

14

S-ar putea să vă placă și