Sei sulla pagina 1di 6

8086 ensamblador tutorial para principiantes (parte 1)

este tutorial está destinado a aquellos que no están familiarizados con el ensamblador en
absoluto, o tener una idea muy lejana al respecto. por supuesto si tienes conocimiento de
algún lenguaje de programación de alto nivel (java, básico, c / c ++, pascal ...) que te puede
ayudar mucho.
pero incluso si usted está familiarizado con el ensamblador, sigue siendo una buena idea
mirar a través de este documento con el fin de estudiar la sintaxis emu8086.
se supone que usted tiene algún conocimiento sobre la representación numérica (hex /
bin), si no es altamente recomendable estudiar el tutorial de sistemas de numeración
antes de proceder.
¿Qué es lenguaje ensamblador?
lenguaje de ensamblaje es un lenguaje de programación de bajo nivel. usted necesita
conseguir un cierto conocimiento sobre la estructura de computadora para entender
cualquier cosa. el modelo de computadora simple como lo veo:

el bus del sistema (mostrado en amarillo) conecta los diversos componentes de un


ordenador.
La CPU es el corazón de la computadora, la mayoría de los cálculos ocurren dentro de la
CPU.
RAM es un lugar donde se cargan los programas para ser ejecutados.
dentro de la CPU
registros de uso general
CPU 8086 tiene 8 registros de uso general, cada registro tiene su propio nombre:
AX - el registro del acumulador (dividido en AH / AL).
BX - el registro de la dirección base (dividido en BH / BL).
CX - el registro de cuenta (dividido en CH / CL).
DX - el registro de datos (dividido en DH / DL).
SI - registro del índice fuente.
DI - registro del índice de destino.
BP - puntero de base.
SP - puntero de pila.

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

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

porque los registros están situados dentro de la CPU, son mucho más rápidos que la
memoria. el acceso a una ubicación de memoria requiere el uso de un bus de sistema, por
lo que tarda mucho más. acceder a los datos en un registro normalmente no toma tiempo.
por lo tanto, debe intentar mantener 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 segmentos
CS - señala el segmento que contiene el programa actual.
DS - generalmente apunta al segmento donde se definen las variables.
ES - registro de segmento extra, es hasta un codificador para definir su uso.
SS - puntos en el segmento que contiene la pila.
aunque es posible almacenar cualquier dato en los registros de segmentos, esto nunca es
una buena idea. los registros de segmento tienen un propósito muy especial - apuntando
a los bloques de memoria accesibles.

los registros de segmentos trabajan junto con el registro de propósito general para
acceder a cualquier valor de memoria. Por ejemplo, si nos gustaría acceder a la memoria
en la dirección física 12345h (hexadecimal), debemos establecer el DS = 1230h y SI =
0045h. Esto es bueno, ya que de esta manera podemos acceder a mucha más memoria
que con un solo registro que está limitado a valores de 16 bits.
CPU hace un cálculo de dirección física multiplicando el registro de segmento por 10h y
agregando el registro de propósito general a él (1230h * 10h + 45h = 12345h):

la dirección formada con 2 registros se llama una dirección efectiva.


por defecto los registros BX, SI y DI trabajan con el registro de segmento DS;
BP y SP trabajan con el registro de segmento SS.
¡Otros registros de propósito general no pueden formar una dirección efectiva!
también, aunque BX puede formar una dirección efectiva, BH y BL no pueden.
registros de propósito especial
IP - el puntero de instrucción.
flags register - determina el estado actual del microprocesador.
El registro de IP siempre trabaja junto con el registro de segmento CS y apunta a la
instrucción en ejecución.
flags se modifica automáticamente por la CPU después de 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, la forma en que se
puede acceder a AX y otros registros generales, pero es posible cambiar los valores de los
registros del sistema con algunos trucos que
Acceso a la memoria
para acceder a la memoria podemos utilizar estos cuatro registros: BX, SI, DI, BP.
combinando estos registros dentro de símbolos [], podemos obtener diferentes
ubicaciones de memoria. estas combinaciones son compatibles (modos de
direccionamiento):
d8 - permanece para desplazamiento inmediato firmado de 8 bits (por ejemplo: 22, 55h, -
1, etc ...)
d16 - permanece para desplazamiento inmediato firmado de 16 bits (por ejemplo: 300,
5517h, -259, etc ...).
el desplazamiento puede ser un valor inmediato o un desplazamiento de una variable, o
incluso ambos. si hay varios valores, ensamblador evalúa todos los valores y calcula un
único valor inmediato.
desplazamiento puede ser dentro o fuera de los símbolos [], ensamblador genera el
mismo código de máquina en ambos sentidos.
desplazamiento es un valor firmado, 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 el procesador a esta dirección física: 100 * 16 + 30 + 70 + 25 = 1725.
por defecto el registro de segmento DS se utiliza para todos los modos, excepto para
aquellos con registro BP, para estos se utiliza el registro de segmento SS.
hay una manera fácil de recordar todas las combinaciones posibles usando este gráfico:

puede formar todas las combinaciones válidas tomando sólo un elemento de cada
columna o omitiendo la columna al no tomar nada de ella. como ves BX y BP nunca van
juntos. SI y DI también no 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 segmentos (CS, DS, SS, ES) se denomina segmento,


y el valor en el registro de propósito (BX, SI, DI, BP) se denomina desplazamiento.
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 se agrega cero a un número decimal, se multiplica por 10, sin embargo 10h = 16, por lo
que si se agrega cero a un valor hexadecimal, se multiplica por 16, por ejemplo:
7h = 7
70h = 112

con el fin de decir el compilador sobre el tipo de datos,


estos prefijos deben ser utilizados:
byte ptr - para byte.
palabra ptr - por palabra (dos bytes).
por ejemplo:
byte ptr [BX]; byte acceso.
o
palabra ptr [BX]; acceso a la palabra.
ensamblador apoya prefijos más cortos también:
segundo. - 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 (fuente) al primer operando (destino).
el operando de origen puede ser un valor inmediato, un registro de uso general o una
ubicación de memoria.
el registro de destino puede ser un registro de propósito 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
Memoria MOV, REG
MOV REG, REG
Memoria MOV, 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 ...

Potrebbero piacerti anche