INSTITUTO TECNOLÓGICO SUPERIOR DE URUAPAN
“Lenguaje Ensamblador” Carrera: Ingeniería en Sistemas Computacionales
Materia: Programación de Sistemas.
Presenta: Isai Esparza Agustín. Edgar Alejandro Torres Carrillo.
Uruapan, Michoacán
05 diciembre de 2011
1
Generación de código objeto. (8.3, 8.3.1, 8.3.2, 8.4) Introducción. Los ordenadores cuentan también con memoria como parte principal de su desempeño, la cual está definida en memoria “RAM” (Memoria de acceso directo) y la memoria “ROM” (Memoria de solo lectura). Dentro de estas memorias, ocurren todas las ejecuciones de los programas anotados en los registros del procesador, siendo la primera la que permite la escritura y modificación de las localidades de memoria, y la segunda que solo permite la ejecución sin capacidad de ser modificada. Otra parte importante y vital del procesador, así como los procesos del ordenador, son los registros. Estos son utilizados para alojar instrucciones básicas, como operaciones aritméticas e instrucciones analógicas enviadas a ellos. Dentro del lenguaje ensamblador se utilizan cuatro registros de uso general, los cuales tienen un tamaño de 16 bits pudiendo ser divididos obteniendo un sub-registro de 8 bits. El lenguaje ensamblador es un lenguaje de bajo nivel empleado para la programación de tareas de arranque desde la “CPU”. Este lenguaje está diseñado para los procesadores construidos bajo la arquitectura de Von Newman o también conocidos como computadoras “IBM”. Este lenguaje malamente traducido al español, es utilizado para programar los pulsos que recibirá desde el teclado así como para instalar ejecutables con dentro de un procesador. Esto es importante pues sin él, no podríamos instalar los programas necesarios para el óptimo desempeño de nuestro ordenador así como la utilización de periféricos como el teclado y ratón, los cuales nos permiten interactuar con la computadora.
2
Registros. El CPU cuenta con 14 registros internos cada uno de 16 bits, los primeros cuatro (AX, BX, CX, DX) son de uso general y se pueden usar también como registros de 8 bits. Los registros del procesador se emplean para controlar instrucciones en ejecución, manejar direccionamiento de memoria y proporcionar capacidad aritmética.
Registros de segmento.
Registro CS: El DOS almacena la dirección inicial del segmento de código de un programa en el registro CS, para propósitos de programación normal, no se necesita referenciar el registro CS.
Registro DS: La dirección inicial de un segmento de datos de programa es almacenada en el registro DS. Esta dirección más un valor de desplazamiento en una instrucción, genera una referencia a la localidad de un byte especifico en el segmento de datos.
Registro SS: El registro SS permite la colocación en memoria de una pila, para almacenamiento temporal de direcciones y datos. El DOS almacena la dirección de inicio del segmento de pila de un programa en el registro SS.
Registro ES: Algunas operaciones con cadenas de caracteres utilizan el registro extra de segmento para manejar el direccionamiento de memoria. En este contexto, el registro ES esta asociado con el registro DI (índice). Un programa que requiere el uso del registro ES puede inicializarlo con una dirección de segmento apropiada.
Registros FS y GS: Son registros extra de segmento en los procesadores 80386 y posteriores.
Estos registros son los que comúnmente utilizamos y podemos observar con detenimiento sus ejecuciones, puesto que están al alcance de todos los procesadores y su trabajo es fácil de palpar visualmente en el ordenador.
3
Una lista amplia de todos los registros del procesador así como un esquema que los ilustra la encontramos a continuación.
AX Acumulador
BX Registro base
CX Registro contador
DX Registro de datos
DS Registro del segmento de datos
ES Registro del segmento extra
SS Registro del segmento de pila
CS Registro del segmento de código
BP Registro de apuntadores base
SI Registro índice fuente
DI Registro índice destino
SP Registro del apuntador de la pila
IP Registro de apuntador de siguiente instrucción
F Registro de banderas
4
5
Registros de propósito general.
Los registros de propósito general AX, BX, CX, DX son los más utilizados del sistema. Son únicos en el sentido de que se puede direccionarlos como una palabra o comuna parte de un byte. El último byte de la izquierda es la parte “alta”, y el último byte de la derecha es la parte “baja”.
Registro AX: El registro AX, el acumulador principal, es utilizado para operaciones que implican entrada/salida y la mayor parte de la aritmética.
Registro BX: El registro BX es conocido como el registro base ya que este es el único registro de propósito general que puede ser un índice para direccionamiento indexado.
Registro CX: El registro CX es conocido como el registro contador, puede contener un valor para controlar el número de veces que un ciclo se repite o un valor para corrimiento de bits, hacia la derecha o hacia la izquierda.
Registro DX: El DX es conocido como el registro de datos, algunas operaciones entrada/salida requieren su uso, y las operaciones de multiplicación y división con cifras grandes suponen al DX y al AX trabajando juntos.
Registro de Banderas.
De los 16 bits del registro de banderas, nueve son comunes a toda la familia de procesadores 8086, y sirven para indicar el estado actual de la maquina y el resultado del procesamiento. Muchas instrucciones que piden comparaciones y aritmética cambian el estado de las banderas, algunas cuyas instrucciones pueden realizar pruebas para determinar la acción subsecuente.
OF (overflow, desbordamiento): Indica desbordamiento de un bit de orden alto después de una operación aritmética.
6
DF (dirección): Designa la dirección hacia la izquierda o hacia la derecha para mover o comparar cadenas de caracteres.
IF (interrupción): Indica que una interrupción externa, como la entrada desde el teclado sea procesada o ignorada.
TF (trampa): Permite la operación del procesador en modo de un paso. Los programas depuradores, como DEBUG, activan esta bandera de manera que se pueda avanzar en la ejecución de una sola instrucción a un tiempo, para examinar el efecto de esa instrucción sobre los registros y la memoria.
SF (signo): Contiene el signo resultante de una operación aritmética.
ZF (cero): Indica el resultado de una operación aritmética o de comparación.
AF (acarreo auxiliar): Contiene un acarreo externo del bit 3 en un dato de ocho bits, para aritmética especializada.
PF (paridad): Indica paridad par o impar de una operación en datos de ocho bits de bajo orden.
CF (acarreo): Contiene el acarreo de orden más alto después de una operación aritmética así como el contenido del último bit en una operación de corrimiento o de rotación.
7
Las banderas más importantes para la programación en ensamblador son O, S, Z Y C, para operaciones de comparación y aritméticas, y D para operaciones de cadenas de caracteres.
Distribución Lenguaje Ensamblador.
Dentro de la distribución del lenguaje ensamblador, se trata la portabilidad que este pueda poseer. Un lenguaje ensamblador puede ser ejecutado en cualquier microchip o microprocesador basado en la arquitectura Von Newman, esto es, que cuente con memoria, registros, y puertos 1/0. Dentro de la programación de un ordenador, este lenguaje puede ser ejecutado en aquel sistema operativo basado en el DOS (Disk Operating System) el cual brinda acceso independiente a todos los dispositivos y recursos de la computadora. Esto es, que debido a la utilización de un BIOS, los dispositivos se cargan de inmediato desde el arranque sin detenerse a tener que ser instalados cada vez que se arranque la computadora. Actualmente conocemos varias extensiones de programas, los cuales para poder ser ejecutados necesitan un área reservada que es conocida generalmente como pila, así cada programa ensamblado necesita un área para reservada en el procesador para poder ser ejecutado en el. Una vez revisados todos los requerimientos internos del procesador y a su vez de la computadora, debemos analizar que para poder programar y ejecutar un código de lenguaje ensamblador debemos contar con un compilador especializado para el lenguaje que estamos utilizando.
8
Esta imagen describe lo que se necesita para poder ejecutar un código de ensamblador a nivel de hardware interno del procesador.
Administración de Memoria. La administración de memoria que tenga el lenguaje ensamblador depende esencialmente del procesador con el que se cuente y esta se puede manejar de la siguiente manera.
Memoria de programa: Esta contiene todos los datos, las instrucciones, las tablas y cadenas de caracteres usadas en el programa, el tamaño máximo de esta es de 64k y se ejecuta únicamente en el registro DP. Memoria externa de datos: Esta contiene las variables y estructuras de datos que no caben en la memoria interna del Microprocesador, esta memoria se direcciona principalmente por el registro DP aunque también puede ser colocado en un banco de memoria externa de datos ampliando con un tamaño de 256 bytes usando los registros de propósito general.
9
Memoria Interna de Datos: Es la memoria de datos más importante ya que en ella es donde residen cuatro bancos de registros de propósito general; la pila del programa, 128 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 tamaño máximo de esta es de 256 bytes. Registro de Funciones Especiales: Es destinado para los puertos de entrada/salida, temporizadores y puerto serie del circuito integrado. Estos registros incluyen al SP, al registro de la palabra de estado y al Acumulador. El tamaño máximo de este es de 128 bytes. Memoria de bit: Se usa para almacenar variables y banderas de un bit. El tamaño máximo es de 256 bits, los cuales son compartidos con el espacio de la Memoria Interna de Datos y los otros con los registros de Funciones Especiales.
La terea de administrar la memoria es llevada a cabo por el OS y el hardware y tiene algunas restricciones así como requisitos para saber que se está llevando a cabo de la manera correcta, estos requisitos son:
Relocalización. Protección. Compartición. Organización Lógica. Organización Física.
Conclusiones. Es importante saber el manejo de un lenguaje ensamblador dentro de una maquina así como los procesos que se llevan dentro del procesador para poder programar un optimo compilador. Quizás, a simple vista estos temas no tengan mucha relación con el desarrollo de los analizadores y compiladores que se han intentando crear durante la clase, pero si analizamos con detenimiento un compilador ya creado, como el NetBeans, este se instala dentro del OS y se ejecuta a través de comandos y líneas simples empotradas en el procesador, cosa que es vital no solo para ejecutar un compilador, si no para ejecutar cualquier programa en un ordenador. A su vez, la parte más importante de esto es el saber administrar la memoria de procesador, ya que si sobrecargamos o movemos alguna instrucción fuera del registro que le corresponde nuestro programa no tendrá un buen desempeño pudiendo dañar la maquina.
10
11