Vista previa del material en texto
Capítulo 4: La Arquitectura de Programación. ARC, una computadora RISC. Libro: Principios de Arquitectura de Computadoras –Autores: Miles Murdocca y Vincent Heuring Universidad Tecnológica Nacional Facultad Regional Tucumán Ingeniería en Sistemas de Información ARQUITECTURA DE COMPUTADORES Capítulo 5: Los Lenguajes y la Máquina. 5.2: El Proceso de Ensamblado. Modelo de Bus de Sistema (Revisión) La CPU genera direcciones que se transfieren sobre el bus de direcciones. La Memoria recibe esas direcciones a través del mismo bus. La Memoria nunca genera direcciones y la CPU nunca recibe direcciones. Describe cómo se transfiere la info rmació n y qué se hará co n ella. Describe hacia dónde se transfiere la info rmació n Describe qué info rmación se está transmitie nd o . •ARC (A RISC Computer): es un subconjunto del modelo de arquitectura basado en el procesador SPARC, desarrollado por Sun Microsystems. •RISC: significa computadora con un conjunto reducido de instrucciones. ARQUITECTURA ARC ARQUITECTURA ARC Tipos de palabras: • Palabra de datos o de instrucciones: tienen 32 bits. • Palabra de dirección de memoria: también tiene 32 bits, puede especificar una de 232 –1 direcciones. Tamaños Comunes en los formatos de Palabras de Datos • Los tamaños típicos de palabras son de 16, 32, 64 y 128 bits. • El de 32 bits es el que se usa en la Arquitectura ARC. • Equivale a 4 bytes (4 x 8 = 32), que son 4 registros. • El dato más pequeño que se puede hacer referencia en la memoria es el byte (8 bits). Memoria en la Arquitectura ARC •La Memoria consiste en un conjunto de registros numerados (direccionados) en forma consecutiva, cada uno almacena normalmente un byte (8 bits). •Locación de Memoria es la dirección de cada registro. Espacio de Direcciones: es el rango numérico de direcciones de memoria al que puede hacer referencia la Unidad Central de Procesamiento (CPU). El tamaño del rango es único y depende del tamaño de la palabra de dirección que la CPU puede colocar sobre el bus de direcciones. En forma general, una palabra de dirección de n bits puede especificar una de 2n direcciones. Ésta memoria tendrá un espacio de direcciones de n bits, o en forma equivalente un espacio de direcciones de 2n bytes. Por ejemplo: Si la memoria tiene un espacio de direcciones de 32 bits entonces tiene una capacidad máxima de 232 bytes (que son 4 GB). El rango de direcciones irá desde 0 a 232 –1. Memoria en la Arquitectura ARC Mapa de Memoria de la Arquitectura ARC El último reg istro esta en la dirección 232-1 La última palabra esta en la dirección 232-4 32 bits = 1 palabra = 4 byte s = 4 re g istros de 8 bits c/ u Formatos Big-Endian y Little-Endian La dirección, X, de una palabra de 4 bytes, es la dirección del byte que tiene la dirección más baja de la palabra (byte menos significativo, LSB son sus iniciales en inglés). Cuando se usan palabras de varios bytes, hay dos opciones para ordenar los bytes que se almacenan en la memoria: •Little-endian: el byte menos significativo se almacena en la dirección más baja de memoria. •Big-endian: el byte más significativo, el mayor, se almacena en la dirección más baja de memoria. Es e l que usare mos | H | O | L | A | | A | L | O | H | Ejemplo: palabra HOLA(ASCII) Vista Abstracta de una CPU La CPU consiste en: • Una sección de datos, llamada también “trayecto de datos" o "datapath", que contiene registros y una ALU. • Una sección de control, que interpreta las instrucciones y realiza las transferencias entre registros. La Unidad de Control • Es la responsable de la ejecución de las instrucciones del programa, escritas ya en código máquina, de una instrucción a la vez. • Posee dos registros que permiten conectarse con la Sección de Datos: - Contador de Programa (PC): contiene la dirección de la instrucción en ejecución. - Registro de Instrucción (IR): almacena la instrucción a ejecutar. •Los pasos que la Unidad de Control lleva a cabo en la ejecución de un programa son: 1. Buscar de la memoria la siguiente instrucción a ejecutar. 2. Decodificar el código de operación. 3. Buscar los operandos de la memoria principal, si los hubiera. 4. Ejecutar la instrucción y almacenar los resultados. 5. Volver al paso 1. Esto se conoce como: Ciclo de Búsqueda y Ejecución. Trayecto de Datos (datapath) Esta formado por: • Conjunto de registros: son memorias pequeñas y rápidas, separadas de la memoria principal, están en la CPU. Se las usa para el almacenamiento temporal durante las operaciones de cálculo. Cada registro posee una dirección ordenada secuencialmente a partir de cero. Éstas direcciones son más chicas que las de la memoria principal. Por ejemplo: Un conjunto de registros que contenga 32 registros usará una palabra de dirección de solo 5 bits (25=32). • ALU: implementa una variedad de operaciones, de uno y dos operandos. Por ejemplo: Suma aritmética, Operaciones Lógicas (And, Or, Not). 00000 = re g istro 0 a 11111 = re g istro 31 Trayecto de Datos (datapath) La UC, que NO pertenece al Trayecto de Datos, se lecciona las operaciones y operandos a utilizar. El resultado obtenido en la ALU se transfiere , a través de un bus, al reg istro destino que se encuentra en e l Conjunto de Reg istros. Los dos operandos se transfieren desde e l Conjunto de Reg istros, a través de buses, a lo s Reg istros Fuentes. Buses del Sistema, que conectan el Trayecto de Datos con Memoria y E/S. Buses adicionales, internos al Trayecto de Datos, que conectan el Conjunto de Registros con la ALU. Registros de la CPU de la Máquina ARC •Cada registro tiene 32 bits. •Los registros se especifican con el símbolo %. •Hay 32 registros visibles para el usuario, del 0 al 31, de uso general, salvo los de usos específicos: § El registro 0 (%r0) siempre contendrá el valor cero. § El registro 14 (%r14) es el puntero de pila. § El registro 15 (%r15) es el registro de enlace. Registros ARC de uso general Registros ARC • El registro PC es el registro número 32. • Existen 4 registros temporales. • El registro IR es el número 37. En total hay 38 registros en el conjunto de registros del Trayecto de datos. Registros ARC • El registro PSR (Registro de Estado del Procesador) contiene información acerca del estado del procesador. Posee códigos de condición que especifican si una operación aritmética dio : § Resultado negativo (n). § Resultado cero (z). § Si produjo un desborde (v), o sea que el resultado de la operación aritmética es demasiado grande para la ALU. § Si produjo un arrastre (acarreo) a la salida de la ALU (c). NOTA: Los números negativos se los expresa en complemento a 2. El Conjunto de Instrucciones de ARC • Es la colección de instrucciones que un procesador puede ejecutar. • Difiere de un procesador a otro, en el tamaño de las instrucciones, el tipo de operaciones que permiten, el tipo de operandos que puede ejecutar y los resultados que pueden entregar. • El tamaño de una instrucción en ARC es de 32 bits, o sea una palabra. • En ARC solo dos instrucciones pueden acceder a Memoria, ld (load=carga) y st (store=descarga). El Conjunto de Instrucciones de ARC Las instrucciones aritméticas y lógicas terminadas con el sufijo “cc”especifican que luego de realizadas las operaciones se deben actualizar los códigos de condición del registro PSR. Formato de Lenguaje Ensamblador ARC •El lenguaje hace distinción entre mayúsculas y minúsculas. •Los campos de etiqueta y comentario son optativos. •El campo etiqueta usa caracteres alfabéticos, numéricos (siempre y cuando no sea el primer dígito), los símbolos guión bajo (_), signo monetario ($), punto (.) y los dos puntos (:) que indica el final de la etiqueta. •El campo comentario va precedido del símbolo ! •Los operandos se separan con comas (,) y su uso dependerá de cada instrucción. •Los operandos origen 1 y destino siempre deben ser un registro. El operando origen 2 puede ser una constante. Ejemplos de instrucciones enassembler •Instrucciones aritméticas: Suma el co ntenido del reg istro 1 co n el co ntenido del reg istro 2 , el resultado lo almacena en el reg istro 3. Al co ntenido del reg istro 1 le suma el valo r 12, el resultado lo almacena en el reg istro 3. El valor de la constante esta en decimal, 12(10). Si se lo quisiera expresar en hexadecimal se debe poner adelante “0x”o debe terminar en “H”. •Instrucciones de memoria: Ejemplos de instrucciones en assembler § La referencia al contenido de una posición de memoria se indica con corchetes [ ]. § Los registros siempre se mencionan en función de su contenido, nunca en términos de una dirección. § Si no se nombra el operando origen 1 se considera que es el %r0. • Instrucciones de memoria: Ejemplos de instrucciones en assembler Al contenido de la posición X de Memoria se lo copia en el registro 3 del Trayecto de Datos. Copia el contenido del registro 3 en la posición Y de Memoria. st guarda (escribe) en Memoria. ld saca (lee) de la Memoria. EJEMPLOS: usando etiquetas para hacer referencia al contenido de una posición de memoria [ ]. • Instrucciones de memoria: EJEMPLOS: usando registros y constantes, que sumados, hacen referencia al contenido de una posición de memoria [ ]. Se suman los contenidos de los %r1 y %r2, el resultado será una posición de memoria. Lo que se encuentre en esa posición de memoria se guardará en el %r3 de la CPU. Ejemplos de instrucciones en assembler •Instrucciones lógicas: lab_5: sethi 0x304F15 , % r1 lab_9: srl %r1 , 3 , %r2 Carga el valor hexadecimal 304F15 en los 22 bits más significativos del %r1, colocando en 0 los restantes 10 bits. Desplaza el contenido del %r1 tres posiciones a la derecha, almacena el resultado en %r2. Las posiciones que quedaron vacías se completan con ceros. Ejemplos de instrucciones en assembler •Instrucciones lógicas: lab_6: andcc %r1 , %r2 , % r3 lab_7: orcc %r1 , 1 , % r1 lab_8: orncc %r1 , %r0 , %r1 Realiza el AND, bit por bit, entre los contenido de los %r1 y %r2 y almacena el resultado en el %r3. En función del resultado se modifican los códigos de condición del registro PSR. Realiza el OR, bit por bit, entre el contenido del %r1 y la constante de valor 1, almacena el resultado en el %r1. Realiza el NOR, bit por bit, entre los contenidos de los %r1 y %r0, almacena el resultado en %r1. Hace el complemento. Ejercicio Escriba una instrucción en assembler que realice la suma lógica usando dos registros fuentes y el registro 25 como destino. orcc %r1, %r2, %r25 Ésta es una posibilidad, podemos variar los registros a sumar. Ejercicio Si en la instrucción los valores de los registros fuentes son 00000000(16) y FFFFFFFF(16). ¿Qué valor queda almacenado en el registro destino?. orcc %r1, %r2, %r25 Ejercicio Dada la instrucción: andcc %r1, %r0, %r25 ¿Qué valor queda almacenado en el registro destino?. La compuerta lógica AND solo resulta con valor 1 cuando todas son entradas tienen 1. Si alguna entrada vale 0 el resultado es 0. El %ro siempre tiene almacenado el valor cero, por lo que al realizar un AND entre cualquier valor del %r1 con %r0 el resultado a guardar en %r25 será cero. •Una Subrutina, llamada también función o procedimiento, es una secuencia de instrucciones a la que se invoca como si se tratara de una única instrucción. Cuando el programa llama a la subrutina se transfiere el control a ésta, la que ejecuta la secuencia de instrucciones requerida, tras lo cual vuelve a la posición inmediatamente siguiente a la que generó el llamado. Algunas definiciones Mas adelante ampliaremos éste tema. Ejemplos de instrucciones en assembler •Instrucciones de control: lab_10: call sub_r lab_11: jmpl %r15 + 4 , %r0 Es una operación de llamado y enlace. Invoca una subrutina, que comienza en la posición de memoria sub_r, y almacena la dirección de la instrucción actual, que esta en PC, en %r15. Retorno de subrutina. Debe volverse a la dirección siguiente a call, que se la calcula como el valor de PC, que esta en %r15, más 4, porque cada palabra tiene 4 registros. La dirección de la instrucción actual se descarta en %r0 , pero internam ente la arquitectura guarda el destino en el PC . En éstas instrucciones la referencia a la dirección de una posición de memoria se indica sin corchetes [ ], como en el ejemplo la etiqueta sub_r. Ejemplo de Llamado a Subrutina Se usa una subrutina para realizar una suma de dos números contenidos en registros. Ejemplos de instrucciones en assembler •Instrucciones de control (de Salto condicional): Salta a label si el código de condición z = 1, que indica que todos los bits del registro que contiene el resultado son ceros. Si z= 0 sigue con la instrucción siguiente a be en el programa. Salta a la etiqueta label si el código de condición n= 1, que indica que el primer bit más significativo (el del signo) del registro que contiene el resultado es 1, o sea es un número negativo. Si n= 0 sigue con la instrucción siguiente a bneg en el programa. Salta a label si el código de condición c = 1, que indica que ocurrió un arrastre o acarreo al realizar los cálculos en la ALU. Si c= 0 sigue con la instrucción siguiente a bcs en el programa. Salta a label si el código de condición v= 1, que indica que ocurrió un desbo rde al realizar los cálculos en la ALU. Si v= 0 sigue con la instrucción siguiente a bvs en el programa. lab_12: be label lab_13: bneg label lab_14: bcs label lab_15: bvs label Lo que se está haciendo es asignar la dirección destino del salto, a la dirección de la instrucción en ejecución. Ejemplos de instrucciones en assembler •Instrucciones de control (de Salto incondicional): lab_16: ba label Salta a label, independientemente de los valores que adopten los códigos de condición. Lo que se está haciendo es asignar la dirección destino del salto, a la dirección de la instrucción en ejecución. Formatos de las instrucciones ARC en Lenguaje Máquina (código objeto) • El formato de instrucción definirá como el programa ensamblador (que traduce programas en lenguaje assembler a códigos binarios), distribuye los diferentes campos de una instrucción y la forma en que los interpreta la Unidad de Control. • Cada instrucción tiene 32 bits. • Los dos bits más significativos forman el campo OP, que corresponde al código de operación, a partir de éste se identificará el formato. Formatos de las instrucciones ARC Figura 4.10, página 114, cap ítulo 4 del libro del autor Murdocca. Ejemplos de instrucciones en código objeto • Instrucciones aritméticas: NOTA: Las etiquetas y comentarios no se traducen a código objeto. Identifica la instrucción, según la tab la op3 (con op = 10) En los campos rd, rs1 y rs2 van los números de los registros escritos con 5 dígitos binario s. Ejemplos de instrucciones en código objeto • Instrucciones aritméticas: Cuando el segundo reg istro o rigen es una constan te entonces i = 1, y en el cam po sim m 13 se escribe el valo r de la constan te usando 13 d íg itos b inarios. Ejemplos de instrucciones en código objeto • Instrucciones lógicas: Realiza el AND, bit por bit, entre los contenido de los %r1 y %r2 y almacena el resultado en el %r3. Ejemplos de instrucciones en código objeto • Instrucciones lógicas: Realiza el OR, bit por bit, entre el contenido del %r1 y la constante de valor 1, almacena el resultado en el %r1. Ejemplos de instrucciones en código objeto • Instrucciones lógicas: Realiza el NOR, bit por bit, entre los contenidos de los %r1 y %r0, almacena el resultado en %r1. Hace el complemento. Ejemplos de instrucciones en código objeto • Instrucciones lógicas: Desplaza el contenido del %r1 tres posiciones a la derecha, almacena el resultado en %r2. Las posiciones que quedaron vacías se completan con ceros. Ejemplos de instrucciones en código objeto • Instrucciones lógicas: Carga el valor hexadecimal 304F15 en los 22 bits más significativos del %r1, colocando en 0 los restantes 10 bits.Ejemplos de instrucciones en código objeto • Instrucciones de memoria: q El formato de éstas instrucciones tiene tres operandos, dos de origen(rs1 y rs2) y uno de destino (rd). q Sin embargo, las instrucciones de memoria solo necesitan dos operandos, uno para la dirección y otro para el dato. q El campo operando remanente se lo utilizará también para la dirección: § Cuando i = 1 los operandos contenidos en los campos rs1 y simm13 se sumarán para obtener la dirección. § Cuando i = 0 los operandos contenidos en los campos rs1 y rs2 se sumarán para obtener la dirección. Ejemplos de instrucciones en código objeto • Instrucciones de memoria: En éste ejemplo supond remos que la dirección x es 2064. En simm13 va la dirección, en éste caso X que vale 2064, escrita en binario usando 13 bits. No es el contenido de la dirección. En los ejemplos se utiliza el %r0 para rs2, con lo cual solo se especifica el operando origen restante. Ejemplos de instrucciones en código objeto • Instrucciones de memoria: En éste ejemplo supond remos que la dirección Y es 2065. En el único caso en que el campo rd (registro destino) identificará un registro origen es en la instrucción st. Ejemplos de instrucciones en código objeto • Instrucciones de control: Es una operación de llamado y enlace. Invoca una subrutina, que comienza en la posición de memoria sub_r, y almacena la dirección de la instrucción actual, que esta en PC, en el %r15. Se considera que sub_r se encuentra ubicada 25 palabras (25 x 4 = 100 bytes) después de la instrucción call. Ejemplos de instrucciones en código objeto • Instrucciones de control: Retorno de subrutina. Debe volverse a la dirección siguiente a call, que se la calcula como el valor de PC, que esta en %r15, más 4, el resultado se dice que se descarta en %r0, pero internam ente la arquitectura guarda el destino en el PC , que es el %r32, pero com o no se puede escrib ir 32 con 5 bits se dice que se descarta en el %r0 . Ejemplos de instrucciones en código objeto • Instrucciones de control (de Salto condicional): Salta a label si el código de condición z = 1, que indica que todos los bits del registro que contiene el resultado son ceros . Si z= 0 sigue con la instrucción siguiente a be en el programa. Se considera que label se encuentra en una dirección de memoria 5 palabras (5 x 4 = 20 bytes) mayor que la de la instrucción be. En el formato de salto el bit 29 siempre vale 0. Ejemplos de instrucciones en código objeto • Instrucciones de control (de Salto condicional): Salta a label si el código de condición n= 1, que indica que el primer bit más significativo (el del signo) del registro que contiene el resultado es 1, o sea es un número negativo. Si n= 0 sigue con la instrucción siguiente a bneg en el programa. Se considera que label se encuentra en una dirección de memoria 5 palabras (5 x 4 = 20 bytes) mayor que la de la instrucción bneg. Ejemplos de instrucciones en código objeto • Instrucciones de control (de Salto condicional): Salta a label si el código de condición c = 1, que indica que ocurrió un arrastre o acarreo al realizar los cálculos en la ALU. Si c= 0 sigue con la instrucción siguiente a bcs en el programa. Se considera que label se encuentra en una dirección de memoria 5 palabras (5 x 4 = 20 bytes) mayor que la de la instrucción bcs. Ejemplos de instrucciones en código objeto • Instrucciones de control (de Salto condicional): Salta a label si el código de condición v= 1, que indica que ocurrió un desbo rde al realizar los cálculos en la ALU. Si v= 0 sigue con la instrucción siguiente a bvs en el programa. Se considera que label se encuentra en una dirección de memoria 5 palabras (5 x 4 = 20 bytes) mayor que la de la instrucción bvs. Ejemplos de instrucciones en código objeto • Instrucciones de control (de Salto incondicional): Salta a label, independientemente de los valores que adopten los códigos de condición. Se considera que label se encuentra en una dirección de memoria 5 palabras (5 x 4 = 20 bytes) menor que la de la instrucción ba. Directivas o Pseudo Operaciones ARC • No son códigos de operación, son instrucciones para que el ensamblador realice ciertas operaciones en el momento del ensamble. • Siempre comienzan con un punto ( . ). Algunas directivas las veremos más adelante. Ejemplo de Programa ARC Un programa ARC en lenguaje assembler que suma dos enteros: A partir de la dirección 2048 se cargará el código. Como solo se pueden sumar números que estén almacenados en registros de ARC, el programa comienza cargando en %r1 y %r2 los contenidos de la direcciones X e Y de la memoria. Ejercicio Indique cuales son las etiquetas, las directivas, las instrucciones y los comentarios. El Proceso de Ensamblado •Es el proceso de transformar un programa en lenguaje ensamblador a un programa en lenguaje de máquina. •Los ensambladores comerciales proveen las siguientes prestaciones: -- Permiten al programador especificar la ubicación de variables y programas, y la dirección de inicio de un programa, si existiera. -- Proveen expresiones nemónicas en el lenguaje de programación para todas las instrucciones del lenguaje de máquina. -- Permiten el uso de rótulos simbólicos (etiquetas) para representar direcciones y constantes. -- Incluyen un mecanismo que permite la definición de variables en un programa escrito en lenguaje simbólico y el uso de las mismas en otro programa ensamblado por separado. -- Proveen la expansión de macro rutinas (se definen una sola vez). A continuación exploraremos como el proceso de ensamblado genera un programa ARC a través del "Ensamblado a Mano". Ensambladores de dos pasadas •La mayoría de los ensambladores recorren dos veces el texto escrito en lenguaje simbólico. •En la primera pasada determinan: •direcciones de todos los datos e instrucciones del programa. •seleccionan que instrucción del lenguaje máquina debe generarse para cada instrucción en lenguaje simbólico, pero sin generar aún el código máquina. •realizan operaciones aritméticas. •insertan las definiciones de etiquetas y constantes en una tabla de símbolos. A cada símbolo (etiqueta) se le ingresa en la tabla el valor correspondiente a la posición en que se encuentran. •En la segunda pasada se genera el código máquina, insertando en el mismo los valores de los símbolos ya conocidos de la tabla anterior. Ejemplo de Programa ARC Un programa que suma cinco números enteros: Figura 4.14, página 124, cap ítulo 4 del libro del autor Murdocca. Sobre el programa anterior, realice el proceso de ensamblado en dos pasadas: 1. Primera Pasada: escribir la tabla de símbolos. 2. Segunda Pasada: escribirlo en lenguaje máquina o código objeto. Ejercicio Primera pasada: TABLA DE SÍMBOLOS El símbolo lengh aparece como no determinado por el momento. El contador de posiciones se va incrementando en 4. A cada símbolo (etiqueta) se le ingresa en la tabla el valor correspondiente a la posición en que se encuentran. Segunda pasada: CÓ DIGO OBJETO MODOS DE DIRECCIONAMIENTO SINTAXIS SIGNIFICADO Inmediato #K K Se refieren a un valor (constante o dirección) conocido al momento del ensamble. Directo K M[K] Indirecto * (K) M[M[K]] Se usa para acceder a una variable puntero cuya dirección se conoce al momento de la compilación. Indirecto a través de registro (Rn) M[Rn] Se refiere al contenido de un registro. Se usa cuando la dirección del operando, que esta almacenado en una pila, no se conoce hasta el momento de la ejecución. Indexado a través de registro (Rm + Rn) M[Rm + Rn] Se refieren a la suma de los contenidos de registros y constantes. Se usan para acceder a los componentes de arreglos, y a componentes ubicados más allá del comienzo de la pila. Basado en registro (Rm + X) M[Rm + X] Indexado basado en registro * (Rm + Rn + X) M[Rm + Rn + X] Modos de Direccionamiento Métodos para obtener la dirección de un dato almacenado en memoria. La dirección se obtiene a través del cálculo indicado entre corchetes. Tablaa modo de ejemplo, la sintaxis difiere a la de ARC. (* no se usan éstos modos en ARC) . •Una Subrutina, llamada también función o procedimiento, es una secuencia de instrucciones a la que se invoca como si se tratara de una única instrucción. Cuando el programa llama a la subrutina se transfiere el control a ésta, la que ejecuta la secuencia de instrucciones requerida, tras lo cual vuelve a la posición inmediatamente siguiente a la que generó el llamado. Acceso a Subrutinas Llamado a Subrutina usando Registros Se pasan los parámetros (argumentos) en los registros. No funciona cuando la cantidad de registros a transferir excede el número de registros disponibles, o cuando las subrutinas están muy encadenadas. Llamado a Subrutina usando un Área de enlace (transferencia) de datos Los parámetros se pasan en un área separada en la memoria.•La d irectiva .dwb crea un área de 3 palab ras, en las d irecciones x, x + 4 y x + 8. •Con st se cargan los argum entos (conten idos de %r1 y %r2) en las posiciones de m em oria x y x+ 4, respectivam ente . •Con seth i se carga la d irección x en los 22 b its m ás significativos del %r5, com pletando con cero los o tros 10 b its. •Con srl desp lazo el conten ido del %r5 10 posiciones a la derecha y alm aceno el resultado de nuevo en %r5, lo que se hizo es co locar la d irección x en los 22 b its m enos significativos. •Con ésto la d irección de com ienzo del área, x, se pone en %r5 y se llam a a la subrutina add_2.•Con ld se leen los operandos conten idos en %r5 y %r5+ 4 y se los guarda en %r8 y %r9. •Se realiza la sum a y el resultado se lo guarda en %r10. •Con st se transfiere el resultado a la posición %r5 + 8. •Se reto rna a la rutina invocan te. •Con ld el resultado de la sum a, que esta en la posición x+ 8 de m em oria, se lo co loca en el %r3 de la CPU. Llamado a Subrutina usando una Pila Los argumentos, o punteros a los mismos, se colocan en una pila tipo LIFO (last in first out = último en entrar primero en salir). •El reg istro punte ro de p ila, stack po inter, %sp = %r14, contie ne la d irección de la cabeza de la p ila. •Con addcc se decrem enta %sp en 4, con lo cual queda apuntando a la p rim era palab ra lib re por encim a de la p ila. •Median te st se co loca los argum entos (%r1 y %r2) en la p ila. •Se llam a a la subrutina add_3.•Con ld la rutina invocada extrae de la p ila, p rim ero %r8. •Con addcc se increm enta %sp en 4, con lo cual queda apuntando a la p rim era palab ra ocupada. •Con ld se extrae de la p ila el conten ido de %r9. •Realiza la sum a y guarda el resultado en %r10. •Con st co loca en la p ila lo que deba reto rnar.•La rutina invocan te extrae el valo r devue lto , con ld , y continua la ejecución. La pila tiene por ventaja que su tamaño aumenta o disminuye a medida que resulta necesario.