|
Cursos y Tutoriales Introducción. Los traductores se dividen en dos grupos dependiendo de la relación entre lenguaje fuente y lenguaje objeto. Cuando una instrucción de un lenguaje fuente nos genera una única instrucción numérica máquina decimos que ese lenguaje fuente es Ensamblador. Cuando la instrucción simbólica de lenguaje fuente (como Basic, Cobol, Fortran, etc) nos genera varias instrucciones máquina o varias instrucciones simbólicas de otro lenguaje, decimos que el traductor que realiza la transformación es un compilador. Las características fundamentales de un Ensambladores que cada una de sus sentencias es una codificación simbólica de una instrucción numérica máquina. Otra característica que presenta es que nos permite llegar a usar cualquier recurso del sistema, cosa que no nos permiten los lenguaje de alto nivel. Programar en Ensamblador es como programar en un lenguaje máquina ya que hay una identificación entre lenguaje máquina de 0 y 1 y un lenguaje simbólico. Longitud de los Datos. Los tipos principales de datos permitidos por los micro-programa de Intel tiene una longitud de palabras de 1, 4, 8, 16 y 32 bits y se denominan, respectivamente, Bit, Nibble, Byte, Palabra, Doble Palabra. 7 6 5 4 3 2 1 0 Nibble: Superior Inferior Los números decimales se pueden almacenar de varias formas, como por ejemplo: - Desempaquetado, donde cada byte contiene un dígito. Ejemplo: 1434 01 04 03 04 0000 0001 0000 0100 0000 0011 0000 0100 - Empaquetado, donde cada byte contiene dos dígito. Ejemplo: 1434 14 34 0001 0100 0011 0100 - Agrupaciones superiores al byte: Palabra 2 bytes. Doble Palabra 2 palabras Cuádruple Palabra 4 palabras Párrafo 16 bytes. Página 256 bytes (normalmente). Segmento 64k bytes ( normalmente). Origen y destino. Los términos origen y destino se usan para distinguir la situación de los operandos especificados por las instrucciones de programación. Ej: MOV ax , bx ; BX es el operando origen y AX es el operando destino. Efectivamente, la instrucción significa... "mover el dato contenido en el operando origen (BX) al operando destino (AX)". Familias de Procesadores 8086.
En modo Real solo se puede ejecutar a la vez un proceso. El sistema operativo DOS solo funciona en modo real. En el modo Protegido, más de un proceso pueden ser activados a la vez. Arquitectura de Segmentos. Vamos a definir registros como elementos con un número determinado de bits que usa el procesador para hacer unas determinadas operaciones. Vamos a definir segmento como una porción de memoria seleccionada por el procesador para realizar cierto tipo de operaciones. Con la llegada de procesadores en modo protegido, la arquitectura de segmento consiguió que los segmentos puedan separarse en bloques diferentes para protegerlos de interacciones indeseables. La arquitectura de segmentos realizó otro cambio significativo con el lanzamiento de procesadores de 32 bits, empezando con el 80386, que minimizan las limitaciones de memoria de la arquitectura de segmentos de los 16 bits, siendo, además, compatibles con éstos de 16 bits. Ambos ofrecen paginación para mantener la protección de los segmentos. En DOS los segmentos se asignan normalmente adyacentes uno al otro.
En modo Protegido los segmento estarían en cualquier parte de memoria. El programador no sabe donde están ubicados y no tiene ningún control sobre ellos. Los segmentos pueden incluso moverse a una nueva posición de memoria o cambiarse al disco mientras que el programa se está ejecutando. Direccionamiento de los segmentos. Es un mecanismo interior que combina el valor del segmento y un valor de desplazamiento para crear una dirección. Las 2 partes representan una dirección 'segmento:desplazamiento'.
La porción del segmento es siempre de 16 bits. La porción del desplazamiento es de 16 y 32 bits. En modo real el valor del segmento es una dirección física que tiene una relación aritmética con el desplazamiento.
El segmento y el desplazamiento crean junto una dirección física de 20 bits, con la que se puede acceder a un MegaB de memoria (220), aunque, por ejemplo, el sistema operativo de IBM usa sobre 640k de memoria por programa. Vamos a considerar, por defecto, que tratamos con un desplazamiento de 16 bits. El segmento seleccionará una región de 64k y usaremos el desplazamiento para seleccionar 1 byte dentro de esa región. La forma de hacerlo sería: 1º El procesador desplaza la dirección del segmento 4 posiciones binarias a la izquierda y la rellena con 0. Este funcionamiento tiene el efecto de multiplicar la dirección del segmento por 16. 2º El procesador añade esta dirección de segmento de 20 bits resultante a la dirección de desplazamiento de 16 bits. La dirección de desplazamiento no se cambia. 3º El procesador usa la dirección de 20 bits resultante, a menudo llamada dirección física, al acceder a una posición en el MegaB de espacio direccionado. Ejemplo: Hexadecimal --> 5 3 C 2 : 1 0 7 A Binario ------> 0101 0011 1100 0010:0001 0000 0111 1010 1) 0101 0011 1100 0010 0000 2) 0001 0000 0111 1010 + ────────────────────────────── 0101 0100 1100 1001 1010 5 4 C 9 A Dirección Física Ejemplo: Hexadecimal --> 1 3 F 7 : 3 8 A C Binario ------> 0001 0011 1111 0111:0011 1000 1010 1100 1) 0001 0011 1111 0111 0000 2) 0011 1000 1010 1100 + ────────────────────────────── 0001 0111 1000 0001 1100 1 7 8 1 C Dirección Física Cuando trabajamos en Ensamblador la memoria la dividimos en 4 regiones de 64k. Estas serían:
- Segmento de Código que contiene los código de instrucción el programa que se está ejecutando. - Segmento de Datos que guarda las variables del programa. - Segmento Extra o área de datos complementario, usada generalmente con operaciones con cadenas. Las dirección base actuales de cada segmento se guardan en registros punteros especiales de 16 o 32 bits, denominados Registro de Segmento. Tipos de Registros. Todos los procesadores 8086 tiene la mismo base de registros de 16 bits. Se puede acceder a algunos registros como 2 registros separados de 8 bits. En el 80386/486 se puede acceder a registros de 32 bits.
AX: Funciona como AC en algunas ocasiones. Realiza operaciones como entrada/salida de datos, multiplicación, división, operaciones con decimales codificados en binario, etc. BX: Funciona como registro Base, en algunas ocasiones, para referenciar direcciones de memoria En estos casos mantiene la dirección de base, comienzo de tabla o matrices, en la que la dirección se determina usando valores de desplazamiento. CX: Funciona como registro Contador, en algunas ocasiones, es decir, cuenta el número de bits o palabras en una determinada cadena de datos durante los operaciones con cadenas. Ej: Si se va a mover de un área de memoria a otra n palabras, CX mantiene inicialmente el número total de palabras a desplazar llevando la cuenta de la palabra o byte que va siendo trasladada. En las instrucciones de desplazamiento y rotación CL se usa como contador. DX: Se usa en la multiplicación para mantener parte del producto de 32 bits o en las divis. para mantener el valor del resto. Y en operaciones de Entrada/Salida de datos para especificar la dirección del puerto de E/S usado.
Los registros Indices SI y DI y los registros Punteros SP y BP guardan los valores de desplazamiento empleados para el acceso a determinadas posiciones de memoria Una característica importante de los 4 registros es que se pueden usar operaciones arit méticas y lógicas de modo que los valores de desplazamiento que almacenan pueden ser el resultado de cálculos previos. BP: Apunta a una zona dentro de la pila dedicada al almacenamiento de datos. SI: Es usado como registro índice en ciertos modos de direccionamiento indirecto. También puede guardar un valor de desplazamiento indirecto. Se usa para almacenar un desplazamiento que direcciona la posición de un operando origen durante operaciones de tratamiento de cadenas. DI: También se usa como registro índice en determinados modos de direccionamiento indirecto. Además almacena un desplazamiento de dirección, la posición de un operando destino durante operaciones con cadenas.
Las áreas de memoria asignadas al código de programa, datos y pila se direccionan por separado a pesar de poder solaparse. En un momento dado hay siempre 4 bloques disponibles de memoria direccionable denominadas segmento. Cada uno de los segmento suele tener una longitud de 64k.
Los registros de segmento CS, DS, SS y ES se usan para apuntar a las bases de los 4 segmento de memoria direccionbles: * El segmento de código. * El segmento de datos. * El segmento de pila. * El segmento extra. Para determinar una direcciones en el segmento de código tendremos que realizar el desplazamiento de 4 bits hacia la izquierda del registro CS poniendo a 0 los bits 0, 1, 2 y 3. Lo que equivale a multiplicar CS por 16. Sumando a continuación el valor de 16 bits almacenado en IP. La dirección dentro de los otro 3 registros se calcula similarmente. Las combinaciones de registro de segmento y desplazamiento depende de los tipos de operaciones que se esté ejecutando. Por omisión se asume que la dirección de un operando está en el segmento de datos y el registro de segmento a usar es por tanto DS con el desplazamiento BX, SI o DI.
Si el desplazamiento está almacenado en un registro puntero como SP o BP se asume que el operando está en el segmento de pila y, por tanto, el registro de segmento de pila SS se usa como base. Si la dirección del operando es el destino de una instrucción de cadena, el registro del segmento Extra ES constituye la base y el desplazamiento se almacena en DI o SI.
IP se usa para localizar la posición de la próxima instrucción a ejecutar dentro del segmento de código en curso. Como el registro CS contiene la dirección base del segmento de código, cualquier dirección de 20 bits dentro del segmento se localizará empleando cualquier IP como desplazamiento desde CS.
Los bits 0, 2, 4, 6, 7 y 11 son indicadores de condición que reflejan los resultados de operaciones del programa. Los bits del 8 al 10 son indicadores de control. Los indicadores de condición pueden comprobarse tras ejecutar determinadas operaciones usando el resultado de la comprobación en la toma de decisiones de vifurcación condicional.
Indicadores de Condición:
Bit 0. Indicador de acarreo (CF) Se pone a 1 si en una operación de suma o resta se produce un acarreo por exceso o por defecto. Si una operación no produce acarreo estará a 0. Bit 2. Indicador de paridad (PF) Se pone a 1 si el resultado de una operación tiene un número par de bits a 1. Y se pone a 0 cuando el resultado tiene un número impar de bits a 1. Bit 4. Indicador auxiliar de acarreo (AF) Funciona igual que el anterior, pero se usa para señalar un acarreo por exceso o defecto de los 4 bits menos significativos en los valores de BCD (decimal codificado en binario). Bit 6. Indicador de cero (ZF) Se pone a 1 si el resultado de una operación es 0, esto ocurre, por ejemplo, después de usar una instrucción de resta o decremento o al hacer una comparación entre 2 número de igual valor. Para resultados distintos de 0 el indicador estará a 0. Bit 7. Indicador de signo (SF) Indica si un número es positivo o negativo en los términos de las aritméticas de complemento a 2. Se usa el bits más significativo de cualquier número en complemento 2 para indicar si dicho número es positivo cuando está a 0 o negativo cuando está a 1. Y se copia en el bit 7 del registro de indicadores. Bit 11. Indicador de desbordamiento (OF) Cualquier resultado que exceda los límites del tamaño de un operando provoca un desbordamiento (overflow) y activará este indicador a 1. Registro indicador de Control: Bit 8. Indicador de intercepción (TF) Se pone a 1 para indicar que el modo de intercepción (TRAP) está activado, haciendo que el micro-procesador ejecute la instrucción paso a paso. El procesador genera instrucción una detrás de otra. Un DEBUGGING puede usar este rango para procesar un programa instrucción a instrucción. Bit 9. Indicador de interrupción (IF) Se pone a 0 para desactivar la interrupción externa y a 1 para activarla. IF se controla con la instrucción CLI (desactiva interrupción externa) y STI (activa interrupción externa). Bit 10. Indicador de dirección (DF) Señala la dirección hacia la que se procesa la instrucción de cadena en relación con SI y DI. Se pone a 0 para la cadena que se procesa hacia arriba, o sea, hacia direcciones de memoria más altas y se pone a 1 para las cadenas que se procesan hacia abajo, o sea, hacia direcciones más bajas. Solo para 80386 / 486. Los procesadores de este tipo usan registros de 8 y 16 bits igual que el resto de la familia de los 8086. Todos los registros se extienden a 32 bits excepto los registros de segmento de 16 bits. Los registros extendidos comienzan con la letra E: el registro extendido de AX es EAX. Los procesadores 386 / 486 tienen 2 registros de segmento adicionales: FS y GS.
IOP indica el nivel de protección para operaciones de Entrada/Salida. El bit 14 (N) se usa en relación con procesos anidados. · R para reanudación de procesos. · V está relacionado con el modo 8086 virtual. · A está relacionado con el control de alineación. Sentencias. Una sentencia (o instrucción) en ensamblador puede tener la estructura siguiente: [ Nombre ] [ Operación ] [ Operandos ] [ ;Comentario ] El nombre normalmente es una etiqueta. La operación indica la acción que se va a realizar con los operandos, que son la lista de uno o más items con los que la instrucción o directiva opera. Ej: principio: MOV ax, 7 ; movemos el valor 7 al reg ax Una lista lógica puede contener como máximo 512 caracteres y ocupa 1 o más líneas física. Extender una línea lógica en 2 o más líneas física se realiza poniendo el carácter '\' como el último carácter, que no es un espacio en blanco, antes del comentario o fin de línea. Puede ponerse un comentario después de '\'. Ej: .if (x>0) \; x debe ser positivo && (ax<0) \; ax debe ser negativo && (cx=0) ; cx debe ser cero MOV dx,20h .endif Ej: coment^ En este ejemplo se asignará este texto MOVE ax,0 y este código al comentario hasta que aparezca el símbolo: ^ MOVE cx,1 |
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||