Docsity
Docsity

Prepara tus exámenes
Prepara tus exámenes

Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity


Consigue puntos base para descargar
Consigue puntos base para descargar

Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium


Orientación Universidad
Orientación Universidad


ec sessio lab, Apuntes de Diseño

Asignatura: Materiales y Tecnología, Profesor: j.vazquez j.vazquez, Carrera: Diseño de Productos, Universidad: arte-diseño

Tipo: Apuntes

2013/2014

Subido el 18/11/2014

botela
botela 🇪🇸

1 documento

1 / 18

Toggle sidebar

Esta página no es visible en la vista previa

¡No te pierdas las partes importantes!

bg1
Quadern de laboratori
Estructura de Computadors
Montse Fernández
Jordi Linares
Joan Manuel Parcerisa
Rubèn Tous
Jordi Tubella
Departament d’Arquitectura de Computadors
Facultat d’Informàtica de Barcelona
Quadrimestre de Tardor - Curs 2012/13
Aquest document es troba sota una llicència Creative Commons
pf3
pf4
pf5
pf8
pf9
pfa
pfd
pfe
pff
pf12

Vista previa parcial del texto

¡Descarga ec sessio lab y más Apuntes en PDF de Diseño solo en Docsity!

Quadern de laboratori

Estructura de Computadors

Montse Fernández

Jordi Linares

Joan Manuel Parcerisa

Rubèn Tous

Jordi Tubella

Departament d’Arquitectura de Computadors

Facultat d’Informàtica de Barcelona

Quadrimestre de Tardor - Curs 2012/

Aquest document es troba sota una llicència Creative Commons

Licencia Creative Commons

Esta obra está bajo una licencia Reconocimiento-No comercial-Compartir bajo la misma licencia 2. España de Creative Commons. Para ver una copia de esta licencia, visite

http://creativecommons.org/licenses/by-nc-sa/2.5/es/

o envie una carta a

Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.

Usted es libre de:

  • copiar, distribuir y comunicar públicamente la obra
  • hacer obras derivadas Bajo las condiciones siguientes:
  • Reconocimiento. Debe reconocer los créditos de la obra de la manera especificada por el autor o el licenciador (pero no de una manera que sugiera que tiene su apoyo o apoyan el uso que hace de su obra).
  • No comercia l. No puede utilizar esta obra para fines comerciales.
  • Compartir bajo la misma licencia. Si altera o transforma esta obra, o genera una obra derivada, sólo puede distribuir la obra generada bajo una licencia idéntica a ésta.
  • Al reutilizar o distribuir la obra, tiene que dejar bien claro los términos de la licencia de esta obra.
  • Alguna de estas condiciones puede no aplicarse si se obtiene el permiso del titular de los derechos de autor
  • Nada en esta licencia menoscaba o restringe los derechos morales del autor.

Advertencia: Este resumen no es una licencia. Es simplemente una referencia práctica para entender el Texto Legal (la licencia completa). Los derechos derivados de usos legítimos u otras limitaciones reconocidas por ley no se ven afectados por lo anterior.

Sessió 0: Introducció Estructura de Computadors

Un cop tenim un programa sintàcticament correcte el podeu executar, però això no implica

que el programa sigui correcte. Totes les instruccions poden ser correctes, però pot faltar la

condició de final d’un bucle (i que aquest no acabi mai) o que, senzillament, el programa no

faci el que volem. Aquests errors només es poden detectar en temps d’execució, i per tal

d’eliminar-los haureu de fer servir les eines de depuració de programes que proporciona el

MARS^1. Les eines de depuració permeten executar el programa instrucció a instrucció i

veure tots els valors que es van calculant, de manera que podeu trobar els errors.

Al laboratori, l’entorn de desenvolupament dels nostres programes serà sota Linux , però el

programa que farem servir està escrit en Java i per tant a casa el podreu fer servir en

qualsevol plataforma (Windows, Mac, etc.).

El llenguatge assemblador emprat al laboratori serà el MIPS (és el que usen processadors

com el MIPS R4000 de 32 bits). Podeu trobar-ne una descripció detallada a l’apèndix B.

del llibre de Patterson & Hennessy^2 així com una referència ràpida al menú d’ajuda del

programa MARS (tecla F1 ), i també en un opuscle que publiquem a la web d’EC.

Introducció al Llenguatge Assemblador MIPS R

El codi incomplet de la Figura 0.1 mostra l’esquelet d’un programa en assemblador MIPS.

Observeu que els comentaris s’escriuen utlitzant el símbol "#", i que les paraules

començades amb un "." són directives del llenguatge. És important tenir en compte que el

llenguatge és case-sensitive , és a dir, que diferencia entre majúscules i minúscules.

  1. Les eines de depuració normalment les proporciona un programa independent (depurador o debugger)
  2. D. A. Patterson and J. L. Hennessy. Computer Organization and Design. The Hardware/Software Interface, 4th edition, Morgan Kaufmann.

.data nomvariable1: .word 0 # comentari nomvariable2: .word 0, 0, 0, 0 # vector d’enters

... altres variables

.text .globl main # fem main global per cridar-la de fora main: addu $t0, $t0, $t1 # Instrucció suma

... altres instruccions

etiq: # Etiqueta per a un salt

... altres instruccions

b etiq # Salt a etiq

... altres instruccions

jr $ra # Retorna

Figura 0.1: Esquelet d’un programa en assemblador MIPS.

Estructura de Computadors Sessió 0: Introducció

Quan el programa es tradueix a codi màquina, el muntador hi afegeix un petit fitxer amb

l’anomenat codi de "startup" ( startup.s ), que en el nostre cas conté el següent codi:

jal main li $v0, 10 syscall

La 1a instrucció simplement salta a l’etiqueta main (fa una "crida a main ", s’estudiarà al tema

3). Per tal que l’etiqueta main sigui referenciable des d’un fitxer extern com aquest cal que la

declarem global, i és per això que al inici del nostre programa hem escrit: .globl main.

Al final de la funció main observaràs que apareix la instrucció: jr $ra. Aquesta instrucció

retorna al punt on ha estat invocada la funció main (s’estudiarà també al tema 3), de manera

que s’executaran les dues darreres instruccions del codi de "startup". Aquestes invoquen la

"crida al sistema" exit(), que finalitza el programa, allibera els recursos que estava usant

(memòria, etc. ) i retorna el control al sistema operatiu. S’explicarà més endavant en el curs.

Registres

MIPS és una arquitectura del tipus load store , això vol dir que únicament les instruccions load

i store (lw, sw, etc.) accedeixen a memòria. Totes les instruccions de còmput (aritmètiques,

etc.) treballen exclusivament sobre els 32 registres de 32 bits de ofereix el processador (a

banda dels disponibles als coprocessadors, que es veuran més endavant). Els registres

tenen 2 noms alternatius, número ($0, $1, etc.) i nom alfanumèric ($zero, $at, etc.), tots dos

es poden usar al codi. A continuació es mostra la llista dels 32 registres (els que fareu servir

en aquesta sessió apareixen ressaltats en negreta):

Número : Nom $0 : $zero (conté el valor 0, es pot llegir però no modificar) $1 : $at (registre temporal reservat per a pseudoinstruccions) $2-$3 : $v0-$v1 (resultats de funcions i expressions) $4-$7 : $a0-$a3 (paràmetres en una subrutina) $8-$15 : $t0-$t7 (temporals) $16-$23 : $s0-$s7 (temporals que es preserven en una crida a una subrutina) $24-$25 : $t8-$t9 (temporals) $26-$27 : $k0-$k1 (reservats per al S.O.) $28 : $gp (global pointer) $29 : $sp (stack pointer) $30 : $fp (frame pointer) $31 : $ra (return address)

Durant aquesta sessió farem servir els registres temporals $t0..$t7.

Estructura de Computadors Sessió 0: Introducció

Declaració i emmagatzematge d’un vector

Els programes d’exemple d’aquesta sessió de laboratori fan un ús bàsic d’un vector. Els

vectors són agrupacions unidimensionals d’elements de tipus homogenis, els quals

s’identifiquen per un índex. Els elements es guarden en posicions consecutives de memòria,

a partir de l’adreça inicial del vector, respectant les regles d’alineació dels elements.

EXEMPLE: En C, declarem la variable global vec com un

vector de 100 elements int així ( vec es guardarà en una

adreça múltiple de 4):

int vec[100];

En MIPS serà:

.data vec: .space 400

Accés (aleatori) a un element d’un vector

Els elements d’un vector s’especifiquen per un índex. En

C, el primer element sempre té índex zero. Per exemple,

la sentència:

vec[i] = 10;

En MIPS serà, suposant que i està en $s1 i que vec és

global:

.data la $t0, vec # vec sll $t1, $s1, 2 # 4*i addu $t0, $t0, $t1 # @vec[i] li $t1, 10 sw $t1, 0($t0)

Pseudoinstruccions MIPS SINTAXI SEMÀNTICA EXPANSIÓ #load immediate li rdest, imm

rdest = imm Carrega l’immediat a un registre

si (imm >16bits) lui $at, hi(imm) ori rdest, $at, lo(imm) si (imm <=16bits) addiu rdest, $szero, imm #load address la rdest, etiq

rdest = adreça d’etiq lui $at, hi(etiq) ori rdest, $at, lo(etiq) Copia l’adreça d’una etiqueta a un registre #branch b etiq

Salt incondicional a etiq beq $0,$0 etiq

vec: vec[0] vec[1] vec[2]

vec[99]

vec: vec[0] vec[1] vec[2]

vec[i]

  • • •

4 bytes

4*i bytes

@vec[i] = vec + 4*i

Sessió 0: Introducció Estructura de Computadors

Enunciats de la sessió

Activitat 0.A: Autentificació i primers passos de la sessió

Les pràctiques de l’assignatura es poden fer en els laboratoris del DAC, al mòdul D6 o bé en

els de la FIB, als mòduls A5, B5 o C6. La identificació en el sistema és diferent segons l’aula

on es treballi. Quan es posen en marxa surt un menú que permet triar el sistema operatiu en el

que volem treballar.

A les aules del DAC heu de triar la imatge EC i es carregarà el sistema Linux. Un cop

carregat (pot trigar uns quants minuts), pot ser que us demani autentificació, i heu d’entrar al

sistema amb el nom d’usuari alumne , i amb clau d’accés alumne. Per fer les sessions nor-

mals en tenim prou amb aquest compte. Per fer la sessió d’examen entrarem en uns comptes

especials que s’explicaran en el mateix moment de l’examen. Un cop dins el sistema cal saber

que teniu accessible el disc dur local del PC en què treballeu per guardar-hi els fitxers de tre-

ball. Aquesta zona de disc pertany a l’usuari genèric "alumne", hi té accés qualsevol, i

s’esborra cada cop que es reinicialitza. Per tant, la manera de conservar els fitxers creats d’una

sessió per una altra és endur-se’ls en una clau de memòria USB. Sols cal insertar-la i en pocs

instants estarà visible el seu contingut, des del navegador, o bé des d’una finestra de terminal.

Cada vegada que s’engega el PC s’ha de carregar la imatge del sistema operatiu triat.

Aquesta operació és costosa: pot trigar de l’ordre de 3 minuts a baixar la imatge, descompri-

mir els fitxers i posar en marxa el sistema operatiu. Només ens podrem estalviar aquesta ope-

ració quan l‘últim usuari que hagi estat en el mateix PC, hagi utilitzat Linux, i hagi sortit de la

sessió sense apagar el PC: amb l’opció "Surt... -> Sortir de la sessió" que es troba associada a

una icona amb el nom "alumne" a l’extrem dret de la barra de menús de l’escriptori (o bé amb

la comanda logout , si es fa des d’una finstra de terminal).

A les aules de la FIB heu de triar la imatge ’Linux’. Un cop carregada heu d’entrar al

sistema amb el vostre nom d’usuari i password personal. Un cop engegat el sistema, tindreu

accés a la vostra zona de disc personal al servidor, on anireu guardant els vostres fitxers de tre-

ball durant el curs. També en aquest cas podem llegir i copiar fitxers en una clau USB, però no

és indispensable. El procediment requereix insertar la clau, i clicar la icona dels "dispositius

USB". Abans de retirar la clau és convenient seguir el mateix procés, però seleccionant "Des-

muntar dispositiu".

Sessió 0: Introducció Estructura de Computadors

Activitat 0.B: Edició de fitxers

Verifiqueu que heu copiat els fitxers plantilla al vostre directori personal tal com s’explica a

l’activitat 0.A. Totes les etapes (inclosa l’edició del programa en assemblador o font) les rea-

litzarem amb el programa MARS. Per tal d’executar aquest programa caldrà fer^1 :

$ java -jar /assig/ec/Mars/Mars.jar

Alternativament, podeu obrir la carpeta fent doble clic a la icona EC de l’escriptori, navegar a

la subcarpeta Mars , i fer clic amb el botó dret del ratolí sobre el fitxer Mars.jar , seleccionant

Executar amb Java 1.6 d’entre les opcions que es mostren.

Un cop obert el simulador Mars, seleccioneu l’opció de menú File/Open, per obrir el fit-

xer font s0a.s , que prèviament heu copiat en algun dels vostres directoris:

  1. Als laboratoris ja tindreu instal·lat el Java, i la ruta a l’executable java correctament afegida a la vari- able d’entorn path. Si ho voleu provar a casa, potser us haureu de descarregar el Java (http://java.sun.com/ javase/downloads/widget/jdk6.jsp) i modificar la variable path (http://www.troubleshooters.com/linux/pre- postpath.htm)

.data V: .word -1, -2, -3, -4, -5, -6, -7, -8, -9, -10 # vector d'enters

.text .globl main main: li $t0, 0 # $t0 = 0 (variable suma) li $t1, 0 # $t1 = 0 (comptador del bucle i) li $t2, 10 # $t2 = 10 (límit del comptatge) bucle: slt $t3, $t1, $t beq $t3, $zero, fibucle # Després de 10 voltes acaba la $t3, V # $t3 = Adreça inicial de V sll $t4, $t1, 2 # $t4 = 4i (cada element ocupa 4 bytes) addu $t3, $t3, $t4 # @V[i] = @V + 4i lw $t3, 0($t3) # Llegim un element $t3 = V[i] addu $t0, $t0, $t3 # Acumulem. suma = suma + V[i] addiu $t1, $t1, 1 # i++ b bucle # salt incondicional fibucle:

Figura 0.2: Programa s0a.s, que suma els elements de V, i ho guarda a $t.

int V[N] = {-1, -2, -3, -4, -5, -6, -7, -8, -9, -10}; void main() { int suma = 0, i = 0; while ( i < 10) { suma = suma + V[i]; i++; } }

Figura 0.3: Programa equivalent en C, que calcula la suma dels elements de V.

Estructura de Computadors Sessió 0: Introducció

Activitat 0.C: Assemblatge i depuració

La generació de codi màquina a partir del codi assemblador la farem seleccionant l’opció de

menú Run/Assemble o prement la tecla F3. Aquesta comanda assemblarà el fitxer de codi font

s0a.s i carregarà a la memòria el codi màquina resultant. Cal tenir en compte que el procés

d’assemblatge pot generar errors. Sempre que ens trobem amb un error, el que haurem de fer

és fixar-nos en el comentari que l’acompanya i anotar el número de línia on s’ha detectat. Lla-

vors cal intentar corregir-lo editant novament el fitxer i tornant a assemblar el programa. Això

és un procés iteratiu fins que no s’obtinguin errors.

Per exemple, editeu el fitxer s0a.s, i canvieu li $t2,10 per la instrucció li $T2,10. A

continuació torneu a assemblar el programa i observeu el missatge d’error. Ara corregiu

l’error, i torneu-lo a assemblar. A continuació s’explicaran breument les comandes més usuals

de depuració. És convenient cridar totes les comandes de depuració amb el teclat (no amb el

ratolí!), mitjançant combinacions de tecles (hotkeys). La majoria estan disponibles en el menú

Run. Per exemple, prement la tecla F5 executareu el vostre programa tot d’una tirada.

Activitat 0.D: Panells del MARS

Un cop assemblat el programa, Mars mostra automàticament la pestanya "Execute" amb l’apa-

rença inicial que es pot veure a la Figura 0.4, i està formada per 5 panells o finestres. Cada

panell conté un tipus d’informació. Completeu l’exercici 0.

4

1

2

3

Figura 0.4: Els 5 panells

Menú

5

Exercici 0.1: Podeu provar per exemple a modificar la configuració inicial de panells

sel·leccionant/desel·leccionant al menú Settings l’opció " Show labels window " per fer

aparèixer o desaparèixer el panell 5. Els canvis que hi feu es conservaran d’una sessió

per una altra.

Estructura de Computadors Sessió 0: Introducció

Activitat 0.G: Vista dels Registres

Es troba en el panell 3 i consta de 3 pestanyes. A la primera pestanya anomenada ’ Registers

es mostra el contingut dels 32 registres de propòsit general, el pc, i els registres hi i lo que

s’estudiaran més endavant. Els seus valors es poden veure en decimal o hexadecimal, selecci-

onant-ho a les opcions que apareixen a la vista de dades (panell 2)Les altres dues pestanyes

Coproc0 ’ i ’ Coproc1 ’ mostren els registres dels coprocessadors en hexadecimal i decimal.

Activitat 0.H: Execució de programes

Aquesta és la funcionalitat més important del MARS. Hi ha dues maneres principals d’execu-

tar un programa: execució pas a pas o bé execució contínua amb punts d’aturada. Haureu de

saber fer servir les dues per poder depurar errors de forma eficient.

a) Execució Pas a pas : El PC sempre conté l’adreça de la següent instrucció a executar,

la qual està resaltada en color al panell 1 (punt d’execució). Prement la tecla F7 s’executa la

instrucció apuntada pel PC i s’actualitza automàticament el valor dels registres i dades de

memòria en tots els panells. Si s’ha fet un accés a un registre, aquest queda ressaltat. Aquest és

el mètode més útil per a programes petits com els que nosaltres escriurem. Completeu l’exer-

cici 0.

  • Reinicialització dels registres (també del PC) i variables de memòria del programa:

Premeu F12 per tornar a executar el programa des del principi.

b) Execució contínua : Prement la tecla F5 , el programa s’executarà fins al final (o fins

al primer punt d’aturada que trobi, segons veureu al següent apartat). És el mètode més útil per

veure ràpidament els resultats d’un programa llarg, suposant que no té errors. Completeu

l’exercici 0.5:

Observeu que el valor de la suma de tots els elements del vector es -55.

Exercici 0.4: Deixeu el programa s0a.s tal com estava a l’inici, i executeu-lo pas a

pas prement F7. Observeu com es ressalten els diferents registres i com el registre $t

va acumulant el resultat.

Exercici 0.5: Premeu F12 per recarregar el programa i executeu-lo fins al final amb

F5. Quin és el valor del registre $t0?

Sessió 0: Introducció Estructura de Computadors

c) Execució contínua amb punts d’aturada : Sovint, els programes tenen errors i cal

executar-los pas a pas per descobrir l’error. Però si són molt llargs, resulta pesat i és molt més

pràctic executar-los de forma contínua, però aturant-nos en algun punt clau. Aquest punt rep el

nom de punt d’aturada, i és una marca situada en una instrucció perquè el programa s’aturi

abans d’executar-la. Per afegir un punt d’aturada sols cal marcar la instrucció on volem ubi-

car-lo a la columna de l’esquerra del panell de Codi Desassemblat. Es poden afegir i treure

tants punts d’aturada com es vulguin o eliminar-los tots de cop amb l’opció del menú corres-

ponent. Polsant F5 s’executarà el programa de forma contínua fins al primer punt d’aturada

que trobi. Tornant a polsar F5, el programa continua executant-se fins al següent punt d’atu-

rada que trobi, ja sigui el mateix o un altre. Completeu l’exercici 0.

Activitat 0.I: Modificació de dades de memòria i de registres

Per poder modificar el contingut d’un registre o posició de memòria únicament heu de sel·-

leccionar la cel·la del panell corresponent, esborrar el seu valor i a continuació introduir el nou

valor. Completeu l’exercici 0.

Exercici 0.6: Reinicieu de nou el programa amb F12. Al panell 1 (codi) afegiu un punt

d’aturada sobre la instrucció addu $t0, $t0, $t3 (situada després del lw). A

continuació executeu fins al punt d’aturada polsant F5. Observeu com es resalta la

instrucció que heu marcat. Observeu a la vista de Registres que $t3 ha estat modificat.

El seu valor és -1, ja que és el primer element del vector. Si aneu polsant F

repetidament, anireu executant iteració per iteració i podreu comprovar quins valors

llegeix de la memòria la instrucció lw. Quins valors pren el registre $t3 al llarg de

l’execució de tot el programa?:

Exercici 0.7: Recarregueu el programa de nou (F12). Modifiqueu el contingut

d’alguns elements del vector. Per exemple, modifiqueu el primer element del vector,

posant-li valor 0x00000001. Després, modifiqueu el darrer element del vector posant-

li el valor -11.

A continuació executeu el programa fins al final (F5). Comproveu que el resultat

de la suma que tenim a la variable $t0 ha de ser ara -54.

Sessió 0: Introducció Estructura de Computadors

L’error que heu detectat es pot solventar de moltes maneres, però ens interessa fer-ho sense

incrementar el número d’instruccions del bucle. Una possible solució seria la que a continua-

ció es mostra en alt nivell, que és correcte, però no es correspon amb el programa en assembla-

dor:

Completeu l’exercici 0.

int V[N] = {-1, -2, -3, -4, -5, -6, -7, -8, -9, -10}; void main() { int suma, i; suma = 0; i = 10; do { i--; suma = suma + V[i]; } while (i != 0); }

Figura 0.6: Programa (correcte) equivalent en C, que calcula la suma dels elements de V.

Exercici 0.9: Correcció del programa anterior.

  • Basant-vos en la versió proposada en alt nivell, corregiu el programa del fitxer

s0b.s. Únicament heu de canviar una línia de codi de posició i modificar una

constant. Quina és aquesta instrucció?

  • Executeu-lo amb F5 i observeu que el resultat final en $t0 és -55.

Estructura de Computadors Sessió 0: Introducció

Activitat 0.K: Depuració de programes mitjançant punts d’aturada

Aquest exercici de depuració parteix del programa en C (correcte), que es mostra a la Figura

0.7 i que calcula la mitjana aritmètica dels elements d’un vector.

El programa comença sumant a la variable suma els elements d’un vector (com l’altre), i cal-

culant a la variable i el nombre total d’elements. Després calcula la mitjana fent la divisió

suma / i , però aquest programa té la particularitat que fa la divisió per mitjà un bucle que va

restant el divisor (el nombre d’elements del vector) al dividend (la suma) tantes vegades com

sigui possible.

Se suposa que un programador l’ha traduït a assemblador MIPS, i el resultat es mostra a la

Figura 0.8. El programa sembla correcte però el programador ha comès un error, que haurem

d’intentar trobar. Observem que la variable suma ocupa el registre $t0, la variable i ocupa el

registre $t1, i el quocient de la divisió queda en el registre $t3.

int V[N] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

void main() { int suma, i, dividend, divisor, quocient; suma = 0;

/* Calculem la suma */ i = 0; while ( i < 10) { suma = suma + V[i]; i++; }

/* Calculem la mitjana aritmètica (suma/i) / dividend = suma; divisor = i; quocient = 0; / això serà la mitjana */ while (dividend >= divisor) { dividend = dividend - divisor; quocient++; } }

Figura 0.7: Programa (correcte) en C que calcula la mitjana dels elements de V.