Tarifas
Contacto

Cursos y Tutoriales

CURSOS   DE   PROGRAMACION

LENGUAJE   ENSAMBLADOR

Parte Primera

Parte 1 Parte 2 Parte 3 Parte 4

Introducción.

Los traductores se dividen en dos grupos dependiendo de la rela­ción entre lenguaje fuente y lenguaje objeto. Cuando una instruc­ció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 ins­trucció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áqui­na 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 situa­ción de los operandos especificados por las instrucciones de pro­gramación.

Ej:  MOV ax , bx    ; BX es el operando origen y AX es el operando destino.

Efectivamente, la instrucción significa... "mover el dato conte­nido en el operando origen (BX) al operando destino (AX)".

Familias de Procesadores 8086.

Procesador

Modos disponi­bles

Memoria Direccio­nable

Tamaño del Re­gistro

8086 / 8088

Real

1 MegaB

16 bits

80186 / 80188

Real

1 MegaB

16 bits

80286

Real y Protegi­do

16 MegaB

16 bits

80386

Real y Protegi­do

4 GigaB

16 o 32 bits

80486

Real y Protegi­do

4 GigaB

16 o 32 bits

En modo Real solo se puede ejecutar a la vez un proceso. El sistema operativo DOS solo funciona en modo real. En el modo Pro­tegido, más de un proceso pueden ser activados a la vez.

Arquitectura de Segmentos.

Vamos a definir registros como elementos con un número determi­nado de bits que usa el procesador para hacer unas determinadas operaciones. Vamos a definir seg­mento como una porción de memoria seleccionada por el procesador para realizar cierto tipo de opera­ciones.

Con la llegada de procesadores en modo protegido, la arquitectu­ra 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 seg­mentos. En DOS los segmentos se asignan normalmente ad­yacentes uno al otro.

Asignación Programa Modo Real

Memoria

Segmento 0

 1º dirección disponible

Segmento 1

 Siguiente dirección a partir de segm­ento0

Asignación Programa Modo Protegido

Memoria

Segmento 0

1º dirección disponible en alguna parte de memoria

Segmento 1

Siguiente dirección después del segmento0, en alguna parte de memoria

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á eje­cutando.

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'.  

Memoria

<---  1 byte  --->

0000:000­0

0000:000­1

.

Segmento 0

0­000:FFFF

Memoria

<---  1 byte  --->

0001:000­0

0001:000­1

.

Segmento 1

0­001:FFFF

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 seg­mento es una dirección física que tiene una relación arit­mé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 desplaza­miento 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 posi­ciones 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 me­nudo 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 de Pila con información referente a la pila.

  -   Segmento Extra o área de datos complementario, usada general­mente con operaciones con cadenas.

Las dirección base actuales de cada segmento se guardan en re­gistros 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.

Registro de Datos

L  Low (Baja)

H  High (Alta)

AH

AL

AX: Acumulador

BH

BL

BX: Base

CH

CL

CX: Contador

DH

DL

DX: Extra

8 bits

8 Bits

Total 16 bits

AX: Funciona como AC en algunas ocasiones. Realiza operaciones como entrada/salida de datos, multiplicación, división, operacio­nes con decimales codificados en binario, etc.

BX: Funciona como registro Base, en algunas ocasiones, para refe­renciar direcciones de memoria En estos casos mantiene la direc­ción de base, comienzo de tabla o matrices, en la que la dirección se determina usando valores de desplaza­miento.

CX: Funciona como registro Contador, en algunas ocasiones, es de­cir, 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 inicial­mente 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 direc­ción del puerto de E/S usado.

Registro Punteros e Indices

SP

SP: Puntero de Pila

BP

BP: Puntero de Base

SI

SI: Indice de Origen

DI

DI: Indice Destino

16 bits

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álcu­los previos.

SP: Apunta a la posición de la cima de la pila del segmento de pila en memoria. Es un registro usado para guar­dar un valor de desplazamiento que direcciona la posición de un operando origen durante operaciones de tratamiento de cadenas.

BP: Apunta a una zona dentro de la pila dedicada al almacena­miento de datos.

SI: Es usado como registro índice en ciertos modos de direcciona­miento indirecto. También puede guardar un valor de des­plazamiento 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.

Registro de Seg­mentos

CS

CS: Segmento de Código

DS

DS: Segmento de Dato

SS

SS: Segmento de Pila

ES

ES: Segmento Extra

16 bits

Las áreas de memoria asignadas al código de programa, datos y pila se direccionan por separado a pesar de poder solaparse. En un mo­mento dado hay siempre 4 bloques disponibles de memoria direc­cionable denominadas segmento. Cada uno de los segmento suele te­ner una longitud de 64k.

Los registros de segmento CS, DS, SS y ES se usan para apun­tar 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 tendre­mos 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 de­pende de los tipos de operaciones que se esté ejecutando. Por omi­sió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.

 DS : BX

      SI

      DI

segm:desplaz

CS : IP

SS : SP

     BP

ES : DI

     SI

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 ca­dena, el registro del segmento Extra ES constituye la base y el desplazamiento se almacena en DI o SI.

Puntero de Instrucción

IP: Puntero de instrucción

16 bits

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.

Registro de Indicadores                                       

15

.

.

.

11

10

9

8

7

6

.

4

.

2

.

0

OF

DF

IF

TF

SF

ZF

AF

PF

CF

FLAGS: Registro de Indicadores

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 vifur­cació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 opera­ció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 signi­ficativos 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 decre­mento 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 significati­vo 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 instruc­ción una detrás de otra. Un DEBUGGING puede usar este rango para procesar un programa instrucción a instruc­ción.

Bit 9. Indicador de interrupción (IF)  Se pone a 0 para desactivar la inte­rrupción externa y a 1 para activarla. IF se controla con la instrucción CLI (de­sactiva 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 direccio­nes 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 regis­tro extendido de AX es EAX.

Los procesadores 386 / 486 tienen 2 registros de segmento adi­cionales: FS y GS.

Registro de Datos Extendidos

H                          L

L  Low (Baja)

H  High (Alta)

AH   AX   AL

EAX: Acumulador

BH   BX   BL

EBX: Base

CH   CX   CL

ECX: Contador

DH   DX   DL

EDX: Extra

8 b.

8 b.

16 bits

16 bits

Total 32 bits

Registro Puntero e Indice Extendido

L  Low (Baja)

H  High (Alta)

SP

ESP: Puntero de Pila

 

BP

EBP: Puntero de Base

 

SI

ESI: Indice de Orden

 

DI

EDI: Indice de Destino

 

H

16 bits

L

16 bits

Total 32 bits

 

Puntero de Instrucción

Extendido

IP

EIP: Reg

16 bits

16 bits

Total 32 bits

Registro de Seg­mentos Extendidos

CS

CS: Segmentode Código

DS

DS: Segmentode Dato

SS

SS: Segmentode Pila

ES

ES: Segmento Extra

FS

FS: Segmento Extra

GS

GS: Segmento Extra

16 bits

Puntero de Bandera Extendida (EFlags)

 

31

30

.

.

.

.

.

.

.

.

.

.

19

18

17

16

15

14

13

12

11

10

9

.

.

.

.

.

.

.

10

 

A

V

R

N

I O P

OF

DF

CF

 

<------- 386/486 ------>

<--- 286/386/486 ---->

└--- Para todo los procesadores 8086 ->

IOP indica el nivel de protección para operaciones de Entra­da/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 instruc­ció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 

         Parte 1 Parte 2 Parte 3 Parte 4

Copyright © 1998-2012- DS Tecnologia® manager@dstecnologia.com.ar - Politica de Privacidad