 LECCION 2:
 ----------

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

     - DIRECCIONAMIENTO DE MEMORIA EN EL  8086.
     - SEGMENTACION.
      --------------------------------------------------------------------

    Hola a todos los seguidores del curso de ensamblador de AESOFT.
    En esta leccin vamos a ver cmo direcciona la memoria el 8086,
    es decir, cmo el 8086 accede a cada una de las posiciones de
    memoria.

    La forma en que la CPU construye las direcciones de memoria es muy
    importante para la programacin del sistema, debido a que constantemente
    utilizamos instrucciones de transferencias de datos, de acceso a 
    funciones de la BIOS, del DOS, etc.

    Ms adelante estudiaremos la BIOS. Valga por ahora que es un conjunto de
    utilidades y procedimientos grabados en la ROM (memoria de slo lectura),
    los cuales se encargan de acceder al nivel ms bajo en cuanto a
    programacin se refiere. Es decir, estas rutinas se encargan de manipular
    el hardware por nosotros.
    BIOS son las siglas de Basic Input Output System (Sistema bsico de
    entrada/salida).

    En cuanto al DOS (sistema operativo de disco), decir que aqu nos referi-
    mos no a las utilidades o comandos que trae consigo, que es lo tpico que 
    se ensea en academias e institutos, sino a la estructura interna del mismo:
    interrupcin 21h, 24h, etc.
    Ya veremos tambin qu es una interrupcin.

    Bien, antes de entrar de lleno en el tema, conviene saber un poco del
    por qu del mismo. Es decir, qu llev a que fuera de esta forma y no
    de otra.

    A principio de los aos 80, Intel (fabricante de la familia de procesadores
    80x86) se propuso dar un gran paso adelante con respecto a la competencia.
    En aquel tiempo los microprocesadores que imperaban entre los ordenadores
    domsticos eran de 8 bits, es decir, tenan un ancho de bus de datos de
    8 bits, el tamao de palabra de memoria era de 8 bits, y los registros
    del procesador eran de 8 bits. Un claro ejemplo de esto fue el
    microprocesador Z80 (de la empresa Zilog), el cual estaba incorporado
    en mquinas tan famosas como los spectrum, amstrad, msx, etc.

    Como he dicho, el ancho del bus de datos era de 8 bits. Esto quiere decir
    que todas las transferencias de datos que se hicieran se haran de 8 en
    8 bits, es decir, byte a byte.

    Pues bien, aunque el microprocesador era de 8 bits, y la mayora de
    registros tambin lo fuera, haba alguno mayor (16 bits).
    Me estoy refiriendo sobre todo al registro de direcciones que era de
    16 bits. De esta forma, un amstrad cpc-464 poda acceder a 64 ks de memoria.
    64 Ks es la mximo que poda direccionar el z80 original.

    En ese momento Intel se plante superar esa barrera de las 64 Ks, pero
    tena un problema. El z80 por ejemplo, haba consguido tener registros
    de 16 bits cuando el microprocesador es de 8. Pero pasar de 16 bits
    de capacidad en registros en aquellos momentos no era posible para los
    microprocesadores. Es decir, no haba suficientes avances tecnolgicos
    como para conseguir tamaos de registros mayores en un microprocesador.
    De tal manera que haba que buscar una frmula diferente... Y ah es
    cuando surgi el tema de los segmentos que tantos quebraderos de cabeza
    a dado hasta ahora y sigue dando.

    A Intel se le ocurri la idea de construir una direccin de 20 bits de
    ancho y colocarla en el bus de direcciones para poder dirigirse a la
    memoria. Pero al ser los registros de 16 bits, slo haba una solucin
    posible para crear este ancho de 20 bits: Usar 2 registros de 16 bits!!!

    El 8086 divide el espacio de direcciones (1 Mbyte) en segmentos, cada uno
    de los cuales contiene 64 Ks de memoria (la mxima direccionable por un
    slo registro).
    Entonces, para direccionar una posicin de memoria nos valemos de dos
    registros: Registro de segmento y de offset.
    Ya vimos en la leccin anterior que haba varios registros de segmento:
    cs (registro de segmento de cdigo), ds (de datos), etc.

    Pues bien, este primer registro (de segmento), indica dnde comienza el
    trozo de 64 Ks que buscamos.
    Y el segundo registro (el de offset), contiene el desplazamiento dentro
    de ese segmento.

    Bien. Hemos visto que son necesarios 2 registros para direccionar ese
    Mbyte de memoria, y tenemos un bus de direcciones de 20 bits.
    Esto nos conduce a que el microprocesador debe realizar unas operaciones
    sobre estos dos registros para obtener la direccin fsica de 20 bits.
    Esto se logra de la siguiente manera:
    El 8086 mueve el valor del segmento 4 bits a la izquierda y le suma el
    valor del desplazamiento para crear una direccin de 20 bits.

    Grficamente:
            Tenemos dos registros de 16 bits.
       DS:  XXXXXXXXXXXXXXXX             BX:  XXXXXXXXXXXXXXXX
           15      87      0                 15      87      0
            +------++------+                  +------++------+
          Byte alto   Byte bajo             Byte alto   Byte bajo
 (ms significativo)(menos signific)


      El primer registro, es el de segmento (en este caso, segmento DS, de
      datos). El segundo registro es el de offset o desplazamiento.
      En este caso utilizamos el registro BX para direccionar dentro de
      el segmento. Podamos haber utilizado tambin el registro SI, el DI,
      etc.
      A partir de estos dos registros, debemos acceder a una posicin de
      memoria fsica dentro del Mbyte de que disponemos para el 8086.

      Pongamos que el registro DS tiene el valor 0B800h (en hexadecimal)
      (podeis utilizar SB-CALCU de SAN BIT para hacer los cambios de base,
      y trabajar con bases diferentes a la decimal. Tambin para la decimal,
      por supuesto).
      Y el registro BX contiene el valor 0037h.

      Tenemos pues (en binario):
          DS: 1011100000000000     BX: 0000000000110111
      
      Para obtener la direccin fsica de memoria, y teniendo en cuenta todo lo
      dicho relativo a segmentos, el microprocesador acturara as:
      (Grficamente)

      Hara una suma de la siguiente forma:

           DS:           1011100000000000
           BX:     +         0000000000110111
                     ----------------------------
                         10111000000000110111

      Obteniendo as la direccin de 20 bits necesaria para cubrir todo
      el Mbyte.

      Si ese nmero (10111000000000110111) que est en binario, lo pasamos
      a hexadecimal, tenemos que la direccin fsica correspondiente a la
      anterior segmentada es: 0B8037h.


    De todo lo anterior, se desprende que los segmentos empiezan siempre en
    direcciones divisibles por 16. Ms tcnicamente: cada segmento comienza
    en una direccin de  prrafo. Un prrafo son 16 bytes.
    Por supuesto nunca habr un segmento que empiece en una direccin impar,
    por ejemplo.
    Como ejemplo: El primer segmento posible empieza en la direccin
    fsica 0. El segundo empieza en la direccin

    Esto es ms complejo de lo que parece. Si tienes alguna duda, ya sabes...

    Si le das vueltas a la idea, te dars cuenta que diferentes combinaciones
    de direcciones segmentadas dan una misma direccin fsica.

    Tambin se puede apreciar que los segmentos se pueden superponer unos a
    otros, pueden ser idnticos, o pueden encontrarse en partes totalmente
    lejanas en la memoria.

    Si llegados a este punto no comprendes el tema de los segmentos, no sigas,
    ya que te perderas. Dime qu no entiendes y lo explicar ms
    detalladamente.

    Es todo por ahora.
    Ah, y no s si recibsteis la primera leccin. Parece que todo estaba 
    claro.
    Si en ste no os surge ninguna duda, ya me mosqueo }:-)))

    Saludos.
    AESOFT..

