Bienvenido: Ingresar

Versión 3 con fecha 2012-06-12 17:23:43

Quitar mensaje
location: WebHome / ASMIntroduccionx86 / Direccionamiento

Modo de direccionamiento admitidos en el 8086.

Direccionamiento por Registro

La fuente es un registro

mov AX,BX
mov BL,AH

No esta permitido asignaciones entre registro de segmento.

Mov ES,DS ; no está permitido

Direccionamiento inmediato

Copia una palabra o byte a un registro

mov AX,10  #  copia 10 a AX
mov AL,10  #  copia 10 a AL

Registro a los cuales no esta permitido una asignación inmediata.

Direccionamiento directo

Solo se aplica para la instrucción mov cuando es usada con los registro AL o AX.

Implica copiar en forma directa lo que se encuentra en una posición de memoria al registro AL o AX.

mov AL,[100]    ; copia  DS:[100] a AL

mov [100],AX    ; copia AX a DS:[100]

mov AX,[100]    ; copia  DS:[100] a AX

mov [100],AL    ; copia AL a DS:[100]

Esto forma un pequeño grupo de instrucciones que por su uso muy a menudo en los programas se decidió hacerlas de 3 bytes de longitud contra 4 o mas que posee las por desplazamiento.

Direccionamiento por desplazamiento

Es similar al “direccionamiento directo” pero mas flexible y es el que se aplica en todas las instrucciones y con todo los demás registros, usando en este caso 4 bytes de longitud cada instrucción.

mov CL,[200]    ; copia DS:[200] a CL
mov BX,[203]    ; copia DS:[203] a BX

El único registro al que no esta permitido usar este tipo de direccionamiento es el IP.

Direccionamiento indirecto por Registro

Permite direccionar una localidad de memoria apuntada por un registro

Los registros que se pueden usar son:

Cuando son utilizados cualquiera de los registros arriba indicados, utiliza por defecto al DS como segmento para completar la dirección, con excepción del BP que utiliza el SS.

Ejemplo: copiar a AX lo que se encuentra en DS:100.

mov BX,100
mov AX,[BX]

En algunos casos es necesario aclarar el tamaño del dato a mover, por ejemplo cuando se copia una cte a un posición de memoria.

mov BX,100
mov [BX],22                     ; el compilador no sabe si 22 es un byte o word
mov BYTE PTR [BX],22    ; se copiará el 22 en una pos de memoria de un byte
mov WORD PTR [BX],22    ; se copiará el 22 en una pos de memoria de un word

Direccionamiento Base mas Índice

Es un caso similar al “direccionamiento por registro”, nada mas que la dirección a acceder en vez de estar dado por un registro, lo está por dos, un registro base (BP o BX) mas un registro índice (DI o SI).

Este tipo de direccionamiento se utiliza para acceder a tablas donde por ejemplo la base contiene el comienzo de la tabla y el índice la posición relativa del elemento a acceder.

mov AX,[BX+DI]  # copia  DS:[BX+DI] a AX
mov AX,[BP+DI]  # copia SS:[BP+DI] a AX

Al igual que el de “direccionamiento indirecto” si se utiliza a BP como registro índice, se utilizará al segmento de Stack (SS) para forma la dirección completa.

Direccionamiento Relativo por Registro

Para este direccionamiento utilizamos para acceder a una posición de memoria el valor de un registro ( como en los casos anteriores ) y un valor de desplazamiento constante.

mov AX,[BX+100] copia DS:[BX+100] a AX

En este caso el valor de la memoria a que apunta es el valor contenido en BX mas 100.

Los registro que se pueden usar son los mismo que en el “indirecto por registro” BP, BX, DI, SI, el segmento usado para completar la dirección será DS para BX,DI y SI y SS para BP como en los casos anteriores.

Este direccionamiento es usado para acceder a un vector el cual tiene fijo su dirección de comienzo, si por ejemplo TABLA es el nombre que le pusimos a un vector de 100 posiciones, para acceder entonces a cualquier valor de esta tabla y cargarla en el registro AX, se deberá efectuar lo siguiente:

mov AX,TABLA[BX] # copia en AX el contenido de la posición BX de TABLA

Direccionamiento Relativo por Base mas Índice

La dirección a acceder será la suma de un registro base mas un índice mas un desplazamiento cte.

mov AX,[BX+DI+100] # copia en AX el contenido de la posición DS:[BX+DI+100]

Al igual que en el caso anterior puedo declara en el compilador un vector de 100 posiciones llamado TABLA, y luego escribir.

mov TABLA[BX+DI]