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:
  1. MOV reg,{reg|mem|inmed}
  2. MOV mem,{reg|inmed}
  3. MOV {reg16|mem16},{CS|DS|ES|SS}
  4. 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:
  1. ES:[DI] <- DS:[SI] (un byte)
  2. DI <- DI�1
  3. SI <- SI�1

MOVSW
Copiar dos bytes de la cadena fuente al destino.
Operaci�n:
  1. ES:[DI] <- DS:[SI] (dos bytes)
  2. DI <- DI�2
  3. SI <- SI�2

LODSB
Poner en el acumulador un byte de la cadena fuente.
Operaci�n:
  1. AL <- DS:[SI] (un byte)
  2. SI <- SI�1

LODSW
Poner en el acumulador dos bytes de la cadena fuente.
Operaci�n:
  1. AX <- DS:[SI] (dos bytes)
  2. SI <- SI�2

STOSB
Almacenar en la cadena destino un byte del acumulador.
Operaci�n:
  1. ES:[DI] <- AL (un byte)
  2. DI <- DI�1

STOSW
Almacenar en la cadena destino dos bytes del acumulador.
Operaci�n:
  1. ES:[DI] <- AX (dos bytes)
  2. DI <- DI�2

CMPSB
Comparar un byte de la cadena fuente con el destino.
Operaci�n:
  1. DS:[SI] - ES:[DI] (Un byte, afecta s�lo los flags)
  2. DI <- DI�1
  3. SI <- SI�1

CMPSW
Comparar dos bytes de la cadena fuente con el destino.
Operaci�n:
  1. DS:[SI] - ES:[DI] (Dos bytes, afecta s�lo los flags)
  2. DI <- DI�2
  3. SI <- SI�2

SCASB
Comparar un byte del acumulador con la cadena destino.
Operaci�n:
  1. AL - ES:[DI] (Un byte, afecta s�lo los flags)
  2. DI <- DI�1

SCASW
Comparar dos bytes del acumulador con la cadena destino.
Operaci�n:
  1. AX - ES:[DI] (Dos byte, afecta s�lo los flags)
  2. 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:

Prefijos para las instrucciones CMPSB, CMPSW, SCASB, SCASW:

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):

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.

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:

  1. BYTE: El segmento comienza en el siguiente byte.
  2. WORD: El segmento comienza en la siguiente direcci�n par.
  3. DWORD: Comienza en la siguiente direcci�n m�ltiplo de 4.
  4. PARA: Comienza en la siguiente direcci�n m�ltiplo de 16.
  5. 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:

  1. 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.
  2. 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.
  3. 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.
  4. MEMORY: Es igual a PUBLIC.
  5. 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.

etiquetaPROC{NEAR|FAR}
sentencias
etiquetaENDP

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_macroMACRO[par�metro [,par�metro...]]
[LOCALnombre_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:

  1. 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.
  2. 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.
  3. 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.
  4. 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.
  5. 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.
  6. 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:

Nedstat Counter