Universidad Rey Juan Carlos ESTRUCTURA Y TECNOLOGÍA DE COMPUTADORES MC68000 y la gestión de subrutinas Luis Rincón Córcoles Licesio J. Rodríguez-Aragón MC68000 y la gestión de subrutinas Programa 1. 2. 3. 4. 5. 6. 7. Introducción. MC68000 y la llamada a subrutina. MC68000 y los parámetros de las subrutinas. MC68000 y las variables locales en subrutinas. MC68000 y las funciones de PASCAL. MC68000 y los procedimientos de PASCAL. MC68000 y los registros en subrutinas. 2 MC68000 y la gestión de subrutinas Bibliografía  D.A. PATTERSON, J.L HENNESSY. Estructura y diseño de computadores. Reverté, 2000.  M68000 8/16/32 Bit Microprocessors User’s Manual. 9th edition. Motorola, 1993.  Motorola M68000 Family Programmer’s Reference Manual. Motorola, 1992.  A. CLEMENTS. Microprocessor Systems Design. 3rd edition, ITP - PWS Publishing Company, 1997.  J. SEPTIÉN, H. MECHA, R. MORENO, K. OLCOZ. La familia del MC68000. Síntesis, 1995.  C. CERRADA, V. FELIU. Estructura y Tecnología de Computadores I. UNED, 1993.  F.G. McCABE. High-Level Programmer’s Guide to the 68000. Prentice-Hall, 1992. 3 MC68000 y la gestión de subrutinas 1. Introducción  Las subrutinas o subprogramas son fragmentos de código diseñados para realizar determinadas tareas y que pueden ser invocados desde diferentes puntos del programa principal o desde otras subrutinas. PROGRAMA PRINCIPAL inicio del programa SUBRUTINA instrucciones anteriores SUBRUT Inicio de la subrutina instrucción de llamada a subrutina instrucción de retorno (siguiente) Retorno de la subrutina instrucciones posteriores fin del programa 4 MC68000 y la gestión de subrutinas Introducción  Al invocar una subrutina, la dirección de retorno se almacena automáticamente en una ubicación conocida. • La dirección de retorno de la subrutina es la dirección de la instrucción que va detrás de la instrucción de llamada.  Al retornar de la subrutina, la dirección de retorno se recupera automáticamente de la ubicación en la que se almacenó en la llamada y se restaura en el PC. • Así, la instrucción que se ejecuta nada más salir de la subrutina es la que va justo detrás de la instrucción en que se realizó la llamada.  Una subrutina toma unos datos de entrada, los procesa y produce unos resultados, o bien realiza una acción determinada.  Datos utilizados en las subrutinas: • • • • Parámetros o argumentos. Valor de retorno (sólo en funciones). Variables locales. Variables globales (estáticas). 5 MC68000 y la gestión de subrutinas Tipos de subprogramas en PASCAL  Procedimiento (PROCEDURE) • Puede tener parámetros de entrada, salida o entrada/salida. • No retorna ningún valor. PROCEDURE proc (a:CHAR; VAR b,c:INTEGER; d:INTEGER);  Función (FUNCTION) • Sólo puede recibir parámetros de entrada. • Retorna un valor (tiene que ser un tipo simple). FUNCTION func (a:INTEGER; b,c:REAL; d:CHAR) : BOOLEAN; 6 MC68000 y la gestión de subrutinas Introducción  La subrutina puede contar con parámetros y variables a través de: • Registros: es la opción más rápida. • Pila: es la opción más flexible. Código independiente de la posición (reubicable). Código reentrante o recursivo. • Memoria (zonas de memoria especiales, variables globales, tablas, etc).  Gestión de los datos en las subrutinas: • Los parámetros son introducidos en el lugar adecuado por el invocador antes de invocar a la subrutina. • La propia subrutina gestiona sus variables locales (que desaparecen al terminar la ejecución de la misma). • Tras producirse el retorno de la subrutina, el invocador debe: Eliminar los parámetros. Recuperar y posteriormente eliminar el valor de retorno.  Variables globales: definidas en el programa principal mediante directivas de reserva de datos de tipo estático. • Las variables globales existen mientras dura el programa en ejecución. • Es aconsejable limitar su uso en subrutinas (mejor pasarlas como parámetros). 7 MC68000 y la gestión de subrutinas 2. MC68000 y la llamada a subrutina  Al invocar una subrutina, la dirección de retorno se almacena automáticamente en la pila. ANTES PC instrucciones previas del programa principal dir DESPUÉS PC subrut SP dir+k 4 octetos SP dir BSR d(PC) ó JSR subrut dir+k instrucción siguiente instrucciones posteriores del programa principal LLAMADA A SUBRUTINA BSR d(PC) JSR subrut Normalmente la dirección de la subrutina se especifica mediante una etiqueta 8 MC68000 y la gestión de subrutinas MC68000 y la llamada a subrutina  Al salir de una subrutina, la dirección de retorno se extrae de la pila y se almacena en el PC. DESPUÉS ANTES PC SUBRUTINA subrut inicio subrut+n PC dir+k SP dir+k 4 octetos SP subrut+n RTS RETORNO DE SUBRUTINA RTS Se restaura el PC con la dirección de retorno 9 MC68000 y la gestión de subrutinas 3. MC68000 y los parámetros de las subrutinas  Datos utilizados en las subrutinas: • • • • Parámetros o argumentos. Valor de retorno (sólo en funciones). Variables locales. Variables globales (estáticas).  Lo más flexible es que la subrutina utilice sus datos a través de la pila. • Excepción: variables globales, que están en memoria estática.  Sería más rápido y sencillo usar datos en registros, pero el MC68000 tiene pocos y puede ser preciso reservarlos para datos temporales, evaluación de expresiones, etc. • El uso de registros es sumamente sencillo.  Usar parámetros, retorno y variables locales en pila facilita el diseño de: • Código independiente de la posición (reubicable). • Código reentrante. • Código recursivo. 10 MC68000 y la gestión de subrutinas Parámetros de entrada  La subrutina recibe sus parámetros de entrada por valor (por copia).  El programa o subrutina llamador copia el valor del parámetro en la pila antes de invocar a la subrutina.  La subrutina recibe y maneja una copia local del parámetro como una variable cualquiera almacenada en memoria.  Como el dato original usado como parámetro está en otra parte, las modificaciones realizadas sobre la copia local del parámetro no se ven reflejadas en el dato original. 11 MC68000 y la gestión de subrutinas Parámetros de entrada: ejemplo  Cabecera en PASCAL: PROCEDURE proc (a,b:INTEGER);  Llamada en PASCAL: VAR i,j: INTEGER; ... proc(i,j); ...  Llamada en ensamblador: * Insertar parámetros en la pila MOVE.W I,-(SP) MOVE.W J,-(SP) * Llamar a la subrutina JSR PROC * Borrar parámetros de la pila ADDA.L #4,SP MOVE.W I,-(SP) DIR $3F39 $0000 $2000 MOVE.W J,-(SP) DIR+6 $3F39 $0000 $2002 JSR SUBRUT DIR+$C $4EB9 $0000 $1000 ADDA.L #4,SP DIR+$12 $DFFC $0000 $0004 12 MC68000 y la gestión de subrutinas Parámetros de entrada: ejemplo TRAS INSERTAR PARÁMETROS ANTES TRAS JSR SUBRUT TRAS BORRAR PARÁMETROS TRAS RTS SP DIR+$12 SP SP $5678 $5678 ¿Modificado? $1234 $1234 ¿Modificado? SP SP PC DIR PC DIR+$C PC $001000 PC DIR+$12 PC DIR+$18 $002000 $1234 $002000 $1234 $002000 $1234 $002000 $1234 $002000 $1234 $002002 $5678 $002002 $5678 $002002 $5678 $002002 $5678 $002002 $5678 13 MC68000 y la gestión de subrutinas Parámetros de entrada: ejemplo  Cabecera en PASCAL: PROCEDURE proc (a,b:INTEGER);  Llamada en PASCAL: VAR i,j: INTEGER; ... proc(i,j); ...  Llamada en ensamblador: * Insertar parámetros en la pila MOVE.W I,-(SP) MOVE.W J,-(SP) * Llamar a la subrutina JSR PROC * Borrar parámetros de la pila ADDA.L #4,SP  Ejemplos de acceso a los parámetros: PROC EQU * A SET 6 Desplazamiento de los parámetros respecto de SP B SET 4 * Acceso al primer parámetro MOVE.W A(SP),D0 * Acceso al segundo parámetro MOVE.W B(SP),D1 * Si escribimos sobre un parámetro no tocamos la variable original MOVE.W D2,A(SP) MOVE.W D3,B(SP) 14 MC68000 y la gestión de subrutinas Parámetros de entrada / salida  La subrutina recibe sus parámetros de entrada / salida por referencia (por dirección).  El programa o subrutina llamador inserta en la pila un puntero al parámetro antes de invocar a la subrutina.  A través de dicho puntero, la subrutina puede acceder al parámetro real y usarlo y modificarlo según su conveniencia.  Para ello cargará el puntero (almacenado en la pila) en un registro de direcciones y accederá al parámetro real usando direccionamiento indirecto a registro.  Las modificaciones del parámetro permanecen tras retornar de la subrutina: los parámetros de entrada / salida proporcionan a los subprogramas la posibilidad de ofrecer varios resultados. 15 MC68000 y la gestión de subrutinas Parámetros de entrada / salida: ejemplo  Cabecera en PASCAL: PROCEDURE proc (VAR a:INTEGER; b:INTEGER);  Llamada en PASCAL: VAR i,j: INTEGER; ... proc(i,j); ...  Llamada en ensamblador: * Insertar parámetros en la pila PEA I MOVE.W J,-(SP) * Llamar a la subrutina JSR PROC * Borrar parámetros de la pila ADDA.L #6,SP PEA I DIR $4879 $0000 $2000 MOVE.W J,-(SP) DIR+6 $3F39 $0000 $2002 JSR SUBRUT DIR+$C $4EB9 $0000 $1000 ADDA.L #6,SP DIR+$12 $DFFC $0000 $0006 16 MC68000 y la gestión de subrutinas Parámetros de entrada / salida: ejemplo TRAS INSERTAR PARÁMETROS ANTES TRAS BORRAR PARÁMETROS TRAS RTS TRAS JSR SUBRUT SP DIR+$12 SP SP $5678 $5678 ¿Alterado? $0000 $0000 $0000 $2000 $2000 $2000 SP SP PC DIR PC DIR+$C PC $001000 PC DIR+$12 PC DIR+$18 $002000 $1234 $002000 $1234 $002000 $1234 $002000 RESULTADO $002000 RESULTADO $002002 $5678 $002002 $5678 $002002 $5678 $002002 $5678 $002002 $5678 17 MC68000 y la gestión de subrutinas Parámetros de entrada / salida: ejemplo  Cabecera en PASCAL: PROCEDURE proc (VAR a:INTEGER; b:INTEGER);  Llamada en PASCAL: VAR i,j: INTEGER; ... proc(i,j); ...  Llamada en ensamblador: * Insertar parámetros en la pila PEA I MOVE.W J,-(SP) * Llamar a la subrutina JSR PROC * Borrar parámetros de la pila ADDA.L #6,SP  Ejemplos de acceso a los parámetros: PROC EQU * A SET 6 Desplazamiento de los parámetros respecto de SP B SET 4 * Acceso al primer parámetro MOVEA.L A(SP),A0 MOVE.W (A0),D0 * Acceso al segundo parámetro MOVE.W B(SP),D1 * Podríamos modificar la variable pasada como primer parámetro MOVE.W D2,(A0) * Si escribimos sobre el segundo parámetro no tocamos la variable original MOVE.W D3,B(SP) 18 MC68000 y la gestión de subrutinas Valor de retorno  Las subrutinas de tipo función devuelven un valor para ser asignado a una variable o utilizado en una expresión.  Antes de invocar a la subrutina, el programa o subrutina llamador debe reservar en la pila el espacio necesario para albergar el valor de retorno, antes de ocuparse de los parámetros.  Tras retornar de la subrutina, el programa o subrutina llamador borrará los parámetros de la pila, mientras que el valor de retorno quedará un tiempo más en la pila para usos posteriores. 19 MC68000 y la gestión de subrutinas Valor de retorno: ejemplo  Cabecera en PASCAL: FUNCTION func (a:INTEGER): INTEGER;  Llamada en PASCAL: VAR i,j: INTEGER; ... j := func(i); ...  Llamada en ensamblador: ... * Insertar parámetros en la pila CLR.W -(SP) MOVE.W I,-(SP) * Llamar a la subrutina JSR FUNC * Borrar parámetros de la pila ADDA.L #2,SP * Recoger resultado MOVE.W (SP)+,J ... CLR.W –(SP) MOVE.W I,-(SP) DIR $4267 DIR+2 $3F39 $0000 $2000 JSR FUNC DIR+$8 $4EB9 $0000 $1000 ADDA.L #2,SP DIR+$0E $DFFC $0000 $0002 MOVE.W (SP)+,J DIR+$14 $33DF $0000 $2002 20 MC68000 y la gestión de subrutinas Valor de retorno: ejemplo TRAS INSERTAR PARÁMETROS ANTES TRAS JSR SUBRUT TRAS BORRAR PARÁMETROS Y EXTRAER RESULTADO TRAS RTS SP DIR+$12 SP SP $1234 $1234 ¿Modificado? $0000 $0000 RESULTADO SP SP PC DIR PC DIR+$C PC $001000 PC DIR+$12 PC DIR+$18 $002000 $1234 $002000 $1234 $002000 $1234 $002000 $1234 $002000 $002002 $5678 $002002 $5678 $002002 $5678 $002002 $5678 $002002 RESULTADO $1234 21 MC68000 y la gestión de subrutinas Valor de retorno: ejemplo  Cabecera en PASCAL: FUNCTION func (a:INTEGER): INTEGER;  Llamada en PASCAL: VAR i,j: INTEGER; ... j := func(i); ...  Llamada en ensamblador: * Insertar parámetros en la pila CLR.W -(SP) MOVE.W I,-(SP) * Llamar a la subrutina JSR FUNC * Borrar parámetros de la pila ADDA.L #2,SP * Recoger resultado MOVE.W (SP)+,J  Ejemplos de acceso a los parámetros y al valor de retorno: FUNC EQU * A SET 4 Desplazamiento del parámetro y el retorno respecto a SP RETURN SET 6 * Acceso al parámetro MOVE.W A(SP),D0 * Si escribimos sobre el parámetro no tocamos la variable original MOVE.W D1,A(SP) * Con la orden RETURN de PASCAL se escribe en la pila el resultado devuelto MOVE.W D2,RETURN(SP) 22 MC68000 y la gestión de subrutinas 4. MC68000 y las variables locales en subrutinas  Las subrutinas suelen usar datos propios (variables locales) para sus cálculos. • Lo más flexible es ubicar las variables locales de la subrutina en la pila.  Al entrar en la subrutina, ésta crea un marco de pila (stack frame), y coloca un puntero de marco (frame pointer) apuntando a dicha zona. • Las variables locales se encontrarán ubicadas en el marco de pila. • Marco de pila: espacio para variables locales + copia del puntero de marco en la pila. • An: puntero de marco (frame pointer). LINK An,#-tam SP - 4 → SP An → M(SP) SP → A6 SP - tam → SP  Justo antes de retornar, la subrutina libera el marco de pila reservado y restaura el puntero de marco. UNLK An A6 → SP M(SP) → A6 SP + 4 → SP 23 MC68000 y la gestión de subrutinas MC68000 y las variables locales: ejemplo  Subprograma en PASCAL: PROCEDURE pf (parámetros); O FUNCTION pf (parámetros): tipo_retorno; VAR a: INTEGER; (* 2 octetos *) b: INTEGER; (* 2 octetos *) c: CHAR; (* 1 octeto *) BEGIN ... END;  Subrutina en ensamblador: * Inicio de la subrutina PF EQU * * Definición de constantes para acceder a parámetros y variables locales ... * Crear marco de pila LINK A6,#-6 ... * Borrar marco de pila UNLK A6 * Fin de la subrutina RTS 24 MC68000 y la gestión de subrutinas MC68000 y las variables locales: ejemplo AL ENTRAR EN LA SUBRUTINA DESPUÉS DE UNLINK DESPUÉS DE LINK SP C (1 octeto) B (2 octetos) A (2 octetos) A6 $12345678 SP dirección de retorno dirección de retorno parámetros parámetros MARCO DE PILA BLOQUE DE ACTIVACIÓN SP dirección de retorno parámetros SP $00FFFFF0 SP $00FFFFE6 SP $00FFFFF0 A6 $12345678 A6 $00FFFFEC A6 $12345678 25 MC68000 y la gestión de subrutinas MC68000 y las variables locales: ejemplo  La pila puede variar durante la ejecución de la subrutina: •Es mejor acceder a los parámetros y variables locales mediante direccionamiento indirecto al puntero del marco de pila.  Si no hay variables locales en la pila, se puede crear un marco de pila de tamaño 0.  Ejemplos de acceso a las variables locales: A SET -2 Desplazamiento del parámetro y el retorno respecto a A6 B SET -4 C SET -5 * Accesos a la variable local a MOVE.W A(A6),D0 MOVE.W D1,A(A6) * Accesos a la variable local b MOVE.W B(A6),D2 MOVE.W D3,B(A6) * Accesos a la variable local c MOVE.B C(A6),D4 MOVE.B D5,C(A6) * A los parámetros se accedería con desplazamiento positivo mayor o igual que 8. 26 MC68000 y la gestión de subrutinas 5. MC68000 y las funciones de PASCAL PROGRAM prueba;  Acciones del programa principal (o subprograma) ante una llamada a función: 1. Reservar espacio en la pila para el valor de retorno. 2. Insertar los parámetros en la pila. 3. Invocar a la subrutina. 4. Borrar los parámetros de la pila. 5. Recoger o utilizar el valor de retorno como sea preciso y borrarlo de la pila.  Acciones realizadas dentro de la función: 1. Crear el marco de pila. 2. Realizar el proceso. 3. Almacenar el valor de retorno en la pila. 4. Destruir el marco de pila. 5. Retornar. FUNCTION sumar (num: INTEGER): INTEGER; VAR i, ac: INTEGER; BEGIN ac := 0; FOR i := 1 TO num DO ac := ac+i*i; sumar := ac; return; END; VAR n,s: INTEGER; BEGIN n := 5; s := sumar(n); END. 27 MC68000 y la gestión de subrutinas MC68000 y las funciones de PASCAL SUMAR RETURN NUM I AC FOR INC BLOQUE FIN ORG EQU SET SET SET SET LINK CLR.W EQU MOVE.W MOVE.W CMP.W BLT BRA ADDQ.W MOVE.W MULS ADD.W CMP.W BNE EQU MOVE.W UNLK RTS Programa principal y variables Pila dentro de la subrutina Subrutina $400 * SP 10 8 -2 -4 A6,#-4 A6 AC(A6) * #1,I(A6) NUM(A6),D7 I(A6),D7 FIN BLOQUE #1,I(A6) I(A6),D6 D6,D6 D6,AC(A6) I(A6),D7 INC * AC(A6),RETURN(A6) A6 Tamaño (octetos) Variable local ac Variable local i A6 anterior Dirección de retorno Copia de num Valor de retorno 2 2 VAR N S ORG EQU DS.W DS.W $600 * 1 1 ORG EQU MOVEA.L MOVE.W CLR.W MOVE.W JSR ADDA.L MOVE.W MOVE.B TRAP END $700 * #$010000,SP #5,N -(SP) N,-(SP) SUMAR #2,SP (SP)+,S #9,D0 #15 BEGIN 4 4 2 2 BEGIN 28 MC68000 y la gestión de subrutinas 6. MC68000 y los procedimientos de PASCAL  Acciones del programa principal (o subprograma) ante una llamada a procedimiento: 1. Insertar los parámetros en la pila. 2. Invocar a la subrutina. 3. Borrar los parámetros de la pila.  Acciones realizadas dentro del procedimiento: 1. 2. 3. 4. Crear el marco de pila. Realizar el proceso. Destruir el marco de pila. Retornar. PROGRAM prueba; PROCEDURE sumar (num: INTEGER; VAR suma: INTEGER); VAR i: INTEGER; BEGIN suma := 0; FOR i := 1 TO num DO suma := suma+i*i; END; VAR n,s: INTEGER; BEGIN n := 5; sumar(n,s); END. 29 MC68000 y la gestión de subrutinas MC68000 y los procedimientos de PASCAL Subrutina SUMAR NUM SUMA I FOR INC BLOQUE FIN ORG EQU SET SET SET LINK MOVEA.L CLR.W EQU MOVE.W MOVE.W CMP.W BLT BRA ADDQ.W MOVE.W MULS ADD.W CMP.W BNE EQU UNLK RTS Pila dentro de la subrutina $400 * 12 8 -2 A6,#-2 SUMA(A6),A5 (A5) * #1,I(A6) NUM(A6),D7 I(A6),D7 FIN BLOQUE #1,I(A6) I(A6),D6 D6,D6 D6,(A5) I(A6),D7 INC * A6 SP A6 Tamaño (octetos) Variable local i 2 A6 anterior 4 Dirección de retorno Puntero a suma Copia de num 4 Programa principal y variables VAR N S ORG $600 EQU DS.W DS.W * 1 1 ORG $700 EQU MOVEA.L MOVE.W MOVE.W PEA JSR ADDA.L MOVE.B TRAP END * #$010000,SP #5,N N,-(SP) S SUMAR #6,SP #9,D0 #15 BEGIN 4 BEGIN 2 30 MC68000 y la gestión de subrutinas 7. MC68000 y los registros en subrutinas  Es posible usar registros para ubicar variables globales o locales y parámetros. • Hay un número limitado de registros. • Las estructuras de datos no caben en los registros. • Las variables ubicadas en registros no deben perderse por llamar a una subrutina.  Salvaguarda de registros mediante guarda-invocador: • El programa guarda en la pila los registros cuyo contenido le interesa mantener. MOVEM.L lista-regs,-(SP) • El programa principal restaura dichos registros después de salir de la subrutina. MOVEM.L (SP)+,lista-regs • La subrutina puede usar los registros libremente.  Salvaguarda de registros mediante guarda-invocado: • Tras crear el marco de pila, la subrutina guarda en la pila los registros que va a modificar y que no son parámetros de salida. MOVEM.L lista-regs,-(SP) • Antes de destruir el marco de pila, la subrutina restaura los registros salvaguardados. MOVEM.L (SP)+,lista-regs • El programa principal recibe los registros intactos (salvo los parámetros de salida). 31 MC68000 y la gestión de subrutinas MC68000 y los registros: guarda-invocador  Llamada a la subrutina con guarda-invocador: * El programa usa como variables D0,D1,D2,A0 y A2 * Salvaguardar registros en pila MOVEM.L D0-D2/A0/A2,-(SP) * Insertar en pila espacio para valor de * retorno si función ... * Insertar parámetros en la pila ... * Llamar a la subrutina JSR SUBRUT * Borrar parámetros de la pila ADDA.L #t,SP * Recoger valor de retorno si función ... * Restaurar desde pila registros * salvaguardados MOVEM.L (SP)+,D0-D2/A0/A2 SP variables locales A6 A6 previo dirección de retorno parámetros y valor de retorno registros guardados por el invocador 32 MC68000 y la gestión de subrutinas MC68000 y los registros: guarda-invocado  Llamada a la subrutina con guarda-invocado: * Inicio subrutina: crear marco de pila PF LINK A6,#-t * La subrutina modifica los registros D0, * D6, D7, A0 y A1 * Salvaguarda de registros en pila MOVEM.L D0/D6-D7/A0-A1,-(SP) * Cuerpo de la subrutina ... * Restauración de registros MOVEM.L (SP)+,D0/D6-D7/A0-A1 * Borrar marco de pila UNLK A6 * Fin de la subrutina RTS SP registros guardados por el invocado variables locales A6 A6 previo dirección de retorno parámetros y valor de retorno 33 MC68000 y la gestión de subrutinas MC68000 y los registros en subrutinas  Se puede llegar a una solución intermedia por convenio que permita usar de forma segura algunos registros para almacenar variables: • Varios registros que se pueden usar como parámetros para subrutinas y para el valor de retorno siempre que quepa en ellos (ej: D0,D1,D2,A0,A1). • Varios registros que se pueden usar para almacenar variables con seguridad, por lo cual las subrutinas deben salvaguardar su contenido si los utilizan mediante guardainvocado (ej: D3,D4,D5,A2,A3). • Varios registros con contenido “no garantizado” para cálculos temporales: si un invocador quiere mantenerlos ante una llamada a subrutina, debe salvarlos en pila él mismo mediante guarda-invocador (ej: D6,D7,A4,A5).  Los registros “seguros” pueden servir como variables locales o globales.  Es posible usar registros para ubicar variables globales o locales y parámetros. • Hay un número limitado de registros. • Las estructuras de datos no caben en los registros. • Las variables ubicadas en registros no deben perderse por llamar a una subrutina.  Los convenios deben ser adoptados por programadores de ensamblador y por los compiladores. 34 MC68000 y la gestión de subrutinas MC68000 y los registros en subrutinas * INVOCADOR * Salvaguardar registros temporales en pila MOVEM.L D6/D7/A4/A5,-(SP) * Insertar en pila espacio para retorno * Insertar parámetros en D0, D1, A0, A1 y pila * Llamar a la subrutina JSR SUBRUT * Borrar parámetros de la pila ADDA.L #t,SP * Recoger valor de retorno si función * Restaurar desde pila registros temporales MOVEM.L (SP)+, D6/D7/A4/A5 * SUBRUTINA: crear marco de pila PF LINK A6,#-t * Salvaguarda de registros seguros MOVEM.L D3-D5/A2/A3,-(SP) * Cuerpo de la subrutina * Restauración de registros seguros MOVEM.L (SP)+,D3-D5/A2/A3 * Borrar marco de pila UNLK A6 * Fin de la subrutina RTS SP registros guardados por el invocado variables locales A6 A6 previo dirección de retorno parámetros y valor de retorno registros guardados por el invocador 35