Instrucciones Para Transferencia de Datos, Saltos y Subrutinas.

download Instrucciones Para Transferencia de Datos, Saltos y Subrutinas.

of 34

Transcript of Instrucciones Para Transferencia de Datos, Saltos y Subrutinas.

  • 4CONJUNTOS DE INSTRUCCIONES

    4.1. Introduccin

    En este captulo estudiaremos los distintos tipos de instrucciones de que constan los juegosde instrucciones de los ordenadores. Se vern con especial inters las instrucciones de controldel ujo del programa (bifurcaciones, bucles, procedimientos, etc.).

    Tambin se estudiarn los principios y losofa de diseo de los ordenadores con conjuntoreducido de instrucciones (RISC).

    4.2. Caractersticas generales de los conjuntos de instrucciones

    Ante el diseo de un nuevo ordenador de propsito general hay que plantearse la siguientecuestin: Qu tipos de instrucciones deben ser incluidos en su conjuntos de instrucciones?Antes de responder a esta pregunta, analizaremos las caractersticas que deben tener los juegosde instrucciones de las mquinas.

    Los conjuntos de instrucciones de las mquinas deben tender a poseer una serie de propie-dades, bastante ideales e imprecisas, que pueden resumirse en las siguientes:

    El conjunto de instrucciones de un computador debe ser completo en el sentido de quese pueda construir un programa para evaluar una funcin computable usando una can-tidad de memoria razonable y empleando un tiempo moderado, es decir, el nmero deinstrucciones de ese programa no debe ser demasiado elevado.

    Los juegos de instrucciones tambin tienen que ser ecientes, esto signica que las fun-ciones ms necesarias deben poder realizarse usando pocas instrucciones.

    El conjunto de instrucciones de una mquina debe ser regular, es decir debe ser simtrico(por ejemplo, si existe una instruccin de desplazamiento a la izquierda, debe haber otrade desplazamiento a la derecha, etc.) y ortogonal, es decir, deben poder combinarse, enla medida de lo posible, todos las operaciones con todos los tipos de datos y modos dedireccionamiento.

    83

  • 84 Conjuntos de instrucciones

    En muchas ocasiones, tambin se le debe exigir a un computador que su juego de instruc-ciones sea compatible con modelos anteriores.

    4.3. Tipos de instrucciones

    Una mquina puede llegar a funcionar con un juego de instrucciones muy limitado (re-curdese, por ejemplo, la mquina de Turing que slo tiene 4 instrucciones, incluso se handiseado mquinas tericas con menos instrucciones), esto simplicara mucho los circuitos dela mquina. Sin embargo, un conjunto de instrucciones demasiado simplicado origina, comoconsecuencia, unos programas demasiado complejos e inecientes. Es necesario encontrar uncompromiso entre la simplicidad del hardware y del software. Un mnimo para llegar a esecompromiso se consigue con los tipos de instrucciones siguientes:

    Instrucciones de transferencia de datos.

    Instrucciones aritmticas.

    Instrucciones lgicas.

    Instrucciones de control del ujo del programa (bifurcaciones, bucles, procedimientos,etc.)

    Instrucciones de entrada y salida.

    En los apartados siguientes iremos viendo con detalle algunos de estos tipos de instruccio-nes.

    Si bien es cierto que el conjunto de instrucciones debe de cumplir unos mnimos para con-seguir una mnima eciencia en los programas, tambin se ver que sta no se aumenta inde-nidamente al incrementar el nmero de instrucciones de la mquina.

    4.3.1. Instrucciones de transferencia de datos

    La operacin de copiar datos de un lugar a otro es la operacin ms simple y a la vez im-portante. Las palabras mover o cargar que aparecen en los juegos de instrucciones de muchosordenadores pueden dar lugar a confusin porque no se trata de mover o cargar sino de co-piar (generalmente, en Informtica, la palabra mover tiene el signicado de copiar borrando eloriginal). Las instrucciones de transferencia de datos necesitan que se especiquen el original(fuente u origen) y el lugar donde se desea la copia (destino). Esta especicacin variar segnsean estos lugares que pueden estar en tres sitios: registros del procesador, memoria o cima depila. Si el acceso es a una direccin de memoria habr que especicarla de forma explcita, sise trata de la cima de pila normalmente la especicacin ser implcita, lo mismo ocurrir si setrata del acumulador.

    Existen algunas variantes de instrucciones de transferencia de datos que dieren de la ideaanterior de copiar informaciones de un lugar a otro. Por ejemplo, la instruccin POP saca undato de la cima de pila modicando el valor del apuntador de pila, lo que signica que, si bien no

  • 4.3. Tipos de instrucciones 85

    destruye fsicamente el dato fuente, anula su validez. Por otro lado, la mayora de las mquinastambin disponen de instrucciones de intercambio (SWAP). Tambin, en muchas mquinas,existen instrucciones de transferencia de informacin entre bloques o cadenas en la que debenespecicarse las direcciones de fuente y destino y la longitud del bloque o cadena.

    En general, el dato a transferir podramos denirlo como una terna con las siguientes com-ponentes:

    Direccin

    Tipo

    Valor

    Normalmente la componente del dato que se transere es el valor pero existen instruccionesespeciales para transferir las dems componentes, en especial la direccin. La extraccin de ladireccin de un dato se hace necesaria para facilitar la relocalizacin de los programas. Paraaplicar muchos modos de direccionamiento (indexados, autoindexados, etc.) es necesaria latransferencia de una direccin a un registro. En muchos ordenadores esta direccin no se conocea la hora de compilar el programa (precisamente porque el programa es relocalizable), por tanto,son necesarias instrucciones que calculen la direccin de un dato para transferirla a un registro,actualmente la mayora de las mquinas poseen este tipo de instruccin bajo el nombre de moveaddress.

    Dependiendo del nivel de ortogonalidad de la mquina, podemos tener ms o menos instruc-ciones de transferencia. Por ejemplo el IBM-370 tiene ms de 20 instrucciones de transferenciapor su falta de ortogonalidad; sin embargo, el PDP-11 slo tiene 2 para datos enteros (MOV yMOVB) y 4 ms para datos en punto otante, ya que en las instrucciones de punto otante seprescindi bastante de la ortogonalidad por falta de espacio para la codicacin. El MC68000est en un punto intermedio, tiene varios formatos distintos dependiendo del direccionamientoutilizado. El Z-80 en cuanto a instrucciones de transferencia entre registros es bastante ortogo-nal, pero esa ortogonalidad se pierde cuando se trata de otros direccionamientos.

    4.3.2. Instrucciones aritmticas y lgicas

    Todos los ordenadores incorporan instrucciones aritmticas en sus juegos de instrucciones;la utilidad de este tipo de operaciones es evidente y no la comentaremos. En cuanto a las ope-raciones lgicas (AND, OR, NOT y XOR) tienen un uso muy variado: desde operaciones conbits individuales (TEST, SET, RESET y CHANGE) hasta el empaquetamiento y desempaque-tamiento de caracteres. Tambin pueden considerarse dentro de este grupo los desplazamientosy rotaciones cuya utilidad queda fuera de toda duda.

    En primer lugar, veremos cmo se emplean las instrucciones lgicas para realizar opera-ciones de bit individual. La utilidad de estas operaciones es muy variada, probablemente suaplicacin ms importante sea empaquetar en un byte varias variables booleanas, ocupandocada una de ellas un solo bit.

    Para analizar un determinado bit se debe tener en cuenta las siguientes propiedades de laoperacin AND (. o ):

  • 86 Conjuntos de instrucciones

    0 . . . 0 1 0 . . . 0 Mscara x . . . x a x . . . x Dato

    0 . . . 0 a 0 . . . 0Resultado = 0 si a = 0 Z = 1

    = 0 si a = 1 Z = 0

    Fig. 4.1. Anlisis de un bit.

    1 . . . 1 0 1 . . . 1 Mscara x . . . x x x . . . x Dato

    x . . . x 0 x . . . x

    Fig. 4.2. Puesta a 0 de un bit.

    1 x = x, x0 x = 0, x

    Para aplicarlas, se realiza una operacin AND del dato que se quiere analizar con una ms-cara que tenga un 1 en el lugar cuyo bit se quiere probar con el resto de la mscara a 0. Elresultado de la operacin ser 0 si el bit en cuestin es 0, o distinto de 0 si el bit que se quiereprobar es 1; por tanto, el resultado de la prueba quedar en el ag Z en forma complementadacomo se muestra en la gura 4.1. Muchas mquinas tienen esta operacin bajo el nombre deBIT TEST.

    Para poner a 0 un bit de un dato, se aprovechan las mismas propiedades del operador AND.Para aplicarlas, se construye una mscara que tenga a 1 todos los bits excepto el correspondienteal lugar que se quiere borrar que se pone a 0 y se hace un AND de esta mscara con el dato quese quiere tratar; como resultado de la operacin tendremos el mismo dato pero con el bit puestoa cero. El proceso se muestra en la gura 4.2. Esta operacin puede realizarse con varios bitsa la vez, basta poner en la mscara 0 todos los bits que se quieran borrar. Muchos ordenadoresposeen esta instruccin con el nombre de BIT CLEAR o BIT RESET.

    Para poner un bit a 1 en un dato, aplicaremos las propiedades de la operacin OR (+ o ):0 x = x, x1 x = 1, x

    En este caso, se construye una mscara con un 1 en el lugar del bit que se quiera poner a1 y 0 en el resto. Se realiza la operacin OR entre esta mscara y el dato y el resultado ser elmismo dato pero con el bit en cuestin puesto a 1 (gura 4.3). Esta operacin puede realizarsecon varios bits a la vez poniendo a 1 en la mscara todos los bits que se quieran poner a 1.Muchos ordenadores tienen esta operacin con el nombre de BIT SET.

    Para complementar bits en un dato aplicaremos las propiedades de la operacin OR exclu-sivo o XOR ():

  • 4.3. Tipos de instrucciones 87

    0 . . . 0 1 0 . . . 0 Mscara x . . . x x x . . . x Dato

    x . . . x 1 x . . . x

    Fig. 4.3. Puesta a 1 de un bit.

    0 . . . 0 1 0 . . . 0 Mscara x . . . x x x . . . x Dato

    x . . . x x x . . . x

    Fig. 4.4. Complemento de un bit.

    0 x = x, x1 x = x, x

    Para ello se construye una mscara con un 1 en el bit que se quiere complementar y 0 en elresto de las posiciones. Despus de hacer un XOR de la mscara con el dato se tendr el mismodato con el bit complementado (gura 4.4). Esta operacin tambin se puede hacer con variosbits a la vez poniendo a 1 en la mscara todos los bits que se quieran complementar. Algunasmquinas tienen esta operacin en su juego de instrucciones como BIT CHANGE.

    Otra utilidad de la operacin XOR es la determinacin de los bits diferentes que hay entredos datos, para ello se hace un XOR entre ellos y los lugares que queden a 1 son los bits dife-rentes entre los dos datos. Esto es debido a que la tabla de verdad de XOR es la complementariaa la de la igualdad entre dos bits. Esta propiedad tambin es til para determinar cundo dosdatos son iguales en todos sus bits: en este caso el OR exclusivo entre ellos nos dar 0 y, en ca-so contrario, tendremos un nmero no nulo; este resultado puede luego ser analizado medianteel ag Z. De aqu tambin se puede deducir que haciendo la operacin XOR de un operandoconsigo mismo el resultado da 0. Esta es una forma muy rpida de poner a 0 los registros enalgunos procesadores.

    Otra propiedad muy til del operador XOR es que si se opera dos veces con el mismooperando se regenera el dato inicial, es decir,

    (x y) y = x, x, y [4.1]Esta propiedad es til en aplicaciones grcas para mover cursores por pantalla.

    Una utilidad directa de las operaciones lgicas es el manejo de conjuntos tal y como se haceen el lenguaje Pascal. Supongamos el conjunto universal,

    U = {x0, x1, x2, . . . , xn1}Si A es un conjunto, contenido en este conjunto universal, puede representarse internamente enla memoria de la mquina mediante la cadena de n bits

    an1an2 . . . a1a0

  • 88 Conjuntos de instrucciones

    en que el valor del bit i indicar la pertenencia del elemento xi al conjunto A. En otras palabras,

    ai =

    1 si xi A

    0 si xi / A

    A partir de lo anterior resulta bastante evidente que la unin e interseccin de dos conjuntosvendr representada respectivamente por las operaciones OR y AND sobre sus cadenas de bits.De la misma forma el complemento de un conjunto se representa mediante la negacin de lacadena de bits que le corresponde.

    Mediante esta tcnica puede determinarse:

    La igualdad de dos conjuntos, analizando si sus cadenas de bits son iguales.

    La pertenencia de un elemento x a un conjunto A, realizando un test del bit correspon-diente a x en la cadena de bits que representa al conjunto A.

    Si un conjunto es vaco, analizando si su cadena de bits es nula.

    La inclusin de un conjunto A en otro B; esto podra hacerse analizando en un bucle sitodos los bits activados en la cadena correspondiente a A tambin lo estn en la cadenaque corresponde a B. Esto sera algo complicado en cuanto a la programacin y llevaraun tiempo de clculo desproporcionado. Sin embargo, se puede realizar la misma com-probacin de una forma ms simple aplicando alguna de las tres propiedades siguientes:

    A B A B = B, A B A B = A o A B A B =

    Evidentemente, comprobar cualquiera de estas propiedades se reduce a una operacinlgica y una comparacin, lo que resulta mucho ms simple que el procedimiento anterior.

    Curiosamente, la tarea de inicializar la cadena de bits correspondiente a un conjunto es mscomplicada que las operaciones sobre los conjuntos y depende de cada caso. Normalmente hayque construir una mscara individualizada para cada elemento con el n de poner a 1 los bitsque correspondan en la cadena.

    Dentro de las operaciones lgicas tambin deben considerarse los desplazamientos, quepueden denirse mediante la expresin

    di di+kdonde di representa a cada uno de los bits del operando y k es el nmero de lugares que sedesplaza. En funcin del signo de k, el desplazamiento puede ser a la izquierda (k negativo)o a la derecha (k positivo), donde se est suponiendo que los bits se numeran de derecha aizquierda.

    Los desplazamientos pueden ser de tres tipos: lgicos, aritmticos y rotaciones o desplaza-mientos circulares dependiendo del bit entrante. El desplazamiento lgico a la derecha dieredel aritmtico en que el bit entrante es, en ste ltimo, el mismo bit de mayor peso (bit de

  • 4.4. Instrucciones de control del ujo de programa 89

    R x y z tS 0 0 0 a

    x y z t R 1 1 0 1 Mscara

    x y 0 t 0 0 a 0 S desplazado

    x y a t

    Fig. 4.5. Empaquetamiento de caracteres.

    x y z t R 0 1 0 0 Mscara

    0 y 0 00 0 0 y Desplazado

    Fig. 4.6. Desempaquetamiento de caracteres.

    signo), mientras que en aqul es siempre un 0; As se consigue que los desplazamientos arit-mticos sean equivalentes a multiplicaciones (izquierda) y divisiones (derecha) por 2. En lasrotaciones el valor del bit entrante es el mismo que el del saliente.

    Una aplicacin en que se combinan muchas de las operaciones lgicas anteriores es el em-paquetamiento y desempaquetamiento de caracteres. Imaginemos la situacin mostrada en lagura 4.5 en la que tenemos, en un registro R, 4 caracteres x, y, z y t y que, en otro registroS, tenemos un carcter a que queremos que sustituya, por ejemplo, al carcter z. En primerlugar, efectuaremos una operacin AND entre el registro R y una mscara con 0 en los lugaresocupados por el carcter z y 1 en el resto, con lo que tendremos los caracteres x, y y t inal-terados y los lugares correspondientes al carcter z puestos a 0; despus slo quedar realizaruna operacin OR entre este resultado y el registro S desplazado convenientemente para que elcarcter a quede alineado con el carcter z que queremos sustituir. Una tcnica parecida se pue-de emplear para desempaquetar caracteres (gura 4.6): supongamos que del registro R originaldel ejemplo anterior queremos extraer el carcter y; para ello construiremos una mscara con 1en los lugares ocupados por el carcter y y 0 en el resto y luego haremos una operacin ANDentre esa mscara y el registro R. Despus slo tendremos que desplazar convenientemente elresultado para obtener el carcter deseado.

    4.4. Instrucciones de control del ujo de programa

    Las instrucciones de control de ujo son las que modican el secuenciamiento de la ejecu-cin de las instrucciones del programa. En general, el secuenciamiento es implcito, es decir,

  • 90 Conjuntos de instrucciones

    Fig. 4.7. Secuencia lineal de ejecucin de instrucciones.

    Fig. 4.8. Secuencia con puntos de discontinuidad en la ejecucin de instrucciones.

    la siguiente instruccin en ejecutarse es la que est fsicamente detrs en el programa. Cuandoesto no es as es por la accin de una instruccin de control de ujo.

    Todas las instrucciones que modican el ujo de la ejecucin manejan el contador de pro-grama. Tambin, si la modicacin del ujo de instrucciones se hace de forma condicional, estacondicin vendr dada por los bits de estado (N , Z, V y C). Vemos, por tanto, que para lasinstrucciones de control de ujo hay dos variables fundamentales: el contador de programa ylos bits de condicin.

    Las instrucciones de control de ujo suponen discontinuidades en la secuencia lineal deejecucin de las instrucciones (guras 4.7 y 4.8).

    4.4.1. Instrucciones de bifurcacin

    La mayora de los programas requieren de los ordenadores en que se ejecutan la capacidadde examinar datos y luego alterar la evolucin del programa en funcin de los resultados de esacomprobacin (gura 4.9); esto nos lleva a la necesidad de la existencia de instrucciones de saltoo bifurcacin que pueden ser de dos tipos: condicionales e incondicionales. Las bifurcacionesincondicionales se realizan siempre, mientras que las bifurcaciones condicionales se realizan ono en funcin del valor de uno o varios de los bits de estado o condicin, simblicamente, deforma general:

  • 4.4. Instrucciones de control del ujo de programa 91

    Fig. 4.9. Bifurcacin condicional.

    (Condicion)PC Direccion de bifurcacion;

    PC + +;

    En esta representacin, Condicion simboliza una expresin que involucra a uno o ms bits decondicin. Los bits de condicin ms usuales son:

    N : Bit que indica si el resultado de la ltima operacin ha sido negativo.

    Z: Bit que indica si el resultado de la ltima operacin ha sido cero.

    V : Bit que indica si en la ltima operacin hubo desbordamiento.

    C: Bit que indica si en la ltima operacin se produjo acarreo o llevada.

    Algunas mquinas incluyen otros bits de estado adicionales.

    Es importante distinguir la diferencia entre los bits C y V : mientras C indica que ha habidollevada en el bit de orden ms alto, V seala que el resultado de una operacin tiene demasiadosbits para ser representado. En las operaciones realizadas en binario natural ambos conceptoscoinciden, sin embargo, en aritmtica de complemento a 2 son conceptos diferentes ya que lallevada en el bit de orden ms alto no es, en este caso, una situacin incorrecta y se produce conmucha frecuencia sin que haya desbordamiento.

    Veremos a continuacin cmo se realiza la deteccin de desbordamiento para dar el valorcorrecto al bit V . La operacin que puede dar ms problemas de desbordamiento es la suma(o derivados, como, por ejemplo, el incremento). En principio, el desbordamiento se produce,en una operacin en complemento a 2, cuando se suman dos operandos del mismo signo y elresultado de la suma es de signo contrario. Esto se origina porque, al desbordarse la capacidaddel registro, se invade el bit de signo; por otra parte, no habr peligro de desbordamiento si sesuman dos operandos de signo contrario ya que, si ambos operandos caben en un registro sudiferencia tambin cabr. Estas observaciones nos llevan a dar valor al bit V por una de lassiguientes ecuaciones lgicas:

    V = (S1 S2).(S1 SR)

    V = SR S1 S2 + SR S1 S2

    [4.2]

  • 92 Conjuntos de instrucciones

    Tabla 4.1. Tabla de verdad de la suma para el bit de signo.

    Entradas Salidasxn1 yn1 cn1 cn sn1 V

    0 0 0 0 0 00 0 1 0 1 10 1 0 0 1 00 1 1 1 0 01 0 0 0 1 01 0 1 1 0 01 1 0 1 0 11 1 1 1 1 0

    En estas ecuaciones S1, S2 y SR son, respectivamente, los signos de ambos operandos y delresultado.

    Esta forma de detectar el desbordamiento tiene el inconveniente de que involucra a dema-siadas variables. Vamos a tratar de encontrar otro mtodo que nos lleve a una ecuacin mssimple. Para ello partiremos de la tabla de verdad de la suma que se muestra en la tabla 4.1.Aplicando esta tabla al bit de signo (bit de orden n 1), que en las operaciones en comple-mento a 2 se trata igual que los dems, se puede deducir de lo anterior, que en las las de latabla donde los dos sumandos (xn1 e yn1) sean iguales y el resultado (sn1) sea diferentetendremos desbordamiento (V = 1). De la tabla podemos deducir que el valor del bit V vienedado por:

    V = xn1yn1cn1 + xn1yn1cn1

    Esto podra ser una forma de determinar por hardware la existencia de desbordamiento; sinembargo, a la vista de la tabla, puede deducirse que se produce desbordamiento si la llevadaentrante al bit de signo es diferente de la saliente, es decir:

    V = cn1 cnEsta ecuacin es ms simple que la anterior para detectar el desbordamiento por hardware.

    Este mtodo tiene, adems, la ventaja de que tambin es vlida para otras operaciones como,por ejemplo, los desplazamientos.

    En cuanto al posicionamiento de los dems bits de estado, es bastante simple: N y C sedetectan directamente a partir de la unidad aritmtica y Z se consigue mediante una puertaNOR cuyas entradas sean todos los bits del resultado.

    Los conjuntos de instrucciones de las mquinas suelen facilitar instrucciones auxiliares paraposicionar los bits de estado sin alterar el resto de los registros de la mquina, estas instruccio-nes son (compara con 0) y (compara dos nmeros restndolos). Suele ser convenienteutilizar estas instrucciones inmediatamente antes de las instrucciones de bifurcacin condicio-nal, ya que si, entre las instrucciones de comparacin y las de bifurcacin, se insertan otrasinstrucciones los bits de estado cambiarn y la comparacin quedar sin efecto. Hay que sea-lar que en algunos procesadores RISC (por ejemplo, SPARC) la mayora de las instrucciones

  • 4.4. Instrucciones de control del ujo de programa 93

    Fig. 4.10. Iteraciones.

    no cambian los ags, slo los cambian instrucciones especcas. Esto es as porque, en este tipode procesadores, es frecuente tener que cambiar el orden de ejecucin de las instrucciones. Enestos procesadores no es necesario que las instrucciones de comparacin estn inmediatamenteantes que las de bifurcacin.

    Atendiendo al modo de direccionamiento utilizado para expresar la direccin de continua-cin de la ejecucin, las bifurcaciones pueden ser absolutas y relativas. Son bifurcacionesabsolutas aqullas en que se especica la direccin de la instruccin donde debe continuar laejecucin del programa, normalmente, a este tipo de bifurcaciones se les denomina saltos. Sellaman bifurcaciones relativas a aqullas en que se especica la diferencia entre el nuevo valordel contador de programa, es decir la direccin donde debe continuar la ejecucin, y su valoractual. Simblicamente una bifurcacin relativa funcionara as:

    (Condicion)PC PC + Desplazamiento;

    PC + +;

    En las mquinas en que las instrucciones deben estar obligatoriamente alineadas, el despla-zamiento suele multiplicarse por el tamao de la palabra bsica de instruccin para permitirrangos mayores en este tipo de bifurcaciones. Las bifurcaciones relativas facilitan la relocaliza-cin de los programas, por ello deben utilizarse siempre que sea posible.

    4.4.2. Iteraciones

    Es muy frecuente que se necesite ejecutar un grupo de instrucciones cierto nmero de veces(gura 4.10), por ello, la mayora de las mquinas tienen instrucciones especcas para ello.Un mtodo para realizar iteraciones se basa en poner un valor inicial en un registro para luegopasar a ejecutar el cdigo de la iteracin, la ltima instruccin del bucle actualizar el valor delregistro y comprobar si se cumple la condicin de terminacin, si es as se ejecutar la siguienteinstruccin y si no se comienza una nueva iteracin. Esta forma de actuar se caracteriza porhacer la comprobacin de la condicin al nal del bucle por lo que ste se ejecuta una vez comomnimo en todos los casos, incluso aunque la condicin de terminacin se cumpla antes de

  • 94 Conjuntos de instrucciones

    Fig. 4.11. Llamada a un procedimiento.

    entrar. Se puede analizar tambin la condicin al principio del bucle pero esto emplea algunasinstrucciones ms. En lenguaje mquina lo que se suele hacer es poner en un registro el nmerode veces que se debe iterar, antes del comienzo del bucle. Al nal del bucle se decrementael registro y se compara con 0: si es 0 se contina con la siguiente instruccin y si no, seejecuta otra vez el bucle desde el comienzo. Normalmente, la mayora de las mquinas tienenalguna instruccin para realizar estas dos ltimas operaciones con una sola instruccin (en el PDP-11, y otras en el VAX, en el Z-80, en el 8086, etc.). Muchasmquinas, adems de las instrucciones para implementar bucles, tienen tambin instruccionespara realizar operaciones con bloques y cadenas, lo que evita la ejecucin de muchos bucles.

    4.4.3. Procedimientos

    La tcnica principal para estructurar programas es el uso de procedimientos que, segn ellenguaje, tambin se llaman subprogramas, subrutinas o funciones. Desde el punto de vistade la mquina, una llamada a un procedimiento altera el ujo de instrucciones como un salto conla diferencia importante de que el procedimiento devuelve el control a la instruccin siguientea la llamada una vez que se ha concluido (gura 4.11). Sin embargo, desde el punto de vistade un programador de lenguaje de alto nivel, la llamada a un procedimiento puede considerarsecomo la ejecucin de una instruccin de otro nivel; desde este punto de vista, una llamada aun procedimiento puede considerarse como una simple instruccin, aunque pueda ser bastantecomplicada.

    Deniremos un procedimiento como una secuencia de instrucciones que realiza una tareay a la que se puede llamar desde diversos puntos del programa.

    Uno de los problemas planteados por los procedimientos es el retorno a la siguiente instruc-cin a la llamada: debe tenerse previsto un lugar seguro para guardar la direccin de la siguienteinstruccin (direccin de retorno) ya que, al pasar el control al procedimiento, esta direccindesaparece del PC. Puede haber diversas soluciones: la ms elemental es reservar un registro odireccin de memoria para guardar la direccin de retorno; este mtodo tiene el inconvenientede que, si el procedimiento llamara a otro (anidamiento), esta llamada hara que se perdiera ladireccin de retorno de la primera. Una mejora de este mtodo consiste en que la instruccinde llamada a procedimiento almacene la direccin de retorno en la primera palabra del proce-dimiento, estando la primera instruccin ejecutable en la palabra siguiente; el procedimiento

  • 4.4. Instrucciones de control del ujo de programa 95

    podra retornar mediante una instruccin de salto con direccionamiento indirecto a la primerapalabra del procedimiento. Con este mtodo, el procedimiento podra llamar a otros, ya quecada uno tiene sitio para una direccin de retorno. Si el procedimiento se llamara a s mismo(recursin), este esquema fallara ya que la segunda direccin de retorno destruira a la pri-mera. La recursin es una caracterstica muy importante por lo que este mtodo no se emplea.Tampoco sera vlido este esquema para la recursin indirecta, es decir en el caso de que unprocedimiento A llamara a otro B y ste llamara a su vez a A.

    La mejor solucin al problema de la direccin de retorno, y por otra parte la ms frecuente,es guardar la direccin de retorno en una pila antes de efectuar el salto al procedimiento; cuandoel procedimiento concluya sacar la direccin de retorno de la pila y la pondr en el registrocontador de programa. Este mtodo no plantea ningn problema a la hora de la recursin ya quesalva la direccin de retorno por encima de las anteriores, evitando su destruccin. Un problemasimilar se plantea para guardar el estado del procesador que est materializado en sus registros;stos tambin deben guardarse en la pila, pero existen dos variantes en cuanto al momento dehacerlo: puede ser el programa que llama el que guarde los registros (caller-saving) o puedeser el procedimiento llamado quien lo haga (called-saving). Existe una solucin intermediaproporcionada por algunas arquitecturas en que no hay que aadir instrucciones para guardar losregistros puesto que la misma instruccin de llamada lo hace, este es el caso de la arquitecturaVAX en que la primera palabra del procedimiento indica los registros que el procedimiento usay la instruccin de llamada los guarda.

    Otros problemas planteados por los procedimientos son el paso de parmetros y el alma-cenamiento de sus variables. Estos problemas se resuelven reservando en la pila lugar tambinpara los parmetros y las variables. Toda la informacin que se almacena en la pila cuando sellama a un procedimiento se llama trama de pila o registro de activacin del procedimien-to. Podran arbitrarse otras soluciones para el paso de parmetros y el almacenamiento de lasvariables del procedimiento (por ejemplo almacenarlas en registros) pero estos mtodos no fun-cionan correctamente para procedimientos recursivos (la mayora no lo son, y estos mtodospueden emplearse). En los procesadores con ventanas de registros s que pueden almacenarselos parmetros y variables del procedimiento en registros, aunque sean recursivos, ya que lasventanas hacen la funcin de la pila.

    Si se guarda demasiada informacin en la trama de pila de los procedimientos resulta conve-niente disponer de algn apuntador auxiliar para referirse a las informaciones de la trama de pilasin recurrir al apuntador de pila. Incluso existen computadores que poseen varios apuntadorespara estructurar la informacin de la trama de pila. La misin esencial de este tipo de apunta-dores es aportar la posibilidad de direccionar los argumentos y las variables del procedimientomediante desplazamientos referidos al apuntador (que apunta a un lugar jo de la trama de pilade cada procedimiento). Este apuntador suele llamarse apuntador de trama (frame pointer,FP ). Con todos estos condicionantes la trama de pila tomar la forma de la gura 4.12.

    La secuencia de operaciones realizadas para llamar a un procedimiento (secuencia de lla-mada) es la siguiente:

    1. El programa que llama al procedimiento reserva en la pila lugar para los argumentos.

    2. La instruccin de llamada guarda en la pila la direccin de retorno y tambin se guarda elvalor del apuntador de trama del procedimiento anterior.

  • 96 Conjuntos de instrucciones

    Fig. 4.12. Trama de pila de dos procedimientos anidados.

    3. El procedimiento reserva en la pila lugar para sus variables.

    Debe observarse que el orden de esta secuencia de acciones no puede alterarse y este ordenes el que causa el aspecto de la trama de pila (gura 4.12). Hay que tener tambin en cuentaque en algn momento tambin habr que guardar los registros del procesador (esto no estrepresentado en la gura 4.12).

    En el momento del retorno se liberar el espacio ocupado en la pila por el procedimiento yse cargar el contador de programa con la direccin de retorno guardada en la pila. Asimismose restaurar el contenido de los registros.

    La estructuracin de los programas exige muchas llamadas a procedimientos lo que hacede ellas uno de los puntos ms crticos a la hora de mejorar el rendimiento de la mquina; estohace que sea conveniente que las operaciones anteriores se realicen de la forma ms ecienteposible.

    Una alternativa para mejorar la velocidad en las llamadas a procedimientos consiste en ex-pandir el cdigo del procedimiento en el lugar donde ocurre la llamada. Este mtodo, que esempleado a veces por algunos compiladores, se denomina integracin del procedimiento oprocedimiento en lnea y puede usarse all donde el tiempo de ejecucin sea crtico. Sin em-bargo el mtodo tiene el inconveniente de que aumenta el espacio de memoria necesario para elcdigo, por ello puede ser una buena alternativa para procedimientos cortos.

  • 4.4. Instrucciones de control del ujo de programa 97

    Fig. 4.13. Flujo de instrucciones en una llamada a procedimiento (a) y entre corrutinas (b).

    Fig. 4.14. Corrutinas.

    4.4.4. Corrutinas

    En la secuencia ordinaria de llamada a procedimiento la distincin entre el procedimientoque llama y el llamado es clara. Consideremos el caso de dos procedimientos que se llamenmutuamente. A primera vista esta situacin se podra considerar simtrica. La asimetra procededel hecho de que, cuando se pasa el control del procedimiento que llama al procedimientollamado, ste comienza a ejecutarse desde el principio; sin embargo, cuando se produce elretorno, la ejecucin del procedimiento que hizo la llamada sigue en la instruccin siguiente.Si se llamara ms veces al procedimiento, ste comenzara a ejecutarse nuevamente desde elprincipio (situacin mostrada en la gura 4.13 (a)). La asimetra se acenta si analizamos elproceso llevado a cabo a nivel mquina: en el momento de la llamada el valor del contador deprograma pasa a la pila y cuando el procedimiento retorna el proceso es justamente el contrario;adems las instrucciones que realizan ambas funciones son distintas. En algunas ocasiones estil tener dos procedimientos que se llamen el uno al otro como un procedimiento (sin retorno)sin comenzar la ejecucin desde el principio (gura 4.13 (b)). Dos procedimientos que llamen

  • 98 Conjuntos de instrucciones

    uno a otro de esta forma se denominan corrutinas (gura 4.14). La forma de llevar a cabo en laprctica una llamada a una corrutina es intercambiar los contenidos del contador de programay de la cima de pila, sin variar el apuntador de pila, ya que se saca un dato de la pila para meterotro; de esta forma se intercambia el control entre las dos rutinas.

    4.4.5. Desvos o excepciones (traps)

    Un desvo es un tipo especial de llamada automtica a procedimiento iniciada por algunacondicin debida al programa.

    Hay que decir que la nomenclatura de la literatura tcnica cambia mucho de unos fabricantesa otros de forma que unos llaman excepciones a lo que otros llaman interrupciones e inclusoalgunos llaman a ambas cosas de la misma forma. Aqu trataremos de dar ms importancia alos conceptos que a los nombres.

    Los desvos normalmente se deben a condiciones importantes aunque no muy frecuentes.El caso ms usual es la condicin de desbordamiento en operaciones aritmticas (TRAPV). Sidespus de una operacin se produce desbordamiento el microprograma lo detecta y bifurca auna rutina de tratamiento de ese error. Usar esta tcnica es ms rpido que hacer una bifurca-cin explcita en funcin de V despus de cada instruccin aritmtica ya que la direccin debifurcacin es siempre la misma y el anlisis de la condicin, en el caso del desvo, lo realizaautomticamente el microprograma despus de cada instruccin aritmtica.

    Tambin provocan desvos la divisin por 0, la lectura de un cdigo de operacin indenido,el acceso a una palabra mal alineada en los ordenadores en que la alineacin es obligatoria, etc.Otro tipo de desvos se producen por causas debidas al sistema operativo tales como faltas depgina, errores de proteccin de segmentos, etc. Tambin pueden existir desvos para funcionesde depuracin como puntos de ruptura, ejecucin paso a paso, etc.

    Los desvos son recuperables si, despus de tratarse con la rutina de excepcin adecuada,la ejecucin puede continuar en la siguiente instruccin, y son no recuperables si la ejecucindel programa tiene que detenerse; en este caso, habitualmente, se devuelve el control al SistemaOperativo de la mquina.

    Un problema de los desvos es encontrar la direccin del procedimiento, llamado rutinade tratamiento de excepcin. La va mas usual de obtener esta direccin es la vectorizacinque consiste en numerar todas las causas de desvo y tener una tabla en memoria con todas lasdirecciones de las rutinas de tratamiento; estas direcciones se denominan vectores y a la tablaanterior se la denomina tabla de vectores de excepcin. Si la tabla de vectores comienza enuna direccin A y cada vector ocupa t palabras, la direccin correspondiente a la excepcin nvendr dada por:

    Direccin de la rutina de tratamiento del desvo n = (A + nt)

    En esta expresin el parntesis denota el contenido de la direccin de su interior. El clculolo realiza internamente el procesador cada vez que se produce una excepcin, normalmente esun clculo rpido ya que las constantes A e t facilitan la tarea: normalmente t es una potenciade 2 y A muchas veces es 0, por lo que la operacin se reduce a un desplazamiento.

  • 4.4. Instrucciones de control del ujo de programa 99

    4.4.6. Interrupciones

    Las interrupciones son llamadas automticas a procedimiento no debidas al programa sinoa una causa exterior.

    La diferencia entre las interrupciones y los desvos es que stos son provocados por el mis-mo programa mientras que las interrupciones son provocadas por causas externas de formatotalmente asncrona.

    Normalmente las causas de interrupcin estn relacionadas con las operaciones de entraday salida. Una interrupcin detiene el programa en curso y transere el control al procedimien-to de tratamiento de la interrupcin denominado rutina de servicio de interrupcin; cuandoesta rutina concluye se debe devolver el control al proceso interrumpido que debe continuar suejecucin en el mismo estado en el que estaba cuando se produjo la interrupcin. Esto signicaque se deben salvar el estado del procesador (es decir el contenido de los registros) antes decomenzar la ejecucin de la rutina de servicio y restaurarse al nalizar sta.

    Las interrupciones son necesarias cuando las entradas o salidas pueden desarrollarse en pa-ralelo con la ejecucin de instrucciones en el procesador. Esto normalmente es as debido aque, mientras un dispositivo de entrada/salida efecta una sola operacin, el procesador puedeejecutar muchas instrucciones convencionales. Los sistemas de interrupciones permiten que laCPU funcione concurrentemente con los dispositivos de entrada y salida, siendo las interrup-ciones el sistema de comunicaciones entre ambos procesos para que el procesador sepa cuandoel dispositivo de entrada/salida ha concluido.

    El mecanismo de vectorizacin descrito en el apartado anterior tambin es vlido para en-contrar la direccin de la rutina de servicio de interrupcin. En las interrupciones la diferenciaradica en que el nmero de la interrupcin lo manda el propio dispositivo a travs del bus dedatos.

    4.4.7. Instrucciones de control de ujo en el VAX

    En este apartado estudiaremos un caso concreto de instrucciones de control de ujo: lascorrespondientes al VAX (Baase, 1983). Esta mquina tiene diversas clases de instrucciones decontrol de ujo:

    Instrucciones de bifurcacin

    El VAX tiene dos instrucciones de bifurcacin incondicional: y ; ambas instruccio-nes se diferencian slo en el tamao del desplazamiento (1 o 2 bytes): para bifurcaciones enque la direccin de destino se encuentre cerca de la direccin actual (menos de 128 bytes) seemplea , en caso contrario se emplea . En cuanto a las bifurcaciones condicionales todastienen un desplazamiento de 8 bits, esto limita algo su uso y obliga en ocasiones a emplear unaprogramacin menos estructurada en las bifurcaciones condicionales ya que es necesaria la ins-truccin . En las instrucciones de bifurcacin del VAX slo se especica el desplazamiento,sin el byte de especicacin de operando convencional en la forma modo-registro. Tambinexisten instrucciones especcas para bifurcar en funcin del valor del bit de orden ms bajode un operando (, branch if low bit set y , branch if low bit clear: bifurcar si el bit

  • 100 Conjuntos de instrucciones

    Tabla 4.2. Instrucciones de bifurcacin condicional en el VAX.

    Nemnico Nombre (Bifurcar si...) Condicin igual Z = 1 distinto Z = 0 mayor N = 0 Z = 0 menor o igual N = 1 Z = 1 mayor o igual N = 0 menor N = 1 mayor C = 0 Z = 0 menor o igual C = 1 Z = 1 mayor o igual C = 0 menor C = 1 V activado V = 1 V desactivado V = 0 C activado C = 1 C desactivado C = 0 bit 0 activado bit 0 desactivado

    de orden ms bajo es 1 0 respectivamente), en estas instrucciones, adems del destino de labifurcacin, hay que especicar el operando en que se analiza el bit en cuestin.

    En la tabla 4.2 puede verse un resumen de las instrucciones de bifurcacin condicional delVAX. Los nemnicos terminados en corresponden a condiciones sobre nmeros en binarionatural (sin signo) y las restantes a condiciones sobre nmeros en complemento a 2 (con signo).

    Existe una instruccin de salto incondicional (: jump, salto). La diferencia entre estainstruccin y las bifurcaciones incondicionales reside en que en se puede usar cualquiermodo de direccionamiento para la direccin de destino y sin embargo en las instrucciones debifurcacin esa direccin especica siempre mediante un desplazamiento.

    Instrucciones para el control de iteraciones

    En el VAX existen diversas instrucciones para el control de iteraciones, unas se basan enel decremento del ndice (xxx: subtract one and branch if xxx, restar uno y bifurcar sise cumple la condicin xxx) y otras en su incremento (xxx: add one and branch if xxx,sumar uno y bifurcar si se cumple la condicin xxx). Existe tambin una instruccin (x:add, compare and branch, sumar, comparar y bifurcar) que permite un incremento diferente de1 que, adems, puede ser tanto positivo como negativo e incluso no entero. En la tabla 4.3 semuestran las instrucciones de control de iteraciones del VAX.

    Llamadas a subrutinas y procedimientos

    En el VAX se puede distinguir entre llamadas a subrutinas y llamadas a procedimientos: ladiferencia estriba en que una llamada a subrutina simplemente guarda la direccin de retorno en

  • 4.4. Instrucciones de control del ujo de programa 101

    Tabla 4.3. Instrucciones para el control de iteraciones del VAX.

    Nemnico Operandos Operacin ndice, destino if (indice>0)goto destino; if (ndice>=0)goto destino; lmite, ndice, destino if (++ndice

  • 102 Conjuntos de instrucciones

    Fig. 4.15. Lista de argumentos de un procedimiento en un VAX.

    no.

    Ejemplo 4.1: Supongamos que tenemos una lista con tres argumentos con uno de ellos noconocido en el momento de escribir el programa. La lista de argumentos tendra la forma:

    En el programa, si la direccin desconocida es producto de un clculo cuyo resultadoqueda, por ejemplo, en R3, sencillamente pondremos

    Tanto si la llamada a procedimiento se realiza con ! como con ! la lista de argu-mentos tiene la forma mostrada en la gura 4.15. La diferencia entre ambos casos radica en quela lista de argumentos en el caso de ! reside en la pila y en el caso de ! en cualquierlugar de memoria. En los dos casos el registro AP apunta al comienzo de la lista de argumentos.Tambin existe la diferencia en cuanto a la forma de construir la lista de argumentos: mientrasen el caso de ! los argumentos se ponen mediante las instrucciones "#$ y "#$x y elnmero de parmetros lo pone la misma instruccin ! (porque es uno de sus operandos),en el caso de !, la lista la construye el usuario incluyendo el nmero de parmetros. Desdeel punto de vista del procedimiento no inuye que la llamada se haya realizado mediante !o !. De hecho un mismo procedimiento puede llamarse de las dos formas (salvo que searecursivo). En ambos casos se hace referencia a los argumentos a travs del apuntador de argu-mentos (AP ): %&"' el primero, (&"' el segundo, etc. si los argumentos se pasan por valor o)%&"' el primero, )(&"' el segundo, etc. si se pasan por referencia.

    La trama de pila para las llamadas a procedimientos del VAX se muestra en la gura 4.16.Los pasos necesarios para estas llamadas son los siguientes:

  • 4.4. Instrucciones de control del ujo de programa 103

    Fig. 4.16. Trama de pila de un procedimiento en el VAX.

    1. Alinear la pila a doble palabra. Esto se consigue poniendo a 0 los dos ltimos bits delapuntador de pila. El valor anterior de estos bits se guarda en un almacenamiento inter-medio.

    2. Salvar el contenido de los registros comprendidos en la mscara situada en la primerapalabra del procedimiento. Esta mscara la construye el compilador. En lenguaje ensam-blador los registros que se deben salvar antes de entrar en el procedimiento se ponen en eldirectivo . A partir de esta informacin el ensamblador construye la mscara. Porejemplo, si un procedimiento altera los registros R2 y R3 en su cabecera pondremos:

    Nombre del procedimiento,

    3. Guardar en la pila los registros PC (contador de programa), FP (apuntador de trama) yAP (apuntador de argumentos).

    4. Guardar en la pila la PSW (palabra de estado), la mscara de registros salvados, losdos bits menos signicativos del apuntador de pila (SP ), antes de alinearlo, y un bit queindica si la llamada se ha efectuado con (0) o (1).

    5. Poner a 0 la palabra de estado.

  • 104 Conjuntos de instrucciones

    6. Poner una doble palabra con 0 en la pila.

    7. Copiar el apuntador de pila (SP ) en el apuntador de trama (FP ).

    8. Poner la direccin de la lista de argumentos en el registro AP (apuntador de argumentos).En el caso de esta direccin es uno de los operandos; sin embargo, en el caso de, antes de salvar los registros (paso 2), se salva el nmero de argumentos y, enese momento, el SP es almacenado en un registro temporal para depositarlo ahora en elregistro AP .

    9. Cargar la direccin del procedimiento + 2 en el contador de programa (el hecho de sumardos a la direccin del procedimiento se debe a que la primera palabra del procedimientoes la mscara de registros).

    De forma anloga los pasos realizados por la instruccin (retorno de procedimiento) sonlos siguientes:

    1. Copiar en SP el contenido de FP + 4. Esto elimina todas las informaciones puestas enla pila despus de la trama del procedimiento (variables o informaciones apiladas que nose han eliminado antes).

    2. Salvar la cima de pila (PSW , mscara de registros, etc) en un almacenamiento interme-dio.

    3. Restaurar los registros AP , FP y PC.

    4. Restaurar los registros de uso general a partir de la mscara guardada en el almacena-miento intermedio.

    5. Se restauran los bits ms bajos del SP (del almacenamiento intermedio).

    6. Se restaura la palabra de estado.

    7. Si se us se incrementa el apuntador de pila en 4(n + 1), siendo n el nmero deargumentos que radica en la pila encabezando la lista de argumentos, esto se realiza paraeliminar los argumentos de la pila.

    4.5. Relacin entre el lenguaje mquina y los lenguajes dealto nivel

    En esta seccin estudiaremos como se almacenan las variables y estructuras a las que sehace referencia en los lenguajes de alto nivel. Tambin estudiaremos qu modos de direcciona-miento son ms convenientes para cada caso. Esta informacin ser muy til para implementarcualquier tipo de compilador.

  • 4.5. Relacin entre el lenguaje mquina y los lenguajes de alto nivel 105

    4.5.1. Clases de variables

    En un programa de alto nivel, e incluso tambin en lenguaje ensamblador, existe un con-cepto denominado visibilidad. Este concepto se reere al mbito de validez del nombre de lasvariables. Atendiendo a la visibilidad, los nombres de las variables pueden ser de dos tipos:

    Globales: son nombres de variable reconocidos en todo el programa.

    Locales: son nombres de variable que slo se reconocen en una parte del programa, normal-mente uno o ms procedimientos.

    El mbito de visibilidad de los nombres de las variables es un concepto que maneja sola-mente el compilador, concretamente en la tabla de smbolos haciendo que un smbolo slo seareconocido en su mbito de validez, y no transciende al cdigo ejecutable del programa. Sinembargo, hay otro concepto similar que es el de vida de la variable que se dene como eltiempo que transcurre desde que una variable se comienza a usar hasta que se la menciona porltima vez o, lo que es lo mismo, el tiempo en que es necesario que la variable tenga espacioreservado en memoria. Segn este criterio las variables pueden ser de tres tipos:

    Permanentes: son variables cuya vida es el tiempo total de ejecucin del programa. Estasvariables se almacenan en una zona de memoria accesible desde cualquier punto del pro-grama denominada rea global. Se accede a este rea con direccionamiento relativo odireccionamiento por base y desplazamiento, tomando como base un registro que apuntea la direccin de comienzo del programa. Un tipo especial de variables de este tipo sonlas variables estticas que son variables permanentes cuyo nombre es local a uno o va-rios procedimientos. Las variables estticas conservan su valor aunque el procedimientoretorne ya que tambin se almacenan en el rea global.

    Automticas: son variables cuya vida es, como mximo, el tiempo de ejecucin del procedi-miento donde se han denido. Los nombres de estas variables son locales a ese procedi-miento. Los parmetros de los procedimientos se consideran variables de este tipo. Lasvariables automticas se almacenan en la pila, de esta forma su espacio se reserva cadavez que se llama al procedimiento y es liberado cuando retorna. El acceso a estas variablesse realiza mediante direccionamiento indexado al apuntador de trama de procedimientoo frame pointer. En el caso de los parmetros pasados por referencia o de las variablesautomticas que representen apuntadores, se aplicar el mismo direccionamiento pero ensu versin indirecta.

    Dinmicas: son variables cuyo espacio se reserva y libera durante la ejecucin de un procedi-miento. Este tipo de variables se emplea para almacenar estructuras de datos que puedencrecer o decrecer en ejecucin tales como listas enlazadas, rboles, etc. El lugar de alma-cenamiento de estas variables se denomina rea dinmica o heap y puede no ser contiguoya que el sistema operativo va concediendo memoria segn el programa la va solicitandoy no siempre la memoria est disponible de forma contigua.

    Las variables escalares de cualquiera de los tipos anteriores pueden almacenarse en registrosdel procesador, salvo las variables dinmicas y las variables automticas en los procedimien-tos recursivos, incluso en este caso tambin es posible en procesadores RISC con ventanas deregistros como se ver en el apartado 4.6.

  • 106 Conjuntos de instrucciones

    La nomenclatura de las clasicaciones anteriores no concuerda exactamente con la de loslenguajes de programacin ya que sta puede cambiar bastante de unos lenguajes a otros.

    4.5.2. Direccionamiento de estructuras de datos

    Una de las caractersticas fundamentales de los lenguajes de alto nivel es la posibilidadde denir y manejar estructuras de datos complejas. Estas estructuras plantean los siguientesproblemas:

    Organizar su almacenamiento en memoria.

    Encontrar la direccin de cada uno de sus componentes ms simples.

    En estas circunstancias el compilador del lenguaje de alto nivel debe producir una secuenciade instrucciones para calcular la direccin del componente deseado.

    El acceso a las estructuras de datos ms simples (un vector unidimensional, una estructura orecord, etc) puede requerir un nmero muy pequeo de instrucciones si se utiliza la potencia delos modos de direccionamiento. Por ejemplo, supongamos que queremos acceder al elemento kde un vector cuyos elementos ocupan 2n bytes cada uno y estn situados consecutivamente enmemoria; si el registro Rx contiene la direccin del primer elemento y Ry contiene el ndice(k), la direccin del elemento k vendr dada por

    Rx + [Ry

  • 4.6. Caractersticas de los procesadores RISC 107

    Un caso algo menos regular es el direccionamiento de estructuras de datos tipo o. La irregularidad reside en que el tamao de cada uno de los campos de una estrucuturade este tipo es diferente. En este caso, la direccin de uno de los campos viene dada por

    Rref + desplazamientoprimer elemento + desplazamientocampo

    En esta expresin, Rref + desplazamientoprimer elemento, representa la direccin del primerelemento y desplazamientocampo, es el desplazamiento del campo deseado respecto al primerelemento. Esto puede hacerse as, o, si el compilador est optimizado, ste puede sumar ambosdesplazamientos y utilizar direccionamiento indexado simple. No puede hacerse esta ltimasimplicacin en el caso de un apuntador a un (operador -> del lenguaje C) ya que, eneste caso, los dos primeros trminos estn afectados de una indireccin y la direccin del campobuscado es:

    (Rref + desplazamientoprimer elemento) + desplazamientocampo

    Para este caso se adeca muy bien el direccionamiento indirecto postindexado del microproce-sador MC68020.

    Una tcnica similar puede usarse si una estructura es un campo de otra. En este caso, paraobtener la direccin de uno de los campos de la estructura ms interna, es necesario sumartres desplazamientos: el desplazamiento del primer campo de la estructura principal respecto alregistro de referencia, el desplazamiento del primer campo de la estructura interna respecto alprimer campo de la exterior y el desplazamiento del campo solicitado respecto al primer campode la estructura interna:

    Rref + desplprimer elemento struct principal + desplprimer elemento struct interno + desplcampo

    De la misma forma que en el caso anterior, con un compilador optimizado, se pueden sumartodos los desplazamientos en compilacin y aplicar direccionamiento indexado simple. Si, porejemplo, a la estructura externa se accede a travs de un apuntador, la direccin anterior seobtendr mediante la expresin:

    (Rref + desplprimer elemento struct principal) + desplprimer elemento struct interno + desplcampo

    De forma similar se puede actuar si alguno de los otros campos es un apuntador. En este casotambin pueden resultar interesantes los direccionamientos indirectos preindexado y postinde-xado incorporados al microprocesador MC68020.

    4.6. Caractersticas de los procesadores RISC

    Tradicionalmente ha habido una gran diferencia de nivel entre el lenguaje mquina y los len-guajes de alto nivel. Esta diferencia, conocida como barrera semntica o brecha semntica,puede minimizarse de dos formas: aumentando la complejidad de los compiladores o elevandola complejidad del lenguaje mquina. En general, se ha optado por la segunda va lo que, a lolargo del tiempo, ha llevado a ordenadores con lenguajes mquina de muchas instrucciones ymuy elaboradas pero muy lentos debido a que un microprograma para decodicar muchas ins-trucciones complejas ser ms lento que otro microprograma para decodicar un conjunto ms

  • 108 Conjuntos de instrucciones

    reducido de instrucciones ms simples; por otra parte, en este ltimo caso, el control puede sercableado. Por otro lado, los programas escritos en lenguajes de alto nivel no usan, tanto comose piensa, las instrucciones complejas. Haciendo una estadstica sobre programas escritos enlenguajes de alto nivel, se puede llegar a la conclusin de que las instrucciones que ms se usan(ms de un 90%) son las asignaciones, las instrucciones condicionales (if, while, etc), las lla-madas a procedimientos y los bucles (for). Tambin hay que tener en cuenta que un porcentajemuy elevado de las asignaciones (alrededor del 80%) no involucran a operaciones aritmticas,es decir, son asignaciones simples (transferencias), aunque tambin se debe mencionar que al-gunas instrucciones condicionales involucran tambin a operaciones aritmticas. En cuanto alas llamadas a procedimientos, la mayor parte de ellas son llamadas con pocos parmetros eincluso, en la mayora de los casos, sin ellos.

    De una forma anloga si analizamos el cdigo mquina de los programas tambin se llegaa una conclusin similar respecto a los modos de direccionamiento utilizados: entre los di-reccionamientos inmediato y por desplazamiento se cubre ms de un 80% de las referencias amemoria de la mayora de los programas (si bien esto depende mucho del compilador utilizado).

    Quiere decirse con todo esto que los programas escritos en lenguajes de alto nivel no usanapenas las instrucciones ms complejas, aunque en principio pudiera pensarse los contrario. Porello cabe aqu aplicar el principio de diseo "mejorar en lo posible los casos ms frecuentes".Tambin hay que tener en cuenta que muchas mquinas estn orientadas a un solo tipo deaplicaciones (gestin, diseo asistido, clculo cientco, etc.), esto hace que se puedan encontrarlas instrucciones ms necesarias para ese tipo de aplicaciones concretas.

    As se llega a los pasos de diseo de las mquinas RISC (Reduced Instruction Set Computer:Computadores con conjunto reducido de instrucciones):

    Analizar las aplicaciones que van a funcionar en esa mquina para encontrar las opera-ciones ms necesarias para esas aplicaciones (operaciones clave).

    Disear el conjunto de registros y las comunicaciones entre ellos ms apropiados para laejecucin de las operaciones clave.

    Disear las instrucciones y modos de direccionamiento para realizar las operaciones claveen el conjunto de registros anteriormente diseado.

    Aadir nuevas instrucciones slo si no hacen ms lenta la mquina.

    Estos pasos de diseo tienen la estructura del llamado diseo descendente, esto quiere decirque se analizan las especicaciones de lo que se necesita y luego se va descendiendo hacia loselementos de ms bajo nivel necesarios para cumplir esas especicaciones.

    Ahora introduciremos el concepto de ciclo mquina que es el tiempo necesario para extraerlos operandos de los registros, llevarlos a la ALU para operar con ellos y depositar el resultadoen un registro. Este tiempo de ciclo debe ser tan pequeo como sea posible, esto se consiguesacricando todo lo que incremente la duracin del ciclo, por ejemplo, deben eliminarse lasinstrucciones que tarden en ejecutarse ms de un ciclo.

    Los principios de diseo de los ordenadores con arquitectura RISC son los siguientes:

    Relativamente pocas instrucciones y pocos modos de direccionamiento.

  • 4.6. Caractersticas de los procesadores RISC 109

    Tabla 4.4. Comparacin entre las arquitecturas RISC y CISC.

    RISC CISCInstrucciones sencillas de un solo ciclo Instrucciones complejas de varios

    ciclosPocas instrucciones y direccionamientos Muchas instrucciones y

    direccionamientosSlo LOAD y STORE acceden Cualquier instruccin puede accedera memoria a memoriaFormato de instruccin jo Muchos formatos de instruccinControl cableado Control microprogramadoProcesamiento segmentado o pipe-line Procesamiento convencionalGran nmero de registros en el Pocos registros en el procesadorprocesadorLa complejidad reside en el compilador La complejidad reside en el

    microprograma

    Gran cantidad de registros en el procesador y uso de ventanas de registros para lasvariables de los procedimientos.

    Formatos de instruccin jos y fciles de decodicar.

    Unidad de control cableada.

    Ejecucin de una instruccin en un ciclo de mquina, mediante procesamiento seg-mentado o pipe-line.

    Accesos a memoria muy restringidos con una arquitectura registro-registro (recordarel prrafo 1.9). Esto signica que los accesos a memoria se limitan, en general, a lasinstrucciones de carga y almacenamiento (LOAD y STORE).

    Uso de compiladores optimizados que sepan aprovechar las caractersticas anteriores ytengan en cuenta las posibilidades y caractersticas de la mquina.

    Estas caractersticas se resumen en la tabla 4.4 comparndolas con las de las arquitectu-ras CISC (Complex Instruction Set Computers: computadores con conjunto de instruccionescomplejo).

    Analizaremos brevemente algunas de estas caractersticas:

    La ejecucin de las instrucciones en un solo ciclo de mquina es la propiedad ms impor-tante de las mquinas RISC. Esto se consigue por dos razones: en primer lugar, la mayor partede las instrucciones operan sobre registros, y las que accedan a memoria deben eliminarse deljuego de instrucciones, salvo LOAD y STORE; esto evita muchos accesos a memoria que es laoperacin ms lenta; por otra parte, los procesadores RISC utilizan procesamiento segmentadoo pipe-line, ello signica que se procesan varias instrucciones a la vez en diferente fase, comoen una fabricacin en cadena, de la forma mostrada en la gura 4.17 donde L signica quela instruccin correspondiente est en la fase de lectura de la instruccin y X signica que se

  • 110 Conjuntos de instrucciones

    Ciclo 1 2 3 4 5Instruccin A L XInstruccin B L XInstruccin C L XInstruccin D L X

    Fig. 4.17. Procesador segmentado.

    Ciclo 1 2 3 4 5 6 7Instruccin A L XLOAD L M XInstruccin C L XInstruccin D L XSTORE L X MInstruccin F L X

    Fig. 4.18. Procesador segmentado con instrucciones LOAD y STORE.

    encuentra en la fase de ejecucin. Esto es as porque en este tipo de mquinas hay, al menos,un mdulo para procesar cada fase. Como puede verse en la gura, en el ciclo 2 se est leyendola instruccin B y ejecutando, a la vez, la instruccin A. Con este tipo de procesamiento no seconsigue ejecutar una instruccin por ciclo, pero s, ejecutar n instrucciones en n ciclos, lo que,a efectos prcticos, es equivalente. Sin embargo, aunque los accesos a memoria estn limitadosa las instrucciones LOAD y STORE, stas no encajan en el esquema anterior ya que necesitanuna etapa ms en el pipe-line, para el acceso a memoria adicional (M) como muestra la gu-ra 4.18. Esta modicacin de los planteamientos supone algunos problemas, porque, como se veen la gura, la instruccin LOAD que comienza a ejecutarse en el ciclo 2 termina de ejecutarseal menos al mismo tiempo que la instruccin C que comienza en el ciclo 3 (tambin esto puedesuponer problemas por estar los rganos de ejecucin ocupados). Mientras la instruccin C nointente usar el registro cargado por LOAD no habr ningn problema. Depende del compiladorasegurarse de que la instruccin siguiente a LOAD no use el registro cargado por sta (puedehacerlo reordenando las instrucciones). Si an as el compilador no encuentra la solucin, puedeinsertar, despus de la instruccin LOAD, una instruccin de no operacin (NOP) que resuelveel problema aunque alguna vez se pierda un ciclo. Todas estas cosas se consiguen aadiendoal compilador un mdulo denominado reorganizador. La instruccin STORE no plantea estosproblemas ya que la instruccin siguiente, salvo que sea LOAD sobre la misma direccin, nohar uso del dato almacenado debido a que opera sobre registros y si la instruccin siguiente aSTORE es un LOAD que opere sobre el dato almacenado por STORE tampoco habr proble-mas debido a que un compilador optimizado deber eliminar ambas instrucciones que tienenefectos contrarios. Tambin hay problemas similares con los saltos, especialmente con los con-dicionales, en que el procesador no sabe cul ser la instruccin siguiente. Otra caractersticaimportante de los procesadores RISC es la existencia de un banco de registros muy amplio, esto

  • 4.6. Caractersticas de los procesadores RISC 111

    Fig. 4.19. Estructura de una ventana de registros en un procesador RISC.

    se hace as para minimizar los accesos a memoria y que las instrucciones LOAD y STORE seusen lo menos posible. Evidentemente la organizacin de los registros no ser la misma que enun ordenador convencional con registros de uso general (PDP-11 o VAX) ya que si fuera as elnmero de bits necesarios para la especicacin del registro sera excesiva. Para ver cul serla mejor organizacin para un ordenador de este tipo volvemos a las etapas de diseo descritasanteriormente: al hacer el anlisis de las operaciones que ms frecuentemente realizan accesosa memoria se puede ver que son las llamadas a procedimientos, por ello habr que organizarlos registros de forma que las llamadas a procedimientos optimicen los accesos a memoria. Deesta forma se lleg a la organizacin de registros que utilizan la mayora de los procesadoresRISC: las llamadas ventanas de registros con solapamiento parcial. Esto signica que, cada vezque se llama a un procedimiento, se cambia de ventana y, adems, que cada procedimiento slopuede acceder a los registros de su ventana. Esta ventana, que suele contener alrededor de 32registros, est dividida en cuatro zonas (ver gura 4.19):

    Los registros globales, que sirven para almacenar las variables globales y son los mismospara todas las ventanas.

    Los registros para los parmetros de llamada del procedimiento que llam al actual.

    Los registros con las variables automticas del procedimiento.

    Los registros para los parmetros de llamada del procedimiento actual a otros procedi-mientos.

    Las ventanas se solapan porque los parmetros de llamada de un procedimiento son los pa-rmetros con que le llam el procedimiento anterior y tambin porque las variables globalesson las mismas para todas las ventanas. El conjunto de ventanas acta como un buffer circularcon dos apuntadores: el de la ventana actual (CWP : current window pointer) y el de la primera

  • 112 Conjuntos de instrucciones

    Fig. 4.20. Organizacin de las ventanas de registros en forma de lista circular.

    ventana utilizada (OWP : overow window pointer), si CWP = OWP signica que todas lasventanas estn ocupadas lo que provoca un desvo que salvara en memoria la ventana corres-pondiente al procedimiento con nivel de anidamiento ms profundo. El tamao del banco deregistros debe calcularse para que este desvo se produzca pocas veces; en general slo debeproducirse en casos de recursividad fuerte. Este mecanismo adems de hacer ms gil el pasode parmetros de un procedimiento a otro tambin consigue que el nmero de bits necesarios enlos campos de registro sea menor porque cada procedimiento slo necesita acceder a los regis-tros de su ventana. En el caso de la gura 4.19 el nmero de bits necesarios para direccionar unregistro ser log2(4n) siendo n el nmero de registros de cada una de las zonas de una ventana.

    Una forma de optimizar el uso de los registros es tener en cuenta el concepto de vida de lasvariables introducido en el apartado 4.5.1. Si el compilador realiza un estudio detallado de lavida de todas las variables de los procedimientos, puede utilizar el mismo registro para variasvariables cuyo periodo de vida no se superponga.

    Otra de las caractersticas de los procesadores RISC es la que le da nombre, esto no slodebe entenderse como un conjunto de pocas y sencillas instrucciones sino tambin como unconjunto especializado de instrucciones para un tipo de aplicacin concreto (estaciones de tra-

  • Bibliografa y referencias 113

    bajo, sistemas expertos, etc.). Tambin se ha de mencionar que esta reduccin no slo se reerea las instrucciones sino tambin, e incluso con ms nfasis, a los modos de direccionamiento.Esto es debido a que los modos de direccionamiento que exijan clculos de direcciones debeneliminarse debido a que introduciran ciclos mquina adicionales.

    Bibliografa y referencias

    Baase, S. 1983. VAX-11 Assembly Language Programming. Prentice-Hall.

    Brown, F. 1991. Processeurs RISC. Lexample de lAm29000. Masson.

    De Blasi, M. 1990. Computer Architecture. Addison Wesley.

    Hennessy, J.L., & Patterson, D.A. 2003. Computer Architecture. A Quantitative Approach. 3 edn.Morgan Kaufmann Publishers.

    Heudin, J.C., & Panetto, C. 1990. Les architectures RISC. Dunod Informatique.

    Tanenbaum, A.S. 2006. Structured Computer Organization. 5 edn. Prentice-Hall International. Existetraduccin al castellano de la edicin anterior: Organizacin de computadores: un enfoque estructurado,4a edicin, Prentice-Hall Hispanoamericana, 2000.

    CUESTIONES Y PROBLEMAS

    Nota importante: Para la resolucin de muchos problemas de este captulo es necesario consultarlos apndices.

    4.1 Escribir las instrucciones de VAX necesarias para poner a 1 los bits 3, 6 y 17 del registroR7 y a 0 los bits 2, 5 y 8.

    4.2 Repetir el problema anterior en ensamblador de arquitectura SPARC con el registro l0.

    4.3 Escribir en ensamblador de VAX las instrucciones necesarias para complementar todoslos bits del segundo byte comenzando por la derecha del registro R9 dejando inalteradosel resto de los bits de ese registro.

    4.4 a) En el registro C de un Z-80 hay dos cifras codicadas en BCD empaquetadas. Escribirun programa en lenguaje ensamblador de Z-80 que pase esas cifras a los registros D y E.

    b) Codicar el programa anterior en cdigo mquina.

  • 114 Conjuntos de instrucciones

    4.5 Repetir el problema anterior para un MC68000 suponiendo que en el registro D0 hay 8cifras en BCD y que las queremos depositar separadas en bytes seguidos a partir de ladireccin A cuyo valor es 00456F00H.

    4.6 En el registro R5 de un PDP-11 hay dos caracteres empaquetados. Escribir las instruccio-nes necesarias para pasar el carcter situado en el byte de orden ms alto de este registroal byte ms bajo del registro R2 sin alterar el resto del contenido de este registro ni elcontenido original de R5.

    4.7 Supongamos que a partir de la direccin relocalizable X de la memoria de un PDP-11 hayuna cadena que representa un nmero decimal positivo de dos cifras codicado en ASCII.Escribir un programa en lenguaje ensamblador para construir, a partir de la direccin Y ,otra cadena que represente el mismo nmero en hexadecimal tambin en ASCII.

    4.8 Demostrar la propiedad dada por la ecuacin 4.1.

    4.9 Si los registros l0 y l1 de una mquina con arquitectura SPARC representan respectiva-mente sendos conjuntos A y B, indicar las instrucciones necesarias para:

    a) Comprobar si un cierto elemento situado en la posicin genrica i pertenece a B.

    b) Calcular A B.c) Comprobar si A B.

    4.10 Supongamos que X e Y son dobles palabras que representan a los elementos de sendosconjuntos A y B. Escribir un fragmento de programa en lenguaje ensamblador de VAXque bifurque a la etiqueta Incluido si y, slo si, A B, en caso contrario la ejecucindebe continuar secuencialmente.

    4.11 Supngase que X es una palabra que representa un conjunto A dentro del conjunto uni-versal de los nmeros enteros comprendidos entre 0 y 15. Escribir en lenguaje ensambla-dor del PDP-11 las instrucciones necesarias para bifurcar a la etiqueta Pertenece si elnmero contenido en la direccin Y es un elemento del conjunto A.

    4.12 Cul de los tres mtodos descritos en el texto para analizar la inclusin de un conjuntoen otro es menos eciente en un VAX?Y en una mquina con arquitectura SPARC?

    4.13 Supongamos que en una mquina con arquitectura SPARC, sendas palabras de memoriaa y b representan a dos conjuntos A y B. Escribir las instrucciones necesarias en lenguajeensamblador de dicha mquina para:

    a) Calcular la palabra que represente a la unin de A y B.

    b) Calcular la palabra que represente a la interseccin de A y B.

    c) Calcular una variable entera que valga 1 si, y slo si, A B.d) Calcular una variable entera que valga 1 si, y slo si, A y B son disjuntos.

    4.14 Inventar un mtodo para intercambiar dos variables sin utilizar una tercera variable niningn otro registro.

    Sugerencia: Recordar las propiedades de la operacin OR exclusivo.

  • Cuestiones y problemas 115

    4.15 Describir la forma ms rpida de borrar un registro si no se dispone de una instruccinespecca para ello.

    4.16 Todas las instrucciones siguientes tienen el mismo efecto: borrar el registro R6 de unVAX. Sin embargo, requieren diferente nmero de bytes al codicarlas en cdigo mqui-na. Cuntos bytes requiere cada una? Cul es ms eciente?

    a) b) c) d) e)

    4.17 Todas las instrucciones siguientes tienen el mismo efecto: borrar el registro l1 de unprocesador con arquitectura SPARC Cul es ms eciente?

    a) b) c) d) e) f)

    4.18 Escribir, en ensamblador del VAX, las instrucciones para bifurcar a la etiqueta X si lasdobles palabras contenidas en las direcciones A, B y C son todas mayores que 1024. Encaso contrario debe ejecutarse la siguiente instruccin.

    4.19 Repetir el problema anterior para que la ejecucin del programa contine en la etiquetaX slo si alguna de las dobles palabras mencionadas es mayor que 1024.

    4.20 Dibujar la grca de dependencia del contador del programa con respecto al tiempo parados llamadas anidadas a procedimientos. Se debe suponer que el cdigo dentro de ambosprocedimientos es lineal.

    4.21 Dibujar la grca de dependencia del contador del programa con respecto al tiempo parados bucles anidados. Supngase que el cdigo dentro de los bucles es lineal, que el bucleinterno se ejecuta tres veces y el externo dos.

    4.22 Dibujar la grca de variacin del contador de programa respecto al tiempo para un pro-grama que llama a un procedimiento recursivo que se ejecuta tres veces. La llamadarecursiva dentro del procedimiento se produce aproximadamente en la mitad del procedi-miento y cuando se produce la salida se salta la instruccin de llamada.

    4.23 Dibujar la grca de dependencia del contador de programa con respecto al tiempo parados procedimientos que se llaman recursivamente de forma indirecta y se ejecutan dosveces cada uno. La salida se produce en uno de los procedimientos mediante una bifurca-cin condicional efectiva que provoca que se salte la instruccin de llamada al otro.

    4.24 Escribir las instrucciones de VAX necesarias para el intercambio de control entre doscorrutinas.

    4.25 Escribir las instrucciones de VAX necesarias para llamar a un procedimiento que tienedos parmetros mediante la instruccin CALLG pero pasando los parmetros a travs dela pila.

    4.26 a) Supngase que, a partir de una direccin, cuya etiqueta es CADENA, existe una ca-dena de caracteres cuya longitud est localizada en la direccin L. Escribir un programaen ensamblador del VAX que ponga en la direccin POSICION la direccin del primer

  • 116 Conjuntos de instrucciones

    blanco que exista en la cadena. Si la cadena no contiene blancos la direccin POSICIONquedar a 0.

    b) Traducir el programa escrito para resolver el apartado anterior a lenguaje mquina su-poniendo que el programa comienza en la direccin 0000C000H y que las etiquetas re-presentan los siguientes valores: CADENA: 0000A015H, POSICION: 0000BA10H, L:0000BA20H.

    4.27 Repetir el problema anterior para el MC68000.

    4.28 a) Escribir un procedimiento en lenguaje ensamblador del VAX que tome como par-metros dos nmeros enteros (una doble palabra, N, y un byte, M ) y una direccin. Elprocedimiento escribir, a partir de la direccin suministrada, M nmeros consecutivosa partir de N. El procedimiento tendr tambin un parmetro de error (de tipo byte) quedevolver un 1 si M es negativo o cero).

    b) Utilizar el procedimiento escrito en el apartado anterior para confeccionar un programaque pida por teclado dos nmeros enteros, A y B, y escriba por pantalla B nmeros con-secutivos a partir de A.

    4.29 a) Escribir los directivos del lenguaje ensamblador del SPARC necesarios para reservarespacio para la siguiente variable descrita en lenguaje Pascal Se puede suponer que eltamao de integer es de 2 bytes.

    b) Escribir las instrucciones de lenguaje ensamblador ms ecientes para depositar en la suma

    2i=0

    v[2].b[i]

    c) Repetir el apartado anterior para un PDP-11.

    4.30 Describir brevemente los pasos necesarios para acceder a un elemento genrico de unamatriz de dos dimensiones.