Instrucciones de 8086 y 8088
por Dario Alejandro Alpern
INSTRUCCIONES DE TRANSFERENCIA DE DATOS (No afectan flags)
- MOV dest,src
- Copia el contenido del operando fuente (src) en
el destino (dest).
Operaci�n: dest <- src
Las posibilidades son:
- MOV reg,{reg|mem|inmed}
- MOV mem,{reg|inmed}
- MOV {reg16|mem16},{CS|DS|ES|SS}
- MOV {DS|ES|SS},{reg16|mem16}
- PUSH src
- Pone el valor en el tope del stack.
Operaci�n: SP <- SP - 2, [SP+1:SP] <- src donde
src = {reg16|mem16|CS|DS|ES|SS}.
- POP dest
- Retira el valor del tope del stack poni�ndolo en el
lugar indicado.
Operaci�n: dest <- [SP+1:SP], SP <- SP + 2
donde dest = {reg16|mem16|DS|ES|SS}.
- XCHG reg,{reg|mem}
- Intercambia ambos valores.
- IN {AL|AX},{DX|inmed (1 byte)}
- Pone en el acumulador el valor hallado
en el port indicado.
- OUT {DX|inmed (1 byte)},{AL|AX}
- Pone en el port indicado el valor del
acumulador.
- XLAT
- Realiza una operaci�n de traducci�n de un c�digo
de un byte a otro c�digo de un byte mediante una tabla.
Operaci�n: AL <- [BX+AL]
- LEA reg,mem
- Almacena la direcci�n efectiva del operando de
memoria en un registro.
Operaci�n: reg <- direcci�n mem
- LDS reg,mem32
- Operaci�n: reg <- [mem], DS <- [mem+2]
- LES reg,mem32
- Operaci�n: reg <- [mem], ES <- [mem+2]
- LAHF
- Copia en el registro AH la imagen de los ocho bits menos
significativos del registro de indicadores.
Operaci�n: AH <- SF:ZF:X:AF:X:PF:X:CF
- SAHF
- Almacena en los ocho bits menos significativos del registro de
indicadores el valor del registro AH.
Operaci�n: SF:ZF:X:AF:X:PF:X:CF <- AH
- PUSHF
- Almacena los flags en la pila.
Operaci�n: SP <- SP - 2, [SP+1:SP] <- Flags.
- POPF
- Pone en los flags el valor que hay en la pila.
Operaci�n: Flags <- [SP+1:SP], SP <- SP + 2
INSTRUCCIONES ARITMETICAS (Afectan los flags AF, CF, OF, PF, SF, ZF)
- ADD dest,src
- Operaci�n: dest <- dest + src.
- ADC dest,src
- Operaci�n: dest <- dest + src + CF.
- SUB dest,src
- Operaci�n: dest <- dest - src.
- SBB dest,src
- Operaci�n: dest <- dest - src - CF.
- CMP dest,src
- Operaci�n: dest - src (s�lo afecta flags).
- INC dest
- Operaci�n: dest <- dest + 1 (no afecta CF).
- DEC dest
- Operaci�n: dest <- dest - 1 (no afecta CF).
- NEG dest
- Operaci�n: dest <- - dest.
donde dest = {reg|mem} y src = {reg|mem|inmed} no
pudiendo ambos operandos estar en memoria.
- DAA
- Corrige el resultado de una suma de dos valores BCD empaquetados
en el registro AL (debe estar inmediatamente despu�s de una instrucci�n
ADD o ADC). OF es indefinido despu�s de la operaci�n.
- DAS
- Igual que DAA pero para resta (debe estar inmediatamente despu�s
de una instrucci�n SUB o SBB).
- AAA
- Lo mismo que DAA para n�meros BCD desempaquetados.
- AAS
- Lo mismo que DAS para n�meros BCD desempaquetados.
- AAD
- Convierte AH:AL en BCD desempaquetado a AL en binario.
Operaci�n: AL <- AH * 0Ah + AL, AH <- 0. Afecta PF, SF,
ZF, mientras que AF, CF y OF quedan indefinidos.
- AAM
- Convierte AL en binario a AH:AL en BCD desempaquetado.
Operaci�n: AH <- AL / 0Ah, AL <- AL mod 0Ah. Afecta PF,
SF, ZF, mientras que AF, CF y OF quedan indefinidos.
- MUL {reg8|mem8}
- Realiza una multiplicaci�n con operandos no
signados de 8 por 8 bits.
Operaci�n: AX <- AL * {reg8|mem8}. CF=OF=0 si AH = 0, CF=OF=1
en caso contrario. AF, PF, SF, ZF quedan indefinidos.
- MUL {reg16|mem16}
- Realiza una multiplicaci�n con operandos no
signados de 16 por 16 bits.
Operaci�n: DX:AX <- AX * {reg16|mem16}. CF=OF=0 si DX = 0,
CF=OF=1 en caso contrario. AF, PF, SF, ZF quedan indefinidos.
- IMUL {reg8|mem8}
- Realiza una multiplicaci�n con operandos con
signo de 8 por 8 bits.
Operaci�n: AX <- AL * {reg8|mem8} realizando la multiplicaci�n
con signo. CF = OF = 0 si el resultado entra en un byte, en caso contrario
valdr�n 1. AF, PF, SF, ZF quedan indefinidos.
- IMUL {reg16|mem16}
- Realiza una multiplicaci�n con operandos con
signo de 16 por 16 bits.
Operaci�n: DX:AX <- AX * {reg16|mem16} realizando la multiplicaci�n
con signo. CF = OF = 0 si el resultado entra en dos bytes, en caso contrario
valdr�n 1. AF, PF, SF, ZF quedan indefinidos.
- CBW
- Extiende el signo de AL en AX. No se afectan los flags.
- CWD
- Extiende el signo de AX en DX:AX. No se afectan flags.
INSTRUCCIONES LOGICAS (Afectan AF, CF, OF, PF, SF, ZF)
- AND dest,src
- Operaci�n: dest <- dest and src.
- TEST dest,src
- Operaci�n: dest and src. S�lo afecta flags.
- OR dest,src
- Operaci�n: dest <- dest or src.
- XOR dest,src
- Operaci�n: dest <- dest xor src.
Las cuatro instrucciones anteriores ponen CF = OF = 0, AF queda indefinido y
PF, SF y ZF dependen del resultado.
- NOT dest
- Operaci�n: dest <- Complemento a 1 de dest.
No afecta los flags.
- SHL/SAL dest,{1|CL}
- Realiza un desplazamiento l�gico o
aritm�tico a la izquierda.
- SHR dest,{1|CL}
- Realiza un desplazamiento l�gico a la derecha.
- SAR dest,{1|CL}
- Realiza un desplazamiento aritm�tico a la derecha.
- ROL dest,{1|CL}
- Realiza una rotaci�n hacia la izquierda.
- ROR dest,{1|CL}
- Realiza una rotaci�n hacia la derecha.
- RCL dest,{1|CL}
- Realiza una rotaci�n hacia la izquierda usando el CF.
- RCR dest,{1|CL}
- Realiza una rotaci�n hacia la derecha usando el CF.
En las siete instrucciones anteriores la cantidad de veces que se rota o desplaza
puede ser un bit o la cantidad de bits indicado en CL.
INSTRUCCIONES DE MANIPULACION DE CADENAS:
- MOVSB
- Copiar un byte de la cadena fuente al destino.
Operaci�n:
- ES:[DI] <- DS:[SI] (un byte)
- DI <- DI�1
- SI <- SI�1
- MOVSW
- Copiar dos bytes de la cadena fuente al destino.
Operaci�n:
- ES:[DI] <- DS:[SI] (dos bytes)
- DI <- DI�2
- SI <- SI�2
- LODSB
- Poner en el acumulador un byte de la cadena fuente.
Operaci�n:
- AL <- DS:[SI] (un byte)
- SI <- SI�1
- LODSW
- Poner en el acumulador dos bytes de la cadena fuente.
Operaci�n:
- AX <- DS:[SI] (dos bytes)
- SI <- SI�2
- STOSB
- Almacenar en la cadena destino un byte del acumulador.
Operaci�n:
- ES:[DI] <- AL (un byte)
- DI <- DI�1
- STOSW
- Almacenar en la cadena destino dos bytes del acumulador.
Operaci�n:
- ES:[DI] <- AX (dos bytes)
- DI <- DI�2
- CMPSB
- Comparar un byte de la cadena fuente con el destino.
Operaci�n:
- DS:[SI] - ES:[DI] (Un byte, afecta s�lo los flags)
- DI <- DI�1
- SI <- SI�1
- CMPSW
- Comparar dos bytes de la cadena fuente con el destino.
Operaci�n:
- DS:[SI] - ES:[DI] (Dos bytes, afecta s�lo los flags)
- DI <- DI�2
- SI <- SI�2
- SCASB
- Comparar un byte del acumulador con la cadena destino.
Operaci�n:
- AL - ES:[DI] (Un byte, afecta s�lo los flags)
- DI <- DI�1
- SCASW
- Comparar dos bytes del acumulador con la cadena destino.
Operaci�n:
- AX - ES:[DI] (Dos byte, afecta s�lo los flags)
- DI <- DI�2
En todos los casos el signo + se toma si el indicador DF vale cero. Si vale 1
hay que tomar el signo -.
Prefijo para las instrucciones MOVSB, MOVSW, LODSB, LODSW, STOSB y STOSW:
- REP: Repetir la instrucci�n CX veces.
Prefijos para las instrucciones CMPSB, CMPSW, SCASB, SCASW:
- REPZ/REPE: Repetir mientras que sean iguales hasta un m�ximo
de CX veces.
- REPNZ/REPNE: Repetir mientras que sean diferentes hasta un
m�ximo de CX veces.
INSTRUCCIONES DE TRANSFERENCIA DE CONTROL (No afectan los flags):
- CALL label
- Ir al procedimiento cuyo inicio es label.
- RET
- Retorno de procedimiento.
- RET inmed
- Retorno de procedimiento y SP <- SP + inmed.
Variaciones de la instrucci�n de retorno:
- RETN [inmed]
- En el mismo segmento de c�digo.
- RETF [inmed]
- En otro segmento de c�digo.
Saltos condicionales aritm�ticos (usar despu�s de CMP):
- Aritm�tica signada (con n�meros positivos, negativos y cero)
- JL etiqueta/JNGE etiqueta
- Saltar a etiqueta si es menor.
- JLE etiqueta/JNG etiqueta
- Saltar a etiqueta si es menor o igual.
- JE etiqueta
- Saltar a etiqueta si es igual.
- JNE etiqueta
- Saltar a etiqueta si es distinto.
- JGE etiqueta/JNL etiqueta
- Saltar a etiqueta si es mayor o igual.
- JG etiqueta/JNLE etiqueta
- Saltar a etiqueta si es mayor.
- Aritm�tica sin signo (con n�meros positivos y cero)
- JB etiqueta/JNAE etiqueta
- Saltar a etiqueta si es menor.
- JBE etiqueta/JNA etiqueta
- Saltar a etiqueta si es menor o igual.
- JE etiqueta
- Saltar a etiqueta si es igual.
- JNE etiqueta
- Saltar a etiqueta si es distinto.
- JAE etiqueta/JNB etiqueta
- Saltar a etiqueta si es mayor o igual.
- JA etiqueta/JNBE etiqueta
- Saltar a etiqueta si es mayor.
Saltos condicionales seg�n el valor de los indicadores:
- JC label
- Saltar si hubo arrastre/pr�stamo (CF = 1).
- JNC label
- Saltar si no hubo arrastre/pr�stamo (CF = 0).
- JZ label
- Saltar si el resultado es cero (ZF = 1).
- JNZ label
- Saltar si el resultado no es cero (ZF = 0).
- JS label
- Saltar si el signo es negativo (SF = 1).
- JNS label
- Saltar si el signo es positivo (SF = 0).
- JP/JPE label
- Saltar si la paridad es par (PF = 1).
- JNP/JPO label
- Saltar si la paridad es impar (PF = 0).
Saltos condicionales que usan el registro CX como contador:
- LOOP label
- Operaci�n: CX <- CX-1. Saltar a label si CX<>0.
- LOOPZ/LOOPE label
- Operaci�n: CX <- CX-1. Saltar a label si CX <> 0 y ZF = 1.
- LOOPNZ/LOOPNE label
- Operaci�n: CX <- CX-1. Saltar a label si CX <> 0 y ZF = 0.
- JCXZ label
- Operaci�n: Salta a label si CX = 0.
Interrupciones:
- INT n�mero
- Salva los flags en la pila, hace TF=IF=0 y ejecuta
la interrupci�n con el n�mero indicado.
- INTO
- Interrupci�n condicional. Si OF = 1, hace INT 4.
- IRET
- Retorno de interrupci�n. Restaura los indicadores del stack.
INSTRUCCIONES DE CONTROL DEL PROCESADOR
- CLC
- CF <- 0.
- STC
- CF <- 1.
- CMC
- CF <- 1 - CF.
- NOP
- No hace nada.
- CLD
- DF <- 0 (Direcci�n ascendente).
- STD
- DF <- 1 (Direcci�n descendente).
- CLI
- IF <- 0 (Deshabilita interrupciones enmascarables).
- STI
- IF <- 1 (Habilita interrupciones enmascarables).
- HLT
- Detiene la ejecuci�n del procesador hasta que llegue una interrupci�n externa.
- WAIT
- Detiene la ejecuci�n del procesador hasta que se active el pin TEST del mismo.
- LOCK
- Prefijo de instrucci�n que activa el pin LOCK del procesador.
OPERADORES
Operadores aritm�ticos
+, -, *, /,
MOD (resto de la divisi�n).
Operadores l�gicos AND, OR, XOR, NOT,
SHR, SHL.
Para los dos �ltimos operadores, el operando derecho indica la cantidad
de bits a desplazar hacia la derecha (para SHR) o izquierda (para SHL)
el operando izquierdo.
Operadores relacionales
Valen cero si son falsos y 65535 si son verdaderos.
- EQ: Igual a.
- NE: Distinto de.
- LT: Menor que.
- GT: Mayor que.
- LE: Menor o igual a.
- GE: Mayor o igual a.
Operadores anal�ticos
Descomponen operandos que representan
direcciones de memoria en sus componentes.
SEG memory-operand: Retorna el valor del segmento.
OFFSET memory-operand: Retorna el valor del offset.
TYPE memory-operand: Retorna un valor que representa el tipo de
operando: BYTE = 1, WORD = 2, DWORD = 4 (para direcciones de datos) y NEAR =
-1 y FAR = -2 (para direcciones de instrucciones).
LENGHT memory-operand: Se aplica solamente a direcciones de
datos. Retorna un valor num�rico para el n�mero de unidades
(bytes, words o dwords) asociados con el operando. Si el operando es una
cadena retorna el valor 1.
Ejemplo: Dada la directiva PALABRAS DW 50 DUP (0), el valor de
LENGHT PALABRAS es 50, mientras que dada la directiva CADENA DB
"cadena" el valor de LENGHT CADENA es 1.
SIZE memory-operand: LENGHT memory-operand *
TYPE memory-operand.
Operadores sint�ticos
Componen operandos de direcciones de
memoria a partir de sus componentes.
type PTR memory-operand: Compone un operando de memoria
que tiene el mismo segmento y offset que el especificado en el operando
derecho pero con el tipo (BYTE, WORD, DWORD, NEAR o FAR) especificado en el
operando izquierdo.
THIS type: Compone un operando de memoria con el tipo especificado
que tiene el segmento y offset que la pr�xima ubicaci�n a
ensamblar.
Operadores de macros
Son operadores que se utilizan en las definiciones
de macros. Hay cinco: &, <>, !, % y ;;.
&par�metro: reemplaza el par�metro con el valor actual
del argumento.
<texto>: trata una serie de caracteres como una sola cadena.
Se utiliza cuando el texto incluye comas, espacios u otros s�mbolos
especiales.
!car�cter: trata el car�cter que sigue al operador
! como un car�cter en vez de un s�mbolo o separador.
%texto: trata el texto que sigue a continuaci�n del
operador % como una expresi�n. El ensamblador calcula el valor
de la expresi�n y reemplaza el texto por dicho valor.
sentencia ;;comentario: Permite definir comentarios que
aparecer�n en la definici�n de la macro pero no cada vez que
�ste se invoque en el listado fuente que genera el ensamblador.
DIRECTIVAS (Instrucciones para el ensamblador)
Definici�n de s�mbolos
EQU: Define nombres simb�licos que representan valores u otros
valores simb�licos. Las dos formas son:
nombre EQU expresi�n
nuevo_nombre EQU viejo_nombre
Una vez definido un nombre mediante EQU, no se puede volver a definir.
=: Es similar a EQU pero permite que el s�mbolo se pueda
redefinir. S�lo admite la forma: nombre = expresi�n.
Definici�n de datos
Ubica memoria para un �tem de datos
y opcionalmente asocia un nombre simb�lico con esa direcci�n de
memoria y/o genera el valor inicial para ese �tem.
[nombre] DB valor_inicial [, valor_inicial...]
donde valor_inicial puede ser una cadena o una expresi�n
num�rica cuyo resultado est� entre -255 y 255.
[nombre] DW valor_inicial [, valor_inicial...]
donde valor_inicial puede ser una expresi�n num�rica
cuyo resultado est� entre -65535 y 65535 o un operando de memoria en
cuyo caso se almacenar� el offset del mismo.
[nombre] DD valor_inicial [, valor_inicial...]
donde valor_inicial puede ser una constante cuyo valor est�
entre -4294967295 y 4294967295, una expresi�n num�rica cuyo
valor absoluto no supere 65535, o bien un operando de memoria en cuyo caso
se almacenar�n el offset y el segmento del mismo (en ese orden).
Si se desea que no haya valor inicial, deber� utilizarse el
s�mbolo ?.
Otra forma de expresar el valor inicial es:
cuenta DUP (valor_inicial [, valor_inicial...])
donde cuenta es la cantidad de veces que debe repetirse lo que
est� entre par�ntesis.
Definici�n de segmentos
Organizan el programa para utilizar los
segmentos de memoria del microprocesador 8088. Estos son SEGMENT,
ENDS, DOSSEG, ASSUME, GROUP.
nombre_segm | SEGMENT [alineaci�n][combinaci�n]['clase']
|
| sentencias
|
nombre_segm | ENDS
|
Alineaci�n: define el rango de direcciones de memoria para el
cual puede elegirse el inicio del segmento. Hay cinco posibles:
- BYTE: El segmento comienza en el siguiente byte.
- WORD: El segmento comienza en la siguiente direcci�n par.
- DWORD: Comienza en la siguiente direcci�n m�ltiplo de 4.
- PARA: Comienza en la siguiente direcci�n m�ltiplo de 16.
- PAGE: Comienza en la siguiente direcci�n m�ltiplo de 256.
Si no se indica la alineaci�n �sta ser� PARA.
Combinaci�n: define c�mo combinar segmentos que tengan
el mismo nombre. Hay cinco posibles:
- PUBLIC: Concatena todos los segmentos que tienen el mismo nombre
para formar un s�lo segmento. Todas las direcciones de datos e
instrucciones se representan la distancia entre el inicio del segmento y la
direcci�n correspondiente. La longitud del segmento formado ser�
la suma de las longitudes de los segmentos con el mismo nombre.
- STACK: Es similar a PUBLIC. La diferencia consiste que, al comenzar
la ejecuci�n del programa, el registro SS apuntar� a este
segmento y SP se inicializar� con la longitud en bytes de este
segmento.
- COMMON: Pone el inicio de todos los segmentos teniendo el mismo
nombre en la misma direcci�n de memoria. La longitud del segmento
ser� la del segmento m�s largo.
- MEMORY: Es igual a PUBLIC.
- AT direcci�n_de_segmento: Hace que todas las
etiquetas y direcciones de variables tengan el segmento especificado por la
expresi�n contenida en direcci�n_de_segmento. Este segmento no
puede contener c�digo o datos con valores iniciales. Todos los
s�mbolos que forman la expresi�n direcci�n_de_segmento
deben conocerse en el primer paso de ensamblado.
Si no se indica combinaci�n, el segmento no se combinar�
con otros del mismo nombre (combinaci�n "privada").
Clase: Es una forma de asociar segmentos con diferentes nombres, pero
con prop�sitos similares. Sirve tambi�n para identificar el
segmento de c�digo. Debe estar encerrado entre comillas simples.
El linker pone los segmentos que tengan la misma clase uno a continuaci�n
de otro, si bien siguen siendo segmentos diferentes. Adem�s supone que
los segmentos de c�digo tiene clase CODE o un nombre con el
sufijo CODE.
DOSSEG: Esta directiva especifica que los segmentos deben ordenarse
seg�n la convenci�n de DOS. Esta es la convenci�n usada
por los compiladores de lenguajes de alto nivel.
GROUP: Sirve para definir grupos de segmentos. Un grupo es una
colecci�n de segmentos asociados con la misma direcci�n inicial.
De esta manera, aunque los datos est�n en diferentes segmentos, todos
pueden accederse mediante el mismo registro de segmento. Los segmentos de un
grupo no necesitan ser contiguos.
Sintaxis: nombre_grupo GROUP segmento [, segmento...]
ASSUME: Sirve para indicar al ensamblador qu� registro de
segmento corresponde con un segmento determinado. Cuando el ensamblador
necesita referenciar una direcci�n debe saber en qu� registro
de segmento lo apunta.
Sintaxis: ASSUME reg_segm:nombre [, reg_segm:nombre...]
donde el nombre puede ser de segmento o de grupo, una expresi�n utilizando
el operador SEG o la palabra NOTHING, que cancela la selecci�n de
registro de segmento hecha con un ASSUME anterior.
Control del ensamblador
ORG expresi�n: El offset del c�digo o datos a
continuaci�n ser� la indicada por la expresi�n. Todos
los s�mbolos que forman la expresi�n deben conocerse en el
primer paso de ensamblado.
EVEN: Hace que la pr�xima instrucci�n o dato se ensamble
en la siguiente posici�n par.
END [etiqueta]: Debe ser la �ltima sentencia del
c�digo fuente. La etiqueta indica d�nde debe comenzar
la ejecuci�n del programa. Si el programa se compone de varios
m�dulos, s�lo el m�dulo que contiene la direcci�n
de arranque del programa debe contener la directiva END etiqueta.
Los dem�s m�dulos deber�n terminar con la directiva
END (sin etiqueta).
Definici�n de procedimientos
Los procedimientos son secciones
de c�digo que se pueden llamar para su ejecuci�n desde
distintas partes del programa.
etiqueta | PROC | {NEAR|FAR}
|
| sentencias
|
etiqueta | ENDP
|
Ensamblado condicional
Verifican una condici�n determinada y
si se cumple, ensambla una porci�n de c�digo. Opcionalmente
puede ensamblarse otra porci�n de c�digo si la condici�n
no se cumple. Son los siguientes: IF, IF1, IF2, IFB,
IFDEF, IFDIF, IFE, IFIDN, IFNB,
IFNDEF, ENDIF, ELSE.
{IF|IFE} | condici�n
|
sentencias | ;Se ejecutan si es cierta (IF) o falsa (IFE).
|
[ELSE
|
sentencias] | ;Se ejecutan si es falsa (IF) o cierta (IFE).
|
ENDIF
|
La directiva ELSE y sus sentencias son opcionales. ENDIF
termina el bloque y es obligatorio. Se pueden anidar directivas condicionales.
IF1 permite el ensamblado de las sentencias s�lo en el primer paso,
mientras que IF2 lo permite en el segundo paso.
IFDEF nombre permite el ensamblado de las sentencias si el
nombre est� definido, mientras que IFNDEF nombre
lo permite si no est� definido.
IFB <argumento> permite el ensamblado si el argumento en una
macro es blanco (no se pas� el argumento).
IFNB <argumento> permite el ensamblado si el argumento en una
macro no es blanco (se pas� el argumento).
IFIDN <argumento1>, <argumento2> permite el ensamblado si
los dos par�metros pasados a la macro son id�nticos.
IFDIF <argumento1>,<argumento2> permite el ensamblado si
los dos par�metros pasados a la macro son diferentes.
Macros: Las macros asignan un nombre simb�lico a un bloque de
sentencias fuente. Luego se puede usar dicho nombre para representar esas
sentencias. Opcionalmente se pueden definir par�metros para
representar argumentos para la macro.
Definici�n de macros
nombre_macro | MACRO | [par�metro
[,par�metro...]]
|
| [LOCAL | nombre_local[,nombre_local...]
|
| sentencias
|
| ENDM
|
Los par�metros son opcionales. Si existen, entonces tambi�n
aparecer�n en algunas de las sentencias en la definici�n de la
macro. Al invocar la macro mediante:
nombre_macro [argumento [,argumento..]]
se ensamblar�n las sentencias indicadas en la macro teniendo en cuenta
que cada lugar donde aparezca un par�metro se reemplazar� por
el argumento correspondiente.
El nombre_local de la directiva LOCAL es un nombre simb�lico
temporario que ser� reemplazado por un �nico nombre
simb�lico (de la forma ??n�mero) cuando la macro se invoque.
Todas las etiquetas dentro de la macro deber�n estar indicadas en la
directiva LOCAL para que el ensamblador no genere un error indicando
que un s�mbolo est� definido varias veces.
La directiva EXITM (usada dentro de la definici�n de la macro)
sirve para que no se ensamblen m�s sentencias de la macro (se usa
dentro de bloques condicionales).
PURGE nombre_macro [,nombre_macro...]: Borra las macros indicadas
de la memoria para poder utilizar este espacio para otros s�mbolos.
Definici�n de bloques de repetici�n
Son tres: REPT,
IRP e IRPC. Como en el caso de la directiva MACRO, se
puede incluir la sentencias LOCAL y EXITM y deben terminarse
con la directiva ENDM.
REPT expresi�n
sentencias
ENDM
La expresi�n debe poder ser evaluada en el primer paso del ensamblado
y el resultado deber� estar entre 0 y 65535.
Esta expresi�n indica la cantidad de veces que debe repetirse el bloque.
IRP par�metro, <argumento [,argumento...]>
sentencias
ENDM
El par�metro se reemplaza por el primer argumento y se ensamblan las
sentencias dentro del bloque. Luego el par�metro se reemplaza por el
segundo argumento y se ensamblan las sentencias y as� sucesivamente
hasta agotar los argumentos.
IRPC par�metro, cadena
sentencias
ENDM
Es similar a IRP con la diferencia que el par�metro se reemplaza
por cada car�cter de la cadena. Si �sta contiene comas, espacios
u otros caracteres especiales deber� encerrarse con par�ntesis
angulares (<>).
Procesador: Indican el tipo de procesador y coprocesador en el que se
va a ejecutar el programa. Los de procesador son: .8086, .186,
.286, .386, .486 y .586 para instrucciones en
modo real, .286P, .386P, .486P y .586P para
instrucciones privilegiadas, .8087, .287 y .387 para
coprocesadores. Deben ubicarse al principio del c�digo fuente.
Habilitan las instrucciones correspondientes al procesador y coprocesador
indicado. Sin estas directivas, s�lo se pueden ensamblar
instrucciones del 8086 y 8087.
Referencias externas al m�dulo
Sirve para poder particionar un
programa en varios archivos fuentes o m�dulos. Son imprescindibles si
se hace un programa en alto nivel con procedimientos en assembler. Hay tres:
PUBLIC, EXTRN e INCLUDE.
PUBLIC nombre[, nombre...]: Estos nombres simb�licos se
escriben en el archivo objeto. Durante una sesi�n con el linker, los
s�mbolos en diferentes m�dulos pero con los mismos nombres
tendr�n la misma direcci�n.
EXTRN nombre:tipo [,nombre:tipo...]: Define una variable externa
con el nombre y tipo (NEAR, FAR, BYTE,
WORD, DWORD o ABS (n�mero constante especificado
con la directiva EQU o =)) especificado. El tipo debe ser el
mismo que el del �tem indicado con la directiva PUBLIC en otro
m�dulo.
INCLUDE nombre_de_archivo: Ensambla las sentencias indicadas en
dicho archivo.
Segmentos simplificados
Permite definir los segmentos sin necesidad
de utilizar las directivas de segmentos que aparecen m�s arriba.
.MODEL modelo: Debe estar ubicada antes de otra directiva de
segmento. El modelo puede ser uno de los siguientes:
- TINY: Los datos y el c�digo juntos ocupan menos de 64 KB por lo
que entran en el mismo segmento. Se utiliza para programas .COM. Algunos
ensambladores no soportan este modelo.
- SMALL: Los datos caben en un segmento de 64 KB y el c�digo cabe
en otro segmento de 64 KB. Por lo tanto todo el c�digo y los datos se
pueden acceder como NEAR.
- MEDIUM: Los datos entran en un s�lo segmento de 64 KB, pero el
c�digo puede ser mayor de 64 KB. Por lo tanto, c�digo es FAR,
mientras que los datos se acceden como NEAR.
- COMPACT: Todo el c�digo entra en un segmento de 64 KB, pero
los datos no (pero no pueden haber matrices de m�s de 64 KB). Por lo
tanto, c�digo es NEAR, mientras que los datos se acceden como
FAR.
- LARGE: Tanto el c�digo como los datos pueden ocupar
m�s de 64 KB (pero no pueden haber matrices de m�s de 64 KB),
por lo que ambos se acceden como FAR.
- HUGE: Tanto el c�digo como los datos pueden ocupar
m�s de 64 KB (y las matrices tambi�n), por lo que ambos se
acceden como FAR y los punteros a los elementos de las matrices
tambi�n son FAR.
.STACK [size]: Define el segmento de pila de la longitud especificada.
.CODE [name]: Define el segmento de c�digo.
.DATA: Define un segmento de datos NEAR con valores iniciales.
.DATA?: Define un segmento de datos NEAR sin valores iniciales.
.FARDATA [name]: Define un segmento de datos FAR con valores iniciales.
.FARDATA? [name]: Define un segmento de datos FAR sin valores iniciales.
.CONST: Sefine un segmento de datos constantes.
Los siguientes s�mbolos est�n definidos cuando se usan las
directivas anteriores:
- @curseg: Tiene el nombre del segmento que se est� ensamblando.
- @filename: Representa el nombre del archivo fuente (sin la extensi�n)
- @codesize: Vale 0 para los modelos SMALL y COMPACT
(c�digo NEAR), y vale 1 para los modelos MEDIUM,
LARGE y HUGE (c�digo FAR).
- @datasize: Vale 0 para los modelos SMALL y MEDIUM
(datos NEAR), vale 1 para los modelos COMPACT y LARGE
(datos FAR) y vale 2 para el modelo HUGE (punteros a matrices FAR).
- @code: Nombre del segmento definido con la directiva .CODE.
- @data: Nombre del segmento definido con la directivas
.DATA, .DATA?, .CONST y .STACK (los cuatro
est�n en el mismo segmento).
- @fardata: Nombre del segmento definido con la directiva .FARDATA.
- @fardata?: Nombre del segmento definido con la directiva .FARDATA?.