PDF de programación - Manual de Ensamblador

Imágen de pdf Manual de Ensamblador

Manual de Ensambladorgráfica de visualizaciones

Actualizado el 21 de Marzo del 2018 (Publicado el 20 de Febrero del 2018)
1.458 visualizaciones desde el 20 de Febrero del 2018
435,4 KB
35 paginas
Creado hace 18a (21/10/2005)
Índice

0. Introducción
1. Arquitectura Del 8086

1.1. Registros del 8086. Segmentación

1.1.1. Registros de propósito general
1.1.2. Registros de segmento

1.1.2.1. Segmentación y direccionamiento

1.1.3. Registro apuntador de instrucciones (IP).
1.1.4. Registros apuntadores (SP y BP).
1.1.5. Registros índice (SI y DI).
1.1.6. Registro de banderas, flags, o registro de estado (FL).

1.2. Modos de direccionamiento

1.2.1. Registros de segmento por defecto
1.2.2. Direccionamiento de localidades de memoria

1.3. Pila (stack).

2. Conjunto de instrucciones.
3. Programación del PC sobre dos
3.1. Directivas del ensamblador

3.1.1. Directivas para declaración y manejo de segmentos.
3.1.2. Directivas para definición de datos.
3.1.3. Etiquetas y variables
3.1.4. Constantes numéricas
3.1.5. La Directiva EQU.
3.2. Esquema de un programa
3.3. Ensamblado, linkado y montado
3.4. Procedimientos

3.4.1. Paso de parámetros a procedimientos

3.4.1.1. Registros
3.4.1.2. Memoria Intermedia
3.4.1.3. Pila

3.5. Macros

3.5.1. Paso de parámetros a las macros

3.6. Interrupciones en el PC

Interrupciones sectorizadas

3.6.1. Tratamiento de interrupciones
3.6.2.
3.6.3. Tipos de interrupciones.
3.6.4. Capturar una interrupción

3.7. La memoria de vídeo

3.7.1. El sistema de visualización
3.7.2. El modo texto.
3.7.3. El modo gráfico

3.8. Programas .COM
3.9. Programas residentes

Este documento, más que un manual de programación en ensamblador del procesador de Intel
8086, es una manual de prácticas para los alumnos de Arquitectura e Computadores, ya que se han
omitido intencionalmente muchos detalles y características de este lenguaje. Además sólo se hace
mención a la programación en MS-DOS y con el ensamblador TASM de Borland.


1.- ARQUITECTURA DEL 8086.


En 1978 Intel presentó el procesador 8086. Poco después, desarrolló una variación del 8086
para ofrecer un diseño ligeramente más sencillo y compatibilidad con los dispositivos de
entrada/salida de ese momento. Este nuevo procesador, el 8088, fue seleccionado por IBM para su
PC en 1981. Ambos poseen una arquitectura interna de 16 bits y pueden trabajar con operandos de
8 y 16 bits; una capacidad de direccionamiento de 20 bits, es decir, existe la posibilidad de
direccionar 220 posiciones de memoria (bytes), lo que equivale a 1Mb de memoria principal y
comparten el mismo conjunto de 92 instrucciones.


0.- INTRODUCCIÓN.


La estructura interna del 8086 puede verse en la Figura 2. El 8086 se divide en dos unidades
lógicas: una unidad de ejecución (EU) y una unidad de interfaz del bus (BIU). El papel de la EU
es ejecutar instrucciones, mientras que la BIU envía instrucciones y datos a la EU. La EU posee una
unidad aritmético-lógica, una unidad de control y 10 registros. Permite ejecutar las instrucciones,
realizando todas las operaciones aritméticas, lógicas y de control necesarias.




1.1.- Registros del 8086. Segmentación

Figura 2. Arquitectura interna del 8086.



Los registros del procesador tienen como misión fundamental almacenar las posiciones de
memoria que van a sufrir repetidas manipulaciones, ya que los accesos a memoria son mucho más
lentos que los accesos a los registros. El 8086 dispone de 14 registros de 16 bits que se emplean
para controlar la ejecución de instrucciones, direccionar la memoria y proporcionar capacidad
aritmética y lógica. Cada registro puede almacenar datos o direcciones de memoria. Los registros
son direccionables por medio de un nombre. Por convención los bits de un registro se numeran de
derecha a izquierda:


14
0

13
0

12
0

11
0

10
1

9
1

8
0

7
1

6
0

5
0

4
0

3
1

2
1

1
1

0
0

Los diferentes registros del 8086 se clasifican en: registros de propósito general o de datos,
registros de segmento, registro apuntador de instrucciones (IP), registros apuntadores (SP y BP),
registros índice (SI y DI) y registro de banderas, FLAGS o registro de estado (FL).









CS
DS
SS
ES

Registros de
segmento









IP

FLAGS o FL
Registro puntero
de instrucciones;
y Registro de
banderas,
FLAGS o de
estado (FL)


Figura 3. Registros del 8086/88 y del 80286.

15
1








AX
BX
CX
DX

Registros de
propósito
general
o de datos










SP
BP
SI
DI
Registros
punteros y
Registros
índice



1.1.1.- Registros de propósito general.


Se utilizan para cálculo y almacenamiento de propósito general. Los programas leen datos de
memoria y los dejan en estos registros, ejecutan operaciones sobre ellos, y guardan los resultados en
memoria. Hay cuatro registros de propósito general que, aparte de ser usados a voluntad por el
programador, tienen fines específicos:

Registro AX

Este registro es el acumulador principal, implicado en gran parte de las
operaciones de aritméticas y de E/S.
Recibe el nombre de registro base ya que es el único registro de propósito general
que se usa como un índice en el direccionamiento indexado. Se suele utilizar para
cálculos aritméticos.
El CX es conocido como registro contador ya que puede contener un valor para
controlar el número de veces que se repite una cierta operación.
Se conoce como registro de datos. Algunas operaciones de E/S requieren su uso,
y las operaciones de multiplicación y división con cifras grandes suponen que el
DX y el AX trabajando juntos

Registro BX

Registro CX

Registro DX

Los registros de propósito general se pueden direccionar como una palabra o como un byte.
El byte de la izquierda es la parte alta o byte más significativo y el byte de la derecha es la parte o
byte menos significativo.






RH

RX

RL

Siguiendo esta nomenclatura, es posible referirse a cada uno de los dos bytes, byte de orden
alto o más significativo y byte de orden bajo o menos significativo, de cada uno de estos registros.
Por ejemplo: AH es el byte más significativo del registro AX, mientras que AL es el byte menos
significativo.


Así, por ejemplo, si AX contiene 00FFh, AH=00h (su parte alta) y AL=FFh (su parte baja); si
lo incrementamos en 1, AX pasa a valer 0100h (lógicamente), y con ello AH=01h, AL=00h. Si en
lugar de incrementar en 1 AX lo hacemos con AL (byte inferior), AH se quedará como estaba y AL
será FFh+01h=00h, es decir, AX=0000h (vamos, que cuando se manipula una parte del registro la
otra no se ve afectada en absoluto, pero, obviamente, sí el registro completo)


Uno puede mover los datos de unos registros a otros con prácticamente total libertad.
También podremos realizar operaciones sobre ellos, como sumar el contenido de BX y DX para
guardar el resultado en DX, y cosas así. La primera restricción al respecto (y bastante razonable) es
que los operandos tendrán que ser del mismo tamaño (no podremos sumar BX con DH, por
ejemplo).


1.1.2.- Registros de Segmento.


Los registros de segmento son registros de 16 bits que constituyen la implementación física
de la arquitectura segmentada del 8086. Para entender para qué sirven estos registros primero
debemos explicar brevemente en que consiste la segmentación.

1.1.2.1.- Segmentos y direccionamiento


Para acceder a una dirección de memoria lo lógico sería colocar dicha dirección completa en
un registro y acceder mediante este. Sin embargo el 8086 tiene 20 líneas en el bus de direcciones
(20 bits) mientras que sus registros son de 16 bits, de forma que siguiendo esta filosofía solo
podríamos direccionar 64KBytes (216) del mega posible (220).


La solución a esto consistió en usar dos registros de 16 bits, pero no dispuestos
consecutivamente, ya que obtendríamos una dirección de 32 bits pasándonos del rango de memoria
disponible, sino que un registro especifica un bloque de memoria, el segmento, y el otro un
desplazamiento u offset dentro de este bloque. Puesto que utilizamos registros de 16 bits tendremos
64K posibles segmentos de 64 KBytes cada uno.


Para direccionar cualquier posición de memoria, el procesador combina la dirección del
segmento que se encuentra en un registro de segmento con un valor de desplazamiento, para
calcular la dirección real de 20 bits.


Figura 4. Construcción de una dirección de memoria en base a una dirección de segmento y una



dirección de offset.



Como vemos en la figura anterior, lo primero que se hace es añadir 4 bits a 0 al valor que se
encuentra en el registro de segmento, lo cual es equivalente a multiplicar dicho valor por 16. Es por
esto que cualquier segmento empieza siempre en una dirección de memoria (de 20 bits) múltiplo de
16, esto es, el segmento 0 comenzaría en la dirección 00000h y acabaría en la 0FFFFh; el segmento
1 comenzaría en la dirección 00010h (16 en hexadecimal) y acabaría en la 1000Fh; etc




16 bytes


16 bytes

SEG 0

SEG 1








00000h (0000:0000)

00010h (0001:0000)

·
·
·

0FFFFh (0000:FFFF)

1000Fh (0001:FFFF)





Figura 5. Segmentación de la memoria

Por tanto, como podemos ver en la figura, los distintos segmentos se solapan, esto es, hay

pares segmento-offset que apuntan a la misma dirección de memoria.

Por ejemplo, dado el segmento 045EH y un desplazamiento de 0032H:

y, dado el segmento 045FH y un desplazamiento de 0022H:

Dirección del segmento:
Desplazamiento dentro del segmento:
Dirección real:

Dirección del segmento:
Desplazamiento dentro del segmento:
Dirección real:










045E0H
+0032H
04612H

045F0H
+0022H
04612H

Ahora bien, un programa puede tener uno o varios segmentos, los cuales pueden comenzar en

casi cualquier lugar de la memoria, variar en tamaño y estar en cualquier orden, pero en general,
tendrá un segmento para
  • Links de descarga
http://lwp-l.com/pdf8925

Comentarios de: Manual de Ensamblador (0)


No hay comentarios
 

Comentar...

Nombre
Correo (no se visualiza en la web)
Valoración
Comentarios...
CerrarCerrar
CerrarCerrar
Cerrar

Tienes que ser un usuario registrado para poder insertar imágenes, archivos y/o videos.

Puedes registrarte o validarte desde aquí.

Codigo
Negrita
Subrayado
Tachado
Cursiva
Insertar enlace
Imagen externa
Emoticon
Tabular
Centrar
Titulo
Linea
Disminuir
Aumentar
Vista preliminar
sonreir
dientes
lengua
guiño
enfadado
confundido
llorar
avergonzado
sorprendido
triste
sol
estrella
jarra
camara
taza de cafe
email
beso
bombilla
amor
mal
bien
Es necesario revisar y aceptar las políticas de privacidad