










Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity
Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium
Prepara tus exámenes
Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity
Prepara tus exámenes con los documentos que comparten otros estudiantes como tú en Docsity
Encuentra los documentos específicos para los exámenes de tu universidad
Estudia con lecciones y exámenes resueltos basados en los programas académicos de las mejores universidades
Responde a preguntas de exámenes reales y pon a prueba tu preparación
Consigue puntos base para descargar
Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium
Comunidad
Pide ayuda a la comunidad y resuelve tus dudas de estudio
Ebooks gratuitos
Descarga nuestras guías gratuitas sobre técnicas de estudio, métodos para controlar la ansiedad y consejos para la tesis preparadas por los tutores de Docsity
Asignatura: Materiales y Tecnología, Profesor: j.vazquez j.vazquez, Carrera: Diseño de Productos, Universidad: arte-diseño
Tipo: Apuntes
1 / 18
Esta página no es visible en la vista previa
¡No te pierdas las partes importantes!











Aquest document es troba sota una llicència 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
o envie una carta a
Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.
Usted es libre de:
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
Al laboratori, l’entorn de desenvolupament dels nostres programes serà sota Linux , però el
programa MARS (tecla F1 ), i també en un opuscle que publiquem a la web d’EC.
Introducció al Llenguatge Assemblador MIPS R
.data nomvariable1: .word 0 # comentari nomvariable2: .word 0, 0, 0, 0 # vector d’enters
.text .globl main # fem main global per cridar-la de fora main: addu $t0, $t0, $t1 # Instrucció suma
etiq: # Etiqueta per a un salt
b etiq # Salt a etiq
jr $ra # Retorna
Estructura de Computadors Sessió 0: Introducció
jal main li $v0, 10 syscall
Registres
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)
Estructura de Computadors Sessió 0: Introducció
Declaració i emmagatzematge d’un vector
int vec[100];
.data vec: .space 400
Accés (aleatori) a un element d’un vector
vec[i] = 10;
.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ó
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
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 :
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:
.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:
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++; } }
Estructura de Computadors Sessió 0: Introducció
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.
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
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ó
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.
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.
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.
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); }
Exercici 0.9: Correcció del programa anterior.
s0b.s. Únicament heu de canviar una línia de codi de posició i modificar una
constant. Quina és aquesta instrucció?
Estructura de Computadors Sessió 0: Introducció
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++; } }