Logo Studenta

cpr Arquitectura ARC-Capitulo 4y5- MURDOCCA

¡Este material tiene más páginas!

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 información y qué se hará con ella.
Describe hacia dónde 
se transfiere la información
 
Describe qué información se está transmitiendo. 
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 registro esta en la dirección 232-1
La última palabra esta en la dirección 232-4
32 bits = 1 palabra = 
4 bytes = 4 registros 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 el que usaremos
| 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:
Buscar de la memoria la siguiente instrucción a ejecutar.
Decodificar el código de operación.
Buscar los operandos de la memoria principal, si los hubiera.
Ejecutar la instrucción y almacenar los resultados.
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 = registro 0
a
11111 = registro 31
Trayecto de Datos (datapath)
La UC, que NO pertenece al Trayecto de Datos, selecciona las operaciones y operandos a utilizar.
El resultado obtenido en la ALU se transfiere, a través de un bus, al registro destino que se encuentra en el Conjunto de Registros.
Los dos operandos se transfieren desde el Conjunto de Registros, a través de buses, a los Registros 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 siempredeben ser un registro. El operando origen 2 puede ser una constante.
Ejemplos de instrucciones en assembler
Instrucciones aritméticas:
Suma el contenido del registro 1 con el contenido del registro 2 , el resultado lo almacena en el registro 3.
Al contenido del registro 1 le suma el valor 12, el resultado lo almacena en el registro 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 internamente 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 desborde 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 tabla op3 (con op = 10) 
En los campos rd, rs1 y rs2 van los números de los registros escritos con 5 dígitos binarios.
Ejemplos de instrucciones en código objeto
Instrucciones aritméticas:
Cuando el segundo registro origen es una constante entonces i = 1, y en el campo simm13 se escribe el valor de la constante usando 13 dígitos binarios.
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 objetoInstrucciones 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:
 El formato de éstas instrucciones tiene tres operandos, dos de origen(rs1 y rs2) y uno de destino (rd). 
 Sin embargo, las instrucciones de memoria solo necesitan dos operandos, uno para la dirección y otro para el dato.
 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 supondremos 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 supondremos 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 internamente la arquitectura guarda el destino en el PC , que es el %r32, pero como no se puede escribir 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 desborde 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:
Primera Pasada: escribir la tabla de símbolos.
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 enmemoria. 
La dirección se obtiene a través del cálculo indicado entre corchetes.
Tabla a 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 directiva .dwb crea un área de 3 palabras, en las direcciones x, x + 4 y x + 8.
Con st se cargan los argumentos (contenidos de %r1 y %r2) en las posiciones de memoria x y x+4, respectivamente.
Con sethi se carga la dirección x en los 22 bits más significativos del %r5, completando con cero los otros 10 bits.
Con srl desplazo el contenido del %r5 10 posiciones a la derecha y almaceno el resultado de nuevo en %r5, lo que se hizo es colocar la dirección x en los 22 bits menos significativos.
Con ésto la dirección de comienzo del área, x, se pone en %r5 y se llama a la subrutina add_2.
Con ld se leen los operandos contenidos en %r5 y %r5+4 y se los guarda en %r8 y %r9.
Se realiza la suma y el resultado se lo guarda en %r10.
Con st se transfiere el resultado a la posición %r5 + 8.
Se retorna a la rutina invocante.
Con ld el resultado de la suma, que esta en la posición x+8 de memoria, se lo coloca 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 registro puntero de pila, stack pointer, %sp = %r14, contiene la dirección de la cabeza de la pila.
Con addcc se decrementa %sp en 4, con lo cual queda apuntando a la primera palabra libre por encima de la pila.
Mediante st se coloca los argumentos (%r1 y %r2) en la pila.
Se llama a la subrutina add_3.
Con ld la rutina invocada extrae de la pila, primero %r8.
Con addcc se incrementa %sp en 4, con lo cual queda apuntando a la primera palabra ocupada.
Con ld se extrae de la pila el contenido de %r9.
Realiza la suma y guarda el resultado en %r10.
Con st coloca en la pila lo que deba retornar.
La rutina invocante extrae el valor devuelto, con ld, y continua la ejecución.
La pila tiene por ventaja que su tamaño aumenta o disminuye a medida que resulta necesario.