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] }}}