Programacion hibrida

3. – Modularizacion. 3. 1 Macros. Por cada instruccion simbolica que se codifica, el ensamblador genera una instruccion de lenguaje maquina. Por cada enunciado codificado en un lenguaje de alto nivel, el compilador genera muchas instrucciones de lenguaje maquina. Por lo que se puede pensar en un lenguaje de alto nivel como macro-enunciado. Las macros son utiles para los siguientes propositos: Simplificar y reducir la cantidad de codificacion repetitiva. Reducir errores causados por la codificacion repetitiva.

Linealizar un programa en lenguaje ensamblador para hacerlo mas legible. Ejemplos de funciones que pueden ser implementados por macros son operaciones de entada- salida que cargan registros y realizan interrupciones, conversiones de informacion ASCII y binaria, aritmetica de palabras multiples, rutinas para el manejo de cadenas de caracteres y division por sustraccion. Definicion de una macro. Si se desea incluir macros en un programa, primero es necesario definirla. Una definicion de macro aparece antes que cualquier definicion de segmento.

A continuacion se presenta un ejemplo de macro: INITZ MACRO ;Define Macro MOV AX,@data ; MOV DS, AX MOV ES, AX ENDM ;Fin de la macro El nombre de esta macro es INITZ, aunque es aceptable cualquier otro nombre valido que sea unico. La directiva MACRO en la primer linea le indica

Lo sentimos, pero las muestras de ensayos completos están disponibles solo para usuarios registrados

Elija un plan de membresía
al ensamblador que las instrucciones que la siguen, hasta ENDM (fin de la macro), son parte de la definicion de la macro. La directiva ENDM termina la definicion de la macro. Las instrucciones entre MACRO y ENDM comprenden el cuerpo de la definicion de la macro. Los nombres a que hace referecnia n la definicion de la macro, @data, AX, DS y ES, deben estar definidos en alguna parte del programa o deber ser dados a conocer de alguna otra forma al ensamblador. En forma subsecuente se puede usar la macroinstruccion INITZ en el segmento de codigo en donde quiera inicializar los registros. Cuando el ensamblador encuentra la macroinstruccion INITZ, busca en una tabla de instrucciones simbolicas y, a falta de una entrada, busca macroinstrucciones. Ya que el programa contiene una definicion de la macro INITZ, el ensamblador sustituye el cuerpo de la definicion generando las instrucciones: la expansion de la macro.

Un programa usaria la macroinstruccion INITZ solo una vez, aunque otras macros estan disenadas para ser utilizadas cualquier numero de veces y cada vez el ensamblador genera la misma expansion de la macro. Es dificil y molesto definir una macro para usarse solo una vez, pero podria catalogar esa macro en una biblioteca para usarla con todos los programas. Uso de parametros en macros. Para tener flexibilidad, puede definir nombres en ella como argumentos mudos (ficticios). La definicion de la macro siguiente, llamada PROMPT, proporciona el uso de la funcion 09h del DOS para presentar cualquier mensaje.

Cuando se usa la macroinstruccion, el programador tiene que proporcionar el nombre del mensaje, el cual hace referencia a un area de datos determinada por un signo de dolar. PROMPT MACRO MENSAJE ;Argumento mudo MOV AH, 09H LEA DX, MENSAJE INT 21H ENDM ;Fin de la macro Un argumento mudo en una definicion de macro indica al ensamblador que haga coincidir su nombre con cualquier aparicion del mismo nombre en el cuerpo de la macro. Por ejemplo, el argumento mudo MENSAJE tambien aparece en la instruccion LEA. Cuando utiliza la macroinstruccion PROMPT, usted proporciona un parametro como el nombre real del mensaje que sera presentado.

Por ejemplo: PROMPT MENSAJE2 En este caso, MENSAJE2 tiene que estar apropiadamente definido en el segmento de daos. El parametro en la macroinstruccion corresponde al argumento mudo en la definicion original de la macro: Definicion de macro: PROMPT MACRO MENSAJE Macroinstruccion: PROMPT MENSAJE2 El ensamblador ya ha hecho corresponder el argumento en la definicion original de la macro con la instruccion LEA en el cuerpo de la macro. Ahora sustituye el (los) parametros de la macroinstruccion MENSAJE2 por la presencia de MENSAJE en la instruccion LEA y la sustituye por cualquier otra aparicion de MENSAJE.

Un argumento mudo puede contener cualquier nombre valido, incluyendo un nombre de registro tal como CX. Puede definir una macro con cualquier numero de argumentos mudos, separados por coma, hasta la columna 120 de un renglon. El ensamblador sustituye los parametros de la macroinstruccion por los argumentos mudos en la definicion de la macro, entrada por entrada, de izquierda a derecha. Directiva LOCAL. Algunas macros requieren la definicion de datos y etiquetas de instrucciones dentro de la definicion de la macro.

Si utiliza la macro mas de una vez en el mismo programa y el ensamblador define los elementos de datos para cada aparicion, los nombres duplicados harian que el ensamblador genere un mensaje de error. Para asegurar que cada nombre generado sea unico, codifique la directiva LOCAL inmediatamente despues de la instruccion MACRO, aun antes de los comentarios (si existen). Su formato general es: LOCAL arg1, arg2, …. , argn ;uno o mas argumentos El siguiente ejemplo muestra una macro que calcula la division. DIVIDE MACRO DIVIDENDO, DIVISOR, COCIENTE LOCAL COMP LOCAL OUT MOV AX, DIVIDENDO

MOV BX, DIVISOR SUB CX, CX COMP: CMP AX, BX JB OUT SUB AX, BX INC CX JMP COMP OUT: MOV COCIENTE,CX ;Almacena cociente ENDM Directiva INCLUDE. La directiva INCLUDE se utiliza para incluir macros que estan almacenadas en una biblioteca de macros. Es recomendable que las macros desarrolladas formen parte de una biblioteca (todas en un archivo . lib) para usarlas posteriormente cuando sean necesarias. Para usar cualquiera de las macros catalogaas, en lugar de codificar las definiciones MACRO al iniciar el programa se utiliza la directiva include asi: INCLUDE D:MACRO. LIB …. INITZ

El ensamblador accesa el archivo macro. lib en la unidad e e incluye ambas definiciones de macro (INITZ en este caso). El ensambladr realiza las operaciones en dos pasadas, y es necesario forzar a que ocurra unicamente en la primera y no en ambas. IF1 INCLUDE D:MACRO. LIB ENDIF La directiva IF1 y ENDIF son directivas condicionales. IF1 le indica al ensamblador que accese la biblioteca solo en la pasada numero 1 del ensamblado. ENDIF termina la logica de IF. Una copia de la definicion . (El MASM 6. 0 no requiere directivas que hagan referencia a las dos pasadas). Directiva PURGE.

La ejecucion de una instruccion INCLUDE hace que el ensamblador incluya todas las definiciones de macros que estan especificadas en la biblioteca. Sin embargo, suponga que una biblioteca 10 macros, pero solo requiere 2. La directiva PURGE permite “eliminar” las macros que no requiera en el ensamblado actual. IF1 INCLUDE D:MACRO. LIB ENDIF PURGE PROMPT, DIVIDE ;Elimina las definiciones PROMPT Y DIVIDE …. INITZ ; Utiliza la macro DIRECTIVAS DE REPETICION.. Las directivas de repeticion REPT/IRP/IRPC hacen que el ensamblador repita un bloque de instrucciones terminadas por ENDM. (MASM 6. introdujo los terminos: REPEAT, FOR y FORC para reemplazarlas respectivamente). Estas directivas no tienen que estar contenidas en una definicion MACRO, pero si lo estan, es necesario un ENDM para finalizar la repeticion y un segundo ENDM para terminar la defincion MACRO. REPT: Repetir. La directiva REPT provoca la repeticion de un bloque de instrucciones hasta ENDM de acuerdo con el numero de veces en la expresion de entrada: REPT expresion Un uso de REPT podria ser para definir una tabla o parte de una tabla. El siguiente ejemplo define una macro que utiliza REPT para hacer sonar la bocina cinco veces: BEEP5 MACRO

MOV AH, 02H MOV DL, 07 REPT 5 INT 21H ENDM ENDM IRP: Repeticion indefinida. La directiva IRP hace que se repita un bloque de instrucciones hasta ENDM. El formato general es: IRP argmudo, Los argumentos, contenidos en parentesis angulares, son cualesquier numero de simbolo validos, incluyendo cadenas de caracteres, numericos o constantes aritmeticas. El ensamblador genera un bloque de codigo para cada argumento. El ejemplo siguiente el ensamblador genera DB 3, DB 9, DB 17, DB 25 y DB 28. IRP N, DB N IRPC: Repeticion indefinida con caracter. La directiva IRPC hace que se repita un bloque de instrucciones hasta ENDM.

El formato general es: IRPC argmudo, cadena El ensamblador genera un bloque de codigo para cada caracter en la cadena. En el siguiente ejemplo el ensamblador genera desde DW 3 hasta DW 8. IRPC N, 345678 DW N ENDM DIRECTIVAS CONDICIONALES. El lenguaje ensamblador permite usar varias directivas condicionales. Las directivas condicionales son muy utiles dentro de una definicion de macro, pero no estan limitadas a ese proposito. Cada directiva IF debe tener su correspondiente ENDIF para terminar una condicion que se prueba. Un ELSE opcional puede proporcionar una accion alterna.

A continuacion esta el formato general para la familia IF de directivas condicionales: Ifxx (condicion) … ELSE (opcional) … ENDIF (fin del IF) La omision de ENDIF provoca el mensaje de error “condicional no determinado”. Si una condicion examinada es verdadera, el ensamblador ejecuta el bloque condicional hasta el ELSE o, si no esta ELSE, hasta el ENDIF. Si la condicion es falsa, el ensamblador ejecuta el bloque condicional que sigue al ELSE; si no esta presente un ELSE, no genera codigo alguno para el bloque condicional. A continuacion se explican las diferentes directivas condicionales: Directiva |Significado | |IF expresion |Si la expresion que se evalua es diferente de cero, el ensamblador ensambla las instrucciones | | |dentro del bloque condicional. | |IFE expresion |Si la expresion que se evalua es cero, el ensamblador ensambla las instrucciones dentro del | | |bloque condicional. | |IF1 (sin expresion) |Si el ensamblador esta procesando la primer pasada actua sobre las instrucciones en el bloque | |condicional. | |IF2 (sin expresion) |Si el ensamblador esta procesando la segunda pasada actua sobre las instrucciones en el bloque | | |condicional. | |IFDEF simbolo |Si el simbolo esta definido en el programa o es declarado como EXTRN, el ensamblador procesa las | | |instrucciones en el bloque condicional, el ensamblador procesa las instrucciones en el bloque | | |condicional. | IFNDEF simbolo |Si el simbolo no esta definido en el programa o no es declarado como EXTRN, el ensamblador | | |procesa las instrucciones en el bloque condicional. | |IFB |Si el argumento esta en blanco, el ensamblador procesa las instrucciones en el bloque | | |condicional. El argumento necesita los parentesis angulares. | |IFNB |Si el argumento no esta en blanco, el ensamblador procesa las instrucciones en el bloque | |condicional. El argumento necesita las parentesis angulares. | |IFIDN , |Si la cadena del argumento 1 es identica a la cadena del argumento 2, el ensamblador procesa las | | |instrucciones en el bloque condicional. El argumento necesita los parentesis angulares. | |IFDIF , |Si la cadena del argumento 2 es diferente a la cadena del argumento 2, el ensamblador procesa las| | |instrucciones en el bloque condicional. El argumento necesita los parentesis angulares. IF e IFE pueden usar operadores relacionales EQ (igual), NE (diferente), LT (menor que), LE (menor o igual), GT (mayor que) y GE (mayor o igual que). Por ejemplo: IF expresion1 EQ expresion2 A continuacion se presenta un ejemplo sencillo del uso de IFNB. Toda INT21H requiere cd una funcion en el registro AH, y algunas peticiones tambien necesitan un numero en el DX. La macro DOS21 utiliza IFNB para probar un argumento no blanco para el DX; si el resultado es verdadero (el argumento no es blanco), el ensamblador genera la instruccion MOV que carga el DX: DOS21 MACRO FUNDOS, DIRECCIONDX

MOV AH, FUNDOS IFNB MOV DX, OFFSET DIRECCIONDX ENDIF INT 21H ENDM El uso de DOS21 para entrada sencilla desde el teclado solo necesita cargar el AH como un numero, en este caso la funcion 01H: DOS21 01 El ensamblador genera MOV AH,01 y la INT21H. La entrada de una cadena de caracteres necesita la funcion 0AH en el AH y la entrada de la direccion en DX. Podria codificar la macro DOS21 como: DOS21 0AH, IPFIELD Entonces el ensamblador genera ambas instrucciones MOV y la INT 21H. La Directiva EXITM. Una definicion de macro puede contener una directiva condicional que pruebe buscando una condicion grave.

Si la condicion es verdadera, el ensamblador sale desde cualquier expansion posterior de macro. La directiva EXITM sirve para este proposito: Ifxx [condicion] ….. (condicion no valida) EXITM … ENDIF Si el ensamblador encuentra EXITM en una expansion de una macroinstruccion, descontinua la expansion de la macro y reasume el procesamiento despues de ENDM. Tambien puede utilizar EXITM para terminar las directivas REPT, IRP e IRPC, aun si ellas estan contenidas dentro de una definicion de macro. 3. 2 Procedimientos. Hasta ahora los segmentos de codigo han consistido solo en un procedimiento, codificado como:

Begin Proc Far ….. ….. Begin Endp En este caso el operando FAR informa al sistema que la direccion indicada es el punto de entrada para la ejecucion del programa, mientras que la directiva ENDP define el final del procedimiento. Sin embargo, un segmento de codigo puede tener cualquier numero de procedimientos, todos distinguidos por PROC y ENDP. Un procedimiento llamado (o subrutina) es una seccion de codigo que realiza una tarea clara y definidad (como ubicar el cursor o bien obtener entrada del teclado). La organizacion de un programa en procedimientos proporciona los beneficios siguientes: Reduce la cantidad de codigo, ya que un procedimiento comun puede ser llamado desde cualquier lugar en el segmento de codigo. • Fortalece la mejor organizacion del programa. • Facilita la depuracion del programa, ya que los errores pueden ser aislados con mayor claridad. • Ayuda en el mantenimiento progresivo de programas, ya que los procedimientos son idenficados de forma rapida para su modificacion. Directiva PROC. Un procedimiento es un bloque de codigo que inicia con la directiva PROC y termina con la directiva ENDP. Un uso comun es para una subrutina dentro de un segmento de codigo.

La practica comun es utilizar CALL para entrar y RET para salir. El operando CALL puede ser un especificador de tipo NEAR o FAR y RET supone el mismo tipo. Un procedimiento que esta en el mismo segmento que el programa que llama es un procedimiento NEAR (cercano) y es accesado por un desplazamiento: Nombre-proc PROC [NEAR] Un operando por omision es NEAR. Si un procedimiento llamado es externo al segmento que hace la llamada, debe ser declarado como PUBLIC y debe usar CALL para introducirlo. Para un programa . EXE, el PROC principal que es el punto de entrada para la ejecucion debe ser FAR.

Tambien para un procedimiento llamado bajo un valor diferente de ASSUME CS debe tener el atributo FAR: Nombre-proc PROC FAR Una etiqueta lejana puede estar en otro segmento, el cual CALL accesa por una direccion y desplazamiento de segmento. Directiva ENDP. Esta directiva indica el final de un procedimiento, definido por PROC. El formato general es: Etiqueta ENDP La etiqueta es la misma como la que define el procedimiento. OPERACIONES CALL Y RET. La instruccion CALL transfiere el control a un procedimiento llamado, y la instruccion RET regresa del procedimiento llamado al procedimiento original que hizo la llamada.

RET debe ser la ultima instruccion en un procedimiento llamado. Los formatos generales para CALL y RET son: [etiqueta:] CALL procedimiento [etiqueta:] RET [inmediato] El codigo objeto particular que CALL y RET generan depende de si la operacion implica un procedimiento NEAR (cercano) o un procedimiento FAR (lejano). Llamada y regreso cercanos. Una llamada (CALL) a un procedimiento dentro del mismo segmento se conoce como cercano, y realiza lo siguiente: • Disminuye el SP en 2 (una palabra). • Mete a la pila el IP (que contiene el desplazamiento de la instruccion que sigue al CALL. Inserta la direccion del desplazamiento del procedimiento llamado en el IP (esta operacion vacia el resultado de la instruccion previamente procesada). Un RET que regresa desde un procedimiento cercano realiza lo siguiente: • Saca el antiguo valor de IP de la pila y lo envia al IP (lo cual tambien vacia el resultado de la instruccion previamente procesada). • Incrementa el SP en 2. Ahora el CS:IP apunta a la instruccion que sigue al CALL original en la llamada del procedimiento, en donde se reasume la ejecucion. Llamada y regreso lejanos.

Una llamada (CALL) lejana llama a un procedimiento etiquetado con FAR, tal vez en un segmento de codigo separado. Un CALL lejano mete a la pila al CS y al IP, RET los saca de la pila. Ejemplo de una llamada y regreso cercanos: .MODEL SMALL .STACK 64 .DATA .CODE BEGIN PROC FAR CALL B10 ;llamada a b10 …… MOV AX,4C00H ;Salida al DOS INT 21H BEGIN ENDP B10 PROC NEAR CALL C10 ;llamada a c10 ….. RET B10 ENDP C10 PROC NEAR …. RET C10 ENDP END BEGIN • El programa esta dividido en un procedimiento lejano, BEGIN y dos procedimientos cercados: B10 y C10.

Cada procedimiento tiene un nombre unico y contiene su propio ENDP para finalizar su definicion. • Las directivas PROC para B10 y C10 tienen el atributo NEAR para indicar que estos procedimientos estan dentro del segmento del codigo actual. Puesto que la omision del atributo hace que el ensamblador por omision tome NEAR. • En el procedimiento BEGIN, la instruccion CALL transfiere el control al procedimiento B10 e inicia su ejecucion. • En el procedimiento B10, la instruccion CALL transfiere el control al procedimiento C10 e inicia su ejecucion. En el procedimiento C10, la instruccion RET hace que el control regrese a la instruccion que sigue a CALL C10. • En el procedimiento B10, la instruccion RET hace que el control regrese la instruccion que sigue a CALL B10. • Entonces el procedimiento BEGIN reasume el procesamiento desde ese punto. • RET siempre regresa a la rutina que llama. Si B10 no termina con una instruccion RET, las instrucciones se ejecutarian pasando B10 e irian directamente a C10. De hecho si C10 no contiene un RET el programa ejecutaria, pasando el final de C10, todas las instrucciones (si hay) que estuvieran ahi, con resultados impredecibles.

Tecnicamente, puede transferir el control a un procedimiento cercano por medio una instruccion de salto o incluso por codigo normal en linea. Pero por claridad y consistencia, utilice CALL para transferir el control a un procedimiento y utilice RET para terminar la ejecucion de un procedimiento. Llamadas intrasegmento. Las instrucciones CALL usadas hasta este momento han sido llamadas intrasegmento; esto es, el procedimiento llamado esta en el mismo segmento de codigo que el procedimiento que llama. Una llamada (CALL) intrasegmento es cercana si el procedimiento llamado esta definido o si es por omision es NEAR (esto es, dentro de 32k).

La operacion CALL empuja el registro IP a la pila y reemplaza el IP con el desplazamiento de la direccion destino. Por tanto una llamada cercana hace referencia a un procedimiento (cercano) que se encuentra en el mismo segmento. Ahora considere una llamada (CALL) intrasegmento que consista del codigo objeto E82000, en donde E8 es el codigo de la operacion y 2000 es el desplazamiento de un procedimiento llamado. La operacion guarda el IP en la pila y almacena el 2000 como desplazamiento 0020 en el IP. Entonces el procesador combina la direccion actual en el CS con el desplazamiento en el IP para la siguiente instruccion a ejecutar.

Al salir del procedimiento llamado, un RET (cercano) saca de la pila el IP almacenado y regresa a la siguiente instruccion despues de CALL: CALL proc_cerc ;llamada cercana: guarda en la pila … ; el IP, enlaza a proc_cerc proc_cerc PROc NEAR … RET ;Regreso cercano: saca IP y regresa Proc_cerc ENDP Una llamada intrasegmento puede ser cercana, como se describio, o lejana si la llamada es a un procedimiento definido como lejano dentro del mismo segmento. RET es cercano si aparece en un procedimiento NEAR y lejano si aparece en un procedimiento FAR. Llamadas intersegmento.

Una llamada CALL es clasificada como lejana si el procedimiento llamado esta definido como FAR o como EXTRN, con frecuencia en otro segmento. La operacion CALL primero guarda en la pila el contenido del registro CS e inserta una nueva direccion de segmento en el CS. Despues guarda en la pila el IP e inserta un nuevo desplazamiento de direccion en el IP. (Los datos guardados en el CS e IP proporcionan la direccion de la instruccion que sigue de forma inmediata a CALL). De esta manera, ambas direcciones del segmento de codigo y el desplazamiento son guardados para regresar del procedimiento llamado.

Una llamada a otro procedimiento siempre es una llamada a un intersegmento lejano: CALL PROC2 ;llamada lejana : Guarda en la pila …. ; el cs, el ip enlaza a proc2 PROC2 PROC NEAR …. RET ;Regreso lejano: remueve IP, CS y PROC2 ENDP ;regresa Considere una llamada (CALL) intersegmento que consta del codigo objeto 9? 0002 AF04. El 9 A Hex es el codigo de la operacion para un CALL intersegmento. La operacion guarda en la pila el IP actual y almacena el nuevo desplazamiento 9992 como 0200 en el IP. Despues guarda en la pila el CS y almacena la nueva direccion de segmento AF04 como 04AF en CS.

Los numeros en el CS e IP se combinan para establecer la direccion de la primera instruccion a ejecutar en el subprograma llamado: Segmento de codigo: 04AF0H Desplazamiento en IP: + 0200H ———————– Desplazamiento efectiva: 04CF0H Al salir del procedimiento llamado, un RET intersegmento (lejano) revierte la operacion CALL removiendo de la pila las direcciones originales IP y CS y enviandolas a sus respectivos registros. La pareja CS:IP ahora apunta a la direccion de la siguiente instruccion despues del CALL original, en donde la ejecucion se reasume.

La diferencia entre un CALL cercano y uno lejano es basicamente que un CALL cercano solo reemplaza el desplazamiento IP, mientras que un CALL lejano reemplaza tanto la direccion del segmento CS como del desplazamiento IP. Atributos EXTRN y PUBLIC. El siguiente ejemplo en el que el programa principal MAINPROG llama a un subprograma SUBPROG. El requisito aqui es de una llamada CALL (intersegmento). El CALL en MAINPROG tiene que saber que SUBPROG hay fuera de MAINPROG (en caso contrario el ensamblador genera un mensaje de error de que SUBPROG es un simbolo no definido).

La directiva EXTRN SUBPROG:FAR le notifica al ensamblador que cualquier referencia a SUBPROG es a una etiqueta FAR que en este caso esta definida de forma externa, en otro ensamblado. Puesto que el ensamblador no tiene manera de saber la direccion en el momento de la ejecucion, genera operandos con codigo objeto “empty” (vacio) en CALL lejano (ceros para el desplazamiento y guiones para el segmento) que el enlazador posteriormente llena: 9 A 0000 – – – – E ;Call (llamada) al subprograma SUBPROG a su vez contiene una directiva PUBLIC que le indica al ensamblador y al enlazador que otro modulo debe conocer la direccion de SUBPROG.

En un paso posterior, cuando MAINPROG y SUBPROG sean ensamblados con exito en modulos objetos, pueden ser enlazados como sigue: El enlazador hace corresponder los EXTRN en un modulo objeto con los PUBLIC en el otro e inserta las direcciones de desplazamiento requeridas. Despues combina los dos modulos objetos en un modulo ejecutable. Si es incapaz de establecer la correspondencia entre las referencias, el enlazador envia mensajes de error; esperelos antes de intentar ejecutar el modulo. La directiva EXTRN.

La directiva EXTRN indica al ensamblador que el elemento llamado un dato, procedimiento o etiqueta esta definido en otro ensamblado. EXTRN tiene el siguiente formato: EXTRN nombre:tipo [,…. ] Puede definir mas de un nombre, hasta el final de la linea, o bien codificar instrucciones adicionales EXTRN. El otro modulo ensamblado a su vez debe definir el nombre e identificarlo como PUBLIC. La entrada tipo puede ser ABS (una constante), BYTE, DWORD, FAR, NEAR, WORD o un nombre definido por un EQU, y debe ser valido en terminos de la definicion real de su nombre:

BYTE, WORD y DWORD identifican datos a los que hace referencia un modulo, pero otro modulo los define. NEAR y FAR identifican a un procedimiento o etiqueta de instruccion a los que hace referencia un modulo pero otro modulo los define. La directiva PUBLIC. La directiva PUBLIC indica al ensamblador y al enlazador que la direccion de un simbolo especificado definido en el ensamblado actual estara disponible para otros modulos. El formato general para PUBLIC es: PUBLIC simbolo [,…. ] Puede definir mas de un simbolo, hasta el final de la linea, o bien codificar instrucciones PUBLIC adicionales.

La entrada simbolo puede ser una etiqueta (incluyendo etiquetas PROC), una variable o un numero. Entradas no validas incluyen nombres de registros y simbolos EQU que definen valores mayores de dos bytes. La llamada de procedimientos lejanos y el uso de EXTRN y PUBLIC ofrecerian un poco de dificultad, aunque se requiere de mucho cuidado para crear datos definidos en un modulo conocido en otros modulos. TITLE P23MAIN1 (EXE) Llama al subprograma EXTRN P23SUB1:FAR ;—————————————————————————————

STACKSG SEGMENT PARA STACK ? STACK? DW 64 DUP(? ) STACKSG ENDS ;—————————————————————————————- DATASG SEGMENT PARA ? DATA? QTY DW 0140H PRICE DW 2500H DATASG ENDS ;—————————————————————————————- CODESG SEGMENT PARA ? CODE? BEGIN PROC FAR ASSUME CS:CODESG, DS:DATASG, SS:STACKSG MOV AX,DATASG MOV DS, AX MOV AX, PRICE ;Configura precio y MOV BX, QTY ;cantidad CALL P23SUB1 ;Llama al subprograma MOV AX, 4C00H ;Sale al DOS INT 21H BEGIN ENDP CODESG ENDS

END BEGIN TITLE P23SUB1 Subprograma llamado ;—————————————————————————————— CODESG SEGMENT PARA ? CODE? P23SUB1 PROC FAR ASSUME CS:CODESG PUBLIC P23SUB1 MUL BX ;AX=Precio, BX= Cantidad RET ;DX:AX = producto P23SUB1 ENDP CODESG ENDS END P23SUB1 Directiva Segment. Un modulo ensamblado consiste en uno o mas segmentos, parte de un segmento o aun partes de varios segmentos. El formato general es: Nom-seg SEGMENT [alinear] [combinar] [? clase? ] …. Nom-seg ENDS Todos los operandos son opcionales. Alinear.

El operando alinear indica la frontera inicial para un segmento: BYTE Siguiente direccion. WORD Siguiente direccion par (divisible entre 2). DWORD Siguiente direccion de palabra doble (divisible entre 4). PARA Siguiente parrafo (divisible entre 10H). PAGE Siguiente direccion de pagina (divisible entre 100H). PARA es usado comunmente para todos los tipos de segmentos. BYTE y WORD pueden ser usados para segmentos que seran combinados dentro de otro segmento, por lo comun un segmento de datos. DWORD es normalmente usada con procesadores 80386 y posteriores. Combinar.

Los operandos combinar NONE, PUBLIC, STACK y COMMON indican la manera en que el enlazados maneja un segmento: |NONE (por omision) |El segmento sera separado logicamente de otros segmentos, aunque pueden estar adyacentes fisicamente. El | | |segmento se supone tiene su propia direccion base. | |PUBLIC |LINK carga segmentos PUBLIC del mismo nombre y clase adyacentes uno con otro. Una direccion base se supone | | |para tales segmentos PUBLIC. | |STACK |LINK trata STACK lo mismo que PUBLIC.

Debe haber definido al menos un STACK en un programa . EXE enlazado. Si | | |existe mas de una pila, el SP es puesto al inicio de la primera pila. | |COMMON |Si segmentos COMMON tienen el mismo nombre y clase, el enlazados les da la misma direccion base. Durante la | | |ejecucion, el segundo segmento se traslapa con el primero. El segmento mas grande determina el tamano del area| | |comun. | |AT direccion-parrafo |El parrafo debe estar definido previamente. La entrada facilita la definicion de etiquetas y variables en | |desplazamientos fijo dentro de areas fijas de memoria, tal como la tabla de interrupciones en memoria baja o | | |el area de datos del BIOS en 40[0]H. Por ejemplo, el codigo en ROM define la posicion del bufer del despliegue| | |de video como: | | |VIDEO_RAM SEGMENT AT 0B800H | |El ensamblador crea un segmento mudo (ficticio) que proporciona, de hecho, una imagen de las localidades de | | |memoria. | | | | Clase. 4. Programacion hibrida. 4. 1 Directivas para compilacion hibrida. 4. 2 Funciones en ensamblador. 4. 3 Bloques en ensamblador. 4. 4 Operadores. 4. 5 Integrar modulos de ensamblador en lenguajes de alto nivel. ———————– Bloque condicional