Se ha elegido como cdigo objeto el llamado cdigo P. Es un cdigo bastante orientado a la compilacin del lenguaje Pascal, pero que se ha aplicado de manera ptima a los objetivos de este compilador. El compilador traduce el programa fuente escrito en el lenguaje LC99 a este cdigo objeto basado en mnemotcnicos ! etiquetas, que corresponde al ensamblador de una m"quina de pila virtual denominada m"quina P. El cdigo ser" despus interpretado por un intrprete de cdigo P que simular" las caracter#sticas de la m"quina P. $"s que las caracter#sticas del cdigo objeto en s# para el beneficio del compilador en cuanto a la optimi%acin o la did"ctica, ha sido el sistema de gestin de memoria de la m"quina P el que supone un atractivo para utili%ar esta alternativa. La estructura de la m"quina, estudiada a fondo en el siguiente apartado, posee algunas de las caracter#sticas a las que tiende la did"ctica de este pro!ecto& otras se han adaptado de manera efica% ! no mu! costosa. 'ntes de abordar directamente cmo reali%a el compilador la generacin del cdigo objeto, se e(plicar" en detalle el funcionamiento de la m"quina P, as# como los fundamentos para la correcta escritura de programas en el cdigo P. 'mbas tareas han formado parte del desarrollo de este pro!ecto, !a que no se contaba inicialmente con una especificacin formal del cdigo o de la m"quina. ' partir del documento e(plicativo del compilador P) *ver referencia bibliogr"fica +',-9./0 se ha intentado elaborar un documento de referencia para esta m"quina ! su cdigo. 123 El cdigo objeto 5.1.- La mquina P. La m"quina de Cdigo4P posee una estructura similar a la de un computador convencional !a que consiste en un procesador ! una memoria. El procesador tiene su propio repertorio de instrucciones definido. Para la ejecucin de las instrucciones ! la gestin de la memoria cuenta con cinco registros. 4 PC5 Contador de programa *program counter0. 6ndica la posicin dentro del programa fuente en cdigo P, de la instruccin actualmente en ejecucin. 4 SP5 Puntero de pila *stac7 pointer0. 'punta a la cima de la pila local. 4 $P5 Puntero de marco de pila *mar7 stac7 pointer0. 'punta a la base del marco de pila * "rea de datos0 situado en la cima de la pila de marcos de pila. 4 8P5 Puntero nuevo *ne9 pointer0. Es el marcador del l#mite actual de la parte de memoria din"mica *heap0. 4 EP5 Puntero de e(tremo de pila *e(treme stac7 pointer0. 'punta al l#mite de la pila local. La organi%acin de la memoria se puede apreciar en los siguientes diagramas5 El "rea de constantes es generada por el ensamblador ! accedida por el cdigo. Como se muestra en el diagrama, la memoria din"mica crece hacia las posiciones bajas de la memoria. El inicio del espacio libre es apuntado por 8P. 12: pila memoria dinmica (heap) constantes SP NP 0 El cdigo objeto El "rea de la pila contiene una estructura interna m"s compleja, que se ve en el siguiente diagrama, ! se usa para almacenar las "reas de datos correspondientes a las activaciones, en forma de marcos de pila *stac7 frame0. El primer marco es una e(cepcin que corresponde al bloque principal del programa. En la siguiente figura se muestra el formato interno de cada marco de pila. ;ambin se muestra el uso de los punteros $P ! EP. $arco de pila <alor de la funcin Enlace est"tico Enlace din"mico EP anterior =ir. de retorno Par"me4 tros <ariables locales Pila local $ar7 stac7 $P SP EP El "rea de datos *stac7 frame0 consta de un primer espacio reservado para los par"metros impl#citos5 14 <alor de la funcin5 Posicin donde se almacenar" el valor de retorno en el caso de que la activacin corresponda a la de una funcin. >4 Enlace est"tico5 'punta a la base del marco de pila que corresponde a la subrutina que engloba a la actual. 24 Enlace din"mico5 'punta a la base del marco de pila de la subrutina desde donde se produjo la llamada de la actual. )4 EP anterior5 <alor del EP antes de la activacin. 129 heap marco de pila marco de pila del programa principal SP 0 marco de pila espacio libre El cdigo objeto ?4 =ireccin de retorno5 <alor que adquirir" el PC tras finali%ar la ejecucin de la subrutina actual. El registro $P apunta a la base del marco de la cima de la pila, ! se usa para liberar el espacio tras la finali%acin de la activacin de la cima. EP apunta al e(tremo de la pila local, lo cual significa que ser" el valor m"(imo que puede adquirir el SP. Su funcin es la de proteger el "rea de la pila local de la memoria din"mica, comprobando que no se alcancen los punteros EP ! 8P. El valor de EP ser" conocido en tiempo de compilacin, calculando el efecto sobre la pila de las instrucciones generadas. La pila local se usa e(clusivamente por las instrucciones para guardar valores temporales. Por ejemplo, @sbi@ e(trae los dos valores de la cima de la pila, los resta, ! almacena el resultado en la pila. El SP se decrementar" para reflejar el nuevo estado. El "rea de par"metros contiene los par"metros formales, que son transferidos en la llamada a la subrutina. En stas posiciones se almacenar" el valor o la direccin de los par"metros reales, dependiendo del modo de acceso definido para los mismos. La parte de variables locales almacena todas las variables declaradas en la subrutina. Como el lenguaje LC99 permite estructura de bloques, ! la forma de implementarlo es utili%ando una subpila interna al "rea de datos, el tamaAo reservado para las variables locales deber" ser el ma!or posible segBn la estructura de anidamiento de los bloques. En este espacio se almacenar" tambin las variables temporales utili%adas en las instrucciones @for@. El particular primer marco de pila, que corresponde al bloque principal del programa, tiene la siguiente estructura5 ... ..) ? C 3 : 9.. ..EP $ar7 stac7 entrada salida Prd prr Par"m. <ar. Locales Pila local Las cuatro posiciones siguientes a las de los par"metros impl#citos *?4:0 se reservan para las posiciones de entrada ! salida de datos de la consola ! ficheros, respectivamente. La primera posicin en la que se puede alojar una variable local ser" la 9. ;odas las posiciones del "rea de datos del procedimiento principal ser"n fijas durante la ejecucin del programa. Por ello pueden ser accedidas de forma global, Bnicamente especificando la direccin absoluta deseada. 1). El cdigo objeto El enlace est"tico se utili%a como un puntero para acceder a variables en bloques e(ternos. El enlace din"mico es el valor previo de $P, de manera que el marco de pila pueda eliminarse cuando termine la ejecucin del procedimiento llamado. El siguiente ejemplo muestra un procedimiento anidado llamado recursivamente. El diagrama de la pila de marcos muestra los enlaces est"ticos ! din"micos en la pila en el momento en que el programa para la ejecucin, por la instruccin @brea7point@. Program <ar j5 integer endvar Procedure P <ar i5 integer endvar Procedure D 6f iE. then i 5F i 4 1& j 5F j G 1& D Else brea7point Endif Endproc D i 5F >& D Endproc P j 5F .& P Endprogram 1)1 sl dl sl dl sl dl sl dl programa principal proc. p proc. q 1 llamada proc. q 2 llamada proc. q 3 llamada El cdigo objeto =e esta forma, en un momento dado de la ejecucin, es posible acceder a las variables locales, globales ! de otras "reas de datos contenidas en el "mbito actual. ?.1.1.4 Ejemplo Consideremos el siguiente procedimiento ! el correspondiente Cdigo4P5 Program procedure addlocal var i:integer endvar i:=i+1 endproc addlocal addlocal endprogram l 2 Comien%o de addlocal ent 1 l ) Se sitBa SP segBn el tamaAo de las variables locales ent > l ? Se calcula el valor del EP segBn la pila local lodi . ? Se carga en la pila la posicin ?H a partir del $P *i0 ldci l Se carga en la pila el nBmero 1. adi Se e(traen el 1 e i, ! se inserta en la pila iG1 stri . ? El valor de la cima *iG10 es almacenado en ? *i0 retp Ietorno de addlocal l )F C En este punto se sabe el tamaAo de las variables locales l ?F 3 ! el tamaAo de la pila local l C Comien%o del programa principal ent 1 l 3 Se sitBa SP ent > l : C"lculo de EP mst . Crea un nuevo mar7 stac7, para addlocal cup . l 2 Llamada al procedimento addlocal retp Jin del programa principal l 3F 9 ;amaAo de las variables globales l :F ? ;amaAo de la pila local q *6ndicador de comien%o del programa0 mst . Se crea el "rea de datos del programa principal cup . l C Se entra en el bloque del programa principal stp Para la interpretacin q *6ndicador de fin de programa0 1)> El cdigo objeto Kn par"metro de una subrutina se transfiere desde el bloque llamador cargando los valores o las direcciones de los par"metros en la pila, segBn el modo de acceso. Como esto se debe hacer tras la instruccin @mst@, que genera el "rea de par"metros impl#citos *mar7 stac70 de la nueva subrutina, los valores en realidad no se estar"n situando en la pila, sino que se situar"n directamente en el "rea de par"metros. <eremos algunos ejemplos en las siguientes secciones, dedicadas al cdigo P. El valor de retorno de una funcin ser" almacenado por sta en la posicin de su "rea de datos destinada a tal fin, que ser" la primera. 'l retornar de una funcin, el SP no se sitBa justamente donde estaba antes de la llamada, sino una posicin incrementada, con lo que en la cima de la pila quedar" almacenado el valor de retorno. 1)2 El cdigo objeto 5.2.- Repertorio e in!tru""ione!. El repertorio de instrucciones de la m"quina P consta de C. instrucciones, ! >2 procedimientos est"ndar. En este apartado se describe en detalle un subconjunto del repertorio, que es el utili%ado para generar el cdigo del prototipo. Para apro(imarse al repertorio completo cabr" remitirse a la bibliograf#a propuesta en el documento del P) *ver referencias bibliogr"ficas0. Las instrucciones constan de un mnemotcnico de tres letras, al que puede seguir un distintivo de tipo, ! cero, uno *D0 dos par"metros *P ! D0. <eamos algunos ejemplos5 adi 4 solamente el mnemotcnico equi 4 el mnemotcnico m"s un distintivo del tipo ldci 1 4 con un par"metro *D0 lodc . 9 4 con dos par"metros *P ! D0 lda . 9 4 con dos par"metros *P ! D0 ! sin el distintivo Las siguientes tablas muestras grupos de instrucciones clasificadas por tipos. Si se permite el uso de un distintivo de tipo, se aAadir" una L;L tras el mnemotcnico. Esto querr" decir que la ; se puede sustituir por alguna de estas letras, significando5 a direccin b lgico c car"cter i entero Los campos de las tablas se refieren a5 - 6nstruccin5 mnemotcnico, ! distintivo segBn el caso. Jormato de la instruccin. - P5 Significado del par"metro P *primero de los dos0 - D5 Significado del par"metro D *segundo si ha! dos, o primero si ha! uno0 - 'ccin5 operacin reali%ada por la instruccin. - Pila antes5 Iequerimiento de estado de la pila antes de la ejecucin. Se representa por un nBmero de letras que indica cuantos elementos debe haber en la cima ! de qu tipo. Kna L(L simboli%a cualquier tipo. - Pila despus5 Estado en el que queda la pila tras la instruccin. Kna letra significa que se ha depositado en la cima un elemento de ese tipo. 1)) El cdigo objeto -PEI'C6-8ES 'I6;$M;6C'S 68S;IKCC6N8 P D 'CC6N8 P6L' '8;ES P6L' =ESPKMS =ESCI6PC6N8 adi 4 4 SP5FSP41 store+SP/5Fstore+SP/Gstore+SPG1/ *i,i0 *i0 Suma dos enteros de la cima de la pila ! almacena el resultado en ella sbi 4 4 SP5FSP41 store+SP/5Fstore+SP/4store+SPG1/ *i,i0 *i0 Iesta mpi 4 4 SP5FSP41 store+SP/5Fstore+SP/Ostore+SPG1/ *i,i0 *i0 $ultiplicacin dvi 4 4 SP5FSP41 store+SP/5Fstore+SP/Pstore+SPG1/ *i,i0 *i0 =ivisin ngi 4 4 store+SP/5F4store+SP/ *i0 *i0 6nvierte el signo del entero de la cima de la pila inc; q *;Fi0 4 nQ de unidades de incremento store+SP/5Fstore+SP/GD *i0 *i0 6ncrementa en D unidades el elemento de la cima de la pila -PEI'C6-8ES LNR6C'S 68S;IKCC6N8 P D 'CC6N8 P6L' '8;ES P6L' =ESPKMS =ESCI6PC6N8 not 4 4 store+SP/5Fnot store+SP/ *b0 *b0 8egacin lgica del elemento de la cima and 4 4 SP5FSP41 store+SP/5Fstore+SP/ and store+SPG1/ *b,b0 *b0 Conjuncin ior 4 4 SP5FSP41 store+SP/5Fstore+SP/ or store+SPG1/ *b,b0 *b0 =is!uncin 1)? El cdigo objeto -PEI'C6-8ES IEL'C6-8'LES 68S;IKCC6N8 P D 'CC6N8 P6L' '8;ES P6L' =ESPKMS =ESCI6PC6N8 equ; nQ ; longitud si es ristra SP5FSP41 store+SP/5Fstore+SP/Fstore+SPG1/ *(,(0 *(0 Si el elemento de debajo la cima es igual al de la cima, pone true en la cima. sino, pone false geq; nQ ; longitud si ristra SP5FSP41 store+SP/5Fstore+SP/EFstore+SPG1/ *(,(0 *(0 Compara si es ma!or o igual grt; nQ ; longitud si ristra SP5FSP41 store+SP/5Fstore+SP/Estore+SPG1/ *(,(0 *(0 Compara si es ma!or leq; nQ ; longitud si ristra SP5FSP41 store+SP/5Fstore+SP/SFstore+SPG1/ *(,(0 *(0 Compara si es menor o igual les; nQ ; longitud si ristra SP5FSP41 store+SP/5Fstore+SP/Sstore+SPG1/ *(,(0 *(0 Compara si es menor neq; nQ ; longitud si ristra SP5FSP41 store+SP/5Fstore+SP/SEstore+SPG1/ *(,(0 *(0 Compara si es distinto 1)C El cdigo objeto C'IR' T =6IECC6-8'$6E8;- 68S;IKC C6N8 P D 'CC6N8 P6L' '8;ES P6L' =ESPKMS =ESCI6PC6N8 ldo ; q 4 despla%amiento en el primer marco de pila SP5FSPG1& store+SP]5Fstore+q] 4 *;0 Cargar contenido de la direccin del nivel base ldc ; q 4 nqF.& cqFord*ch0& en el resto qFposicin en la tabla de constantes. SP5FSPG1& pF. store+SP]5Fma(str& pF1 store+SP]5F q& pF2 store+SP]5F qF1& pFC store+SP]5F chr*q0& 4 *;0 Cargar constante lao q 4 direccin SP5FSPG1& store+SP]5Fq 4 *a0 Carga direccin del nivel base ind ; 4 nQ de unidades de almacenamiento ad5F store+SP]Gq& store+SP]5Fstore+ad] *a0 *;0 UBsqueda inde(ada. Se carga la pos q a partir de la direccin de la cima lod ; p q profundidad de anidamientoO despla%amiento ad5Fbase*p,$P0Gq& SP5FSPG1& store+SP]5Fstore+ad] 4 *;0 Carga el contenido de la direccin de nivel P lda p q profundidad de anidamientoO despla%amiento SP5FSPG1& store+SP]5Fbase *p,$P0Gq 4 *a0 Carga la direccin con nivel P lca q 4 direccin de la constante SP5FSPG1& store+SP]5Fq 4 *a0 Carga direccin de una constante OnQ de enlaces est"ticos a recorrer hasta llegar al "rea de datos deseada *. indica el "rea actual0. 1)3 El cdigo objeto 'L$'CE8'$6E8;- 68S;IKCC6N8 P D 'CC6N8 P6L' '8;ES P6L' =ESPKMS =ESCI6PC6N8 sro ; q 4 posicin de memoria donde almacenar store+q]5Fstore+SP]& SP5FSP41 *(0 4 'lmacena en la direccin q del nivel base el elemento de la cima. str ; p q profundidad de anidamientoO despla%amiento dentro del marco store+base*p,$P0Gq]5F store+SP]& SP5FSP41& *(0 4 'lmacena en el nivel P. sto ; 4 4 store+store+SP41]]5Fstore+SP]& SP5FSP4> *a,(0 4 'lmacenamiento indirecto OnQ de enlaces est"ticos a recorrer hasta llegar al "rea de datos deseada *. indica el "rea actual0. S'L;-S 68S;IKCC6N8 P D 'CC6N8 P6L' '8;ES P6L' =ESPKMS =ESCI6PC6N8 ujp q 4 valor de la etiqueta PC5Fq 4 4 Salto incondicional fjp q 4 valor de la etiqueta if store+SP]Ffalso then PC5Fq& SP5FSP41 4 4 Salto condicional ESPEC6'L 68S;IKCC6N8 P D 'CC6N8 P6L' '8;ES P6L' =ESPKMS =ESCI6PC6N8 csp 4 mnemotcnico del procedimiento est"ndar llama al procedimiento est"ndar correspondiente depende de los requerimientos de cada procedimiento depende del procedimiento Llama a un procedimiento est"ndar 1): El cdigo objeto PI-CE=6$6E8;-S T JK8C6-8ES 68S;IKCC6N8 P D 'CC6N8 C-$E8;'I6- =ESCI6PC6-8 mst p nivel del procedimiento llamador 4 nivel del procedimiento llamado G 1 4 store+SPG>]5Fbase *p0& store+SPG2]5F$P& store+SPG)]5FEP& SP5FSPG? enlace est"tico enlace din"mico salva EP los par"metros pueden ser ahora evaluados desde SPG1 Renera el mar7 stac7. La primera ve% es una e(cepcin cup p q nQ de ubicaciones para los par"metros direccin de comien%o del procedimiento $P5FSP4*pG)0& store+$PG)]5Fpc& pc5Fq salva la direccin de retorno salta a la dir. VqW de comien%o del procedimiento. Llamada a un procedimiento de usuario ent p q longitud de los segmentos que quedan en el marco de pila Si pF1 ent. q es el tamaAo requerido para las variables locales. Si pF> ent. q es el tamaAo de la pila local. if PF1 then begin SP5F$PGq& if SPE8P error *store overflo90 end else begin EP5FSPGq& if EPE8P error *store overflo90 end& colisin de pila ! heap colisin de pila ! heap Entrar en un procedimiento. Si pF1, se posiciona SP. Si pF>, se posiciona EP. ret ; SegBn sea ;5 VpWpF.& ViWpF1& VrWpF>& VcWpF2& VbWpF)& VaWpF?& 4 si pF. entonces SP5F$P41& si pF1,>,2,)? ent. SP5F$P& PC5Fstore+$P G)]& EP5Fstore+$PG2]& $P5Fstore+$PG>]& retorna de un procedimiento un proced. no retorna. result. retorna de una funcin res. de la func. en la pila local salto de retorno restaura EP enlace din"mico Ietorna de un procedimiento o funcin. stp 4 4 interpreting5Ffalse& es la Bnica forma de salir del intrprete Para la interpretacin 1)9 El cdigo objeto 1?. 5.#.- Pro$rama"i%n en "%i$o P. ?.2.1.4 E(plicacin de las instrucciones Se proporciona a continuacin una e(plicacin detallada del funcionamiento de las instrucciones m"s complejas, con ejemplos para una ma!or claridad. ?.2.1.1.4 6nstrucciones de carga ! almacenamiento en la pila5 Estas instrucciones sitBan un nuevo elemento en la cima de la pila. <eamos las principales caracter#sticas ! diferencias entre ellas. - L-=5 Carga el contenido de una direccin de memoria, de la que se especifica la base ! el despla%amiento. lod; p q X p5 es el nQ de enlaces est"ticos a seguir para encontrar la direccin base *pF. indica el procedimiento actual& pF1 es el que engloba a ste,...0. X q5 es el despla%amiento dentro del bloque. Ejemplo5 lodi . ? carga el entero de la posicin ? del bloque actual - L=-5 Carga el contenido de una direccin del nivel base *"rea de datos del programa principal0. Slo es necesario especificar la direccin, !a que sta es fija *la base es .0. Es la versin global de la instruccin L-=. ldo; q X q5 Es la direccin *absoluta0. Ejemplo5 ldoi 9 carga el entero situado en la posicin 9 del primer bloque - S;I5 'lmacena el elemento de la cima de la pila en la posicin de memoria especificada mediante base ! despla%amiento. str; p q X p5 nQ de enlaces est"ticos a recorrer para llegar a la direccin base. X q5 despla%amiento dentro del marco de pila. El cdigo objeto Ejemplo5 strc . ? almacena el car"cter de la cima en la pos ? de este nivel - SI-5 'lmacena en una direccin del nivel base. <ersin global de S;I. La direccin ser" absoluta. sro; q X q5 direccin dentro del primer marco de pila. Ejemplo5 sroi 9 almacena el entero de la cima en la pos 9 del nivel base. - L='5 Carga una direccin *la direccin en s#, no su contenido0, especificando la base ! el despla%amiento. lda p q X p5 como antes, indicador del nivel de profundidad. X q5 direccin a cargar, relativa al marco de pila indicado por p. Ejemplo5 lda 1 ? carga la direccin ? del proc. que engloba al actual. 8-;'5 Cabe destacar la diferencia entre cargar una direccin de memoria en s#, ! cargar un elemento que sea del tipo direccin. lda . ? carga la direccin ? del marco de pila actual. loda . ? carga el elemento almacenado en la pos. ?, que se trata de una direccin *cualquiera0. - L'-5 Carga una direccin absoluta. <ersin global de L='. lao q X q5 direccin absoluta. Ejemplo5 lao ? carga la direccin ? del nivel base *que es la del input0 1?> El cdigo objeto - S;-5 'lmacenamiento indirecto. Ruarda el elemento situado en la cima de la pila en la direccin que est" almacenada justo debajo de la cima *SP410. Por esto, antes de cargar en la pila el elemento que se desea almacenar, ser" necesario cargar la direccin de destino. La direccin destino puede ser absoluta o relativa. sto; Ejemplo5 stoi Suponiendo esta situacin previa de la pila, 1. dir 1,? ... el efecto de la instruccin ser" el de almacenar el entero *1.0 de la cima en la direccin ? del marco de pila del procedimiento que engloba al actual. - L=C5 Carga una constante. ldc; q X q5 es el valor de la constante a cargar. Ejemplos5 ldci 1 4 carga un 1. ldcc@'@ 4 carga el car"cter '. ldcb 1 4 carga el valor lgico verdadero ldcb . 4 carga falso. - 68=5 =ireccionamiento indirecto o bBsqueda inde(ada. Carga el elemento situado en la posicin q a partir de la direccin almacenada en la cima de la pila. ind; q X q5 es el nQ de unidades de memoria de despla%amiento. Ejemplo5 indi 2 1?2 El cdigo objeto Primeramente se e(trae la direccin de la cima ! se accede a ella. =espus se direcciona 2 posiciones adelante a partir de aqu#, ! se carga el elemento encontrado. Esta instruccin es de especial utilidad para el acceso a vectores o estructuras de datos complejas. - LC'5 Carga la direccin de una constante. La constante se encontrar" situada en el bloque de memoria destinado a las constantes. lca q X q5 es la direccin de una constante. Si en lugar de una direccin se proporciona un valor constante, el valor se sitBa en la %ona de constantes, ! se carga su direccin. Ejemplo5 lca@,ola mundo@ SitBa la ristra en la %ona de constantes, ! carga la direccin de su primer car"cter. Como se ha visto, se tienen las siguientes asociaciones5 X L-= 4 cargar elemento de direccin relativa. X L=- 4 cargar elemento de direccin global. X S;I 4 almacenar elemento de direccin relativa. X SI- 4 almacenar elemento de direccin global. X L=' 4 cargar direccin relativa. X L'- 4 cargar direccin absoluta. ?.2.1.>.4 6nstrucciones de control Estas instrucciones tienen un efecto sobre el control de la ejecucin del programa. - $S;5 Renera un nuevo Lmar7 stac7L, que corresponde a la parte de par"metros impl#citos del marco de pila. mst q X q5 se define como la e(presin5 nivel de anidamiento del procedimiento llamador 4 nivel del llamado G 1. 1?) El cdigo objeto Ejemplo5 Si estando en el programa principal *nivel .0 se desea llamar a un procedimiento anidado en l *nivel 10, el valor de q ser"5 q F . 4 1 G 1 F . ! la instruccin5 mst . - CKP5 Llama al procedimiento de usuario referenciado por la etiqueta q, con un nBmero de par"metros p. cup p q X p5 nQ de posiciones reservadas para el "rea de par"metros. X q5 etiqueta del procedimiento llamado. Ejemplo5 cup > L 1 4 sitBa el PC en la posicin de L1. Se reservan dos posiciones para los par"metros. - E8;5 Msta es una instruccin especial que tiene dos funciones. La primera es situar el valor de SP para el nuevo marco de pila, tras el "rea de variables locales. La segunda es situar EP al valor m"(imo que puede adquirir la pila local. ent p q X Si pF1, q es el tamaAo del mar7 stac7 G par"metros G variables locales. Si pF>, q es el tamaAo m"(imo de la pila local. Ejemplo5 Suponiendo que se trate del primer marco de pila, tenemos que el mar7 stac7 ocupa ? posiciones, ! luego le siguen ) de entrada salida. Suponiendo tambin que ha! declaradas dos variables locales, queda ;amaAo F ? G ) G > F 11 as# que se reservar"n las posiciones . 4 1.5 ent 1 1. ! SP adoptar" el valor de 1., !a que con cualquier instruccin que produ%ca una carga en la pila, se incrementar" antes SP. 'hora suponemos que el tamaAo m"(imo calculado en tiempo de compilacin para la pila local, teniendo en cuenta el efecto sobre la pila de las instrucciones generadas es de ), ent > ) 1?? El cdigo objeto 8-;'5 En la pr"ctica, los valores de q no ser"n conocidos en el momento en que se generan estas instrucciones, que es al inicio del procedimiento. 's# que se indica la direccin de una etiqueta, a la cual se le dar" valor al final del procedimiento. ent 1 L1 ent > L> ... L1 F 1. L> F ) - IE;5 Ietorna de un procedimiento o funcin. ret; Si ;F*i,c,b,a0 se deja en la pila el primer elemento del marco *valor de retorno0, que quedar" situado en la cima de la pila del marco inferior. Para ello se deber" almacenar antes el valor de retorno en esta posicin. Ejemplo5 lodi . . reti Si ;Fp, indica el retorno de un procedimiento, ! no se deja nada en la pila. Ejemplo5 retp ?.2.1.2.4 Procedimientos est"ndar El cdigo P cuenta con una amplia variedad de procedimientos est"ndar que reali%an funciones complejas mu! variadas. Sin embargo, para el prototipo solo son necesarios aquellos relacionados con la entrada ! salida de datos. Los procedimientos est"ndar son llamados mediante una instruccin especial CSP, que tiene como Bnico par"metro el mnemotcnico de tres letras que corresponda al procedimiento a llamar. Cada procedimiento requiere una situacin concreta en la pila antes de que se produ%ca la llamada& esto es, cada uno tendr" una lista de par"metros diferente. 'n"logamente, cada uno tendr" un efecto en la pila diferente, tras la ejecucin del procedimiento. 4 I=65 Procedimiento que se encarga de la lectura de un nBmero entero desde la entrada especificada. Los requerimientos de la pila suponen cargar primero la direccin destino de la lectura, ! la direccin de entrada de los datos. 1?C El cdigo objeto +cargar direccin destino/ +cargar direccin de entrada/ csp rdi La direccin de entrada puede ser una de las dos direcciones del nivel base reservadas para la entrada de datos5 la posicin ? para el teclado, ! la 3 para ficheros. Ejemplo5 lda . 9 lao ? csp rdi El nBmero entero recogido de la direccin de entrada del teclado se almacena en la posicin 9 del nivel actual. El efecto en la pila consiste en sacar los dos elementos de la cima *SP5FSP4>0. 4 I=C5 Es un procedimiento igual al anterior, pero destinado a la entrada de caracteres. lda . 9 lao ? csp rdc 4 IL85 Es tambin un procedimiento de entrada, slo que el elemento de entrada no se almacena. Simplemente se espera una pulsacin del teclado. Por lo tanto, no se especificar" ninguna direccin destino. lao ? csp rln El efecto en la pila ser" solamente decrementar la cima *SP5FSP410. 4 YI65 Procedimiento que se encarga de la salida de datos de tipo entero por la v#a de salida especificada. En la pila debe encontrarse el valor entero a imprimir, el nBmero de espacios destinado para la salida, ! la direccin de salida. +cargar elemento de tipo entero/ +cargar nQ de espacios/ +cargar direccin de salida/ csp 9ri La direccin de salida ser" una de las dos destinadas a tal fin. La primera es la direccin global C, ! es para la salida por pantalla. La segunda es la direccin :, destinada a la salida a ficheros. 1?3 El cdigo objeto Kn nBmero de espacios menor al nBmero de posiciones que ocupe el elemento supone un truncamiento del mismo por la derecha. Kn nBmero ma!or supone la alineacin a la derecha del elemento. Ejemplo5 lodi . 9 ldci 1 lao C csp 9ri El resultado es el de mostrar por pantalla el contenido de la direccin 9 del "rea de datos actual, en una sola posicin de la pantalla. El efecto que causa sobre la pila es el de sacar los tres elementos de la cima *SP5FSP420. 4 YIC5 'n"logo al anterior, pero destinado a la salida de elementos del tipo car"cter. lodc . 9 ldci 1 lao C csp 9rc 4 YIS5 'n"logo al anterior, pero para la salida de ristras de caracteres. Iequiere un par"metro adicional, que es la longitud de la cadena, situado en segundo lugar, tras la direccin del primer elemento de la cadena. +cargar la direccin del primer elemento de la cadena/ +cargar la longitud de la cadena/ +cargar el nBmero de espacios para la salida/ +cargar la direccin de salida/ Ejemplo5 lca@,ola mundo@ ldci 1. ldci 1. lao C Causa en la pila el efecto de decrementar la cima en cuatro unidades *SP5FSP4)0. 4 YL85 Procedimiento que env#a a la salida los caracteres de avance de l#nea ! retorno de carro. lao C csp 9ln El efecto sobre la pila consiste en decrementar la cima *SP5FSP410. 1?: El cdigo objeto ?.2.>.4 Los programas en cdigo P Los programas escritos en este lenguaje ensamblador constan de una serie de l#neas, que pueden ser comentarios, etiquetas, instrucciones, o marcas de ensamblado. Kn comentario consta de la letra LiL en la primera posicin de la l#nea, seguida de cualquier ristra de caracteres, e indicando que la l#nea completa ser" ignorada por el intrprete. La utilidad es e(clusivamente para el lector humano. Es comBn encontrar programas con un comentario cada die% instrucciones, indicando el nBmero de la instruccin. Por ejemplo5 i 1. Las definiciones de etiquetas constan de la letra LLL seguida de un nBmero, ! opcionalmente seguida del signo igual ! otro nBmero. L 1. L 1> F ) La primera forma corresponde a la direccin destino de un salto o una llamada. El segundo caso se utili%a en las instrucciones E8; de la forma descrita en el apartado anterior, ! lo que se hace realmente es reempla%ar la etiqueta por el valor numrico asignado a la misma. El formato de las instrucciones !a se ha descrito en los apartados anteriores. Las marcas de ensamblado consisten e(clusivamente en la letra LqL. Kn programa correctamente escrito en cdigo P tiene una estructura tal como sta5 +bloques de cdigo correspondientes a los procedimientos/ bloque de cdigo del programa principal bloque de llamada al programa principal El bloque de llamada al programa principal es est"ndar, salvo la etiqueta que referencia a la primera instruccin del bloque del programa principal5 q mst . cup . L ( stp q donde ( ser" el valor de la etiqueta que referencia al programa principal. 1?9 El cdigo objeto Esta porcin de cdigo ser" siempre lo primero que se ejecute, ! el efecto es el de crear el marco de pila especial del programa principal, ! situar el PC en la primera instruccin del programa. ;ras el retorno del programa principal, se ejecutar" la instruccin stp para indicar la finali%acin de la interpretacin. El bloque del programa principal tiene la siguiente estructura5 L ( ent 1 L (1 ent > L (> +cuerpo/ retp L (1 F !1 L (> F !> donde (, (1 ! (> son las etiquetas. !1 es el valor del par"metro q de la primera instruccin E8;, !> es el valor de q en la segunda. Como se e(plic con la instruccin E8;, estos valores ser"n calculados a partir de las instrucciones contenidas en el cuerpo. Los procedimientos de usuario pueden situarse en cualquier punto del cdigo, aunque los bloques de cdigo no pueden anidarse ni solaparse. La estructura de cada procedimiento ser" simplemente5 L ( ent 1 L (1 ent > L (> +cuerpo/ L (1 F !1 L (> F !> La instruccin de retorno deber" encontrarse accesible en algBn punto del cuerpo del procedimiento, para asegurar que se devuelve el control a la subrutina llamadora. Iecordemos que la instruccin de retorno de un procedimiento es, retp 1C. El cdigo objeto Para una funcin, ser" necesario cargar el valor de retorno en la posicin destinada a tal fin *la primera del marco de pila0, cargar un valor del tipo ; str; . . ret; La llamada a un procedimiento ser" de la forma, mst n +cargar los par"metros, si los ha!/ cup np L ( donde n es el par"metro q de la instruccin $S;, que recordemos que se define como el nivel de anidamiento del bloque llamador menos el del llamado m"s uno. np es el nBmero de par"metros, ! ( es el valor numrico de la etiqueta del procedimiento llamado. - =ireccionamiento de variables5 X <ariables globales5 Carga5 L=- 'lmacenamiento5 SI- X <ariables locales5 Carga5 L-= 'lmacenamiento5 S;I X Par"metro por valor5 P'S-5 lod; p q cup KS-5 Carga5 L-= 'lmacenamiento5 S;I 1C1 El cdigo objeto X Par"metro por referencia5 P'S-5 lda p q cup KS-5 Carga5 loda p q ind; . 'lmacenamiento5 loda p q +cargar valor a almacenar/ sto; X Constantes5 Carga5 L=C. 5.&.- E'emp(o!. Consideremos un breve ejemplo de la evolucin de la pila local, suponiendo un marco de pila de un procedimiento cualquiera, con una sola variable. La pila local comien%a a partir de la l#nea gruesa, justo despus de las variables. lodi . ? 4 carga la variable a, que est" en la posicin ?. :. 3. C. a ?. a ... ldci 2 4 carga la constante 2. :. 3. 2 C. a ?. a ... 1C> El cdigo objeto adi 4 suma los dos elementos de la cima, ! deposita el resultado en la cima. :. 3. C. a G 2 ?. a ... stri . ? 4 'lmacena el elemento de la cima en la variable a, que est" en la posicin ?. :. 3. C. ?. a G 2 ... ?.).1.4 -peraciones a0 'ritmticas5 a 5F a G 1 lodi . 9 ldci 1 adi stri . 9 o bien, lodi . 9 inci stri . 9 a 5F 4 a lodi . 9 ngi stri . 9 b0 Lgicas5 not a lodi . 9 not true and false ldcb 1 ldcb . and 1C2 El cdigo objeto c0 Ielacionales5 a F b lodi . 9 *a0 lodi . 1. *b0 equi d0 Saltos5 goto etiq1 ujp L 1 *etiq10 if false then goto L1 fjp L 1 ?.).>.4 Kn programa completo program var a,b: integer endvar procedure dividir parameter value r: integer endparam var q: integer endvar q:=0; while r>=b do r:=r-b; q:=q+1 endwhile; writeln(!ociente , q:", re#to , r:"$ endproc dividir read(a,b$; i% (a>0$ and (b>0$ then dividir(a$ endi% endprogram 1C) El cdigo objeto [bloque del procedimiento dividir] l 1 ent 1 l > = 6 SP:=6 ent > l 2 = 5 EP:=SP+5=11 ldci . Crg un ! stri . C lo lmcen en l po"6 #q$ l ) lodi . ? crg el contenido de l dir5 #r$ ldoi 1. crg l vrible globl % #b$ geqi r &= b ' fjp l ? "lt "i () *l"e en l cim +, lodi . ? crg r ldoi 1. crg b sbi r - b stri . ? lmcen en r lodi . C crg q ldci 1 crg 1 adi q + 1 stri . C lmcen en q ujp l ) "lt +6 l ? lca@Cociente @ crg l dir que punt l ri"tr ldci 9 crg % #long cden$ ldci 9 crg % #n. e"pcio"$ lda 1 C crg l dir de "lid por pntll csp 9rs llm /0S #imprimir ri"tr$ lodi . C crg en contenido de l dir6 #q$ ldci ) crg un 1 #n. e"pcio"$ lda 1 C crg l dir de "lid por pntll csp 9ri llm /02 #imprimir entero$ lca@ resto @ [igul que nte"] ldci 3 ldci 3 lda 1 C csp 9rs lodi . ? ldci ) lda 1 C csp 9ri lda 1 C crg l dir de "lid por pntll csp 9ln llm /+3 #vnce de l4ne$ retp retorno de dividir l >F C l 2F ? [*in del procedimiento dividir] 1C? El cdigo objeto [bloque del progrm principl] l C ent 1 l 3 = 1! SP:=1! ent > l : = 1 EP:=SP+1=11 lao 9 crg l dir% globl #$ lda . ? crg l dir de entrd por tecldo csp rdi llm 052 #entrd de entero$ lao 1. crg l dir1! #b$ lda . ? crg l dir de entrd por tecldo csp rdi llm 052 #entrd de entero$ ldoi 9 crg el contenido de l po"% #$ ldci . crg un ! grti & ! ' ldoi 1. crg el contenido de l po"1! #b$ ldci . crg un ! grti b & ! ' and conjuncin de lo" 6 elto" de l cim fjp l 9 "lt "i *l"o +11 mst . prepr el mr7 "tc7 de nivel ! #dividir$ ldoi 9 crg el 8nico pr9metro del proc #$ cup 1 l 1 llm dividir #+:$ con un pr9metro l 9 retp retorno del progrm principl l 3F 1. l :F ) [*in del progrm principl] [bloque de llmd l progrm principl] q mst . prepr el mr7 "tc7 e"pecil de nivel ! #progrm principl$ cup . l C llm l progrm principl #+;$ con ! pr9metro" stp pr l interpretcin q [*inl del progrm] 8-;'5 La escritura en letra cur"iv no pertenece al cdigo del programa. 1CC El cdigo objeto Los marcos de pila contenidos en la pila de marcos ser"n de la forma que se muestra en la figura. El primer marco corresponde al bloque del programa principal, ! el segundo al bloque del procedimiento dividir. . 1 > 2 ) ? C 3 : 9 1. 11 1> 12 1) J< SL =L EP IE i o prd prr a b mar7 stac7 locales pila local $P SP EP marco de pila 1 *del programa principal0 *1?G0 . 1 > 2 ) ? C 3 : 9 1. 11 J< SL =L EP IE r q mar7 stac7 pila local param local $P SP EP marco de pila > *del procedimiento dividir0 1C3 El cdigo objeto 1C: