IMPORTANCIA DEL LENGUAJE ENSAMBLADOR La importancia del lenguaje ensamblador radica principalmente que se trabaja directamente con el microprocesador; por lo cual se debe de conocer el funcionamiento interno de este, tiene la ventaja de que en l se puede realizar cualquier tipo de programas que en los lenguajes de alto nivel no lo pueden realizar. Otro punto sera que los programas en ensamblador ocupan menos espacio en memoria.
Ventajas y desventajas del Lenguaje Ensamblador Ventajas 1.- Como trabaja directamente con el microprocesador al ejecutar un programa, pues como este lenguaje es el ms cercano a la mquina la computadora lo procesa ms rpido.
2.- Eficiencia de tamao.- Un programa en ensamblador no ocupa mucho espacio en memoria porque no tiene que cargan libreras y dems como son los lenguajes de alto nivel
3.- Flexibilidad.- Es flexible porque todo lo que puede hacerse con una mquina, puede hacerse en el lenguaje ensamblador de esta mquina; los lenguajes de alto nivel tienen en una u otra forma limitante para explotar al mximo los recursos de la mquina. O sea que en lenguaje ensamblador se pueden hacer tareas especficas que en un lenguaje de alto nivel no se pueden llevar acabo porque tienen ciertas limitantes que no se lo permite
Desventajas Tiempo de programacin.- Como es un lenguaje de bajo nivel requiere ms instrucciones para realizar el mismo proceso, en comparacin con un lenguaje de alto nivel. Por otro lado, requiere de ms cuidado por parte del programador, pues es propenso a que los errores de lgica se reflejen ms fuertemente en la ejecucin.
Programas fuente grandes.- Por las mismas razones que aumenta el tiempo, crecen los programas fuentes; simplemente requerimos ms instrucciones primitivas para describir procesos equivalentes. Esto es una desventaja porque dificulta el mantenimiento de los programas, y nuevamente reduce la productividad de los programadores.
Peligro de afectar recursos inesperadamente.- Que todo error que podamos cometer, o todo riesgo que podamos tener, podemos afectar los recursos de la mquina, programar en este lenguaje lo ms comn que pueda pasar es que la mquina se bloquee o se reinicialice. Porque con este lenguaje es perfectamente posible (y sencillo) realizar secuencias de instrucciones invlidas, que normalmente no aparecen al usar un lenguaje de alto nivel.
Falta de portabilidad.- Porque para cada mquina existe un lenguaje ensamblador; por ello, evidentemente no es una seleccin apropiada de lenguaje cuando deseamos codificar en una mquina y luego llevar los programas a otros sistemas operativos o modelos de computadoras.
Relacin entre el cdigo binario y el lenguaje ensamblador En el cdigo binario se utilizan ceros y unos, mientras que el lenguaje ensamblador es una coleccin de smbolos mnemnicos que representan: operaciones, nombres simblicos, operadores y smbolos especiales. La relacin entre estos dos lenguajes sera que el binario es el lenguaje que la mquina entiende y el ensamblador se acerca ms lenguaje de esta. Manejo de la memoria: Direccionamiento (interno y externo). El manejo de la memoria depende de que procesador tenga la mquina, entre los cuales a continuacin se mencionan los siguientes:
Memoria de Programa Memoria Externa de Datos Memoria Interna de Datos Registros de Funciones Especiales Memoria de Bit. El espacio de la Memoria de Programa contiene todas las instrucciones, datos, tablas y cadenas de caracteres (strings) usadas en los programas. Esta memoria se direcciona principalmente usando el registro de 16 bits llamado Data Pointer. El tamao mximo de la Memoria de Programa es de 64 Kbytes. La Memoria Externa de Datos contiene todas las variables y estructuras de datos que no caben en la memoria interna del Microprocesador. Esta memoria se direcciona principalmente por el registro de 16 bits Data Pointer, aunque tambin se puede direccionar un banco de Memoria Externa de Datos de 256 bytes usando los dos primeros registros de propsito general. El espacio de Memoria Interna de Datos funcionalmente es la memoria de datos ms importante, ya que ah es donde residen cuatro bancos de registros de propsito general; la pila o stack del programa; 128 bits de los 256 bits de un rea de memoria direccionable por bit y todas las variables y estructuras de datos operadas directamente por el programa. El tamao mximo de la Memoria Interna de Datos es de 256 bytes. Contiene un espacio para los denominados Registros de Funciones Especiales destinado para los puertos de entrada/salida, temporizadores y puerto serie del circuito integrado. Estos registros incluyen al Stack Pointer; al registro de la palabra de estado del programa y al Acumulador. La cantidad mxima de Registros de Funciones Especiales es 128. Todos los Registros de Funciones Especiales tienen direcciones mayores a 127 y se ubican en los 128 bytes superiores de la Memoria Interna de Datos. Estas dos reas de la Memoria Interna de Datos se diferencian por el modo de direccionamiento usado para accesarlas. Los Registros de Funciones Especiales solo se pueden accesar usando el modo de direccionamiento Directo, mientras que los 128 bytes superiores solo se pueden accesar con el modo de direccionamiento Indirecto. Por otra parte, el espacio de Memoria de Bit se usa para almacenar variables y banderas de un bit. El tamao mximo de la Memoria de Bit es de 256 bits, 128 de los bits comparten su espacio con 16 bytes del espacio de la Memoria Interna de Datos y los otros 128 bits lo hacen con los Registros de Funciones Especiales.
Caractersticas El cdigo escrito en lenguaje ensamblador posee una cierta dificultad de ser entendido ya que su estructura se acerca al lenguaje mquina, es decir, es un lenguaje de bajo nivel. El lenguaje ensamblador es difcilmente portable, es decir, un cdigo escrito para un microprocesador, puede necesitar ser modificado, para poder ser usado en otra mquina distinta. Al cambiar a una mquina con arquitectura diferente, generalmente es necesario reescribirlo completamente. Los programas hechos por un programador experto en lenguaje ensamblador son generalmente mucho ms rpidos y consumen menos recursos del sistema (memoria RAM y ROM) que el programa equivalente compilado desde un lenguaje de alto nivel. Al programar cuidadosamente en lenguaje ensamblador se pueden crear programas que se ejecutan ms rpidamente y ocupan menos espacio que con lenguajes de alto nivel. Con el lenguaje ensamblador se tiene un control muy preciso de las tareas realizadas por un microprocesador por lo que se pueden crear segmentos de cdigo difciles y/o muy ineficientes de programar en un lenguaje de alto nivel, ya que, entre otras cosas, en el lenguaje ensamblador se dispone de instrucciones del CPU que generalmente no estn disponibles en los lenguajes de alto nivel. Tambin se puede controlar el tiempo en que tarda una rutina en ejecutarse, e impedir que se interrumpa durante su ejecucin.
Lenguaje El lenguaje ensamblador refleja directamente la arquitectura y las instrucciones en lenguaje de mquina de la CPU, y pueden ser muy diferentes de una arquitectura de CPU a otra. Cada arquitectura de microprocesador tiene su propio lenguaje de mquina, y en consecuencia su propio lenguaje ensamblador ya que este se encuentra muy ligado a la estructura del hardware para el cual se programa. Los microprocesadores difieren en el tipo y nmero de operaciones que soportan; tambin pueden tener diferente cantidad de registros, y distinta representacin de los tipos de datos en memoria. Aunque la mayora de los microprocesadores son capaces de cumplir esencialmente las mismas funciones, la forma en que lo hacen difiere y los respectivos lenguajes ensamblador reflejan tal diferencia.
DISEO DE LENGUAJE Elementos bsicos Hay un grado grande de diversidad en la manera en que los autores de los ensambladores categorizan las sentencias y en la nomenclatura que usan. En particular, algunos describen cualquier cosa como pseudo-operacin (pseudo-Op), con excepcin del mnemnico de mquina o del mnemnico extendido. Un tpico lenguaje ensamblador consiste en 3 tipos de sentencias de instruccin que son usadas para definir las operaciones del programa: Mnemnicos de opcode Secciones de datos Directivas de ensamblador
EL PROCESADOR Y SUS REGISTROS INTERNOS Definicin de registros: Un registro es una memoria de alta velocidad y poca capacidad, integrada en el microprocesador, que permite guardar transitoriamente y acceder a valores muy usados, generalmente en operaciones matemticas. Funcin de los registros: Los registros estn en la cumbre de la jerarqua de memoria, y son la manera ms rpida que tiene el sistema de almacenar datos. Los registros se miden generalmente por el nmero de bits que almacenan; por ejemplo, un "registro de 8 bits" o un "registro de 32 bits. La CPU contiene un conjunto de localidades de almacenamiento temporal de datos de alta velocidad llamada registro. Algunos de los registros estn dedicados al control, y solo la unidad de control tiene acceso a ellos. Los registros restantes son los registros de uso general y el programador es el usuario que tiene acceso a ellos. Algunos registros bsicos: Dentro del conjunto bsico de registros de control se deben incluir a los siguientes: A. Contador de programa (PC). B. Registro de direcciones de la memoria (MAR). C. Registro de datos (RD). D. Registro de instrucciones (IR). E. Palabra de estado de programa (PSW). LA MEMORIA PRINCIPAL
Para su funcionamiento el computador requiere de la memoria principal o RAM (Random Access Memory), que es el espacio lgico a donde se almacenan las instrucciones o datos que el microprocesador debe ejecutar o procesar. Esta memoria es temporal, pues existe slo mientras el sistema est en encendido y su contenido vara de acuerdo a la aplicacin o aplicaciones que se estn ejecutando. La memoria principal se divide en Memoria Base o Convencional, Memoria alta y Memoria Extendida. La memoria convencional o base ocupa los primeros 640K , es decir de 0 hasta 640K. Su tamao siempre es el mismo independientemente de la cantidad de memoria fsica que tenga el computador. En esta se localizan las direcciones E/S (Entrada/Salida) de todos los dispositivos que se encuentren configurados en el sistema y se carga el sistema operativo D.O.S. La memoria alta reside entre 640K y los 1.024K. Los diseadores de la primera PC decidieron reservar sta para los buffers de video, el BIOS-ROM del sistema y la memoria de los adaptadores. Aunque una parte de este espacio no se utiliza en las computadores y para utilizarlo como memoria principal para datos y programas se requiere de un administrador de memoria que recupera ese espacio perdido y convierte las reas no usadas en regiones de memoria utilizable llamados bloque de memoria alta (UMB). La memoria extendida comienza en 1MB (1.024K) y contina hasta el tope de la memoria fsica presente en el sistema. La memoria expandida est fuera del espacio normal de direcciones del microprocesador y para accesarla hay que usar un programa especial llamado administrador de memoria expandida (EMM) El EMM (Expanded Memory Manager) divide la memoria expandida en una serie de unidades de 16K llamadas pginas. Tambin separa 64K de espacio de direcciones sin usar en el rea de la memoria alta para que sirvan como un marco de pgina EMS (Enhanced Memory Especification), un estndar de la industria promulgado a mediado de los 80s por las compaas Lotus, Intel y Microsoft, tambin conocido como LIM. Una pgina de EMS que est mapificada al marco de pgina, puede leerse y escribirse como si fuera parte de la memoria instalada en la tarjeta del sistema. Los administradores de memoria vienen en dos variedades. La ms comn es la del modo virtual 86 del chip 80386 una propiedad de ste llamada paginacin para crear UMBs. La paginacin es un mtodo por el cual el procesador puede engaar a un programa para que ste crea que est teniendo acceso a una localizacin en memoria, cuando en realidad est teniendo acceso a otra. Los administradores de memoria en modo real, que estn diseados para que corran en computadoras con microprocesadores 8086, 8088 y 80286 tienen otra estrategia para crear EMS UMBs. Si hay memoria expandida EMS instalada, el administrador crear los UMBs mapificando pginas de memoria EMS a las reas sin usar de la memoria alta. Si la PC no contiene memoria expandida pero se construy con uno de los juegos populares de chips que apoyan la copia de ROM a RAM con remapificacin, el administrador de memoria explotar esta habilidad para mapificar los bloques de memoria extendida a la memoria superior. Los administradores de memoria de modo virtual, ofrecen servicios que los otros no pueden. Por ejemplo, la mayora de los administradores de memoria de modo virtual dejan convertir la memoria extendida a memoria expandida EMS 4.0, y tambin transferir cdigo de la ROM a la RAM, aumentando el rendimiento del sistema. Sin embargo la ejecucin del programa en modo virtual 86 es ms lenta que en el modo real, especialmente para programas con uso intenso de clculos que usan ciertas tcnicas de emulacin para la aritmtica de punto flotante cuando no se tiene un coprocesador. La memoria Expandida surgi como una solucin para poder ampliar la RAM en los sistemas viejos tales como 8080, 8088, 286, etc. a los cuales no se les poda agregar ms chips de memoria. La memoria expandida se colocaba insertando una tarjeta de expansin. En los sistemas actuales no se requiere de esta tcnica sin embargo existen manejadores que la emulan con el fin de que puedan correr aplicaciones diseadas para este tipo de memoria. De acuerdo a su presentacin fsica la memoria se puede clasificar en los siguientes tipos:
El tiempo de acceso es lo que demora en leerse alguna direccin de la memoria, por lo tanto entre menor sea el valor, mayor es la velocidad de lectura. Una memoria rpida puede trabajar bien en un equipo lento pero un equipo rpido con una memoria lenta puede presentar fallas. Anteriormente algunas marcas de computadoras requeran de memoria con paridad es decir con un chip adicional para la correccin de errores, es por ello que a muchos computadores de marca era muy difcil la ampliacin de la RAM. En la actualidad se existen otras clasificaciones de la memoria tales como EDO (Enhanced Data Output), BEDO (Burst EDO), ASDRAM (Asincronous Dinamic RAM) y SDRAM (Sincronous Dinamic RAM) con el fin de obtener un mejor aprovechamiento de las nuevas tecnologas en microprocesadores, tales como MMX y Pentium II.
CONCEPTO DE INTERRUPCIONES
Interrupciones por software: Son aquellas programadas por el usuario, es decir, el usuario decide cuando y donde ejecutarlas, generalmente son usadas para realizar entrada y salida.
Interrupciones por hardware: Son aquellas que son provocadas por dispositivos externos al procesador su caracterstica principal es que no son programadas. Interrupciones por hardware enmascarables: Aquellas en las que el usuario decide si quiere o no ser interrumpido. Interrupciones por hardware no enmascarables (NMI): Aquellas que siempre interrumpen al programa. Finalizar la ejecucin de la instruccin en curso. Almacenar en la pila el registro de estado. Almacenar en la pila la direccin de retorno: registros CS e IP. Inhibir las interrupciones. La captura de una interrupcin consiste bsicamente en sustituir su entrada correspondiente de la tabla de vectores de interrupcin por la direccin de una rutina propia, esto es, sustituiremos el segmento y el offset de la rutina original por nuestro segmento de cdigo (registro CS) y el offset.
CLI; Inhabilita la interrupcin MOV AX, 0000H MOV ES, AX MOV ES:[09h*4], OFFSET nuestra_rutina MOV ES:[09h*4+2], CS STI; La vuelve a habilitar
Interrupcin de pulsacin de teclado nuestra_rutina PROC ;guardar registros en la pila ... ;recuperar registros de la pila IRET ENDP Una interrupcin es el rompimiento en la secuencia de un programa para ejecutar un programa especial llamando una rutina de servicio cuya caracterstica principal es que al finalizar regresa al punto donde se interrumpi el programa. Qu es una interrupcin? Cuando se produce una peticin de interrupcin, se desencadena una secuencia de acciones.
Tratamiento de interrupciones Ejemplo de interrupciones "Funcin" o Rutina Captura de interrupciones Tipos de interrupciones Interrupciones por Hardware Las interrupciones por software se ejecutan con ayuda de las instrucciones: INT e IRET, adems se tiene 256 interrupciones. Asociado al concepto de interrupcin se tiene un rea de memoria llamada vector de interrupciones; la cual contiene las direcciones de las rutinas de servicio de cada interrupcin. Esta rea se encuentra en el segmento 0000:0000 Ejemplos de interrupciones:
int 00H-->divisin entre cero int 01h-->un solo paso int 02h-->interrupcin no enmascarable int 03h--> punto de interrupcin int 04h-->desbordamiento int 05h-->impresin de pantalla int 08h-->Cronometro int 09h-->interrupcin desde el teclado int 0Bh-->Control del puerto Com1 int 0Ch-->Control del puerto Com2 int 0Dh-->Control de dispositivos en paralelo int 0EH-->Control de disco flexible Sintaxis: OFFSET nombre_rutina LLAMADAS AL SERVICIO DEL SISTEMA Una llamada al sistema es cuando un programa llama a un servicio del Kernel del sistema operativo. Generalmente estos servicios se encuentran disponibles como instrucciones de lenguaje ensamblador pero algunas veces tambin pueden llamarse (sin tener conocimiento de ello) desde lenguajes de alto nivel.
Kernel o ncleo Este se considera el principal componente de los sistemas operativos sirve de interfaz entre aplicaciones y el proceso de los datos de bajo nivel hecho por el hardware del equipo. Entre sus funciones est administrar los recursos del sistema como memoria, uso de CPU por las aplicaciones o acceso a interfaces de entrada y salida del equipo.
Ejemplos de esto son: Exit: Para terminar la ejecucin de un programa. Fork: Para crear hilos de ejecucin. Time: Para ver la hora actual. Open: Para abrir archivos Close: para cerrar archivos Como puede observarse estas son funciones muy utilizadas en cualquier lenguaje de programacin pero sin darnos cuenta estas son administradas por el ncleo del sistema operativo.
Llamadas al sistema en Linux
Conceptos tiles:
El espacio kernel: En este espacio residen todas las subrutinas que forman parte del kernel tales como mdulos o drivers y cualquier otra que tenga que ver con la interfaz kernel.
El espacio de usuario: En este espacio se encuentran los programas que utiliza el usuario final, tales como shell y cualquiera de los programas que he estado programando de ejemplos en ensamblador.
Existen diferentes implementaciones en el mundo Linux en los procesadores x86 ms antiguos se utilizaban interrupciones para migrar de un espacio de usuario a un espacio Kernel ( lo cual es un objetivo intermedio de las llamadas al sistema).
En Linux en las llamadas al sistema se utiliza el registro "%eax" para identificar la llamada al sistema que se quiere invocar, la cual se especifica en una biblioteca de Ansi C. Para empezar la llamada al sistema se invoca al vector de interrupcin de Linux (0x80) que contiene las direcciones de memoria de los controladores de interrupciones. Cuando una llamada al sistema es generada, el sistema operativo salva el estado de ejecucin del proceso y empieza la ejecucin del controlador de llamadas al sistema en el vector de interrupciones.
Una vez esto el controla de llamadas al sistema provoca la ejecucin de la funcin "system_call", esta funcin controla todas las llamadas al sistema, y toma como parmetro el valor contenido en el registro %eax para identificar la llamada en especfico. Una vez realizadas una serio de verificaciones se invoca la llamada real al sistema utilizando la funcin "system_call_table" y el indice en "%eax". Una vez que el kernel termina su ejecucin invoca a la funcin "system_call_exit" y se llama a las transiciones de resumen "resume_userspace" nuevamente para regresar al espacio de usuario para regresar a la aplicacin del usuario.
MODOS DE DIRECCIONAMIENTO La memoria de acceso aleatorio, o RAM, es la memoria principal de una computadora. Las aplicaciones son cargadas y ejecutadas en la memoria RAM. Los modos de direccionamiento asignan memoria RAM en porciones que pueden ser referenciadas individualmente para que la unidad central de procesamiento, o CPU, pueda determinar qu ubicacin de memoria est siendo utilizada por una instruccin de la mquina.
Modo de direccionamiento inmediato El modo inmediato es la forma ms simple de direccionamiento. El operando es parte de la instruccin y, por lo tanto, ninguna referencia de memoria, distinta de la instruccin, es requerida para recuperar el operando. Este modo es rpido y se puede utilizar para definir constantes o establecer valores de variables iniciales. Este modo tiene un alcance limitado, ya que es limitado al tamao del campo de direccin, que para la mayora de los conjuntos de instrucciones es pequeo en comparacin con la longitud de palabra.
Modo de direccionamiento directo En el modo directo, el campo de direccin contiene la direccin del operando. Se requiere una nica referencia de memoria para leer el operando de la localizacin dada. Sin embargo, slo proporciona un espacio de direcciones limitado.
Modo de direccionamiento indirecto En el modo indirecto, la celda de memoria a la que apunta el campo de direccin contiene la direccin del operando (puntero), que a su vez contiene la direccin de longitud completa del operando. Este modo tiene un espacio de direcciones grande, a diferencia del direccionamiento inmediata y el directo, pero debido a que se requieren mltiples accesos de memoria para encontrar el operando es ms lento. Modo de direccionamiento de registro El modo de registro es similar al modo directo. La diferencia clave entre los dos modos es que el campo de direccin de la instruccin se refiere a un registro en lugar de una posicin de memoria. El direccionamiento de registro no tiene una direccin eficaz. Tres o cuatro bits son utilizados como campo de direccin para hacer referencia a los registros.
Modo de direccionamiento indirecto de registro Este modo es similar al direccionamiento indirecto. El operando se encuentra en una celda de memoria apuntada por contenido de un registro. El registro contiene la direccin efectiva del operando. Este modo utiliza menos acceso de memoria que el direccionamiento indirecto. Este modo tiene un espacio de direcciones grande, pero es limitado al ancho de los registros disponibles para almacenar la direccin efectiva.
Modo de direccionamiento de desplazamiento El modo de desplazamiento consiste en tres variaciones: 1) Direccionamiento relativo 2) Direccionamiento de registro base 3) Direccionamiento de ndice Este modo puede considerarse una combinacin del modo de direccionamiento indirecto y de registro. La direccin tiene dos valores: el valor base y un registro que contiene un desplazamiento entero que es sumado o restado de la base para formar la direccin efectiva de la memoria.
Modo de direccionamiento de pila El modo de pila, tambin conocido como direccionamiento implcita, consiste en un conjunto lineal de ubicaciones referidos al ltimo que entra y primero en salir. El operando est en la parte superior de la pila. El puntero de la pila es un registro que almacena la direccin de la parte superior de la ubicacin de la pila.
PROCESO DE ENSAMBLADO Y LIGADO 1. El programa utiliza un editor de texto para crear un archivo de texto ASCII, conocido como archivo de cdigo fuente. 2. El ensamblador lee el archivo de cdigo fuete y produce un archivo de cdigo objeto, una traduccin del programa a lenguaje mquina. De manera opcional, produce un archivo de listado. Si ocurre un error, el programador debe regresar al paso 1 y corregir el programa. 3. El enlazador lee el archivo de cdigo objeto y verifica si el programa contiene alguna llamada a los procedimientos en una biblioteca de enlace. El enlazador copia cualquier procedimiento requerido de la biblioteca de enlace, lo combina con el archivo de cdigo objeto y produce el archivo ejecutable. De manera opcional, el enlazador puede producir un archivo de mapa. 4. La herramienta cargador (loader) del sistema operativo lee el archivo ejecutable y lo carga en memoria, y bifurca la CPU hacia la direccin inicial del programa, para que ste empiece a ejecutarse.
DESPLEGADO DE MENSAJES EN EL MONITOR Todos los grficos y el texto que se muestran en el monitor se escriben en la RAM de visualizacin de video, para despus enviarlos al monitor mediante el controlador de video. El controlador de video es en s un microprocesador de propsito especial, que libera a la CPU principal del trabajo de controlar el hardware de video. Un monitor de pantalla de cristal lquido (LCD) digital directo recibe un flujo de bits digitales directamente desde el controlador de video, y no requiere del barrido de trama.