Bienvenido: Ingresar
location: Diferencias para "WebHome/ASMIntroduccionx86/Direccionamiento"
Diferencias entre las revisiones 1 y 5 (abarca 4 versiones)
Versión 1 con fecha 2012-06-12 17:18:12
Tamaño: 4412
Comentario:
Versión 5 con fecha 2012-06-12 18:36:10
Tamaño: 5691
Comentario:
Los textos eliminados se marcan así. Los textos añadidos se marcan así.
Línea 1: Línea 1:


Modo de direccionamiento admitidos en el 8086.
Modo de direccionamiento admitidos en x86.
Línea 7: Línea 5:
{{{
Línea 9: Línea 7:
Línea 11: Línea 8:
mov EDX,ESP
}}}
Línea 14: Línea 13:
Mov ES,DS ; no está permitido {{{
mov ES,DS # no está permitido
mov AX,BL # no está permitido registro de diferente tamaño
}}}
Línea 17: Línea 19:
Línea 19: Línea 22:
mov AX,10 10  AX

mov AL,10 10  AL
{{{
mov AX,10 # copia 10 a AX
mov AL,10 # copia 10 a AL
mov BL,'a' # copia el caracter 'a'(0x61) a BL
mov EBX,0x4000 # copia 0x4000 a EBX
}}}
Línea 25: Línea 31:
 * registro de  segmento '''es,ds,cs,ss'''
 * puntero de  instrucción '''ip'''
 * registro de segmento '''ES,DS,CS,SS'''
 * puntero de instrucción '''IP'''
Línea 29: Línea 35:
Solo se aplica para la instrucción '''mov''' cuando es usada con los registro '''AL''' o '''AX'''.
Línea 31: Línea 36:
Implica copiar en forma directa lo que se encuentra en una posición de memoria al registro '''AL''' o '''AX'''. Solo se aplica para la instrucción '''mov''' cuando es usada con los registro '''AL''', '''AX''' o '''EAX'''.
Línea 33: Línea 38:
mov AL,[100] ; copia DS:[100]  AL Implica copiar en forma directa lo que se encuentra en una posición de memoria al registro.
Línea 35: Línea 40:
mov [100],AX ; copia AX  DS:[100]

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

mov [100],AL ; copia AL  DS:[100]
{{{
mov AL,valor ; copia lo encontrado en la dirección de la etiqueta `valor` a AL
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]
}}}
Línea 44: Línea 51:
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.
Línea 46: Línea 52:
mov CL,[200] ; copia DS:[200]  CL 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.
Línea 48: Línea 54:
mov BX,[203] ; copia DS:[203]  BX {{{
mov CL,[200] ; copia DS:[200] a CL
mov BX,[203] ; copia DS:[203] a BX
mov ECX,valor ; copia lo encontrado en la direccion de la etiqueta `valor` a ECX (32bits)
}}}
Línea 50: Línea 60:
El único registro al que no esta permitido usar este tipo de direccionamiento es el IP. El único registro al que no esta permitido usar este tipo de direccionamiento es el '''IP'''.
Línea 55: Línea 65:
Los registros que se pueden usar son: En el 8086 los registros que se pueden usar son: '''BP,BX,DI,SI''', mientras que en 80386 y posteriores se pueden usar cualquier registro.
Línea 57: Línea 67:
 * BP
 * BX
 * DI
 * SI

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.
El particular el registro BP o EBP usaran el segmento del stack para formar la posición absoluta, cualquier otro registro usado utilizará por defecto el DS.
 
Línea 66: Línea 71:
mov BX,100

mov AX,[BX]
{{{
mov EBX,100
mov AX,[EBX]
}}}
Línea 72: Línea 78:
mov BX,100 {{{
mov EBX,100
mov [EBX],22 # el compilador no sabe si 22 es un byte o word
mov BYTE PTR [EBX],22 # se copiará el 22 en una pos de memoria de un byte
mov WORD PTR [EBX],22 # se copiará el 22 en una pos de memoria de un word
mov DWORD PTR [EBX],22 # se copiará el 22 en una pos de memoria de un doble word
Línea 74: Línea 85:
mov [BX],22 ; el compilador no sabe si 22 es un byte o word }}}
Línea 76: Línea 87:
mov BYTE PTR [BX],22 ; se copiará el 22 en una pos de memoria de un byte == Direccionamiento Base mas Índice ==
Línea 78: Línea 89:
mov WORD PTR [BX],22 ; se copiará el 22 en una pos de memoria de un word

== Direccionamiento Base más Í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).
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) en el 8086
 * la combinación de dos registro cualquiera en 80386 y superior
Línea 85: Línea 95:
mov AX,[BX+DI] copia DS:[BX+DI] AX {{{
mov AX,[BX+DI]  # copia DS:[BX+DI] a AX
mov AX,[BP+DI] # copia SS:[BP+DI] a AX
}}}
Línea 87: Línea 100:
mov AX,[BP+DI] copia SS:[BP+DI]  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.
Al igual que el de “direccionamiento indirecto” si se utiliza a BP o EBP como uno de los registro, se utilizará al segmento de Stack (SS) para forma la dirección completa.
Línea 92: Línea 103:
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.
Línea 94: Línea 104:
mov AX,[BX+100] copia DS:[BX+100]  AX 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
}}}
Línea 98: Línea 112:
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. Los registro que se pueden usar son los mismo que en el '''indirecto por registro''', y al igual que en los casos anteriores el segmento usado para completar la dirección será SS cuando se utilice BP o EBP y DS para los demás casos.
Línea 102: Línea 116:
mov AX,TABLA[BX] ; copia en AX el contenido de la posición BX de TABLA {{{
mov AX,TABLA[EBX] # copia en AX el contenido de la posición EBX de TABLA
}}}
Línea 105: Línea 121:
Línea 107: Línea 124:
mov AX,[BX+DI+100]; copia en AX el contenido de la posición DS:[BX+DI+100] {{{
mov AX,[BX+DI+100] # copia en AX el contenido de la posición DS:[BX+DI+100]
}}}
Línea 111: Línea 130:
mov TABLA[BX+DI] {{{
mov AX,TABLA[BX+DI]
}}}

== Direccionamiento Índice Escalado ==
'''Solo para microprocesadores 80386 o Superiores'''
En este direccionamiento se utiliza dos registros de 32 bits, un valor de desplazamiento y un factor de escala

La posición de memoria entonces estará formada por la suma del desplazamiento, el primer registro y el segundo registro previamente multiplicado por el factor de escala.

La forma como se escribe la instrucción representa en gran medida el calculo que realiza la misma con sus datos
 
{{{
mov EAX,[EBX + 4*ECX]
mov BX, vector[EAX + 2*ECX]
}}}

Modo de direccionamiento admitidos en x86.

Direccionamiento por Registro

La fuente es un registro

mov AX,BX
mov BL,AH
mov EDX,ESP

No esta permitido asignaciones entre registro de segmento.

mov ES,DS # no está permitido
mov AX,BL # no está permitido registro de diferente tamaño

Direccionamiento inmediato

Copia una palabra o byte a un registro

mov AX,10      #  copia 10 a AX
mov AL,10      #  copia 10 a AL
mov BL,'a'     #  copia el caracter 'a'(0x61) a BL
mov EBX,0x4000 #  copia 0x4000 a EBX

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

  • registro de segmento ES,DS,CS,SS

  • puntero de instrucción IP

Direccionamiento directo

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

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

mov AL,valor    ; copia lo encontrado en la dirección de la etiqueta `valor` a AL
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
mov ECX,valor   ; copia lo encontrado en la direccion de la etiqueta `valor` a ECX (32bits)

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

En el 8086 los registros que se pueden usar son: BP,BX,DI,SI, mientras que en 80386 y posteriores se pueden usar cualquier registro.

El particular el registro BP o EBP usaran el segmento del stack para formar la posición absoluta, cualquier otro registro usado utilizará por defecto el DS.

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

mov EBX,100
mov AX,[EBX]

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 EBX,100
mov [EBX],22            # el compilador no sabe si 22 es un byte o word
mov BYTE PTR [EBX],22   # se copiará el 22 en una pos de memoria de un byte
mov WORD PTR [EBX],22   # se copiará el 22 en una pos de memoria de un word
mov DWORD PTR [EBX],22  # se copiará el 22 en una pos de memoria de un doble 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) en el 8086
  • la combinación de dos registro cualquiera en 80386 y superior

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 o EBP como uno de los registro, 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, y al igual que en los casos anteriores el segmento usado para completar la dirección será SS cuando se utilice BP o EBP y DS para los demás casos.

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[EBX] # copia en AX el contenido de la posición EBX 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 AX,TABLA[BX+DI]

Direccionamiento Índice Escalado

Solo para microprocesadores 80386 o Superiores En este direccionamiento se utiliza dos registros de 32 bits, un valor de desplazamiento y un factor de escala

La posición de memoria entonces estará formada por la suma del desplazamiento, el primer registro y el segundo registro previamente multiplicado por el factor de escala.

La forma como se escribe la instrucción representa en gran medida el calculo que realiza la misma con sus datos

mov EAX,[EBX + 4*ECX]
mov BX, vector[EAX + 2*ECX]

UntitledWiki: WebHome/ASMIntroduccionx86/Direccionamiento (última edición 2012-06-12 18:36:10 efectuada por GuillermoSteiner)