0% encontró este documento útil (0 votos)
260 vistas5 páginas

Tutorial Del Ensamblador 8086

Este documento proporciona una introducción al lenguaje ensamblador 8086. Explica que el ensamblador es un lenguaje de bajo nivel que requiere conocimiento de la estructura interna de la computadora. Describe los principales componentes de la CPU 8086 como los registros de propósito general, registros de segmento, registros de propósito especial e instrucciones básicas como MOV. También explica cómo acceder a la memoria utilizando diferentes combinaciones de registros.
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd

Temas abordados

  • optimización de registros,
  • registros SS,
  • estructura de la computadora,
  • cálculo de direcciones físicas,
  • cálculo de desplazamientos,
  • registros BX,
  • lenguaje ensamblador,
  • comentarios en ensamblador,
  • desplazamientos,
  • registros BP
0% encontró este documento útil (0 votos)
260 vistas5 páginas

Tutorial Del Ensamblador 8086

Este documento proporciona una introducción al lenguaje ensamblador 8086. Explica que el ensamblador es un lenguaje de bajo nivel que requiere conocimiento de la estructura interna de la computadora. Describe los principales componentes de la CPU 8086 como los registros de propósito general, registros de segmento, registros de propósito especial e instrucciones básicas como MOV. También explica cómo acceder a la memoria utilizando diferentes combinaciones de registros.
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd

Temas abordados

  • optimización de registros,
  • registros SS,
  • estructura de la computadora,
  • cálculo de direcciones físicas,
  • cálculo de desplazamientos,
  • registros BX,
  • lenguaje ensamblador,
  • comentarios en ensamblador,
  • desplazamientos,
  • registros BP

Tutorial del ensamblador 8086

¿Qué es el lenguaje ensamblador?

El lenguaje ensamblador es un lenguaje de programación de bajo nivel. Se necesita un poco de


conocimiento sobre la estructura de la computadora para comprender. El modelo de computadora
simple es la siguiente:

El bus del sistema (que se muestra en amarillo) conecta los diversos componentes de una
computadora.
La CPU es el corazón de la computadora, la mayoría de los cálculos ocurren dentro de la CPU.
La memoria RAM es un lugar donde se cargan los programas para ser ejecutados.

Vista de la CPU

Registros de propósito general

La CPU 8086 tiene 8 registros de propósito general, cada registro tiene su propio nombre:
• AX - el registro del acumulador (dividido en AH / AL).
• BX - el registro de dirección base (dividido en BH / BL).
• CX - el registro de conteo (dividido en CH / CL).
• DX - el registro de datos (dividido en DH / DL).
• SI - registro de índice de fuente.
• DI - registro de índice de destino.
• BP - puntero base.
• SP - puntero de pila.

A pesar del nombre de un registro, es el programador quien determina el uso de cada registro de
propósito general. el objetivo principal de un registro es mantener un número (variable). el tamaño de
los registros anteriores es de 16 bits, es algo como: 0011000000111001b (en forma binaria), o 12345
en forma decimal (humana).

Los 4 registros de propósito general (AX, BX, CX, DX) están formados por dos registros separados de
8 bits, por ejemplo, si AX= 0011000000111001b, entonces AH=00110000b y AL=00111001b. por lo
tanto, cuando modifica cualquiera de los registros de 8 bits, también se actualiza el registro de 16 bits,
y viceversa. lo mismo es para los otros 3 registros, "H" es para la parte alta y "L" es para la parte baja.

Debido a que los registros están ubicados dentro de la CPU, son mucho más rápidos que la memoria.
acceder a una ubicación de memoria requiere el uso de un bus del sistema, por lo que lleva mucho
más tiempo. Acceder a los datos de un registro no suele llevar tiempo. Por lo tanto, debe intentar
mantener las variables en los registros. Los conjuntos de registros son muy pequeños y la mayoría de
los registros tienen propósitos especiales que limitan su uso como variables, pero siguen siendo un
excelente lugar para almacenar datos temporales de cálculos.

Registros de segmento

• CS: apunta al segmento que contiene el programa actual.


• DS: generalmente apunta al segmento donde se definen las variables.
• ES: registro de segmento extra, depende de un codificador definir su uso.
• SS: apunta al segmento que contiene la pila.
Aunque es posible almacenar cualquier dato en los registros de segmento, nunca es una buena idea.
Los registros de segmento tienen un propósito muy especial: apuntar a bloques de memoria
accesibles.

Los registros de segmento funcionan junto con el registro de propósito general para acceder a
cualquier valor de memoria. Por ejemplo, si deseamos acceder a la memoria en la dirección física
12345h (hexadecimal), debemos configurar DS = 1230h y SI = 0045h. Esto es bueno, ya que de esta
forma podemos acceder a mucha más memoria que con un solo registro que está limitado a valores
de 16 bits.
La CPU realiza un cálculo de la dirección física al multiplicar el registro del segmento por 10h y
agregarle un registro de propósito general (1230h * 10h + 45h = 12345h):

La dirección formada con 2 registros se llama dirección efectiva.


Por defecto, los registros BX, SI y DI funcionan con el registro de segmento DS; BP y SP funcionan
con registro de segmento SS.
Otros registros de propósito general no pueden formar una dirección efectiva

Registros de propósito especial

• IP: el puntero de instrucciones.


• PSW: registro de estados - determina el estado actual del microprocesador.

El registro de IP siempre funciona junto con el registro de segmento CS y apunta a la instrucción que
se está ejecutando actualmente.
El registro de estados es modificado automáticamente por la CPU después de las operaciones
matemáticas, esto permite determinar el tipo de resultado y determinar las condiciones para transferir
el control a otras partes del programa.
Generalmente no se puede acceder a estos registros directamente, de la misma forma que puede
acceder a AX y otros registros generales, pero es posible cambiar los valores de los registros del
sistema utilizando algunos trucos que aprenderá un poco más adelante.

Acceso a la memoria

Para acceder a la memoria podemos usar estos cuatro registros: BX, SI, DI, BP.
Combinando estos registros dentro de los símbolos [], podemos obtener diferentes ubicaciones de
memoria. estas combinaciones son compatibles (modos de direccionamiento):

[BX + SI] [SI] [BX + SI + d8]


[BX + DI] [DI] [BX + DI + d8]
[BP + SI] d16 (variable offset only) [BP + SI + d8]
[BP + DI] [BX] [BP + DI + d8]

[SI + d8] [BX + SI + d16] [SI + d16]


[DI + d8] [BX + DI + d16] [DI + d16]
[BP + d8] [BP + SI + d16] [BP + d16]
[BX + d8] [BP + DI + d16] [BX + d16]

d8 - desplazamiento inmediato de 8 bits (por ejemplo: 22, 55h, -1, etc...)

d16 - desplazamiento inmediato de 16 bits (por ejemplo: 300, 5517h, -259, etc...).
El desplazamiento puede ser un valor inmediato o el desplazamiento de una variable, o incluso ambos.
Si hay varios valores, el ensamblador evalúa todos los valores y calcula un único valor inmediato.

El desplazamiento puede estar dentro o fuera de los símbolos [ ], el ensamblador genera el mismo
código de máquina para ambos sentidos.

El desplazamiento es un valor con signo, por lo que puede ser tanto positivo como negativo.

Generalmente, el compilador se preocupa por la diferencia entre d8 y d16, y genera el código de


máquina requerido.

Por ejemplo, supongamos que DS = 100, BX = 30, SI = 70.


El siguiente modo de direccionamiento: [BX + SI] + 25
Se calcula por procesador a esta dirección física: 100 * 16 + 30 + 70 + 25 = 1725.

Por defecto, el registro de segmento DS se usa para todos los modos, excepto aquellos con registro
BP, para estos se usa el registro de segmento SS.

hay una manera fácil de recordar todas esas combinaciones posibles usando este cuadro:
Puede formar todas las combinaciones válidas tomando solo un elemento de cada columna o
saltándose la columna al no tomar nada de ella. como ves, BX y BP nunca van juntos. SI y DI tampoco
van juntos. aquí hay algunos ejemplos de modos de direccionamiento válidos: [BX+5] , [BX+SI] ,
[DI+BX-4]

________________________________________

El valor en el registro de segmento (CS, DS, SS, ES) se llama segmento, y el valor en el registro de
propósito (BX, SI, DI, BP) se denomina compensación.
Cuando DS contiene el valor 1234h y SI contiene el valor 7890h, también se puede registrar como
1234:7890. La dirección física será 1234h * 10h + 7890h = 19BD0h.

Si a un número decimal se le suma cero se multiplica por 10, sin embargo, 10h = 16, entonces si a un
valor hexadecimal se le suma cero se multiplica por 16, por ejemplo:

7h = 7
70h = 112
________________________________________

Para indicar al compilador sobre el tipo de datos, se deben usar estos prefijos:

byte ptr - por byte.


word ptr - para palabra (dos bytes).

Por ejemplo:

byte ptr [BX] ; acceso de bytes.


o
word ptr [BX] ; acceso a la palabra.
El ensamblador también admite prefijos más cortos:

b. - para byte ptr


w. - para la palabra ptr

En ciertos casos, el ensamblador puede calcular el tipo de datos automáticamente.


________________________________________

instrucción MOV

• copia el segundo operando (origen) al primer operando (destino).


• el operando fuente puede ser un valor inmediato, un registro de propósito general o una
ubicación de memoria.
• el registro de destino puede ser un registro de uso general o una ubicación de memoria.
• ambos operandos deben tener el mismo tamaño, que puede ser un byte o una palabra.

Estos tipos de operandos son compatibles:


MOV REG, memoria
MOV Memoria, REG
MOV REG, REG
MOV Memoria, inmediata
MOV REG, inmediato
REG: AX, BX, CX, DX, AH, AL, BL, BH, CH, CL, DH, DL, DI, SI, BP, SP.

memoria: [BX], [BX+SI+7], variable, etc...

inmediato: 5, -24, 3Fh, 10001101b, etc...

Para los registros de segmento solo se admiten estos tipos de MOV:


MOV SREG, memoria
MOV memoria, SREG
REG MOV, SREG
MOV SREG, REG
SREG: DS, ES, SS, y solo como segundo operando: CS.

REG: AX, BX, CX, DX, AH, AL, BL, BH, CH, CL, DH, DL, DI, SI, BP, SP.

memoria: [BX], [BX+SI+7], variable, etc...

la instrucción MOV no se puede utilizar para establecer el valor de los registros CS e IP.

Aquí hay un programa corto que demuestra el uso de la instrucción MOV:

ORG 100h; esta directiva es necesaria para un programa *.com simple de 1 segmento.
MOV AX, 0B800h; establezca AX en el valor hexadecimal de B800h.
MOV DS, AX; copia el valor de AX a DS.
MOV CL, 'A'; establezca CL en el código ASCII de 'A', son 41 h.
MOV CH, 1101_1111b; establezca CH en valor binario.
MOV BX, 15Eh; establecer BX a 15Eh.
MOV [BX], CX; copie el contenido de CX a la memoria en B800: 015E
RET; vuelve al sistema operativo.

Puede copiar y pegar el programa anterior en el editor de código y presionar el botón [Compilar y
Emular] (o presionar la tecla F5 en su teclado).

La ventana del emulador debe abrirse con este programa cargado, haga clic en el botón [Paso único]
y observe los valores de registro.

Como hacer copiar y pegar:

1. Seleccione el texto anterior con el mouse, haga clic antes del texto y arrástrelo hacia abajo
hasta que todo esté seleccionado.
2. Presione la combinación Ctrl + C para copiar.
3. Vaya al editor de código fuente y presione la combinación Ctrl + V para pegar.

Como puede adivinar, ";" se usa para comentarios, cualquier cosa después de ";" el símbolo es
ignorado

Common questions

Con tecnología de IA

En el ensamblador 8086, el registro de segmento SS está destinado a apuntar al segmento que contiene la pila. Este registro interactúa especialmente con BP (base pointer) y SP (stack pointer) para facilitar el acceso a las direcciones de la pila durante las operaciones de subrutinas y procedimientos, permitiendo el desplazamiento correcto dentro del segmento de la pila .

Los modos de direccionamiento [BX + SI] y [BP + DI] en ensamblador 8086 se utilizan para acceder a ubicaciones de memoria combinando registros de propósito general. [BX + SI] generalmente se emplea para operar sobre datos en el segmento de datos (DS), mientras que [BP + DI] se utiliza para operar dentro del segmento de pila (SS) debido al uso del BP. Ambos modos permiten un desplazamiento flexible durante el cálculo de direcciones, pero cada uno se asocia de forma predeterminada a distintos segmentos de registro: DS para [BX + SI] y SS para [BP + DI].

En ensamblador 8086, los modos de direccionamiento se forman combinando registros de propósito general junto con un posible desplazamiento para calcular una ubicación de memoria. Los registros BX, SI, DI y BP se pueden combinar de manera específica, como [BX+SI] o [BP+DI+d8], donde d8 es un desplazamiento inmediato de 8 bits. Por ejemplo, con DS=100, BX=30 y SI=70, el modo [BX+SI]+25 se calcula por el procesador como: 100*16 + 30 + 70 + 25 = 1725, formando una dirección efectiva .

La instrucción MOV en ensamblador 8086 tiene restricciones específicas respecto a ciertos registros. No se puede usar la instrucción MOV para establecer directamente los valores de los registros CS e IP. Este es un caso especial para garantizar que el flujo de control del programa no se altere accidentalmente a través de una operación simple de MOV. En cambio, los registros CS e IP se ajustan a través de saltos y llamadas de subrutinas .

La elección entre un desplazamiento de 8 bits (d8) y 16 bits (d16) es crucial en el ensamblador 8086 ya que afecta el rango y la flexibilidad de direccionamiento. Un d8 es suficiente para desplazamientos cortos, optimizando el uso de memoria y tiempo de ejecución. Sin embargo, d16 es esencial para acceder a rangos más amplios de memoria cuando el desplazamiento d8 no es suficiente. La diferencia es decisiva especialmente en programas que manejan estructuras de datos grandes o múltiples segmentos de memoria .

Los prefijos como byte ptr y word ptr en ensamblador 8086 indican al compilador el tamaño del dato que se desea manipular, asegurando operaciones correctas y optimizando el uso de memoria. Byte ptr indica acceso a un byte, mientras que word ptr se refiere a una palabra (16 bits). Por ejemplo, el uso de 'byte ptr [BX]' lee o escribe un byte, distinto a 'word ptr [BX]', que opera sobre dos bytes consecutivos, ajustando los operandos y asegurando que las operaciones sean precisas respecto al tipo de datos .

La instrucción MOV en ensamblador 8086 se utiliza para copiar valores de un operando fuente a uno destino. Los operandos deben ser del mismo tamaño, pudiendo ser registros o ubicaciones de memoria. Ejemplo: para copiar el contenido de AX a BX, usaríamos la instrucción MOV BX, AX. Para copiar un valor inmediato en un registro: MOV AL, 5. Ejemplo de código que copia un valor inmediato en un registro: ``` MOV AX, 0B800h MOV DS, AX MOV CL, 'A' MOV [BX], CL ``` Esto pone el carácter 'A' en la dirección de memoria indicada por BX .

Usar registros de segmento para almacenar datos en ensamblador 8086 no es una práctica aconsejable, ya que estos registros tienen un uso muy especializado al apuntar a bloques de memoria accesibles. Los registros de segmento (como CS, DS, SS, ES) son cruciales para formar direcciones efectivas, y usarlos para almacenar datos podría comprometer la capacidad del programa para acceder a memoria de manera eficiente y correcta .

El registro IP, o puntero de instrucciones, funciona con el registro de segmento CS para señalar la instrucción que se ejecutará a continuación en el programa. Por otro lado, el registro PSW (registro de estados) determina el estado actual del microprocesador y es modificado automáticamente por la CPU tras operaciones matemáticas, permitiendo determinar el resultado y condiciones para transferir el control del programa .

En el 8086, los registros de propósito general (como BX, SI, DI, BP) trabajan en conjunto con los registros de segmento para acceder a la memoria. Los registros de propósito general se utilizan para calcular el desplazamiento dentro de un segmento, mientras que los registros de segmento (como DS, SS, CS, ES) apuntan a bloques específicos de memoria. Por ejemplo, si queremos acceder a la dirección física 12345h, configuraríamos DS=1230h y SI=0045h, permitiendo que el 8086 realice el cálculo de la dirección efectiva como 1230h * 10h + 45h = 12345h .

También podría gustarte