Sie sind auf Seite 1von 26

Tema 5 Directivas del ensamblador

Adems de los mnemnicos que permiten el uso de las instrucciones del procesador, los programas denominados ensambladores proporcionan algunas macro instrucciones tiles para que a la hora de hacer los programas, esta tarea sea menos dificultosa. A estas macro instrucciones se les denomina directivas de ensamblador.

Uso de constantes
El ensamblador permite usar varios tipos de constantes numricas. Entre estas tenemos: Binarias: Secuencias de 1 y 0 seguidas de una letra B, por ejemplo, 10111010B. Decimales: Secuencia de dgitos del 0 al 9 con o sin la letra D, por ejemplo, 129D o 129. Hexadecimal: Secuencia de dgitos del 0 al 9 y letras de la A hasta la F, seguidas de la letra H. El primer carcter debe ser uno de los dgitos del 0 al 9; por ejemplo, 0E23H. Si el numero es por ejemplo, CA3FH, este debe definirse como 0CA3FH, con el fin de diferenciarlo de una direccin de memoria. Carcter: Cadenas de caracteres encerrada entre comillas dobles ()

108

Microprocesadores de 16 bits y tecnologa PC

Instrucciones en lenguaje de ensamblador


Cada instruccin en lenguaje de ensamblador (en el programa fuente), puede tener hasta cuatro campos, como se muestra: [Etiqueta:] Mnemnico [Operando] [;Comentario]

El nico campo requerido por defecto es el Mnemnico, siendo los dems optativos, o estn es funcin del programa. Por ejemplo, esta es una instruccin vlida: CONTADOR: MOV CX,DI ;Inicializa el contador

Campo de etiquetas
El campo de etiquetas asigna un nombre a la instruccin. Es una referencia a otras instrucciones. Normalmente son usadas para hacer referencias a puntos de salto o bifurcacin del programa, que ser usada posteriormente para hacer ciclos o variaciones de ejecucin en funcin de condiciones de decisin. Una etiqueta puede tener una longitud variable, en funcin del ensamblador utilizado. La mayora permite usar de 10 a 12 caracteres, algunos usan hasta 31 y otros solo 8 caracteres. Cada etiqueta debe terminar con el smbolo :. Se consideran como caracteres validos los siguientes: Letras de la A la Z (y tambin de a la z). El ensamblador no distingue diferencias entre maysculas y minsculas. Los dgitos desde el 0 al 9 Caracteres especiales: ? . @ _ $

Se puede comenzar las etiquetas con cualquier carcter, excepto dgitos. Los smbolos AH, AL, AX, BH, BL, BX, BP, CH, CL, CX, CS, DH, DL, DX, DS, ES, SI, SP y ST y nombres registrados no pueden ser usados como etiquetas.

Campo de mnemnicos
Este campo contiene un acrnimo de dos a siete caracteres que es la instruccin a ejecutar. El ensamblador usa una tabla interna para traducir cada instruccin mnemnica a su equivalente numrico.

Campo de operandos
El campo de operandos es en donde esta el o los datos con que va a operar el procesador. De acuerdo a la instruccin a ejecutar, este campo puede estar vaco, con un o dos operadores, todo en funcin a los requerimientos de la instruccin. Cuando
Ing. Antonio Romn V. UNEXPO PUERTO ORDAZ

Directivas del ensamblador

109

hay dos operandos, estos se separan usando una coma ,; el que esta a la derecha se denomina operando fuente, y el que esta a la izquierda se denomina operando destino. Por ejemplo MOV CX,DX esta instruccin le dice al procesador que mueva el valor o contenido del operando fuente en el registro DX al operando destino en el registro CX.

Campo de comentarios
Este campo es opcional, y le permite colocar texto descriptivo sobre la instruccin o grupo de instrucciones del programa. Los comentarios son precedidos por un punto y coma ;. Todo lo que se escriba a la derecha de este smbolo se considera un comentario, y estos son ignorados por el ensamblador. Los comentarios deben usarse para aclarar el cdigo y no para describir lo que hace la instruccin. Por ejemplo MOV CX,0 ; Limpia el registro contador es ms descriptivo que MOV CX,0 ; Mover 0 a CX Los comentarios no deben estar necesariamente a la derecha de una instruccin. Estos tambin pueden estar solos. Por ejemplo ; La siguiente instruccin limpia el acumulador MOV AX,0 ntese que el comentario esta antes de la instruccin, precedido solamente por ;. Otro uso de ; es deshabilitar una o mas instrucciones de programa. Ya que el ensamblador considera comentario todo aquello que este a la derecha del punto-ycoma, entonces ; MOV AX,0 ser ignorada, y se tomara como comentario. Esto es til para la prueba y depuracin de programas.

Ing. Antonio Romn V. UNEXPO PUERTO ORDAZ

110

Microprocesadores de 16 bits y tecnologa PC

Directivas del ensamblador


Las directivas son comandos del ensamblador, mas que del procesador. Estas son usadas para inicializar segmentos y procedimientos, definir smbolos, reservar memoria y otras menudencias. Las directivas pueden tener hasta cuatro campos. Estos son: [Nombre] Directiva [Operando] [;Comentario]

Los campos entre parntesis cuadrados o corchetes son optativos. El campo de Nombre es optativo para algunas directivas y obligado para otras. El ensamblador posee al menos unas 60 directivas diferentes, pero solo se discutirn las ms comunes.

Directivas de datos
Podemos dividir las directivas de datos en 5 grupos funcionales, los cuales se mostraran a continuacin. Definicin de smbolos EQU Formato: nombre nombre EQU EQU texto expresin-numrica

Asigna texto o expresin-numrica a nombre en forma permanente. = Formato: nombre = expresin-numrica

Asigna expresin-numrica a nombre, pero puede ser re-asignada. Definicin de datos DB Formato: [nombre] DB expresin[,...]

Define una variable o inicializa almacenamiento. DB asigna uno a mas bytes. DW Formato: [nombre] DW expresin[,...]

Similar a DB, pero asigna palabras de dos bytes. DD Formato: [nombre] DD expresin[,...]

Asigna dobles-palabras (cuatro bytes)

Ing. Antonio Romn V. UNEXPO PUERTO ORDAZ

Directivas del ensamblador Referencias externas PUBLIC Formato: PUBLIC smbolo[,...]

111

Hace que los smbolos definidos estn disponibles para usarse con otros mdulos ensamblador en el momento de enlace. EXTRN Formato: EXTRN nombre:tipo[,...]

Especifica smbolos definidos en otros mdulos de ensamblador. INCLUDE Formato: INCLUDE archivo.ext

Mezcla el contenido del archivo especificado con el archivo actual. Especificacin de segmentos/procedimientos SEGMENT Formato: nombre-segmento SEGMENT [tipo-combinacin] [clase] ... nombre-segmento ENDS [tipo-alineacin]

Define los lmites del segmento. Cada definicin de SEGMENT debe terminar con una instruccin ENDS. ASSUME Formato: ASSUME registro-segmento:nombre-segmento[,...] registro-segmento:NOTHING[,...]

Le dice al ensamblador que nombre-segmento pertenece a cada registro-segmento (CS, DS, SS, ES). La instruccin NOTHIGN cancela cualquier instruccin ASSUME previa al registro especificado. PROC Formato: nombre nombre ... RET nombre PROC PROC ENDP [NEAR] FAR

Asigna nombre a la secuencia de instrucciones del ensamblador. Cada definicin PROC debe terminar con una instruccin ENDP.

Ing. Antonio Romn V. UNEXPO PUERTO ORDAZ

112

Microprocesadores de 16 bits y tecnologa PC

Control del ensamblador END Formato: END [etiqueta-entrada]

Marca el final del programa fuente ORG Formato: ORG expresin

Prefija el registro IP al valor de expresin. El ensamblador almacena el cdigo a partir de esa direccin. A continuacin, se presentaran algunos ejemplos para el uso de directivas de compilacin.

Definicin de smbolos
Las directivas EQU y = son similares pero: Se pueden redefinir smbolos con = mientras que los definidos con EQU son permanentes. EQU puede ser usado para definir smbolos que representen texto o cantidades numricas, mientras = solo puede ser usado para expresiones numricas.

Veamos algunos ejemplos: K TABLA VELOCIDAD CONTADOR EQU 1024 EQU DS:[BP][SI] ;Nombre de constante ;Nombre para combinacin de direccin

EQU PORCENTAJE ;Nombre alternativo EQU CX ;Renombra un registro

Tambin se pueden definir expresiones matemticas sencillas DBL_VELOCIDAD EQU 2*VELOCIDAD MIN_POR_DIA EQU 60*24 Algunos ejemplos de la directiva = CONST CONST CONST = = = 56 57 CONST+1 ;Esto equivale a CONTS EQU 56, pero... ;aqu SI podemos redefinir su valor ;o hacer una referencia previa

Ing. Antonio Romn V. UNEXPO PUERTO ORDAZ

Directivas del ensamblador

113

Definicin de datos
Muchos programas usan localizaciones de memoria para mantener variables, lugares en donde se almacenara temporalmente informacin que puede ser cambiada segn la necesidad. Las directivas para asignar memoria de variables son DB (Define Byte), DW (Define Word) y DD (Define Doubleword). Las diferencias entre ellas es la cantidad de memoria que pueden asignar. DB asigna unidades de 8 bits, DW asigna unidades de 16 bits y DD asigna unidades de 32 bits. Veamos algunos ejemplos. BU_MAX BS_MAX BS_MIN WU_MAX WS_MAX WS_MIN DB DB DB DW DW DW 255 127 -128 65536 32767 -32768 ;Mxima constante, sin signo ;Mxima constante, con signo ;Mnima constante, con signo ;Mxima constante, sin signo ;Mxima constante, con signo ;Mnima constante, con signo

En este ejemplo, adems de definir los limites de los valores, solo hemos reservado una unidad, no obstante, es posible definir ms de una, para hacer as tablas de memoria B_TABLA W_TABLA DB DB DW DW 0,0,0,0,8,-13 -100,0,55,63,63,63 ;Tabla de bytes

1025,567,-30222,0,90,-129 ; Tabla de words 17,645,26534,367,78,-17

En ocasiones se desea hacer tablas grandes iniciadas a algn valor, como en el ejemplo siguiente: TABLA DB DB DB DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0

Esta es una tabla de 64 elementos, y de por s, ya es bastante tediosa de hacer. Para estos casos, existe un operador especial, denominado DUP (duplicate), que nos permite hacer este tipo de cosas ms cmodamente. Para el caso anterior, usando este nuevo operador, la tabla la podemos definir as TABLA DB 64 DUP(0)

Ing. Antonio Romn V. UNEXPO PUERTO ORDAZ

114

Microprocesadores de 16 bits y tecnologa PC

Este operador puede insertarse donde sea necesario. Para el ejemplo de B_TABLA, podemos re-escribirlo as B_TABLA DB 4 DUP(0),8,-13,-100,0,55,3 DUP(63)

Por otro lado, si deseamos definir variables sin valor inicial, podemos utilizar el smbolo ? PROMEDIO DB PESO DW ? ?

Para el primer caso se reserva un byte para la variable PROMEDIO, y dos bytes para la variable PESO. Ntese que dada la forma de iniciacin, puede existir cualquier valor en las localidades de memoria asociadas a estas variables. Tambin podemos crear tablas de esta manera MESES DW 12 DUP(?)

La directiva DB tambin permite la definicin de cadenas de caracteres (strings), de la siguiente manera ERROR1 DB DB DB El numero que ha introducido es muy grande para ser procesador apropiadamente. Por favor re-introduzca su dato.

Las variables tambin pueden contener direcciones de memoria, con las cuales se puede hacer referencia a instrucciones en su programa. Debemos recordar que las direcciones de memoria tienen dos componentes (segmento y desplazamiento). Si la etiqueta esta en el mismo segmento que la instruccin a la que hace referencia, entonces esta posee el nmero de desplazamiento en dicho segmento. Supongamos que en alguna parte del programa existe una etiqueta denominada AQU, entonces AQUI_SG DW AQU

hace que la etiqueta AQUI_SG sea el desplazamiento (offset) del AQU. Podemos asumir que la etiqueta AQUI_SG es un apuntador. Si es necesario tener los dos componentes de una direccin, usamos la directiva DD, as

Ing. Antonio Romn V. UNEXPO PUERTO ORDAZ

Directivas del ensamblador AQUI_SG DD AQU

115

asignando as los 16 bits de desplazamiento y los 16 de segmento a la etiqueta AQU_SG de la etiqueta de 32 bits AQU. A este tipo de etiqueta o variable se le denomina vector.

Definicin de segmentos
Las directivas SEGMENT y ENDS dividen el programa en segmentos. El formato de uso, como vimos anteriormente, es el siguiente nombre-seg ... nombre-seg SEGMENT ENDS [tipo-alineacin][tipo-combinado][clase]

En tipo-alineacin se especifica cual es el limite del segmento cuando se define en la memoria. Se puede hacer que comience en cualquier lugar (BYTE), en una direccin par (WORD) o en una direccin divisible por 16 (PARA) o por 256 (PAGE). El tipo-combinacin especifica como el segmento se combina con otros del mismo nombre. Cdigo, datos y extra-segmento pueden estar juntos (PUBLIC) o solapados (COMMON). El segmento de pila debe ser de tipo STACK. La clase afecta el orden en que el segmento es almacenado. Los segmentos que tienen la misma clase son almacenados consecutivamente, mientras los que tienen diferentes nombres son almacenados en el orden en que el enlazador (linker) los encuentra. Los detalles de estos modos puede conseguirlos en el Macro Assembler Manual con ms detalle, pero en general, puede usar en forma segura las siguientes combinaciones: Para segmentos de datos, use Para segmentos de cdigo, use Para extra-segmento, use Para el segmento de pila, use SEGMENT PARA PUBLIC DATA SEGMENT PARA PUBLIC CODE SEGMENT PARA PUBLIC EXTRA SEGMENT PARA STACK STACK

Por ejemplo, una definicin tpica de un segmento de datos puede verse as: DSEG SEGMENT PARA PUBLIC DATA A DB ? B DB ? CUADRADOS DB 1,4,9,16,25,36,49,64 DSEG ENDS

Ing. Antonio Romn V. UNEXPO PUERTO ORDAZ

116

Microprocesadores de 16 bits y tecnologa PC

Y un segmento de cdigo as: CSEG SEGMENT PARA PUBLIC CODE .. .. MOV AX,AX MOV CL,DH MOV DI,CX .. .. CSEG ENDS Las palabras SEGMENT y ENDS simplemente marcan el comienzo y el final de un segmento, pero no le dicen al ensamblador que clase de segmento se ha definido. Para ello, se usa la directiva ASSUME, cuyo formato general es: ASSUME registro-segmento:nombre-segmento[,...]

donde registro-segmento esta entre CS, DS, ES o SS, y nombre-segmento es el nombre que precede a la directiva SEGMENT. Normalmente (y debe ser as) DS apunta al segmento de datos, CS al segmento de cdigo, SS al segmento de pila y ES al extra-segmento. ASSUME ayuda al ensamblador a traducir las etiquetas en direcciones indicandole al registro segmento a partir de donde comienza el segmento en cuestin. Por ejemplo ASSUME DS:DSEG

le dice al ensamblador que DSEG es el segmento de datos, y define la etiqueta DSEG para que sea usada como referencia del segmento. Por parte del programador, este debe hacer que el registro DS apunte a la direccin de segmento que contiene DSEG. Usando las definiciones de los ejemplos anteriores, un programa tpico podra ser como este: CSEG SEGMENT PARA PUBLIC CODE ASSUME CS:CSEG, DS:DSEG MOV MOV .. .. MOV MOV AX,DSEG DS,AX AX,BX CL,DH ;Haga que DS apunte a DSEG

Ing. Antonio Romn V. UNEXPO PUERTO ORDAZ

Directivas del ensamblador MOV CX,DI .. .. CSEG ENDS

117

En ocasiones es necesario hacer bloques de cdigo separados. Para ello, se usa la directiva PROC y ENDP. Estas directivas marcan el comienzo y el final de un procedimiento que puede ser ejecutado en varios lugares del programa. Cuando el procesador llama (CALL) un procedimiento, este lo ejecuta y luego regresa al lugar de origen (de llamada, con RET). De esta manera, se pueden hacer bloques de cdigo o procedimientos de uso general, evitando as el cdigo redundante. Todos los procedimientos deben comenzar con PROC y terminar con ENDP. El procedimiento puede ser codificado como una subrutina o como un modulo ejecutable. Si es una subrutina, debe finalizar su ejecucin con una instruccin RET. Los procedimientos siempre tienen dos atributos de distancia: NEAR y FAR, que son especificados como operandos a continuacin de PROC. Si se omite el operando, se asume que el PROC definido es NEAR. Un procedimiento NEAR solo puede ser invocado en el segmento de cdigo en que fue definido. Por ejemplo: CSEG SEGMENT PARA PUBLIC CODE ASSUME CS:CSEG CALLER PROC .. CALL CALLEE ;Llama a un procedimiento .. RET CALLER ENDP CALLEE .. .. RET CALLEE CSEG ENDS Lo que aqu ocurre es que el procedimiento CALLEE esta definido en el mismo segmento, por ello se define PROC NEAR.
Ing. Antonio Romn V. UNEXPO PUERTO ORDAZ

PROC NEAR

ENDP

118

Microprocesadores de 16 bits y tecnologa PC

Por supuesto, los procedimientos pueden residir en mdulos (archivos de disco) diferentes, pero sus nombres de segmento deben ser los mismos. Para comunicacin entre segmento, se usan las directivas PUBLIC y EXTRN, que se discutirn ms adelante. Un procedimiento FAR puede ser llamado por cualquier segmento de cdigo, por ejemplo: CSEG SEGMENT PARA PUBLIC CODE ASSUME CS:CSEG CALLER PROC .. CALL CALLEE ;Llama un procedimiento .. RET CALLER ENDP CSEG ENDS CSEG1 SEGMENT PARA PUBLIC CODE ASSUME CS:CSEG1 CALLEE PROC FAR .. .. RET CALLEE ENDP CSEG1 ENDS La diferencia entre un procedimiento NEAR o FAR, esta en la forma en que procesador ejecuta la instruccin RET para recuperar la direccin de retorno. Si el procedimiento es NEAR, el procesador pone (PUSH) en la pila solo el desplazamiento (offset), o sea, el contenido del registro IP. Si el procedimiento es FAR, el procesador pone en la pila dos valores, el contenido del segmento de cdigo CS y el contenido del registro de instruccin IP.

Directiva EXTRN
Esta directiva se usa para intercambiar informacin entre mdulos que eventualmente se enlazaran para forma el programa. La directiva PUBLIC permite que uno (o ms) smbolos estn disponibles para otros mdulos que eventualmente sern enlazados. EXTRN es la compaera de PUBLIC, y se usa para declarar smbolos que estn definidos en otros mdulos, y se necesita una referencia adelantada. Esto smbolos
Ing. Antonio Romn V. UNEXPO PUERTO ORDAZ

Directivas del ensamblador

119

deben estar definidos como PUBLIC en los otros mdulos. En general, EXTRN se usa as: EXTRN nombre:tipo[,...]

donde nombre es el smbolo definido (y declarado PUBLIC) en algn otro modulo, y el tipo puede ser uno de los siguientes: Si nombre es un smbolo en el segmento de datos o en el extra-segmento, entonces tipo puede ser BYTE, WORD o DWORD. Si nombre es una etiqueta de procedimiento, entonces tipo puede ser NEAR o FAR. Si nombre es una constante definida por EQU o por =, entonces tipo debe ser ABS

Directivas de control
Existen varias directivas de control, pero las mas frecuentemente usadas son END y ORG. La directiva END marca el fin de un programa, y le dice al ensamblador que termine la tarea de ensamblado. Por lo tanto, se debe incluir END en cada programa fuente. Su forma de uso general es: END etiqueta-de-entrada donde etiqueta-de-entrada identifica el lugar donde el DOS (sistema operativo) comienza a ejecutar el programa, por ejemplo: END MI_PROG marca el fin del programa MI_PROG. Si su programa consiste en varios mdulos, se debe poner la etiqueta solamente en el modulo principal, pero debe omitirse en mdulos secundarios. La directiva ORG (Origin), permite alterar el contador de localizacin (registro IP). Permite que el ensamblador almacene datos o instrucciones en otro lugar, normalmente definido por el programador. ORG es muy usado en los programa COM as ORG 100H le indica al ensamblador que comience almacenar del programa 256 bytes despus de la direccin de inicio.

Ing. Antonio Romn V. UNEXPO PUERTO ORDAZ

120

Microprocesadores de 16 bits y tecnologa PC

Operadores
Un operador es un modificador usado en un campo de operando en el lenguaje de ensamble o en una directiva. Existen cinco tipos de operadores: aritmticos, lgicos, relacionales, valores de retorno y atributos. Operadores aritmticos Los operadores aritmticos combinan operandos numricos y producen un resultado numrico. Los operadores ms comunes son suma (+), resta (-), multiplicacin (*) y divisin (/). El operador de divisin retorna el cociente producido por la operacin de divisin. Por ejemplo: PI_COCIENTE retorna el valor 3 El operador MOD retorna el resto de la operacin de divisin, veamos: PI_RESTO EQU 31416 MOD 10000 EQU 31416/10000

esta instruccin define la constante PI_RESTO que tiene como valor 1416. Finalmente, SHL y SHR desplaza los operandos numricos a la izquierda o la derecha. La nica vez que probablemente Ud. use este operador es para hacer mascaras que sern aplicadas a nmeros binarios en memoria. Por ejemplo MASCARA EQU 110010B

define la constante MASCARA como 110010B, pero MASCARA_L EQU MASCARA SHL 2

generar una nueva constante con el valor 11001000B. Igualmente MASCARA_R EQU MASCARA SHR 2

generar otra constante con el valor 1100B

Ing. Antonio Romn V. UNEXPO PUERTO ORDAZ

Directivas del ensamblador

121

Operadores lgicos Los operadores lgicos se utilizan para manipular valores binarios en ves de valores decimales. Por supuesto, estos operadores manipulan bits individuales, as como grupos enteros de bits. Los operadores lgicos AND, OR y XOR combinan dos operadores para producir un resultado. El operador NOT requiere solamente un operando. Operadores relacionales Los operadores relacionales comparan dos valores numricos o direcciones de memoria en el mismo segmento, y produce un resultado numrico. El resultado es siempre uno de dos posibles valores numricos: 0 si la relacin es falsa o 0FFFFH si la relacin es verdadera. Por ejemplo: MOV AX,OPCION LT 20 es ensamblada como MOV AX,0FFFFH si OPCION es menor que 20, y ser MOV AX,0 si OPCION es mayor que 20. Es posible hacer expresiones ms complejas con estos operadores. Supongamos que deseamos que el registro AX contenga 5 si OPCION es menor que 20 y que contenga 6 si OPCION es mayor que 20. MOV AX,((OPCION LT 20) AND 5) OR ((OPCION GE 20 ) AND 6) si OPCION es menor que 20, la clusula (OPCION LT 2) es verdadera, y la clusula (OPCION GE 20) es falsa, entonces MOV AX,(0FFFFH AND 5) OR (0 AND 6) evaluando el ensamblador la expresin as MOV AX,5

Ing. Antonio Romn V. UNEXPO PUERTO ORDAZ

122

Microprocesadores de 16 bits y tecnologa PC

por otro lado, si OPCION es mayor o igual que 20, la clusula (OPCION LT 20) es falsa y (OPCION GE 20) es verdadera MOV AX,(0 AND 5) OR (0FFFFH AND 6) evaluando el ensamblador la instruccin as MOV AX,6 Los operadores relacionales disponibles son: LT LE (menor que) GT (menor o igual que) GE (mayor que) (mayor o igual que)

Operadores para retorno de valores Este grupo de operadores ofrece informacin acerca de variables o etiquetas en el programa. El signo $ retorna el valor del contador de locaciones IP, esto es, retorna el valor de desplazamiento de la instruccin que apunta actualmente. Por ejemplo, para calcular el nmero de caracteres en la cadena MENSAJE y asigne esta cuenta a MENSAJE_L haremos lo siguiente: MENSAJE MENSAJE_L DB Pulse alguna tecla para continuar. EQU $-MENSAJE

Cuando deseemos mostrar el mensaje, usamos MENSAJE_L para decirle al programa cuantos caracteres se enviaran a al pantalla. Los operadores SEG y OFFSET retornan el segmento y el desplazamiento de la variable o etiqueta. Por ejemplo, las siguientes instrucciones MOV AX, SEG TABLA MOV BX, OFFSET TABLA carga los valores de segmento y desplazamiento en los registros AX y BX respectivamente. El operador TYPE retorna un valor numrico que indica el tipo de atributo de una variable (1 para tipo BYTE, 2 para tipo WORD) o la distancia de una etiqueta (-1 para NEAR o -2 para FAR). Los operadores LENGTH y SIZE solo tienen utilidad para variables que sean definidas usando DUP. LENGTH retorna l numero de unidades (bytes o words) asignados a la variable.

Ing. Antonio Romn V. UNEXPO PUERTO ORDAZ

Directivas del ensamblador TABLA DW 100 DUP (1) MOV CX, LENGTH TABLA

123

carga 100 en CX. Si Ud. usa LENGTH con cualquier variable que no sea definida con DUP, devolver 1. SIZE devuelve cuantos bytes ocupa una variable. multiplicar LENGTH por TYPE. Por ejemplo MOV CX, SIZE TABLA carga el valor 200 en CX. Operadores de atributos El operador puntero PTR pasa por alto los tipos (BYTE o WORD) o distancias (NEAR o FAR) en un operando. Por ejemplo, puede usarse PTR para referenciar los bytes en una tabla de words. Si se define la tabla as: TABLA_WORD la instruccin PRIMER_BYTE EQU BYTE PTR TABLA_WORD DW 100 DUP(?) Esto es el equivalente de

asigna a la etiqueta PRIMER_BYTE la localizacin del primer byte de TABLA_WORD. Despus, es posible crear cualquier otra etiqueta byte fcilmente: QUINTO_BYTE EQU PRIMER_BYTE+4

El operador FAR se usa para cambiar el alcance (distancia) de una instruccin. Por ejemplo INICIO: MOV CX,100

la etiqueta INICIO tiene atributo NEAR, lo cual implica que las instrucciones de saltos (JMP) con referencia a elle, son validos en el mismo segmento. Para poder hacer que otras instrucciones JMP puedan hacer saltos a ella desde otros segmentos, se puede crear una etiqueta alternativa que tenga el atributo FAR. INICIO_FAR EQU FAR PTR INICIO

Por otro lado, el operador SHORT hace exactamente lo contrario, le dice al ensamblador que los JMP no son mayores que 127 bytes

Ing. Antonio Romn V. UNEXPO PUERTO ORDAZ

124

Microprocesadores de 16 bits y tecnologa PC

JMP SHORT AQUI .. .. AQUI: El operador THIS crea operandos de direcciones de memoria de tipo especificado (BYTE o WORD) o de distancia (NEAR o FAR), y da este operando los mismos atributos de segmento y desplazamiento de la prxima direccin de memoria disponible a asignar. Por ejemplo PRIMER_BYTE TABLA_WORD EQU THIS BYTE DW 100 DUP(?)

crea PRIMER_BYTE, y le proporciona el atributo tipo BYTE con la misma direccin de TABLA_WORD. Esto es similar a la siguiente instruccin PRIMER_BYTE EQU BYTE PTR TABLA_WORD

tambin puede usar THIS para definir localizaciones de instrucciones tipo FAR INICIO EQU THIS FAR MOV CX,100 Finalmente, los operadores HIGH y LOW retornan el byte de mas alto orden y de mas bajo orden, respectivamente. Por ejemplo CONSTANTE la instruccin MOV AH, HIGH CONSTANTE EQU 0ABCDH

carga el valor 0ABH en el registro AH.

Modelos para construccin de programas


En los siguientes ejemplos, veremos modelos de cdigo fuente (mdulos) que contienen plantillas con el fin de ayudar a construir programas completos que pueden ser enlazados con uno o ms mdulos secundarios.

Ing. Antonio Romn V. UNEXPO PUERTO ORDAZ

Directivas del ensamblador

125

Modelo para programa principal .EXE


TITLE (Inserte el titulo del programa aqu) (Inserte las directivas EXTRN, si es apropiado...) STACK SEGMENT PARA STACK STACK DB 64 DUP(STACK) ; Se define inicialmente 64 bytes, pero el valor puede ser ; mayor o menor segn las necesidades del programador STACK ENDS DSEG SEGMENT PARA PUBLIC DATA ; Inserte sus datos aqu DESEG ENDS CSEG SEGMENT PARA PUBLIC CODE ASSUME CS:CSEG, DS:DSEG, SS:STACK ENTRY PROC FAR ;Punto de entrada del programa

;Se inicializa la pila para que contenga los valores apropiados ;de tal manera que al finalizar el programa se pueda regresar ;el control DOS PUSH DS SUB AX,AX PUSH AX ;Inicializa el segmento de datos MOV AX,DSEG MOV DS,AX ; Inserte sus instrucciones aqu RET ENTRY ENDP CSEG ENDS END ENTRY

Ing. Antonio Romn V. UNEXPO PUERTO ORDAZ

126

Microprocesadores de 16 bits y tecnologa PC

Mdulos secundarios
Esta plantilla es para mdulos secundarios que deben ser enlazados con l modulo principal. Debe aclararse que los mdulos secundarios solo son aplicables a programas .EXE, dada su capacidad de usar mltiples segmentos. TITLE (Inserte el titulo del modulo aqu)

PUBLIC PNAME (Inserte PUBLIC para variables y datos, si es apropiado) DSEG SEGMENT PARA PUBLIC DATA (Inserte aqu sus datos) DSEG ENDS CSEG SEGMENT PARA PUBLIC CODE ASSUME CS:CSEG, DS:DSEG PNAME PROC NEAR

(Inserte sus instrucciones aqu) RET PNAME CSEG END ENDP ENDS

Modelo para mdulos principales de programas .COM


Los modelos anteriores son adecuados para programas EXE. Para hacer programas COM, tenemos la siguiente plantilla. TITLE (Inserte el titulo del programa aqu) (inserte directivas EXTRN aqu, si es apropiado) CSEG SEGMENT PARA PUBLIC CODE ASSUME CS:CSEG, DS:DSEG, ES:CSEG, SS:CSEG ORG 100H ;Salta hasta el final del PSP ENTRADA: JMP INICIO ;Salta los datos, si los hay... ; Aqu puede insertar sus datos INICIO PROC NEAR

(Inserte sus instrucciones aqu)


Ing. Antonio Romn V. UNEXPO PUERTO ORDAZ

Directivas del ensamblador RET ; Si lo considera conveniente, ac tambin puede introducir sus datos INICIO ENDP CSEG ENDS END ENTRADA

127

Modelo para mdulos secundarios de programas .COM


TITLE PUBLIC (Inserte el titulo del modulo aqu) PNAME

CSEG SEGMENT PARA PUBLIC CODE ASSUME CS:CSEG, DS:CSEG, ES:CSEG, SS:CSEG (Inserte sus datos aqu) PNAME PROC NEAR

(Inserte sus instrucciones aqu) RET PNAME CSEG END ENDP ENDS

Directivas avanzadas
Las directivas avanzadas permiten el ensamblado del programa de acuerdo a condiciones especiales, tanto de instrucciones como de datos. De esta manera, es posible generar ms de un tipo de programa con los mismos mdulos.

Directivas de datos
Entre las directivas de datos tenemos GROUP y LABEL. La directiva GROUP proporciona un nombre a un grupo de segmentos. Esto permite que todos los elementos agrupados de esta forma sean manejados por una sola declaracin a un registro de segmento. Si se siguen las reglas de manejo de segmentos, podemos estar seguros que los segmentos agrupados estarn todos almacenados en un nico segmento fsico de 64K. Esto facilita la creacin de archivos COM.
Ing. Antonio Romn V. UNEXPO PUERTO ORDAZ

128

Microprocesadores de 16 bits y tecnologa PC

Por otro lado, supongamos que se desean usar dos procedimientos que estn en archivos de disco externos. El problema es que ambos procedimientos son NEAR, pero tienen segmentos de cdigo con nombre diferente a su segmento de cdigo original. Especficamente, PROC1 esta en CODESEG y los datos en DATASEG, mientras que PROC2 esta en CODE_SEG y los datos en DATA_SEG. Dado que los procedimientos NEAR solo pueden ser llamados dentro del mismo segmento, podemos notar que no es posible usar esos archivos. Pero usando GROUP es posible llamar esos procedimientos. Para mayor claridad, veamos el siguiente ejemplo: ; Definicin de segmentos externos CODESEG SEGMENT PARA PUBLIC CODE EXTRN PROC1:NEAR CODESEG ENDS CODE_SEG SEGMENT PARA PUBLIC CODE EXTRN PROC2:NEAR CODE_SEG ENDS DATASEG DATESEG SEGMENT PARA PUBLIC DATA ENDS

DATA_SEG SEGMENT PARA PUBLIC DATA DATA_SEG ENDS ; Define grupos para segmentos de cdigo y datos CGROUP DGROUP GROPU CSEG, CODESEG, CODE_SEG GROUP DATASEG, DATA_SEG

; Definiciones del programa principal CSEG SEGMENT PARA PUBLIC CODE ASSUME CS:CGROUP, DS:DGROUP. SS:STACK INICIO PROC FAR .. .. MOV AX, DGROUP MOV DS, AX .. .. CALL PROC1 CALL PROC2 .. ..
Ing. Antonio Romn V. UNEXPO PUERTO ORDAZ

Directivas del ensamblador RET INICIO ENDP CSEG ENDS END INICIO

129

Con este ejemplo se ilustra en forma general, como pueden incluirse y definirse procedimientos externos. Por supuesto, es necesario tener en claro los nombre asignados a esos segmentos. Un detalle importante. Si se desea hacer una referencia a una etiqueta, tal como esta, por ejemplo: MOV DX, OFFSET MENSAJE donde MENSAJE esta definida en alguno de los mdulos externos (e inclusive es los internos) pueden generar problemas, dado que la referencia de segmento no es manejada directamente por el registro DS. Para ello, es mejor usar la siguiente instruccin MOV DX, OFFSET CGROUP:MENSAJE y la referencia ser correcta. La directiva LABEL define el segmento, desplazamiento y tipo de atributo de un nombre. Se puede usar LABEL para dar a una instruccin un atributo tipo FAR, de tal forma que una instruccin de salto desde otro segmento pueda hacer referencia a ella. Por ejemplo, AQUI MOV LABEL DX,0 FAR

etiqueta a la instruccin MOV en AQUI. Tambin puede usar LABEL para acceder los bytes de una tabla de valores word, o viceversa. Por ejemplo, el procesador reconocer las siguiente tabla como tipo byte y tipo word, llamadas TABLA_B y TABLA_W respectivamente: TABLA_B TABLA_W LABEL BYTE DW 2F24H, 36AH, 0817H, 3

Ing. Antonio Romn V. UNEXPO PUERTO ORDAZ

130

Microprocesadores de 16 bits y tecnologa PC

Directivas condicionales
Las directivas condicionales ocasionan que el ensamblador ensamble u obvie un grupo de instrucciones, basado en condiciones especificadas verdadero (TRUE) o falso (FALSE) en tiempo de ensamblado. Esta capacidad de ensamblado/no ensamblado le permite hacer diagnsticos o elaborar condiciones especiales de prueba en tiempo de ejecucin, o crear versiones especializadas de programas de mltiples propsitos. La porcin de programa con ensamblado condicional esta precedida por una directiva IF y terminada con una directiva ENDIF. En cada caso, si la condicin de prueba es evaluada como verdadera (TRUE) el cdigo incluido entre las directivas es ensamblado. Si la condicin es falsa (FALSE), el ensamblador ignora las instrucciones y continua a partir de la primera instruccin despus de ENDIF. Podemos agrupar las ocho directivas IF es cuatro pares: IFE es verdadera si la expresin es 0; IF es verdadera si la expresin no es cero. IF1 es verdadera cuando el ensamblador ejecuta el paso 1; IF2 es verdadera cuando se ejecuta el paso 2. IFDEF es verdadera si el smbolo esta definido o ha sido declarado como externo por una directiva EXTRN; en otro caso, IFNDEF es verdadero. IFIDN es verdadero si las cadenas en la definicin IFIDN cadena1, cadena2 son idnticas; IFIDF es verdadero si son diferentes.

La opcin ELSE
Se puede usar el termino ELSE para generar un juego alterno de instrucciones para el caso FALSE. El formato general es: Ifxx [argumento] .. (instrucciones para el caso TRUE) .. [ELSE] .. (instrucciones para el caso FALSE) .. ENDIF Tambin existe la posibilidad de anidar las clusulas, como se muestra a continuacin: IFE [argumento1] .. . ELSE IFE [argumento2] ..
Ing. Antonio Romn V. UNEXPO PUERTO ORDAZ

Directivas del ensamblador ELSE IFE [argumento3] .. .. ELSE .. ENDIF ENDIF ENDIF

131

Ntese que se necesitan tres ENDIF separados para balancear los IFE precedentes. Note tambin la identacin para clarificar la lectura.

Ing. Antonio Romn V. UNEXPO PUERTO ORDAZ

132

Microprocesadores de 16 bits y tecnologa PC

Ing. Antonio Romn V. UNEXPO PUERTO ORDAZ

Das könnte Ihnen auch gefallen