You are on page 1of 36
tapiruLo 4 « Us AROUITECTURA DE PROGRAMACION 109 4.2.1 Memoria en ARC ARC es una maquina de 32 bits con capacidad de direccionarniento de memoria por bytes; puede manejar tipos de datos de 32 bits, pero toda la informacién se almacenaen memoria en la forma de bytes. La direccién de 1a patabra de 32 bits es la del byte almacenado en la menor de las direcciones de la palabra, Como se ha descripto anteriormente en el contexto de la figura 4.4, ARC tiene un espacio de memoria de 32 bits, que en la arquitectura de este ejemplo se divide en distintas regiones a ser usadas por el cédigo del sistema opera- tivo, el eédigo del programa del usuario, la pila del sistema (utilizada para el almacena- miento temporario de informacién) y la entrada y salida. Estas regiones de memoria se detallan a continuacién: + Las primeras 2048 direcciones del mapa de memoria se reservan para ser usadas por el sistema operative. * El espacio del usuario es el que se reserva para la carga de los programas ensambla- dos por el usuario. Puede crecer durante el funcionamiento desde la direccién 2048 hasta que se encuentre con la pila del sistema. + La pila del sistema se inicia en la direccién 2°" ~ 4 y crece hacia direcciones inferio- res de memoria. La causa por la cual se organiza el crecimiento de los programas en el sentido de memoria creciente y la pila en sentido decreciente puede verse en ta fi- gura 4.4; esta organizacién acepta tanto una combinacién de programas grandes con pilas pequelias como la de programas pequeiios y pilas grandes. + La zona del mapa de direcciones ubicada entre 2°! y 2° — | se reserva para los dis- positivos de entrada-salida, Cada dispositivo tiene asignada una serie de direcciones de memoria para el almacenamiento de sus datos, en lo que se denomina “entrada- salida mapeada en memoria”. ARC tiene diferentes tipos de datos (byte, media palabra, entero, etc.), pero, por el momento, se considerard solo el tipo de datos entero de 32 bits. Cada entero se alma- cena en memoria como un conjunto de cuatro bytes. La arquitectura ARC funciona con el byte mas significativo almacenado en la menor de las direcciones asignada a la palabra, lo que se conoce como almacenamiento big endian. La maxima direccién disponible para el almacenamiento de un byte en ARC es 2°*— 1, de modo que la recci6n de la palabra mds alta de memoria est ubicada tres bytes por debajo de esta, en 2-4, 4.2.2 El conjunto de instrucciones ARC Con el objeto de obtener detalles del conjunto de instrucciones ARC, se hace necesario revisar primero las caracteristicas de la CPU: 110_pamcipios ne anquirecruRa O& COMPUTADORAS + ARC tiene 32 registros de uso general, de 32 bits cada uno, asf como un contador de programa (PC) y un registro de instruccién (IR). + Existe un registro de estado del procesador (PSR, processor status register) que contiene informacién acerca del estado del procesador, incluida la informacién re~ ferida a los resultados de las operaciones aritméticas. Las “banderas aritméticas” del registro de estado se denominan eédigos de condieién. Expecifican si en una operacién aritmética determinada el resultado dio cero (2), si dio un niimero nega- tivo (n), si se obtuvo un arrastre a la salida de ba unidad aritmético-I6gica de 32 bits (©), 0 si se produjo un desborde (v). El bit v se activa cuando el resultado de la operaci6n aritmética es demasiado grande como para ser manejado por la unidad ariumético-tgica, + El tamaiio de todas las instrucciones es de una palabra (32 bits). + ARC es una maquina de arquitectura carga-descarga (load-sture), Las tinicas ins- trucciones permitidas para el acceso a memoria cargan un valor hacia alguno de los registros, o almacenan en una posicién de memoria el contenido de alguno de los re- gistros. Todas las operaciones aritméticas se ejecutan sobre aperandos contenidos en registros y los resultados también quedan almacenados en un registro. El conjunto de instrucciones del procesador SPARC, sobre el que se basa ARC, tiene aproxima- damente 200 instrucciones. La figura 4.7 ilustra un subconjunto de 15 de esas ins- trucciones. Cada instrucci6n estd representada por un cédigo nemotéenico, defini do como un nombre utilizado para simbolizar la instruccién. Mnemonico. Puneies Memoria 1a [Cargar un registro desde nonoria st_[Saivar un registro ea eesoria setni | Cargar loo 22 bits mAs significatives de un regiatro ‘andce | Producto 1agice bit a bit (¥) Logicas force [Suna 1egica bit a bit (0) ernce | Suna logica negade bit a bit (NOR) aet__[Desplazer a dereche (égico) Aritméticas [[ [[saace | sunar call | Saito (llamado) a eubrutina ‘jmpi_| Retorno de subrotina be | Bifurcacion (salto por igual) Control neg | Bifurcacién (salto) por negative bes | Bifurcacién (selto) por arraotre bea | Bifurcecibn (selto) por desborde be [Biturcacién (salto) incoadicional igura 4.7 « Subconjunto de instrucciones para la arquitectura de programacién ARG. CAPITULO 4 + LA ARQUITECTURA DE PROGRAMACION 111 Instrucciones para el movimiento de datos Las primeras dos instrucciones, 1d (load [eargar]) y st (store {descargar 0 almacenar]) transfieren una palabra entre la memoria principal y alguno de los registros de ARC. Es- tas son las tinicas instrucciones que permiten el acceso a memoria dentro de ARC. La instruccién seth carga los 22 bits mds significativos de un registro con la cons- tante de 22 bits contenida dentro de la instrucci6n, Se la utiliza habitualmente para cons- truir una constante arbitraria de 32 bits a ser almacenada en un registro, en conjunto con otra instruccién que carga los 10 bits menos significativos del registro. Instrucciones aritméticas y légicas Las instrucciones andee, oree y ornce realizan operaciones Y, O y NOR, respectiva- mente, sobre sus operandos, Uno de los dos operandos origen debe estar en un registro. El otro puede estar en un registro o puede ser una constante incluida en la instruceién, ex- presada en 13 bits en notacién de complemento a dos, la que se extionde a 32 bits cuan- do se ta utiliza, El resultado se almacena en un registro. Para el caso de la instruccién andce, cada bit del resultado se coloca en | si los bits correspondientes de ambos operandos son simultdneamente 1; en caso contrario, el bit del resultado vale 0. En la operacién orce, cada bit del registro es | si al menos uno de os correspondientes bits de los operandos vale I; en caso contrario, el bit correspondien- te del resultado vale 0. La operacién ornce es complementaria de orec, de modo tal que cada bit del resultado vale 0 si uno o los dos bits correspondientes en los operandos vale 1; en caso contrario, el bit del resultado se coloca en 1. Los sufijos “ee” especifican que luego de realizada la operacién deben actualizarse los cédigos de condicién del re- gistro de estado de modo que permitan reflejar el resultado de la operaciGn realizada. En particular, el bit 2 se coloca en 1 si todos los bits del registro que contiene el resultado son cero, el bit n se pone en | si el bit més significative del resultado es 1, y los bits ¢ y vv, en el caso de estas instrucciones en particular, se colocan en 0. (Por qué?) Las instrucciones de desplazamiento permiten desplazar el contenido de un registro hacia otro, La instruccién sx1 (shift right logical [desplazamiento I6gico a derechal) desplaza un registro hacia la derecha y carga ceros en el (los} bit(s) mds significativo(s). La instruccién sa (shift right arithmetic [desplazamiento aritmético a derechal), que no se indica en la tabla, desplaza el contenido original del registro a la derecha y almacena ‘una copia del bit mas significative del contenido original en los bits vacios creados por el desplazamiento del registro. Esta operacién da por resultado Ia extensién de! signo del ‘operando, preservando asf su signo aritmético. La instrucci6n addee realiza sobre sus operandos una suma de 32 bits en comple- mento a dos. 112. PRINGIPIOS DE ARQUITECTURA DE COMPUTADORAS Instrucciones de control Las instrucciones ca y jmp4 forman un par utilizado para el llamado de subrutinas y el retorno desde las mismas, respectivamente, La instruccién jmp1 también se utiliza pa- a transferir el control a otro sector del programa, Las Gltimas cinco instrucciones son instrucciones de salto o bifurcaci6n condicio- nal. Las instrucciones be, bneg, bes, bys y ba provocan un salto en la secuencia de ejecucién de un programa, Se las llama condicionales debido a que verifican uno 0 mis de los cédigos de condicién del registro de estado, y provocan el salto si los bits, indican que la condicién verificada se cumple. Se utilizan para la implementacién de construcciones de alto nivel, tales como goto, if-then-else y do-while. Las secciones siguientes describen estas instrucciones en forma detallada y ofrecen ejem- plos de su utilizacién, 4.2.3 Formato del lenguaje simbélico de ARC Cada lenguaje simbélico tiene su propia sintaxis, En este caso, la sintaxis a respetar es la del lenguaje de programacién simbélico de SPARC, que se muestra en Ia figura 4.8. Et formato incluye cuatro campos: un campo optativo para los rétulos, un campo para el cb- digo de operaci6n, uno o mas campos para especificar los aperandas origen y destino (si existieran operandos), y un dltimo campo optativo para los comentarios. Los rétulos se forman con cualquier combinacién de los caracteres alfabéticos o numéricos y con los bolos correspondientes al guién bajo (_), al signo monetario ($) y al punto (.), siem- pre y cuando el primer cardcter no sea un digito. Todo rétulo debe terminar en dos pun- tos (;), El lenguaje es sensible al tipo de tetra, por lo que hace distincién entre letras ma- ylsculas y mindsculas. El lenguaje ofrece “formato libre”, lo que significa que cualquier campo puede empezar en cualquier columna, debiendo mantenerse el ordenamiento re- lativo de izquierds a derecha. Opersndos Operandos Rétulo Mneménico deorigen dedestine Comemario t 4 4 v ‘ + +4 os tt abi: addec trl, &r2, %r3 tzjemplo de codigo simbolico Formato de una sentencia en el lenguaje simb6lico SPARC {también ARC). La arquitectura ARC contiene 32 registros denominados 8x0 - x31, cada uno de los cuales contiene una palabra de 32 bits. También existe un registro de estado del procesa- dor (PSR), que describe et estado vigente del procesador, y un contador de programa (PC) de 32 bits, que controla la direccién de la instrucci6n en ejecucién, segiin se ilustra en la figura 4.9. El registro de estado del procesador se denomina $psr, en tanto que el contador de programa se designa como &pc. El registro 8x0 siempre contiene el valor cAPrTULO 4 » LA AROUITESTURA DE PROGRAMACION 113 0, el cual no puede modificarse. Los registros $14 y 815 tienen aplicacién adicional como puntero de pila (tsp, stack pointer) y registro de enlace (link register), respec- tivamemte, segtin se describe mas adelante. Regisiro 00] ro [= 0) [ Regisiro 11 ] tr21 Registro 22 | $r22 Registro Ol | $r1 Regis 12 | #r12 Registro 23 | 8x23 Registro 02 | 8x2 Registra 13 | #r13 Registro 24 | 8r24 Regisiro 03 | 8x3 Registrol4 [$14 [8sp] [Registro 25 | ex25 Regisiro 04 | 8x4 Registro 15 | @15 [Link] | Registro 26 | vr26 Regisiro 05 | 8x5, Registro 16 | #16 Regisizo 27 | 6x27 Registro 06 | tr6 Registro 17 | tr17 Registro 28 | $r28 Registro 07 | 8x7 Regiswo 18 | ar18 Registro 29 | er29 Registro 08 | 88 Registro 19 | #r19 Registro 30 | $r30 Registro 09 | 8x9 Registro 20 | #20 Registro 31 | #31 Registro 10 | #r10 Regist 20 | #22 PSR | apsr PC | pe 32 bits— 22 bits—— Figura 4.9 » Registros en ARC accesibles al programador. Los operandos que aparecen en una sentencia del lenguaje simbélico se separan por comas, y el operando de destino siempre debe aparecer, dentro del campo de operandos, en la posicién de la derecha, Por consiguiente, el ejemplo de la figura 4.8 especifica la suma de los registros. ‘rly 2, y el almacenamiento del resultado en 613. Si en el campo de operandos, en la posicién de destino, aparece el registro $20, el resultado se descarta. Los operandos numéri- CoS se representan, por defecto, en el sistema de numeracién decimal, por lo que la sentencia addec ri, 12, &r3 muestra una operacién de suma entre el contenido del registro %-1 y un operando de va- lor (12),q) Cuyo resultado se almacenard en el registro $3. Los nimeros se interprotan en el sistema decimal, a menos que se los preceda por “0x” o se los termine en “H”, cual- quiera de los cuales indica que el mimero es hexadecimal. El campo de comentarios se encuentra a continuacién del campo de operandos: se inicia con un signo de admiracién y termina al final del rengtén. 4.2.4 Formatos de instruccién en ARC El formato de instruccién define la manera en que el ensamblador distribuye los diver- 50s campos de una instrucci6n y Ia forma en que los interpreta la unidad de control de ARC. La arquitectura ARC tiene unos pocos formatos de instruccién. Los cinco forma- 114 enmewios pe aRGurTECTURA DE COMPTADORAS tos son: SETHI, Salto, Ltamada (CALL), Aritmético y Memoria, de acuerdo con que se describe en Ia figura 4.10, Cada instruccién tiene una representacién nemotécni- ca, tal como “1d”, y un cédigo de operacién. Un formate particular de instruccién puc- de tener mds de un campo de operandos, los que en forma colectiva identifican una ins- truccién en una de sus diversas formas. (Nétese que los formatos de instruccién mencionados no se corresponden directumente con la clasificucién de las instrucciones en cuatro grupos, planteada en la figura 4.7). Los dos bits mAs significativos (a la izquierda de fa palabra) forman el campo op co- rrespondiente al cédigo de operaci6n, el que identifica el formato. Los dos formatos correspondientes a SETHI y a las instrucciones de salto contienen 00 en el campo op, por lo cual pueden juntarse para considerar un tinico formato. Quien determina si el for- mato corresponde a SETHI 0 a un salto es el dato contenido en el campo op2 (010 salto, 200 = SETHI). En el formato de salto, el bit 29 siempre vale cero. El campo de cinco bits rd identifica el registro al que se aplicaré la instruccién SETHI. ep rl roruste de 2 3530292027 36 2526 23 1221.20 107 26151419121 10.09 08 97 06 5 0409201 90 inseruceion serar [9,0] x4, | 92 Teqzd ornato de instrucciones 2 of] Teena | ope diapi2 ae golte 33 30 29207926 25 2429722029 15 19.1736 35 141312111009 90 979650409 £2 01.90 Fornato det Manado @ subrutina |°.2| dispio L nm 2590292029 2625 26.29 221.20 19 191 165 14 1 1 1.09 00 9 08 0928 Pornatos de vo” ed op, ToL, [o[o%o"0'9, 00°00] | as instrucetones aritneticas rol” ope ma hil piney 153029 29372635 20 292 120 19 181 1 8 1413121 0.09 0 oT 8 08 0 8812.99 Foruatos de val” Fd eps fal | [ojovoro oo c"0o] | red insteueesones de nenoria Td oe [et pena op] Formato | [op2| inst. | [ op3 (op=10) | | op3 (op=11) | (cond) ealto 00] SerHr/ecench| [oro] branch | [o10000 eddec| [000000 xa | [o00a| be ot cane 100] setni || 010001 endce| | 000100 se} 0101] Bee 10] Aritneticas 010010 ore 0110] baeg U1] tenoria 910120 ornce a1 Bve 100510 sx 1000] ba 111000 net 21135-2920 2926 25 24 29.2221 2019 1019 26 1524.19 12 15 20 05 08 07 06 08 PSR Figura 4.10 » Formatos de instruccién y contenido del PSR en ARC. run 4 + Lo ARQUTTECTURA DE PROGRAMACISN 115 El campo cond identifica el tipo de salto condicional, que se basa en los c6digos de con- dicién (n, 2, v y ©) del registro de estado PSR, de acuerdo con Jo que puede observarse cn la parte inferior de la figura 4.0, Bt resultado de la ejecucidn de cualquier instruccién cuyo mneménico termine en “ee” acomods los hits de cédige de condicién de modo que 1 = 1 sil resultado de la operacion es negativo; z = 1 siel resultado es cero; v = 1 si la operacién causa un desborde; y © = 1 sila operacién genera un arrastre. Las ins- trucciones que no terminan en “ce” no afectan los e6digos de condicién, Cada uno de los campos imm22 y disp22 contiene una constante de 22 bits que se utiliza como operan- do en el formato SETHI (para imm22) 0 para et cAlculo del desplazamiento que permite determinar una direccién de salto (en el caso de di sp22). El formato correspondiente a una Hamada tiene solo dos campos: el campo op, que contiene la palabra binaria 01, y un campo disp30, que contiene un desplazamiento de 30 bits que se utiliza para determinar la direccién de la rutina invocada. Los formatos aritmético (op = 10)y memoria (op = 11) utilizan campos rd para identificar un registro origen en el caso de st, 0 un registro de destino para tas instracciones restantes. El campo x1 identifica el primer registro origen y el campo x82 identifica e] segundo registro origen. El campo op3 correspondiente al cédigo de operacién identifica la instruccién, de acuerdo con las tablas op3 indicadas en la figura 4.10 El campo simm13 es un valor inmediato de 13 bits, que se extiende con signo a 32 bits para el segundo registro origen cuando el campo 4 (inmediato) vale 1. El concepto de “extender con signo” significa que el bit de signo (el mas significativo) se copia en las posiciones restantes de una palabra de 32 bits, antes de ser sumnado a rs1 en este ca- so. Esto asegura que un nimero negativo en complemento a dos sigue siendo negativo tras la conversi6n a 32 bits (asi como un namero positive continga siendo positive). Por ejemplo, (-13),g= (1 1111 1111 0011),, y Iuego de la extensién a un formato entero de 32 bits se tiene (HL 1111 1111 1121 L111 HHL L111 O011),, que sigue siendo equiva- lente a (-13),5 Las instrucciones aritméticas necesitan dos operandos origen y un operand destino, Jo que hace un total de tres operandos. Las instrucciones de memoria solo necesitan dos operandos, uno para la direccién y uno para el dato. El campo origen remanente, sin em- bargo, se utiliza también para Ia direccién. Cuando i = 0, los operandos contenidos en los campos rs1 y rs2 se suman para obtener la direccién. Cuando i = 1, la direccién s¢ obtiene sumando los campos x1 y simm13. Para los primeros ejemplos a plantear, se utilizaré $10 para rs 2, con Jo cual solo se especificaré el operando origen restante. 4.2.5 Formatos de datos en ARC ARC soporta 12 formatos de datos diferentes, segdn se ilustra en ta figura 4.11, Los for- matos de datos se agrupan en tres tipos: entero signado, entero sin signo y punto flotan- te, Dentro de estos tipos, 1os tamaitos admisibles son byte (8 bits), media palabra (16 116 _princitos GE ARQUITECTURA DE COMPUTADORAS bits), palabra (32 bits), palabra rotulada (32 bits, de los cuales los dos bits menos signi- ficativos forman un rétulo o referencia, en tanto que los restantes 30 bits forman ef va- Jor), palabra doble (64 bits) y palabra cuddruple (128 bits). Them rigmlodebtin = ET] ‘rar signa de 1 bis rue sigma de 92 ‘eit Aner sacs ie (pubdate mers dee ered 1b apo ‘her de 320 ene ‘estaba Para con efresis te eins {palabra able) ie at snp oyun oucie Flats ‘npn feare lan cosdenple sapinooate Figura 4.11 « Formatos de datos en ARC. En realidad, ARC no distingue entre enteros signados © no signados. Ambos se manejan y almacenan como enteros representados en notacién de complemento a dos. Varia solo su interpretacién. En particular, un subconjunto de las instrucciones de salto supone que os valores que se comparan son valores con signo, en tanto que el otro subconjunto su- pone que no tienen signo. En forma similar, el bit ¢ indica un desborde en las operacio- nes enteras sin signo, en tanto que el bit v lo identifica para operaciones con signo, La palabra rotulada utiliza los dos bits menos significativos para indicar un desbor- capirimo 4 + La ARWUITECTURA DE pROgRamacrin 117 de, en el caso en que se imente almacenar un valor mayor que 30 bits en los 30 bits asig- nados en la palabra. Se utiliza en lenguajes con datos dinamicos, como Lisp y Smalltalk. En forma genérica, un | en cualquier bit del campo de referencia indica una situacién de desborde en esa palabra. Las referencias pueden utilizarse para asegurar que se cumplan las condiciones de alineacién requeridas (que una palabra empiece en una direccién mal- tiplo de cuatro bytes, que la palabra doble empiece en un méltiplo de ocho bytes, etc.), especialmente en el caso de los punteros. Los formatos de punto flotante se establecen de acuerdo con la norma IEEE 754-1985 (véase el capitulo 2). Existen instrucciones especiales que invocan formatos de punto flo- tante que no se describen aqui y que pueden encontrarse en Ja literatura de SPARC. 4.2.6 Descripcién de las instrucciones de ARC Siendo ya conocidos los formatos de instruccién, se puede desarrollar una descripcién detallada de las 15 instrucciones de ta figura 4.7. Esta secci6n se ocupa de esa descrip cin. La traduccin a e6digo objeto se agrega solo como referencia, ya que se describe en detalle en el préximo capitulo. En las descripciones, la referencia al contenido de una po- sicién de memoria (para 1d y st) se indica con corchetes, tal como en “1d [xx], ‘$r1”, que copia el contenido de la direccién x en el registro $11. La referencia a la di- reccién de una posicién de memoria se especifica directamente, sin corchetes, como ocu- meen“call sub_x”, instruccién que genera un Itamado a la subrutina sub_r. Solo 1d y st pueden acceder a memoria, raz6n por la cual admiten el uso de corchetes. Los registros siempre se mencionan en funcién de su contenido, nunca en términos de una di- reccidn; por consiguiente, no hay necesidad alguna de encerrar entre corchetes las refe- rencias a los registros. lustruceién: 1d Descripcién: Carga un registro desde la memoria principal. La direccién de memoria debe es- tar alineada con una frontera de palabra (Io que significa que la direccién debe ser miiltiplo de 4), Se calcula la direccidn sumando el conteniclo de! registro del campo r61 con el contenido. del registro indicado en el campo x82 0 con el valor del campo s.imm13, segun corresponda al contexto, Ejemplodeuso: ld {x}, $r1 obien Ad (xJ, 8x0, tet ° Ad Sro+e, Bri Significado: Copiar el contenido de la direcci6n x de memoria en el registro x1 Cédigo objeto: 1100 0010 0000 0000 0019 1000 0001 0000 118 _PRINcIPIOS OF AROUITECTURA DE COMPUTADORAS. Instruceién: st Deseripeién: Abmacena el contenido de un registra en la memoria principal. La direeci6n de ‘memoria debe estar en frontera de palabra, La direcci6n se determina sumando el contenido del registro indicade en el campo x91 con el contenido del registro indicado en el campo x82 0 con el valor del campo simm13, seguin corresponda, El campo rd de esta instruccién se utili- 2a para el registro origen. Ejemplodeuso: st #1, (x) Significado: Copiar el contenido el registro #1 en la posiciéa de memoria x. ‘Cédigo objeto: 1100 0010 0010 0000 0010 1000 0001 0000 ( = 2064) Instruceién: sethi Descripeién: Carga los 22 bits més significstivos de un registro y coloca en cero sus diez bits menos significativos. Si el operando es 0 y el registro es $0, la instruccién se comporta como una instrucei6n nop, 1o que significa que no se realiza operacién alguna, Ejemplo de uso: sethi 0x304F15, ¢r) Significado: Cargar en los 22 bits més significativos de #1 el valor hexadecimal 304F15, co- locando en cero los 10 bits menos significativos. Cédigo objeto: 0000 0011 0011 0000 0100 1111 0001 0101 Instruceién: andce Descripelén: Producto l6givo, bit por bit, de los operandos origen, almacenando el resultado enel operando de destino, Los eédigos de condicisn se fijan en funcién del resultado. Ejemplode uso: andec #r1, tr2, %23 Significado: Realizar el producto légico de los registras x1 y 8x2 y almacenar el resultado enar3, Cédigo objeto: 1000 0110 1000 1000 0100 0000 0000 0010 Instrucel6n: ore Descripelén: Suma légica, bit por bit, de los operandos origen, almacenando el resultado en el operando de destino. Los e6digos de condicién se fijan en funcién del resultado. Rjemplo de uso: orce @r1, 1, r1 Significado: Colocar en | el bit menos significative del registro %1. Cédigo objeto: 1000 0010 1001 0000 0110 0000 0000 0001 Instruceién: oznec Descripeidn: Negacién de la suma légica, bit por bit, de los operandas origen, almacenando el resultado en el operando de destino, Los e6digos de condicisn se fijan en funciGn del resultado. Ejemplode uso: orncc #11, r0, trl Significado: Complementar el registro $1. Cédigo objeto: 1000 0010 1011 0000 0100 9000 0000 000 caPiTuLo 4 + LA ARQUITECTURA DE PRGRAMACION 119 Instruceién: srl Deseripeién: Desplaza a la derecha el contenido de un registro en una cantidad de cero a 31 posiciones. Las posiciones que quedan vacias sobre la izquierda del registro desplazado se completan con ceros. Ejemplode uso: srl rl, 3, r2 Significado: Desplazar el contenido del registro #1 tres posiciones a la derecha y almacenar el resultado en ¥£2. Los tres bits més significativos de $r2 se completan con ceros. Cédigo objeto: 1000 0101 0011 9900 0110 0000 a000 o011 Instrueciém: addec Deseripeién: Suma los operandos origen dejando el resultado en el operando destino, para lo cual utiliza representacién signada de complemento a dos. Los eddigos de condicién se esta blecen en funcidn del resultado. Ejempto deuso: addec trl, 5, trl Signifiendo: Sumar 5 al contenido del registro #1. Cédigo objeto: 1000 0010 1000 0000 0210 0000 0000 0101 Instruceién: cal Deseripeign: Invoca una subrutina y almacena la direcci6n de fa instruccién actual (la que contiene el llamado) en %r15, lo que impl in de “Ilamado y enlace”. En el e6- digo ensamblado, el campo disp30 del formato CALL contiene un desplazamiento de 30 bits a partir de la direccidn de la instrucei6n cal. La direccién de la siguiente instruccién a ser cjecutada se obticne sumando 4-disp30 (lo que desplaza disp30 a los 30 bits més significa- tivos de la direccidn de 32 bits) con la direccién de La instruccién en ejecucién, Nétese que disp30 puede ser negative. Ejemplo de uso: call sub_> Significado: Invocar una subrutina que comienza en la posicisn de memoria sub_r. Para el cOdigo ebjeto indicado a continuacién, sub_r se encuentra ubicada en memoria 25 palabras (100 bytes) después de la instruccién cal. ‘Cédigo objeto: 0100 0000 9000 0000 9000 0000 0001 1002 una oper: Instruceién: jmpl Deseripeién: Salta y vincula (retorno de subrutina). Salta a una nueva direceién y almacena la direceién de la instruceién actual (Ia que corresponde a la instruccién jmp1) en el registro de destino. Ejemplo de uso: jmpl 8x15 + 4, @ r0 Significado: Retorno de subrutina, El yalor dei contador de programa al momento de la ins- teuccién cal] quedé almacenado en #15 y, por consiguiente, la direccién de retomne debe caicularse como la que sigue al call, en $r15 + 4. Ladireccién de la instruccién actual se descarta en $10. Cédigo objeto: 1000 0001 1100 0011 1110 0000 0000 0100 120 _prunciPigs DE ARQUITECTURA OE COMPUTADORAS Instruceién: be Descripeién: Si el c6digo de condicién zs 1, salta ala direccién que se obtiene sumandole 4-disp22 del formato de la instruccién de salto a la direcciGn de la insirucci6n actual. Si el bit 2 del registro de estado es 0, el control se transfiere a la instruccién siguiente al be. Ejemplo de uso: be Label Significado: Sattar a Label si el eédigo de condicién z vale I. Para el ejemplo. se supone que Label se encuentra en una direccién de memoria cinco palabras (20 bytes) mayor que la de la instrucci6n de be. Cédigo objeto: 0000 0010 1000 0000 0000 0000 0000 0101 Instruccién: bneg Descripcidn: Si el c6digo de condicién nes 1, salta a la direcci6n que se obtiene sumdndole 4-disp22 a la direcci6n de la instruceién actual. Si el bit n del registro de estado es 0. el con- trol se transfiere a la instrucci6n siguiente al bneg. Ejemplo de uso: bneg Label Significado: Sattar a Label si el cédigo de condi Label se encuentra en una direccién de memoris cinco palabras (20 bytes) mayor que ta de la instruccién de bneg. C6digo objeto: 0000 1100 1000 0000 0000 0000 a000 O10: jon n vale 1, Para el ejemplo, se supone que InstrucciGn: bes Descripcién: Si el cédigo de condicién c es 1, salta a la direceiGn que se obtiene sumandole el valor 4-disp22 a la direcci6n de la instrucci6n actual, Si el bit c del registro de estado es 0, el control se transfiere a la instruccién siguiente al bes. Ejemplo de uso: bcs lebel Significado: Saltar 9 Labe? siel cédigo de condicién ¢ vale 1. Pata el ejemplo, se supone que Label se encuentra en una direccién de memoria cinco palabras (20 bytes) mayor que la de la instruccién de bes. Cédigo objeto: 0000 1010 1000 0000 0000 0000 0000 o101 Tnsteuceién: bvs Descripeién: Si cl cédigo de condicién ves 1, salta a la direccién que se obtiene sumandole el valor 4-disp22 a la direccién de la instrucci6n actual. Si el bit v del registro de estado es 0, el controt se transfiere a 1a instruccién siguiente al bvs. Ejemplo de uso: bvs label Signifieado: Saltara Label siel cédigo de condici6n v vale 1. Para el ejemplo, se supone que Label se encuentra en una direecién de memoria cinco palabras (20 bytes) mayor que Ia de la instruccién de bys. Cédigo objeto: 0000 1110 1000 0000 0000 000 9000 0102 capirug 4 + LA ARGUITECTURA DE PROSRAMAGION 121, Insteuecién: ba Descripeién: Saltar a la direceién obtenida sumando a la direcci6n de la instruccién actual el valor 4-disp22 incluido en la instrucci6n de salto. Ejemplo de uso; ba label Significado: Saltar a Label independientemente de los valores que adopten los cédigos de condicién. Para el ejempto, se supone que Label se encuentra en una direccién de memoria cinco palabras (20 bytes) menor que la de la insiruccidn de ba. Cédigo objeto: 0001 0000 1011 1111 1112 1121 1112 1012 4.3 Directivas (seudo operaciones) Ademds de tas instrucciones descriptas, que pueden ser soportadas por la arquitectura ARC, también existen directivas (seudo operaciones) que no son eédigos de operacién, sino mas bien instrucciones dirigidas al ensamiblador para que realice cieras acciones en el momento del ensamble, La figura 4.12 muestra una lista de directivas y ejemplos. N6- tese que a diferencia de los cédigos de operacién de las instrucciones, que son especificos para una maquina determinada, el tipo y 1a naturaleza de las directivas son especfficas de un determinado ensamblador, dado que es el ensamblador quien las ejecuta. La directiva . equ (igualar) instruye al ensamblador para que iguate un valor o una cadena de caracteres con un simbolo, de modo que el simbolo pueda ser utilizado ato lar- g0 el programa como si en su lugar estuviesen escritos el valor o ta cadena de caracteres, Las directivas -begin (comienzo) y . end (final) le indican al ensamblador dénde de- be comenzar y terminar, respectivamente, el proceso de traduccién. Cualquier sentencia que aparezca antes del .begin o despucs del end serd ignorada. La representacién simbdlica de cualquier programa puede incluir mas de un par .begin/ . end, pero tie- ne que existir un .end por cada . begin, y debe haber al menos un . begin. El uso de las directivas «begin y «end es itil para el proceso de depuracién, porque permite que ciertas partes del programa se hagan invisibies al ensamblado. La directive . oxg (origen) hace que la instrucci6n siguiente se ensamble suponiendo que se la ubicarg, en el momento de la ejecucién, en la posicién de memoria especifica- da (2048 en el caso de la figura 4.12). La directiva . dw (definir bloque de palabras) re- serva un bloque de palabras de cuatro bytes, generalmente para arreglos. El contador de posiciones (que lleva la cuenta de cudl es la instruccién que esta siendo ensamblada por el programa traductor) se desplaza hasta ubicarlo delante del bloque, de acuerdo con la cantidad de posiciones obtenidas al multiplicar por cuatro el argumento de ta directiva +dwb, ya que dicho argumento especifica la cantidad de palabras necesarias. Las directivas .global y .extern tienen que ver con nombres de variables y di- recciones que se definen en un médulo de cédigo a ensamblar y se utilizan en otro. La directiva global hace accesible un rétulo dado para que pueda ser usado en otros médulos, La directiva extern identifica un sétulo que esté siendo usado en el médulo 122_PRuvciPi0s DE ARQUITECTURA DE COMPUTARORAS: local y ha sido definido en otro médulo (r6tulo que en el oiro médulo en cuestién debe- ria estar indicado como . global). En e) préximo capitulo se analizard el uso de estas dos directivas. Las directivas .macro, .endmacro, .if, y .endif también se ana- lizan en el capitulo siguiente. Directiva Farma de uso Funeidn o significado sem X vequ #10 Asignar a X ef valor (10))g sbegin sbeain Comienzo de traduecién send send Fin de raduceisn s0rg sorg 2048 ‘Cambiar el contador de posicién a 2048 edb send 25 Reservar un bloque de 25 palabras -globet -giebal ¥ La variable ¥ se usa en otro médulo sextern vextern @ La variable Z se define en otro médulo smaceo snacro Ma, b, ... Definir macroinstrucci6n M. Parémetros formales: a,b, sendmacro — .endnacro in de definicién de macroinstruccién ard -3f Ensamblar solo si es cients sendif vendit Fin de estrvctura condicional Figura 4.12 « Directivas para el fenguaje ensamblador de ARC. 4.4 Ejemplos de programacién en lenguaje ensamblador El proceso de escritura de un programa en lenguaje simbdlico es similar al proceso de escri- tura de dicho programa en lenguaje de alto nivel, excepto por el hecho de que muchos deta- es que en et lenguaje de alto nivel se vuelven abstractos, son totalmente explicitos en el len- guaje simbélico. En esta secci6n se analizan dos ejemplos de programas escritos en el lenguaje simbdlico de ARC. Programa: sumar dos enteros Considérese la escritura de un programa para el lenguaje de programacién simbélico de ARC que sume los enteros 15 y 9. Una posible codificacidn es la que se muestra en la fi- gura 4.13. El programa comienza y termina con un par de directivas .begin/.end, La directiva .org le indica at programa ensamblador que la traduccién debe iniciarse de modo tal que el c6digo ensamblado se cargue en memoria a partir de la direccién 2048. Los operandos 15 y 9 se almacenan en las variables x € y, respectivamente. Solo se pue- den sumar ntimeros que estén almacenados en registros de ARC (dado que solamente 1d y St pueden acceder a memoria) y, por consiguiente, el programa se inicia cargando en los registros 8r1 y $2 las variables x ¢ y. La instruccién addec suma tri con 8r2 CAPITULO 4 » LA ARQUITECTURA DE PROGRAMACION 123 y deja et resultado en el registro $23. La instruccién st se encarga de almacenar &r3 en la direccién de memoria 2. La instruccién jmp1 con operandos $r15 + 4, %r0 pro- yoca un retomo a la instrucci6n siguiente del programa que invocé a la rutina de suma. Debe notarse que en caso de que no haya habido programa usuario que invocara al pro- grama de suma, se entenderd como que este tltimo ha sido invocado por el sistema ope- rativo. Las variables x, y y z se definen a continuacién del programa. 1 Rete programa suma dos nineros sbegia org 2046 progi: id [x], 81 | Cargar el registro tr1 con el valor de x td Uy), B42 ! Cargar e registro %r2 con el valor de y addee rl, 22, te2 f tr3 © Wel + 827 st rd, [2] t Guardar el contenido el registro 3 en 2 jmpl Wri +4, tr0 ft Retorno xe is yt 3 en ° send Figura 4,13 ° Un programa para ARC que suma dos enteros. En la prictica, el cédigo SPARC equivalente al c6digo ARC de la figura 4.13 no es del todo correcto. Las instrucciones 1d, st y jmp1 demoran al menos dos ciclos de instruc- cién para completarse, y dado que SPAR reloj, estas instrucciones deben estar seguidas por instrucciones que no dependan de sus resultados, Esta propiedad, que permite iniciar una nueva instruccién antes de haber com- pletado la anterior se conoce como segmentacién (pipelining), y se analiza con detalle enel capitulo 10. icia una nueva instruccién en cada pulso de Programa: suma de un arreglo de enteros Considérese ahora un programa algo mds complejo, que suma un arreglo de enteros. La figura 4.14 ilustra una posible codificacién, Como en el caso del ejemplo anterior, el pro- grama se inicia y se termina con un par .begin/. end. La directiva .org indica que Ja traduceién se debe realizar de modo que el c6digo ensamblado se cargue en memoria a partir de la direccién 2048. Se utiliza una directiva para definir el simbolo a_start, al que se le asigna el valor 3000. EI programa se inicia cargando la longitud del arregio a, Ja que se presenta en bytes, en el registro 81. El programa carga luego la direccién de comienzo del arreglo a en $r2 y pone en cero el registro $3, que acumulard el resultado parcial. El registro 8x3 se pone en cero a través de una operacién de producto Iégico con el registro $0, que siempre contiene el valor cero. Cualquier producto Idgico que se realice entre el registro 810 y cualquier otro registro dard siempre por resultado el valor cero. 124 PRINCIPIOS DE ARQUITECTURA DE COMPUTADORAS 1 Rete programa suma tantos nimeros como lo indica LENGTH 1 Utilizaci6n de registros: trl ~ Longitud del erreglo a ‘2 — Direccion de comienzo del arreglo a ‘r3 — Suma parcial ‘rs — Puntero al arreglo a ‘4x5 — Contione un elemento de a sbegin Comienzo de traduccién -org 2088 Comienzo del programa en 2048 a.start equ 3000 Direceion del arreglo a ' t 1 ld [length], trl: trl © longitud del arregla a Ad [addvess], 12 | tr2 © direccion del arregio a andee #r3, tr0, a3 ars 0 andce @r1, trl, 40 | Verificar wimero de elementos restantes ‘ ' be done Pinaliza cuando LENGTA = 0 addce $rl, -4, 8r1 | Decrementar tamaito del arreglo addce trl, $12, tr4 1 DirecciOn del préxino elenento id Grd, Oz5 1 4ES G dixeceion de memoria [¥r4] addee tr3, t25, %r3,! Sumar elenento nuevo al contenide de tr3 ba loop 1 Repetir el laze don jupl &r15 4 €, tr0 1 Retorno @ rutina principal Length: 20 £ 81 erregio a tiene 5 nimoros (20 bytes) address: a_scart sorg a_start ! Comienzo del arreglo @ at 25 1A continuacién los elementos del arreglo =10 33 5 7 send {Fin de traduceién Figura 4.14» Un programa para ARG que suma cinco enteras. El rétulo Loop inicia un lazo que suma los sucesivos elementos det arregto a dejando la suma parcial en ei registro $3, en cada iteraciGn, El lazo se inicia verificando si el ni- mero restante de elementos a sumar (811) es cero, Para obtener este dato realiza el pro- ducto Iégico de $1 consigo mismo, con lo que logra acomodar los c6digos de cont cién. El cédigo que interesa es z, el cual se pondri en 1 si 8x1 = 0. Las banderas restantes (n, v y ¢) se acomodan de acuerdo con el resultado. El valor de z se analiza por medio de la instruccién be. Si no quedan mas elementos a sumar dentro del arreglo, el programa bifurca a done, de donde vuelve a la rutina que lo invocd (y que puede ser el sistema operativo, si este es el nivel més alto del programa usuario). Si luego de la verificacién de #¢1 = 0 el programa no hubiese salido del lazo, se de- crementa el valor de 81 en cuatro (el tamaiio de cada palabra medido en bytes) para lo cual se le suma al contenido de $1 el valor —4. La direcci6n de comienzo de! arreglo a (almacenada en $12) y el indice en a ($r1) se suman en x4, el que apunta a un nuevo elemento de a. El elemento al que apunta $34 se carga en 835, y su valor se suma a la su- ma parcial (#3), La instruccién “ba Loop” lleva al programa nuevamente al comienzo caphruto. ARQUITECTURA DE PROGHAMACION 125, del lazo cerrado. La variable Length se almacena luego de las instrucciones. Los cinco ‘elementos del arreglo a se ubican en el érea de memoria especificado por el argumento de la directiva . 01g (direeci6n 3000). Nitese que hay tres instrucciones para calcular fa direccién del elemento siguiente en el arreglo, dada la direccién del elemento inicial en $r2 y la longitud del arreglo en bytes en tr 1: addee @r1, -4, %r1 | apuntar al nuevo elemento a sumar addce trl, $r2, tr4 | sumarlo a la base del arreglo ld $r4, %r5 ! cargar en &r5 el proximo elemento Este método para el cdlculo de la direccién de una variable como la suma de una base is un indice se usa tan frecuentemente que tanto ARC como otros lenguajes simbélicos tienen modos especiales de direccionamiento para utilizarlo. En el caso de ARC, la direc- cidn de la instruccién 14 se calcula como la suma de dos registros 0 la de un registro con uuna constante de 13 bits. Nétese que el registro 60 siempre contiene el valor cero, por Toque al especificar $0, lo que se hace en forma implicita en la instruccién 14, se des- perdicia la oportunidad de permitir que la misma instruccién 1d haga el célculo de Ia di- recci6n, Un registro tinico puede contener la direccién de} operando y permite resolver en dos instrucciones lo que en el ejemplo anterior Heva tres: addee $r1, -4, @r1 ! apuntar al proximo elemento a ser sumado ld @r1 + %r2, &r5 1 cargar el proximo elemento en @r5 Nétese que también se evita el uso de un registro, x4, antes utilizado como elemento de almacenamiento temporatio de Ja direecin. 4.4.1 Variantes en las arquitecturas y en los direecionamientos La arguitectura de ARC es la tipica arquitectura de una maquina de carga y descarga. Los prograimus escritos para este tipo de maquinas se ejecutan generalmente en menos tiem- po, en parte debido a la reduccién del tréfico entre CPU y memoria, porque los operan- dos se curgan solo una vez en Ta CPU y los resultados se salvan en memoria tnicamente cuando se completa el célculo, El aumento en el tamafio de memoria requerida por el pro- ‘grama se considera un precio que vale la pena pagar. No era tal el caso cnando las memorias eran varios érdenes de magnitud més caras que hoy y los procesadores eran varios érdenes de magnitud mas limitados que hoy, io ‘que representa el cuadro de las primeras épocas de la computacién. En aquellas con- diciones, cuando la CPU probablemente ofrecia solo un tnico registro para almacenar valores aritméticos, los resultados intermedios debfan almacenarse en memoria. Estas ‘méquinas presentaban instrucciones aritméticas de una, dos y tres direcciones. Esto sig- 126_Priveiptos O€ ARQUITECTURA DE COMPUTADORAS nifica que una instruccién podfa realizar célculo aritmético con tres, dos 0 uno de sus re- sultados u operandos en memoria, 1o que se contrapone con la arquitectura ARC, en la que todas las operaciones aritméticas y 1égicas requieren que sus operandos estén alma- cenados en registros, Considérese la forma en que podria evaluarse ta sentencia A= B x C+ Da través de os distintos tipos de instrucciones de tres, dos y una direccidn. En los ejemplos que si- guen, la referencia a la variable A significa, en realidad, “el operando cuya direcciGn es A”. Para poder realizar algunas estadisticas de rendimiento de los diversos fragmentos del programa, pueden hacerse lus siguientes suposiciones: + Las palabras de direccién y datos son de 16 bits, o 2 bytes, tamafio habitual en ma- quinas de aquellas épocas. + Los eédigos de operacién tienen 8 bits. Se determinaran tanto ef tamaiio como el trafico de memoria del programa, en bytes, con estas suposiciones. El trifico de memoria tiene dos componentes, por un lado la instruceién en sf mis- ma, que debe traerse de memoria a la CPU para poder ser ejecutada, y por otra los da- tos: operandos que deben trasladarse a la CPU para realizar la operacién y resultados que deben ser devueltos a memoria cuando se completa el cileulo. La observacién de estos célculos permitira visualizar algunos de los acuerdos entre el tamafio del progra- ma y el tréfico de memoria que ofrecen los distintos tipos de instrucciones. El lector de- berd tener en cuenta que los cédigos de operacién, como mult y add, son genéticos: nes de ARC, : Instrucciones de tres direcciones En una instruccién de tres direcciones, A = B x C + D podrfa codificarse camo: mult B, C, A 1! ACBXC add D, A, A ! ACAD Jo que implica multiplicar B por C y almacenar el resultado en A. (En este punto del pro- grama, A se usa como elemento de almacenamiento para resultados temporarios.) Luego se sumard el valor de A con D, y se volverd a almacenar el resultado en la direccién A. Cada instruccién tiene un tamafio de 1 +2 +2 4+ 2=7 bytes. Por consiguiente, el tamaiio del programa es de 14 bytes. El trafico de memoria para cada instrucci6n se calcula co- mo la suma de la cantidad de biisquedas de instrucciones, 7 bytes, més el tréifico de da- tos, 2+2 +2.= 6 bytes, lo que lleva a un total de 13 bytes por instruccién, En consecuen- cia, el tréfico total de memoria del progeama es de 26 bytes. ‘CAPITULO 4 + Ln ARQUITECTURA DE PROGRAMACION 127 Instrucciones de dos direcciones En una instrucci6n de dos direcciones, uno de los operandos queda sobrescrito por el re- sultado. Por consiguiente, el cédigo para la expresin A = B x C + D puede ser: load B, A ACB mult c, A PAG AKC add D,A TACAHD ‘Cada una de las tres instrucciones ocupa ahora | +2+2=5 bytes, por lo que el tamaiio del programa es de 15 bytes. En el célculo del wafico de memoria debe notarse que cada una de las baisquedas de Jas instrucciones implicard un tréfico de 5 bytes, tal como se ha dicho. No obstante. el trifico de datos de la primera instruccién sera de 2 palabras, o sea, 4 bytes, en tanto que el trifico de datos de las dos instrucciones restantes serd de 3 palabras, 0 sea, 6 bytes, Esto se debe a que cada una de las dos ditimas instrucciones requiere cargar am- bos operandos en la CPU, lo que requiere 2 palabras, o 4 bytes, en tanto que el almacena- miento del resultado en memoria requiere una palabra de dos bytes. En consecuencia, el trafico total de las tres instrucciones serd de (5 + 4) + (5 + 6) + (5 + 6) =31 bytes. Instrucciones de una direccién Las instruceiones con una sola direccién emplean ims registro aritmético Gnico de la CPU, ac~ cesible at programador, conocido como acumulador. El acumulador, normalmente, contiene un operando aritmético y sirve como lugar de almacenamiento del resultado de las operaciones aritméticas. El formato de una direccién no es de uso comiin en estos dias, pero lo era en épo- cas anteriores de la compuracién, en las que los registros eran més caros y frecuentemente cum plian con funciones diversas. El acumulador sirve para el almacenamiento temporario tanto de uno de los operandos como del resultado. El c6digo para la expresién A = B x C+ Des ahora load B tAcc-B mult c 1 Ace — Acc x C add D 1 Acc & Acc +D store A 1Ac Ace Lainstruccién Load carga B en el acumulador, malt realiza la multiplicacién de C por el contenido del acumulador y deja el resultado en el mismo acumulador, y add realiza la uma requerida, La instruccién store almacena el acumulador en A. Cada instruc- ci6n ocupa 3 bytes, por lo que el tamafio total del programa es de 3 x 4= 12 bytes. Néte- se que cada instruccién requiere la bisqueda o almacenamiento de solo una palabra de dos bytes. Por lo tanto, el tréfico de memoria para cada instruccién es de 3 +2 = 5 bytes y el trafico total de memoria de! programa es de 4 x S$ = 20 bytes. 128 _PRIMCIPIOS DE ARQUITECTURA DE COMPUTADORAS: Nétese que la mfquina de una direccién ofrece el menor tamafio de programa y el me- nor tréfico de instrucciones de todos los ejemplos vistos. Esto explica la popularidad de las viejas computadoras basadas en acumulador, en las épocas en que los registros y las memorias costaban cientos de délares por bit, Registros de propdsitos especiales Ademis de los registros de uso general y de los acumuladores descriptos previamente, la mayorfa de las arquitecturas modemas incluyen otros registros que se dedican a proposi- tos especificos. Como ejemplo de este tipo de registros pueden mencionarse: + Registros indice para memoria, como el caso de los registros indice de origen (SI, source index) € (ndice de destino (DI, destination index) en el caso del 80x86. Estos registros se utilizan como punteros al comienzo o al final de un arreglo almacenado en memoria, Algunas instrucciones especiales referidas a “cadenas" transfieren un byte 0 una palabra desde una direcci6n de comienzo de memoria, a la que apunta SI, hacia una direccién final de memoria, a la que apunta DI, y posteriormente incre- mentan o decrementan los registros para que apunten al byte siguiente o a la palabra siguiente. + Registros de punto flotante. Muchos procesadores de la generacién actual ofrecen registros e instrucciones especiales para el manejo de ndimeros de punto flotante. + Registros para manejo de tiempo y de operaciones de temporizacién. El procesador Po- werPC 601 tiene registros asociados con un reloj de tiempo real. El mismo permite ta medicin de tiempo zeal con alta resohuci6n, con el objeto de indicar fecha y hora del dia. El rango que ofrecen es de, aproximadamemte, 135 afios, con una resolucién de 128 ns. + Registros de apoyo al sistema operativo. Muchos procesadores modernos ofrecen registros para manejo del sistema de memoria, + Registros accesibles solo a través de “instrucciones privilegiadas” o en el “modo su- pervisor™. Con el objeto de evitar daftos accidentales o intencionales al sistema, mu- chos procesadores incluyen instruceiones y registros especiales que son inaccesibles para tos usuarios y las aplicaciones convencionales, Estas instrucciones y registros solo pueden ser usados por el sistema operative. 4.4.2 Eficiencia de las arquitecturas de programacion Si bien las estadisticas sobre tamaiio de programs y uso de memoria calculadas en los ejemplos anteriores estén planteadas fuera del contexto de los programas en los que po- drian haber estado contenidos los ejemplos, muestran claramente que aun el hecho de te- ner un solo registro como elemento temporario de almacenamiento en la CPU puede tener un efecto muy significativo sobre Ia eficiencia en la ejecucién det programa, De hecho, el procesador Pentium Intel, considerado entre los mAs veloces dentro de los procesado- capiTuLo 4 » LA AROUITECTURA DE PROGRAMACION 128 res para aplicaciones generales, tiene un solo acumulador, aun cuando tiene una cant dad de registros de uso especial como elementos de apoyo. Existen muchos otros facto- res que afectan la eficiencia de un conjunto de instrucciones, tales como el tiempo que necesita la instrucciGn para ejecutar su funcién, o la velocidad a la cual puede funcionar el procesador, 4.5 El acceso a ia informacion en la memoria. Modos de direccionamiento Hasta este momento, se han analizado cuatro métodos para obtener la direccién de un da- to almacenado en memoria: * Un valor constante, conocido al momento del ensamble. * El contenido de un registro. + La suma de los contenidos de dos registros. * La suma del contenido de un registro mas una constante. Modo de direcctonamiento Sintaxis Significado Inmediato aK K Directo K MIK] Indirecto w) MIMIKII Tndirecto a través de registro (Rn) MIRn} TIndexado a través de registro (Rm + Ro) M[Rm + Ro} Basado en registro (Rov +X) ‘MIRm + XI Indexado basado en registro (RM +Rn+X) MIRm + Rn + X] Tabla 4.4 » Modos de direccionamiento, La tabla 4.1 le asigna nombres a estos modos de direccionamiento y muestra algunas otras altemnativas. Notese que la sintaxis de la tabla differe de la de ARC. Esta es una ca- racteristica particular, comiin y desafortunada de los lenguajes simbélicos. Cada uno de ellos difiere de los demas en sus convenciones sintécticas, La notacién M[x} en la colum- na de significados supone que fa memoria es un arreglo, M, indexado segin una direc- ciGn que se obtiene a wavés del céleulo indicado entre corchetes. Parece haber ua surtido injustificado de modos de direccionamiento, pero cada uno de ellos tiene su aplicacién: + El direccionamiento inmediato permite hacer referencia a una constante cuyo valor se conoce al momento del ensamble. 130_PAINcIPIOs DE AROUITECTURA DE COMPUTADOAAS: + El direccionamiento directo se utiliza para acceder a aquellos datos cuya direccién se conoce al momento del ensamble, * El direccionamiento indirecto se utiliza para acceder a una variable puntero cuya di- recci6n se conoce al momento de la compilaci6n. Los procesadores modemos casi no usan este modo de direccionamiento debido a que requiere dos referencias a me- moria para acceder al operando, lo que complica la instrucci6n que la utiliza. El pro- gramador que desee usar este direccionamiento para acceder a dutos necesita utili- zar dos instrucciones, una para acceder al puntero y otra para Hlegar al valor al que dicho puntero hace referencia. Esto tiene como beneficio el hecho de exponer la complejidad det modo de direccionamiento, con lo que tal vez se logra desalentar el uso del mismo. El direccionamiento indirecto a través de registro se usa cuando la direccién del ope- rando no se conoce hasta el momento de la ejecuci6n, El almacenamiento de operan- dos en una pila cumple con esta descripcidn, por lo que se accede a dichos operandos a través de un direccionamiento indirecto via registro, habitualmente cn la forma de instrucciones del tipo “push” y “pop” que. ademds, decrementan e inerementan, res- pectivamente, el registro puntero. El direccionamiento indexado, el basado en registro y el indexado basado en regis- tro se usan para acceder a los componentes de arreglos tales como el que se muestra en la figura 4.14. y a aquellos componentes ubicados mas all del comienzo de la Ja, en una estructura conocida como bloque de datos (stack frame), la que se anali- za.en Ja seccién siguiente. 4.6 Acceso a subrutinas y pilas Una subrutina, conocida a veces como funcién o procedimiento, es una secuencia de instrucciones a Ia que se invoca como si se tratara, desde la visién de alto nivel, de una Gnica instruccién. Cuando un programa llama a una subratina, se transfiere el control del programa a la subrutina, la que ejecuta ia secuencia de instrucciones requerida, tras lo cual vuelve a ta posicién inmediatamente siguiente a la que generé el llamado. Existen distintos métodos para pasar argumentos hacia y desde la rutina invocada, a los que sue- le denominarse convenciones de llamada. El proceso de transferencia de argumentos entre subrutinas suele conocerse como enlace entre subrutinas. Una de las convenciones de llamada de subrutinas simplemente coloca los argumentos en registros. El cédigo de la figura 4.15 muestra un programa que carga dos argumen- tos en los registros $1 y $2, invoca la subruting add_1 y recupera el resultado desde el registro $3. La subrutina add_1 toma sus operandos desde 81 y $2 y deja el resulta- do en &13 antes de retornar por medio de la instrueei6n jmp1. El método es sencillo y ve- loz, pero no funciona si la cantidad de argumentos a ser transferidos excede el ntimero de registros disponibles, o si las Hamadas a subrutinas estin fuertemente encadenadas. Lcapiruo 4 + LA ARQUITECTURA Oe PROGRAMACIN 131 1 Rutina invocante ! Rutina invecada Large arl + er2 Go, ert ty], 2 add_l: addcc trl, 622, 23 add_1 jmpl = #r15 + 4, x0 ard, [2] Figura 4.18 © Liamado a subrutira utilzanco rogistros. Una segunda forma de llamada crea fo que se denomina una zona de transferencia de da- tos, La direceién de la zona de transferencia de datos se entrega a la rutina invocada en un re- zzistro predeterminado. La figura 4.16 ilustra un ejemplo de este método de Hamada. La direc- tiva .dwb que aparece en la rutina invocante genera una zona de transferencia de datos, de tres palabras, en las direcciones x, x + 4 y x + 8. La rutina invocante canga sus dos argumentos en xy x +4, llamaa la subrutina add_2, y luego recupera el resultado que le es transferido desde add_2 en la direcci6n de memoria x + 8. La direccién x correspondiente al comien- zo de la zona de datos se le transfiere a la subrutina ad@_2 en el registro 8x5. 1 Rotina invocante 1 Rutdag invocada f x12) © x[0) * x(2) st Wel, tx] add_2: ld tr5, trB st rd, [xea] ld rd + 4, bro sethi x, $15 addee ar8, #r9, tr10 srl 825, 10, ars st trld, tS + 8 call add_2 jmp tr15 + 4, %r0 dd (xeB], 3 1 Zona de transferencia de datos xt dvb 3 Figura 4.16 Llamado a subrutina usando una zona para transferencia de datos. Nétese que la instruccién sethi requiere una constante para definir su operando origen, por lo que el ensambtador reconoce la estructura de Sethi incluida en el programa in- vocante de la subrutina y reemplaza x por su direeciGn. La instrucci6n sx1 que sigue a sethi coloca la direccién x en tos 22 bits menos significativos de 85, dado que sethi coloca su operando en los 22 bits més significativos del registro utilizado. Un método al- ternativo para cargar la direccién de x en €r5 consistiria en el uso de una direccién de 132_PRINCIPIOS DE AROUTECTURA DE COMPUTADORAS memoria para almacenar la direccién de x, y el posterior uso de la instruccién 1d para cargar la direccién en ¢r5. Si bien esta ultima alternativa ¢s més sencilla, la utilizacién de sethi/sx1 es ms ripida debido a que no involucra operaciones de acceso a memo- rin que consumen tiempo. La subrutina add_2 lee sus dos operandos desde el érea de datos en las direcciones 8x5 y 815 +4, y coloca el resultado en la misma zona de datos en la direccién &15 + 8 antes de retornar, El uso de una zona para transferencia de datos permite el pasaje de bloques de datos de todo tamaiio sin tener que copiar més que un registro en el proceso de llamado ala Subrutina, Sin embargo, cuando se trabaja con rutinas recursivas, este sistema puede generar algunos problemas complicados, debido a que una rutina que se invoque a sf mis- ma requerird varias zonas de transferencia de datos. Las zonas de transferencia de datos tienen la ventaja de que su tamafio puede ser ilimitado, pero tienen también la desventa- ja de que dicho tamajio debe ser conocido al momento del ensamble. Una tercera convencién para las llamadas a subrutinas utiliza una pila. La idea gene- ral es que la rutina invocante coloca (empuja) todos sus argumentos (0 punteros a los mismos, si los datos tienen tamaiios grandes) en una pila secuencial del tipo LIFO (last in first out). La rutina invocada extrae de la pila los argumentos transferidos, a la vez que coloca en la misma cualquier valor que deba retornar. EI programa invocante, a su vez, rescata de la pila los valores devueltos por la nutina invocada y contintia con la ejecucin. El registro de la CPU conocido como puntero a la pila (stack pointer) contiene la direc- ci6n de la cabeza de Ia pila, Muchas méquinas tienen instrucciones del tipo push y pop que, automdticamente, decrementan e incrementan el puntero a la pila cuando se colocan elementos en la pila o cuando se los extrae de fa misma. 1 Rutina invocante 1 Rutina invocada {Los argumentos estan en 1s pila 1 Rapl0] + esp[0) + tp(a) Sop -equ eri4 tsp .equ trie addcc tsp, -4, top| add3: ld top, t8 st trl, tsp addcc ‘sp, 4, isp addee tsp, -4, top ld tap, a9 st 12, tsp addec ar, 429, 4220 call adda st trid, ssp ld tap, 8r3 gmp arl5'+ 4, ero addec tsp, 4, top Figura 4.17 « Llamado a subrutina utilzando una pita, La ventaja del uso de una pila es que el tamafio de 1a misma aumenta o disminuye a me- dida que resulta necesario. Esto admite la posibilidad de eneadenar lamadas a procedi- mientos, en cantidad arbitraria, sin tener que declarar el tamafio de la pila en el momen- to del ensamble. La figura 4.17 ilustra un ejemplo de transferencia de argumentos por

You might also like