Assembly es un lenguaje de programacion de bajo nivel que traduce directamente a las instrucciones ejecutables por el procesador. Cada instruccion en assembly corresponde a una operacion especifica que el hardware puede realizar. Es usado para obtener un control preciso sobre el hardware y optimizar el rendimiento.
En el procesador 8086, los registros son de 16 bits, aunque algunos se pueden dividir en partes de 8 bits:
- Registros de datos: AX (AH/AL), BX (BH/BL), CX (CH/CL), DX (DH/DL).
- Registros de puntero e indice: SP (Stack Pointer), BP (Base Pointer), SI (Source Index), DI (Destination Index).
- Registros de segmento: CS (Code Segment), DS (Data Segment), SS (Stack Segment), ES (Extra Segment).
- Registro de estado: FLAGS, que contiene indicadores como Zero Flag (ZF), Carry Flag (CF), etc.
Cada registro tiene un tamaño de 16 bits, permitiendo manejar valores entre 0 y 65,535 en decimal o 0x0000 a 0xFFFF en hexadecimal.
+-------------------------------------+
| 8086 |
+-------------------------------------+
| | |
+-------------------+--------+-------+-------------------+
| | | | |
+---------------+ +---------------+ +---------------+ +---------------+
| ALU | | Registros | | Bus de | | Unidad de |
| (Aritmetica y | | Proposito | | Direcciones | | Control |
| Logica) | | General | | y Datos | | |
+---------------+ +---------------+ +---------------+ +---------------+
| | | |
+---------------+ +---------------+ +---------------+ +---------------+
| Registros | | Registros | | Bus de | | Interfaz |
| de Segmentos | | de Proposito | | Entrada/Salida| | Externa |
| (CS, DS, SS,| | (AX, BX, CX,| | (DMA, Puertos | | de Memoria |
| ES) | | DX, SI, DI) | | de E/S) | | |
+---------------+ +---------------+ +---------------+ +---------------+
| |
+---------------+ +----------------+
| Unidad de | | Controlador |
| Buses | | de Interrup- |
| (Direccion, | | ciones y |
| Datos) | | de Memoria |
+---------------+ +----------------+
El 8086 pertenece a la arquitectura CISC (Complex Instruction Set Computer). Sus caracteristicas principales son:
- Conjunto de instrucciones extenso: Permite realizar operaciones complejas con pocas instrucciones.
- Modos de direccionamiento variados: Directo, indirecto, basado en registros, indexado, entre otros.
- Ciclos de instruccion variables: Dependiendo de la complejidad de cada instruccion.
- Acceso directo a memoria: Permite trabajar con datos almacenados en memoria sin moverlos a registros intermedios.
+-------------------------+
| Instrucciones CISC |
+-------------------------+
|
v
+---------------------------------------------+
| Decodificador de Instrucciones |
+---------------------------------------------+
|
v
+---------------------------------------------+
| Unidad de Control |
+---------------------------------------------+
|
v
+---------------------------------------------+
| Registros de la CPU |
| (Acumulador, Contador de Programa, etc.) |
+---------------------------------------------+
|
v
+---------------------------------------------+
| Unidad Aritmetica y Logica (ALU) |
+---------------------------------------------+
|
v
+---------------------------------------------+
| Memoria (RAM/Cache) |
+---------------------------------------------+
|
v
+---------------------------------------------+
| Entrada/Salida (I/O) |
+---------------------------------------------+
El paradigma del ensamblador 8086 es imperativo y orientado a la arquitectura. El programador controla directamente el flujo de ejecucion, los registros y la memoria. Esto permite un alto nivel de optimizacion y eficiencia en el uso del hardware.
El procesador 8086 utiliza segmentacion de memoria para acceder a hasta 1 MB (2^20 direcciones) de memoria fisica, dividiendola en segmentos de 64 KB (2^16 direcciones) cada uno. Los segmentos se combinan con un desplazamiento para calcular una direccion fisica:
+---------------------------------------------+
| Memoria RAM 8086 |
| (1 MB de memoria) |
+---------------------------------------------+
| Segmento 0 (Direccion Base 0x0000) |
| +---------------------------------------+ |
| | Segmento 0x0000 - 0xFFFF | |
| +---------------------------------------+ |
| |
+---------------------------------------------+
| Segmento 1 (Direccion Base 0x1000) |
| +---------------------------------------+ |
| | Segmento 0x1000 - 0x1FFF | |
| +---------------------------------------+ |
| |
+---------------------------------------------+
| Segmento 2 (Direccion Base 0x2000) |
| +---------------------------------------+ |
| | Segmento 0x2000 - 0x2FFF | |
| +---------------------------------------+ |
| |
+---------------------------------------------+
| Segmento 3 (Direccion Base 0x3000) |
| +---------------------------------------+ |
| | Segmento 0x3000 - 0x3FFF | |
| +---------------------------------------+ |
| |
+---------------------------------------------+
| Segmento 4 (Direccion Base 0x4000) |
| +---------------------------------------+ |
| | Segmento 0x4000 - 0x4FFF | |
| +---------------------------------------+ |
| |
+---------------------------------------------+
| Segmento 5 (Direccion Base 0x5000) |
| +---------------------------------------+ |
| | Segmento 0x5000 - 0x5FFF | |
| +---------------------------------------+ |
| |
+---------------------------------------------+
| Segmento 6 (Direccion Base 0x6000) |
| +---------------------------------------+ |
| | Segmento 0x6000 - 0x6FFF | |
| +---------------------------------------+ |
| |
+---------------------------------------------+
| Segmento 7 (Direccion Base 0x7000) |
| +---------------------------------------+ |
| | Segmento 0x7000 - 0x7FFF | |
| +---------------------------------------+ |
| |
+---------------------------------------------+
| ... |
+---------------------------------------------+
| Segmento 15 (Direccion Base 0xF000) |
| +---------------------------------------+ |
| | Segmento 0xF000 - 0xFFFF | |
| +---------------------------------------+ |
+---------------------------------------------+
En sistemas que utilizan segmentacion de memoria, una direccion como 3:12:05 puede dividirse en componentes que representan diferentes niveles de organizacion en la memoria, tales como segmentos, paginas y desplazamientos dentro de las paginas.
El numero de segmento indica la base o el inicio de un bloque de memoria. Cada segmento tiene un tamaño fijo, generalmente de 64 KB.
- En este ejemplo, el segmento esta identificado por el valor
3, lo que significa que es el tercer bloque de memoria dentro de la organizacion de segmentos.
El numero de pagina representa una subdivision dentro del segmento. Si consideramos el segmento como un conjunto mas grande de datos, la pagina organiza estos datos en bloques mas pequeños.
- Aqui, el valor
12identifica la pagina especifica dentro del tercer segmento. Este valor ayuda a acceder de manera estructurada a areas mas pequeñas de la memoria segmentada.
El numero dentro de la pagina, tambien llamado desplazamiento u offset, especifica la ubicacion exacta dentro de una pagina donde se encuentran los datos.
- En este caso, el valor
05apunta al sexto elemento (contando desde cero) dentro de la pagina identificada como12.
Segmento: 3
+---------------------------------------------------------------+
| Pagina 0 |
| Direcciones: 0x0000 - 0x00FF (256 direcciones) |
|---------------------------------------------------------------|
| Pagina 1 |
| Direcciones: 0x0100 - 0x01FF (256 direcciones) |
|---------------------------------------------------------------|
| Pagina 2 |
| Direcciones: 0x0200 - 0x02FF (256 direcciones) |
|---------------------------------------------------------------|
| Pagina 3 |
| Direcciones: 0x0300 - 0x03FF (256 direcciones) |
|---------------------------------------------------------------|
| Pagina 4 |
| Direcciones: 0x0400 - 0x04FF (256 direcciones) |
|---------------------------------------------------------------|
| ... |
|---------------------------------------------------------------|
| Pagina 255 |
| Direcciones: 0xFF00 - 0xFFFF (256 direcciones) |
+---------------------------------------------------------------+
- Segmento (16 bits)
- Desplazamiento (offset, 16 bits)
La direccion fisica se calcula asi:
Direccion Fisica = (Segmento × 16) + Desplazamiento
Por ejemplo:
- Segmento: 0x1234
- Desplazamiento: 0x5678
- Direccion Fisica: (0x1234 × 16) + 0x5678 = 0x12340 + 0x5678 = 0x179B8
- Cada segmento puede contener hasta 64 KB.
- Los registros de segmento (CS, DS, SS, ES) definen la ubicacion base de un segmento.
- Se pueden usar registros como SI y DI para especificar el desplazamiento dentro del segmento.
El sistema hexadecimal utiliza 16 simbolos: 0-9 y A-F. Cada digito hexadecimal representa 4 bits (un nibble). Por ejemplo:
- Decimal: 255
- Binario: 11111111
- Hexadecimal: 0xFF
En el 8086, las direcciones y valores suelen expresarse en hexadecimal para simplificar la representacion de datos binarios.