<?xml version="1.0" encoding="utf-8"?><!DOCTYPE article  PUBLIC '-//OASIS//DTD DocBook XML V4.4//EN'  'http://www.docbook.org/xml/4.4/docbookx.dtd'><article><articleinfo><title>WebHome/ASMIntroduccionx86/Direccionamiento</title><revhistory><revision><revnumber>5</revnumber><date>2012-06-12 18:36:10</date><authorinitials>GuillermoSteiner</authorinitials></revision><revision><revnumber>4</revnumber><date>2012-06-12 18:02:45</date><authorinitials>GuillermoSteiner</authorinitials></revision><revision><revnumber>3</revnumber><date>2012-06-12 17:23:43</date><authorinitials>GuillermoSteiner</authorinitials></revision><revision><revnumber>2</revnumber><date>2012-06-12 17:23:05</date><authorinitials>GuillermoSteiner</authorinitials></revision><revision><revnumber>1</revnumber><date>2012-06-12 17:18:12</date><authorinitials>GuillermoSteiner</authorinitials></revision></revhistory></articleinfo><para>Modo de direccionamiento admitidos en x86. </para><section><title>Direccionamiento por Registro</title><para>La fuente es un registro </para><screen><![CDATA[mov AX,BX
mov BL,AH
mov EDX,ESP]]></screen><para>No esta permitido asignaciones entre registro de segmento. </para><screen><![CDATA[mov ES,DS # no está permitido
mov AX,BL # no está permitido registro de diferente tamaño]]></screen></section><section><title>Direccionamiento inmediato</title><para>Copia una palabra o byte a un registro </para><screen><![CDATA[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]]></screen><para>Registro a los cuales no esta permitido una asignación inmediata. </para><itemizedlist><listitem><para>registro de segmento  <emphasis role="strong">ES,DS,CS,SS</emphasis> </para></listitem><listitem><para>puntero de instrucción <emphasis role="strong">IP</emphasis> </para></listitem></itemizedlist></section><section><title>Direccionamiento directo</title><para>Solo se aplica para la instrucción <emphasis role="strong">mov</emphasis> cuando es usada con los registro <emphasis role="strong">AL</emphasis>, <emphasis role="strong">AX</emphasis> o <emphasis role="strong">EAX</emphasis>. </para><para>Implica copiar en forma directa lo que se encuentra en una posición de memoria al registro. </para><screen><![CDATA[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]]]></screen><para>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. </para></section><section><title>Direccionamiento por desplazamiento</title><para>Es similar al <emphasis role="strong">direccionamiento directo</emphasis> 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. </para><screen><![CDATA[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)]]></screen><para>El único registro al que no esta permitido usar este tipo de direccionamiento es el <emphasis role="strong">IP</emphasis>. </para></section><section><title>Direccionamiento indirecto por Registro</title><para>Permite direccionar una localidad de memoria apuntada por un registro </para><para>En el 8086 los registros que se pueden usar son: <emphasis role="strong">BP,BX,DI,SI</emphasis>, mientras que en 80386 y posteriores se pueden usar cualquier registro. </para><para>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. </para><para>Ejemplo: copiar a AX lo que se encuentra en DS:100. </para><screen><![CDATA[mov EBX,100
mov AX,[EBX]]]></screen><para>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. </para><screen><![CDATA[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]]></screen></section><section><title>Direccionamiento Base mas Índice</title><para>Es un caso similar al <emphasis role="strong">direccionamiento por registro</emphasis>, nada mas que la dirección a acceder en vez de estar dado por un registro, lo está por dos,  </para><itemizedlist><listitem><para>un registro base (BP o BX) mas un registro índice (DI o SI) en el 8086 </para></listitem><listitem><para>la combinación de dos registro cualquiera en 80386 y superior  </para></listitem></itemizedlist><para>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. </para><screen><![CDATA[mov AX,[BX+DI]  # copia  DS:[BX+DI] a AX
mov AX,[BP+DI]  # copia SS:[BP+DI] a AX]]></screen><para>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. </para></section><section><title>Direccionamiento Relativo por Registro</title><para>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. </para><screen><![CDATA[mov AX,[BX+100] copia DS:[BX+100] a AX]]></screen><para>En este caso el valor de la memoria a que apunta es el valor contenido en BX mas 100. </para><para>Los registro que se pueden usar son los mismo que en el <emphasis role="strong">indirecto por registro</emphasis>, 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. </para><para>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: </para><screen><![CDATA[mov AX,TABLA[EBX] # copia en AX el contenido de la posición EBX de TABLA]]></screen></section><section><title>Direccionamiento Relativo por Base mas Índice</title><para>La dirección a acceder será la suma de un registro base mas un índice mas un desplazamiento cte. </para><screen><![CDATA[mov AX,[BX+DI+100] # copia en AX el contenido de la posición DS:[BX+DI+100]]]></screen><para>Al igual que en el caso anterior puedo declara en el compilador un vector de 100 posiciones llamado TABLA, y luego escribir. </para><screen><![CDATA[mov AX,TABLA[BX+DI]]]></screen></section><section><title>Direccionamiento Índice Escalado</title><para><emphasis role="strong">Solo para microprocesadores 80386 o Superiores</emphasis> En este direccionamiento se utiliza dos registros de 32 bits, un valor de desplazamiento y un factor de escala </para><para>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. </para><para>La forma como se escribe la instrucción representa en gran medida el calculo que realiza la misma con sus datos  </para><screen><![CDATA[mov EAX,[EBX + 4*ECX]
mov BX, vector[EAX + 2*ECX]]]></screen></section></article>