4 Generación de código objeto 4.1 Registros Los registros del procesador se emplean para controlar instrucciones en ejecución, manejar direccionamiento de memoria y proporcionar capacidad aritmética. Los registros son espacios físicos dentro del microprocesador con capacidad de 4 bits hasta 64 bits dependiendo dependiendo del microprocesad microprocesador or que se emplee. Los registros registros son direccionables por medio de una vieta, que es una dirección de memoria. Los bits, por conveniencia, se numeran de derecha a i!quierda "#$, #4, #%&. %, ', #, (), los registros est*n divididos en seis grupos los cuales tienen un fin específico. Los registros se dividen en+ -egistros de segmento -egistros de apuntadores de instrucciones -egistros apuntadores -egistros de propósitos generales -egistro índice -egistro de bandera. -egistros de uso general /0 1 -egistro acumulador, dividido en /2 /2 y /L "3 bits cada uno). 5nterviene en las operaciones aritméticas y lógicas, después de la operación arroja un resultado. 0 1 -egistro base, dividido en 2 y L. 7e utili!a en transferencias de datos entre la memoria y el procesador. 80 1 -egistro contador, dividido en 82 y 8L. 7e utili!a como contador en bucles"L99:), en operaciones con cadenas"-;:), y en despla!amientos"8L). <0 1 -egistro de datos, dividido en <2 y mero de puertos. -egistros de segmento ?n registro de segmento se utili!a para alinear en un limite de p*rrafo o dicho de otra forma codifica la dirección de inicio de cada segmento y su dirección en un registro de segmento supone cuatro bits ( a su derecha.
?n registro de segmento tiene #6 bits de longitud y facilita un *rea de memoria para direccionamientos conocidos como el segmento actual. Los registros de segmento son+ 87 "código), <7 "datos), 77 "pila), ;7 , @7 y A7. -egistro /puntador de instrucciones."5:) ;l registro apuntador de instrucciones "5:) de #6 bits contiene el despla!amiento de dirección de la siguiente instrucción que se ejecuta. -egistro índice Los registros 75 y <5 est*n disponibles para direccionamientos inde=ados y para sumas y restas. Bue son las operaciones de punta. -egistro de bandera Los registros de banderas sirven parar indicar el estado actual de la maquina y el resultado del procesamiento, 8uando algunas instrucciones piden comparaciones o c*lculos aritméticos cambian el estado de las banderas.
4.2 Lenguaje Ensamblador Caracteristicas ;l lenguaje /ssembly es un tipo de lenguaje de bajo nivel utili!ado para escribir programas inform*ticos, y constituye la representación m*s directa del código m*quina específico para cada arquitectura de computadoras legible por un programador. @ue usado ampliamente en el pasado para el desarrollo de softCare, pero actualmente sólo se utili!a en contadas ocasiones, especialmente cuando se requiere la manipulación directa del hardCare o se pretenden rendimientos inusuales de los equipos. ;nsambladores ?n ensamblador crea código objeto traduciendo instrucciones mnemónicas a códigos operativos, e interpretando los nombres simbólicos para direcciones de memoria y otras entidades. ;l uso de referencias simbólicas es una característica b*sica de los ensambladores, evitando tediosos c*lculos y direccionamiento manual después de cada modificación del programa. La mayoría de los ensambladores también incluyen facilidades para crear macros , a fin de generar series de instrucciones cortas que se ejecutan en tiempo real, en lugar de utili!ar subrutinasD#E . Los ensambladores son por lo general m*s f*ciles de programar que los compiladores de lenguajes de alto nivel, y han estado disponibles desde la década de #F$(. Los ensambladores modernos, especialmente para arquitecturas basadas en -578, como por ejemplo G5:7, 7:/-8 y :/-578 optimi!an las instrucciones para e=plotar al m*=imo la eficiencia de segmentación del 8:?.
Los ensambladores de alto nivel ofrecen posibilidades de abstracción que incluyen+ 8ontrol avan!ado de estructuras. :rocedimientos de alto nivel, declaración de funciones. Hipos de datos que incluyen estructuras, registros, uniones, clases y conjuntos. 7ofisticado procesamiento de macros. Lenguaje ?n programa escrito en lenguaje /ssembly consiste en una serie de instrucciones que corresponden al flujo de órdenes ejecutables que pueden ser cargadas en la memoria de una computadora. :or ejemplo, un procesador =36 puede ejecutar la siguiente instrucción binaria como se e=presa en código maquina+ inario+ #(##(((( (##((((# "2e=adecimal+ (=b(6#) equivalente en /ssembly es m*s f*cil de recordar+
La
representación
mov al, (6#h ;sta instrucción significa+ Gueva el valor he=adecimal 6# "FI decimal) al registro JalK. ;l mnemónico JmovK es un código de operación u JopcodeK , elegido por los diseadores de la colección de instrucciones para abreviar JmoveK "mover). ;l opcode es seguido por una lista de argumentos o par*metros, completando una instrucción de ensamblador típica. La transformación del lenguaje /ssembly en código m*quina la reali!a un programa ensamblador, y la traducción inversa la puede efectuar un desensamblador. / diferencia de los lenguajes de alto nivel, aquí hay usualmente una correspondencia # a # entre las instrucciones simples del ensamblador y el lenguaje m*quina. 7in embargo, en algunos casos, un ensamblador puede proveer Jpseudo instruccionesK que se e=panden en un código de m*quina m*s e=tenso a fin de proveer la funcionalidad necesaria. :or ejemplo, para un código m*quina condicional como Jsi 0 mayor o igual queK , un ensamblador puede utili!ar una pseudoinstrucción al grupo Jhaga si menor queK , y Jsi 1 ( sobre el resultado de la condición anterior. Los ensambladores m*s completos también proveen un rico lenguaje de macros que se utili!a para generar código m*s complejo y secuencias de datos. 8ada arquitectura de computadoras tiene su propio lenguaje de m*quina, y en consecuencia su propio lenguaje /ssembly. Los ordenadores difieren en el tipo y n>mero de operaciones que soportanM también pueden tener diferente cantidad de registros, y distinta representación de los tipos de datos en memoria. /unque la mayoría de las computadoras son capaces de cumplir esencialmente las mismas funciones, la forma en que lo hacen difiere, y los respectivos lenguajes /ssembly reflejan tal diferencia. :ueden e=istir m>ltiples conjuntos de mnemónicos o sint*=is de /ssembly para un mismo conjunto de instrucciones, instanciados típicamente en diferentes
programas ensamblador. ;n estos casos, la alternativa m*s popular es la provista por los fabricantes, y usada en los manuales del programa. 8ódigo m*quina "o lenguaje de m*quina) ;l lenguaje de m*quina est* formado por instrucciones sencillas, que dependiendo de la estructura del procesador pueden especificar+ -egistros específicos para operaciones aritméticas, direccionamiento o control de funciones. :osiciones de memoria específicas "offset). Godos de direccionamiento usados para interpretar operandos. Las operaciones m*s complejas se reali!an combinando estas instrucciones sencillas, que pueden ser ejecutadas secuencialmente o mediante instrucciones de control de flujo. Las operaciones disponibles en la mayoría de los conjuntos de instrucciones incluye+ mover llenar un registro con un valor constante mover datos de una posición de memoria a un registro o viceversa escribir y leer datos de dispositivos computar sumar, restar, multiplicar o dividir los valores de dos registros, colocando el resultado en uno de ellos o en otro registro reali!ar operaciones binarias, incluyendo operaciones lógicas "/Nn programa para el usuario se llama traductores, el lenguaje en que esta escrito el programa original se llama lenguaje fuente, el lenguaje original que sea modificado se llama lenguaje objeto. 7e usa la traducción cuando se cuenta con un procesador "ya sea hardCare o un interprete) para el lenguaje objeto pero no para el lenguaje fuente, 7i la traducción se reali!a correctamente, la ejecución del programa traducido dar* e=actamente los mismos resultados que habría dado la ejecución del programa fuente. 2ay dos diferencias entre traducción e interpretación, en la traducción no se ejecuta directamente el programa original, en el lenguaje fuente se convierte en un
programa equivalente llamado programa objeto o programa binario ejecutable y este funciona solo cuando se ha acabado la traducción. ;l código m*quina, un simple patrón de bits, es hecho legible reempla!ando valores crudos por símbolos denominados mnemónicos. 7e inventó para facilitar la tarea de los primeros programadores que hasta ese momento tenían que escribir directamente en código binario. antes a>n era peor, ya que el código de ceros y unos "el programa) debía introducirse en una tarjeta perforada. La posición ocupada por cada punto equivalía a un J# o a un J( seg>n hubiera un hueco o no. Lo cual suponía una forma casi idéntica en la que hoy se escriben los datos binaros en soportes tales como los 8nica instrucción en código simbólico. :ero adem*s, para mejorar la legibilidad del programa, el código simbólico introduce instrucciones adicionales, que no corresponden a ninguna instrucción de la m*quina y que proporcionan información. 7e llaman JpseudoinstruccionesK. ;l código simbólico puede parecer de difícil acceso, pero es m*s f*cil de recordar e interpretar que el binario o el he=adecimal. Los lenguajes simbólicos no resuelven definitivamente el problema de cómo programar un ordenador de la manera m*s sencilla posible. :ara utili!arlos, hay que conocer a fondo el microprocesador, los registros de trabajo de que dispone, la estructura de la memoria, y muchas cosas m*s. /dem*s, el lenguaje /ssembly est* demasiado ligado al microprocesador para que sea posible escribir programas independientes de la m*quina en que van a ejecutarse. ;ste código simbólico no puede ser ejecutado directamente por un ordenador, por lo que es preciso traducirlo previamente. :ero la traducción es un proceso mec*nico y repetitivo, que se presta a su reali!ación por un programa de ordenador. Los programas que traducen código simbólico al lenguaje de m*quina se llaman ensambladores "JassemblerK, en inglés), porque son capaces de ensamblar el
programa traducido a partir de varias pie!as, procedimientos o subrutinas a código binario "J# y J() que entiende el procesador. ;jemplos de lenguaje /ssembly ;jemplo # ;l siguiente es un ejemplo del programa cl*sico 2ola mundo escrito para la arquitectura de procesador =36 "bajo el sistema operativo <97 ). .model small .stacU .data 8adena# < S2ola Gundo.VT .code programa+ mov a=, Wdata mov ds, a= mov d=, offset 8adena# mov ah, F int '#h end programa
Lenguaje ;nsamblador
La distribución es el proceso en el que el programa generado puede ejecutarse en otras m*quinas. 8on respecto al ensamblador, la mayoría del direccionamiento se hace relativo para que el programa sea relocali!able por un programa llamado cargador. ;n el caso de programas compiladores se necesitan de las librerías, si son est*ticos se incluyen en el ejecutable por lo que el programa se hace gr*fico, si son din*micas no pero el programa es m*s pequeo.
4.3 Lenguaje Maquina Características ?n lenguaje de programación de bajo nivel es el que proporciona poca o ninguna abstracción del microprocesador de un ordenador. 8onsecuentemente es f*cilmente trasladado a lenguaje de m*quina. La palabra JbajoK no implica que el lenguaje sea inferior a un lenguaje de alto nivelM se refiere a la reducida abstracción entre el lenguaje y el hardCare.
?so+ ventajas e inconvenientes. ;n general se utili!a este tipo de lenguaje para programar controladores "drivers). La programación en un lenguaje de bajo nivel como el lenguaje de la m*quina o el lenguaje simbólico tiene ciertas ventajas+ Gayor adaptación al equipo. :osibilidad de obtener la m*=ima velocidad con mínimo uso de memoria. :ero también tiene importantes inconvenientes+ 5mposibilidad de escribir código independiente de la m*quina. Gayor dificultad en la programación y en la comprensión de los programas. ;l programador debe conocer m*s de un centenar de intrucciones. ;s necesario conocer en detalle la arquitectura de la m*quina. 8aracterísticas 7e trabaja a nivel de instrucciones, es decir, su programación es al m*s fino detalle. ;st* orientado a la m*quina. :rimera generación ;l lenguaje de programación de primera generación "por sus siglas en inglés, #AL), es el lenguaje de código m*quina. ;s el >nico lenguaje que un microprocesador entiende de forma nativa. ;l lenguaje m*quina no puede ser escrito o leído usando un editor de te=to, y por lo tanto es raro que una persona lo use directamente. 7egunda generación ;l lenguaje de programación de segunda generación "por sus siglas en inglés, 'AL), es el lenguaje ensamblador. 7e considera de segunda generación porque, aunque no es lenguaje nativo del microprocesador, un programador de lenguaje ensamblador debe conocer la arquitectura del microprocesador "como por ejemplo las particularidades de sus registros o su conjunto de instrucciones).
;s la forma en como se accede a la memoria. -ecordar que un programa no puede ejecutarse sino se encuentra en memoria principal. La forma de acceder a la memoria depende del microprocesador, pero en general e=isten dos tipos de direccionamiento+ directo e indirecto. ;l direccionamiento directo también recibe el nombre de direccionamiento absoluto y el acceso a las direcciones se hace de manera directa. ;l direccionamiento indirecto también recibe el nombre de direccionamiento relativo y se basa a partir de una dirección genérica, generalmente el inicio del programa. :ara acceder a una dirección relativa se suma a la dirección base el n>mero de espacios de memorias necesarias. ;l direccionamiento relativo hace a los programas relocali!ables e independientes. 7i la dirección base es el inicio de la memoria fija el direccionamiento pasa a ser un variante de direccionamiento absoluto.
4.4 dministración Memoria Lenguaje Ensamblador La administración de la memoria es un proceso hoy en día muy importante, de tal modo que su mal o buen uso tiene una acción directa sobre el desempeo de memoria. ;n general un ensamblador tiene un administrador de memoria m*s limitado que un compilador. ;n la mayoría de los lenguajes de programación el uso de punteros no estaba vigilado por lo que se tienen muchos problemas con el uso de memoria. Los lenguajes m*s recientes controlan el uso de punteros y tienen un programa denominado recolector de basura que se encarga de limpiar la memoria no utili!ada mejorando el desempeo.