You are on page 1of 150
instrucciones: el lenguaje dei computador 2.4 Introducclén 76 Yo hablo castellano con 2.2 Operaciones del hardware del computador 77 Dios, italiano con las 2.3 Operantos del hardware del computador 0 2.4 Niimeros con signo y sin signo 87 mujeres, francés con los 2.8 Representacion de instrucciones en ef hombres y alemdn con computador 94 mi caballo. 2.6 Gperaciones légicas 102 2.7 instrucciones para la toma de decisiones 105 Carlos V, rey de Francia 7 137-1380 2.8 fipoyo a'los procedimientes en el hardware del computador 112 2.49 ada 22 243 244 2.48 2.46 247 248 249 2.20 2.24 ‘Comusicarse con la gente 122 Direcciones y direccionamiente inmediato MIPS para 32 bits 128 Paralelismo e instrucciones: sineronizacién 137 ‘Traduecién @ inicio de un programa 139 Un ejemplo de ordenamiento en C para verlo todo junto 149 Tablas frente a punteros 157 Perspectiva histérica y lecturas recomendadas 161 Caso real: instrucciones ARM 161 instrucciones x86 165 Falacias y erveres habituales 174 Conclusiones finales 176 Perspectiva histérica y lecturas recomendadas 179 Ejercicios 179 Gases reales: ‘Nota importante: Ena presente edciin en castellano, los contenidos del CD inclido ena edicn original en inglés) son acess través de la ppina web wors.cverte com/microstes/pattersonhennessy. Aunque en a presents eicion ose proporciona.un CD-ROM fico, alo largo de todo el texto ae mencione el CD ye uliza el icono quelorepretenta para hacer referencia a su contenido. Los cinco componentes clasicos de un computador Complador Evaluaciia las pestacones 16 Repertorio de instruc- ciontes: vocabulario de comandos entendides por una arquitectara concreta Capitulo 2. Instruecionos: el tenguaje det computador Introduccion Para dominar el hardware de un computador debemos hablar su lenguaje. Las palabras del lenguaje del computador se denominan instrucciones, y su vocabu- lari se denomina repertorio de instrucciones. En este capitulo veremos el repertorio de instrucciones de un computador real, en la forma escrita por los humanos y en la forma leida por el computador. Introduciremos instrucciones desde el nivel alto hasta el nivel bajo (top-down): comenzando desde una nota- ‘eion gue parece un lenguaje de programaci6n limitado, la refinaremos paso a paso hasta que veamos el lenguaje real de un computador real. El capitulo 3 contintia en el mismo orden descendente, y muestra la representacién de néimeros enteros y en punto flotante y el hardware que opera con ellos. Podriamos pensar que los lenguajes de los computadores son tan diversos como los distintos idiomas de los humanos, pero en realidad son bastante simi- ares, mas parecidos a dialectos regionales que a lenguas independientes. Por tanto, una vez que se aprende uno, es facil aprender otros. Esta similitud ocurre porque todos los computadores utilizan tecnologias hardware similares basadas en principios similares y porque hay un conjunto de operaciones basicas que todos los computadores deben proporcionar. Por otra parte, los disefiadores de computadores comparten una meta comtin: encontrar un lenguaje que haga facil construir el hardware y el compilador, a la vez que se maximiicen las presta ciones y se minimice el coste y la potencia consumida, Esta meta ha sido una constante a lo largo del tiempo. La siguiente cita fue escrita antes de que se pudiera comprar un computador, y es tan verdad hoy como lo fue en 1947: Es facil ver mediante métodos ldgico-formales que existen ciertos [repertorios de instrucciones) que son adecuados en abstracto para controlar y ejecutar cual- quier secuencia de operaciones... Las consideraciones realmente decisivas, des- de el punto de vista actual, al seleccionar un [repertorio de instrucciones] son rds bien de naturaleza prdctica: la simplicidad del equipo pedido por el [reper- torio de instrucciones] y la claridad de su aplicacién a los problemas realmente importantes, junto con la velocidad en el manejo de esos problemas Burks, Goldstine y von Neumann, 1947 La “simplicidad del equipo” es una consideracién tan valiosa para los com- putadores de los afios 2000 como lo fue para los de los aftos 50. La finalidad de este capitulo es enseflar un repertorio de instrucciones que siga esta premisa: mostrar cémo se representa en el hardware y la relaci6n entre el lenguaje de programacién de alto nivel y el lenguaje del computador més primitivo. En nuestros ejemplos utilizaremos el lenguaje de programacién C. La {i seccion 2.15 en ei CD muestra como éstos cambiarian para un lenguaje orientado a objetos tipo Java. 0 pu bie tre rij AF rel pa bi: cic To ler ine le: Po un Po Ot len Bu » Las ‘abu: 9s el or los jones nota: lo 3 n de ersos simi- = Por sadas s que esde haga estas una ie 1947 om- ide nisa: ie de "En cién, doa 2.2 Operasiones dal hardwave det computador ‘Aleprender a representar instrucciones también descubriremos el secreto de la computacién: el concepto de programa almacenado. Ademis, ejercitaremos nuestra habilidad con un “idioma extranjero” escribiendo programas en el lenguaje del com- potador Y ejecutindolos en el simulador que proporcionamos con este libro. Tam- bién veremos el impacto de los lenguajes de programacién y la optimizacion del compilador en las prestaciones. Concluitemos con un vistazo a la evolucién histérica del repertorio de instrucciones y con un repaso de otros dialectos del computador. Hl repertorio de instracciones elegido proviene de MIPS, un repertorio de ins- ‘rucciones tipico disetiado a partir de 1980, Mas adelante, daremos una vision rapida de otros dos repertorios de instrucciones muy populares. ARM es bastante similar a MIPS y en 2008 se han vendido mds de 3000 millones de procesadores ARM en dispositivos empotrados. El otro ejemplo, Intel x86, esté en el interior de Je mayoria de los 330 millones de PCs fabricados en 2008. Mostraremos el repertorio de instrucciones MIPS por partes, una cada vez, relaciondndola con la estructura del computador. Este tutorial top-down relaciona, paso a paso los componentes con sus explicaciones, haciendo el lenguaje ensam- blador més digerible. La figura 2.1 da una visién general del repertorio de Instruc- ciones de este capftalo. Operaciones del hardware del computador ‘Todo computador debe ser capaz de realizar cAlculos aritméticos. La notacién del Tenguaje ensamblador MIPS: add a, b,c indica a un computador que sume las variables b y cy que coloque el resultado en a. Esta notacién es rigida en el sentido de que cada instruccién aritmética MIPS lleva a cabo sélo una operacion y debe tener siempre exactamente tres variables. Por ejemplo, Suponga que queremos colocar la suma de las variables b, c, dy € en. Ja variable a (en esta seccion se esté siendo deliberadamente vago sobre lo que es tuna “variable” ; en la seccién siguiente lo explicaremos en detalle). La siguiente secuencia de instrucciones suma las cuatro variables: add a,b, ¢ # 1a suma de b yc se coloca ena add a, a, d # 1a suma de b, cy d esté ahora en a add a, a, & # la suma de b, c, dy e esta ahora en a Por tanto, se necesitan tres instrucciones para realizar la suma de cuatro variable. Las palabras a la derecha del simbolo sostenido (#) en cada una de las lineas anteriores son comentarios para el lector y son ignorados por el computador. Observe que, a diferencia de otros lenguajes de programacién, cada linea de este lenguaje puede contener como mucho tna instrucciéa. Otra diferencia con el len- guaje Ces que los comentarios siempre terminan al final de una linea. 7 Concepto de programa almacenado: la idea de Que instruccionesy datos de diferentes tpas se pueden almacenar en tox nostleva al concept de computador de pro- rama alracenado. “Ciertamente, deben cexistristrucciones para realizar las operaciones aritmsétcas fundamen tales.” Burks, Goldstine y von ‘Neumann, 1947 3 Fonguaje dot computador Operandos MIPS $s0-$87, $00-819, ‘Localizaciones répidas para los datos. En MIPS, fos datos deben estar en los registros para ——Tiemant Tecesbies solamente po nstruasones de Wensferencia de datos. MIPS ula direccones 2™ palabras | Memon{4l,.... Ge byte, de modo que las direcciones de palsbres consecutivas se diferencian en 4. nr oi a os ‘add $51,352,853 | $81 = $52 + $53 [Tres operandos; datos en registros: [lead word Tw ¥e1, 100($82) | $51» Memon{ss2 + 100) | Plabea ce memoria a ego Toad hait isi Fsi,100(3s2) | $si = Memory($52 + 100) | Media palabra de memoria a registro Transferencis | store half ‘$51, 100(452) | Memon{$s2 + 100] = $51 | Media palabra de registro e memoria de dato 'b $51, 100(452) | $51 = MemanjSs2 + 100] | Byte de memoria a registro, TY $51,100 | 551 «200+ 23° Caigar constante en os 16 bits de [seme Tang and $s1,$s2,8s3|$si = $s2 & $53 “Tres registros operandos, AND bit=bit [nor mor _$sl,$52,$s3 = (552 (953) Tres regisiros operandos; NOR bite-bit Legon ‘or mnmediate ort _$si,$52,100 $52 | 400 OR Bitabit registro con constante ‘shift right logical ert $si,s62,10 [$sl=$s2>>10 Desplazamiento a la derecha por ‘branch on equal beq $51,852, | if(ssi 32) go WL | Comprueba igualdad ybiturea relativo Piawers (sa ‘branch on not equal Bre F51,462,0 [e(ssl im sed) gotoL ‘Comprueba si no igual y bifurcs: zl iam eot | ermaes wee on [ine 7 B06 ow 10000 — [Sato ao areceén dostina Sa on eB here ‘pio ra [Pee veto de prosediionts FIGURA 2.1 Lenguaje ensamblatlor MIPS tratado on oste capitulo, Fst informacion ce encuentra tambien ln Tarts de Datos de Refecencia de MIPS, ques incluye con est libro. dos sur dot sen dal pri are 2.2. Operacienes del hardware det computador 73 L 3 5] ndimero natural de operandos para una operacién como la suma es tres: Jos dos niimeros que se suman juntos y el lugar donde se coloca el resultado de la suma. El hecho de que cada instruccién requiera tener exactamente tres operan- dos, ni més ni menos, est de acuerdo con la filosofia de mantener el hardware sencillo: el hardware para un niimero de operandos variable es més complejo que el hardware para un niimero fijo. Esta situacién ilustra el primero de los cuatro principios fandamentales del disefio de hardware: Principio de diseno 1: 1a simplicidad favorece la regularidad. ‘Ahora podemos mostrar, en los dos ejemplos siguientes, la relaci6n que existe entze los programas escritos en lenguaje de programacién de alto nivel y Ios pro- sgramas escritos en esta notacién mas primitiva. nna Compitacién de dos sentencias de asignacién ¢ en Mi Este segmento de un programa en C contiene cinco variables: a, b,c, dye. Puesto que Java se desarrollé a partir de C, este ejemplo y los siguientes son vlidos para ambos lenguajes de programacién de alto nivel. a=bec d=a-e: La traduccién de C a instrucciones del lenguaje ensamblador MIPS la realiza compilader. Mostrar el c6digo MIPS producido por un compilador. Una instruccion MIPS trabaja con dos operandos fuente y coloca el resultado en un operando destino, Por tanto, las dos sentencias simples anteriores se compilan dicectamente en estas dos instrucciones del lenguaje ensamblador MIPS: add a, bc sub d, a, e 2 EE Compllacién de una sentencia ¢ compleja en MIPS Una sentencia un tanto compleja contiene cinco variables: f, 9, hy Ty J donde: Fe(gehy- G4): 4sQué deberia producir un compilador de C? ORESPUESTA Capitulo 2 Instruceionec: et El compilador debe fragmentar esta sentencia en varias instrucciones de en- samblador, puesto que se realiza s6lo una operacién por cada instruccién MIPS, La primera instruccién MIPS calcula la suma de g y h. Debemos colo- car el resultado en algiin lugar, por tanto el compilador crea una variable temporal llamada t0 add t0,g,n # 1a variable temporal tO contiene g +h Aunque la siguiente operacién en C es una resta, necesitamos calcular la suma de { y j antes de poder restar. Por tanto, la segunda instruccién colo- ca la suma de 1 y j en otra variable temporal creada por el compilador lla- mada tl: add t1.i.j # 1a variable temporal tl contiene i + 5 Finalmente, le instrucci6n de restar resta la segunda suma de la primera y co- loca la diferencia en la variable *, completando el cédigo compilado: sub f,t0,ti # f obtiene tO - tl, que es (g + h)-(i + J) Autoevaluacién Para una fimcién dada, ;qué lenguaje de programacién lleva probablemente més Jineas de cédigo? Poner las tres representaciones siguientes en orden: 1, Java 2¢ 3. Lenguaje ensamblador MIPS Extensién: Para incrementar fa portbiidad, Java fue orgnalmente concebido como dependiente de un software intérprete. El repertorio de instucciones de este intépreto se donomina Java tytecodes (véase fj seccién 2.15 en el CD), yes completamente di tinto del repertorio de instrcciones MIPS. Para conseguir unas prestaciones cercanas al programa C eauivalente, los sistemas Java tipicos actueles compilan las Java bytecodes fn un repertorio de instrcciones nativo parecido a MIPS, Debido a que esta campilacién se hace normalmente mucho més tarde que en los programas C, tales complladores Java son ftecuentemente lamados compliedores Justin-Time (Mf). La seccién 2.12 muestra c6mo los compiladores .IT so utlzan mas tarde que los compiladores C en el proceso de arranque de! programa, y la seccién 2.13 muestra las consecuencias en las prestaciones de compilocién frente a las de interpretacién de los programas Java. Operandos del hardware del computador A diferencia de los programas en lenguajes de alto nivel, los operandos de las ins- trucciones aritinéticas tienen restricciones; debemos usar un niimero limitado de posiciones especiales construidas directamente en hardware llamados registros. Los tos! cuat ture dad ylo les ni her cio: tro: Un reli det reg tak 2.8 Opecansies del herdware dat computador ea io Los registros son las piezas para la construccién de un computador: son elemen- celine bdsicos usados en el disefio hardware que son también visibles al programador colo- (gando el computador esté terminado. El tamafio de un registro en la arquitec- rable fart MIDS es de 32 bits; estos grupos de 32 bits son tan frecuentes que se les ha dado el nombre de palabra. Palabra: unidad natural 1 : ‘Una diferencia importante entre las variables de un lenguaje de programaciGn de acceso en un compur ‘ylos registros es su niimero limitado, usualmente 32, en los computadores actua- er; normalmente un lar la es como MIPS, (Vase I fl seccién 2.20 en el CD para conocer la historia del 10RD 4° Bis cure colo- némero de registros.) Asi, continuando de arriba hacia abajo (top-down) con el Seat vr Ha Rurvollo de la representacién simbdlica del lenguaje MIPS, en esta seccién (neg. © pemos aadido le restrcciéa de que cada uno de los tres operandos de las instruc ‘cones aritméticas MIPS debe elegitse a parti de uno de [os 32 registros de 32 bits. ia razon del limite de 32 registros se puede encontrar en el segundo de nues- yoo | $osstato principosfundamentales del diseo de hardvare: i Principio de diseno 2: Cuanto mas pequefio, més rapido. + §) | Unswimero muy grande de registros puede aumentar Ia duraci6n del ciclo de reloj, simplemente porque se necesitan sefiales electrOnicas mas largas cuando sands eben viajar mas lejos. Directrices tales como “cuanto més pequefio, més répido” no son absolutas; 31 registros pueden no ser mas rapidos que 32. Aun ast, la verdad que hay detrés de tales observaciones obliga a los disefiadores de computadores a tomarlas en serio. | Eneste caso, el disefiador debe equilibrar el ansia de programar con mis registros con el deseo de mantener el ciclo de reloj répido. Otra razén para no usar més de 32 registros ¢s el ndmero de bits que ocuparia en el formato de instrucci6n, como muestra la seccién 2.5. Elcapitulo 4 muestra el importante papel de los registros en la construccién del | hardware. Como veremos en este capitulo, el uso eficaz de los registros es clave para las prestaciones de los programas. ‘Aunque podriamos escribir instracciones simplemente usando ntimeros para [os registros, de 0 a 31, el convenio para MIPS ¢s utilizar nombres de dos caracte- tes precedidos por un signo de délar para representar un registro, Bn la seccién 2.8 explicaremos las razones que hay detrés de esta nomenclatura. Por abora, uti- lizaremos $50, $51, ... para los registros que corresponden a variables en los programas en Cy en Java, y $t0, $t1,.... para los registros temporales usados para compilar en instrucciones MIPS. Compilacién de una sentoncia de asignacién en ¢ usando registres Es trabajo del compilador asociar las variables del programa a los registros. To- ‘memos, por ejemplo la sentencia de asignacién de nuestro ejemplo anterior: EJEMPLO. vins- Fee 4 Ds ‘a i Las variables f, g, hy iy j se asignan a los registros $50, $51, $52, $53 y $4, respectivamente. ;Cual es el cédigo MIPS compilado? Instrucciones de trans- ferencia dedatos: ‘comandos que mueven datos entre memoria y registro, Direccién: valor usado para seialar la posicin den elemento de datos specifica dentro de una Capitulo 2 Instrucciones: el lenguuaje det computador El programa compilado es muy similar al ejemplo anterior, excepto que aho- ra reemplazamos las variables por los nombres de registtos mencionados an- teriormente mis los dos registros temporales $¢0 y $1, que corresponden a Jas variables temporales add $t0,$51,$52 # el registro $t0 contiene g +h add $t1,$53,$s4 # el registro Sti contiene i + 3 sub $50,$t0,St1 # f se carga con $t0 - StI, que es # ge h)-G +4) Operandos en memoria Los lenguajes de programacién tienen variables simples que contienen elementos con datos tnicos, como en los ejemplos anteriores; pero también tienen estructuras de datos més complejas, como tablas (arrays) y estructuras, Estas estructuras complejas pueden contener muchos més datos que el ntimero de registros que hay en un compu tador. {Cémo puede un computador representar y acceder a estructuras tan grandes? Recordemos los cinco componentes de un computador introducidos en al capftulo 1 y representados en la pagina 75. El procesador puede mantener sola- mente una cantidad pequetia de datos en los registros, pero la memoria del com- putador contiene millones de datos. Por tanto, las estructuras de datos (tables y estructuras) se guardan en memoria, Segtin lo explicado anteriormente, las operaciones aritméticas se producen sélo entre registros en las instrucciones MIPS. Asi, MIPS debe incluir instrucciones que transfieran datos entre la memoria y los registros. Tales instrucciones son Iamadas instrucciones de transferencia de datos. Para acceder a una palabra en memoria, la instruccién debe proporcionar la direccién de memoria. La memoria es simplemente ‘una gran tabla unidimensional, y la direccién achia como indice de esa tabla y empieza por 0. Por ejemplo, en la figura 2.2 la direccién del tercer elernento de datos, es 2,y el valor de Memoria{2] es 10: 3 2 10 1 101 a ° 1 Deeccién Datos Procesador Memoria Eee FIGURA 2.2 Direccionos de memoria y contenides de memoria on esas posiciones. Exc exuna smplificacion del direcionamiento MIPS, La figura 2 5 muestra cl direcionariento MIPS teal pata irescionea de palabras secuencales en memoca, 28 Oporandes det haesware dol computador tho- an- Es para La instrucciOn de transferencia de datos que copia datos de la memoria a un registro se llama tradicionalmente load (carga). EI formato de la instruccién de ‘Carga (load) es el nombre de la operacién seguido por el registro que se cargars, tina constante y el registro usado para acceder a la memoria. La direccién de memoria se forma sumando la parte constante de la instruccién y el contenido del segundo registro. El nombre MIPS real para esta instruccién es fw, contraccién de load word (cargar palabra). es SEs nS SETTERS Compilacién de una sentencia de asignacion cuanto un operando ‘esta en memoria Suponga que A es una tabla de 100 palabras y que, como antes, el compila- dor ha asociado las variables g y h a los registros $51 y $82. Suponga tam- bien que la direccién de comienzo o direccién base de la tabla est en $53. Compilar esta sentencia de asignacién en C: g=h+ Atal; Aunque hay una sola operacién en esta sentencia de asignacién, uno de los operandos esta en memoria, asi que debemos hacer primero la transferen~ cia de ACB] a un registro. La direccién de este elemento de la tabla es la suma de la base de la tabla A, que se encuentra en el registro $53, més el niimero para seleccionar el elemento 8. El dato debe colocarse en un regis- tro temporal para usarlo en la instruccién siguiente. De acuerdo con la fi- gura 2.2, la primera instruccién compilada es: jw $t0,8($s3)# e1 registro temporal $t0 toma el valor # de ACB] (En la pagina siguiente haremos un pequefio ajuste a esta instruccién, pero por ahora utilizaremos esta versién simplificada.) La instruccién siguiente puede operar con el valor $0 (que contiene ACB 1), puesto que esté en un registro. La instruccién debe sumar h (contenido en $52) con ALB] (St0) y colocar el resultado en el registro que corresponde a g (asociado con $51): add $s1,$s2,8t0 #9 =h + ALB] ‘La constante en una instruccién de transferencia de datos se llama desplaza- miento, y el registro aftadido para formar la direccién se lama registro base. Peete | Capitulo 2. instrucciones: l fengusje det computador Interfaz hardware software Restriccion de la ali- neacion: requisito de ue los datos se alineen en memoria en limites paturales. Ademés de asociar variables a los registros, el compilador asigna las estructuras de datos, tales como tablas y estructuras, a posiciones de memoria. Con esto el compilador puede situar la direccién de comienzo adecuada en las instrucciones, de transferencia de datos. Puesto que los bytes (8 bits) se utilizan en muchos programas, la mayorfa de las arquitecturas pueden direccionar bytes individuales. Por tanto, la direccién de una palabra coincide con la direccién de uno de sus 4 bytes, Asi pues, las direccio- nes de palabras consecutivas difieren en 4 unidades. Por ejemplo, la figura 2.3 muestra las direcciones MIPS reales para la figura 2.2; la direccién del byte de la tercera palabra es 8. En MIPS, las palabras deben comenzar en direcciones miltiplos de 4. Este requisito se llama restriccién de Ia alineacién, y muchas arquitecturas la tienen. (El capitulo 4 explica por qué la alineacién facilita transferencias de datos mas répidas) Los computadores se dividen en aquellos que utilizan la direccién del byte del extremo izquierdo como la direccién de la palabra —el extremo mayor o big end— y aquellos que utilizan el byte de mas a la derecha —el extremo menor 0 little end—. MIPS usa el extremo mayor (es un Big Endian). (El apéndice B, muestra las dos opciones de la numeracién de los bytes en una palabra). El direccionamiento de byte también afecta al indice de la tabla (array). Para conseguir la direccién apropiada del byte en el cédigo anterior, el despla- zamiento que se aftadird al registro base $53 debe ser 4 x 8, 6 32, de modo que la direcci6n cargada sea ALB] y no ACB/4]. (Véase la trampa de la seccién 2.18, en la pagina 175.) FIGURA 2.3 Dirocciones de momoria reales MIPS y contenido de ta memoria para ddichas palabras. Las direcciones que ban cambiado estin resaltadae para comparar con las dela Figura 22. Puesto que MIPS direciona cada byte, las dreccones de las palabras son miltiplos de cae ‘10, yaque bay 4 bytes en cada palabra m re fir pe re wd ones I f 2.3. Operandes det hardware det computatior La instruceién complementaria de load (cargar) se ha llamado tradicional- mente store (almacenat), y copia los datos de un registro en la memoria, Bl for. tro de store es similar al de load: el nombre de la operacion, seguido por el Tegisto a almacenay, el desplazamiento para seleccionar el elemento de a tabla y aalmente el registro base. De nuevo, la direccién de MIPS se especifica en parte por una constante y en parte por el contenido de un registro. E| nombre MIPS Peal es sw, contraccién de store word (almacenar palabra). Compilacién usando load y store Suponga que la variable h esta asociada al registro $52 y la direccién base de Ta tabla # estd en $53, ;Cudl es el cédigo ensamblador MIPS para la siguiente sentencia C de asignacién? At12} = h + ACE]: ‘Aunque hay una sola operaci6n en esta declaracién de C, dos de los operan- ddos estn en memoria, asi que necesitamos atin més instrucciones MIPS. Las ddos primeras instrucciones son las mismas que en el ejemplo anterior, excep- to que esta vez utilizamos el desplazamiento apropiado para el direcciona- miento de byte en la instrucci6n de load word para seleccionar ACE), y la instruccién add coloca la suina en $0: lw $t0.32(453)# el registro temporal $t0 toma e! # valor de ACB) add $t0,$52.8t0 # el registro temporal $t0 toma el # valor deh + ACB] Ta instrucci6n final almacena la suma en A{12), utilizando 48 (4% 12) como desplazamiento y $53 como registro base. sw $t0,48(5s3) # almacena h + A(8] en ACL2I ‘Cargar palabra y almacenar palabra son las instrucciones que permiten copiar palabras entre memoria y registros en la arquitectura MIPS. Otros computadores tienen otras instrucciones ademas de cargar y almacenar pata transferir datos. Una de estas arquitecturas es la Intel x86, que se describe en la seccion 2.17. Si RESPUESTA. 2 rr rasan TS interfaz hardware software Capitulo 2 instrucciones: el lenguaje del computador Muchos programas tienen més variables que registros tienen los computadores. Por tanto, el compilador intenta mantener las variables mas frecuentemente usa- das en registros y coloca el resto en memoria, y utiliza load y store para mover variables entre los registros y la memoria. El proceso de poner las variables usadas con menos frecuencia (0 aquellas que necesitaremos mas tarde) en memoria se ama spilling (desbordar los registros). El principio hardware que relaciona tamatio y velocidad sugiere que la memo~ ria debe ser mds lenta que los registros, puesto que los registtos son de menor tama. Este es, efectivamente, ef caso: los accesos a los datos son més répidos si Jos datos estan en los registros en vez de en la memoria. Ademés, el dato es més util cuando esté en un registro. Una instruccién arit- mética MIPS puede leer dos registros, operar con ellos y escribir el resultado. Una instruccin de transferencia de datos MIPS lee o escribe solamente un operando, sin operar con él. Ast los registros MIPS necesitan menos tiempo de acceso y tienen mayor produc- tividad que la memoria (una rara combinacién), al hacer que sea més répido acceder a los datos de los registros y que éstos sean més faciles de usar. Para alcanzar las ‘mayores prestaciones los compiladores deben utilizar eficientemente los registros. aan SEEREEEEeee ee Operandos constantes o inmediatos ‘Muchas veces un progcama utilizard una constante en une operacién —por ejem- plo, incrementando un indice para seftalar el elemento siguiente de una tabla—. De hecho, mas de la mitad de las instrucciones aritméticas MIPS tienen una cons- tante como operando cuando ejecutan los programas de prueba (benchmark) SPEC2006. Si usamos solamente las instrucciones que hemos visto hasta ahora, tendria- ‘mos que cargar alguna constante de la memoria para poder utilizar una (las cons~ tantes habrian sido puestas en memoria cuando el programa fue cargado). Por ejemplo, para sumar la constante 4 al registro $53 podrfamos utilizar el cédigo: Iw $t0, AddrConstant4(ss1)# $t0 ~ constante 4 add $53,$53,$t0 # 453 = $53 + $t0 (sto 4) suponiendo que AddrConstant4 es la direccién de memoria de la constante 4 Un alternativa que evita la instruccién de carga es ofrecer versiones de las ins- trucciones aritméticas en las cuales un operando es una constante. Esta instruce » sr ‘la deracha) ‘AND (ita) 8 & OF ita NOT (okt) = = ror FIGURA 2.8 Operaores logicos de C y do Java y sus instrucciones MIPS correspondien- ‘tes. MIPS implement le operacién NOT con NOK con uno deus operandos gil a cra, La primera clase de este tipo de operaciones se lama desplazamsiento (shift). Mueve todos los bits de una palabra a la i2quierda o a la derecha, rellenando con «eros los bits vacfos. Por ejemplo, sil registro $0 contenia 0090 0000 6000 00000 000 0000 000000001001¢05~ Seiez Y se ejecuté la instruccién de desplazar 4 posiciones a la izquierda, el nuevo valor se pareceria a esto: 0000 6000.00006000.0000 000000001001 0000j5¢~ 1444:ee El complementario de un desplazamiento a la iaquierda es un desplazamiento ala derecha. El nombre real de las dos instrucciones de desplazamiento MIPS es desplazamiento légico ala izquierda (shift left logical, $11) y desplazamiento ligico a lac ant la St. sel des por car tpl val ops op: eat ely alor nto oa 2.6 Operactones légicas ta derecha (shift right logical, srl). La siguiente instruccién realiza la operacién anterior, suponiendo que el resultado deberia ir al registro $2: sl] $t2,$50,4 ff reg $t2 = reg $50 << 4 bits Hemos retrasado la explicaci6n del campo shamt en el formato de R-type hasta ahora. Este representa la cantidad de desplazamiento (shift amount) y se utiliza en instrucciones de desplazamiento. Por tanto, la versién en lenguaje méquina de la instruccién anterior es: o s a cy shart fone (ae eee ae |e ea La codificacién de s11 es 0 en los campos op y funct, rd contiene 10 (registro $2), contiene 16 (registro $50) y shamt contiene 4. El campo rs no se utiliza, y se fija en 0. El desplazamiento logico a la izquierda proporciona una ventaja adicional. El desplazamiento a la izquierda de i bits nos da el mismo resultado que multiplicar por 2, igual que desplazar un néimero decimal i digitos es equivalente a soultipli- ‘ar por 10 Por ejemplo, el anterior $11 de 4 arroja el mismo resultado que mul- tiplicar por 2* 6 16. La primera configuracién de bits anterior representa 9 y el vvalor de la segunda configuracién de bits es 9 x 16 = 144. tra operacién util que afsla campos es AND (¥). (Pondremos en inglés la palabra pata evitar la confusion entre la operacién y Ja conjuncién.) AND es una operacidn bit-a-bit que deja un L en dl resultado solamente si ambos bits de los operandos son 1. Por ejemplo, si el registro $t2 contiene 0000 00000000 00000000 1101 0000 00004¢, y elregistro $1 contiene 0000 00000000 0000 0011 11000000 0000,¢5 entonces, después de ejecutar la instruccién MIPS and $t0,$tl.st2 # reg $tO = reg $ti & reg $t2 cl valor del registros $0 seria (0000 0000 0000 0000 0000 11000000 0000405, 103 AND: operacién logice bit-a-bit con dos ‘operandos que genera ‘un I solamente silos dos ‘operands son 1. 104 OR: Operacion logica bit-a-bit con dos operan- dos que genera un Ls) bay un Len cualguierade los dos operands, NOT: operacién logica Dit-a-bitcon un ope rando que invierte los bits; es decir, que susti= tuye cada I por un dy cada 0 por unl. NOR: operacion Logica bit-a-bit con dos operan- dos que calcula el NOT (eORy) de os dos ope- randos. Capitulo 2 tnstrncciones: ol lenguaje det putador Como podemos ver, AND puede aplicar una configuracién de bits @ un conjunto de bits pata forzar ceros allf donde hay un 0 en la configuracion de bits. Tradicio- nalmente, a dicha configuracién de bits en conjuncién con AND se le llama una ‘mdscara, puesto que la mascara “oculta” algunos bits, Para poner un valor a uno de estos mares de ceros usamos la operacién com- plementaria de AND, llamada OR (0). Bs una operacién bit-a-bit que coloca un Jen dl resultado si cualquier bit del aperando es un 1. Bs decir, sino cambiamos los registros $1 y $12 del ejemplo anterior, el resultado de la instruccion MIPS or $t0,St1,$t2 # reg $tO = reg Stl | reg $t2 deja el siguiente valor en el registro $0: 0000 0000 0000 0000 0011 1101 0000 000095 La tiltima operaci6n l6gica es un complementario. NOT (NO) toma un ope- rando y coloca un 1 en el resultado siel bit del operando es un 0, y viceversa. En consonancia con el formato de los dos operandos, los diseftadores de MIPS decidieron incluir la instruccién NOR (NOT OR) en vez de NOT. Si un ope- rando es cero, entonces és equivalente a NOT. Por ejemplo, A NOR 0 = NOT (A. OR 0) = NOT (A). Sil registro $1 del ejemplo anterior no cambia y el registro $t3 tiene valor 0, lresultado de la instrucci6n MIPS nor $t0,St1.$t3 # reg $t0 = ~ (reg $t1 | reg $t3) deja el siguiente valor en el registro $0: 111111111111 1111 110000111111 111.g05 La figura 2.8 anterior muestra la relacién entre Jos operadores de Cy de Java y Jas instrucciones MIPS. Las constantes son sities tanto en las operaciones Idgicas AND y OR como en operaciones aritméticas, asi que MIPS también proporciona Jas instrueciones and inmediato (andi) y or inmtediato (ori). Las constantes son raramente usadas para NOR, puesto que su uso principal es invertir los bits de un de tinico operando; asi pues, el hardware no tiene ninguna versién con el direc- cionamiento inmediato. Extensi6n: £1 repertorio de instrucciones de MIPS incluye también la operacién "o exclusiva” (XOR), que pone el bit del resultado @ 1 si los correspondientes bits de los operandos son diferentes, y a 0 si son iguales. El lenguaje C permite definir campos de bits 0 campos dentro de las palabras, tanto para permitir que varios objetos se empaqueten en una palabra como para ajustarse 2 una interfaz impuesta extema | f | ' i | | : t t Lo. tom dur and ft Teng a Est: re esi Est Har 4 2.7. tnstroesianes para la toma de decisiones 205 mente, como un dispositive de E/S. Todos 10s campos deben caber dentro de una palabra, Son enteros sin signo e incluso pueden tener solamente 4. bit. E1 compllsdor | de inserta y extr20 los campos mediante instrucciones logices de MIPS: and, oF, © sitlysr? | mf {in| Qué operaciones pueden asta un campo en una palabrat Autoevaluacién : I Leutildad de un co PS mp : 1. AND dor automético radia en la ' posibilidad de usar repet- i 2, Un desplaz: I da seguido de un despl eee i : splazamiento a la izquierda seguido de un desplazamiento Sscruccionesdadas dl nd- ala derecha mero de veces que itera | puede ser dependientedelos : resultados del compuco i ‘Guan larepericon completa, debe seguir una | secvencin diferente de (ins eee sruccones), por lo tanto de En demos er la mayora de los PS Instrucciones para la toma de decisiones Fa e mes ga je (instruccones]prece- re Aidas por wna instruccin wo (que iia qu ratina debe | Lo que distingue un computador de una calculadora simple es su capacidad de Si" eco: tomar decisiones. Basdndose en los datos de entrada y en los valores creados Sider numero (lcero | durante el eomputo, se ejecutan diferentes instrucciones. La toma de decisiones se se considera positive para — representa comiinmente en los lenguajes de programaci6n utilizando la sentencia if (si condicional), combinado a veces con sentencias go fo (ir a) y etiquetas. EL Ienguaje ensamblador MIPS incluye dos instrucciones de toma de decisiones, similares alas sentencias ify go ta. La primera instruccién es: beq registrol, registro2, LI Esta instrucci6n significa ir a la sentencia etiquetada con L1 si el valor en registrol es igual al valor en regi stro2. El mneménico beg significa salta i 5 igual (branch if equal). La segunda instruccién es: bne registrol, registro2, U1 Esta instrucci6n significa ir a la sentencia etiquetada con (1 si el valor en registrol noes igual al valor en regi stro2. El mnemonico bne significa salta sino es igual (branch if not equal). Tradicionalmente, estas dos instrucciones son Iamadas bifurcaciones o saltos condicionales. ‘ste propésit). Consecuen- temente, introducimos una ensruccién (a finstruce in} de ransfrenciacon- Alcona) que, dependiendo del signo de un mimero da- dd, determina quese gjecute Ia ruta adecuada de dos posiles Burk, Costney vont Newnan, 1347 Salto condicional bifiarcacion condicio- nal) instrucién que requiere la comparacién mite una posterior trans- ferencia del controla una nueva direccin en el pro- arama, basada en ol resul- ado de a comparacian, 206 Capitulo 2 Inctruccianes: el tonguaje del computador Compitacion de una sentencia ifthen-else (si-entonces-si no) en un salto condicional En el segmento de cédigo siguiente, f, g. h. 1 y J son variables. Silas cinco variables de # a j corresponden a cinco registros de $50 a $54, cudl es el o6- digo MIPS compilado para esta sentencia ifen C? J) f=g+h;elsef=g-h; La figura 2.9 es un diagrama de flujo de lo que deberia hacer el cédigo MIPS. La primera expresién compara la igualdad, por tanto parece que usariamos bea, En general, el cédigo sera més eficiente si comprobamos la condicién puesta para saltar sobre el cédigo que realiza la parte then (entonces) que si- gue al f (si); la etiqueta E1se (si no) esté definida a continuacién: bne $s3,$54,£lse # ira Else si ie 1a siguiente sentencia de asignacién realiza una sola operaciéa y, si todos los operandos estan asignados a registros, ¢s simplemente una instruccién: add $30,$s1,$s2 # f = g +h (se omite si i #J) Ahora necesitamos ir al final de la sentencia if. Este ejemplo introduce otra clase de bifurcacién o salto, frecuentemente llamado salto incondicional. Esta instruccién dice que el procesador sigue siempre el salto. Para distinguir en- tre los saltos condicionales e incondicionales, el nombre MIPS para este tipo de instruccién es jump (salto), abreviado como j -la etiqueta Salida (Exit) esté definida a continuacién-. J Exit fin a Salida La sentencia de asignacién en la parte del else (si no) de la sentencia if (si) puede traducirse o compilarse de nuevo en una Sola instruccién. Ahora nece- sitamos afiadir fa etiqueta Sino (Else) a esta instruccién, También mostra- mos a etiqueta Sa ida que esté después de esta instruccién, y vemos el final del cdigo compilado if-then-else (si-entonces-si no): Else:sub $50,951.82 # f = g - h (se omite si i = J) Exit: Fist Gin cinco el.cé6- is los otra Esta tipo rit) — 2.7. tnstrucciones para Ia toma do dactelones 107 FIGURA 2.9 tlustracién de las opciones de Ia sontoncia If anterior. La ca dela ioquicrda conrrponde la parte then (entonces) de le sentencia fy la caj de le derechs corresponde la parce ese (Gino). Observe que el ensamblador libera al compilador y al programador del len- sguaje ensamblador del tedio de calcular las direcciones para las bifurcaciones, de forma similar a como Jo hace para calcular las direcciones de los datos para cargas yalmacenamientos (véase la seccién 2.12). Los compiladores crean con frecuencia bifurcaciones y etiquetas cuando no aparecen ene lenguaje de programacion. Bvitar el agobio de la escritura de las etiquetas y bifar- caciones explicitas es uno de los beneficios de escribir en lenguajes de programacién de alto nivel, y es una razén por la cual la codificacién es més répida a ese nivel. Lazes Las decisiones son importantes tanto para elegir entre dos alternativas —las que aparecen en las sentencias if (si— como para iterar un cémputo —que aparece en los lazos—. Las mismas instrucciones ensamblador son las unidades bésicas en ambos casos. Compitacién de un lazo while (mientras) en C Disponemos de un lazo tradicional en C while (guardar(ij == k) ted: Suponga que iy k corresponden a los registros $53 y $55 y la base de la tabla quarde esté en $56. ;Cual es el cédigo ensamblador MIPS correspondiente a este segmento de C? interfaz hardware software EJEMPLO Capitulo 2 instrucciones: ol lenguaje del computador El primer paso es cargar guardar{i ] en un registro temporal. Antes de que podamos hacerlo necesitamos tener su direccién, y antes de que podamos su- mar ia la base de la tabla gua rdar para formar la direccién debemos multi- plicar el indice i por 4 debido al problema del direccionamiento de byte Afortunadamente, podemos utilizar el desplazamiento légico a la izquierda, puesto que desplazando a la izquierda 2 bits multiplicamos por 4 (véase la pagina 103 en la secci6n 2.5). Necesitamos afiadir la etiqueta Lazo (Loop) de } modo que podamos saltar de nuevo a esta instruccién al final del mismo: Loop:si1 $t1,$s3,2 if reg temporal $t1 = 4 * i | Para conseguir la direcci6n de guardarC1] necesitamos sumar $1 y a base | de guardar en $36: add $t1,$t1,$s6 # $tl = direccion de guardar{i] Ahora podemos utilizar esa direccién para cargar guarda tro temporal: Iw $t0,0($t2} # reg temporal $t0 = quardarfi] C1] en un regis La instrucci6n siguiente realiza el test del lazo, y va a Salida (Exit) si guar darlilek: bne $t0,3s5, Exit # ir a Salida si guardarCi] + | Lainstruccién siguiente suma 1 a i: add $53,353,1 Fi = 1 +1 EL final del lazo salta de nuevo hacia atrés hasta el test del wht 1e (mientras) cn la parte superior del lazo. Unicamente afiadimos la etiqueta Sal ida justo detrés, de la forma siguiente: i Loop # ir a Lazo (Loop) Exit: (Véanse los ejercicios para una optimizacion de esta secuencia). Se ceESE nn e iri eSSen SSS t e AS EASE Interfaz hardware software Bloque bisico:secuen- cia de instrucciones sin biforcacones (excepto posiblemente al final) Yin destinos desaltos etiquetasdesaltos (excepto posblemente alcomienzo). Estas secuencias de instrucciones que terminan con una bifurcacién son tan fanda- mentales para la compilacién que tienen su propio nombre: un bloque basico es una secuencia de instrucciones sin bifurcaciones, excepto posiblemente al fina, y sin nin- iin destino de saltos 0 etiquetas de saltos, excepto posiblemente al comienzo. Una de las primeras fases de la compilacién es dividir el programa en bloques bisicos La prucba de la igualdad o Ja desigualdad es probablemente el test més habitual, pero algunas veces es itil ver siel valor de una variable es menor que el de otra varia- ble. Por ejemplo, para un lazo for (para) se puede desear comprobar si la variable indice es menor que 0. Este tipo de comparaciones se realizan en el Ienguaje ensam- blador MIPS con una instruccién que compata dos registros yasigna a un tercer regis tow instr sigail quee la que« 0.Pa than ss2e sl Lose pred ‘gual Te equ men dere répid Lasit sin si repre posit ions ques cae! comy onle: less th nim inme base was) tusto ada nin- ade kf 2.7 tmetruccionss para la toma de decisiones tro un J si el primero es menor que el segundo; sino es as le asigna un 0. La Jstraccién MIPS se lama set om less than (activar si es menor que) o sit Por ejemplo sit $t0, $53, $34 siguifica que el registro $0 se actualiza 1 siel valor en el registro § 53 «5 menor ‘que el valor en el registro $54; sino, el registro $0 se actualiza a 0. ‘Las constarites como operandos son frecuentes en las comparaciones. Puesto que el registro $2ero siempre contiene 0, pademos comparar directamente con er para comparar con otros valores hay una versién de la instruccién set on less than (activar si menor que) con valor inmediato. Para comprabar si el registro 4452 es menor que la constante 10 podemos escribir: siti $t0,$s2,10 # $t0 = 1 if $52 < 10 409 rn SS TSS ESS Loscompiladores del MIPS utilizan sit, siti, beg, bne yel valor jo 0 (siem- pre disponible leyendo el registro Szeto) para crear todas las condiciones reativas igual, no igual, menor que, menor o igual que, mayor que, mayor 0 igual que. EE ‘Teniendo en cuenta la advertencia de Von Neumann sobre la simplicidad del equipo”, la arquitectura MIPS no incluye la instruccién de bifurcacion si es menor que, porque es demasiado complicada: 0 bien alargaria Ja duracién de ciclo de reloj o la instruccién necesitaria ciclos de reloj extras, Dos instrucciones mas répidas son més tiles. interfaz hardware software ee SSS SSS Tas instrucciones de comparacion deben abordar la dicotomia entre ntimeros con Y sin signo, En ocasiones, una secuencia de bits con un 1 en el bit més significative representa un niimero negativo y, por supuesto, ¢s menor que cualquier nimero positivo, que debe tener su bit mas significativo igual 2 0. Por otra parte, si los nndmeros Son sin signo, un niimero con su bit més significativo igual a 1 es mayor que cualquier otto niimero que comience con 0. (Més adelante tendremos en cuenta este doble significado del bit mas significativo para reducir el coste de la comprobacién de los limites de un vector.) ‘MIPS ofrece dos versiones de la comparacién poner a J cuando menor que (set on less than) para contempler estas dos alternativas. Set on less thar (51t) y set on less than inmediate (51t1 } aperan con nameros con signo. Las comparaciones de rmimeros sin signo se realizan con set on less than unsigned (5 1u) y set on less than inmediate unsigned (S1ti). a interfaz hardware software ato Capitulo 2 instrucciones: ef lengusje det computador Las Comparaciones con signo frente a comparaciones sin signo lama o swit : deper Ere Supongamos que el contenido del registro $0 es el mimero binario (camt M11 1121 1112 2221 1211 1112 1111 1111495 5 oe yal del registro $51 es el nsimero binario las di direst 000 0000 0900 0000 9000 0000 0000 0002405 despu Qué valores tendremos en los registros $0 y $1 después de las dos siguien- a tes instrucciones? i elcad i Apat sit $t0, $50, $51 # comparaci6n con signo mitir cién j situ §tl, $50, $51 # comparacién sin signo $ irea tabla El valor en el registro $50 es Laie, si se esta representando un entero y on 4294 967 295giy 81 €8 un entero sin signo. El valor en el registro $1 repre senta el valor Ijjey en ambos casos. Entonces, en $0 tendzemos el valor 1, Orquelgjer Laser ane ‘Aun maci Considerar los ntimeros con signo como si fuesen. ntimetos sin signo nos pro- eee porciona una manera de comprobar si 0-= Tongitud o $s1<0 7 beq $t0, $zero, IndexOutOfBounds # si malo, salto a Error 2.7 tnstruceiones para ta tome de decisiones aan = La sentencia case / switch La mayorfa de los lenguajes de programacién tienen una sentencia alternativa case 6 switch, que permite que el programador seleccione una de muchas alternativas dependiendo de un Gnico valor. La manera més simple de implementar switch (cambio) es a través de una secuencia de pruebas condicionales, convirtiendo la E ‘ sentencia switch en una cadena de sentencias if-then-else (si-entonces-si no). | 'A veces, las alternativas se pueden codificar eficientemente como una tabla con t Jas direcciones de las secuencias de instrucciones alternativas, llamada tabla de Tabla de direcciones I direcciones de salto, en la que el programa necesita solamente indexar en la tabla y de salto (jurmp address : después saltar a Ja secuencia apropiada. Asi, la tabla de salto es simplemente una table): también Mamada see tabla de palabras que contiene direcciones que se corresponden con las etiquetasen (hin dessho, Feuna, cl cédigo. El programa carga la entrada apropiada de la tabla de salto en un registro. gs secuencias de instruc t ‘A pattir de este momento, para saltar necesita la direccién en el registro. Para per- _cionesalternativas. i mitir este tipo de situaciones, los computadores como MIPS incluyen una instruc | cid jump register (registro de salto) 0 Jr, que significa un salto incondicional a la direcci6n especificada en un registro. El programa carga la entrada apropiada de la tabla de saltos en un registro, y luego salta a la direccién adecuada utilizando un a registro de salto. Esta instruccién esté descrita en la secei6n siguiente, mre el, eS TESS SESE ‘Aunque hay muchas sentencias para decisiones y lazos en los lenguajes de progra- Interfaz macién como C y Java, la sentencia basica que las pone en ejecucién en el nivel inferior siguiente es la bifurcacién condicional. hardware software i Extensiém: Si ha oldo hablar de los saltos retardados, tretados en el captulo 4, rio se preocupe: el ensamblacior MIPS los hace invisibles al programador del lenguale ‘ensamolador. 1. C tiene muchas sentencias para decisiones y lazos, mientras que MIPS tiene Astoovaluacién pocas. sCul de las afirmaciones siguientes explica 0 no este desequilibriot :Por qué? 1. La mayoria de las sentencias de decisién hacen que el cédigo sea mas facil de leer y de comprender. 2. Menos sentencias de decisiGn simplifican la tarea del nivel inferior que es responsable de la ejecucién, ide 3, Mis sentencias de decisién significan menos lineas de cédigo, lo que reduce generalmente el tiempo de codificacién. 4, Mis sentencias de decisién significan pocas lineas de cédigo, lo que da or ingar generaimente ala ejecucién de pocas operaciones. aa2 Tengluaje del computador Procedimientersubr- tins amacenada que rea liza una trea expecta basada en los parimetros ‘queleson proporcionados. BL. ;Por qué C proporciona dos grupos de operadores para AND (&& y &&) y dos grupos de operadores para OR (|y |), mientras que las instrucciones MIPS no lo hacen? 1, Las operaciones légicas AND y OR usan & y |, mientras que las bifuurcacio- nes condicionales usan &E« y || en la ejecucién 2. La afiemacién anterior tiene su inversa: && y || corresponden a las opera- ciones légicas, mientras que & y | corresponden a las bifurcaciones condi- cionales. 3. Son redundantes y significan la misma cosa: &&y || son simplemente here- deros del lenguaje de programacién B, el precursor de C. Apoyo a los procedimientos en el hardware del computador Un procedimiento o una funcién (0 subrutina) es una herramienta que usan los programadores de C o de Java para estructurar programas, a fin de hacerlos més fciles de entender y de permitir que el c6digo sea reutilizado. Los procedimientos permiten al programador concentrarse en una sola parte de la tarea en un momento determinado, usando los parémetros como barrera entre el procedi- miento y el resto del programa y los datos, lo que permite que pasen los valores y que devuelva resultados. Describimos el equivalente en Java en la Bl seccidn 2.15 enel CD, pero Java necesita todo lo que C necesita de un computador. Podemos pensar en un procedimiento como un espfa que funciona con un plan secreto, que adquiere recursos, realiza la tarea, borra sus pistas y después retorna al punto original con el resultado deseado. Ninguna otra cosa deberla verse perturbada una vez que la misién se ha completado. Por otra parte, un espia opera solamente con una “necesidad de saber” basica, asi que no puede hacer suposiciones sobre su jefe. ‘Anélogamente, en la ejecucion de un procedimiento el programa debe seguir estos seis pasos: 1, Colocar los paramnetros en un lugar donde el procedimiento pueda acceder aallos. 2. Transferir el control al procedimiento, Adquirir los recursos del almacenamiento necesarios para el procedimiento, 4, Realizar la tarea deseada, Colocar el valor del resultado en un lugar donde el programa que lo ha lla- mado pueda tener acceso. 6. Retornar el control al punto del origen, puesto que un procedimiento puede ser llamado desde varios puntos de un programa, Co en un prog ros P Ad instru guard desal Lapa una d permi cenad orem Pat trucei nalal Los s direcc Asie pone cedirr dimie ydev: Im regist tada, ‘gcam un nc trucci siguie y dos no lo pera- ondi- here- nos sms entos cedi ves y 1245 nun spués berfa expia hacer eguir mto, alla. iento a i f 2.8 Apoyo a los procecimientos on el hardware del computador aa Como ya hemos dicho, los registros son el lugar més rapido para situar datos en un computador; por tanto, procuramos utilizarlos tanto como sea posible. Los programas MIPS siguen la convencién siguiente en la asignaciGn de sus 32 regis- tros para llamar a un procedimiento: @ $20-$a3: cuatro registros de argumentos para pasar pardmetras. 8 SV0-$v1: dos registros de valores para retornar valores. ® Sra: un registro con la direccién de retorno para volver al punto del origen. Ademds de asignar estos registros, el lenguaje ensamblador MIPS incluye una instruccién s6lo para los procedimientos: salta a una direccién y simulténeamente guarda le direccidn de la instruccién siguiente en el registro bra. La instruccién de saltar-y-enlazar 0 ja (jump-and-link) se escribe simplemente: jal ProcedureAddress La parte de enlace (link) en el nombre de la instruccién significa que se construye tuna direccién o enlace que apunta al punto desde el que se hace la llamada para petmitir que el procedimiento retorne a la direccién apropiada. Este enlace alma- cenado en el registro Sra se llama direccién de retorno. Esta direccién de retorno © remitente es necesaria porque el mismo procedimiento se podria llamar desde varias partes del programa, Para trabajar en tales situaciones, los computadores como MIPS utilizan la ins- truccién salto segin registro 0 jt (jump register), que realiza un salto incondicio- nal ala direcciGn especificada en un registro: jr Sra Los saltos de la instruccién salto segin registro (jump register, jr) saltan a la direccién almacenada en el registro Sra —lo cual es justo lo que deseamos—. sf, el programa que llama 0 invoca, es decir, el invocador o lamador (caller), pone los valores de los parametros en $40 $23 y utiliza J1X para saltar al pro- cedimiento X —a veces conocido por invocado o llamado (cailee)—. El proce- dimiento llamado realiza entonces los célculos, pone los resultados en $v0-$¥V1 y devuelve el control al llamador utilizando el jr Sra. Implicita en Ia idea de programa almacenado esta la necesidad de tener un registro para guardar la direccién de la insteuccién actual que esté siendo ejecu- tada. Por razones historicas, este registro casi siempre se llama contador de pro- gramas, abreviado como PC (program counter) en la arquitectura MIPS, aunque lun nombre més acorde habria sido registro de direccién de instruccién, La ins- truccién ja1 guarda PC + 4 en el registro $a para enlazat con la instruccién siguiente y establecer el retorno del procedimiento, Insteuecién saltar-y-enla zar-instruccién quesaltaa tuna direccimy simulté- reamente guarda la direc: con dela instruccién siguiente en un registro (Sra en MIPS). Direccién de retorno: enlace al sitio que lame {que permite que un peo ceditmiento retorne sla slireccién apropiada; en MIPS se almacena en el registro Sra Invocador (o lamador): programa que convoca un procedimientoy propor- ciona los valores dees prémetrosnecesaios. Invocado (0 llamado): procedimiento que ee cata una serie de instruc: ciones almacenadas basadas en los pardenetros proporcianadas por alla rmadory después le pe-P0040 0000 uf 0 FIGURA 233 Asignacién do memoria MIPS para ei programa y los datos. Bias dneccoons on sohmente una convencin del sftwarey no pare del arguitectra MIPS. Comneazando de arte a abajo, el pu tera depila se inicizaea 7F 4 7#f yon yeece hac abso, hac el egmento de das. Eel oto exten _baign del programa ("eso") empezaen 0040 0000 yg. Los datos esttics empieza en 1000. O000ye Las ates dnémicos asignados por 10c en Cy pore en Java van continaaccn y recen hacia, faa a pl eaun ara lmada el montn (ap). H pantero global, Sop efi a una ireccon pare hacer fel acevo os datos. Se inca en 1000 8000fex, de modo que pueda tener aceso apart de 3000. OO00pe, hasta 1000 £#¥Fye, usd desplaramients de 16 bits posites ynegtivos desde $p. Esta informacion se ence ‘ratambien ema columna d dele Taye de Datos de Refrencia de MIPS, qu einduyecon ete bro. i | | | ' i Ex sir aie st et pro ticas APS roria pam oval Sale asta ; | | 2.8 Apoyo @ los peocedimtentos es al hardware del computador La figura 2.14 resume las convenciones de los registros para el lenguaje ensan- bblador MIPS. Nombre zero 0 —_[Er valor constente 0 FaO-tvI_ [3-3 Waves par os estos y valuncion de Ta presi Fats |e fagumentos $t0-S7_| 8-58 [Tompories $s0-$37 | 16-23 | Guerdeaos Fta-se9 | 28-25 [is temporaies 9p 73 Poritero global Sep 35 Partare dota pila 5 30 | Partere de esta ira Bi [Breit ce etomo FIGURA 2.14 Convenciones do rogistro MIPS. Hl registro 1, lamado Sot, est reserado para h paambledor (vias la seccifn 2.12), y los reitros 2627, Inmados SKO- $kl, esti reservados para sis- tema operative Eta informacidn se eacentrs tambien en le columna 2 dela Tarjetx de Datos de Referen- Cn de MIPS que se inclaye con ete libro. Extensifn: 2Qué pasa si hey mas de cuatio pardmetros? La convencién MIPS es poner los parémettos adicionales en la pila justo por encima del puntero de estructura. El procedimiento espera entances que los cuatro primeros parametros estén en los registros $40 a $43 y el resto en la memoria, direccionables @ través del purtero de ‘estructura (puntero del bloque de activacién). ‘Segiin Io mencionado en e! pie de la figura 2.12, el puntero de estructura es conve niente porque todas las referencias a las variables en la pila dentro de un procedimiento tendrén el mismo desplazamiento. Sin embargo, el puntero do estructura no es neceso- rio. El compitador cle C del GNU para MIPS utiliza un puntero de estructura, pero el comp lador de C de MIPS no fo hace; utiliza el registro 30 como otro registro guardado ($58). xtenstée: Algunos procedimientos recursivos pueden implementarse lterativamente sin usar una recursién. De este mado se pueden mejorar fas prestaciones de forma sig- nificativa porque se elimina el sobrecoste asociad a la llamada al procedimiento. Por ejemplo, consideremos un procedimiento que acumula une suma: int sum(in a, int acclt if (n>0) return sum(n-l.acc#n); else return acc; ’ ila Hamada es sum(3,0), recursivamente se tama a sum(2,3), sum(1.5) y sum(0,, 6), yel resuitado es 6, que seré dewelto cuatro veces. Esta llamada recursiva fa suma se conoze coro lamnada de cala (‘ail caf), y este ejemplo puede implementarse eficientemente (suponga que $20 = ny $al = acck sum: s1tifad, # comprueba sin <= 0 beqtad, Szero, sumextt # salto a sumexit sin <0 addSal, $l, $20 # suman a acc 122 Capitulo 2 tnetruccionss: et lenguaje dol computador addisa0, $20, - # decrementa sum # salto a sum sumexit addSv0, $al, Szero # devuelve el valor ace ir Sra # retorna de rutina Autoevaluacton ;Cudles de las siguientes declaraciones sobre Cy Java son generalmente ciertas? 1 Los programadores de C manipulan datos explicitamente, mientras que en Java es eutomatico. 2. Ceesmis propenso a ertores de punteros y pérdidas de memoria que Java H@| => (la lengteta abierta de ta ululacion cena barra es grande) Comunicarse con la gente ‘Cuarta linea del tecla~ do- poerna “Hatless At- las,” 1991 (algunos dan las 1991 (alaunos den 1.9. computadores fueron inventados para hacer muchos cileulos, pero tan pronto TOASCIL*” cela ule como legaron a ser comercialmente viables se utilizaron para procesar texto. La Jacién, “(” esté abierto, mayoria de los computadores utilizan hoy bytes de 8 bits para representar caracte- “Pes la barra, y asi su- res, con el cédigo American Standard Code for Information Interchange (ASCII), que ‘cesivamente). es la representacién que casi todos siguen. La figura 2.15 resume el ASCIL HEE Eee 3 iS z x a a7 ais «| |_% 3. = = R 008 basa r [40 oie # eee 104 n 120, x 3 K L 107, K 73 ft ia = L V ‘aoe i 324 I a7 a o ~ ait [ 127 ‘SUPR FIGURA 2.15. RepresentaciOn ASCII de fos caracteres. Obsérese que las letras maysculasy minGscus diferen exctament e032 cata obseracion nos puede ayudar a hacer simpifcaiones a hore de comprobaro cambiar mayisculs y minscals, Las vlores no meta dos corresponden a cacacers de formato, Por ejemplo, 8 represents la tela de retoceco, 9 representa un caricter de tabulaién y 13 un retorne dal carro. Oto valor dl es 0 para nulo (a de informacion), que ese valor que el enguaje Cde programa wiliza part marca lial de una cadena, Esta informacién = encuentra también enl columaa 3 de la Tarjeta de Datos de Referencia de MIPS ques incluye on et libro. ene sent mét y% ros sigt cio RORS f a base 2 no es natural para el ser humano; tenemos diez dedos y por lo tanto cencontramos Ia base 10 natural. ;Por qué los computadores no usan una repre- sentacion decimal? De hecho, el primer computador comercial ofrecta una arit- mética decimal. El problema era que este computador todavia usaba sefiales “on” y “off, de modo que un digito decimal se representaba por varios digits bina~ rios. La representacién decimal se mostré tan ineficiente que los computadores siguientes representaban todo en binario, convirtiendo 2 base 10 sélo las opera~ ciones de entrada/salida, relativamente infrecuentes. ASCII frente a mimeros binarios Se podrian representar los niimeros como secuencias de digitos ASCII en lugar de como enteros. Cuénto aumentaria el almacenamiento si el niéme~ 10 mil millones se representa como ASCIT en lugar de como un entero de 32 bits? Mil millones, 1 000 000 000, necesitarfa 10 digitos ASCH de 8 bits cada uno. De este modo, el aumento en el almacenamiento seria (10 x 8)/32 = 2.5. Ade~ sms, el hardware pata sumer, restat, multiplicar y dividir ntimeros decimales es complejo. Estas dificultades explican por qué los profesionales de la com- putacién creen que la representacién binatia es natural y por qué consideran extrafa la utlizacién dela representacién decimal. Una serie de instrucciones puede extraer un byte de una palabra, asi que las instrucciones de cargar palabra (Joad word) y almacenar palabra (store word) son suficientes para la transferencia tanto de bytes como de palabras. No abs- tante, debido a le popularidad del procesamiento de texto en algunos progra- mas, MIPS proporciona instrucciones para mover bytes. Cargar byte (load byte, 1b) carga un byte desde la memoria y lo coloca en Jos 8 bits mas ala derecha de un registro. Almacenar byte (store byte, sb) toma un byte de los 8 bits més a la derecha de un registro y lo escribe en la memoria. Asi, copiamos un byte con la secuencia Tb $t0,0($sp) # leer byte de 1a fuente sb 5t0,0($gp) # escribir byte en el destino pene interfaz hardware software Capitulo 2 tnstracciones: longuaje del computador La dicotomia con signo-sin signo se aplica también a las cargas, ademis de a la arit- ética. La funcién de ana carga con signo es copiar el signo repetitivamente hasta completar el resto del registro, llamado extension de signo, pero su propésit es cargar una representacién correcta del mimero en el registro. La carga sin signo rellena con. ceros los bits a la izquierda del dato, de modo que el mimero representado por la secuencia de bits no tiene signo. Cuando se carga una palabra de 32 bits en un registro de 32 bits, este aspecto es dudoso; las cargas con y sin signo son idénticas. MIPS oftece dos variantes para la carga de un byte: carga un byte (1b) trata el byte como un nimero con signo y hace extension de signo para completar los 24 bits més a la inquierda del registro, mientras que carga un byte sin signo (bu) lo trata como un entero sin signo. Dado que los programas en C casi siempre usan bytes para representar caracteres en lugar de considerar los bytes como entetos con signo muy cortos, | bu se usa casi exclusivamente para la carga de bytes. Los caracteres normalmente se combinan en cadenas, que tienen un niémero variable de ellos, Hiay tres opciones para representar una cadena: (1) Ja primera posicién de la cadena se reserva para indicar la longitud o tamafio de la cadena, (2) una variable complementaria que tiene la longitud de la cadena (como en una estructura), 0 (3) la dltima posicién de una cadena se indica con un caréc- ter de fin de cadena. C utiliza la tercera opcién: termina una cadena con un byte cxyo valor es 0 —denominado nulo (null) en ASCII—. Asi, la cadena “Cal” se representa en C con los 4 bytes siguientes, mostrados como niimeros decimales: 67, 97, 108, 0. Compilacién de un procedimiento de copia de cadenas que muestra cémo se utilizan las cadenas en € El procedimiento st rcpy copia la cadena y en la cadena x usando la conven- ion de terminacién con byte nulo de C: void stropy (char x, char yf1) 1 int is 1-0: while ((xCi] = yfi]) I= ‘\0") /* copia y comprueba el byte */ fed 1 Cul es el codigo ensamblador MIPS! toes wy stro, eres ero era na, en ace yte se est | 2.9 Cormunicarse con ie gente A continuacién mostramos el fragmento de cédigo bésico de ensamblador MIPS. Suponemos que las direcciones base de las tablas x e y se encuentran en $20 $a, mientras que i estar en $50. strepy ajusta el puntero de pila y luego guarda el registro $50 en la pila: strepy: addi S$sp,sp,-4 # ajusta la pila para un elemento mas sw $s0.0($sp) # guardar $50 Para inicializar { a 0, la siguiente instruccién actualiza $50 a 0 sumando 0 a0 y colocando esa suma en $50: add $s0,$zera,$zero, # i = 0 +0 éte€s el principio del lazo. La direccion de y(t se forma primero sumando yayCh Li: add $t1,$50,$a # direccion de y{1] en $t1 Observe que no tenemos que multiplicar + por 4 puesto que y es una tabla de bytes y no de palabras, como en ejemplos anteriores. Para cargar el carécter en yi] utilizamos cargar byte (load byte), que pone cl cardcter en $2: lb $42, O¢$t1) 4 st2 = ylid Un céleulo de direcci6n similar coloca la direccién de x{ i] en $3, y enton- ces el carfcter en $£2 se almacena en esa direccion. add $3,450.40 # direccién de x{i] en St3 sb $2, 0(8t3) # xLi] = yLil A continuacién salimos del lazo si el caracter es 0; es decir, sies el iltimo ca- ricter de la cadena: beq $t2,$zero,12 # si yli} “0, ina 12 sino, incrementamos { y se vuelve hacia atrés al azo: addi $50,$50.1 #i ei +) jou #ieall 428 128 Capitulo 2 fnstrueciones: et lenguale del computador sino se salta hacia atrés, porque era el ultimo cardcter de la cadena, restaura- mos $80 y el puntero de pila y después se retorna. La: Iw $s0.0($sp) # yLi] == 0: fin de cadena; # restaura el antiguo $50 addi $sp,Ssp,4 # elimina una palabra de la pila ir Sra 4 retorna En C, el copiado de cadenas utiliza generalmente punteros en vez de tablas, para evitar las operaciones con i en el cédigo anterior. Véase la seccin 2.15, para una explicacién comparativa de tablas versus punteros. Puesto que el procedimiento strcpy anterior es un procedimiento hoja, el compilador podria asignar i a un registro temporal y evitar tener que guardar y restaurar $50. Por tanto, en vez de considerar los registros $ simplemente como Iugares temporales, podemos pensar en ellos como registros que el Hamado debe utilizar siempre que crea conveniente. Cuando un compilador encuentra un pro- cedimiento hoja, utiliza todos los registros temporales antes de usar los registros que debe guardar. Caracteres y cadenas en Java Unicode es una codificacién universal de los alfabetos de la mayoria de los idiomas humanos. La figura 2.16 es una lista de los alfabetos de Unicode; existen tantos, alfabetos en Unicode como sémbolos titiles hay en ASC. Para ser mas inclusivos, Java utiliza Unicode para los caracteres. Por defecto, utiliza 16 bits para represen- tar un cardcter. Bl repertorio de instruccién MIPS tiene instrucciones explicitas para cargar y para almacenar cantidades de 16 bits llamadas medias palabras (halfwords). Car- gat media (load half 1h) carga media palabra de la memoria, y la coloca en los 16 bits de més a la derecha de un registro. De forma similar a la carga (load), la ins- truccién de carga mitad (load half, 1h) considera la media palabra como un niimero con signo y utiliza la extensi6n de signo para completar los 16 bits de la inquierda del registro; por otra parte, la instruccién carga miitad sin signo (load half unsigned, 1hu) considera enteros sin signo. Esto hace que 1 hu sea la més popular de las dos. Almacenar media (store half, sh) toma la mitad de una palabra, los 16 bits de la parte de més a la derecha de un registro, y la escribe en la memoria. Copiamos una media palabra con la secuencia: Thu $t0,0(Ssp) # lee media palabra sh $t0,0(Sgp) # escribe media palabr bits) desde una fuente (16 bits) a un destino Las cadenas son una clase estdndar de Java con una ayuda especial incorporada y métodos predefinidos para el encadenamiento, la comparacion y la conversién. A diferencia de C, Java incluye una palabra que da la longitud de la cadena, simi- Jara las tablas de Java, exte pala [Tami elves ane IQUE “blogs sjemp) gues q column UIFL june a 1 xc sony L aura- via blas, 2.15 a el lacy omo lebe pro- itros “alf ee oaeee eee 2.9 Comuntcaree con i gonte 227 Extensiém: Los progremas MIPS intentan mantener la pila alineada a direcciones de palabras, permitiondo al programa utilizar solamente Tw y sw (que deben estar alineados) para tener acceso a la pila. Esta convenci6n significa que una variable char (tipo caracter) asignada a fa pila ocupa 4 bytes, aunque necesite menos. Sin embargo, una variable de cadena de C 0 una tabla de bytes empaquetard 4 bytes por palabra, y una variable de cadena de Java 0 una tabia de cortos empaquetaré 2 medias palabras por palabra, Taino [Matyas Tagbain Portas gore Grego | Sista ier Letras modtiossoras de espace Gris | Tetanaes ena Sinboiessctusiea famenio [a0 ‘Ubu Combiner marons osrcas ebceo | stan “ait Connor os areas paras SboGE aoe | Myanmar Kanes Racial Supornios y evbinalons Ski | Georans tirana Formas oe nero Tana [Hangucoreano | Ratan Operaores meteracoe Devenai_[Ethione Banorofe Sno Simbois aanimerces materilicos Benga | Creoau Kenn Fotrons 6 Bile anus | Saas abarigenes | Savin Reconocinieno de caraciees ioas canagianses Gaate | Gghar ane inboios musicales Byrne Orva | Reni Soret bay Sirbolos musicales [een [Toasiog al Xuan Jing Symbols | Fechas [Fetus onaros ing Hexaerom Symbol de ible [Kennada | oid Tegean Numbers | Fomasgeomeions FIGURA 2.16 Ejormplos de alfabetos on Unicode. La versién 6.0 de Unicode ten mis de 160 “bioges que eel nombre que ute para ina calecin de sinbes. Cada blague es un miliplo de 16. Por sjemplo, cl peg empieza en 0970, yl ctico en. 0400, Las primers tes colaranas mucatan 48 blo- ‘ues gue coresponden adios humanos en sproxmdamente orden numérico de Unicode Laima nna ten 1 Blogs que son mallingaesyno etn en orden Una codScaion de 1 i mada ‘UrF-16 esa sia por defect, Una ndfeacn de fongid variable mada UTP-8 guard cl subeon- jmito ABCIT como 8 bt y win 16-32 bite pata low otic crates UTF-32uliza 32 bis por cartter ara sprnder mis, vate mrad. L_ ;Cuéles de las siguientes sentencias sobre caracteres y cadenas en Cy en Java Autoovaluacion son verdaderas? 1. Una cadena en C ocupa aproximadamente la mitad de memoria que la misma cadena en Java. 2. “Cadena” es precisamente un nombre informal para las tablas de una sola dimension de caracteres en Cy en Java. 3. En Cy en Java se usa el cardcter nulo (0) para marcar el final de una cadena. Las operaciones con cadenas, asi como su longitud, son mas répidas en C queen Java. TL. :Qué tipo de variable que puede contener el valor 1 000 000 0004, necesita is espacio de memoria? L intdec 2. string de 3. string de Java za RESPUESTA Capitulo 2. Instruccionos: ef tonguaje del computador Direcciones y direccionamiento inmediato MIPS para 32 bits ‘Aunque mantener todas las instrucciones MIPS con un tamafio de 32 bits simpli- fica todo cl hardware, en ocasionés seria convénienté tener una constante de 32 bits o una direccién de 32 bits. Esta seccién comienza con la solucién general para las constantes grandes y después muestra las optimizaciones para las direcciones de instruccién usadas en saltos condicionales (bifurcaciones) e incondicionales. Operandos inmediatos de 32 bits ‘Aunque las constantes son con frecuencia cortas y caben en campos de 16 bits, algunas veces son més grandes. El repertorio de instrucciones MIPS incluye espe- cificamente la instruccin carga superior inmediata (load upper immediate, 11) para fijar los 16 bits superiores de una constante en un registro, permitiendo a una instruccién posterior especificar los 16 bits inferiores de la constante. La figura 2.17 muestra la operacién de | ui Carga de una constante de 32 bits iCudl es el cédigo ensamblador MIPS para cargar la siguiente constante de 32 bits en el registro $50? 0000 0000 G011 1101 0000 1001 9000 D000 Primero cargariamos los 16 bits de mayor peso, que es 61 en decimal, usando lui lui $80, 61 # 61 en decimal ~ 0000 0000 0011 1101 binario El valor del registro $50 después de esto es: 0000 0000 0011 1101 0000 0000 9900 D900 El paso siguiente és sumar los 16 bits cle menor peso, cuyo valor decimal es 2304: ori $50, $50, 2304 # 2304 decimal = 0000 1001 0000 0000 El valor final del registro $50 es el valor deseado: 0000 0000 0011 1101 9000 1001 0000 9000 Feu Tant enp ddt rae tas. que limi (wea tect ensi xt rue (or zack Dit Las dé par oc dor dits, ui) oa de 2.40 Direesiones y sirecoionsmionto inmdiate NPS para 22 bite azo 5 La version del enguaje méquina de Tut $t0, 255 ff $0 29 el reaisto 8: f OOLLT ‘0000 31000 —T ‘6000-6000 THAT TiTT oe tree CContenis del egisto $0 despuse de ojecutar Tut $10, 2551 ‘000 0000 L1H titi 600 9000 0600 0508, FIQURA 2.37 El efecto de la instruccién Tui. La iassuccin 101 wansiece dl valor del campo constane ‘nmediat de I6 bits 2 es 16 bits dl exrero inguietdo del estrella oe I bits mks bajo com cos. ‘Tanto el compilador como el ensamblador deben descomponer las constantes grandes en partes y después volverlas a montar en un registro. Como es de esperar, la restriccién {del tamafio del campo inmediato puede ser un problema para las direcciones de memo- ria en cargasyy almacenamientos, igual que para las constantes en instrucciones inmedi tas. Sieste trabajo recacen el ensamblador, como pasa en los programas MIPS, éste debe ‘ener un registro temporal disponible para crear los valores largos. Esta es Ja raz6n por la _queel registro St se reserva para el ensamblador. De aqui que la representacién simbélica del lenguaje maquina MIPS no esté limitada por el hardware, sino por lo que el creador del ensamblador elige incluir (véase la seccién 2.12), Nos quedamos cerca del hardware para explicar la arqui- tectura del computador, atentos a cudndo utilizamos el lenguaje mejorado del censamblador que no se encuentra en el procesador. Extensién: Hay que tener cuidado en la creacién de constantes de 32 bits. La ins- ‘iuccion addi copia el bit de mayor peso del campo inmediato de 16 bits de la instruc- cién en los 46 bits de mayor peso de una palabra. La instruccién or légico inmediato (or) de la seccién 2.6 carga ceros en los 16 bits de mayor peso y por tanto es uti- zado por el ensambiador conjuntamente con ui para crear constantes de 32 bits, Direccionamiento en saltos condicionales (bifurcaciones) ¢ incendicionaies Las instrucciones de salto MIPS tienen el direccionamiento més simple, Utilizan el formato de instruccién MIPS final, llamado de J-type, que consiste en 6 bits para el campo de la operacién y el resto para el campo de la direccién. Ast, J 1000 # ir a Ta posicién 10000 podria ser montado en este formato (en realidad es un poco mas complicado, como veremos en la pagina siguiente) 2 110000) ‘ene 26 Ke déonde el valor del codigo de operacion del salto es 2 yla direccién del salto es 10000. Direccionamiento rela- tivoal PC:régimen de direccionamiento en el cual deccionesla suma el contador del programa (PCy deuna ennstante en Ininstracci, Capitulo 2 Instruesiones: of lenguaje dol computador A diferencia de la instruccién de salto incondicional, la instruccién de bifurca- cién condicional debe especificar dos operandos ademés de la direccién de bifur- cacién. Asi pues, bne $50,$s1,Exit # ir a Salida si $s0 * $81 se ensambla en esta instruccién, y deja solamente 16 bits para la direccién de bifurcacion: 8 16 SEEE-F aan [SSEEISISINIISEGEEIE 7" SoaMotanETEITISETEE|| bts ‘Sits Sits ibis Si las direcciones de! programa tuvieran que caber en este campo de 16 bits, significaria que ningtin programa podria ser més grande que 2'6, cosa que esti lejos de ser una opcién realista hoy en dia. Una alternativa seria especificar un registro que se afiadiera siempre a la diteccién de bifurcacién, de modo que una instraccién de bifurcacion calcularfa lo siguiente: Contador de programa = registro + direccién de bifurcacién Esta suma permite al programa alcanzar los 2” bytes y atin ser capar de utilizar las bifurcaciones condicionaies, solucionando el problema del tamatio de le direc- cién de bifurcaci6n. La pregunta entonces es: squé registro? La respuesta viene dada al considerar cémo se utilizan las bifurcaciones condi- cionales. Los saltos condicionales se encuentran en lazos y en sentencias if, por tanto tienden a bifurcar una instraccién cercana. Por ejemplo, casi la mitad de todas las bifurcaciones condicionales en los programas de prueba SPEC van a parara posiciones no més alla de 16 instrucciones. Puesto que el contador de pro- grama (PC) contiene la direccién de la instruccién actual, podemos saltar dentro del rango de palabras +2!° desde la instruccién actual si utilizamos el PC como el registro a ser afiadido a la direcci6n, Casi todos los lazos y sentencias ifson mucho mis pequefios de +26 palabras, asi que el PC es la eleccién ideal. Esta forma de direccionamiento de las bifurcaciones o salios condicionales se llama direccionamiento relativo al PC. Tal y como veremos en el capitulo 4, es conveniente que el hardware incremente el PC pronto para apuntar a la ins- truccién siguiente. Por tanto, la direccién MIPS hace referencia en realidad a la direccién de la instruccién siguiente (PC + 4) en lugar de a la instraccién actual (PC). ‘Como la mayoria de los computadores recientes, MIPS utilizan el modo de direccionamiento relativo al PC para todas las bifuurcaciones 0 saltos condicio- nales porque el destino de estas instrucciones es probable que esté cerca de la instruccién de bifurcacién. Por otra parte, las instrucciones de saltar-y-enlazar (jump-and-link) invocan procedimientos que no tienen ninguna raz6n para estar cerca de Ja llamada, asi que normalmente utilizan otros modos de direc- cionamiento, Por tanto, la arguitectura MIPS permite direcciones largas en las, Uamadas a procedimientos al utilizar el formato J-type para las instrucciones de salto y de saltar-y-enlazar. 5 ' | E i i / i i e i | | PB la di refer deb pret dire: byte Ext: lair deja abe 256 por pare 2.49 Direcclonas y direcctonamiente inmediato MIPS pars $2 bite asa Puesto que todas las instrucciones MIPS tienen 4 bytes de largo, MIPS alarga la distancia de las bifurcaciones teniendo el direccionamiento relative al PC referido al mimero de palabras de la instruccién siguiente, en vez de al niimero de bytes. Asi, el campo de 16 bits puede bifurcar cuatro veces més lejos si inter- preta el campo como una direccién relativa a la palabra en lugar de como una direcci6n relativa al byte. Andlogamente, el campo de 26 bits en instrucciones de salto es también una diteccién de palabra, asi que representa una direccién byte de 28 bits. Extensién: ‘uesto que el PC es de 32 bits, 4 bits deben venir de alguna otra parte, La instruccién de salto MIPS reemplaza solamente los 28 bits de menor peso del PC, y deja los 4 bits de mayor peso sin cambios. El cargador y el enlazador (secci6n 2.12) eben tener cuidado de evitar colocar un programa que cruce una direccién limite de 256 MB (64 millones de instrucciones}; de lo contrario, un salto se debe reemplazar its, ost para cargar la direccién completa de 32 bits en un registro. Muestra del dosplazamiento de una bifureacién o salto condicional en fenguaje maquina El lazo while en la pagina 107-108 se ha compilado en este cédigo ensambla- dor MIPS EJEMPLO Loop:s11 $tl,$s3,2 # registro temporal $tl = 4+ i add $t1,$tl,$s6 —# $t1 = direccién de guardar{i] Iw $t0.0($tL) # registro temporal $t0 ~ quardar{i} bne $t0,$s5,Salida # ir a Salida si guardarli] _ k addi $s3,$s3,1 #ieieti i j boop # ir a Lazo ue exit: aa Si suponemos que colocamos el lazo comenzando en la posicién 80000 en memoria, ;cual es el cédigo maquina MIPS para este lazo? | : I i ' ' f \ : | ane or una instucrn de salto ncrcto sobre reqito precedia por ova instuciones i | I i | | i Las instrucciones ensambladas y sus direcciones tienen el siguiente aspecto: de io- thf 80000 is v a 0004 22 a m0 20008 & a 0012 a fas 80016 18 ae 80020 0024 eee 192 Capitulo 2 Instruccienes: ef lenguale def computador Recuérdese que las instrucciones MIPS utilizan direcciones de byte; par tanto, las direcciones de palabras consecutivas se diferencian en 4, el nimero de bytes en una palabra, La instraccién been la cuarta linea afiade 2 palabras 08 bytesa la direccién de la instrucciOn siguiente (80016), especiticando asi el destino de la bifuarcacion 0 salto condicional en relacién con la siguiente instruccién (8 + 80016), en vez de en. relacién con la instruccién actual de bifurcacién (12 + 80012) 0 usando la direccién, de destino completa (80024). La instruccién de salto (jump) en a tltima kinea utiliza 1a direcci6n completa (20000 x 4 = 80000) correspondiente a la etiqueta Lazo. ro eR th ER ESET Imterfaz Casi todas las bifurcaciones o saltos condicionales estén en una localizacién préxima, pero ocasionalmente se bifurca o salta mas lejos, més allé de lo que hardware ede ser representado con los 16 bits de la instruccién de bifurcacion o sslto Software — condicional. El ensamblador viene al rescate tal y como lo hizo con las constantes o direcciones grandes: inserta un salto incondicional al destino de la bifurcacién e invierte la condicién, de modo que la bifurcacién o salto condicional decida si esquiva el salto, Bifureacién a distancia Dada una bifurcacién condicional que se produce si el registro $30 es igual al registro $31, beq $80,881, LI substituitlo por un par de instrucciones que oftezcan una distancia de bifur- cacién mucho mayor. Estas instrucciones pueden ser reemplazadas por la bifurcacion o salto condi- ional con direccionamiento corto: bne $50,$s1, 12 i u L2 Resumen de los modos de direccionamiento de MIPS Las miiltiples formas de direccionamiento genéricamente se llaman modos de Modo dedirecciona- _direccionamiento (addressing modes). La figura 2.18 muestra cémo se identifican miento: uno de varios Jos operandos para cada modo de direccionamiento. Los modos de direcciona- fegimencs dedirecciona- _rmiento de MIPS son los siguientes: miento delimitados por also variada de operan 1. Direccionamiento inmediato: cuando el operando es una constante que apa- dos y de direcciones rece en Ja misma instruccién. 2, Direccionamiento a registro: cuando el operando esta en un registro. ai gi Ene lagu los 240 Direcciones y direccionamlento inmediate NPS para $2 bite 5. Direccionamiento pscudodirecto: cuando la direccién de salto es los 26 bits de a instruccién concatenados con los bits de mayor peso del PC. oylas 1. Direacionamionto inmaciat: ona w Le | [siomeiae xin | ono fen 2, Drecoionamienta a texto on} op[@ [a] |... rel ete tea ele Regs i rst f 9, Direccionamiento base t con [S| | aeoson oe que salto veoiat antes one das 4, Diraccionamianto relatvo a PC é (ees [|e | sreccicn aaa =— eesoeeat = | [ S16 é ala f 5, Direccionamiento pseudodirecto | * resin Memodia « | o= >) =e f ees L ndi- a ___ | aaua 226 tnotacin do oe Saco motos do divcsonamionte PS. os pcanlocae | Teeeneatados Bloperanda dl modo 9 ett en memoria, mientras que el operand del modo 2 un fet. Observe qa las versiones de carga almcenamiento accede byes, media palabras o palabras. Enelmodo tel operando eth enlos 1 bits de ls misma instraccon. Loe modes 4 See san para direceo- tur iasrucione en tctnoria: ene modo se sua Las 1 bits e a cceciondesplaados 2 bit la ingeierdae PC, n modo se cncatanan ain dieecin de 25 bits desplazados 2 bisa nqierda con | tos «bits de mayor peso del PC. i oa 3. Direccionansiento base 0 desplazamiento: cuando él operando esti en la posi- te | cién de memoria cuya direccién es la suma de un registro y de una cons- baie tante en a instrucci6n, | 4, Direccionamiento relativo al PC: cuando la direcci6n es la suma del PC y de | tuna constante en la instrucciéa. 134 interfaz hardware software Aunque mostramos la arquitectura MIPS con direcciones de 32 bits, casi todos los microprocesadores (MIPS incluido) tienen extensiones de direcciones de 64 bits {véase el Bl apéndice F). Estas extensiones nacieron como respuesta alas necesica- des de software para programas mds grandes. El proceso de ampliacién del repertorio de instrucciones permite crecer a las arquitecturas de manera que se mantenga la compatiblidad de los programas hasta la siguiente generaci6n de la arquitectura, CObsérvese que una operacién simple puede utilizar mas de un modo de direc. cionamiento. La instruccién sumar (add), por ejemplo, usa tanto el direcciona- miento inmediato (addi) como el direccionamiento a registro (add). Descodificacién de lenguaje maquina A veces nos vemos forzados a aplicar técnicas de ingenieria inversa al lenguaje maquina para reconstruir el lenguaje ensamblador del original. Por ejemplo, al ‘examinar un volcado de memoria. La figura 2.19 muestra la codificacién MIPS de los campos para el lenguaje maquina MIPS. Esta figura ayuda a traducir “a mano” el lenguaje ensamblador al lenguaje maquina y viceversa, Descodificacién de cédige maquina Cul es el lenguaje ensamblador gue corresponde a esta instruccién de maquina? 00a fa020hex El primer paso es convertir de hexadecimal a binario para encontrar los cam- pos op: (iss 31 28 25 5 2 0) 0000 0000 1020 1111 1000 9000 0010 0000 ‘Miramos en el campo op para determinar la operaci6n. Baséndonos en la figu- 1a 2.25, cuando los bits 31-29 son 000 y los bits 28-26 son (00 se trata de una instruccién de R-format. Asi pues, la instruccién binaria se reconstruye a partir de los campos de R-format listados en la figura 2.26: op 5 ry i shame fant 00000 © G0101-«O1111 10000 ©0000 199000 La porcién inferior de la figura 2.19 determina la operacién de una instruccién de R-format. En este caso, los bits 5-3 son 100 y los bits 2-0 son 000, Io que sig- nifica que este patron binario representa Ia instruccién de la sua (add). Descodificamos el resto de la instrucci6n mirando los valores de los campos. | Los valores decimales son 5 para el campo rs, 15 para el rty 16 para el rd (el sha- | mino se usa). La figura 2.14 indica que estos mimeros representan los tegistros Sal, §t7 y $50. Ahora podemos mostrar la instruccién de ensamblador: | add $50.$a1.$t7 figure 219 en el capitulo 3. B1TE/3e2 es el cbdigo de operacién (opcode) para custroinstracciones quest encuentran en el apéne Dive,bges, bitzal yhyeza). Este capitulo describe las instruccionesdadas con el nombre completo coloreado, mientras quel capitulo 3 tescibe as instuccionesdadas con mnetaGnicos coloreedos. EL apéndiceB tits foas las instcciones E 2.40 Direottones y dreccionamiente Inmodizto MIPS para £2 bits 435 oslos 5 fe-28 ‘ooo 400%) J 2040) | fois) | Atioo) | suion) ] ea) | rain adits § Boe oa £ oo) [Reformat | Bitz/aez | Jump Tuned Vink [branch eg [branch ne [bie [bate eee Toon) [aed addiu [set Tess ]sitiu fant Jor? ___]xort [Toad upper fom ga la Snnod ate thon im. a win _[Te FIFE aa 0a) lire. | [aoa fToadbyte [Toad half [Tmt Toad word [1bu The TWh ion qisay [store byte [stare [sal Stare word awe E halt ‘ aio) _[Twed Tred : Faye wel goaje oa | def ar ee ano” Ea ‘acon W0os) | moa) | ais) | aoa) | Son | easo [78H : 5.24 i aoa) ares ooo ata ae pb f xa) taciee aay | am 20 ooo) | oon | A010) | SL) sao1) | 8a) | 74H) ' 53 | a0) SHIFT TEFE anv right [re av yew fare k logics! Topica? L Hoi) Tump ree [ATE wyseatt [break gu | 3010) [RFT Ee io ; wma | oan [rule mies [aw ava ae Hao) _ [add adau subtract [subs rand oF xor Tot or (nary | Bia0ay etre [situ I a0) | Tay jon} ‘ig, | FIQURA249 Coaitencin de ls instrucclones MIPS. Ex notaén dl or dun campo por flay por cn. Po emp | Sipatesopeio dela figure muestra agar palabra 1090) word ena fla nner 4 (100g pralos bits 31-29 dela instraccn) ya colorant vos, | mare (0 pre os bit 2826 ln nsec, aque el aor corespondint dl cago op (is 21-26) 10011 4o Hl satace i: “face que ef campo ea wtitado en alguns ora pace, Por mpl 8 Fornst en fla O yi columna 0 (op = 0000044) est define Bel fenla parte inferior dela fgura, Por tanto, esta Subtract en a fila 4y la column 2 def secci6n inferior significa que campo Funct (bits fos | Sa elmacin ity top 12) 9 0te r ot Flotanve enla Bs 2ycolurna tse define ena Tormanoceicange [ents [sis [5 ts [6 pts [Sis [6 is [Todas ls instocionas MIPS tonen 52 bis Hormat eC CC Format 9 |e Ta ‘eras rneats | Format pre rensferenies,badena mh Homat ance sare Formato de los svuecones de sat cordial FIGURA 2.20 Formatos de inctruscién MIPS. La figura 2.20 muestra todos los formatos de instruceién MIPS. La figura 2.1 en la pagina 78 muestra el lenguaje ensamblador de MIPS tratado en este capitulo; la parte no estudiada de instrucciones MIPS se ocupa principalmente de la aritmé- tica, que veremos en el capitulo siguiente. Autoevaluacién |. ;Cusl esl rango de direcciones para las bifurcaciones o saltos condicionales en MIPS (K = 1024)? L 2 3 Direcciones entre 0 y 64K ~ 1. Direcciones entre 0 y 256K ~ 1 Direcciones desde aproximadamente 32K antes de la bifurcacion hasta 32K después Direcciones desde aproximadamente 128K antes de la bifurcacién hasta 128K después. IL. {Cudl es el rango de direcciones para saltar y saltar-y-enlazar en MIPS (M = 1024K)? L 2 3. Direcciones entre 0 y 64M —1. Direcciones entre 0 y 256M — I Direcciones desde aproximadamente 32M antes del salto hasta aproxima: damente 32M después. Direcciones desde aproximadamente 128 M antes del salto hasta aproxima- damente 128M después, CCualquiera dentro de un bloque de direcciones de 64M donde el PC sumi- nistra los 6 bits de mayor peso. Cualguiera dentro de un bloque de direcciones de 256M donde el PC sumi- nistra los 4 bits de mayor peso. TIL. ;Cual es la instruccién del lenguaje ensamblador MIPS correspondiente a la instruccién maquina con valor 0000 00002 Lj 2. Reformat 3. addi 4 5. 6 st mécO 5. El opcode esté indefinido: no hay instruccién legal que corresponda a 0. Lapr ment ment leer. 1 yapu result cierto Po biend 1. Say esorit nado cirse seoci¢ anter Ep conr zati6y imple blogu alas o par Pa ymot pone! const levac He todas posici realiz viose progr sincxc Co remo nizaci sincre unap le 21 Paralotiomo Instrucciones: sincrontzacion Paraielismo e instrucciones: sincronizacion La programacién paralela es més facil cuando las tareas son independientes, pero a menudo es necesaria una cooperacién entre ellas. Cooperacién significa habitual- mente que algunas tareas estén escribiendo nuevos valores que otra tareas necesitan leer. Para saber cuando una tarea ha finalizado la escritura y, por Io tanto, otra tarea ya puede hacer una lectura segura, las tareas necesitan sincronizatse. Si no hay esta sincronizaci6n existe el peligro de una carrera de datos (data race), en la que los resultados de un programa pueden variar dependiendo del orden en el que ocurran. certos sucesos. Por ejemplo, pensemos otra vez en la analogia de los ocho periodistas escri- biendo un articulo periodistico que ya hemos utilizado en la pagina 43 del capitulo 1. Suponga que un periodista necesita leer todas las secciones anteriores antes de escribir las conclusiones. Asi, necesita saber cuando los otros periodistas han termi- nado sus secciones, para no tener que preocuparse de cambios que puedan produ- cise posteriormente. Bs deci, tienen que sincronizar la escritura y lectura de cada seccién para que las conclusiones sean coherentes con Jo que se ha escrito en las anteriores secciones, En computacién, los mecanismos de sincronizaci6n se construyen, tipicamente, ‘con rutinas software a nivel de usuario que se apoyan en instrucciones de sincroni- zacién de bajo nivel (hardware-supplied). En esta seccién nos centraremos en Ja implementacién de las operaciones de sincronizacién lock (bloqueat) y slack (des- bloquear). Estas operaciones pueden utilizarse de forma directa para crear regiones alas que sélo puede acceder un procesador, llamadas regiones de exclusion mutua, para implementar mecanismos de sincronizacién més complejos. Para implementa la sincronizacién en un sistema multiprocesador se requiere, como capacidad critica, un conjunto de primitivas hardware que nos permitan leer ymodificar posiciones de memoria de forma atémica. Es decir, nada se puede inter- poner entre la lectura y la escritura de la posicidn de memoria Sin esta capacidad, la construccién de las primitivas basicas de sincronizacién tendria un coste demasiado elevado que ademés aumentaria con el nimero de procesadores. ‘Hay muchas formulaciones alternativas de las primitivas hardware bésicas y en todas elles se dispone de la capacidad de lectura y modificacién atémica de una posicién de memoria, junto con alguna forma de indicar sila lectura y la escritura se realizaron de forma atémica. En general, los disettadores no esperan que los usua- rios empleen las primitivas hardware basicas pero, por el contrario, esperan que los programadores de sistemas utilicen estas primitivas para construir bibliotecas de sincronizacién; este proceso es complejo y dificil. ‘Comenzaremos con la descripcién de una de estas primitivas hardware y mostra- remos como puede utilizarse para la construcci6n de una primitiva basica de sincro- nizacién, Una operacién tipicamente utilizada en la construccién de operaciones de sincronizacién es cl intercambio atémico, que intercambia lo valores de un registro y tuna posicién de memoria. Carrera de datos: Dos accesos.a memoria pro- ucen una carrera de datos si provienen de dos hilos (threads) diferen- tes, Tos accesos on ala misma posicién de memoria, al menos uno esunaescrituray ocucren, una después dl otro, 138 Capitulo 2 tnstruccioaes: et lenguaje det computador Como ejemplo de utilizacién de esta operacién para construir una primitiva basica de sincronizacién, se disefiard un bloqueo simple donde el valor 0 se usa para indicar que el acceso a la variable protegida esté libre (bloqueo = 0) y I para indicar que no lo esté (bloqueo = 1). Un procesador intenta poner el valor 1 en el bloqueo intercambiando un registro con el valor 1 ya posicién de memoria correspondiente al bloqueo. Si algin otro procesador ya ha fijado el valor del bloqueo a 1, el inter. cambio devuelve el valor 1, y en caso contrario devuelve el valor 0. En este tiltimo ‘caso ademas el bloqueo se pone a 1 para evitar que cualquier otro procesador pueda poner 2 1 el bloqueo. Por ejemplo, consideremos que dos procesadores intentan hacer el intercarbio simulténeamente; uno de los procesadores haré el intercambio en primer lugar, devolviendo un 0 como resultado, y cuando el segundo intenta hacer el intercambio devolverd como resultado un 1. La clave para que la primitiva de intercambio pueda ser usada para implementar la sincronizacion es que la operacién es atémica: el intercambio es indivisible, y cuando se solicitan dos intercambios simultaneos el hardware se encarga de reordenarlos. Es imposible que, cuando dos procesadores intentan poner a | la variable de sincronizaci6n usando el intercambio, ambos crean que han puesto la variable a 1. La implementaci6n de una operacién de memoria atémica plantea algunos retos. en el disefio del procesador, porque se necesita que tanto la lectura como la escritura sea una instrucci6n tinica e ininterrumpible. Un alternativa es disponer de una pareja de instrucciones en donde la segunda ins truccién devuelve un valor que indica sila pareja fue ejecutada de forma atémica. La pareja de instrucciones es efectivamente atémica si todas las operaciones restanteseje cutadas por cualquier procesador se ha hecho antes o después de Ja ejecucion de la pareja. De esta forma, cuando un pareja de instrucciones es efectivamente at6mnica, ningtin otco procesador puede cambiar el valor entre ls instrucciones de la pareja En el MIPS esta pareja de instrucciones esta formada por una instruccién de carga, y almacenamiento especiales, carga enlazada (load linked) y almacenanniento condicio- nal (store conditional), respectivamente. Estas instracciones se utilizan en secuencia: almacenamiento condicional flla silos contenidos de la posicién de memoria especi- ficada en la carga enlazada se cambian antes de la instrucci6n de almacenamiento condicional, El almacenamiento condicional guarda el valor de un registro en memo- ria y ademds pone el valor 1 en este registro si la operacién termina con éxito, 0 e valor 0sifalla, Dado que la carga devuelve el valor inicial y el almacenamiento el valor 1 s6lo si tiene éxito, la siguiente secuencia de instrucciones implementa un intercam bio at6mico en la posicién de memoria especificada por el contenido de §$1 try: add $t0, $zer0, $s4 ; copia valor de intercambio VW $tL, O($si) } carga enlazada sc $0, O($51) almacenamiento condiciona? beq $t0, $zero, try ; salto, almacenamiento fallido add $54, $zero, $tl ; Ievar valor cargado a $s4 El resultado de esta secuencia es un intercambio atémico entre los contenidos de $34 y de la posicién de memoria especificada por $34. Si cualquier otro procesador interviene y modifica el valor de la memoria entre la instrucciones 1 y Sc, la ins- truccién $¢ devuelve el valor O en $10 yla secuencia de cddigo se ejecuta otra vez. I f i i } | | i Ext: ac oper: nada duce duce entre regis cione Instr, nes « objet otro ur lize amt: progr sus Estas ques: tador estos casqt Com Ecos lado lengu ensan En Buaje inefic de D} actual guaje ensar aitiva (para idicar rqueo liente inter- ltimo vueda ador ven, Extorstém: Aunque el intercambio atémico se ha presentado en un entorno de sincroni+ zaci6n de multiprocesadores, es dtl también para la sincronizacién, por parte del sistema ‘operative, de procesos en un sistema con un unico procesader. Para asegurarse de que nada interfiere en el pracesador, el almacenarriento condicional fala, también, si Se pro- {dave un cambio de contexto del procesador entre las dos instrucciones (véase capitulo 5). ‘Dado gue el slmacenamiento condicional falla si otro procesador intenta ejecutar una instruceién de almacenamiento con la direccién de la carga enlazada o si Se pro- duce une excencion, se deben elegir culdadosamente qué instrugciones se insertan fnire las dos instruociones, En particular, solamente son seguras las Instrucciones registro-egistro; con cualauler otro tipo de instrucciones es posible que se creen situa jones de punto muerto (deadlock) y que el procesador no pueda completar nunce fe instrucelén se debido a fallos de pagina repstitivos. Ademds, el numero de instruccio- nes entre la carga enlazada y el almacenamiento condicional debe ser pequetio con el objetivo do minimizar Ie probabllidad de que, o bien un suceso no relacionado, o bien tro procesador hagan que el almacenemiento condicional fale trecuentemente. Una ventaja del mecanismo carga enlazada/almacenamiento concicional es que puede vtlizarse para construir otras primitivas de sincronizacion, tales como comparacian e inter- ‘cambio atémico 0 buisquede-eincremento atéiica, que se utlizan en algunos modelos de ‘programacion paralela, Estas primitivas tienen mds instrucciones entre 11 sc. {{Cuéndo se utlizan primitivas como carga enlazada y almacenamiento condicional? 1. Cuando los hilos cooperantes de un programa paralelo necesitan sincroni- zarse para leer y escribir datos compartidos correctamente 2. Cuando los procesos cooperantes de un monoprocesador necesitan sin- ctonizarse para leer y escribir datos compartidos. EY oan sta seccién describe los cuatro pasos necesatios para transformar un programa en C «gue se encuentre en un ficheto de un disco en un programa ¢jecutable en un compu- tador. La figura 2.21 muestra la secuencia de traduccién., Algunos sistemas combinan «estos pasos para reducir el tiempo dela traduccién, pero éstas son las cuatro fases log cas que todos los programas necesitan, Esta secci6n sigue esta jerarquia de traducci6n. Compilador El compilador transforma el programa en C en un programa en lenguaje ensam- blador, wna forma simbélica de lo que entiende la maquina. Los programas en enguaje de alto nivel utilizan bastantes menos Iineas de cédigo que el lenguaje ensamblador, por lo que la productividad del programador es mucho més alta. En 1975, muchos sistemas operativas y ensambladores fueron excritos en len- guaje ensamblador porque las memorias eran pequefas y los compitadores eran. ineficientes. El aumento de 500 000 veces la capacidad de memoria por cada chip de DRAM ha reducido las preocupaciones por el tamafio del programa, y los actuales compiladores que optimizan pueden producir hoy programas en len- ‘guaje ensamblador précticamente tan buenos como los de un experto en lenguaje ensamblador,e incluso a veces mejores en cl caso de programas grandes. io de un programa 238 Autoevaluacién Lenguaje ensambla- dor: lenguae simbstico aque se puede traducir a binario, 140 Capitulo 2 Instrucciones: ef lengusje del computador Pseudoinstrucciones: variacion comin de las snstracciones de! len- guaje ensamblados, _generalmente tratadas como sifueran insteac- que i 2.43 Un efomplo do ordenamiento en ¢ para verlo toi junto | ow wero = Riera ees #retorna a 12 rutina que Jo Wan6 FIGURA 2.25 Cédigo ensamblador MIPS del procedimiento intercambio (sxe) en ta figura 2.24, es una de las més simples aunque no la ordenacion més répida. La figura 2.26 muestra la versi6n C del programa. De nuevo, presentamos este procedimiento en varios pasos y concluimos con el procedimiento completo. void sort Cint vf], int 9) t int 1. 4 for G20; imi eet for (j= = 12 § 90 8h Oj} > vOJ FU dm DE swaplv.J): ’ , FIQURA 226 Procedimiento ¢ que realiza la ordenacién (sort) de una tabla V, Asignacién de registros para la ordenacién (sort) Los dos parémetros del procedimiento de ordenacién (sort), vy n, estén en los registeos $20 y $21 y asignamos el registro $50 a i yelregistro $s1aj. Codigo del cuerpo del procedimiento de ordenacién (sort) El cuerpo del procedimiento consiste en dos lazos anidlados for y una llamada al procedimiento de intercambio (swap) que incluye parémetros. El cédigo se des- compone del exterior hacia dentro. Bl primer paso de la traduccién es el primer lazo for: for(i =O;i¢m it Recordemos que la sentencia for de C tiene tres partes: inicializacién, comproba~ vig #11; §-= 1 La parte de inicializacion de este lazo es de nuevo una instruccién: addi Ssi, $50, -1 8G E] decremento de j al final del azo es también una instruccién: addi $51, $81, -1# j= 1 La prueba del lazo tiene dos partes. Salimos del lazo si cualquier condicién fall por tanto, el primer test debe salir del lazo si falla ( < 0): forgtst:sltisto, $51, 0 # reg $t0 = 1 si ts1 <0 (J < 0) bne $20, szero, exit2 # ir a exit2 si $s1<0 (i < 0) Esta bifurcacion pasaré por alto el segundo test de condicién. $i no lo salta, entonces j 20. or el tima salir aby 108 3 rior lazos salts, 2.13. Un ejemplo de ontenamiente en C para varto tego junto: La segunda prueba sale dellazo si vj] > v£j + 1] noes verdad, o bien si v5] Sv{j + 1). Primero creamos la direccién multiplicando j por 4 (puesto ‘que necesitamos una direccién del byte) y la surnamos la direccién base de v. sll Sth, $1,2 ff reg Stl =i 4 add $2, $a0,St1# reg $t2 ™v + (i * 4) Ahora cargamos vj: 1 $3, O(8t2) # reg $3 = vE¥] Puesto que sabemos que el segundo elemento es justo la palabra siguiente, surna- mos 44 la direccién en el registro $2 para conseguir vEj + 1]: iw $t4, 4(8t2) # reg $t4 = vj + 1] Bltestde vid] < vEJ + es igual queel vj + 1] 2 v{51.Por tanto, las dos instrucciones de la prueba de salida son: sit $t0, $4, $t3 # reg $t0 = 0 si $t4.2 $t3 beq tO. Szero.exit2 fir a exit? si $td 2 $t3 La patte final del lazo salta de nuevo atrés hacia el test del lazo interno: j forgtst # salta al test del lazo interno Combinando las piezas conjuntamente, el esquema del segundo lazo for aparece como: addi $s1, $50, -L Heese for2tst:slti $t0. $51. 0 # reg $t0 = 1 si $51 < 0 (j<0) bne $20, Szero,exit2 # ir a exit? si $310 (30) sl] $t1, $s1,2 #reg sti= j*4 add $t2, $20, Stl # reg $2 =v + (J * 4) Tw $83, 0(8t2) # reg $13. = vEjT dw $td, 4(5t2) # reg $t4 = vf3 +1] sit $t0, $t4, $t3 # reg $t0 = 0 si $t4 2 $03 beq $0) Szero.exit2 # ir a exit2 si std > st3 (Cuerpo dei segundo laza for) addi $61, $sl,-1 ff j= 1 i for2tst # salta al test del lazo interno exit2: La llamada de procedimiento en ordemacién (sort) El siguiente paso es el cuerpo del segundo lazo for: swapv, Jj}; La llamada al procedimiento de intercambio (swap) es bastante facil: Jal swap if Capitulo 2 Instrucciones: el Lenguaje det computador EI paso de parametros en ordenacién (sort) El problema aparece cuando deseamos pasar parémetros porque el procedimiento de ordenacién necesita los valores en los registros $0 y Sal y el procedimiento de intercambio necesita tener sus parimettos pugstos en esos mismos registros. Una solucién es copiar los pardmetros para la ordenacién (sort) en otros regis- tros al principio del procedimiento, de modo que los registros $a0 y Sal estén disponibles para la llamada del intercambio (swap). (Esta copia es més répida que guardar y restaurar de la pila). Primero se copia $a0)y $a en $52 y $53 durante el procedimiento: move $s2, $20 # copia el parémetro $a0 en $52 move $s3, $al_ # copia el parametrr Sal en $53 Luego se pasan los parémetros al procedimiento de intercambio (swap) con las dos instrucciones siguientes move a0, $52 # el primer parametro de intercambio # (swap) es v move fal, $81 # e1 segundo parémetro de intercambio # (swap) es j Preservacion de registros en ordenacién (Sort) El unico cédigo que nos falta tratar es guardar y restaurar los registros. Clara- mente, debemos guardar la diteccién de retorno en el registro $1ra, puesto que la ordenacién (sort) es un procedimiento y es llamado como tal. El procedimiento de ordenacién también utiliza los registros guardados $50, $s1, $52 y $53, asi que deben ser guardados. El prélogo del procedimiento de ordenacién es el siguiente: addi $sp,$sp,-20 # reserva espacio en Ta pila para § reg. sw $ra,16(3sp) # guardar Sra en la pila sw $83,12($5p) # guardar $33 en la pila sw $52. 8($sp) # guardar $s2 en la pila su $31, 4($5p) # guardar $51 en la pile sw $80, O($sp) # guardar $50 en Ta pile El final del procedimiento invierte simplemente todas estas instrucciones, y des- pués afiade un jr para retornar. El procedimiento de ordenacién (sort) completo Ahora ponemios todas las piezas juntas en la figura 2.27, teniendo cuidado de reemplazar las referencias a los registras $40 y $21 en los lazos for por referencias alos registros $52 y $53. De nuevo, para hacer el cédigo més facil de seguir, iden- tificamos cada bloque del cédigo con su propésito en el procedimiento. En este ejemplo, 9 Iineas del procedimiento de ordenacién (sort) en C se convirtieron en 35 lineas de lenguaje ensamblador MIPS. Se hem u Pe al i 27 a 2.43 Un ejemplo de oréonamiente en € para verte todo junto 85 Extensién: Une optimizacién que funcionarfa con este ejemplo es el procedimiento en inea (rnin). En vez de pasar ergumentos en pardmotos y de invocar el e&digo con tina instrucci6n 217, of compilador copiaria ol cédigo del cuerpo del procedimiento de intercambio (swap) donde ts llamada al provedimiento de intercambio apereciera en el codigo. Le inclusion (inlining) exitarfa cuatro instruciones en este ejemplo. La desver- taja de la optimizacién por inclusién fintning) es que el cécigo compilaco sexta mas grande si el procedimiento en linea se llamara desde cstintos lugares. Este tipo de ee eee | cute eretiecscon }quardar sra.en 12 pita en Perera nove $33, Sal # copia el pardmetro $al en $33 (quardar $61) la bne St, $zero, exit? Hir aexit2 si$s1 deta interpretacién versus a compilaciOn de Java y del c6digo para la ordenacién por burbuja Java y MIPS). Los ratios no estén tan cerca para Quicksort en la columna 5, probablemente porque es mds dificil amortizar el coste de la compilacién en tierpo a de ejecucién (runtime) en el tiempo de ejecucién més corto. La tiltima columna muestra el efecto de un algoritmo mejor, que proporciona un incremento de las prestaciones de tres érdenes de magnitud para una ordenacién de 100 000 elemen- Un ‘os, Incluso comparando el Java interpretado en la columna 5 con el compilador de | lac Cen ls optimizacién de grado més alto en la columna 4, Quicksort gant a la ordena- con cisn por baba (ube srt) por wn fcior de 50 (0.05%2458,0123contra241). | th i mer 1 236 Extensién: Los compiladores MIPS siempre reservan espacio en ia pla para os arg | inge rmentos en el caso de que necesiten ser aimacenados, asf que en realidad siempre dis minuyen Ssp en 46 para reservar espacio para los cuatro registios de argumentos (16 | ee bytes). Una razén es que C proporciona una opcisn vararg que permite a un punter | a tomar, por ejemplo, of tercer angumento de un procedimiento. Cuando el comoliador | encuentra el poco frecuente vararg, copia fos cuatro registros de argumentos en la, «= W@t pile en las cuatro posiciones reservades, fetta azo — 2 part : : Fag winguna 1.08 158 615 114 938 age] = Gi (medi) 237 66.390 37 470 78 Dz corset 238 8652 soos +f a6 Pare 38 integrin det 2a 85747 44098 ae] oma precedente) Be i FIGURA 2.28 Comparacién do tas prestaciones, det mimero de instrucciones y del C usando las optimizaciones del compilador para la ordenacién por el método de ta burbu Pue (Guubble sort). Los programas ordenaron 100 00 palabras con fa tabla ficada con valores alaar. Eas} ind programas fueron ejecutados en un Pentium 4 con une frecuencis de reo) de 3.06 GHz yun bus del sistema {£0385 Me con 2GB de memoria SDRAM PC2100 DDR, Se utlas aversion 24.20 d Lins i A r 2.14 Tablas frente a pusteros is? c compladar ing £00 £00 2468 compar OL 237 £50 co complader 2 238 50 555 complader oF Bat ToL 1955 ia Troe = Oz, 0.05 050 aiiplador foseTime | ——— 2a, 29) =e FIGURA 2.29. Prestaciones de dos algoritmos de ordenacién en ¢ y on Java weandio interpretacién y optimizacién de ‘compiladeres en relacién con la versién de © no optimirada, La dima columa muestra la ventae en elosiged de Quiceoort sobre a ordenacisn por burbufa pera cada lenguse 7 opeida de elecucién Eos programas fueron ejcutados eel misma sistema que elt lrad enl figura 228. La JVM esta versén 1.3.1 de Son, yl JIT erla version 13.1 de Hotspot de Sun. Tablas frente a punteros Un desafio tipico para cualquier programador novel es comprender fos punteros. La comparacién del cédigo ensamblador que utiliza tablas y los indices a tablas con el cédigo ensamblador que utiliza punteros ofrece elementos de comprensién de los punteros, Esta seccién muestra las versiones de dos procedimientos en Cy en lenguaje ensamblador MIPS para inicializar una secuencia de palabras en memoria: una utilizando indices de tablas y otra utilizando punteros. La figura 2.30 muestra los dos procedimientos en C. El propésito de esta secci6n es mostrar como se corresponden los punteros con instrucciones MIPS, y no promover un estilo de programacion anticuado. Vere- ‘mos el impacto de la optimizacién de un compilador moderno en estos dos pro~ ae rmattpatabre| Olacanyout FIGURA 2.35. Instrucciones aritméticas y légicas do ARM no disponibles on MIPS. Rotacién a la derecha En ARM también se dispone de instrucciones para almacenar grupos de regis- tros, llamados cargas y almacenamiento por bloques (block load, block store). Utili- zando como control una mascara de 16 bits incluida en la instruccién, cualesquiera de los 16 registros pueden cargarse o almacenarse en memoria en una tinica instruccién. Estas instrucciones puede utilizarse para salvar y restaurar registros en las Hamadas y retornos de un procedimiento. Sin embargo, el uso actual més importante de estas instrucciones es la copia de bloques de memoria. rele) Casos reales: instrucciones x86 Los diseftadores del repertorio de instrucciones proporcionan a veces operaciones més potentes que las que aparecen en ARM o MIPS, La meta es generalmente reducir el ntimero de instrucciones ejecutadas por un programa. El peligro esté en que esta reduccién puede hacerse a costa de la simplicidad, y se aumenta el tiempo que tardan los programas en ejecutarse porque las instrucciones son mas Tentas, Esta lentitud puede ser el resultado de un ciclo de reloj més lento 0 de que se requiere més ciclos de reloj que una secuencie més simple. El camino hacia la mayor complejidad de las operaciones esta asi plagado de peligros. Para evitar estos problemas los diseniadores se han decantado por ins- ‘trucciones més simples. La seccién 2.18 muestra las trampas de la complejidad. Evolucién del Intel x86 ARM y MIPS fueron l resultado de la visién que tuvieron en 1985 un pequenio grupo de personas; Jas piezas de esta arquitectura encajan facilmente unas con otras y la arquitectura entera se puede describir de forma sucinta. Pero este no es el caso del x86; éste es el producto de varios grupos independientes que desarro- laron la arquitectura a lo largo de casi 30 afios, agregando nuevas caracteristicas al repertorio de instrucciones original como el que afiade ropa a una maleta. Aqu{ estén los hitos més importantes del x86: 468 La belleza esti en los ojos: del gue mira. Margaret Wolfe Hungerford, Melly Bavn, 1877 Registro de propésito ‘general (GPR): registro que se puede utilizar para as direcciones 0 para los datos con vir- tualmente cualquier ins truccién. Capitulo 2. tnstrucclones: el Lenguaje del computador 1978: La arquitectura del Intel 8086 fue anunciada como una extensién compatible en lenguaje ensamblador del exitoso Intel 8080, un microprace- sador de 8 bits. E1 8086 es una arquitectura de 16 bits, con todos los registtos internos de un tarnaito de 16 bits. A diferencia de MIPS, los registros tienen uusos especificos, y por tanto los 8086 no esté considerados una arquitectura de registro de propésito general, ‘8 1980: Se anuncia el coprocesador de punto flotante Intel 8087. Esta arqui- tectura ampli Jos 8086 con cerca de 60 instrucciones de punto flotante. En lugar de usar los registros, se utiliza la pila (véase la fl seccién 2.20 en el CD ylaseccion 3.7). m 1982: El 80286 amplia la arquitectura 8086 aumentando el espacio de direc- ciones a 24 bits, creando una distribucién de memoria y un modelo de pro- teccién elaborado (véase el capstulo 5) y agregando algunas instrucciones més para completar el repertorio de instrucciones y para manipular el modelo de proteccion, ‘m_ 1985: Los 80386 ampliaron Ja arquitectura 80286 a 32 bits. Ademas de la arqui- tectura de 32 bits con registros de 32 bits y un espacio de direccién de 32 bits, el 80386 afiade nuevos modos de direccionamiento y nuevas operaciones. Las instrucciones afiadidas hacen de los 80386 casi una méquina de registros de propésito general. El 80386 también afiade soporte de paginacién adems del direccionamiento segmentado (véase el capftulo 5). Como los 80286, los 80386 tienen un modo para ejecutar programas 8086 sin hacer ningtin cambio. 1989-95: Los subsiguientes 80486 de 1989, el Pentium en 1992 y el Pentium Pro en 1995 tenian el propésito de aumentar las prestaciones, con sola- mente cuatro instrucciones afiadidas al repertorio de instrucciones visible por el usuario: tres para ayudar con el multiproceso (capftulo 7) y una ins- truccién de movimiento condicional. 1997: Después de lanzar el Pentium y el Pentium Pro, Intel anuncié que ampliaria las arquitecturas Pentium y Pentium Pro con MMX (eXtensiones Malti Media). Este nuevo repertorio de $7 instrucciones utilizabe la pila del punto flotante para acelerar aplicaciones multimedia y de comunicaciones. Las instrucciones MMX funcionan tipicamente con multiples datos peque- ios a la ver, siguiendo la tradici6n de las arquitecturas de flujo nico de ins- trucciones-miltiples flujos de datos (SIMD) (véase el capitulo 7). El Pentium II no introdujo ninguna instruccién nueva. 1999: Intel aftadi6 otras 70 instrucciones, etiquetadas SSE (extensiones de flujo SIMD, Streaming SIMD Extensions) como parte del Pentium III Los principa- les cambios eran aftadir ocho registros separados, doblar su anchura a 128 bits yy agregar un tipo de datos de punto flotante de precision simple. Por tanto, ‘cuatro operaciones de punto flotante de 32 bits podian realizarse en paralelo. Para mejorar las prestaciones de la memoria, SSE inchafa instrucciones de pre biisqueda de cache mis las instrucciones de almacenamiento de flujo que puentean las cache y escriben directamente en la memoria. w 2001: Intel agregé otras 144 instrucciones, esta vez etiquetadas SSE2. Este nuevo tipo de datos es de aritmética de doble precisién, que permite pares de operaciones de punto flotante de 64-bit en paralelo, Casi todas estas, “a 247 Gatos reales: imetntcciones x82 444 instrucciones eran versiones de las instrucciones existentes de MMX y de SSE que funcionan en 64 bits de datos en paralelo. Este cambio no slo permitia més operaciones multimedia, también daba al compilador un objetivo diferente para las operaciones de punto flotante que la arquitectura de pila tinica. Los compiladores podian elegir utilizar los ocho registros de SSE como registros de punto flotante del tipo de los encontrados en otros computadores. Este cambio estimulé las prestaciones del punto flotante en el Pentium 4, el primer microprocesador en incluir las instrucciones SSE2. 2003: Otra compafia ademas de Intel aumenté Ia arquitectura x86, AMD anun- ‘6 un conjunto de extensiones arquitecténicas para aumentar el espacio de direc- cigm de 32 bits a 64. De forma similar a la transicién del espacio de direccién de 16 «232 bits er. 1985 con los 80386, AMD64 amplia todos los registros a 64 bits. Tam ign aumenta el ndmero de registros a 16 y el miimero de registtos de 128 bits SSE 4.16. B cambio principal del ISA (arquitectura del repertorio de instrucciones) viene de aftadir un nuevo modo llamado el modo largo (long mode), que redefine la gjecucion de todas las instrucciones x86 con direcciones y datos de 64 bits. Para abordar este ntimero més grande de registros, agrega un nuevo prefijo 2 las ins- ‘rucciones. Dependiendo de cémo contemos, el modo largo tambien afiade de-4a 10 nuevas instrucciones y quita unas 27 vieas. El direccionamiento de datos rla- tivo al PC es otra extensi6n. AMDE4 todavia tiene un modo que es déatico a x86 (riodo de herencia, legacy mode) mas un modo que restringe que el usuario pro- grame en x86 pero que permite que los sistemas operatives utilien AMD64 {modo de compatibitidad). Estos modos permiten una transicién més agradable al

You might also like