
      ASM POR AESOFT. (leccin 6).
      --------------------------------------------------------------------

     - CODIFICACION DE LAS INSTRUCCIONES EN EL 8086 (continuacin leccin 5).
     - MODOS DE DIRECCIONAMIENTO EN EL 8086.
      --------------------------------------------------------------------



     - CODIFICACION DE LAS INSTRUCCIONES EN EL 8086 (continuacin leccin 5).
      -----------------------------------------------------------------------

        En la leccin 5 nos quedamos por descifrar el valor del byte EA en
        la siguiente instruccin:

        MOV WORD PTR DS:[7654H],5 ---> C7 06 54 76 05 00

        Tenamos claro el primer byte (cdigo de operacin) que nunca ofrece
        problemas de interpretacin.
        Y era obvio tambin el campo 'desplazamiento' (formado por los bytes
        3 y 4), as como el campo 'valor inmediato' (formado por los bytes
        5 y 6).

        Pero ante el segundo byte (byte EA o de direccionamiento) surga la
        duda.
        He estado probando con instrucciones parecidas para ver si se aclaraba
        el tema. Y como conclusin puedo decir que cuando se direcciona una
        posicin de memoria (como destino) sin ayuda de ningn registro
        (SI, DI,BX+SI, etc), el byte EA tendr valor 06.
        Esto lo digo de modo emprico. No lo he ledo en ningn sitio, ni nada
        por el estilo. Me baso en las pruebas que he estado haciendo para
        encontrar algn sentido a ese 06.

        Sinceramente, no s por el porqu de esta 'peculiaridad'.
        Por qu se me ocurrira poner este ejemplo! :-)
        Por ejemplo, si hubiera usado un registro junto con el desplazamiento
        en esa instruccin habra problema. Veamos cmo quedara la cosa:

      * MOV WORD PTR DS:[DI+7654H],5 ---> Introduce el valor 5 (tipo palabra)
        en la posicin de memoria direccionada mediante [DI] + 7654H.
        Es prcticamente igual que la instruccin anterior, excepto que en sta,
        hemos incluido el registro DI para acceder a la posicin de memoria
        oportuna.

        La codificacin de la instruccin quedara como sigue:
        MOV WORD PTR DS:[DI+7654H],5 ---> C7 85 54 76 05 00

        Estudiemos el 'byte EA' de esta instruccin tan parecida a la anterior:
        85h en binario queda como 10000101.
        El campo MOD con valor 10 indica que se usan 2 bytes para codificar el
        desplazamiento. Hasta ahora perfecto: 2 bytes para almacenar el
        desplazamiento 7654h.
        El campo REG con valor 000, ya que el valor a introducir no est en
        ningn registro, sino que es un dato inmediato (05)
        El campo R/M con valor 101, indicando que la direccin final viene
        dada por [DI] + desplazamiento.

        Como podemos ver, la codificacin de esta instruccin se ajusta a
        las tablas de codificacin que vimos en la leccin 5.
        

        Veamos algn ejemplo ms, para que nos quede ms claro:
      * MOV BYTE PTR [DI+7],0AEH
        Esta instruccin deposita el valor 0AEH en la posicin de memoria
        apuntada por DI+7, dentro del segmento direccionado por DS.
        Veamoslo ms detalladamente estudiando su codificacin:

        MOV BYTE PTR [DI+7],0AEH ---> C6 45 07 AE
        En primer lugar tenemos el cdigo de operacin C6, que le indica al
        procesador que se va a transferir un dato inmediato de tipo byte a
        una posicin de memoria.

        El tercer byte (campo 'desplazamiento') tiene un valor de 7, que es el
        que hemos indicado en la instruccin. Este valor es el que se sumar
        a DI para direccionar la posicin de memoria deseada.

        El cuarto byte (campo 'valor inmediato') tiene un valor de AE. Este
        valor es el que se depositar en la posicin de memoria direccionada
        mediante DI+7.

        Slo nos queda estudiar el segundo byte (byte EA o modo de
        direccionamiento), el cual tiene un valor de 45 (en hexadecimal).
        Este 45, queda como 01000101 en binario.

        Tenemos as que el campo MOD tiene un valor de 01. Si miramos en las
        tablas de codificacin (ver leccin 5), tenemos que 01 indica que se
        utiliza un byte para indicar desplazamiento.
        El campo REG tiene valor 000. Como no hay ningn registro involucrado
        en la instruccin, este campo no se tiene en cuenta.
        Por ltimo, el campo R/M tiene como valor, 101. Esto indica que el
        desplazamiento final estar dado mediante [DI] + desplazamiento.

        Como vemos, en esta instruccin est totalmente claro cada valor en
        cada uno de los campos del byte EA o 'modo de direccionamiento'.


        Un ltimo ejemplo:

      * MOV WORD PTR [BX+SI+37H],AX
        Esta instruccin, introduce el valor del registro AX en la direccin
        de memoria indicada mediante el valor de la suma BX+SI+37H.
        Dentro del segmento DS, por supuesto. Siempre que no se especifique
        otro segmento, las transferencias a/desde memoria se harn sobre el
        segmento DS.

        Veamos su codificacin:
        MOV WORD PTR [BX+SI+37H],AX ---> 89 40 37
        Simplemente 3 bytes para codificar esta instruccin que parece tan
        complicada.
        El primer byte (cdigo de operacin) tiene el valor 89 (hexadecimal).
        Este cdigo 89 indica que se va a realizar una transferencia de datos
        de tipo palabra desde un registro (tamao palabra) a un destino que
        puede ser (dependiendo del valor del byte EA): un registro de tamao
        palabra o una direccin de memoria. Ya sabemos que el destino se trata
        de una direccin de memoria porque lo hemos indicado as al teclear
        la instruccin, pero el procesador no lo sabr hasta que descifre el
        valor del byte EA.

        Este byte EA tiene un valor de 40h, que en binario queda como 01000000
        El campo MOD tiene un valor de 01, que indica que se usa 1 byte para
        codificar el desplazamiento. Slo es necesario 1 byte para codificar
        el valor 37h.
        El campo REG, que aqu tiene valor 000, indica que el registro fuente
        empleado es AX.
        El campo R/M con valor 000, indica que la direccin final se consigue
        mediante la suma: [BX] + [SI] + desplazamiento.
        Ver tablas en la leccin 5.
        Como vemos aqu tambin est totalmente claro el valor del byte EA.

        El tercer byte (campo 'desplazamiento') contiene el valor 37h como hemos
        indicado en la instruccin.

        Espero que estos nuevos ejemplos hayan sido ilustrativos.
        En caso de que an exista alguna duda acerca de la codificacin de las
        instrucciones, levantad la mano :-)))



     - MODOS DE DIRECCIONAMIENTO EN EL 8086.
      --------------------------------------------------------------------

       Como ya hemos visto, las instrucciones estn codificadas con 0, 1  2
       operandos. Estos operandos son cada uno de los campos que puede componer
       una instruccin ('byte EA', 'desplazamiento' y 'valor inmediato').
       Pues bien, las operaciones se realizan entre registros o registros y
       memoria.
       Nunca entre memoria y memoria. Si echamos un vistazo al esquema de
       codificacin, nos daremos cuenta del porqu: No hay dos campos para
       almacenar 2 posiciones diferentes de memoria, mientras que s que se
       pueden indicar 2 registros diferentes (uno fuente y otro destino) en
       una misma instruccin.

       Existen varios modos de direccionamiento. Esta variedad se ofrece para
       una mayor comodidad en la programacin. As por ejemplo se puede utilizar
       el modo directo, cuando se conoce la direccin de la posicin de memoria
       que nos interese.
       El resto de modos se utilizarn cuando no vayamos a acceder a una
       direccin de memoria conocida, o cuando nos sea ms cmodo por cualquier
       motivo.

      * Modos de direccionamiento:

        Inmediato
        ---------
        El dato aparece directamente en la instruccin. Es decir, se indica
        explcitamente en la instruccin.

        Ejemplo: MOV AL,0AEH ---> Almacena el valor AE en el registro de tipo
                                  palabra (AL).


        Modo Registro
        -------------
        Cuando en la instruccin se realizan transferencias entre registros
        del procesador.

        Ejemplo: MOV AX,BX ---> Introduce el valor de BX en AX.


        Directo absoluto a memoria
        --------------------------
        Aparece en la instruccin de forma explcita la direccin a la cual
        se quiere acceder. Esto es, en la codificacin de la instruccin
        podemos encontrar 2 bytes indicando la posicin de memoria que se
        quiere direccionar.

        Ejemplo: MOV CX,WORD PTR DS:[7777] ---> Introduce el valor almacenado en
        la posicin de memoria 7777 (dentro del registro DS) en el registro de
        tipo palabra (CX).


        Directo relativo a un registro base
        -----------------------------------
        Accede a una posicin de memoria con la ayuda de un registro base.
        Estos registros base como ya vimos son BX y BP.
        La direccin final de la posicin de memoria se indicar de la forma:
         Direccin final = [Registro_Base] + desplazamiento.
         Donde Registro_Base es o bien BX o bien BP.

        Ejemplo: MOV AX,BYTE PTR [BX+7] ---> Introduce en AX el valor contenido
        en la posicin de memoria direccionada mediante BX+7.


        Directo relativo a un registro ndice (Indexado)
        ------------------------------------------------
        La direccin se obtiene sumando un desplazamiento (que se indicar
        en la instruccin) al contenido de un registro ndice.
        Registros ndice como ya vimos son: SI y DI.
        Donde SI se suele utilizar como registro ndice fuente.
        'Indice fuente' en ingls = 'Source Index' = SI.
        Obviamente, DI se utilizar como registro ndice destino.
        'Indice destino' en ingls = 'Destine Index' = DI.

        La direccin final de la posicin de memoria se indicar de la forma:
         Direccin final = [Registro_Indice] + desplazamiento.
         Donde Registro_Indice es o bien SI o bien DI.

        Ejemplo: MOV AX,WORD PTR [SI+7] ---> Introduce en AX el valor contenido
        en la posicin de memoria direccionada mediante SI+7.

        En realidad, excepto cuando se utilizan los dos registros fuentes en
        una misma operacin (al copiar cadenas de caracteres p.e.), en cuyo
        caso hay que asignar a SI la direccin de la cadena origen, y a DI hay
        que asignarle la direccin de la cadena destino... Excepto en este
        tipo de operaciones (como digo), podemos hacer uso de los registros
        SI y DI indistintamente al trabajar con direccionamientos.
        Es decir, que las dos instrucciones siguientes son correctas, y
        realizan exactamente la misma tarea (siempre que SI y DI tengan el mismo
        valor):
         MOV AX,WORD PTR [SI+7]
         MOV AX,WORD PTR [DI+7]


        Modos indirectos de direccionamiento
        ------------------------------------
        Si en los dos ltimos modos de direccionamiento no se especifica
        desplazamiento, entonces hablamos de:
        Modo de direccionamiento indirecto por registro base,
        Modo de direccionamiento indirecto por registro ndice,
        respectivamente.

        Ejemplo: MOV AX,BYTE PTR [SI] ---> Introduce en AX el contenido de la
        posicin de memoria direccionada mediante SI.


        Indexado mediante una base
        --------------------------
        La posicin de memoria seleccionada se direcciona aqu mediante cuatro
        configuraciones posibles. Un registro BX o BP contiene la base
        y un registro SI o DI contiene el desplazamiento. Adems, puede existir
        un desplazamiento opcional indicado mediante un valor numrico.

        La direccin final de la posicin de memoria se indicar de la forma:
         Direccin final = [Registro_Base] + [Registro_Indice] + desplazamiento.
         Donde Registro_Base es o bien BX o bien BP.
         Donde Registro_Indice es o bien SI o bien DI.
        Tenemos as las cuatro configuraciones posibles mencionadas:

         - [BX] + [SI] + desplazamiento
         - [BX] + [DI] + desplazamiento
         - [BP] + [SI] + desplazamiento
         - [BP] + [DI] + desplazamiento

        Ejemplo: MOV BYTE PTR [BX+SI],AL ---> Introduce el valor del registro AL
        en la posicin de memoria direccionada mediante [BX] + [SI] + desplaz.



        En todos los modos de direccionamiento, excepto en los dos primeros,
        se puede indicar un segmento diferente a DS para realizar las
        operaciones con la memoria.
        De esta forma, podemos manejar todo el Megabyte de memoria sin necesidad
        de modificar de valor el registro DS (registro de segmento de datos).
        As, podemos utilizar el registro ES cuando queramos acceder a
        posiciones de memoria que estn fuera de nuestro segmento de datos.

        Ejemplo: MOV AX,WORD PTR ES:[BX+7] ---> Introduce en AX el valor
        contenido en la posicin de memoria direccionada mediante BX+7, dentro
        del segmento indicado por ES.
