                  INTRODUCCION AL ASM: LA INSTRUCCION MOV (II)
                  ============================================

   Continuamos con los modos de direccionamiento que admite el 8086. Para
poder dar una tabla completa con todos los modos de direccionamiento que
faltan, introduzco dos registros que todava no habamos visto: el primero es
el registro 'SS' (de 'Stack Segment', 'segmento de pila'), que es otro registro
que se usa como el CS, el DS y el ES para construir direcciones completas. La
instruccin 'MOV' se puede usar con este registro de la misma manera que con
los otros tres registros de segmento. El otro registro es el 'BP' (de 'Base
Pointer', 'puntero base'). Este registro se puede utilizar de la misma forma
que los registros de propsito general, aunque no se puede acceder por separado
a los bytes alto y bajo. Adems veremos como presenta algunos modos de direc-
cionamiento peculiares.

   Para no alargarme demasiado, presento una tabla con una instruccin de cada
modo de direccionamiento. Ya que el valor que indica la posicin de memoria es
siempre un valor de 16 bits, se complementa con un registro de segmento para
formar la direccin absoluta. En la tabla aparece tambin el segmento que el uP
toma por defecto para completar la direccin. Ms adelante veremos cmo podemos
hacer que una instruccin use el registro de segmento que nos interese en lugar
del registro por defecto.

   INSTRUCCION            REGISTRO POR DEFECTO
  -------------------- --------------------------
   MOV AX,[BX+SI+xx]           DS
   MOV AX,[BX+DI+xx]           DS
   MOV AX,[BP+SI+xx]           SS <- !!
   MOV AX,[BP+DI+xx]           SS <- !!
   MOV AX,[SI+xx]              DS
   MOV AX,[DI+xx]              DS
   MOV AX,[BP+xx]              DS
   MOV AX,[BX+xx]              DS

   Estos modos de acceso a memoria se aaden a los ya vistos en el captulo
anterior, que aparecen en la siguiente tabla:

   INSTRUCCION               DESCRIPCION
  --------------------      --------------------------------------------------
   MOV AX,BX                 Transferencia de un registro a otro
   MOV AX,55AAh              Carga de un registro directamente con un valor
   MOV AX,[55AAh]            Transferencia de una direccin de memoria dada
                             directamente a un registro
   MOV AX,[BX]               Acceso a memoria por medio del BX
   MOV AX,[SI]               Acceso a memoria por medio del registro ndice SI
   MOV AX,[DI]               Acceso a memoria por medio del registro ndice DI
   MOV AX,[BP]               Acceso a memoria por medio del registro BP

   Estas instrucciones, que ya vimos, generan accesos a memoria completando la
direccin, por defecto, con el DS.

   Tambin son posibles las instrucciones generadas invirtiendo los operandos
de las instrucciones de ambas tablas. Es decir, todos estos modos de direccio-
namiento pueden usarse tanto para lectura (en las tablas) como para escritura.

   Y para acabar con los modos de direccionamiento, tenemos uno bastante pecu-
liar que describimos dando un ejemplo:

		MOV [55AAh], 3322h

   Esta instruccin almacena en la direccin 55AAh el valor 3322h, sin acceder
en toda la operacin a ningn registro.

   Pero las instruccines que almacenan directamente un valor en memoria pre-
sentan un problema para el ensamblador: cuando uno de los dos operandos (el
destino o el origen) es un registro, con se operando se fija el tamao del
dato a mover. Pero en este caso, es necesario indicar al ensamblador el tamao
del dato a mover, de forma que pueda generar el cdigo de operacin correspon-
diente. Esto se puede hacer aadiendo a cualquiera de los operandos unas pala-
bras que indican si se refiere a un operando de tipo byte o de tipo palabra.
En los siguientes ejemplos se ve cmo se hace esto:

		MOV WORD PTR [55AAh],3322h	; almacena los dos bytes
		MOV BYTE PTR [55AAh],20h	; almacena un solo byte
		MOV WORD PTR [BX],0		; almacena dos bytes

   Estos 'typecasts', que es como se denominan formalmente, pueden aadirse en
todos los casos, pero no son imprescindibles. A modo de ejemplo, las instruc-
ciones siguientes son aceptadas por el ensamblador:

		MOV AX,WORD PTR [BX]
		MOV BYTE PTR [BP+4],CL

   Ahora que ya conocemos algunas de las instrucciones que podemos emplear en
ensamblador, veremos cmo podemos experimentar con ellas y ver cmo se modifi-
can los registros. Para ello usaremos el DEBUG del MS-DOS, pero fcilmente po-
demos hacer lo mismo con el SID del DR-DOS o con el SYMDEB, que es un DEBUG
bastante mejorado, tambin de Microsoft.

   Lo primero es cargar el DEBUG sin ningn parmetro desde la lnea de coman-
dos del DOS. Entonces aparece un mensaje de copyright en la pantalla, tras lo
que tendremos un guin ('-') que es prompt con el que DEBUG nos invita a que
introduzcamos un comando. Si escribimos 'R' y pulsamos RETURN, el programa
nos muestra el contenidos actual de los registros del 8086 y la instruccin
apuntada por el par CS:IP, que es la siguiente instruccin que debe ejecutar
el uP. El comando 'T' ejecuta la siguiente instruccin y vuelve a mostrar los
registros. El registro IP habr variado, de manera que apuntar a la siguiente
instruccin.

   Uno de los comandos que ms usaremos para experimentar con el DEBUG ser
el comando 'A', que nos permite introducir cdigo fuente en ASM (instrucciones
en lenguaje ensamblador) y lo ensamblar en la direccin apuntada por CS:IP.
Cuando queramos volver al prompt del DEBUG, pulsaremos RETURN al principio de
una lnea. Para desensamblar el cdigo a partir de la direccin actual usare-
mos el comando 'U' de 'unassemble' ('desensamblar'). Tanto el comando 'A' como
el comando 'U' aceptan opcionalmente una direccin de memoria (en hexadecimal,
ya que a DEBUG hay que darle todos los nmeros en hex.), que puede ser una di-
reccin compuesta por segmento y offset (con ':' en medio) o slo por un
'offset' (y se asume el CS actual).

   Por ejemplo, podemos probar las siguientes indicaciones:

	-Cargar DEBUG, escribir 'A' y pulsar RETURN.
	-Aparecer la direccin de memoria actual (xxxx:100, donde xxxx puede
	 variar), seguida de un cursor. Podemos escribir instrucciones ASM.
	 Escribimos 'MOV AX,2233' y pulsamos RETURN.
	-Escribimos 'MOV AH,0' y pulsamos RETURN.
	-Pulsamos RETURN, con lo que volveremos al prompt de DEBUG.
	-Escribimos 'T' y pulsamos RETURN, con lo que se ejecuta la primera
	 instruccin e IP avanza a 102h. Podemos observar que AX ahora vale
	 2233, debido al 'MOV AX,2233' que acabamos de ejecutar.
	-Escribimos de nuevo 'T' y pulsamos RETURN, con lo que se ejecuta la
	 siguiente instruccin. Podemos observar que el contenido de AX es
	 ahora 0033, ya que hemos almacenado el valor 00 en AH, que es el byte
	 alto de AX.

   Os recomiendo que experimentis con los distintos modos de direccionamiento.
Con el comando 'D' podis ver el contenido de una zona de memoria, dando como
parmetro la direccin a partir de la que mostrar el contenido. Esta direccin
puede ser de la forma SEG:OFF, o puede ser un offset, tomndose en tal caso el
valor de DS para completar la direccin.

   Ahora introduciremos las instrucciones aritmticas del 8086, al menos las
bsicas, de forma que podris experimentar con ellas en el DEBUG. Se presenta
una tabla con la descripcin de cada una, ya que su comprensin no ofrece gran
dificultad. Despus de la tabla se comentan con ms detalle las instrucciones:

        INSTRUCCIONES ARITMETICAS BASICAS
       -----------------------------------
    Instruccin            Descripcin
   ....................   ....................................................
    ADD destino,origen     Suma los operandos origen y destino, y almacena el
                           resultado en destino.
    SUB destino,origen     Resta los operandos origen y destino, y almacena el
                           resultado en destino.
    INC destino            Suma 1 (incrementa) al operando destino.
    DEC destino            Resta 1 (decrementa) al operando destino.
    NEG destino            Asigna al operando destino el complemento a dos del
                           contenido anterior del operando destino. Esto repre-
                           senta cambiar el signo de un nmero binario.

   Las instrucciones ADD y SUB aceptan exactamente los mismos modos de direc-
cionamiento que la instruccin MOV, por lo que todos los ejemplo dados antes
sirven para estas instrucciones sin ms que cambiar el MOV por el ADD o el SUB.
Exceptuando que slo se pueden aplicar estas operaciones a los registros AX,
BX, CX, DX, SI, DI, BP y a los registros de un byte (AL, AH,...), pero no a los
registros de segmento.

   Las instrucciones INC, DEC y NEG aceptan como operando un registro (que no
sea de segmento) o una referencia a memoria, usando cualquiera de los modos de
direccionamiento descritos para la instruccin MOV.

   En el siguiente captulo introduciremos la pila de la mquina, y puede que
las interrupciones.

   Despus, con todos estos conceptos comenzaremos a describir el uso de los
ensambladores como el MASM o el TASM, veremos el famoso 'Hello, world' en ASM
y seguiremos con el juego de instrucciones del 8086: saltos condicionales (y
veremos los flags), comparaciones, etc... En muy poco tiempo estaris todos
programando en ASM. Animad a la gente a que se apunte!!!

   Salut! :-)

   Jon