Академический Документы
Профессиональный Документы
Культура Документы
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
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
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.
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
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
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
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
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
jmp
--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
INT
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
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.
.MODEL SMALL
.CODE
ORG 100h
inicio:
nop
END inicio
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.
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?
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.
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
;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.
SS
Uno o ms segmentos
de clase DATA
Uno o ms segmentos
de clase CODE
Punto de entrada
CS:IP
PSP
DS, ES
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
'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
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
SEGMENTO DE CODIGO.
CODE
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
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.
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.
.MODEL SMALL
.STACK
.CODE
inicio:
nop
END inicio
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.
.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
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.
.DATA
Dato DB 'Hola$'
.CODE
inicio:
mov ax, @DATA
mov ds, ax
mov dx, OFFSET Dato
mov ah, 9h
INT 21h
mov ax, 4c00h
INT 21h
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
inicio:
mov ax, DATA
mov ds, ax
mov dx, OFFSET Dato
mov ah, 9h
INT 21h
mov ax, 4c00h
INT 21h
CODE ENDS
END inicio
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
-r
A:\USER\>DEBUG ENSA02A.EXE
[ENTER]
3875:0000 EB05
-t
JMP
0007
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
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.
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.
presiona F7.
8) TECLAS CALIENTES DEL CV.
Tecla
Funcin
F1
F2
F3
F4
F5
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
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.
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
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
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
;Mantiene consistencia en el orden de los segmentos con los lenguajes de Alto Nivel
.MODEL Small
.STACK 100h
.DATA
x
DW 100, 1000, 10000, 40000
y
DW 4 dup(?)
.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
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
METER A LA PILA
SACAR DE LA PILA
SP
0F8 Dir. inicial
(pop)
STACK
0100H
00FFH
00FEH
00FDH
00FCH
00FBH
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
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
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
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
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:
;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
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
1214h
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
# de bytes
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
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
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
1
Offset
2
3
Segmento
Ejemplo.
cadena DB
"Hola muchachas",0
apuntaca DW cadena
fpuntacad DD cadena
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
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)
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)
(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)
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
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
[]
:
[[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
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
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
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
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
.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
106C:0013 8B3E3E00
-t
MOV
DI,[003E]
DS:003E=2010
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
(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
;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
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.
Instrucciones Aritmticas. Efectan operaciones de suma, resta, multiplicacin y divisin, usando los
diferentes tipos de datos definidos en ensamblador.
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.
(TABLA 1)
PUSH
POP
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
LEA
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
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
;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
.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
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.
(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
NEG
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
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
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
.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.
.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 ?
.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.
;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
suma:
mov ax, 0
lodsb
adc al, [bx]
aaa
stosb
inc bx
loop suma
xchg ah, al
stosb
.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
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.
(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:
OR
OR ax, dx
OR var, bx
XOR
XOR bl, 1
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.
SHR
SAL
SAR
Corrimiento aritmtico a la derecha. se utiliza para nmeros con signo, conserva el signo del
operando.
BL dato
CX # de bits
(enmascara)
DL DL and 1
Convierte a carcter
DL DL + 30H
imprime
NO
SI
CX = 0
fin
.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
;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
(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
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.
OF
SF
ZF
CF
D
D
D
D
D
D
0
1
0
0
0
1
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.
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.
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"
.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
mayor:
inc ax
termina:
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
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.
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
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
.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
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.
(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
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.
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.
Donde x puede ser (B) (W). Rastrea una cadena buscando el carcter almacenado en el
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.
(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
STC
CMC
CLD
STD
CLI
STI
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
OBSERVACIONES.
La operacin realizada por el programa es:
ST(0) ST(0) + Y
7.75 4.25 + 3.5
FLD
FADD
FSTP
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.
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
Pone la bandera.
Limpia la bandera.
blanco
No se afecta la bandera.
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
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
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
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
(even)
(even)
(odd)
PF = 1
PF = 1
PF = 0
SF = 1
ZF = 1
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
OF
DF
IF
Banderas
TF SF ZF
AF
PF
CF
Sincronizacin externa.
HALT
WAIT
ESC
LOCK
No operacin.
NOP
0
1
0
1
0
1