Вы находитесь на странице: 1из 84

UNIDAD II. PROGRAMACION BASICA.

2.1 Ensamblador y enlazador a utilizar.


2.1.1 Introduccin.
El DOS fue un sistema operativo que proporcion acceso general e independiente de los dispositivos y los
recursos de la computadora. Hoy en da, estos dispositivos que permite manejar, incluyen al teclado, a la pantalla
y a las unidades de disco. Por independencia de dispositivos debe entenderse que no es preciso dirigirse
especficamente a los dispositivos, ya que el DOS y sus controladores de dispositivos, pueden manejar las
operaciones a nivel de dispositivo.
Los programas ejecutables en el modo consola son almacenados en disco como archivos .COM y .EXE. El
archivo COMMAND.COM, del DOS, usa la funcin del DOS, EXEC, para ejecutar tanto los programas .COM
como .EXE y esta funcin realiza las siguientes acciones:
1. Asigna la memoria necesaria para cargar el programa.
2. Construye un bloque de 256 bytes llamado PSP (Program Segment Prefix), que es una estructura para
almacenar informacin de control del programa. ste tiene una longitud de 256 bytes y es colocado al
inicio de la memoria asignada. Existen varias partes del PSP que es importante conocer cuando se
escriben programas en DOS.
3.

Actualiza los registros y el STACK.

4. Transfiere el control al inicio del programa, cargando CS:IP con la primera instruccin del programa.
Al escribir cdigo en lenguaje ensamblador, se puede encontrar con dos situaciones diferentes: que el cdigo
se aloje en un mdulo independiente, conteniendo nicamente sentencias en ensamblador, o bien que forme parte
de un programa escrito en otro lenguaje de programacin como puede ser C o C++. De acuerdo a la manera de
estructurar el cdigo, as como la herramienta a utilizar, ser distinta segn sea el caso concreto y aunque
lgicamente las instrucciones, en ensamblador, registros y dems elementos siempre sern los mismos.
La mayora de los sistemas operativos actuales, como Windows, Mac OS X y GNU/Linux, incluyen en su
instalacin por defecto, algn editor de texto bsico como puede ser el Block de Notas, VI o GEDIT. Todos ellos
vlidos para escribir cdigo en ensamblador, especialmente cuando se encuentra en la etapa de aprendizaje. El
nico requisito que se exigir a este tipo de editor, es que permitan guardar el cdigo en el sistema de archivos
local, de modo que pueda ser despus ensamblado, asignando un nombre con la extensin adecuada.
Existen editores especficos, los cules se podran denominar como entornos integrados de desarrollo o IDE,
que pueden ahorrarnos trabajo al contar con opciones para efectuar el ensamblado, enlace e incluso la ejecucin
sin necesidad de abandonar la edicin del cdigo.
Una vez que se cuenta con el archivo fuente, es necesario utilizar un ensamblador que traduzca ese cdigo
fuente al lenguaje de la mquina. Un ensamblador es como un compilador de cualquier lenguaje, toma un archivo
de texto con cdigo fuente como entrada y en respuesta, genera un nuevo archivo con esas mismas sentencias
pero en lenguaje de un determinado procesador. Este archivo contiene una versin del programa elaborado, pero
no cuenta con la informacin adicional necesaria para el sistema operativo pueda gestionarlo. La herramienta que
se requiere se le conoce como enlazador o linker. Por regla general cada ensamblador cuenta con su propio
enlazador.
La sentencia es una combinacin de mnemnicos, operandos y comentarios que definen el cdigo objeto a
ser creado en tiempo de ensamblado. Cada lnea de cdigo fuente consiste de una sola sentencia, varias
sentencias en una lnea no son permitidas. Existe un mximo de 132 caracteres para una sentencia (512 desde el
MASM 6.0).
Las sentencias pueden ser escritas en maysculas o minsculas, el ensamblador no es sensible al
tamao. Cada campo a excepcin de los comentarios, debe ser separado de otro por medio de un espacio o un

tabulador. Se recomienda el uso de tabuladores para hacer ms legible el cdigo.


Una sentencia puede tener hasta 4 campos, se presentan y describen a continuacin:
[identificador] [mnemnico] [operando(s)] [;comentario]
Dnde:
Identificador: Nombre que se aplica a elementos de un programa. Existen dos tipos de identificadores:
nombre, que se refiere a la direccin de un elemento de dato, y etiqueta, que se refiere a la direccin de una
instruccin. Las mismas reglas se aplican tanto para los nombres como para las etiquetas.
Mnemnico: Define la accin de la sentencia. Los tipos de mnemnico son dos: la directiva, especifica, la
manera en que el ensamblador va a generar el cdigo objeto durante el tiempo de ensamble y la instruccin,
que es transformada en tiempo de ensamble en cdigo objeto y que en el tiempo de ejecucin controlan la
ejecucin del programa.
Operando(s): Define el dato a ser manipulado por la sentencia.
expresiones y registros.

Constan de smbolos, constantes,

El smbolo, es un nombre que representa un valor, son tal vez, los elementos ms importantes de un
programa en lenguaje ensamblador, stos incluyen; variables, direcciones, etiquetas, macros,
segmentos, procedimientos, registros, y estructuras. Constantes, expresiones y cadenas pueden ser
representados tambin simblicamente. Un smbolo es un nombre que consta de letras, nmeros y
caracteres especiales.
Reglas para construir smbolos:
1.
El nombre puede tener cualquier combinacin de letras maysculas y minsculas.
2.
Los dgitos pueden ser utilizados dentro de un nombre, pero nunca debern ser el primer
carcter del nombre.
3.
Un nombre puede tener cualquier nmero de caracteres, pero solo los primeros 31 caracteres
son reconocidos.
4.
Los caracteres guion bajo (_), la interrogacin (?), y el signo (@) pueden usarse tanto al inicio
como dentro de un nombre.
5.
El punto (.) no puede ser utilizado dentro de un nombre, pero si puede ser el primer carcter de
un nombre.
6.
Un nombre no puede ser igual a ninguna palabra reservada.
Las constantes se usan en los archivos fuente para especificar nmeros o cadenas, las cuales son
inicializadas en tiempo de ensamblado. El MASM reconoce cuatro tipos de constantes: Enteras, Binarios
empaquetados Codificados en Decimal (BCD), Nmeros Reales y Cadenas.
1) Enteras.
Se usan para declaracin de datos, o como operandos inmediatos, y stos pueden especificarse
en binario, octal, decimal o hexadecimal. El RADIX para un entero puede ser definido usando el
especificador RADIX o globalmente mediante la directiva .RADIX
Especificadores de Radix.
Radix
Binario
Octal
Decimal
Hexadecimal

Especificador
B
QO
D
H

b
qo
d
h

Los nmeros hexadecimales debern siempre empezar con un dgito (0 al 9), cuando el nmero inicia
con una letra deber anteponerse un CERO (0) para distinguir entre smbolos y nmeros
hexadecimales. Las letras pueden ser tambin maysculas y minsculas. El Radix predefinido es el
decimal, pero puede ser alterado globalmente en el programa usando la directiva .RADIX

Sintaxis:
.RADIX expresin
Dnde: expresin es un nmero entre 2 - 16 el cual define la base a ser empleada como predefinida.
Nota: La directiva RADIX no afecta a nmeros reales inicializados como variables con las directivas;
DD, DQ o DT. Los valores iniciales de estas variables son evaluados como nmeros decimales.
Ejemplo:
.RADIX 16
.RADIX 2

;Define el default Radix como hexadecimal.


;Define el default Radix como binario.

2) Binarios empaquetados codificados en decimal.


Cuando un nmero constante entero se define empleando la directiva DT, el nmero se interpreta
predefinido como un nmero binario empaquetado codificado en decimal. La sintaxis para especificar
nmeros binarios codificados en decimal es exactamente la misma que para otros enteros; sin
embargo MASM a los nmeros Binarios Empaquetados Codificados en Decimal los codifica de
manera diferente.
Ejemplo:
positivo
negativo

DT
DT

1234567890
-1234567890

;codifcado 00000000001234567890h
;codificdo 80000000001234567890h

3) Nmeros Reales.
Un nmero real consiste de una parte entera, una parte fraccionaria y un exponente. Los nmeros
reales son expresados usualmente de manera decimal.
Sintaxis: [+ | -] entero.fraccin [E [+ | -] exponente]
Durante el ensamblado el nmero real expresado en forma decimal es convertido a formato binario,
as tanto el signo, el exponente y la mantisa son convertidos a bits.
Se puede expresar tambin el nmero real, ya codificado en binario seguido del designador (R), se
usa como el Radix, para nmeros reales.
Los nmeros reales pueden ser utilizados para inicializar variables con las directivas DD, DQ y DT.
El mximo nmero de dgitos y el mximo rango del exponente depende de la directiva.
Por definicin los nmeros reales son expresados en el formato IEEE.
Ejemplos:
short
long
long_double

DD 25.23
DQ 2.523E1
DT 2523E-2

Formato IEEE
lee_short DD 3F800000R
lee_long
DQ 3FF0000000000000R
lee_longdouble
DT 3FFF8000000000000000R
4) Cadenas.

;short 1.0
;long 1.0
;long double 1.0

Las constantes de cadena si son sensibles al tamao. Cuando una cadena consta de solo un carcter,
se le llama constante de carcter
Sintaxis: 'caracteres' o "caracteres"
Ejemplos:
cad1
cad2
cad3
cad4
cad5
cad6
cad7

DB
DB
DB
DB
DB
DB
DB

'a'
"a"
"Este es un mensaje"
'Pepe''s loches'
"Pepe's lonches"
"Este ""valor"" no existe"
'Este "valor" no existe'

;Cadena carcter.
;Cadena carcter.
;Cadena.
;Imprime: Pepe's lonches
;Imprime: Pepe's lonches
;Imprime: Este "valor" no existe
;Imprime: Este "valor" no existe

Comentarios: Describe la sentencia, no tiene efecto en el ensamblado. Son detalles del cdigo, usados
solo para documentacin del programa, son ignoradas por el ensamblador. Los comentarios pueden ser
escritos de 2 maneras.
a) Usando un punto y coma (;) como inicio del comentario en cada lnea.
b) Usando la directiva COMMENT
Sintaxis:
COMMENT delimitador [texto]
texto
delimitador [texto]
Todo el texto escrito entre la lnea del primer delimitador y la lnea del segundo delimitador es ignorado por el
ensamblador.
El carcter delimitador es el primer carcter NO BLANCO despus de la directiva COMMENT.

2.1.2 El paquete de ENSAMBLADOR de Microsoft ( MASM).


El MACROASSEMBLER (MASM), nos brinda una sintaxis de programacin lgica adaptada a la
arquitectura de segmentacin de los microprocesadores 8086/8088, 80186/80188, 80286 y 80386, as como a los
procesadores matemticos 8087, 80287 y 80387.
El ensamblador nos ofrece mdulos objeto reubicables producidos de archivos fuente en ensamblador.
Estos mdulos objeto pueden ser enlazados usando el LINK, tambin de Microsoft. Los mdulos objeto creados
por MASM son compatibles con muchos de los mdulos objeto de lenguajes de alto nivel, de los cuales podemos
mencionar aquellos que nos brinda Microsoft como son: BASIC, C, FORTRAN y compiladores de Pascal.

MASM nos brinda un conjunto de caractersticas, que hacen fcil la programacin, de las cuales podemos
mencionar las siguientes:
Cuenta con un conjunto completo de Macro Directivas.
Podemos compilar de manera condicional porciones de un archivo fuente.
Soporta un rango amplio de operadores para crear expresiones complejas en tiempo de ensamblado.
Cuenta con una estricta verificacin de sintaxis de todos los estatutos declarados en el archivo fuente.
MASM requiere de ciertas caractersticas de hardware y software para poder trabajar adecuadamente y stas
se citan a continuacin:
De la versin 2.0 del MS DOS en adelante.
192 KB. de memoria RAM.
Si se usa el CODE VIEW 320 KB.
2.1.2.1. Ciclo de Desarrollo de un Programa.
1)
Use un Editor de Texto que produzca cdigo ASCII para crear y/o modificar los mdulos fuente del
programa en ensamblador (archivos .ASM). Al escribir el archivo fuente recuerde que MASM no es
sensible al tamao (puede ser escrito con MAYSCULAS o con minsculas).
2)
Use el comando MASM para ensamblar cada uno de los mdulos fuente, (.ASM) el mdulo resultante ser
un archivo OBJ. Usando el MASM tambin se pueden crear durante el ensamblado archivos LST (Listado)
y CRF (Archivo de referencias cruzadas).
Sintaxis de MASM:
MASM [opciones] arch_fu [,[arch_obj] [,[arch_lst] [,[arch_ref]]]] [;]
De las opciones disponibles en MASM, podemos considerar las siguiente, como ms usuales.
/HELP Para ver todas las opciones de MASM. En este caso solo se usa con MASM esta opcin Ej;
MASM /Help
/V
Informacin adicional en el ensamblado.
+ Nmero de lneas.
+ Smbolos procesados.
/Z
Muestra las lneas que contienen errores en la pantalla adems del mensaje de error que describe
el problema.
/ZI
Escribe informacin simblica en el archivo objeto para ser usada por el CODE VIEW (CV).
Por ejemplo, suponga que ya se tecleo el archivo ENSA01.ASM y que el PROMPT es C:\USER>, para
crear solo el archivo ENSA01.OBJ se teclea:
C:\USER>MASM ensa01;
Si requiere crear los archivos: ENSA01.OBJ, ENSA01.LST, ENSA01.CRF y utilizando los parmetros que
nos sirven para generar informacin adicional tanto en el ensamblado as como si existen errores, nos mostrar
las lneas donde estos fueron generados y por ltimo va a incluir en el archivo .OBJ informacin para el uso
posterior del CODE VIEW (CV).
C:\USER>MASM /V /Z /ZI ensa01,,,;
Nota. Los archivos .CRF son archivos binarios para que estos puedan ser ledos deben ser convertidos a
ASCII, esto se hace mediante el archivo CREF, ejemplo:
C:\USER>CREF ensa01;
3)

Use el comando LINK para combinar los mdulos objeto (.OBJ) con los mdulos en las libreras
obteniendo como salida un solo archivo ejecutable con extensin .EXE, durante el proceso de enlazado
tambin podemos crear de manera opcional un archivo .MAP, el cual contiene la distribucin de los
segmentos en el mapa de memoria del programa.
Sintaxis de LINK

LINK [opciones] arch_obj [,[arch_exe] [,[arch_map] [,[arch_lib]]]] [;]


La opcin ms usual en LINK es:
/CO Se usa cuando en MASM incluimos /ZI, aade al archivo ejecutable informacin de DEBUG, esto se
hace cuando se va a usar posteriormente el CODE VIEW (CV).
/HELP Nos muestra las opciones del LINK.
Nuevamente, suponga que se tiene el archivo ENSA01.OBJ y para generar solo el archivo ENSA01.EXE, sin
informacin para CODE VIEW se teclea:
C:\USER>LINK ensa01;
Para crear solo el archivo ENSA01.EXE, incluyendo informacin para CODE VIEW.
C:\USER>LINK /CO ensa01;
Si adems de producir el archivo ENSA01.EXE, se requiere el archivo ENSA01.MAP.
C:\USER>LINK ensa01,,;
4)

Si desea un archivo .COM (del cual ya fueron discutidas sus caractersticas), utilice el archivo EXE2BIN
para convertir un archivo ejecutable a un archivo .COM. A continuacin se muestra como se tecleara en la
lnea de comandos
C:\USER>EXE2BIN ensa01 ensa01.com

5)

Puede utilizar un depurador para detectar errores lgicos, este rastreo puede ser realizado de varias
formas:
* Corra el programa y estudie sus entradas y salidas.
* Estudie el listado del archivo fuente.
* Use CREF para generar un listado de referencias cruzadas (.REF).
* Rastree el Programa paso a paso, use:
+ El DEBUG del sistema Operativo.
+ El CODE VIEW (CV) del MASM.

6)

Una vez descubiertos los errores regrese al punto UNO para corregir el archivo fuente (.ASM).

Todo o parte del ciclo de desarrollo de un programa puede ser automatizado mediante:
Para programas sencillos, use archivos .BAT
Para programas ms complejos use el MAKE

Figura 2.1 Ciclo de Desarrollo de un Programa.


2.1.3 Organizacin de los programas .COM

El programa .COM es almacenado en memoria inmediatamente despus del PSP, esto es 100h bytes (256
bytes) por arriba de la direccin de inicio del programa, el mximo tamao de estos programas es de 65,536 - 256
2 = 65,278. Los ltimos 2 bytes se deben al espacio asignado al tope del STACK, esto es 2 bytes al final del
segmento. Cuando un programa .COM inicia su ejecucin todos los registros de segmento contienen la misma
direccin, esto es, la direccin de inicio del PSP. El registro SP contiene una direccin de 2 bytes abajo de la
memoria mxima disponible para el programa, lo que significa que hay 64 KB de espacio disponible para el
programa, SP = 0FFFEh. Esto se debe a que DOS siempre coloca un CERO en la pila antes de transferir el control
al programa .COM.
Deber usarse la directiva ORG para iniciar en el byte 256 (100h), de tal manera de dejar
espacio para el PSP, el cual es cargado en memoria de manera automtica en el momento de
cargar el programa. Si el programa contiene DATOS, stos no debern ser ejecutados, se podr
usar la instruccin JMP de tal forma de brincarlos. Tambin se pueden colocar dichos datos al final
del programa despus de la instruccin de retorno al DOS. En la figura 2.2 se muestra el mapa de
memoria del programa .COM

0FFFEh

00
00

0FFFEh

SP

Cdigo y datos
del programa.

00100h
000FFh

PSP

CS, SS, ES, DS


Figura 2.2 Mapa de memoria de un programa .COM
2.1.3.1 Estructura Estndar.
CODE SEGMENT
;Inicio del segmento de cdigo
ASSUME CS:CODE, DS:CODE, ES:CODE, SS:CODE
ORG 100h
;Principio del cdigo
inicio: jmp
principio
;Salta los datos
;Lugar para datos
principio:
nop
;Aqu inicia el cdigo.
mov ax, 4C00h
INT 21h
CODE ENDS
END inicio

2.1.3.1.1 Sintaxis de la declaracin de un segmento.

;Se usa la funcin 4Ch de la


;INT. 21h para salir al DOS
;Fin del segmento de cdigo.
;Indica donde inicia la ejecucin

Si se desea un control completo sobre del segmento, es necesario realizar una definicin completa y para
ello se declara:
Sintaxis:
nombre SEGMENT
sentencias
nombre ENDS
Dnde:
nombre: Define el nombre del segmento, puede ser nico o puede ser el mismo dado a otros segmentos
en el programa. Los segmentos con el mismo nombre son tratados como el mismo segmento.
Existen instrucciones que se relacionan por omisin con ciertos segmentos, por ejemplo:
JMP
PUSH
MOV

Asume el segmento asociado con CS


Asume el segmento asociado con SS
Asume el segmento asociado con DS

Cuando el ensamblador necesita referenciar una direccin, deber saber a qu segmento corresponde,
Este trabajo lo realiza usando los registros asociados con las direcciones de inicio de los segmentos definidos en la
directiva ASSUME. La directiva ASSUME solo afecta en tiempo de ensamble.
Sintaxis:
ASSUME reg_seg:nombre_seg [, reg_seg:nombre_seg]
ASSUME reg_seg:NOTHING
ASSUME NOTHING
Dnde:
nombre_seg: Es el nombre del segmento o GRUPO que ser asociado con el registro de segmento.
Instrucciones subsecuentes que suponen un registro de default para referenciar etiquetas o variables en
realidad estn referenciando el inicio del segmento. El nombre_seg, puede ser:
* El nombre de un segmento definido en el cdigo fuente mediante la directiva SEGMENT.
* El nombre de un GRUPO definido en el archivo fuente usando la directiva GROUP.
* La palabra NOTHING.
* Una expresin SEG.
reg_seg: Puede ser; CS, DS, ES, o SS (FS, GS para el 80386).
La palabra NOTHING cancela la seleccin actual de los segmentos asociados con una directiva anterior
ASSUME.
La directiva ASSUME normalmente se usa al inicio del archivo fuente para asociar los cuatro registros de
segmento, sin embargo es posible usarla en cualquier parte del archivo fuente para cambiar la asociacin. El uso
de la directiva ASSUME es equivalente a sobre-escribir un segmento usando el operador (:). El uso del operador
(:) es conveniente cuando la sobre-escritura de un segmento se realiza solo una vez. La directiva ASSUME es
ms conveniente cuando la sobre-escritura de un segmento se realiza ms de una vez.
Observando el formato de la estructura estndar del programa COM, se describen a continuacin los
siguientes elementos:
org

Directiva que pone el IP en el valor de expresin.


Sintaxis:
org expresin

jmp

Instruccin de salto incondicional.


Sintaxis:
jmp etiqueta

--etiqueta:
inicio: Va antes de la primera instruccin ejecutable, la cual debe ser marcada con una "etiqueta", en este caso
se us inicio:, sta aparece tambin despus del END final. Esta etiqueta indica que el programa deber
empezar a ejecutarse a partir de etiqueta "inicio: ". En este caso a partir de la instruccin NOP (no
operacin). En un programa especfico, es ah donde se iniciar con la primera instruccin.
mov

Instruccin de transferencia de informacin de un operando fuente a un operando destino.


Sintaxis:
mov oper_des, oper_fuente

INT

Instruccin que llama a ejecucin a una interrupcin de un byte.


Sintaxis:
INT # interrupcin

El programa debe terminar con END etiqueta

A continuacin se presenta un ejemplo de un programa .COM usando la estructura estndar.


; Programa ENSA01.ASM
CODE SEGMENT
;Declara el segmento de cdigo.
ORG 100h
;Reserva un espacio de 256 bytes.
ASSUME CS:CODE, DS:CODE, ES:CODE, SS:CODE ;Dclara registro de segmentacin con segmento.
inicio: jmp principio

;Salta los Datos.

Dato

;Define una cadena, es terminada con signo de pesos para ser utilizada
;por la Interrupcin 21h funcin 09h.

DB 'Hola$'

principio:
mov dx, OFFSET Dato
mov ah, 09h
INT 21h
mov ax, 4c00h
INT 21h
CODE ENDS
END inicio

;Coloca el desplazamiento de la cadena en DX.


;Pone en AH funcin 09h.
;Llamado a la interrupcin 21h.
;Usa la funcin 4Ch de INT. 21h para salir al DOS.
;Llamado a la interrupcin 21h.
;Marca el fin del segmento de cdigo.

COMENTARIOS.
- El programa escribe la palabra hola es la pantalla.
- El programa consta de un solo segmento, el de cdigo.
- El operador OFFSET nos permite escribir la direccin de la variable Dato al registro DX.
Para enva la palabra hola a la pantalla, utilizamos una rutina definida por el DOS en la interrupcin 21h, es
la funcin 09h, la cual se define y llama de la siguiente manera:
INT 21h Funcin 09h: Imprime una cadena de caracteres sobre la pantalla.
Entrada:
AH = 09h
DS:DX = Direccin de inicio de la cadena.
La funcin 09h es muy fcil de usar, para utilizarla coloque la cadena en memoria y termnela con un signo
de pesos ($), esto significa que no se puede incluir este signo como parte de la cadena, la direccin del inicio de la
cadena es colocada en los registros DS:DX
Use INT 21h funcin 4Ch para terminar un programa. Puede regresar un valor al programa padre en el
registro AL. Normalmente se regresa un CERO (00h) cuando el programa termina sin problemas.

INT 21h Funcin 4Ch: Regresa al DOS con cdigo de retorno


Entrada:
AH = 4Ch
AL = Valor regresado.
2.1.3.2 Estructura simplificada.
Los ensambladores de Microsoft y Borland en su versiones actuales ofrecen ciertas facilidades que nos
simplifican la creacin de archivos fuente en lenguaje ensamblador, a este mtodo se le llama, Estructura
Simplificada, la cual adems de facilitarnos la tarea, hace que la estructura del programa sea compatible con los
lenguajes de alto nivel estndares.
Tal vez al presentar el mtodo parezca en principio un poco ms elaborado,
que el anterior, pero una vez dominndolo es ms simple, sobre todo cuando se trabaja con programas .EXE.
La versin 5.0 de MASM implementa un sistema simplificado para declarar segmentos. Por default, las
directivas simplificadas de segmento usan los nombres de los segmentos y convenciones usadas por Microsoft en
sus lenguajes de alto nivel. Si se escriben programas estndar en ensamblador en los cuales los nombres de los
segmentos, orden y otros factores no son crticos, las directivas simplificadas nos proporcionan una manera fcil
de programar. Cuando se escriben rutinas en ensamblador las cuales debern enlazarse con lenguajes de alto
nivel de Microsoft, las directivas simplificadas de segmento, aseguran consistencia con las caractersticas de las
rutinas en lenguaje de alto nivel.
En el esqueleto del programa, es necesario primero definir el modelo de memoria a utilizar, de la misma
forma que se hace en los lenguajes de alto nivel; en este caso usamos el modelo Small. Su definicin se hace
mediante la directiva .MODEL (note que el punto es parte del nombre del identificador).
El segmento de cdigo (en este caso es el nico), se define mediante la directiva .CODE, se establece el
punto de entrada al cdigo mediante la etiqueta inicio:, la cual va tambin despus del END final. El retorno al
DOS se hace mediante la misma funcin del DOS: 4Ch

.MODEL SMALL
.CODE
ORG 100h
inicio:
nop

;Especifica un modelo de memoria.


;Declara el segmento de cdigo.
:Direccin de inicio del cdigo.
;Aqu inicia el cdigo.

mov ax, 4C00h


INT 21h

;Se usa la funcin 4Ch de la


;Interrupcin 21h para salir al DOS

END inicio

;Indica donde inicia la ejecucin.

2.1.3.2.1 Modelos de Memoria.


Los modelos de memoria, especifican el tamao usado tanto en datos como en cdigo en el programa.
Los lenguajes de alto nivel requieren la definicin de un modelo de memoria especfico, si vamos a enlazarlo con
una rutina en ensamblador, sta deber tener la definicin del mismo modelo de memoria. Esta deber utilizarse
antes que cualquier otra directiva de segmento y si se usa la directiva DOSSEG, sta deber ir antes de la directiva
del modelo de memoria. Para declara el tipo de memoria a utilizar en un programa, la sintaxis es la siguiente:
.MODEL nombre_memoria_modelo

Dnde:
nombre_memoria_modelo: Corresponde al tipo de memoria y puede ser una de las que se muestran en
la siguiente tabla.
Modelo
Tiny
Small
Mdium
Compact
Large
Huge

Descripcin.
Tanto datos como cdigo son acomodados en un mismo segmento, se usa para programas
.COM
Los datos se escriben en un segmento y el cdigo en otro segmento. Cada segmento puede
tener hasta 64 KB. En este caso se usan punteros NEAR para cdigo y datos.
Todos los datos se escriben en un segmento 64 KB mximo. El cdigo puede ocupar ms de
un segmento, entonces los datos se manejan como NEAR paro el cdigo como FAR.
Todo el cdigo se acomoda en un solo segmento, pero los datos pueden ocupar ms de un
segmento, sin embargo los arreglos no pueden ocupar ms de 64K. De esta manera cdigo es
NEAR pero los datos son FAR.
Tanto el cdigo como los datos pueden ocupar ms de un segmento, sin embargo los arreglos
se siguen limitando a 64 KB. De esta manera, tanto los datos como el cdigo son FAR.
Tanto el cdigo como los datos pueden ocupar ms de un segmento, en este caso tambin los
arreglos pueden ser ms grandes que 64 KB. Todos los punteros utilizados en este modelo son
FAR.

2.1.3.2.2 Definiendo segmentos simplificados.


Sintaxis:
.STACK [tamao]
Segmento de pila.
.CODE
Segmento de cdigo.
.DATA
Segmento para datos inicializados NEAR.
.DATA?
Segmento para datos no inicializados NEAR.
.FARDATA
Segmento para datos inicializados FAR.
.FARDATA?
Segmento para datos no inicializados FAR.
.CONST
Segmento para datos constantes.
En el caso de la directiva .STACK, si no se especifica el tamao, esta se define como predefinida de 1 KB.
Un dato no inicializado es aquel que se declara usando (?) y el operador DUP.
En un programa estndar en ensamblador se puede usar tanto la directiva .DATA como .DATA? o
.FARDATA como .FARDATA? sin embargo, cuando escribimos una rutina para ser enlazada con un programa
escrito en un lenguaje de alto nivel, debemos respetar las convenciones.
Un dato constante es aquel que nunca se va a cambiar en tiempo de ejecucin, el uso de la
directiva de segmento .CONST es opcional en un programa estndar en ensamblador, pero deber
utilizarse cuando la rutina se va a enlazar con un programa escrito en un lenguaje de alto nivel.
Los datos definidos con los segmentos .STACK, .CONST, .DATA, .DATA?, son colocados en el grupo
llamado DGROUP. Los datos definidos con los segmentos .FARDATA y .FARDATA?, no son colocados en ningn
grupo.
2.1.3.2.3 Orden de los segmentos.
La directiva DOSSEG especifica que los segmentos debern ser ordenados de acuerdo a la convencin para
segmentos del DOS, esta convencin se utiliza por Microsoft para los lenguajes de alto nivel.
Cuando se usa esta directiva los segmentos son ordenados como sigue:
1) Segmentos teniendo el nombre de clase 'CODE'.
2) Cualquier segmento que no tenga el nombre de clase 'CODE' y no se encuentre en el DGROUP.
3) Segmentos que son parte de DGROUP en el siguiente orden:
a) Segmentos con nombre de clase BEGDATA. (Este nombre se reserva para uso de Microsoft).

b)
c)
d)
e)
f)

Cualquier segmento cuyo nombre de clase no sea: BEGDATA, CONST, DATA, BSS o STACK.
Segmento de clase CONST.
Segmentos de clase DATA.
Segmentos de clase BSS.
Segmento de clase STACK.

STACK
BSS
DATA
DGROUP
CONST
BEGDATA
Otros segmentos
CODE
Figura 2.3 Orden de los segmentos.
2.1.3.2.4 Uso de valores predefinidos.
Valores de segmento.
Para cada una de las directivas de segmento existe su correspondiente valor, el cual se expresa por su mismo
nombre, excepto que este valor inicia con el signo (@) y la directiva empieza con un punto (.). As por ejemplo:
@code
@data
@fardata
@fardata?

Representa el nombre del segmento definido por .CODE


Representa el nombre del grupo que comparte todos los segmentos de datos NEAR,
puede usarse para acceder a los segmentos creados por .DATA, DATA?, CONST y .STACK
Representa al segmento .FARDATA
Representa al segmento .FARDATA?

Estos valores pueden utilizarse en la sentencia ASSUME y en cualquier lugar donde debemos referir a un
segmento por su nombre.
Nota: Hay otros valores ya predefinidos, los cuales forman parte del sistema simplificado de segmentos.
Relacin predefinida en directivas simplificadas de segmento.
Cuando se usa la directiva .MODEL la directiva PROC se asocia con el modelo especfico definido.
NEAR Para modelo Small y Compact.
FAR Para modelo Medium, large y huge.
En el caso de datos, la direccin base es DGROUP, ya vimos que segmentos forman este Grupo.

Nombres de segmentos predefinidos.


En esta seccin analizaremos solo los correspondientes al modelo Small.

Modelo

Directiva

Nombre

Alineacin

Combinacin

Clase

small

.code

_text

word

public

code

Grupo

.data

_data

word

public

data

dgroup

.const

const

word

public

const

dgroup

. data?

_bss

word

public

bss

dgroup

.stack

stack

para

stack

stack

dgroup

A continuacin se presenta un ejemplo de un programa .COM usando la estructura estndar.


TITLE ENSA01A.ASM
COMMENT & Programa que muestra el uso de la estructura simplificada para programas .COM &
.MODEL Small
.CODE
ORG 100h
;Se fija posicin de inicio del PSP
inicio:
jmp main
;Saltamos los Datos.
a DB "Hola$"
main:
mov dx, OFFSET a
mov ah, 9
INT 21h
mov ax, 4C00h
INT 21h
END inicio

;Colocamos en DX la direccin de
;inicio de la cadena para luego
;llamar a la funcin 09h de la INT 21h.
;Salida del programa y Regreso al
;DOS con cdigo de retorno 00h.

COMENTARIOS.
Al analizar el cdigo notamos que es el mismo utilizado en la estructura estndar, y tambin, igual que el
anterior, imprime en pantalla la palabra hola. El smbolo utilizado como delimitador en los comentarios iniciales fue
(&), podemos emplear cualquier otro siempre y cuando se use el mismo al inicio y al final.

2.1.4 Organizacin de los programas .EXE


El procesador puede manejar hasta cuatro tipos de segmento; STACK, DATA, EXTRA y CODE. Un
programa .EXE requiere como mnimo de la utilizacin de 2 segmentos; el de cdigo y el de pila. El lenguaje
ensamblador siempre busca la definicin del segmento de STACK, genera un error si el usuario olvida incluirlo.
Podemos generalizar el mapa de memoria de un programa .EXE de acuerdo a la Figura 2.4.
SP

Arriba del segmento de STACK


Segmento de clase STACK

SS
Uno o ms segmentos
de clase DATA

Uno o ms segmentos
de clase CODE
Punto de entrada

CS:IP
PSP
DS, ES

Posicin inicial de los registros de segmento


Figura 2.4 Mapa de memoria de un programa .EXE

2.1.4.1 Estructura Estndar.


El MASM hasta su versin 4.0 manej este tipo de definicin nicamente, a la fecha la sigue soportando de
la misma manera lo hace el TASM. Esta definicin nos da un mayor control sobre el programa, en muchas
circunstancias es necesario utilizarla. Vamos a empezar analizando un programa con solo 2 segmentos; Uno de
cdigo, en el cual tambin se incluyen datos, y el otro de pila, necesario en este tipo de estructura.

STACK SEGMENT PARA STACK 'STACK'


DB 128 DUP (?)
STACK ENDS

;Declaracin del segmento de pila


;Reserva 128 bytes.
;Fin del segmento de pila

CODE SEGMENT PARA PUBLIC 'CODE'


;Declara el segmento de cdigo.
ASSUME CS:CODE, DS:CODE, ES:CODE, SS:STACK
inicio: nop
;Aqu inicia el cdigo.
mov ax, 4C00h
INT 21h
CODE ENDS
END inicio

;Se usa la funcin 4Ch de la


;Interrupcin 21h para salir al DOS
;Fin segmento de cdigo.
;Indica inicio ejecucin.

COMENTARIOS
En la estructura anterior se delimita cada segmento por un nombre, entonces tenemos 2 segmentos; uno
llamado STACK y el otro llamado CODE. Cada segmento inicia con la directiva SEGMENT y termina con un ENDS
(fin de segmento). Esta directiva le indica como debe preparar y estructurar el cdigo en lenguaje de mquina, no
genera cdigo de mquina.
Sintaxis de SEGMENT.
nombre-seg SEGMENT ALINEACION COMBINACION 'CLASE'
--sentencias
--nombre-seg ENDS
Para nuestra definicin.
SEGMENTO DE PILA.
STACK
Nombre del segmento de pila.

PARA

Alineacin, el segmento inicia en los lmites de un prrafo (direccin divisible entre 16 10h).

STACK

Combinacin, Indica que el segmento es el de pila.

'STACK'

'Clase', Este parmetro se emplea para hacer referencia a una coleccin de segmentos.

Nota: Los segmentos con el mismo nombre de clase se colocan en memoria secuencialmente, siguiendo el orden
en que fueron encontrados por el enlazador. El nombre de la clase puede ser cualquier smbolo.
DB

Esta directiva significa DEFINE BYTE.

DUP

Reserva e inicializa con un valor una rea de memoria nveces, si se usa (?) no hay un valor inicial.
Sintaxis
nveces DUP (valor_inicial)
Ejemplos:
1. DB 128 DUP (?).- Reserva 128 bytes de espacio de memoria para la pila, este espacio no es
inicializado con un valor especfico.
2. DB 128 DUP ('STACK').- El espacio es llenado con 128 repeticiones de la cadena 'STACK'.

ENDS

Indica el final del segmento llamado STACK

SEGMENTO DE CODIGO.
CODE

Nombre del segmento de cdigo.

PARA

Alineacin, el segmento inicia en los lmites de un prrafo (direccin divisible entre 16, 10h).

PUBLIC

Combinacin, Todos los segmentos con el mismo nombre y con atributo PUBLIC sern
encadenados juntos.

'CODE'

'Clase', Este parmetro se emplea para hacer referencia a una coleccin de segmentos.

Nota importante: Los segmentos con el mismo nombre de clase se colocan en memoria secuencialmente
(PUBLIC), siguiendo el orden en que fueron encontrados por el enlazador. El nombre de la clase puede ser
cualquier smbolo.
ASSUME

Esta directiva asocia el nombre del segmento con el registro de segmento.


Sintaxis:
ASSUME registro_de_segmento : nombre de segmento

inicio:

Va antes de la primera instruccin ejecutable, la cual debe ser marcada con una "etiqueta", en este
caso se uso inicio:, sta aparece tambin despus del END final.
Esta etiqueta indica que el programa deber empezar a ejecutarse a partir de "etiqueta" inicio:. En
este caso a partir de la instruccin NOP (no operacin). En un programa especifico, aqu se iniciar
con la primera instruccin.

Ejemplo: Programa .EXE. Estructura Estndar.


;Programa ENSA02.ASM
STACK SEGMENT PARA STACK 'STACK'
DB 64 DUP (?)
STACK ENDS

;Declaracin del segmento de pila.


;Reserva 64 bytes para la pila
;Fin del segmento de pila.

CODE SEGMENT PARA PUBLIC 'CODE'


;Declaracin del segmento de cdigo.
ASSUME CS:CODE, DS:CODE, ES:CODE, SS:STACK
inicio: jmp principio
Dato DB 'Hola$'
principio:
mov ax, CS
mov ds, ax
mov dx, OFFSET Dato
mov ah, 9h
INT 21h
mov ax, 4c00h
INT 21h
CODE ENDS
END inicio

;Salta los datos


;Define una cadena terminada en $.
;Asigna el segmento de cdigo al segmento de datos
;Coloca el desplazamiento de la cadena en DX
;Pone en AH funcin 09h de la
;interrupcin 21h
;Usa la funcin 4Ch de interrupcin 21h
;para salir al DOS, 00 es el valor regresado por el programa.

COMENTARIOS.
El programa consta de 2 segmentos: El de cdigo y el de datos. Advierta que es necesario asignar la
misma direccin a DS que a CS, ya que en el mismo segmento se maneja cdigo y datos.
Este programa
imprime la cadena Hola en la pantalla.

2.1.4.2 Estructura Simplificada.


La manera ms sencilla de escribir un programa en ensamblador es utilizando la definicin simplificada, sin
embargo, esta definicin no nos da un control total sobre la computadora, si lo deseamos, tendremos que recurrir a
la estructura estndar de un programa en ensamblador. La estructura simplificada es simple y est disponible a
partir de la versin 5.0 del MASM, el TASM en su versin 2.0 tambin la usa.
En esta primera incursin, no vamos a ahondar en explicaciones detalladas, ms bien debemos
concentrar nuestra atencin en los componentes del programa, de tal manera de poder usar dicha
estructura en un programa determinado.

.MODEL SMALL
.STACK

;Especifica un modelo de memoria.


;Declaracin del segmento de pila.

.CODE

;Declaracin del segmento de cdigo.

inicio:
nop

;Aqu inicia el cdigo.

mov ax, 4C00h


INT 21h

;Se usa la funcin 4Ch de la


;Interrupcin 21h para salir al DOS

END inicio

;Indica donde inicia la ejecucin.

COMENTARIOS.
.MODEL

Es una directiva que nos permite definir el Modelo de Memoria utilizado, ste le dice al compilador como
acomodar en memoria las instrucciones y los datos.

SMALL

Es el nombre de un Modelo de Memoria el cual nos permite usar un segmento para cdigo y un
segmento para datos, donde cada segmento puede tener hasta 64 KB de longitud.

.STACK

Es una directiva que le dice al compilador que reserve una cierta cantidad de memoria para realizar
operaciones con la pila. Si no se indica cantidad reserva 1KB.

.CODE

Es una directiva que le indica al compilador el inicio del segmento de cdigo. La primera instruccin
ejecutable es necesario que sea marcada con una "etiqueta", en este caso se uso inicio:, sta aparece
tambin despus del END final.
Esta etiqueta indica que el programa deber empezar a ejecutarse a partir de la "etiqueta" inicio:. En
este caso a partir de la instruccin NOP (no operacin). En un programa especifico, aqu se iniciar con
la primera instruccin.

Ejemplo: ENSA02A.ASM. Estructura Simplificada.


COMMENT * Programa ENSA02A.ASM *
.MODEL SMALL
.STACK 100h

;Especifica el modelo de memoria SMALL


;Se separan 256B. para la pila.

.CODE
inicio: jmp principio
Dato DB 'Hola$'
principio:
mov ax, CS
mov DS, ax
mov dx, OFFSET Dato
mov ah, 9h
INT 21h
mov ax, 4c00h
INT 21h

;Inicia el segmento de cdigo.


;Salta los datos.
;Define una cadena terminada en $.
;Asigna el segmento CS a DS
;el programa solo tiene dos segmentos.
;Coloca el offset del mensaje en DX
;Pone en AH funcin 09h de
;interrupcin 21h
;Usa la funcin 4Ch de interrupcin 21h
;para regresar al DOS.

END inicio
COMENTARIOS.
El programa consta de 2 segmentos: cdigo y stack.
Es conveniente colocar las etiquetas en una lnea aparte, esto hace que no se pierda la identacin del
programa cuando la etiqueta es grande.
Para asignar el contenido de un registro de segmento a otro registro de segmento, es necesario hacerlo
tomando como intermediario un registro de propsito general, en este caso el AX.
Usando la directiva COMMENT para comentarios. El comentario puede tener ms de 1 rengln, se usa un
delimitador, al inicio y al final del comentario, el delimitador puede ser cualquier signo.
Este programa imprime la cadena Hola en la pantalla, para lograrlo llama a la funcin 09h de la
interrupcin 21h del DOS.

Nota importante: Al usar nmeros en un archivo fuente de un programa en ENSAMBLADOR, stos por default son
considerados como decimales, a menos que se haga una declaracin explicita, como en el 21h; donde (h) indica
que el radix del nmero 21 es hexadecimal.

2.1.4.3 Programas .EXE con 3 segmentos:


Este tipo de formato es el ms comn, consta de:
a) Segmento de STACK.
b) Segmento de DATOS.
c) Segmento de CODIGO.
Ejemplo 1: Usando la Estructura Simplificada.
COMMENT + Programa usando el mtodo Simplificado. ENSA03.ASM +
.MODEL SMALL
.STACK 100h

;Define el Modelo de Memoria SMALL


;Asigna un espacio de 256 bytes a la pila

.DATA
Dato DB 'Hola$'

;Inicia el segmento de Datos.


;Define una cadena terminada en $

.CODE
inicio:
mov ax, @DATA
mov ds, ax
mov dx, OFFSET Dato
mov ah, 9h
INT 21h
mov ax, 4c00h
INT 21h

;Inicia segmento de cdigo.


;Asigna a DS la direccin de inicio
;del segmento de Datos.
;Coloca el offset de Dato en DX
;Pone en AH funcin 09 de INT 21h
;Usa la funcin 4Ch de INT 21h para
;salir al DOS.

END inicio
COMENTARIOS.
Este programa es el mismo que los anteriores, solo que ahora estamos incluyendo una nueva directiva de
compilacin, esta es, .DATA, la cual define un segmento para datos. La asignacin de este segmento al registro
DS se hace igual que en los pasados, de manera indirecta, pero ahora se usa para tal propsito la palabra
reservada (@DATA), la cual contiene la direccin del rea de datos
Ejemplo 2: Usando la Estructura Estndar.
; Programa ENSA03A.ASM, Ahora usamos 3 segmentos.
STACK SEGMENT PARA STACK 'STACK'
;Inicio del segmento de pila.
DB 64 DUP (?)
;Se reservan 64 bytes
STACK ENDS
;Fin de la pila.
DATA

SEGMENT PARA PUBLIC 'DATA'


Dato DB 'Hola$'
DATA ENDS
CODE

;Inicia segmento de datos.


;Se define una cadena
;Fin del segmento de datos.

SEGMENT PARA PUBLIC 'CODE'


;Inicia segmento de cdigo.
ASSUME CS:CODE, DS:DATA, ES:DATA, SS:STACK

inicio:
mov ax, DATA
mov ds, ax
mov dx, OFFSET Dato

;Asigna la direccin del segmento


;de datos al registro DS
;Coloca el offset del mensaje en DX

mov ah, 9h
INT 21h
mov ax, 4c00h
INT 21h
CODE ENDS
END inicio

;Pone en AX funcin 09 de interrupcin 21h.


;Usa la funcin 4Ch para salir al
;DOS, regresa 00.
;Fin del segmento de cdigo.

COMENTARIOS:
En este caso se define formalmente todo el segmento de datos usando la directiva SEGMENT, la
alineacin, la combinacin y la 'clase'.
En la directiva ASSUME se designa como segmento de datos a DATA y se le relaciona a DS, lo mismo se
hace con ES, sin embargo, la direccin de DATA, debe ser asignada usando el mtodo indirecto por medio del
registro AX. Ya que al inicio del programa estos registros apuntan al inicio del PSP.
2.1.5 Depuracin
Como programador, sabr que el proceso de depuracin de una aplicacin es indispensable como parte
del desarrollo, no slo para detectar fallos puntuales que pudieran surgir en esa fase sino, adems como
verificacin de que el programa hace, efectivamente, lo que tiene que hacer. sta es una necesidad que se
agudiza al programar en ensamblador que, puesto que cualquier proceso, por simple que pueda ser, requiere
muchas instrucciones, siendo imprescindible comprobar cada paso y el resultado global.
2.1.5.1 El DEBUG del DOS.
El DEBUG es un programa que nos ofrece un medio controlado para depurar archivos objetos binarios y
ejecutables, elimina la necesidad de re-ensamblar un programa para ver si un problema se ha resuelto con un
cambio menor. Nos permite alterar el contenido de un archivo o el contenido de un registro del microprocesador e
inmediatamente volver a ejecutar el programa para verificar la validez de los cambios realizados.
Todos los comandos de DEBUG pueden ser anulados en cualquier momento oprimiendo simultneamente
las teclas [Control][C]. La secuencia [Control][S] suspende la presentacin en pantalla, para poder ver la
informacin antes de que la salida se desplace fuera de la pantalla. Oprimiendo cualquier tecla, excepto [Control]
[C] [Control][S] permite la continuacin de la presentacin.
2.1.5.1.1 Como ejecutar el DEBUG.
a) Mtodo 1: Para ejecutar el DEBUG usando el mtodo 1 simplemente se teclea desde la lnea de comandos:
C:\USER\>debug [ENTER]
DEBUG responde con un guin (-), indicando que est listo para aceptar comandos. Como no se
especific nombre de archivo se pueden utilizar comandos para trabajar en la memoria, o en sectores de disco.
Una vez que aparece el mensaje; de fin de programa para reiniciar el programa use los comandos:
N (nombre)
L (carga)
Luego el programa se ejecutar normalmente.
b) Mtodo: Para ejecutar el DEBUG utilizando una lnea de comandos, utilice la siguiente sintaxis:
DEBUG [nombre_archivo [lista de argumentos]]
Ejemplo, Si hacemos un DEBUG al programa ENSA01B.EXE, escribiremos desde la lnea de comandos:
C:\USER\>DEBUG ENSA02A.EXE
DEBUG cargar ENSA02A.EXE en la memoria empezando en 100h, en el segmento ms bajo posible. Los
registros BX:CX contienen el nmero de bytes puestos en memoria.

lista de argumentos Es una lista de parmetros e indicadores de nombres de archivo que sern pasados al
programa indicado en nombre__archivo. Entonces, esto es equivalente a teclear desde la lnea de comandos:
nom_arch lista de argumentos
2.1.5.1.2 Informacin de los comandos del DEBUG.
Cada comando del DEBUG consta de una sola letra seguida por uno o ms parmetros. Cuando ocurre un
error en un comando, DEBUG vuelve a imprimir la lnea de comandos e indica el error con el mensaje:(^Error). Los
comandos pueden ser tecleados tanto en mayscula como en minscula.
Comando

Funcin

A [direccin]
C rango direccin
D [rango]
E direccin [lista]
F rango lista
G [= direccin [direccin...]]
H valor valor
I valor
L [direccin [unidad:registro registro]]
M rango direccin
N Nombre de archivo [nombre de archivo]
O valor byte
P [=direccin] [valor]
Q
R [nombre de registro]
S rango lista
T [= direccin] [valor]
U [rango]
W [direccin [unidad:registro registro]]

Ensamblar
Comparar
Vaceado
Entrar
Inicializar
Ejecutar
Hexadecimal
Entrada
Cargar
Mover
Nombre
Salida
Seguir
Terminar DEBUG
Registro
Buscar
Seguir
Desensamblar
Escribir

Indicador

Activado (1)

Desactivado (0)

Desbordamiento

OV

NV

Direccin

DN (Decremento

UP (Incremento)

Interrupcin

EI (Habilitado)

DI (Deshabilitado)

Signo

NG (Negativo)

PL (Positivo)

Cero

ZR

NZ

Arrastre Auxiliar

AC

NA

Paridad

PE (Par)

PO (Impar)

Arrastre

CY

NC

2.1.5.1.3 Un ejemplo de uso del DEBUG.


Para el ejemplo consideremos el programa ENSA02A.EXE, y mostremos el uso de los comandos ms importantes.
Para correr el DEBUG tecleemos, desde nuestro PROMPT:

-r

A:\USER\>DEBUG ENSA02A.EXE

[ENTER]

AX=0000 BX=0000 CX=0017 DX=0000 SP=0100 BP=0000 SI=0000 DI=0000


DS=3865 ES=3865 SS=3877 CS=3875 IP=0000 NV UP EI PL NZ NA PO NC

3875:0000 EB05
-t

JMP

0007

AX=0000 BX=0000 CX=0017 DX=0000 SP=0100 BP=0000 SI=0000 DI=0000


DS=3865 ES=3865 SS=3877 CS=3875 IP=0007 NV UP EI PL NZ NA PO NC
3875:0007 8CC8
MOV
AX,CS
-t 3
AX=3875 BX=0000 CX=0017 DX=0000 SP=0100 BP=0000 SI=0000 DI=0000
DS=3865 ES=3865 SS=3877 CS=3875 IP=0009 NV UP EI PL NZ NA PO NC
3875:0009 8ED8
MOV
DS,AX
AX=3875 BX=0000 CX=0017 DX=0000 SP=0100 BP=0000 SI=0000 DI=0000
DS=3875 ES=3865 SS=3877 CS=3875 IP=000B NV UP EI PL NZ NA PO NC
3875:000B BA0200
MOV
DX,0002
AX=3875 BX=0000 CX=0017 DX=0002 SP=0100 BP=0000 SI=0000 DI=0000
DS=3875 ES=3865 SS=3877 CS=3875 IP=000E NV UP EI PL NZ NA PO NC
3875:000E B409
MOV
AH,09
-t
AX=0975 BX=0000 CX=0017 DX=0002 SP=0100 BP=0000 SI=0000 DI=0000
DS=3875 ES=3865 SS=3877 CS=3875 IP=0010 NV UP EI PL NZ NA PO NC
3875:0010 CD21
INT
21
-p
Hola
AX=0924 BX=0000 CX=0017 DX=0002 SP=0100 BP=0000 SI=0000 DI=0000
DS=3875 ES=3865 SS=3877 CS=3875 IP=0012 NV UP EI PL NZ NA PO NC
3875:0012 B8004C
MOV
AX,4C00
-g
El programa ha terminado normalmente
-n ensa02A.exe
-l
-r
AX=0000 BX=0000 CX=0017 DX=0002 SP=0100 BP=0000 SI=0000 DI=0000
DS=3897 ES=3897 SS=38A9 CS=38A7 IP=0000 NV UP EI PL NZ NA PO NC
38A7:0000 EB05
JMP
0007
-ucs:0 L 2
38A7:0000 EB05

JMP

0007

MOV
MOV
MOV
MOV
INT
MOV

AX,CS
DS,AX
DX,0002
AH,09
21
AX,4C00

-ucs:7 L 10
3875:0007
3875:0009
3875:000B
3875:000E
3875:0010
3875:0012

8CC8
8ED8
BA0200
B409
CD21
B8004C

3875:0015 CD21

INT

21

El archivo ENSA02A.MAP RESULTA:


Start
Stop
Length
Name
00000H
00016H
00017H
_TEXT
00018H
00018H
00000H
_DATA
00020H
0011FH
00100H
STACK

Class
CODE
DATA
STACK

Origin
Group
0001:0
DGROUP
Program entry point at 0000:0000
Usando el DEBUG y el archivo ENSA02A.MAP podemos construir el mapa de memoria del programa.

2.1.5.2 El CODE VIEW (CV).


Este depurador es capaz de rastrear un programa a nivel de cdigo fuente, lo que tambin nos permite
usarlo con lenguajes de alto nivel como; BASIC, FORTRAN o "C", en donde trazamos una lnea a la vez, usando
este programa podemos tambin monitorear variables del programa usando el nombre con que fueron declaradas.
La habilidad del Code View de poder usar el cdigo fuente para trazar un programa, tambin se aplica al lenguaje
ensamblador. A diferencia de otras herramientas, el Code View usa interface de pantalla durante el rastreo del
programa, contando con seleccin de comandos por medio de ventanas, adems cuenta con una lnea de
comandos alterna y uso de ratn. En la figura 2.5 presentamos las partes que integran la ventana del Code View.

Figura 2.5 Pantalla del Code View


1. Ventana Principal, muestra el cdigo a rastrear.
2. Barra de Ejecucin, muestra la siguiente lnea a ser ejecutada cuando se esta rastreando un programa.
3. Sealizadores de BREAKPOINTS, las lneas mostradas en alta intensidad, son de puntos de paro fijados
previamente.
4. Ventana de Dialogo, nos permite introducir comandos, tambin nos puede mostrar salidas como localidades de
memoria.
5. Cursor, Se localiza en la ventana de dialogo, nos permite introducir comandos.
6. Separador de Ventanas, divide la Ventana de Dialogo de la Ventana Principal.
7. Ventana de Registros, nuestra el estado de los registros del microprocesador incluyendo el estado de las
banderas, es capaz de mostrar los registros de 32 bits del 80386. Tambin nos muestra la direccin efectiva del

operando en memoria a ser procesado.


8. Barras de SCROLL, nos permiten, mediante el uso del ratn, avanzar hacia arriba o hacia abajo el contenido de
la Ventana Principal.
9. Ventana de WATCH, es una ventana opcional, nos muestra el estado de las variables monitoreadas.
10. Barra de Men, nos muestra los ttulos de los mens principales, los cuales pueden activarse con el teclado o
con el ratn.
11. Ventana de Comandos, cada ttulo sobre la Barra de Men contiene una ventana con opciones las cuales
pueden ser activadas por medio del teclado o por medio del ratn.
12. Men Seleccionado, dentro de la ventana de Comandos, la lnea sobresaliente nos indica la seleccin actual,
se puede cambiar la seleccin con el ratn o con el teclado.
13. Cursor del ratn, indica la posicin actual del ratn.
14. Cajas de Dialogo, (no mostradas), aparecen al centro de la Ventana Principal, cuando se selecciona un men
que requiere una entrada de informacin.
15. Cajas de Mensaje, (no mostradas), aparecen al centro de la pantalla, para indicar un error u otros mensajes;
como fin de un programa.
2.1.5.2.1 Pasos para el uso del CODE VIEW.
1) ARRANQUE.
La manera ms fcil de arrancar el CV es, desde la lnea de comandos suponiendo que nuestro PROMPT
es A:\USER\>
CV [opciones] arch_exe [argumentos]
Dnde:
opciones: Nos permiten modificar las condiciones de operacin del CV, ejemplo: /M Se usa si se cuenta
con un Ratn y no se quiere que este activo durante el rastreo. /P Se usa cuando se tiene una tarjeta EGA
y se hay problemas al correr el CV.
arch_exe: Es el archivo que se quiere rastrear, en el directorio de trabajo deben existir tanto el fuente como el ejecutable.
El archivo .EXE debe haber sido creado usando con el MASM (/ZI) y con el LINK (/CO). Si se carga un
archivo no ejecutable, aparece el siguiente mensaje:
Not an executable file
Los archivos .COM no pueden contener informacin para DEBUG, por lo tanto solo pueden ser rastreados
en modo ensamblador. Si se rastrea un archivo de este tipo deber especificarse la extensin.
argumentos: Se usan si el programa que se quiere rastrear los utiliza.
Ejemplo: Si el prompt es A:\USER>CV ENSA01
2) EL AMBIENTE.
Una vez dentro del CV es posible observar el valor de los registros presionando la tecla F2. Para rastrear
el programa paso a paso, usamos la tecla F8. Para saltar llamadas a procedimientos cuyo cdigo se encuentra en
el mismo archivo usamos F10.
El CV cuenta con una rea de dialogo en la parte inferior de la pantalla, por medio de la cual, nos es

posible interactuar con l, de manera similar como lo hicimos con el DEBUG.


En el CV es posible tambin introducir instrucciones como el comando A, mostrar el contenido de una rea
de memoria mediante el comando D, o ejecutar un programa usando el comando G, para desensamblar cdigo se
usa U, para salir del CV podemos usar tambin el comando Q.
El CV espera nmeros en decimal, para que acepte nmeros en hexadecimal es necesario cambiar el radix
usando el comando n16. El CV trabaja con 2 pantallas, en una vemos el programa a rastrear, los registros, el
men y el rea de dialogo y en la otra nos muestra los resultados generados, podemos cambiar a esta pantalla
usando F4. Para tener acceso a los mens oprimimos la tecla ALT o usamos el ratn.
3) MENUS
Men
File
View
Search
Run
Watch
Options
Lenguage
Calls
Help

Descripcin
Abre un archivo fuente. Salida temporal al DOS. Salida del CV.
Ver el archivo actual como fuente, ensamblado. Mostrar los registros. Ver la pantalla de salida.
Busca una cadena en el archivo fuente o una etiqueta en el cdigo ejecutable.
Inicia ejecucin de un programa, Reinicializa un programa. Limpia Breakpoints.
Monitorea variables y expresiones.
Activa cambios de pantalla, Activa registros del 80386.
Selecciona el lenguaje a rastrear.
No hay opciones en este men. Muestra una lista de las rutinas llamadas durante la ejecucin de
un programa.
Selecciona el tpico sobre el cual se requiere ayuda.

4) BUSCANDO AYUDA EN EL CV.


El ambiente interactivo del CV cuenta con una extensa ayuda, es posible obtener ayuda seleccionando un
tpico del men de ayuda, presionando ALT+h o presionando F1, para salir de la ventana de ayuda presione ESC.
5) OBSERVANDO VARIABLES.
Para iniciar el proceso seleccione del men WATCH... ADD WATCH, aparece entonces una ventana y el
cursor nos indica que podemos escribir el nombre de una expresin cuyo valor deseemos observar, la expresin
puede ser simplemente el nombre de una variable que aparece en el programa o el nombre de un registro. Una vez
seleccionada la expresin, se abre una ventana en la parte superior de la pantalla, en ella se muestra el nombre de
la expresin y su contenido. Por default el valor es mostrado en Decimal, si se requiere el valor en hexadecimal, en
el rea de dialogo se debe teclear el comando n16, l cual nos cambia el radix (Se usa la convencin de "C" para
mostrar los hexadecimales 0x____ ). Esto se debe a que originalmente el CV fue escrito para el C Compiler de
Microsoft.
6) PONIENDO PUNTOS DE PARO (BREAKPOINTS)
Un punto de paro sobre una instruccin le dice al CV que ejecute normalmente el programa hasta llegar a
la instruccin con el BREAKPOINT en donde se detiene la ejecucin normal del programa, permitindonos
continuar a partir de ese punto, paso a paso. Para colocar un BREAKPOINTS es necesario mover el cursor desde
el rea de dialogo a la ventana principal, esto se hace presionando F6. Estando el cursor en esta ventana
buscamos la lnea donde deseamos que el programa se detenga, colocamos sobre ella el cursor y presionamos
F9. La lnea donde es activado el BREAKPOINT, cambia de color o de tonalidad si es un monitor blanco y negro.
7) RASTREANDO UN PROGRAMA.
Una vez establecidos los puntos de paro y las variables a monitorear podemos correr el programa de varias
maneras.
Con:
F8
Lnea a lnea.
F10
Lnea a lnea sin entrar a rutinas.
F5
Hasta el siguiente BREAKPOINT.
F7
Posicione el cursor hasta la instruccin donde desea que el programa se detenga, luego

presiona F7.
8) TECLAS CALIENTES DEL CV.
Tecla

Funcin

F1
F2
F3
F4
F5

Muestra la pantalla de ayuda inicial.


Muestra los registros en el lado derecho de la pantalla si existen los elimina.
Cambia el modo de mostrar el programa; fuente, ensamblado o mezclado.
Conmuta a la Pantalla de Salida.
Ejecuta un programa hasta el siguiente punto de paro, si no existe punto de paro, lo ejecuta hasta
el fin.
Selecciona la ventana Activa.
Ejecuta el programa hasta la lnea donde se encuentra el cursor.
Ejecuta una lnea.
Pone o limpia un punto de paro, en la posicin donde se encuentra el cursor.
Ejecuta una lnea. Toma una llamada a procedimiento como si fuese una lnea.
Menu Calls
Menu File
Menu Help
Menu Languages
Menu Options
Menu Run
Menu Search
Menu View
Men Watch
Interrumpe la ejecucin del programa y regresa al DEBUG
Interrumpe la ejecucin del programa y regresa al DEBUG
Encuentra una cadena sobre el archivo fuente.
Aumenta el tamao de la ventana activa.
Reduce la ventana activa.
Pone una expresin a visualizar.

F6
F7
F8
F9
F10
ALT+C
ALT+F
ALT+H
ALT+L
ALT+O
ALT+R
ALT+S
ALT+V
ALT+W
^C
^Break
^F
^G
^U
^W

9) COMANDOS PARA OBSERVAR LA MEMORIA (Vaciado)


El CV cuenta con varios comandos para mostrar el contenido de la memoria en la pantalla o en otro
dispositivo. Estos comandos deben ser ejecutados desde el rea de dialogo del CV.
Sintaxis:

D [tipo] [direccin | rango]

dnde:
tipo: Es una letra que especifica el tipo del dato a ser mostrado.
direccin: Es la direccin a partir de la cual se va a mostrar el contenido de la memoria. Si no se especifica direccin, el
comando asume la ltima direccin mostrada en el comando DUMP anterior. Al inicio de la sesin la
direccin de default es la que tiene el segmento DS.
rango: Si no se da un rango, el CV muestra localidades de memoria de acuerdo al tamao de la ventana. El rango ms
grande es de 32 KB. El rango de default es 128 bytes. En el caso de los reales es de un nmero real.
NOTA: Si el valor no puede ser evaluado como real, el comando DUMP muestra:
#NAN
No es un nmero.
#INF
Valor tiende a infinito.
#IND
El valor es indefinido.

El tipo real es expresado como: [-] digito.digitosE[+|-] exponente


Los comandos DUMP se muestran a continuacin.
Comando
D
DB
DA
DI
DU
DW
DD
DS
DL
DT

Nombre del Comando


DUMP (El tamao es el tipo de default, el tipo definido en el comando DUMP anterior)
DUMP BYTE
(muestra Byte)
DUMP ASCII
(muestra ASCII)
DUMP INTEGERS
(muestra enteros)
DUMP UNSIGNED INTEGER (muestra enteros sin signo)
DUMP WORDS
muestra palabra)
DUMP DOUBLE WORDS
(muestra palabras dobles)
DUMP SHORT REALS
(muestra reales cortos)
DUMP LONG REALS
(muestra reales largos)
DUMP 10-BYTE REALS
(muestra reales de 10 bytes)

2.1.5.3 Palabras reservadas del lenguaje ENSAMBLADOR Macro Assembler Ver 5.1
:
;
=
?
[]
/
()
+
*
.
.186
.286
.286C
.286P
.287
.386
.386C
.387

@datasize
??date
DB
DD
%DEPTH
DF
DISPLAY
DOSSEG
DP
DQ
DT
DUP
DW
DWORD
ELSE
ELSEIF
EMUL
END
ENDIF

@filename
??filename
FWORD
GE
GLOBAL
GROUP
GT
HIGH
IDEAL
IF
IF1
IF2
IF8
IFDEF
IFDIF
IFDIFI
IFE
IFIDN
IFIDNI

NAM
NE
NEAR
%NEWPAGE
%NOCONDS
%NOCREF
%NOCTLS
NOEMUL
%NOINCL
NOJUMPS
%NOLIST
NOLOCALS
%NOMACS
NOMASM51
NOMULTERRS
NOSMART
%NOSYMS
NOT
NOTHING

.RADIX
RECORD
REPT
.SALL
SEG
SEGMENT
.SEQ
.SFCOND
SHL
SHORT
SHR
SIZE
SIZESTR
SMALL
SMART
STACK
.STACK
STRUC
SUBSTR

.8086
.8087
ALIGN
.ALPHA
AND
ARG
ASSUME
%BIM
BYTE
CATSTR
@code
CODESEG
@codeSize
COMM
COMMENT
%CONDS
.CONST
CONST
@Cpu
%CREF
.CREF
%CREFALL
%CREFREF
%CREFUREF
%CTLS
@curseg
@data
.DATA
.DATA?
DATAPRR
DATASEG

ENDM
ENDP
ENDS
EQ
EQU
ERR
.ERR
.ERR1
.ERR2
.ERR8
.ERRDEF
ERRDIF
ERRDIFI
ERRE
ERRIDN
ERRIDNI
ERRIFN8
ERRIFNDEF
ERRN8
ERRNDEF
ERRNZ
EVEN
EVENDATA
EXITM
EXTERN
FAR
FARDATA
@fardata
.FARDATA
@fardata?
.FARDATA?

IFN8
IFNDEF
%INCL
INCLUDE
INCLUDELIB
INSTR
IRP
IRPC
JUMPS
LABEL
.LALL
LARGE
LE
LENGTH
.LFCOND
%LINUM
%LIST
.LIST
LOCAL
LOCALS
LOW
LT
MACRO
%MACS
MASK
MASM
MASM51
MOD
MODEL
.MODEL
MULTERRS

%NOTRUNC
NOWARN
OFFSET
OR
ORG
%OUT
P186
P286
P286N
P287
P386
P38N
P386P
P387
P8086
P8087
PAGE
%PAGESIZE
PARA
%PCNT
PNO87
%POPLCTL
PROC
PTR
PUBLIC
PURGE
%PUSHLCTL
PWORD
QUIRKS
QWORD
RADIX

SUBTTL
%SUBTTL
%SYMS
SYMTYPE
%TABSIZE
TBYTE
%TEXT
.TFCOND
THIS
??time
TITLE
%TITLE
%TRUNC
TYPE
.TYPE
UDATASEG
UFARDATA
UNION
UNKNOWN
USES
??version
WARN
WIDTH
WORD
@WordSize
.XALL
.XCREF
.XLIST
XOR

Ejemplos de Programas en ENSAMBLADOR.


En esta seccin vamos a aplicar lo visto anteriormente, esto es el MASM, el LINK y el DEBUG, tambin
avanzaremos un poco en la comprensin de los programas en ensamblador, como siempre empezando con lo ms
elemental.
COMMENT * Programa ENSA04.ASM,*
* Inicializa SI y luego lo incrementa. Usa la estructura simplificada *
.MODEL Small
.STACK 100h
.CODE
inicio:
mov si,2
inc si
inc si
mov ax, 4C00h
INT 21h
END inicio

;Define Modelo de Memoria.


;Define el segmento de STACK
;Define el segmento de cdigo.
;Pone 2 en SI
;Incrementa SI en uno.
;Incrementa SI en uno.
;Regreso al DOS con cdigo en AL = 00h

COMENTARIOS.
Lo anterior sera equivalente a lo siguiente en un programa de alto nivel.
j = 2;

j = j + 2;
El mismo programa es presentado usando la estructura estndar del ENSAMBLADOR.
;Programa ENSA04A.ASM, Inicializa SI y luego lo incrementa.
;Utiliza la estructura estndar.
STACK SEGMENT STACK 'STACK' ;Define el segmento de STACK
DB 64 DUP ('STACK ')
STACK ENDS
TEXT SEGMENT BYTE PUBLIC 'CODE'
;Define el seg. de cdigo.
ASSUME CS:TEXT, SS:STACK
inicio:
mov si,2
;Pone 2 en SI
inc si
;Incrementa SI en uno.
inc si
;Incrementa SI en uno.
mov ax, 4C00h
;Regresa al DOS.
INT 21h
TEXT ENDS
END inicio

En los siguientes programas vamos a ver como el ENSAMBLADOR define y maneja variables. Recuerde
que una variable es el contenido de una localidad de memoria.
TITLE ENSA05.ASM
COMMENT * Copia el contenido de una variable en otra *
.MODEL SMALL
;Define el modelo de memoria a usar
.STACK 20h
.DATA
a DW 1000
b DW ?
.CODE
inicio: mov ax, @data
mov ds, ax
mov bx, a
mov b, bx
mov ax, 4C00h
INT 21h
END inicio

;Define el tamao del STACK


;Define a como WORD y se inicializa en 1000.
;Define como WORD a b y no se inicializa.
;Inicia el segmento de cdigo.
;Pone el inicio del segmento de datos
;en el registro DS
;Copia el contenido de a en BX
;Copia el contenido de BX en b
;Inicia la rutina de salida.

COMENTARIOS.
La operacin realizada en este programa es: a = 1000; b = a.
Usamos la estructura simplificada, agregamos el segmento de DATOS, en donde definimos 2 variables
a y b del tipo WORD, esto es, ocupan 2 bytes, la primera es inicializada en 1000 (decimal) y la segunda NO se
inicializa.
Cuando usamos la estructura simplificada para asignar la direccin del segmento de DATOS al registro
DS usamos la palabra reservada (@data), la cual contiene la direccin de inicio del rea de datos, se asigna de
manera indirecta al registro DS.
El mnemnico mov no puede mover datos entre dos direcciones de memoria, por lo tanto, el
movimiento del contenido de a a b lo hacemos en 2 pasos, usando un registro como ayuda.
En el siguiente programa definimos un arreglo de enteros al cual le llamamos X. Usando la estructura
simplificada, copiamos el arreglo X en Y a partir del ltimo elemento hasta el primer elemento.
TITLE ENSA06

COMMENT * Copia X en Y de atrs hacia adelante. *


DOSSEG

;Mantiene consistencia en el orden de los segmentos con los lenguajes de Alto Nivel

.MODEL Small

;Se define el Modelo de memoria.

.STACK 100h

;Se define el tamao de la Pila.

.DATA
x
DW 100, 1000, 10000, 40000
y
DW 4 dup(?)

;Inicia segmento de Datos.


;Reservamos 4 WORDS sin inicializar

.CODE
inicio:
mov ax, @DATA
mov ds, ax
mov si, offset x
mov di, offset y
mov cx, 4h
lazo1: push [si]
inc si
inc si
loop lazo1
mov cx, 4h
lazo2: pop [di]
inc di
inc di
loop lazo2
mov ax, 4C00h
INT 21h
END inicio

;Colocamos la direccin de inicio del


;segmento de DATOS en DS
;La direccin de X la ponemos en SI
;La direccin de Y la ponemos en DI
;Pone un 4 como contador en CX
;Pone en la Pila el contenido de SI
;Incrementa SI 2 veces para apuntar
;al siguiente entero.
;Esta instruccin decrementa en uno a CX y salta a lazo1, hasta que CX = 0
;Pone un 4 como contador en CX
;Saca de Pila el ltimo dato almacenado y lo pone donde apunta DI
;Incrementa DI 2 bytes
;Decrementa CX, hasta que CX = 0
;Llama INT 21h, servicio 4Ch para
;salir al DOS

COMENTARIOS.
La copia se realiza usando como memoria temporal la pila, A la cual primero vamos pasamos el
contenido de la direccin de SI, de cada uno de los elementos de X, l cual inicialmente contiene el OFFSET de la
direccin inicial de X. Para depositarlos en la pila usamos la instruccin PUSH y luego usando la instruccin POP
los sacamos de la pila y los vamos acomodando en la direccin reservada en DI, la cual se va incrementando
tambin de 2 en 2 bytes.
Sintaxis de LOOP
etiqueta:
------------loop etiqueta
LOOP transfiere IP a 'etiqueta' en tanto el registro CX sea diferente de CERO y decrementa el
contenido de CX en uno. Note que conforme se va llenando la pila, las direcciones van disminuyendo en 2 bytes
cada vez que se usa un PUSH.
Cuando la pila se va vaciando, (POP) las direcciones de la pila se van incrementando.
Analizando el rea de memoria correspondiente a la pila encontramos:
377B:00F0
377B:0100

00 00 27 00 76 37 AF 31 40 9C 10 27 E8 03 64 00
75

Marcando lo que corresponde al rea de la Pila usada.

METER A LA PILA

SACAR DE LA PILA

SP 100 Tope de la Pila


(push)

SP
0F8 Dir. inicial
(pop)
STACK

0100H
00FFH
00FEH
00FDH
00FCH
00FBH

Tope antes del primer PUSH


00
64
03

100

1000

E8
27

10000

10

00FAH
00F9H

9C
40

40000

SP 00F8H
00F7H
Figura 2.5 Mapa de memoria del programa ENSA06.EXE
TITLE ENSA07.ASM
COMMENT $ Este programa muestra:
* El uso de Constantes
$
* El uso de las directivas de segmento simplificadas.
DOSSEG
.MODEL Small
.STACK
.CONST
a DW 43690
b DW 0AaAaH
c DW 1010101010101010b
d DT 1234567890
e DT -1234567890
.DATA
f DD 1.0
g DD 3F800000R
h DQ 0.1E1
i DT 1000.0E-3
.CODE
inicio:
MOV AX, DGROUP
MOV DS, ax
MOV AX, a

MOV BX, b
MOV CX, c
MOV AX, 4C00H
INT 21h
END inicio
COMENTARIOS.
En primer lugar usamos la directiva COMMENT y el delimitador ($), l cual es colocado en el ltimo rengln
y tambin lo escrito en este rengln se toma como comentario.
El la directiva DOSSEG nos acomoda los segmentos en el orden preestablecido, veamos el mapa de
memoria.
Start
00000H
00026H
00040H
00060H

Stop
00024H
0003FH
00059H
0045FH

Length
00025H
0001AH
0001AH
00400

Name
_TEXT
_DATA
CONST
STACK

Class
CODE
DATA
DATA
STACK

Origin Group
0002:0 DGROUP
Program entry point at 0000:0010
En el mapa de memoria vemos tambin que la Pila (STACK) a la que no le definimos tamao, se le asigna
un tamao de 1 KB (1024 bytes) lo podemos ver en el mapa de memoria escrito en seguida. Es asignado un
segmento a CONST y otro a DATA de acuerdo al nmero de datos que contiene cada uno. El nombre de GROUP
es DGROUP, este grupo en el modelo de memoria SMALL esta definido como sigue:
DGROUP
GROUP
_DATA, CONST, _BSS, STACK
ASSUME CS:_TEXT, DS:DGROUP, SS:DGROUP
Por lo tanto la direccin de inicio del segmento de datos, es el inicio del Grupo DGROUP, como se aprecia
en el mapa de memoria.
Haciendo un DEBUG al programa observamos lo siguiente:
-GCS:20
AX=AAAA BX=AAAA
DS=1226 ES=1214
1224:0020 B8004C
-DDS:0 L 40
1226:0000
1226:0010
1226:0020
1226:0030
-Q

B8
00
AA
90

00
00
AA
78

CX=AAAA DX=0000 SP=0400


SS=122A CS=1224 IP=0020
MOV
AX,4C00
4C
00
AA
56

CD
00
AA
34

21
F0
AA
12

00
3F
AA
00

00
00
90
00

00-80
00-00
78-56
00-00

3F
00
34
80

00
00
12
8B

BP=0000 SI=0000 DI=0000


NV UP EI PL NZ NA PO NC

00
00
00
F8

80
00
00
8B

3F
80
00
46

00
FF
00
F0

00
3F
00
80

Primero, como el segmento de DATA es colocado antes del segmento CONST, los datos de DATA se
encuentran antes que los de CONST. De acuerdo al mapa de memoria los datos empiezan en la direccin
1226:0006 ya que el cdigo del programa termina en la direccin 1224:0025 que equivale a la direccin 1226:0005.
El valor de f = 1.0 equivale en binario a: 00 00 80 3F
El valor de g = 3F800000r en memoria es: 00 00 80 3F
El valor de h = 0.1E1 equivale a: 00 00 00 00 00 00 F0 3F
El valor de i = 1000.0E-3 en memoria: 00 00 00 00 00 00 00 80 FF 3F
Por ltimo observamos que los valores del tipo entero definidos en el segmento CONST son equivalentes,
los podemos ver tanto en memoria como en los registros AX, BX, CX.
A continuacin se presentan 2 ejemplos, en los cuales se hace primero una comparacin entre el operador

de sobre-escritura de segmento y el uso de la directiva ASSUME, y segundo se muestra el uso de la directiva


ASSUME. Para el ejemplo se utiliza el microprocesador 80386, y los registros adicionales FS y GS.
;Programa ENSA08.ASM, Uso de Operador de sobre-escritura de segmento.
.386
PILA SEGMENT PARA STACK 'MIPILA'
DB 100H DUP (?)
PILA ENDS
DATO1 SEGMENT DWORD PUBLIC USE16 'DATA_A'
a DB "Esta es una cadena"
p DW a
paf DD a
DATO1 ENDS
DATO2 SEGMENT DWORD PUBLIC USE16 'DATA_B'
xa DD 10 DUP(0)
DATO2 ENDS
DATO3 SEGMENT DWORD PUBLIC USE16 'DATA_C'
r DD 10.25
DATO3 ENDS
SEGCOD SEGMENT DWORD PUBLIC USE16 'MICODE'
assume cs:segcod, ss:pila
inicio:
mov ax, SEG dato1
mov ds, ax
mov ax, SEG dato2
mov es, ax
mov ax, SEG dato3
mov fs, ax
mov bh, ds:a
mov edx, ds:paf
mov es:xa, edx
mov eax, fs:r
mov es:xa[4], eax
mov ax, 4c00h
int 21h
SEGCOD ENDS
END inicio
COMENTARIOS.
Se estn manejando 3 segmentos de datos, las instrucciones de manejo de datos solo hacen referencia a
un segmento, utilizando la sobre-escritura de segmento, se puede forzar a las instrucciones a hacer referencia a un
segmento en particular. Este procedimiento se usa cuando se hace referencia de manera espordica a otro
segmento, que no sea el de default. El archivo ENSA08.MAP nos resulta:
Start
00000H
00100H
00118H
00140H
00144H

Stop
000FFH
00117H
0013FH
00143H
00170H

Length
00100H
00018H
00028H
00004H
0002DH

Name
PILA
DATO1
DATO2
DATO3
SEGCOD

Class
MIPILA
DATA_A
DATA_B
DATA_C
MICODE

Address
Publics by Name
Address
Publics by Value
Program entry point at 0014:0004
00170h

SEGCOD
00144h IP 0004h
00143h
CS, FS 3F55h

DATOS3

00140h
0013Fh

DATOS2
ES 3F52h
DATOS1
DS 3F51h

00118h
00117h
00100h SP 0100h
000FFh

PILA
SS 3F41h
DS, ES 3F31h

00000h
PSP

Figura 2.7 Mapa de Memoria de ENSA08.ASM.

El siguiente programa muestra el uso de ASUMME en vez del operador (:).


; Programa ENSA09.ASM, uso de ASSUME
.386
PILA SEGMENT PARA STACK 'MIPILA'
DB 100H DUP(?)
PILA ENDS
DATO1 SEGMENT DWORD PUBLIC USE16 'DATA_A'
a DB "Esta es una cadena"
p DW a
paf DD a
DATO1 ENDS
DATO2 SEGMENT DWORD PUBLIC USE16 'DATA_B'
xa DD 10 DUP(0)
DATO2 ENDS
DATO3 SEGMENT DWORD PUBLIC USE16 'DATA_C'
r DD 10.25
DATO3 ENDS
SEGCOD SEGMENT DWORD PUBLIC USE16 'MICODE'
ASSUME CS:SEGCOD, SS:PILA
inicio:
mov ax, SEG dato1
mov ds, ax
mov ax, SEG dato2

mov es, ax
mov ax, SEG dato3
mov fs, ax
ASSUME DS:DATO1
mov bh, a
mov edx, paf
ASSUME ES:DATO2
mov xa, edx
ASSUME FS:DATO3
mov eax, r
ASSUME ES:DATO2
mov xa[4], eax
mov ax, 4c00h
INT 21h
SEGCOD ENDS
END inicio
COMENTARIOS.
El programa es idntico al ENSA08.ASM solo que ahora se muestra el uso del ASSUME, y como su
nombre lo indica, las instrucciones que hacen referencia, como en este caso a un registro de segmento de datos,
asumen un segmento de datos como al segmento al cual se hace referencia. Para completar el trabajo, dicho
registro de segmento debe contener la direccin correcta del segmento, accin que se lleva a cabo mediante el par
de instrucciones:
mov ax, SEG dato1
mov ds, ax
mov ax, SEG dato2
mov es, ax
mov ax, SEG dato3
mov fs, ax
2.1.6. Inicializando Registros de segmento.
Los programas en lenguaje ENSAMBLADOR debern poner valores iniciales en cada uno de los registros
de segmento, antes de que cualquier instruccin que haga referencia a un segmento de registro, pueda ser
utilizada.
Esta inicializacin se realiza mediante la sentencia ASSUME. Cada uno de los registros de segmento se
inicializan de una manera diferente; por ejemplo CS e IP se inicializan al especificar una direccin de inicio en la
directiva END.
Sintaxis:
END [dir_inicio]
Donde:
dir_inicio: Es una etiqueta que identifica la direccin donde se quiere iniciar la ejecucin del programa cuando es
cargado a memoria.
Entonces: El registro IP es inicializado al valor de dir_inicio.
Si un programa consiste de un solo mdulo se debe incluir dir_inicio. Si un programa consta de varios
mdulos, cada mdulo debe terminar con la directiva END y solamente en uno se deber definir dir_inicio.
El registro de segmento DS deber inicializarse en la direccin del segmento que contiene los datos. La
direccin del segmento o GRUPO para cargarse en el registro DS requiere de 2 sentencias:

mov ax, DATA


mov DS, ax
El registro de segmento SS se inicializa automticamente al valor del ltimo segmento en el archivo fuente
con el tipo de combinacin STACK. El registro SP tambin se inicializa automticamente al tamao de la pila
(STACK). Los registros ES y DS, al cargar el programa se inicializan con la direccin de inicio del PSP.
Ejemplo:
ASSUME es:@fardata ;Llama al ensamblador.
mov ax, @fardata
;Llama al procesador.
mov es, ax
Ejemplo: En este programa usamos 2 registros de datos, uno es definido dentro de un GRUPO, al otro lo dejamos
fuera.
; Programa ENSA10.ASM
GRUPO GROUP DATA1, STACK
ASSUME CS:CODE, DS:GRUPO, ES:DATA2, SS:STACK
STACK SEGMENT PARA STACK 'STACK'
DB 64 DUP (?)
STACK ENDS
DATA1 SEGMENT WORD 'DATA1'
A
DB 'A'
DATA1 ENDS
DATA2 SEGMENT WORD 'DATA2'
B
DB 'B'
DATA2 ENDS
CODE SEGMENT WORD PUBLIC 'CODE'
inicio:
mov ax, GRUPO
mov ds, ax
mov ax, DATA2
mov es, ax
mov ah, A
mov al, B
mov ax, 4C00h
INT 21h
CODE ENDS
END inicio

;Inicializamos DS
;Inicializamos ES
;Asignamos el contenido de A a AH
;Asignamos el contenido de B a AL

COMENTARIOS.
Si observamos el mapa de memoria vemos que se generaron 2 segmentos de datos y tambin nos
muestra el nombre del grupo y su direccin de inicio.
Start
00000H
00040H
00042H
00044H

Stop
0003FH
00040H
00042H
0005AH

Length
00040H
00001H
00001H
00017H

Name
STACK
DATA1
DATA2
CODE

Class
STACK
DATA1
DATA2
CODE

Origin Group
0000:0 GRUPO
Program entry point at 0004:0004
Utilizando el DEBUG para observar el desarrollo del programa ENSA09.EXE veremos que cada segmento

de datos tiene una direccin de inicio, y al momento de escribir en AH y AL se hace referencia a cada uno de los
segmentos. NOTE que hay una sobre-escritura por el segmento ES.
-GCS:E
AX=1228 BX=0000 CX=005B DX=0000 SP=0040 BP=0000 SI=0000 DI=0000
DS=1224 ES=1228 SS=1224 CS=1228 IP=000E NV UP EI PL NZ NA PO NC
1228:000E 8A264000
MOV
AH,[0040]
DS:0040=41
-T
AX=4128 BX=0000 CX=005B
DS=1224 ES=1228 SS=1224
1228:0012 26
1228:0013 A00200
-T

DX=0000 SP=0040 BP=0000 SI=0000 DI=0000


CS=1228 IP=0012 NV UP EI PL NZ NA PO NC
ES:
MOV
AL,[0002]
ES:0002=42

AX=4142 BX=0000 CX=005B DX=0000 SP=0040 BP=0000 SI=0000 DI=0000


DS=1224 ES=1228 SS=1224 CS=1228 IP=0016 NV UP EI PL NZ NA PO NC
1228:0016 B8004C
MOV
AX,4C00
-T
AX=4C00 BX=0000 CX=005B DX=0000 SP=0040 BP=0000 SI=0000 DI=0000
DS=1224 ES=1228 SS=1224 CS=1228 IP=0019 NV UP EI PL NZ NA PO NC
1228:0019 CD21
INT
21
-Q
El contenido de los registros de segmento SS y DS, es el mismo, lo mismo sucede con los registros CS y
ES. En el programa los segmentos de datos DATA1 y DATA2 son de 1 byte, como el tamao mnimo de segmento
es de 16 bytes, el LINK tiene que sobreponer los segmentos para cumplir con la definicin del programa. El
registro DS contiene la direccin de inicio del GRUPO, por lo tanto las referencias se hacen con respecto a dicho
GRUPO Para DATA1, para DATA2 se hacen con referencia a ES ya que este segmento no forma parte del
GRUPO.
Veamos el mapa de memoria del programa:
Direcciones de inicio de segmento.
CODE
IP 0004h

00044h

DATA2

Segmento de 1 byte
00042h

DATA1

Segmento de 1 byte
00040h SP 0040h

STACK

Segmento de 40 bytes

CS, ES 1228h

SS, DS 1224h

00000h Inicio de GRUPO


PSP

1214h

Figura 2.8 Mapa de Memoria del programa ENSA10.ASM

Por ltimo veamos el programa ENSA11.ASM, el cual es el mismo que el ENSA07.ASM pero ahora escrito
usando la definicin estndar de segmentos.
;ENSA11.ASM. Este programa muestra:
; * El uso de RADIX
; * El uso de Constantes
; * El uso de las directivas de segmento simplificadas.
DOSSEG
DGROUP GROUP _DATA, CONST, STACK
ASSUME CS:_TEXT, DS:DGROUP, SS:DGROUP
STACK SEGMENT PARA STACK 'STACK'
DB 400h DUP (?)
STACK ENDS
CONST SEGMENT WORD PUBLIC 'CONST'
a DW 43690
b DW 0AaAaH
c DW 1010101010101010b
d DT 1234567890
e DT -1234567890
CONST ENDS
_DATA SEGMENT WORD PUBLIC 'DATA'
f DD 1.0
g DD 3F800000R
h DQ 0.1E1
i DT 1000.0E-3
_DATA ENDS
_TEXT SEGMENT WORD PUBLIC 'CODE'
inicio:
mov ax, DGROUP
mov ds, ax
mov ax, a
mov bx, b
mov cx, c
mov ax, 4C00H
INT 21h
_TEXT ENDS
END inicio
COMENTARIOS.
En este programa usamos la directiva DOSSEG, si observamos el mapa de memoria vemos que los
segmentos fueron ordenados acorde a esta directiva. Sin embargo dentro del GRUPO no se respet el orden de
los segmentos CONST y _DATA. Sin embargo el segmento _TEXT si va al inicio y el segmento STACK al final.
Observe tambin el uso de la directiva GROUP para definir un GRUPO, en este caso le llamamos tambin
DGROUP.
Start
00000H
00026H
00040H
00060H

Stop
00024H
0003FH
00059H
0045FH

Length
00025H
0001AH
0001AH
00400H

Name
_TEXT
CONST
_DATA
STACK

Class
CODE
CONST
DATA
STACK

Origin Group
0002:0 DGROUP
Program entry point at 0000:0010
En el mapa de memoria se observa la direccin de inicio de DGROUP.

SP 0400h
STACK
00060h

SS =1072h

Segmento de 26 bytes
00040h

_DATA

Segmento de 26 bytes
00026h Inicio del GRUPO

CONST

Segmento de 25 bytes
00000h

DS =106Eh
TEXT

IP = 0010h
CS =106Ch

PSP
ES =105Ch
Figura 2.9. Mapa de Memoria del programa ENSA11.ASM.
Haciendo el DEBUG al programa encontramos:
-r
AX=0000 BX=0000 CX=005A DX=0000 SP=0400 BP=0000 SI=0000 DI=0000
DS=105C ES=105C SS=1072 CS=106C IP=0010 NV UP EI PL NZ NA PO NC
106C:0010 B86E10
MOV
AX,106E
-d ds:0000
L 40
106E:0000 B8 00 4C CD 21 00 AA AA-AA AA AA AA 90 78 56 34
106E:0010 12 00 00 00 00 00 90 78-56 34 12 00 00 00 00 80
106E:0020 00 00 80 3F 00 00 80 3F-00 00 00 00 00 00 F0 3F
106E:0030 00 00 00 00 00 00 00 80-FF 3F 00 00 00 00 00 00
-q
Podemos observar que el inicio del cdigo esta en 106C:0010, esta direccin se defini en el mapa de
memoria del programa, como se puede apreciar en el archivo ENSA11B.MAP.
Note tambin que el grupo inicia dentro del segmento _TEXT y no como pudiramos pensar al inicio del
segmento CONST.
2.1.7 Variables y Etiquetas.
2.1.7.1 Especificacin de tipos.
Al especificar un tipo nos referimos a 2 aspectos:
1) Establecimiento del tamao de una variable u otro operando a memoria. Para establecer el tamao de la
variable usamos los siguientes especificadores.
Especificador

# de bytes

BYTE
WORD
DWORD
FWORD
QWORD
TBYTE

1
2
4
6
8
10

2) Cuando se especifica la distancia de una etiqueta.


Especificador
FAR
NEAR
PROC

# de bytes

La etiqueta hace referencia a tanto al segmento como al OFFSET.


La etiqueta solo requiere del OFFSET.
Cuando se maneja usando la definicin simplificada, la etiqueta tiene el tipo
predefinido (NEAR o FAR) dependiendo del modelo de memoria utilizado.
* Cuando se usa la definicin estndar el tipo predefinido es NEAR.
* Para modelo SMALL y COMPACT es NEAR.
* Para modelo MEDIUM, LARGE y HUGE es FAR.

Una etiqueta se usa para acceder a una instruccin, la cual se encuentra a continuacin de ella.
Sintaxis:
nombre:
Donde:
nombre no deber haber sido usado dentro del mdulo, le deber seguir (:).
Las etiquetas solo se pueden usar en segmentos asociados con el registro CS.

Variables.
Una variable consiste de un nombre y un especificador de tamao.

Sintaxis:
[nombre] directiva inicializacin [,inicializacin]....
Donde:
nombre: Es el smbolo asociado con la variable. Si no se le asigna un nombre, el valor es almacenado en
memoria, pero la direccin de la variable no tiene un nombre simblico.
directiva: Determina el tamao de la variable, como sigue:
Directiva

Significado

DB
DW
DD
DF

Define Byte.
Define Word
Define Doble Word
Define Farword
Usado normalmente con el 80386
Define Quadword
Define variable de 10 bytes

DQ
DT

tamao en bytes
1
2
4
6
8
10

Todas estas directivas pueden ser utilizadas para nmeros enteros.


La directiva DT nos permite definir nmeros empaquetados BCD. Para cadenas solo utilizamos la directiva
DB. Para nmeros reales podemos usar las siguientes directivas.
Directiva
DD
DQ
DT

Tamao

Almacena un nmero real corto de 32 bits. Sirve tanto para nmeros IEEE como para
el formato de Microsoft.
Almacena nmeros reales largos de 64 bits. Sirve tanto para nmeros IEEE como
para el formato de Microsoft.
(Temporal) Nos permite almacenar nmeros de 10 bytes, se defini este tipo de

reales para que fueran manejados por los coprocesadores matemticos.

El estndar ms recomendable es el de IEEE


;Programa ENSA12.ASM. Tipos de Datos.
.MODEL small
.STACK 100h
.DATA
a DB 10h, 20h, 30h, 40h
b DW 1122h
c DD 11223344h
d DF 112233445566h
e DQ 1122334455667788h
f DT 112233445566778899AAh
g DT -9252851
.CODE
inicio:
mov ax, DGROUP
mov ds, ax
mov ah, a + 2
;Almacena en AH el 30h
mov bx, b
;Almacena en BX el valor de b
mov ax, 4C00h
INT 21h
END inicio
COMENTARIOS.
En el segmento de datos estamos inicializando con valores enteros hexadecimales las variables de la a a
la f, sin embargo, solo movemos a los registros el tipo BYTE y el tipo WORD, los dems tipos veremos luego como
manejarlos.
Si observamos los 30h primeros bits del segmento de datos, podemos ver que a inicia en el offset 0002, el
tipo DT primero se maneja en hexadecimal, siendo respetada su estructura, posteriormente se almacena un
nmero en decimal, ste se almacena en BCD empaquetado, y note el efecto ya comentado del signo, este
nmero lo remarcamos para mayor claridad.
-d ds:0
L 30
317C:0000
317C:0010
317C:0020

CD 21 10 20 30 40 22 11-44 33 22 11 66 55 44 33
22 11 88 77 66 55 44 33-22 11 AA 99 88 77 66 55
44 33 22 11 51 28 25 09-00 00 00 00 00 80 00 00

2.1.7.2 Variables puntero.


Estas variables contienen la direccin de un dato o cdigo, en vez del contenido de memoria en si mismo.
Los apuntadores pueden ser NEAR o FAR. Los apuntadores NEAR solo contienen el offset de la direccin, stos
pueden inicializarse con la directiva DW.
Los apuntadores FAR contienen tanto la direccin del segmento como la del offset, stos se pueden
inicializar mediante la directiva DD. El segmento y offset se almacenan en memoria de acuerdo al siguiente
formato.
Nmero de byte

1
Offset

2
3
Segmento

Ejemplo.
cadena DB
"Hola muchachas",0
apuntaca DW cadena
fpuntacad DD cadena

;Cadena terminada en nulo


;Apuntador NEAR a cadena
;Apuntador FAR a cadena

2.1.7.3 Etiquetando variables.


La directiva label puede usarse para definir una variable de un cierto tamao, en una localidad de memoria
especfica. Es til cuando se desea hacer referencia a una misma variable, en diferentes tamaos.
Sintaxis:
nombre LABEL tipo
Donde:
nombre: Es el smbolo asignado a la variable.
tipo: Especifica el tamao de la variable. Puede ser cualquiera de los tipos definidos; BYTE, WORD,
DWORD, QWORD, TBYTE, tambin podemos usar el nombre de una estructura previamente definida.

Ejemplo:
;Programa ENSA13.ASM, Uso de la directiva LABEL
.386
;Usamos la directiva para habilitar los registros de 32 bits.
STACK SEGMENT PARA STACK 'STACK'
DB 100 DUP(?)
STACK ENDS
DATA SEGMENT PARA PUBLIC 'DATA'
a label WORD
b label DWORD
ar DB 10h, 20h, 30h, 40h
DATA ENDS

;a va a manejar de 2 en 2 bytes
;b va a manejar los 4 bytes
;Valores almacenados

CODE SEGMENT PARA PUBLIC USE16 'CODE'


ASSUME CS:CODE, DS:DATA, SS:STACK
inicio:
mov ax, SEG DATA
mov ds, ax
mov bx, a
;Cargamos en BX el valor de a
mov cx, a + 2
;Cargamos en CX el valor de a + 2
mov eax, b
;Cargamos en el registro EAX el valor de b
mov ax, 4C00h
INT 21h
CODE ENDS
END inicio
COMENTARIOS.
En el programa definimos dos variables etiquetadas a y b, la primera de tipo WORD y la segunda de tipo
DWORD, estas variables deben ser declaradas antes de la variable que maneja los datos, en este caso el arreglo
ar, que contiene 4 datos.
Luego de cargar el registro DS con la direccin del segmento de datos, la instruccin que sigue:mov bx, a.
Nos va a transferir al registro BX, el contenido de a, que en este caso es 2010h.

La siguiente instruccin: mov cx, a + 2, transferir al registro CX el valor 4030h.Por ltimo la instruccin:
mov eax, b, transferir al registro de 32 bits EAX el contenido de b, que en este caso sern los 32 bits de
40302010h. Usamos el micro 80386 para demostrar la operacin de un tipo DWORD manejado en una variable
etiquetada.
En el microprocesador 80386 podemos usar el modo de 32 bits, (USE32) mediante el cual tenemos acceso
a los 4 GB. por segmento, o bien el modo de 16 bits con el cual el segmento va a ser hasta de 64 KB, como en el
8086/8088/80286, (USE16). Mediante la directiva (.386) habilitamos los registros de 32 bits del 80386, sin embargo
los podemos usar como registros de 8, 16 y 32 bits.
2.1.8 Operandos
Los operandos son argumentos que definen un valor el cual es manejado por la instruccin o la directiva.
Un operando puede ser una constante, variable, expresin o palabra reservada, dependiendo de la instruccin o
directiva y el contexto de la sentencia. Una expresin, por ejemplo, es un operando la cual consiste de varios
operandos que son combinados para describir un VALOR o una localidad de memoria.
Los operadores nos indican las operaciones a realizar con los operandos en una expresin. Las
expresiones son evaluadas en tiempo de ensamblado. Usando expresiones se nos facilita el trabajo de evaluacin
cuando se esta escribiendo el archivo fuente.
Operadores
El ensamblador nos proporciona una gran variedad de operadores para combinar, comparar, cambiar y
analizar los operandos. Algunos operadores trabajan constantes enteras, otros con valores en memoria y algunos
con ambos. Es importante entender la diferencia entre operadores e instrucciones:
Operadores manejan clculos de valores constantes los cuales se conocen en tiempo de ensamble.
Instrucciones manejan clculos de valores los cuales pueden no conocerse sino hasta en tiempo de
ejecucin.
Los tipos de operadores son los siguientes:
1) Aritmticos.
2) Relacionales.
3) Lgicos a nivel de bit.
4) Corrimiento.
5) Especiales.
6) Operadores de tipo.
1) Operadores Aritmticos.
Operador

Sintaxis

Significado

+
*
/
MOD
+
-

+ expresin
- expresin
exp1 * exp2
exp1 / exp2
exp1 MOD exp2
exp1 + exp2
exp1 - exp2

ms monario
menos monario
multiplicacin
divisin
mdulo
suma
resta

A excepcin de (suma) y (resta) los dems operadores solo pueden usarse con constantes enteras. La
(suma) y la (resta) pueden usarse con una constante entera y un operando a memoria, el resultado es un operando
a memoria.

2) Relacionales.
Comparan 2 expresiones y regresan:
TRUE
FALSE (0)

(-1)

(FFFFh)
(0000h)

Las expresiones deben ser valores constantes.


Operador

Sintaxis

Valor regresado

EQ
NE
LT
LE
GT
GE

exp1 EQ exp2
exp1 NE exp2
exp1 LT exp2
exp1 LE exp2
exp1 GT exp2
exp1 GE exp2

True si exp1 = exp2


True si exp1 <> exp2
True si exp1 < exp2
True si exp1 <= exp2
True si exp1 > exp2
True si exp1 >= exp2

NOTA: EQ y NE tratan sus argumentos como de 16 bits.


Ejemplo:
-1 EQ 0FFFFh
-1 NE 0FFFFh

(True)
(False)

LT, LE, GT y GE tratan sus argumentos como de 17 bits. Donde el bit 17 especifica el signo.
Ejemplo:
1 GT -1
1 GT 0FFFFh)

(True)
(False)

3) Lgicos a nivel de bit


Estos operadores realizan operaciones lgicas sobre expresiones con valores constantes.
Operador

Sintaxis

Significado

NOT
AND
OR
XOR

NOT expresin
exp1 AND exp2
exp1 OR exp2
exp1 XOR exp2

Complemento a uno
Y
O
OR exclusivo

NOTA: No hay que confundir estos operadores con las instrucciones lgicas con el mismo nombre. Los operadores
trabajan con constantes enteras en tiempo de ensamblado. Las instrucciones trabajan sobre
registros o localidades de memoria en tiempo de ejecucin.
4) Corrimiento.
Operador

Sintaxis

Significado

SHR
SHL

exp SHR nbits


exp SHL nbits

Corrimiento a la derecha nbits


Corrimiento a la izq. nbits.

Veamos el siguiente programa.


;Programa ENSA14.ASM, Uso de Operadores

INT21 EQU 21h

;Se define una constante para 21h

STACK SEGMENT PARA STACK 'STACK'


DB 100 DUP (?)
STACK ENDS
DATA SEGMENT PARA PUBLIC 'DATA'
x DB 0AAh, 0BBh, 0CCh, 0DDh, 0EEh, 0FFh
a EQU x + 4
;a es el contenido de direccin x + 4 (0004)
b EQU a 2
;b es el contenido de direccin x + 4 - 2 (0002)
c EQU 50 MOD 9
;c = 5
d EQU NOT 0F0h
;d = 0Fh
DATA ENDS
CODE SEGMENT PARA PUBLIC 'CODE'
ASSUME CS:CODE, DS:DATA, SS:STACK
inicio:
mov ax, SEG DATA
mov ds, ax
mov ch, c SHL 1
mov cl, 4
SHL x[2], cl
mov cl, b
mov ax, d AND 0Afh
mov ch, a
add ch, c
mov bx, 4 EQ 3
mov si, 4 NE 3
mov ax, 4C00h
INT INT21
CODE ENDS
END inicio

;ch almacena 0Ah


;x[2] almacena C0h
;cl almacena [0002] = C0h
;ax almacena 000Fh
;ch almacena [0004] = EEh
;ch almacena F3h
;bx almacena FALSE (0)
;si almacena TRUE (-1)

COMENTARIOS.
EQU es una igualdad no redefinible usada para asignar una constante numrica a un smbolo. El valor del
smbolo no puede ser redefinido. EQU se usa normalmente para asignar a una constante un nombre, lo que hace
ms legible el cdigo, tambin nos facilita el cambio de un valor constante l cual es usado en varias partes del
archivo fuente.
Sintaxis:
nombre EQU expresin.
Note que el smbolo a y b son smbolos que nos representan una direccin. (0004h) y (0002h)
respectivamente.
Los smbolos de a a la d son definidos en tiempo de ensamble.
No hay que confundir el operador SHL con la instruccin SHL, el primero es resuelto en tiempo de
ensamble y el segundo en tiempo de ejecucin, ambos hacen un corrimiento, el primero de expresiones constantes
y el segundo de una variable, el resultado es colocado en la misma variable.
La sintaxis de la instruccin SHL es:
SHL mem, CL
5) Operadores Especiales.
Operador

Sintaxis

Significado

variable.campo

Operador de campo de estructura.

[]
:

[[exp1]][exp2]
segment:expresin

Operador de indice.
Sobre-escritura de segmento.

Tambin existe el operador ($), se le llama contador de localidad, nos permite poner en una CONSTANTE
la direccin de la localidad actual de memoria de la sentencia en ensamble.
Tiene los atributos de una etiqueta near, representa un offset relativo al segmento actual, es igual al
nmero de bits generados por el segmento en ese punto.
Ejemplo:
var1 EQU $ donde var1 almacena el offset en ese punto del segmento.
Una aplicacin de este operador sera el clculo de la longitud de una cadena, por ejemplo:
.DATA
cad
DB 'Hola muchachas'
lcad EQU $ - cad
;a partir de la direccin regresada por $ restamos la direccin de cad.
;El resultado es la longitud de la cadena cad.
;cad, en esta ocasin representa una direccin.
Consideremos el siguiente programa.
TITLE Programa ENSA15.ASM Muestra uso de $ y la igualdad EQU
DOSSEG
.MODEL Small
.STACK 100h
;Aloja el stack 256 bytes
.DATA
a DB "Hola Muchachas.",13,10 ;Mensaje a ser escrito
la EQU $ - a
;Calcula longitud del mensaje
.CODE
start:
mov ax, @DATA
mov ds, ax
mov bx,1
mov cx,la
lea dx,a
mov ah,40h
INT 21h
mov ax,4C00h
INT 21h
END start

;Carga localidad de segmento en el registro DS


;Carga 1 para archivo estndar de salida.
;Carga longitud del mensaje en CX
;Carga la direccin del mensaje
;Nmero de funcin de escritura
;Interrupcin del DOS

COMENTARIOS.
En este programa el calculo de la longitud de la cadena nos sirve para el uso de la funcin 40h de la
interrupcin 21h.
Sintaxis:
INT 21h

Funcin 40h Escribe a un archivo o dispositivo.

Para usar esta funcin cargue el nmero de bytes a escribir en DX. AX regresa el nmero de bytes que
fueron realmente escritos en el archivo o dispositivo.
Entrada:
AH = 40h
BX = Archivo a manejar.
CX = Nmero de bytes a escribir.
DS:DX = Direccin del buffer de datos.
Salida:
Carry Flag = 0 (Se realiz satisfactoriamente)
AX = Nmero de bytes escritos.

Carry flag = 1
AL = 5 Acceso negado
= 6 Manejo invlido
Manejador
0
1
2
3
4

Uso

Dispositivo

Entrada Estndar
Salida Estndar
Salida estndar de error
Salida auxiliar COM1
Impresin Estndar PRN

CON
CON
CON
AUX
PRN

6) Operadores de tipo.
Estos operadores especifican o analizan el tipo de operando de memoria.
6.a) El operador PTR. Este operador especifica el tipo de una variable o etiqueta. Forza a la expresin a ser
tratada como del tipo especificado. Se usa para permitir que ciertas instrucciones acepten variables que de otra
forma generaran error.
Sintaxis:
tipo PTR expresin
Dnde:
expresin: Es cualquier operando.
tipo: Para operandos a memoria puede ser BYTE, WORD, DWORD, FWORD, QWORD TBYTE y para
etiquetas puede ser NEAR, FAR PROC
Veamos el siguiente programa.
;Programa ENSA16.ASM
;Uso de Operadores, segundo programa.
STACK SEGMENT PARA STACK 'STACK'
DB 64 DUP (?)
STACK ENDS
DATA SEGMENT PARA PUBLIC 'DATA'
a DB 10h, 20h, 30h, 40h, 50h
b DW 6070h, 8090h
c DD ?
d EQU 0AABBh
DATA ENDS
CSEG SEGMENT PARA PUBLIC 'CODE'
ASSUME CS:CSEG, DS:DATA, SS:STACK
inicio:
mov ax, SEG DATA
mov ds, ax
mov ax, WORD PTR a
;Carga en AX los 2 primeros bytes de A
mov WORD PTR c[0], ax
;Carga en c los primeros 2 bytes de A
mov ax, WORD PTR a[2]
;Carga en AX los 2 bytes sig. de A
mov WORD PTR c[2], ax
;Carga en c los 2 bytes sig. de A
mov ax, b
;Vamos a realizar una suma de 32 bits
add WORD PTR c[0], ax
;c = c + 80906070, sto es,
mov ax, b[2]
;c = 40302010h + 80906070h = C0C08080h
adc WORD PTR c[2], ax
;usamos ADC para sumar el Carry

mov bh, HIGH d


mov bl, LOW d
mov ax, 4C00h
INT 21h
CSEG ENDS
END inicio

;Cargamos en BH la parte alta de D


;Cargamos en BL la parte baja de D

COMENTARIOS.
En este programa se trata de ejemplificar el uso del operador PTR, en su aplicacin ms comn, el
modificar el tamao de variables. Lo primero que hacemos es pasar a c, que esta definido como Doble
WORD, del menos significativo a ms significativo. Los primeros 4 bytes de a, la cual fu definida como un
arreglo de tipo BYTE, para ello se usa el operador PTR en donde, cuando a a le sobreponemos un tipo
WORD el ensamblador toma 2 bytes de a en vez de uno. Pasamos de 2 en 2 bytes ya que es lo mximo
que nos puede manejar un registro del 8088/8086/80286.
Como ya c tiene un valor, en la siguiente parte del programa hacemos una suma de 32 bits; c = c +
b, para ello usamos 2 instrucciones ADD para la parte menos significativa del nmero y ADC para sumar
con carry la parte ms significativa del nmero. Note que b es un arreglo de tipo WORD.
Por ltimo en la tercera parte del programa de la constante d usando los operadores HIGH y LOW
pasamos al registro BX primero la parte alta de la constante, luego su parte baja; d EQU 0AABBh
A continuacin se presenta el mismo programa pero para correr en 80386, vea que los pasos se reducen
considerablemente debido a los registros de 32 bits de este procesador.
;Programa ENSA16A.ASM
;Uso de Operadores, segundo programa.
.386
STACK SEGMENT PARA STACK 'STACK'
DB 64 DUP (?)
STACK ENDS
DATA SEGMENT PARA PUBLIC 'DATA'
a DB 10h, 20h, 30h, 40h, 50h
b DW 6070h, 8090h
c DD ?
d EQU 0AABBh
DATA ENDS
CSEG SEGMENT PARA PUBLIC USE16 'CODE'
ASSUME CS:CSEG, DS:DATA, SS:STACK
inicio:
mov ax, SEG DATA
mov ds, ax
mov eax, DWORD PTR a
;Carga en eax los 4 primeros bytes de A
mov c, eax
mov eax, DWORD PTR b
;Vamos a realizar una suma de 32 bits
add c, eax
;c = c + 80906070, esto es, c = 40302010h + 80906070h = C0C08080h
mov bh, HIGH d
;Cargamos en BH la parte alta de D
mov bl, LOW d
;Cargamos en BL la parte baja de D
mov ax, 4C00h
INT 21h
CSEG ENDS
END inicio
COMENTARIOS.
En el inicio del programa se incluye la directiva (.386). En la declaracin del segmento de cdigo,
note el uso de la seccin de use (USE16), el predefinido es USE32, vea que tambin es posible en este

micro utilizar registros de 8, 16, y 32 bits.


Nota: Para analizar este programa no se puede usar el DEBUG del Sistema Operativo, es necesario usar
el CV, en donde tambin se pueden observar los registros de 32 bits del 80386.
6.b) Operador SHORT. Este operador especifica que la etiqueta tiene un alcance corto, (< a 128 bytes).
Sintaxis:
SHORT etiqueta
Ejemplos:
jump uno
jump SHORT uno

;Salta 128 bytes o ms.


;Salta menos de 128 bytes.

6.c) Operador THIS. Este operador crea un operando cuyo valor de su OFFSET y segmento es igual a la posicin
actual del operador y cuyo tipo es el especificado en la sintaxis del operador.
Sintaxis:
THIS tipo
Dnde:
tipo:
* Para operandos a memoria. Puede ser BYTE, WORD, DWORD, FWORD, QWORD TBYTE
* Para etiquetas. Puede ser NEAR, FAR PROC
El operador THIS se usa tpicamente con la directiva EQU para crear etiquetas o variables.
6.d) Los operadores HIGH y LOW. El operador HIGH regresa el byte ms significativo de la expresin y el
operador LOW regresa el byte menos significativo de la expresin. La expresin deber ser una constante de 2
bytes.
Sintaxis:
HIGH expresin
LOW expresin
6.e) El operador SEG. Regresa la direccin del segmento de una expresin.
Sintaxis:
SEG expresin
Donde:
expresin: Puede ser una etiqueta, variable, nombre de segmento, nombre de grupo, o cualquier operando de
memoria. El valor regresado se puede utilizar como un operando de memoria.
6.f) El operador OFFSET. Regresa la direccin del OFFSET de una expresin.
Sintaxis:
OFFSET expresin
Dnde:
expresin: Puede ser cualquier etiqueta, variable, o un operando directo a memoria. El valor regresado por
OFFSET es una constante (operando inmediato).
Cuando se maneja la estructura simplificada, el valor regresado puede ser:
1. Si se maneja un segmento de datos NEAR, el valor regresado es el nmero de bytes entre el item
y el inicio del grupo (DGROUP).

2. Si el item es declarado dentro de un segmento FAR el valor regresado es el nmero de bytes entre
el item y el inicio del segmento.
3. Si se usa en la declaracin estndar de segmento, el valor regresado es un operando a memoria
igual al nmero de bytes entre el item y el inicio del segmento dentro del cual fue declarado.
El operador de sobre-escritura de segmento se puede usar para forzar a OFFSET a regresar el nmero de
bytes entre el item en expresin y el inicio de un nombre de segmento o grupo.
Ejemplo:
mov bx, OFFSET DGROUP:arreglo
No es lo mismo que:
mov bx, OFFSET arreglo
Cuando el segmento donde se defini arreglo no es el primer segmento del grupo.

6.g) El operador TYPE. Este operador regresa un nmero que representa el tipo de una expresin.
Sintaxis:
TYPE expresin
Cuando expresin evala a una variable, el operador regresa el nmero de bytes en cada dato de la
variable. Cuando se manejan cadenas cada carcter es considerado como un dato separado, por lo tanto, al
evaluar una cadena TYPE regresa 1.
Cuando se evala una constante regresa CERO.
Si estamos evaluando una estructura, regresa el # de bytes en la estructura.
6.h) El operador LENGHT. Este operador regresa el nmero de elementos de un dato en un arreglo u otra
variable definida con el operador DUP.
Sintaxis:
LENGHT variable
6.i) El operador SIZE. El operador SIZE regresa el nmero total de bytes proporcionados a un arreglo u otro tipo
de variable definida con el operador DUP.
Sintaxis:
SIZE variable
Veamos un ejemplo de uso de algunos de estos operadores.
TITLE Programa ENSA17.ASM
COMMENT $ Este programa ejemplifica el uso de:
1) Un puntero.
$
2) Operadores de tipo.
.MODEL Small
.STACK 100h
.DATA
a DB "Esta es una cadena"
pa DW a
b EQU THIS WORD
c DD 1887473824
d DW 16 DUP (?)
e label WORD
f DB 10h, 20h, 30h, 40h

;Definimos una cadena


;En el puntero pa guardamos el OFFSET de a
;Definimos b como una variable tipo WORD para accesar los primeros 2 bytes de c
;a e la definimos como una variable
;etiquetada que hace referencia a f

.CODE
inicio:
mov ax, DGROUP
mov ds, ax
mov ax, SEG pa
mov bx, pa
mov cx, OFFSET a
mov dx, b
mov di, e
mov ax, SIZE d
mov bx, TYPE d
mov cx, LENGTH d

;Ponemos en AX el valor del segmento de pa


;Ponemos en BX el valor de pa
;Corresponde al mismo que OFFSET de a
;Ponemos en dx el valor de b 90A0h
;Observe la similitud con THIS
;Regresa 20
;Regresa 2
;Regresa 10

mov ax, 4C00h


INT 21h
END inicio
COMENTARIOS.
a es una variable tipo byte, en la siguiente declaracin lo que hacemos es asignarle a pa la
direccin de inicio de la cadena a, entonces la direccin se va a guardar en una localidad de memoria de 2
bytes.
b es una constante que contiene la direccin de la localidad de memoria donde se declar THIS,
(localidad de 2 bytes), sto es, esta localidad corresponde a los 2 bytes menos significativos de cc. Como
lo veremos en la corrida.
d nos sirve para ver como trabajan los operadores, SIZE, TYPE y LENGTH.
Incluimos una variable etiquetada e la cual se declara de 2 bytes y toma el valor de los primeros 2
bytes de la variable f.
Podemos ver que THIS y LABEL tiene un comportamiento idntico.
Si vemos el DEBUG podemos comprobar lo que hemos dicho.
AX=106E BX=0000 CX=0062 DX=0000 SP=0100 BP=0000 SI=0000 DI=0000
DS=105C ES=105C SS=1073 CS=106C IP=0003 NV UP EI PL NZ NA PO NC
106C:0003 8ED8
MOV
DS,AX
-t 2
AX=106E BX=0000 CX=0062 DX=0000 SP=0100 BP=0000 SI=0000 DI=0000
DS=106E ES=105C SS=1073 CS=106C IP=0008 NV UP EI PL NZ NA PO NC
106C:0008 8B1E1800
MOV
BX,[0018]
-t
DS:0018=0006
AX=106E BX=0006 CX=0062
DS=106E ES=105C SS=1073
106C:000C B90600
-t
AX=106E BX=0006 CX=0006
DS=106E ES=105C SS=1073
106C:000F 8B161A00
-t

DX=0000 SP=0100 BP=0000 SI=0000 DI=0000


CS=106C IP=000C NV UP EI PL NZ NA PO NC
MOV
CX,0006
DX=0000 SP=0100 BP=0000 SI=0000 DI=0000
CS=106C IP=000F NV UP EI PL NZ NA PO NC
MOV
DX,[001A]
DS:001A=90A0

AX=106E BX=0006 CX=0006 DX=90A0 SP=0100 BP=0000 SI=0000 DI=0000


DS=106E ES=105C SS=1073 CS=106C IP=0013 NV UP EI PL NZ NA PO NC

106C:0013 8B3E3E00
-t

MOV

DI,[003E]

DS:003E=2010

AX=106E BX=0006 CX=0006 DX=90A0 SP=0100 BP=0000 SI=0000 DI=2010


DS=106E ES=105C SS=1073 CS=106C IP=0017 NV UP EI PL NZ NA PO NC
106C:0017 B82000
MOV
AX,0020
-t
AX=0020 BX=0006 CX=0006 DX=90A0 SP=0100 BP=0000 SI=0000 DI=2010
DS=106E ES=105C SS=1073 CS=106C IP=001A NV UP EI PL NZ NA PO NC
106C:001A BB0200
MOV
BX,0002
-t
AX=0020 BX=0002 CX=0006 DX=90A0 SP=0100 BP=0000 SI=0000 DI=2010
DS=106E ES=105C SS=1073 CS=106C IP=001D NV UP EI PL NZ NA PO NC
106C:001D B91000
MOV
CX,0010
-dds:0
106E:0000
106E:0010
106E:0020
106E:0030
106E:0040
-q

B8
61
00
00
30

00
20
00
00
40

4C
63
00
00
00

CD
61
00
00
00

21
64
00
00
00

00
65
00
00
00

45
6E
00
00
00

73-74
61-06
00-00
00-00
00-00

61
00
00
00
00

20
A0
00
00
F1

65
90
00
00
00

El rea subrayada es parte del cdigo del programa.


corresponde al espacio reservado por d
Precedencia de Operadores.
Precedencia
(Alta)

(baja)

Operadores.
LENGHT, SIZE, (), [], <>
. (operador de campo de estructura)
:
PTR, OFFSET, SEG, TYPE, THIS
HIGH, LOW
+, - (monario)
*, /, MOD, SHL, SHR
+, - (binario)
EQ, NE, LT, LE, GT, GE
NOT
AND
OR, XOR
SHORT

73
80
00
00
FF

20
70
00
00
00

75
00
00
10
28

6E ..L...
00 a ca..
00
20
01

La parte ms negra del mapa de memoria

;Ensa18.asm
.model small
.stack 20h
.data
dato1 db "La clase de Lenguaje Ensamblador$"
.code
inicio:
mov ax,@data
mov ds,ax
mov ah,02h
mov bh, 00h
mov dx, 100ch
int 10h
mov ah,06
mov al, 00
mov bh, 57h
mov cx,00
mov dx,184fh
int 10h
mov dx, offset dato1
mov ah,09h
int 21h
mov ax,4c00h
int 21h
end inicio

Color Display Attributes.

F
0
0
0
0
0
0
0
0
1
1
1
1
1
1
1
1

Bits
R G
0 0
0 0
0 1
0 1
1 0
1 0
1 1
1 1
0 0
0 0
0 1
0 1
1 0
1 0
1 1
1 1

BACKGROUND
Nmero
B
0
1
0
1
0
1
0
1
0
1
0
1
0
1
0
1

0
1
2
3
4
5
6
7
8
9
A
B
C
D
E
F

R = Red bit.

Color
Black
Blue
Green
Cyan
Red
Magenta
Brown
White
Black blink
Blue blink
Green blink
Cyan blink
Red blink
Magenta blink
Brown blink
White blink

F
0
0
0
0
0
0
0
0
1
1
1
1
1
1
1
1

Bits*
R G
0 0
0 0
0 1
0 1
1 0
1 0
1 1
1 1
0 0
0 0
0 1
0 1
1 0
1 0
1 1
1 1

FOREGROUND
Nmero

Color

0
1
2
3
4
5
6
7
8
9
A
B
C
D
E
F

Black
Blue
Green
Cyan
Red
Magenta
Brown
White
Dark grey
Ligth blue
Ligth green
Ligth cyan
Ligth red
Ligth magenta
Yellow
Brigth white

B
0
1
0
1
0
1
0
1
0
1
0
1
0
1
0
1

G = Green bit.
F = Flashing.

B = Blue bit.
I = Intensity bit.

Note: * On monochrome monitors, the blue bit is set and the red and green bits are cleared (001) for underline; all
color bits are set (111) for normal text.

2.2 Clasificacin de las Instrucciones.


Hasta este momento solo se han utilizado un pequeo grupo de instrucciones, en esta seccin se
mostraran algunas ms, del 8088/8086/80286. Adems se realizaran algunos ejemplos de programas donde
usemos aquellas instrucciones que en algn momento pudiesen representar mayor dificultad. Con el fin de tener un
mejor panorama de las instrucciones de la familia de las computadoras personales, stas las dividiremos por
grupos de acuerdo a su aplicacin.
Las instrucciones las podemos dividir en 6 grupos:

Instrucciones de Transferencia de Datos. Mueven informacin entre registros y posiciones de memoria o


puertos de Entrada/Salida.

Instrucciones Aritmticas. Efectan operaciones de suma, resta, multiplicacin y divisin, usando los
diferentes tipos de datos definidos en ensamblador.

Instrucciones de manipulacin de bits. Efectan operaciones de corrimiento, rotacin y lgicas; usando


posiciones de memoria y registros.

Instrucciones de Transferencia de Control. Alteran el orden de ejecucin de un programa, en este grupo se


incluyen instrucciones de salto condicionales e incondicionales y llamadas a procedimientos.

Instrucciones de Manejo de Cadenas. Como en todo lenguaje las cadenas reciben un tratamiento espacial,
el lenguaje ensamblador, no es la excepcin.

Instrucciones de Control del Procesador. Activan y desactivan indicadores de estado (banderas) y cambian
el estado de ejecucin del microprocesador.

2.2.1 Instrucciones de Transferencia.

(TABLA 1)

De este grupo las instrucciones ms sobresalientes son:


MOV

Mueve datos de 8 y 16 bits entre registros o entre registros y localidades de memoria.

PUSH

Mueve datos entre registros, entre localidades de memoria a la PILA.

POP

Mueve datos de la PILA a registros y localidades de memoria.

XCHG

IN

Esta instruccin intercambia el contenido entre los operandos fuente y destino, tanto bytes como
words. Se pueden intercambiar dos registros (excepto los registros de segmento) o un registro y
una posicin de memoria.
Esta instruccin busca un valor en una tabla de BYTES y lo carga en el registro AL. La tabla puede
tener hasta 256 bytes.
Esta instruccin toma el valor contenido en un puerto de E/S.

OUT

Esta instruccin enva un valor a un puerto de E/S.

LEA

Carga en un registro el offset de un operando de memoria.

LDS

Lee una direccin de 32 bits, su parte alta la carga en DS y su parte baja en el registro
especificado.

LES

Lee una direccin de 32 bits, su parte alta la carga en ES y su parte baja en el registro
especificado.

XLAT

A modo de ejemplo, se mostrar la informacin de la instruccin MOV, tal y como se muestra en el manual
de referencia del lenguaje ensamblador de Microsoft. Se recomienda que para los siguientes ejercicios, consulte el
manual de referencia de las diferentes instrucciones.
MOV

Mueve el valor del operando fuente al operando destino.

100010dw

mod,reg,r/m

Formato
MOV reg,reg

MOV mem,reg

MOV reg,mem

1100011w

mod,000,r/m

Formato
MOV

mem,immed

disp (0,1,or 2)

O D I T

S Z A P C

Ejemplos
MOV DH,BH
MOV DX,CX
MOV EAX,EBP
MOV ESP,ESI

Microprocesador
8086

Ciclos

MOV DATA,DL
MOV COUNT,CX
MOV TEMP, EBX
MOV [ECX], BL

MOV DL,DATA08
MOV DX,NUMB
MOV EBX,TEMP + 3
MOV CL,DATAS2

disp (0,1,or 2)
Ejemplos
MOV DATOSF,33H
MOV LISTA,12H
MOV BTYE PTR [DI],2
MOV DWORD PTR [ECX],1

8088

80286

80386

80468

Pentium-Pentium 4

8086

9 + EA

8088

13 + EA

80286

80386

80486

Pentium-Pentium 4

8086

10+ EA

8088

12 + EA

80286

80386

80486

Pentium-Pentium 4

D I T
Microprocesador
8086

S Z A P C
Ciclos
10+ EA

8088

14 + EA

80286

80386

80486

Pentium-Pentium 4

Continuacin.

10011w

disp

(1,or 2)

Formatoreg,immed
MOV

101000dw

disp

Formato
MOV mem,accum
MOV mem, reg

MOV accum,mem

100011d0
Formato
MOV seg,reg

Ejemplos
MOV
DH,22H
MOV CL,15H
MOV EBX,12345678H
MOV DI,100

(2)
Ejemplos
MOV DATO1,AH
MOV LISTAS,AX
MOV NUMERO,EAX

MOV AL,DATOS2
MOV AX,LISTA
MOV EAX,NUMS

mod,sreg,r/m disp

(0,1,or 2)

Ejemplos
MOV SS,AX
MOV DS,DX
MOV ES,CX
MOV FS,BX

O D I T

S Z A P C

Microprocesador
8086

Ciclos 4

8088

80286

80386

80486

Pentium-Pentium 4

O D I T

S Z A P C

Microprocesador
8086

Ciclos

10

8088

14

80286

80386

80486

Pentium-Pentium 4

8086

10

8088

14

80286

80386

80486

Pentium-Pentium 4

O D I T

S Z A P C

Microprocesador
8086

Ciclos

8088

80286

80386

80486

Pentium-Pentium 4

Continuacin.

100011d0

mod,sreg,r/m disp

Formato
MOV seg,mem

(0,1,or 2)

Ejemplos
MOV SS,PARTES_UP
MOV DS,DATOSS
MOV ES,TEMP1

O D I T

S Z A P C

Microprocesador
8086

Ciclos
8 + EA

8088

12 + EA

80286

80386

80486

Pentium-Pentium 4
MOV reg,seg

MOV mem,sreg

COMMENT * ENSA19.ASM

MOV BX,DS
MOV CX,FS
MOV DX,ES

MOV DATOS2,CS
MOV TEMP,DS
MOV NUM1,SS
MOV TEMP2,GS

8086

2o3
2

8088

80286

80386

80486

Pentium-Pentium 4

8088

9 + EA

8086
80286

13 + EA
3

80386

80486

Pentium-Pentium 4

* Intercambia el contenido de WORDS en un arreglo


.MODEL Small
.STACK 100h
.DATA
arre DB 10h, 20h, 30h, 40h, 50h, 60h, 70h, 80h, 90h, 0A0h
numchar EQU $ - arre
.CODE
inicio:
mov ax, @data
mov ds, ax
lea si, arre
mov cx, numchar/2
;Nmero de WORD a intercambiar
uno:
mov ax, WORD PTR [si]
;Obtiene el WORD en AX
xchg ah, al
;Realiza el intercambio
mov WORD PTR [si], ax
;Regresa a memoria los valores ya cambiados
inc si
inc si
loop uno
;Contina hasta que CX = 0
mov ax, 4C00h
int 21h
END inicio
OBSERVACIONES.
Consulte en el Manual de Referencia la sintaxis de XCHG.
Este programa lo que hace es
intercambiar el contenido de 2 localidades consecutivas de memoria. Se da el nmero de words a
intercambiar en CX.
Lo que realizara seria lo siguiente:
mov ax, WORD PTR [si]
xchg ah, al

;Obtiene el WORD en AX
;Realiza el intercambio

Por ejemplo, para las primeras 2 localidades: 10h 20h despus del intercambio: 20h 10h. As
sucesivamente hasta que CX = 0.
COMMENT * ENSA20.ASM
La tabla contiene los valores de los cubos de enteros del 0 al 6 poniendo en AL el valor del nmero del cual
se quiere obtener su cubo, al terminar el programa, AL contiene el valor del cubo. *
num EQU 5

;Nmero del cual se quiere obtener el cubo.

.MODEL Small
.STACK 100h
.DATA
cubo DB 0, 1, 8, 27, 64, 125, 216
.CODE
inicio:
mov ax, @data
mov ds, ax
lea bx, cubo
;Ponemos en BX la direccin de cubo
mov al, num
;En AL ponemos el 5.
xlat
;Hacemos la bsqueda en la TABLA.
mov ax, 4C00h
int 21h
END inicio
OBSERVACIONES.
Consulte en el Manual de Referencia la sintaxis de XLAT. Para usar XLAT, el registro BX deber

tener la direccin de inicio de la TABLA y AL la posicin a ser cargada de nuevo en AL, al terminar de
ejecutarse XLAT.
COMMENT *ENSA21.ASM
Este programa copia la cadena cad1 en la cadena cad2 poniendo la direccin de cad1 en DS:SI y la
direccin de cad2 en ES:DI usando las instrucciones LDS y LES.*
.MODEL Small
.STACK 100h
.DATA
cad1 DB 19,"Felices Vacaciones$"
cad2 DB 40 dup(?)
ptr1 DD cad1
ptr2 DD cad2
.CODE
inicio:
mov ax, @data
mov ds, ax
lds si, ptr1
les di, ptr2
xor cx, cx
mov cl, BYTE PTR [si]
inc si
cld
rep movsb
mov ax, 4C00h
int 21h
END inicio

;Pone la direccin de ptr1 en DS:SI


;Pone la direccin de ptr2 en ES:DI
;Hace CX = 0
;Pone el contenido de la primera localidad de cad1 en cl
;Limpia la bandera de direccin ahora direccin se incrementa.
;Repite la instruccin movsb el nmero de veces indicado por CX

OBSERVACIONES.
Consulte el Manual de Referencia para mayor informacin sobre las instrucciones LDS, LES, REP
y MOVSB, MOVSW y MOVSD.
Las instrucciones LDS y LES nos permiten definir explcitamente los registros de segmento a
utilizar. La instruccin CLD limpia la bandera de direccin, lo cual ocasiona que instrucciones posteriores
de manejo de cadenas sean procesadas desde la direccin ms baja a la direccin ms alta; la instruccin
MOVSB copia un BYTE de la direccin DS:SI a la direccin ES:DI y la instruccin REP repite la instruccin
de manejo de cadenas que le sigue hasta que CX = 0.

2.2.2 Instrucciones Aritmticas.

(TABLA 2)

Hasta ahora se conocieron instrucciones en ensamblador necesarias para llevar datos desde la memoria al
procesador o viceversa, algo que nos permite asignar valores a ciertas posiciones de memoria o llevar datos
desde un punto a otro.
Otra de las necesidades bsicas, una vez que tenemos algunos datos en las registros, es la de efectuar
sobre ellos algunas operaciones aritmticas. A diferencia de la mayora de los microprocesadores de 8 bits ms
populares, la familia x86 dispone de instrucciones para efectuar no slo sumas y restas, sino tambin
multiplicaciones y divisiones. Siempre se habla de clculos llevados a cabo en el interior del microprocesador y
con nmeros enteros.
Las operaciones realizadas por estas instrucciones son con nmeros de 8 o 16 bits, con o sin signo. De
este grupo las instrucciones ms sobresalientes son:
INC

Esta instruccin suma UNO al registro u al operando de memoria, a diferencia de ADD no afecta la

bandera de ACARREO.
DEC

Esta instruccin resta un UNO de un registro u operando de memoria. NO afecta la bandera de


ACARREO.

NEG

Esta instruccin remplaza su operando con su complemento a 2.

CMP

Esta instruccin es similar a la de SUB solo que el resultado no afecta a ninguno de sus
operandos, solo afecta a las banderas. Se usa para decidir si tiene o no lugar un salto.

ADD y ADC

Instrucciones de suma y suma con acarreo respectivamente. El formato de ejecucin de estas


instrucciones es el siguiente:
DESTINO DESTINO + FUENTE [+ ACARREO]

AAA y DAA

AAA Realiza un ajuste ASCII despus de la suma. Por ejemplo si tenemos la instruccin:
ADD AL, BL
AAA
Si el nmero puesto en AL es mayor a nueve, el acarreo se pasa a AH, se afectan las banderas de
ACARREO y ACARREO AUXILIAR.
DAA Convierte el valor almacenado en AL en 2 dgitos decimales empaquetados vlidos. Por
ejemplo:
ADD AL, BL
DAA
Si el resultado de la suma excede el valor de 99 suma 1 a AH y afecta a la bandera de ACARREO
y ACARREO AUXILIAR.

SUB y SBB

Son similares a sus homologas de ADD y ADC, pero en este caso el indicador de acarreo (CF)
acta como indicador de acarreo negativo. Realiza la siguiente operacin.
DESTINO DESTINO - FUENTE [- ACARREO]

AAS y DAS

AAS Ajuste ASCII despus de la resta. La operacin de substraccin deber poner el resultado en
AL, si ste es mayor que 9h, AH se decrementa y se afectan las banderas de ACARREO y
ACARREO AUXILIAR.
DAS Ajuste decimal despus de la resta. El resultado de la substraccin se debe encontrar en AL,
se usa para nmeros BCD empaquetados.

MUL y IMUL

La primera se usa para multiplicacin de nmeros sin signo y la segunda para nmeros con signo.
En realidad lo que hace IMUL es extender el signo.

AAM

Para 8 bits:

AH AL AL * OPERANDO

Para 16 bits:

DX AX AX * OPERANDO

Ajuste ASCII despus de la multiplicacin. Usando con nmeros BCD no empaquetados.

DIV y IDIV La primera se usa para divisin de nmeros sin signo y la segunda para nmeros con signo. En realidad
lo que hace IDIV es extender el signo.
Para 8 bits:

AH AL AL / OPERANDO

Resultado
Residuo
Para 16 bits:

DX AX AX / OPERANDO
Resultado
Residuo

AAD

Ajuste ASCII antes de la divisin. Esta instruccin se usa para preparar un nmero BCD no
empaquetado para la divisin. Por ejemplo:
ADD
DIV BL ;AH AL AL / BL

COMMENT & ENSA22.ASM


Uso de MUL, multiplica sin signo, para 8 bits; AX AL * oper
& para 16 bits; DX-AX AX * operando.
.MODEL Small
.STACK 100h
.DATA
ay DW -50
az DW 40
ar DD ?

;En hexadecinal es FFCEh (65486)


;Resultado 27F830h

.CODE
inicio:
mov ax, @data
mov ds, ax
mov ax, ay
;Carga en AX el contenido de ay
mul az
; DX-AX AX * az
mov WORD PTR ar, ax
;Pasa a memoria el resultado
mov WORD PTR ar + 2, dx
mov ax, 4C00h
int 21h
END inicio
OBSERVACIONES.
En este ejemplo estamos utilizando 2 operandos de 16 bits; uno es AX y el otro es un operando de
memoria, por lo tanto el resultado va a quedar en DX AX. Para pasar el resultado a la variable que lo
almacena, como el resultado es de 32 bits debemos hacerlo por partes, para lo cual empleamos el
operador PTR. NOTE que el resultado es tomado como positivo.

Uso de AAM, Ajuste a ASCII.


COMMENT & ENSA23.ASM
Uso de MUL, multiplica sin signo, para 8 bits; AX AL * oper &

.MODEL Small
.STACK 100h
.DATA
ay DB 5
az DB 9
ar DW ?

;Resultado 2Dh

.CODE
inicio:
mov ax, @data
mov ds, ax
mov al, ay
;Carga en AX el contenido de ay
mul az
; AH-AL AL * az
aam
;Se realiza ajuste a ASCII
mov BYTE PTR ar, al;Pasa a memoria el resultado
mov BYTE PTR ar + 1, ah
mov ax, 4C00h
int 21h
END inicio
OBSERVACIONES.
Este programa es similar al anterior, al cual le hicimos los siguientes cambios:
a) Cambiamos multiplicando y multiplicador: ay = 5 y az = 9
b) Ahora el resultado estar en: AH-AL AL * az; 002D 05 * 09
Haciendo el ajuste a ASCII 0405 05 * 09
Nota: Se puede utilizar la instruccin AAM para convertir un nmero en binario a ASCII.
COMMENT & ENSA24.ASM
Uso de IMUL, multiplica con signo, para 8 bits; AX AL * oper
& para 16 bits; DX-AX AX * operando.
.MODEL Small
.STACK 100h
.DATA
ay DW -50
az DW 40
ar DD ?

;En hexadecimal FFCE


;Resultado DX-AX = FFFF-F830

.CODE
inicio:
mov ax, @data
mov ds, ax
mov ax, ay
imul az
;Realiza la multiplicacin con signo.
mov WORD PTR ar, ax
;Pasa a memoria el resultado en partes
mov WORD PTR ar + 2, dx
mov ax, 4C00h
int 21h
END inicio
OBSERVACIONES.
Este programa es el mismo que el anterior, solo que ahora utilizamos IMUL, la cual nos debe
arrojar un valor correcto ya que estamos multiplicando -50*40 = -2000, vemos ahora que lo que se hace es
extender el signo, generando un resultado en complemento a 2.

COMMENT & ENSA25.ASM


Uso de IDIV, divide con signo, un entero de 8 bits entre otro. AH AX/operando, en este caso, CWB
recorre el signo para el dividendo en AL. &
.MODEL Small
.STACK 100h
.DATA
ay DB -50
az DB 4
ar DW ?

;En hexadecimal CE
;Resultado AH = FE ( -2) y Resultado AL = F4 (-12)

.CODE
inicio:
mov ax, @data
mov ds, ax
mov al, ay
cbw
idiv az
;Realiza la divisin con signo.
mov BYTE PTR ar, al;Pasa a memoria el resultado.
mov BYTE PTR ar+1, ah
;Pasa a memoria el remanente.
mov ax, 4C00h
int 21h
END inicio
OBSERVACIONES.
Antes de usar IDIV, cuando se van a manejar nmeros con signo, es necesario incluir CBW para
que considere el nmero con signo, de otra manera al ejecutarse la divisin se generar un error de
desbordamiento de la divisin.
Note que el resultado queda en AL y el residuo en AH.
Uso de la instruccin AAA. Ajuste a ASCII despus de la suma. Tambin en este programa utilizaremos las
instrucciones LODS, STOS, CLC y CLD.
COMMENT & ENSA26.ASM
Este programa muestra como sumar 2 nmeros BCD, note el uso de AAA despus de cada suma de
dgitos BCD &
.MODEL Small
.STACK 100h
.DATA
abcd DB 1, 9
bbcd DB 7, 8
nbcd DW 2
rbcd DB 3 dup (?)

;Es el 91 en decimal
;Es el 87 en decimal
;Nmero de dgitos BCD
;Resultado

.CODE
inicio:
mov ax, @data
mov ds, ax
mov es, ax

;Actualiza DS
;Actualiza ES

lea si, abcd


lea bx, bbcd
lea di, rbcd
cld
clc
mov cx, nbcd

;operando abcd en DS:SI


;operando bbcd en DS:BX
;Resultado rbcd en ES:DI
;Limpia bandera de direccin para lodsb/stosb
;Limpia la bandera de acarreo
;Nmeros de dgitos a sumar

suma:
mov ax, 0
lodsb
adc al, [bx]
aaa
stosb
inc bx
loop suma
xchg ah, al
stosb

;Pone AX 0 antes de cada suma


;Carga dgito BCD en AL
;Suma con el otro dgito ms acarreo
;Ajusta para dgito BCD
;Almacena dgito en memoria
;Avanza al siguiente digito en BCD
;Continua la suma si CX <> 0
;Almacena ltimo dgito en AL
;Lo almacena en memoria tambin

mov ax, 4C00h


int 21h
END inicio
OBSERVACIONES.
Este programa suma 2 nmeros BCD no empaquetados y los almacena en la misma forma en memoria.
Suma 91 + 87 = 178, cada dgito es almacenado en un byte.
Para realizar la suma de esta manera, debemos ir sumando byte por byte de acuerdo al nmero de dgitos
de cada sumando, cada vez realizada una suma, debemos de hacer el ajuste, ya que en un byte no deben
existir nmeros mayores de 9.
Las siguientes 2 ltimas instrucciones del programa.
xchg ah, al
;Almacena ltimo dgito en AL
stosb
;Lo almacena en memoria tambin
La primera instruccin pone en AL el dgito ms significativo, el cual quedo en AH, por la accin de AAA, la
cual coloca en AH el acarreo resultante del ajuste realizado, luego es almacenado en memoria utilizando
tambin STOSB.
Analicemos ahora la instruccin DAA, ajuste decimal despus de la suma. En el siguiente programa vamos a
realizar la suma de 2 nmeros BCD empaquetados.
COMMENT * ENSA27.ASM
* Ejemplo de uso de DAA
.MODEL Small
.STACK 100h
.DATA
a DB 29h
b DB 18h
cc DB ?

;Primer nmero BCD empaquetado.


;Segundo nmero BCD empaquetado.
;Resultado

.CODE
inicio:
mov ax, @data
mov ds, ax
mov al, a
add al, b
daa
mov cc, al
mov ax, 4C00h
int 21h
END inicio

;41h 29h + 18h


;47 29 + 18

OBSERVACIONES.
La instruccin DAA, lo que hace es sumar 6 al valor de 41h para realizar el ajuste a BCD, sta
accin tiene lugar ya que es afectada la bandera de acarreo auxiliar.

2.2.3. Instrucciones de manipulacin de bits.

(TABLA 3)

Estas instrucciones manejan bits o secuencias de bits entre registros y posiciones de memoria. Pueden ser
clasificadas en tres grupos: Lgicas, Corrimiento y Rotacin.
2.2.3.1 Instrucciones Lgicas.
Es necesario mencionar la diferencia entre los operadores lgicos y las instrucciones lgicas. Los
operadores lgicos manejan solo constantes como operandos y son evaluadas en tiempo de compilacin. Las
instrucciones lgicas pueden manejar registros y operandos a memoria, son evaluadas en tiempo de ejecucin.
Estas instrucciones son las siguientes:
AND

Ejemplo:

AND dx, bx;

AND bx, var

OR

OR ax, dx

OR var, bx

XOR

XOR bl, 1

XOR bl, var

Pueden operar con nmeros tipo BYTE y tipo WORD.


TEST

Esta instruccin efecta una operacin AND con los operandos pero solo afecta a las banderas, no
altera el contenido de ninguno de los operandos. Es til para de acuerdo a las banderas alteradas
realizar saltos.

2.2.3.2 Instrucciones de corrimiento.


SHL

Corrimiento lgico a la izquierda. Hace un corrimiento dependiendo el nmero de bits desplazados


del valor del segundo operando. Ejemplo:
SHL di, cl

SHR

Corrimiento lgico a la derecha. Hace un corrimiento dependiendo el nmero de bits desplazados


del valor del segundo operando. Ejemplo:
SHR di, cl

SAL

Corrimiento aritmtico a la izquierda. Tiene el mismo efecto que la instruccin SHL.

SAR

Corrimiento aritmtico a la derecha. se utiliza para nmeros con signo, conserva el signo del
operando.

2.2.3.3 Instrucciones de Rotacin.


Estas instrucciones son similares a las de corrimiento, solo que conservan los bits desplazados
ponindolos de nuevo en el operando, pero en el lado contrario. Estas instrucciones afectan a las banderas CF y
OF. Dependiendo de la direccin de la rotacin el bit que sale es copiado en la bandera de ACARREO. La bandera
de sobreflujo, solamente se afecta por rotaciones de UN bit.
Anlisis de las instrucciones anteriormente comentadas.
Uso de las instrucciones ROL y AND.
Para ejemplificar el uso de este tipo de instrucciones, tomemos un nmero e imprimmoslo en pantalla en
binario.
Analicemos el algoritmo.
inicio

BL dato

CX # de bits

(rota un bit a la izquierda)


(temp) DL BL

(enmascara)
DL DL and 1

Convierte a carcter
DL DL + 30H

imprime

NO

SI
CX = 0
fin

Diagrama de flujo del programa 27.

COMMENT & ENSA28.ASM


Este programa usa ROL para extraer bits de un byte y mandarlos a la pantalla usando la funcin 2 del DOS
&
n_bits EQU 8
.MODEL Small
.STACK 100h

;Nmero de bits a mostrar

.DATA
abyte DB 0Fah
.CODE
inicio:
mov ax, @data
mov ds, ax
mov bl, abyte
mov cx, n_bits
mov ah, 2
muestra:
rol bl, 1
mov dl, bl
and dl, 1
add dl, 48
int 21h
loop muestra
mov ax, 4C00h
int 21h
END inicio

;El nmero es definido tipo BYTE por lo tanto mostramos 8 bits.

;Pone el dato en BL
;En CX se pone el # de bits
;Pone en AH, la funcin 2 del DOS
;Rota un bit BL a la izquierda
;Copia el valor en DL
;Se aisla el bit 0
;Convierte el bit a ASCII
;Ejecuta la funcin 2 del DOS

OBSERVACIONES.
Este programa nos muestra el nmero almacenado en el segmento de DATOS en la pantalla en
binario.
El nmero de bits a mostrar se lleva a cabo mediante la instruccin LOOP, se usa la funcin 2 de
INT 21h para mostrar un carcter en la pantalla.
Algoritmo a usar. Se coloca el nmero a mostrar en el registro BL, para iniciar imprimiendo el MSB
se hace una rotacin a la izquierda, con lo que el MSB queda en la posicin del LSB, el nmero en tales
condiciones se pasa a dl, pero antes de ejecutar la INT 21h se le hace una mascara con 0000 0001, para
tomar solo el bit de la primera posicin, l cual solo va a ser 0 1, para mandar a la pantalla su valor
ASCII, al valor resultante se le suma 48, (ASCII del CERO) y se manda a la pantalla, en la cual aparecer
un '1' un '0'.
ROL bl, 1
AND dl, 1

;BL BL rol 1
;DL DL and 1

2.2.4. Instrucciones de Transferencia de Control.

(TABLA 4)

Estas instrucciones alteran el contenido de los registros CS:IP, con lo cual se propicia que el programa
contine su ejecucin en otra parte del cdigo.
Se clasifican en: Incondicionales, Condicionales y de Bucle

2.2.4.1 Instrucciones de transferencia incondicional.


CALL

Usada para llamar a procedimientos, antes de llamar al procedimiento, almacena en la pila la


direccin de retorno. Su alcance puede ser NEAR o FAR.

RET

Se usa para retorno de procedimientos, saca de la pila la direccin almacenada por CALL.

JMP

Esta instruccin es equivalente en lenguajes de alto nivel a la instruccin GOTO, su alcance puede
ser NEAR o FAR.

2.2.4.2 Instrucciones de Transferencia condicional.


Existen 18 instrucciones diferentes que nos permiten tomar una decisin de salto basada en determinadas
condiciones (estado de las banderas). Si la condicin se cumple se realiza el salto, de lo contrario se contina en la
siguiente instruccin. Existen instrucciones de salto que aunque usan diferente mnemnico responden a la misma
condicin, por ejemplo: JA etiqueta, y JNBE etiqueta, el procesador las trata como si fuesen la misma instruccin.
Existe esta situacin en el ensamblador para una mayor comodidad del programador.
Las instrucciones de transferencia condicional tienen el formato:
Jx etiqueta_corta
Dnde:
x
etiqueta_corta

Es el modificador formado por una a tres letras.


Indica que el salto debe ser corto. (-128 a 127 bytes)

Uso de transferencia condicional con la instruccin CMP


La instrucciones de transferencia condicional, pueden llevar antes una instruccin que modifique el
contenido de las banderas, es comn que lleven la instruccin CMP. La siguiente tabla nos muestra como son
afectadas las banderas como resultado de la ejecucin de la instruccin CMP.
Condicin

OF

SF

ZF

CF

Operandos sin signo


Fuente < Destino
Fuente = Destino
Fuente > Destino

D
D
D

D
D
D

0
1
0

0
0
1

Operandos con signo


Fuente < Destino
Fuente = Destino
Fuente > Destino

0/1
0
0/1

0
0
1

0
1
0

D
D
D

NOTA:
D
1/0

= No importa.
= La bandera puede ser 0/1 dependiendo de los valores de los operandos.

Con la amplia gama de instrucciones de transferencia condicional de que se dispone, es bueno contar con
una gua que nos diga que instruccin usar para una dada situacin. Esto es mostrado en la siguiente tabla.

Despus de CMP
Saltar si
Destino > Fuente
Destino = Fuente
Destino <> Fuente
Destino < Fuente
Destino <= Fuente
Destino >= Fuente
2.2.4.3 Instrucciones de bucle.

#'s sin signo


JA
JE
JNE
JB
JBE
JAE

#'s con signo


JG
JE
JNE
JL
JLE
JGE

Estas instrucciones permiten que el procesador repita secciones completas de cdigo, son similares a las
instrucciones de lazo de los lenguajes de alto nivel.
LOOP

Es la instruccin bsica de este grupo, se pone en CX el nmero de veces que se desea repetir la
instruccin, repite una seccin de cdigo en tanto CX sea diferente de CERO. Esta instruccin
decrementa el registro CX cada vez que se efecta esta instruccin y no alterar ningn bit bandera
del registro banderas.

Existen algunas instrucciones alternativas a LOOP, las cuales son:


LOOPE
LOOPNE
LOOPZ
LOOPNZ

Repetir si es igual.
Equivale a LOOPZ
Repetir si no es igual. Equivale a LOOPNZ
Repetir si es CERO.
Equivale a LOOPE
Repetir si no es CERO. Equivale a LOOPNE

Estas instrucciones decrementan el registro CX sin alterar ninguna bandera, prueba si ZF = 1, esta
bandera pudo haber sido puesta por una instruccin como CMP
En LOOPE, LOOPZ. La ejecucin es transferida a la etiqueta si CX <> 0 y ZF = 1.
En LOOPNE, LOOPNZ. La ejecucin es transferida a la etiqueta si CX <> 0 y ZF = 0.
Ejemplos de instrucciones de transferencia condicional.
Uso de las instrucciones JE, JA y JMP. Instrucciones adicionales REPE y CMPSB
COMMENT & ENSA29.ASM
Este programa muestra el manejo de instrucciones condicionales JE, JA, JMP. Compara 2 cadenas,
una es puesta en DS:SI y la otra en ES:DI. Un (0) indica iguales. Un (1) indica que la cadena en DS:SI es
mayor que la en ES:DI. Un (-1) indica que la cadena en DS:SI es menor que la apuntada por ES:DI. El
identificador (0), (1) (-1) es colocado en AX &
.MODEL Small
.STACK 100h
.DATA
cad1 DB "Patricia"
cad2 DB "Tatiana"

;Cadena FUENTE en DS:DI


;Cadena DESTINO en ES:DI

.CODE
inicio:
mov ax, @data
mov ds, ax
mov es, ax
mov cx, 8
lea si, cad1
lea di, cad2
cld
xor ax, ax
repe cmpsb
je termina
ja mayor
dec ax
jmp termina

;Pone ambos registros DS y ES en la


;misma direccin.
;Nmero de caracteres a comparar
;Pone la direccin de cad1 en DS:SI
;Pone la direccin de cad2 en ES:DI
;Limpia la bandera de direccin
;Pone a CERO el registro AX
;Compara las cadenas
;Si iguales termina
;Va a la etiqueta mayor e incrementa AX
;Es menor, decrementa el registro AX
;Termina el programa

mayor:
inc ax
termina:

mov ax, 4C00h


int 21h
END inicio
OBSERVACIONES.
Este programa compara 2 cadenas, usando para ello bsicamente 2 instrucciones de manejo de cadenas.
Anlisis de las instrucciones:
- Para nmeros sin signo: JA, JB, JE y
- Para nmeros con signo: JG, JL
COMMENT + ENSA30.ASM. En este programa se muestra las diferentes instrucciones de salto condicional.+
.MODEL Small
.STACK 100h
.CONST
A1 DB "Destino > Fuente",10,13,'$'
A2 DB "Destino < Fuente",10,13,'$'
A3 DB "Destino = Fuente",10,13,'$'
A4 DB "Destino >= Fuente",10,13,'$'
A5 DB "Destino <= Fuente",10,13,'$'
TBL dw cmd1, cmd2, cmd3, cmd4
.DATA
a DB 88h
aa DB 88h
b DB 0A6h
c1 DB -90
c2 DB -90
d DB -120
.CODE
inicio:
mov ax, DGROUP
mov ds, ax
mov ah, 9
xor si, si
mov bl, b
cmp bl, a
ja uno
cmd1:
mov si, 2
mov bl, a
cmp bl, b
jb tres
cmd2:
mov si, 4
mov bl, a
cmp bl, aa
je cinco
cmd3:
mov si, 6
mov bl, c1
cmp bl, d
jg siete
cmd4:
mov si, 8
mov bl, d

;Se define un arreglo de punteros a las etiquetas de retorno.


;Equivalente a -120
;Equivalente a -90

;Destino - Fuente, A6h - 88h


;CF = 0 y ZF = 0

;Destino - Fuente, 88h - A6h


;CF = 1

;Destino - Fuente, 88h - 88h


;ZF = 1

;Destino - Fuente, A6h - 88h


;ZF = 0 y SF = OF

cmp bl, c1
jl nueve
uno:
lea dx, A1
int 21h
jmp TBL[si]
tres:
lea dx, A2
int 21h
jmp TBL[si]
cinco:
lea dx, A3
int 21h
jmp TBL[si]
siete:
lea dx, A1
int 21h
jmp TBL[si]
nueve:
lea dx, A2
int 21h
mov ax, 4C00h
int 21h
END inicio

;Destino - Fuente, 88h - A6h


;SF <> OF
;Lo que sigue es impresin de letreros.
;Se regresa a donde apunta SI

;Se regresa a donde apunta SI

;Se regresa a donde apunta SI

;Se regresa a donde apunta SI

OBSERVACIONES.
En este programa se evalan 2 nmeros sin signo y 2 nmeros con signo. En el caso de los
nmeros sin signo, las instrucciones de salto evalan solo las banderas de carry y de cero, en cambio en
las instrucciones condicionales para nmeros son signo, se tiene muy en cuenta tanto el signo como el
sobreflujo, por lo que son verificadas dichas banderas.
En este programa tambin se analiza la otra forma de la instruccin JMP, en donde la direccin de
retorno est en funcin del valor del registro SI. Los resultados obtenidos del programa son impresos en
pantalla.

Uso de la instruccin condicional JO; salta si OF = 1.


COMMENT * ENSA31.AS, Ejemplo de un sobreflujo.*
.MODEL Small
.STACK 100h
.DATA
a DB 99
;63h
b DB 200
:C8h
d DB -50
;CEh
e DB -100
;9Ch
sad DB "Hay Sobreflujo",10,13,24h
nad DB "NO hay sobreflujo",10,13,24h
.CODE
inicio:
mov ax, DGROUP
mov ds, ax
mov bl, a

add bl, b
jo uno
lea si, nad
jmp dos
uno:
lea si, sad
dos:
mov dx, si
mov ah, 9
int 21h
mov bl, d
add bl, e
jo tres
lea si, nad
jmp cuatro
tres:
lea si, sad
cuatro:
mov dx, si
mov ah, 9
int 21h
mov ax, 4C00h
int 21h
END inicio

;En este caso no se genera sobreflujo


;solo CF = 1

;Imprime [NO hay Sobreflujo]

;En este se genera sobreflujo OF = 1

;Imprime [Hay Sobreflujo]

OBSERVACIONES.
La computadora trata de igual manera los nmeros con signo y los nmeros sin signo, sin embargo
supone siempre que el bit ms significativo es el bit del signo, en este caso:
* Parte # 1. El bit del signo es diferente, supone que no hay sobreflujo. En el caso de suponer nmeros sin
signo el programador deber proporcionar los medios de deteccin de sobreflujo, el cual existe si CF = 1.
* Parte # 2. El bit del signo es igual en ambos operandos, entonces, existir sobreflujo si el bit del signo y el
bit del carry son diferentes, y este es el caso.
Uso de las instrucciones* JCXZ, JMP, REPNZ y SCAS.
COMMENT & ENSA32.ASM
En este programa vamos a ejemplificar el uso de las siguientes instrucciones: SCAS, REPNE, JCXZ y JMP.
El programa calcula la longitud de una cadena terminada en CERO colocando el resultado en la variable
result. &
maxlen EQU 255

;Longitud mxima de la cadena.

.MODEL Small
.STACK 100h
.DATA
cad DB 'Calculamos longitud de la cadena',0
result DW ?
.CODE
inicio:
mov ax, @data
mov ds, ax
mov es, ax
cld
mov cx, maxlen

;limpia bandera de direccin


;almacena en CX la longitud mxima

mov al, 0
lea di, cad
mov dx, di
repne scasb
jcxz max_long
mov cx, di
sub cx, dx
mov result, cx
jmp SHORT fin
max_long:
mov cx, maxlen
mov result, cx
fin:
mov ax, 4C00h
int 21h
END inicio

;Valor a encontrar
;DI offset del primer byte de cad ES:DI
;Guarda offset de inicio
;Realiza la bsqueda
;Salta si no encontr el 0 en 255 bytes
;Inicia el clculo de la longitud
; CX CX - DX
;Pone longitud en result
;Termina el programa
;Pone en result el valor de 255
;indica que no encontr el CERO

OBSERVACIONES.
Para detectar la longitud de la cadena, definimos la cadena terminada en nulo, y colocamos un
CERO en AL, ste ser el valor a encontrar, usamos SCASB en unin con REPNE, lo que significa que
vamos a repetir SCASB mientras ZF = 0, esto es, mientras no encontremos coincidencia. Si recorremos los
255 caracteres y no encontramos el nulo, ponemos en result un 0FF, lo que indica que no fue encontrado el
nulo y esta longitud no es verdica. Si recorremos los 255 caracteres CX = 0, lo que ocasionar que se
realice el salto ya que JCXZ, salta si CX = 0.
Si encontramos el nulo, salimos del ciclo REPNE y calculamos la longitud haciendo una resta
desde la posicin en que salimos menos el inicio de la cadena, cuyo desplazamiento lo almacenamos en
DX, luego este valor lo guardamos en la variable RESULT.

2.2.5. Instrucciones de manejo de cadenas.

(TABLA 5)

Estas instrucciones nos permiten operar con bloques consecutivos de bytes, de words
80386). Estos bloques de cadenas pueden tener una longitud hasta de 64 KB. Estas
proporcionan siete operaciones bsicas llamadas primitivas, que procesan las cadenas de
WORD DWORD. Las operaciones bsicas son; mover, comparar, rastrear, cargar,
entrada/salida.

( dwords para el
instrucciones nos
elementos BYTE,
almacenar, y de

2.2.5.1 Instrucciones de movimiento.


MOVSx

Donde x puede ser (B) (W). Esta instruccin copia un BYTE o WORD de una rea de memoria a
otra. Es necesario definir el estado de la bandera de direccin.

2.2.5.2 Instrucciones de comparacin de cadenas.


CMPSx

Donde x puede ser (B), (W). Esta instruccin compara 2 cadenas en donde una deber estar
apuntada por DS:SI y la otra por ES:DI, en cada comparacin realiza una resta, (Fuente - destino)
afectando las banderas dependiendo del resultado de la resta, ni el operando fuente ni el operando
destino son afectados. SI y DI son ajustados de acuerdo al tamao del operando y son
incrementados o decrementados de acuerdo a la bandera de direccin. Si esta es puesta a CERO
(CLD), se incrementan. Di es puesta a UNO (STD) se decrementan.

2.2.5.3 Instrucciones de bsqueda de caracteres.


SCASx

Donde x puede ser (B) (W). Rastrea una cadena buscando el carcter almacenado en el

acumulador, la direccin de la cadena rastreada es colocada en ES:DI. Cada elemento es restado


del acumulador y las banderas son afectadas de acuerdo al valor de la resta., DI es ajustado de
acuerdo al tamao del elemento y es incrementado o decrementado dependiendo del estado de la
bandera de direccin.
2.2.5.4 Instrucciones de carga y almacenamiento.
LODS
STOS

LODSB. Carga una cadena ((B) un byte, (W) un word) de una localidad de memoria al acumulador,
la localidad de memoria que es cargada en el acumulador es aquella cuya direccin se encuentra
en DS:SI. SI es ajustado de acuerdo al tamao del operando.
STOSB. ((B) byte, (W) word) Almacena el valor que se encuentra en el acumulador en una
localidad de memoria, la localidad de memoria a donde es cargado el dato del acumulador debe
estar definida en DS:DI . DI es ajustado de acuerdo al tamao del operando.

2.2.5.5 Instrucciones de entrada y salida de cadenas.


Estas instrucciones son similares a las instrucciones IN y OUT, excepto que transfieren datos desde la
memoria o a la memoria en vez de hacerlo a o desde un registro.
INS
Recibe una cadena de un puerto. DX contiene el nmero de puerto. La direccin de inicio de la
cadena deber estar en el par ES:DI, DI es ajustado de acuerdo al tamao del operando y el
avance de DI depender del estado de la bandera de direccin.
OUTS
Enva una cadena a un puerto. DX contiene el nmero de puerto. La direccin de inicio de la
cadena deber estar en DS:SI. SI es ajustado de acuerdo al tamao del operando y el avance de
SI depender del estado de la bandera de direccin.
Ejemplo de algunas de estas instrucciones ya fueron mencionados en programas anteriores en esta
seccin.

2.2.6. Instrucciones de control del procesador.

(TABLA 6)

Estas instrucciones nos permiten regular el funcionamiento del procesador dentro de un programa. Existen
tres tipos de instrucciones de control del procesador:
2.2.6.1 Operaciones con las banderas.
Estas instrucciones nos permiten cambiar las siguientes banderas CF, DF e IF.
CLC

Limpia la bandera de acarreo.

STC

Pone en (1) la bandera de acarreo.

CMC

Complementa la bandera de acarreo.

CLD

Limpia la bandera de direccin.

STD

Pone en (1) la bandera de direccin.

CLI

Limpia la bandera de interrupcin.

STI

Pone en (1) la bandera de interrupcin.

2.2.6.2 Operaciones de sincronizacin externa.


Estas instrucciones nos permiten sincronizar el procesador con dispositivos externos.

HALT

Esta instruccin detiene la ejecucin del procesador, permanece en espera, sin ejecutar
instrucciones, sale de este estado solo si se inicializa el sistema o recibe una interrupcin externa.

WAIT

Pone al procesador en estado de espera, aunque sigue verificando la lnea de entrada TEST a
intervalos de 5 ciclos de reloj, puede responder a las interrupciones mientras esta en estado de
espera, aunque despus de regresar de la rutina de interrupcin sigue en estado de espera. Si
TEST se activa el procesador contina con la siguiente instruccin despus de WAIT. Esta
instruccin se usa normalmente para evitar que el procesador intervenga cuando esta trabajando
el coprocesador.
Simplemente propicia que el procesador tome el contenido de un operando y lo ponga en el bus de
datos para que pueda ser tomado por otro procesador, por ejemplo el coprocesador. El MASM
inserta automticamente instrucciones ESC en instrucciones del coprocesador.
Este prefijo puede ir antes de cualquier instruccin, activa la seal LOCK del micro, la cual evita
que otro procesador pueda utilizar el bus.

ESC
LOCK

2.2.6.3 Operaciones de NO OPERACION.


Esta instruccin como su nombre lo indica no hace absolutamente nada, solamente incrementa el registro
IP.
COMMENT * ENSA33.ASM. Uso de la instruccin WAIT*
.MODEL Small
.STACK 100h
.DATA
x DQ 4.25
y DQ 3.5
z DQ ?
.CODE
inicio:
mov ax, @data
mov ds, ax
fld QWORD PTR x
fadd QWORD PTR y
fstp QWORD PTR Z
wait
mov ax, 4C00h
int 21h
END inicio

;Se definen nmeros reales de 8 bytes.

;Carga X en el stack del 80x87


;Suma Y al tope del stack
;Almacena el resultado del tope del stack a Z
;Espera la seal de terminacin del 80x87

OBSERVACIONES.
La operacin realizada por el programa es:
ST(0) ST(0) + Y
7.75 4.25 + 3.5
FLD
FADD
FSTP

Pone en el STACK del coprocesador el operando indicado.


Suma el operando en memoria con el operando que se encuentra en el tope del STACK del
coprocesador, el resultado lo deja en el tope de la pila del coprocesador.
Saca el operando del tope del STACK del coprocesador y lo pone en memoria, en la direccin
indicada por el operando.

En realidad no es necesario indicar ninguna instruccin WAIT, en cada acceso al coprocesador, son
generadas automticamente por el MASM, esto lo podemos observar al desensamblar el programa.

Tablas de clasificacin de instrucciones de la familia de INTEL.


TABLA # 1 Instrucciones de transferencia de Datos.
Formato ENSAMBLADOR

OF

Uso general
MOV
PUSH
PUSH
POP
XCHG
XLAT

destino, fuente
fuente
inmediato
destino
destino, fuente
tabla-fuente

Entrada/Salida
IN
OUT

acum, puerto
puerto, acum

Transferencia de direcciones.
LEA

reg16, mem

DF

IF

Banderas
TF SF ZF

AF

PF

CF

LDS
LES

reg16, mem
reg16, mem

Estado de las banderas.


1

Pone la bandera.

Limpia la bandera.

Puede cambiar la bandera pero su valor no es predecible.

blanco

No se afecta la bandera.

Modifica la bandera acorde a las reglas asociadas con ello.

TABLA # 2. Instrucciones aritmticas.


Formato ENSAMBLADOR
OF
Suma
ADD
ADC
AAA
DAA
INC

dest, fuente
dest, fuente

dest

DF

IF

Banderas
TF SF ZF

AF

PF

CF

?
?

?
?

Resta
SUB
SBB
AAS
DAS
DEC
NEG
CMP

dest, fuente
dest, fuente

dest
dest
dest, fuente

Multiplicacin.
MUL
IMUL
IMUL
IMUL
AAM

fuente
fuente
reg16,immed
reg16,fuen,immd

?
?
?
?

?
?
?
?

?
?
?
?
?

?
?
?
?

fuente
fuente

?
?
?

?
?

?
?

?
?
?

?
?

?
?
?

Divisin.
DIV
IDIV
ADD

Aadir signo
CBW
CWD
TABLA # 3. Instrucciones de manipulacin de bits.
Formato ENSAMBLADOR

OF

DF

IF

Banderas
TF SF ZF

AF

PF

CF

Lgicas.
AND
OR
XOR
NOT
TEST

dest,
dest,
dest;
dest
dest,

fuente
fuente
fuente

0
0
0

?
?
?

0
0
0

fuente

1
CL
1
CL
1
CL

?
0
?

0
0

?
?
?
?
?
?

De corrimiento.
SAL
SAL
SAR
SAR
SHR
SHR

dest,
dest,
dest,
dest,
dest,
dest,

De rotacin.

ROL
ROL
ROR
ROR
RCL
RCL
RCR
RCR

dest,
dest,
dest,
dest,
dest,
dest,
dest,
dest,

1
CL
1
CL
1
CL
1
CL

TABLA # 4. Instrucciones de transferencia de control.


Formato ENSAMBLADOR
Transferencia incondicional.
CALL
RET
JMP

dest
[valor pila]
dest

Transferencia condicional.
JA
JEA
JB
JBE
JCXZ
JE
JG
JGE
JL
JLE
JNC
JNE
JNO
JNP
JNS

etiqueta
etiqueta
etiqueta
etiqueta
etiqueta
etiqueta
etiqueta
etiqueta
etiqueta
etiqueta
etiqueta
etiqueta
etiqueta
etiqueta
etiqueta

corta
corta
corta
corta
corta
corta
corta
corta
corta
corta
corta
corta
corta
corta
corta

OF

DF

IF

Banderas
TF SF ZF

AF

PF

CF

JO
JP
JS

etiqueta corta
etiqueta corta
etiqueta corta

Ciclos
LOOP
LOOPE
LOOPNE

etiqueta corta
etiqueta corta
etiqueta corta

Descripcin de las instrucciones de transferencia condicional.


Instruccin

Descripcin

JA
JAE
JB
JBE
JC
JCXZ
JE
JG
JGE
JL
JLE
JNA
JNAE
JNB
JNBE
JNC
JNE
JNG
JNGE
JNL
JNLE
JNO
JNP
JNS
JNZ
JO

Salta si est por encima


Salta si est por encima o igual
Salta si est por abajo
Salta si est por abajo o igual
Salta si hay acarreo
Salta si CX es cero
Salta si es igual
Salta si es mayor
Salta si es mayor o igual
Salta si es menor
Salta si es menor o igual
Salta si no est por encima
Salta si no est por encima ni es igual
Salta si no est por abajo
Salta si no est por abajo ni es igual
Salta si no hay acarreo
Salta si no es igual
Salta si no es mayor
Salta si no es mayor ni igual
Salta si no es menor
Salta si no es menor ni igual
Salta si no hay sobreflujo
Salta si no hay pariedad (es pariedad impar) (odd)
Salta si no hay signo (signo positivo)
Salta si no es cero
Salta si hay sobreflujo

Banderas
CF = 0 y ZF = 0
CF = 0
CF = 1
CF = 1 y ZF = 1
CF = 1
(CX) = 0
ZF = 1
ZF = 0 y SF = OF
SF = OF
SF <> OF
ZF = 1 o SF <> OF
CF = 1 o ZF = 1
CF = 1
CF = 0
CF = 0 y ZF = 0
CF = 0
ZF = 0
ZF = 1 o SF <> OF
SF <> OF
SF = OF
ZF = 0 y SF = OF
OF = 0
PF = 0
SF = 0
ZF = 0
OF = 1

JP
JPE
JPO
JS
JZ

Salta si hay pariedad (es pariedad par)


Salta si hay pariedad par
Salta si hay pariedad impar
Salta si hay signo (signo negativo)
Salta si es cero

(even)
(even)
(odd)

PF = 1
PF = 1
PF = 0
SF = 1
ZF = 1

TABLA # 5. Instrucciones de manejo de cadenas.


Formato ENSAMBLADOR

OF

DF

IF

Banderas
TF SF ZF

AF

PF

CF

Repeticin de prefijos.
REP
PERE
REPNE
Mover.
MOVS
MOVSB
MOVSW
Comparar.
CMPS
CMPSB
CMPSW

Buscar
SCAS
SCASB
SCASW

Comparar y almacenar
LODS
LODSB

LODSW
STOS
STOSB
STOSW
Entrada/Salida
INS
INSB
INSW
OUTS
OUTSB
OUTSW

TABLA # 6. Instrucciones de Control del procesador.


Formato ENSAMBLADOR

OF

DF

IF

Banderas
TF SF ZF

AF

PF

CF

Operaciones con banderas.


CLS
STC
CMC
CLD
STD
CLI
STI

Sincronizacin externa.
HALT
WAIT
ESC
LOCK
No operacin.
NOP

0
1

0
1
0
1

Вам также может понравиться