Sunteți pe pagina 1din 20

Instrucciones de Ajuste AAA (Ajuste ASCII para la suma). Sintaxis: AAA Indicadores: OF DF IF TF SF ZF AF PF CF ? ? ? x ?

x Convierte el contenido del registro AL en un nmero BCD no empaquetado. Si los cuatro bits menos significativos de AL son mayores que 9 si el indicador AF est a 1, se suma 6 a AL, 1 a AH, AF se pone a 1, CF se iguala a AF y AL pone sus cuatro bits ms significativos a 0. Ejemplo: ADD AL,BL AAA En el ejemplo, tras la suma de dos nmeros BCD no empaquetados colocados en AL y BL, el resultado (por medio de AAA) sigue siendo un nmero BCD no empaquetado. DAA (Ajuste decimal para la suma). Sintaxis: DAA Indicadores: OF DF IF TF SF ZF AF PF CF ? x x x x x Convierte el contenido del registro AL en un par de valores BCD: si los cuatro bits menos significativos de AL son un nmero mayor que 9, el indicador AF se pone a 1 y se suma 6 a AL. De igual forma, si los cuatro bits ms significativos de AL tras la operacin anterior son un nmero mayor que 9, el indicador CF se pone a 1 y se suma 60h a AL. Ejemplo: ADD AL, CL DAA En el ejemplo anterior, si AL y CL contenan dos nmeros BCD empaquetados, DAA hace que el resultado de la suma (en AL) siga siendo tambin un BCD empaquetado. AAS (Ajuste ASCII para la resta). Sintaxis: AAS Indicadores: OF DF IF TF SF ZF AF PF CF ? - - - ?? x? x Convierte el resultado de la sustraccin de dos operandos BCD no empaquetados para que siga siendo un nmero BCD no empaquetado. Si el nibble inferior de AL tiene un valor mayor que 9, de AL se resta 6, se decrementa AH, AF se pone a 1 y CF se iguala a AF. El resultado se guarda en AL con los bits de 4 a 7 puestos a 0. Ejemplo: SUB AL,BL AAS En el ejemplo, tras la resta de dos nmeros BCD no empaquetados colocados en AL y BL, el resultado (por medio de AAS) sigue siendo un nmero BCD no empaquetado. DAS (Ajuste decimal para la resta). Sintaxis: DAS Indicadores: OF DF IF TF SF ZF AF PF CF x x x x X Corrige el resultado en AL de la resta de dos nmeros BCD empaquetados, convirtindolo tambin en un valor BCD empaquetado. Si el nibble inferior tiene un valor mayor que 9 o AF es 1, a AL se le resta 6, AF se pone a 1. Si el nibble mas significativo es mayor que 9 CF est a 1, entonces se resta 60h a AL y se activa despus CF.

Ejemplo: SUB AL, BL DAS En el ejemplo anterior, si AL y BL contenan dos nmeros BCD empaquetados, DAS hace que el resultado de la resta (en AL) siga siendo tambin un BCD empaquetado. AAM (Ajuste ASCII para la multiplicacin). Sintaxis: AAM Indicadores: OF DF IF TF SF ZF AF PF CF ? x x ? x ? Corrige el resultado en AX del producto de dos nmeros BCD no empaquetados, convirtindolo en un valor BCD tambin no empaquetado. En AH sita el cociente de AL/10 quedando en AL el resto de dicha operacin. Ejemplo: MUL BL AAM En el ejemplo, tras el producto de dos nmeros BCD no empaquetados colocados en AL y BL, el resultado (por medio de AAA) sigue siendo, en AX, un nmero BCD no empaquetado. AAD (Ajuste ASCII para la divisin). Sintaxis: AAD Indicadores: OF DF IF TF SF ZF AF PF CF ? x x ? x ? Convierte dos nmeros BCD no empaquetados contenidos en AH y AL en un dividendo de un byte que queda almacenado en AL. Tras la operacin AH queda a cero. Esta instruccin es necesaria ANTES de la operacin de dividir, al contrario que AAM. Ejemplo: AAD DIV BL En el ejemplo, tras convertir los dos nmeros BCD no empaquetados (en AX) en un dividendo vlido, la instruccin de dividir genera un resultado correcto. CBW (Conversin de byte en palabra). Sintaxis: CBW Indicadores: OF DF IF TF SF ZF AF PF CF Copia el bit 7 del registro AL en todos los bits del registro AH, es decir, expande el signo de AL a AX como paso previo a una operacin de 16 bits. CWD (conversin de palabra a doble palabra). Sintaxis: CWD Indicadores: OF DF IF TF SF ZF AF PF CF Expande el signo del registro AX sobre el registro DX, copiando el bit ms significativo de AH en todo DX. Instrucciones Aritmticas ADC (Suma con acarreo). Sintaxis: ADC destino, origen Indicadores:

OF DF IF TF SF ZF AF PF CF x x x x x x Suma los operandos origen, destino y el valor del indicador de acarreo (0 1) y el resultado lo almacena en el operando destino. Se utiliza normalmente para sumar nmeros grandes, de ms de 16 bits, en varios pasos, considerando lo que nos llevamos (el acarreo) de la suma anterior. Ejemplo: ADC AX,BX ADD (suma). Sintaxis: ADD destino, origen Indicadores: OF DF IF TF SF ZF AF PF CF x x x x x x Suma los operandos origen y destino almacenando el resultado en el operando destino. Se activa el acarreo si se desborda el registro destino durante la suma. Ejemplos: ADD AX, BX ADD CL, DH INC (Incrementar). Sintaxis: INC destino Indicadores: OF DF IF TF SF ZF AF PF CF x x x x x Incrementa el operando destino. El operando destino puede ser byte o palabra. Obsrvese que esta instruccin no modifica el bit de acarreo (CF) y no es posible detectar un desbordamiento por este procedimiento (utilcese ZF). Ejemplos: INC AL INC ES:[DI] INC SS: [BP+4] INC WORD PTR CS: [BX+DI+7] CMP (Comparacin). Sintaxis: CMP destino, origen Indicadores: OF DF IF TF SF ZF AF PF CF x x x x x x Resta origen de destino sin retornar ningn resultado. Los operandos quedan inalterados, paro los indicadores pueden ser consultados mediante instrucciones de bifurcacin condicional. Los operandos pueden ser de tipo byte o palabra pero ambos de la misma dimensin. Ejemplo: CMP BX, MEM_PAL CMP CH, CL DEC (Decrementar). Sintaxis: DEC destino Indicadores: OF DF IF TF SF ZF AF PF CF x -x x x x Resta una unidad del operando destino. El operando puede ser byte o palabra. Obsrvese que esta instruccin no modifica el bit de acarreo (CF) y no es posible detectar un desbordamiento por este procedimiento (utilcese ZF). Ejemplo:

DEC AX DEC MEM_BYTE NEG (Negacin). Sintaxis: NEG destino Indicadores: OF DF IF TF SF ZF AF PF CF x -x x x x x Calcula el valor negativo en complemento a dos del operando y devuelve el resultado en el mismo operando. Ejemplo: NEG AL SBB (resta con acarreo). Sintaxis: SBB destino, origen Indicadores: OF DF IF TF SF ZF AF PF CF x x x x x x Resta el operando origen del operando destino y el resultado lo almacena en el operando destino. Si est a 1 el indicador de acarreo adems resta una unidad ms. Los operandos pueden ser de tipo byte o palabra. Se utiliza normalmente para restar nmeros grandes de ms de 16 bits, en varios pasos, considerando lo que nos llevamos (el acarreo) de la resta anterior. Ejemplo: SBB AX, AX SBB CH, DH SUB (Resta). Sintaxis: SUB destino, origen Indicadores: OF DF IF TF SF ZF AF PF CF x x x x x x Resta el operando destino al operando origen, colocando el resultado en el operando destino. Los operandos pueden tener o no signo, siendo necesario que sean del mismo tipo, byte o palabra. Ejemplos: SUB AL, BL SUB DX, DX IMUL (multiplicacin entera con signo). Sintaxis:IMUL origen (origen no puede ser operando inmediato en 8086, s en 286) Indicadores: OF DF IF TF SF ZF AF PF CF x ? ? ? ? x Multiplica un operando origen con signo de longitud byte o palabra por AL o AX respectivamente. Si origen es un byte el resultado se guarda en AH (byte ms significativo) y en AL (menos significativo), si origen es una palabra el resultado es devuelto en DX (parte alta) y AX (parte baja). Si las mitades ms significativas son distintas de cero, independientemente del signo, CF y OF son activados. Ejemplo: IMUL BX IMUL CH MUL (multiplicacin sin signo). Sintaxis: MUL origen (origen no puede ser operando inmediato) Indicadores: OF DF IF TF SF ZF AF PF CF x ? ? ? ? x

Multiplica el contenido sin signo del acumulador por el operando origen. Si el operando destino es un byte el acumulador es AL guardando el resultado en AH y AL, si el contenido de AH es distinto de 0 activa los indicadores CF y OF. Cuando el operando origen es de longitud palabra el acumulador es AX quedando el resultado sobre DX y AX, si el valor de DX es distinto de cero los indicadores CF y OF se activan. Ejemplo: MUL BYTE PTR DS: [DI] MUL DX MUL CL Desbordamientos. Este alerta con los desbordamientos en las operaciones aritmticas. Ya que un byte solo permite el uso de un bit de signo y siete de datos (desde -128 hasta +127), una operacin aritmtica puede exceder con facilidad la capacidad de un registro de un byte. Y una suma en el registro AL, que exceda su capacidad puede provocar resultados inesperados. Byte por byte. Para multiplicar dos nmeros de un byte, el multiplicando esta en el registro AL y el multiplicador es un byte en memoria o en otro registro. Para la instruccin MUL DL, la operacin multiplica el contenido del AL por el contenido del DL. El producto generado esta en el registro AX. La operacin ignora y borra cualquier informacin que pueda estar en el AH. Antes de Multiplicar Despus de Multiplicar Palabra por palabra. Para multiplicar dos nmeros de una palabra, el multiplicando esta en el registro AX y el multiplicador es una palabra en memoria o en otro registro. Para la instruccin MUL DX, la operacin multiplica el contenido del AX por el contenido del DX. El producto generado es una palabra doble que necesita dos registros: la parte de orden alto (mas a la izquierda) en el DX y la parte de orden bajo (mas a la derecha) en el AX. La operacin ignora y borra cualquier informacin que puede estar en el DX.

Palabra doble por palabra doble. Para multiplicar dos nmeros de palabras dobles, el multiplicando esta en el registro EAX y el multiplicador es una palabra doble en memoria o en otro registro. El producto es generado en el par EDX:EAX. La operacin ignora y borra cualquier informacin que ya este en el EDX.

En los ejemplos siguientes, el multiplicador esta en un registro, el cual especifica el tipo de operacin: INSTRUCCIN MULTIPLICADOR MULTIPLICANDO PRODUCTO MUL CL byte AL AX MUL BXpalabra AX DX:AX MUL EBX palabra doble EAX EDX:EAX En los ejemplos siguientes, los multiplicadores estn definidos en memoria: BYTE1 DB ? WORD1 DW ?

DWORD1 DD ? OPERACION MULTIPLICADOR MUL BYTE1 BYTE1 MUL WORD1 WORD1 AX MUL DWORD1 DWORD1 EAX

MULTIPLICANDO PRODUCTO AL AX DX:AX EDX:EAX

DIV (Divisin sin signo). Sintaxis: DIV origen (origen no puede ser operando inmediato). Indicadores: OF DF IF TF SF ZF AF PF CF ? ? ? ? ? ? Divide, sin considerar el signo, un nmero contenido en el acumulador y su extensin (AH, AL si el operando es de tipo byte o DX, AX si el operando es palabra) entre el operando fuente. El cociente se guarda en AL o AX y el resto en AH o DX segn el operando sea byte o palabra respectivamente. DX o AH deben ser cero antes de la operacin. Cuando el cociente es mayor que el resultado mximo que puede almacenar, cociente y resto quedan indefinidos producindose una interrupcin 0. En caso de que las partes ms significativas del cociente tengan un valor distinto de cero se activan los indicadores CF y OF. Ejemplo: DIV BL DIV MEM_PAL IDIV (Divisin entera). Sintaxis: IDIV origen (origen no puede ser operando inmediato). Indicadores: OF DF IF TF SF ZF AF PF CF ? ? ? ? ? ? Divide, considerando el signo, un nmero contenido en el acumulador y su extensin entre el operando fuente. El cociente se almacena en AL o AX segn el operando sea byte o palabra y de igual manera el resto en AH o DX. DX o AH deben ser cero antes de la operacin. Cuando el cociente es positivo y superior al valor mximo que puede almacenarse (7fh 7fffh), o cuando el cociente es negativo e inferior al valor mnimo que puede almacenarse (81h u 8001h) entonces cociente y resto quedan indefinidos, generndose una interrupcin 0, lo que tambin sucede si el divisor es 0. Ejemplo: IDIV BL IDIV BX

Las operaciones de divisin bsicas son byte entre byte, palabra entre palabra y palabras dobles entre palabra dobles. Palabra entre palabra Aqu el dividendo esta en el AX y el divisor es un byte en memoria o en otro registro. Despus de la divisin, el residuo esta en el AH y el cociente esta en el AL. Ya que un cociente de un byte es muy pequeo -si es sin signo, un mximo de +255 (FFH) y con signo +127 (7FH)- esta operacin tiene un uso limitado. Palabra doble entre palabra. Para esta operacin, el dividendo esta en el par DX:AX y el divisor es una palabra en memoria o en otro registro. Despus de la divisin, el residuo esta en el DX y el cociente esta en el AX. El cociente de una palabra permite para datos sin signo un mximo de +32, 767 (FFFFH) y con signo +16, 383 (7FFFH). Tenemos:

Palabra cudruple entre palabra doble. Al dividir una palabra cudruple entre una palabra doble, el dividendo esta en el par EDX:EAX y el divisor est en una palabra doble en memoria o en otro registro. Despus de la divisin, el residuo esta en el EDX y el cociente en el AEX.

En los ejemplos siguientes, de DIV, los divisores estn en un registro, que determina el tipo de operacin: OPERACIN DIVISOR DIVIDENDO COCIENTE RESIDUO DIV CL byte AX AL AH DIV CX palabra DX:AX AX DX DIV EBXpalabra doble EDX:EAX EAX EDX En los ejemplos siguientes de DIV, los divisores estn definidos en memoria: BYTE1 DB ? WORD1DW ? DWORD1 DD ? ... DIVISOR DIVIDENDO COCIENTE RESIDUO DIV BYTE1 BYTE1 AX AL AH DIV WORD1 WORD1DX:AX AX DX DIV DWORD1 DWORD1 EDX:EAX EAX EDX Instrucciones de la pila. Estas instrucciones permiten el uso de la pila para almacenar y extraer datos. Instruccin POP Propsito: Recupera un dato de la pila Sintaxis: POP destino Esta instruccin transfiere el ltimo valor almacenado en la pila al operando destino, despus incrementa en dos el registro SP. La instruccin POP CS, poco til, no funciona correctamente en los 286 y superiores. Este incremento se debe a que la pila va creciendo desde la direccin ms alta de memoria del segmento hacia la ms baja, y la pila solo trabaja con palabras (2 bytes), entonces al incrementar en dos el registro SP realmente se le est restando dos al tamao real de la pila. Ejemplos: POP AX POP PEPE Instruccin POPF Propsito: Extrae las banderas almacenadas en la pila. Sintaxis: POPF Este comando transfiere bits de la palabra almacenada en la parte superior de la pila hacia el registro de banderas. La forma de transferencia es la siguiente: BIT BANDERA 0 CF 2 PF 4 AF 6 ZF 7 SF 8 TF 9 IF 10 DF 11 OF Estas localizaciones son las mismas para el comando PUSHF

Una vez hecha la transferencia se incrementa en 2 el registro SP disminuyendo as el tamao de la pila. Instruccin PUSH Propsito: Coloca una palabra en la pila. Sintaxis: PUSH fuente La instruccin PUSH decrementa en dos el valor de SP y luego transfiere el contenido del operando fuente a la nueva direccin resultante en el registro recin modificado. El decremento en la direccin se debe a que al agregar valores a la pila sta crece de la direccin mayor a la direccin menor del segmento, por lo tanto al restarle 2 al valor del registro SP lo que hacemos es aumentar el tamao de la pila en dos bytes, que es la nica cantidad de informacin que puede manejar la pila en cada entrada y salida de datos. Ejemplo: PUSH CS Instruccin PUSHF Propsito: Coloca el valor de las banderas en la pila Sintaxis: PUSHF Este comando decrementa en 2 el valor del registro SP y luego se transfiere el contenido del registro de banderas a la pila, en la direccin indicada por SP. Las banderas quedan almacenadas en memoria en los mismos bits indicados en el comando POPF. Instrucciones de Desplazamiento Lineal AL/SHL (Desplazamiento aritmtico a la izquierda). Sintaxis: SAL/SHL destino, contador Indicadores: OF DF IF TF SF ZF AF PF CF X x x ? x X Desplaza a la izquierda los bits del operando el nmero de bits especificado en el segundo operando que debe ser CL si es mayor que 1 los bits desplazados.

SAR (Desplazamiento aritmtico a la derecha). Sintaxis: SAR destino, contador Indicadores: OF DF IF TF SF ZF AF PF CF X x x ? x x Desplaza a la derecha los bits del operando destino el nmero de bits especificado en el segundo operando. Los bits de la izquierda se rellenan con el bit de signo del primer operando. Si el nmero de bits a desplazar es 1 se puede especificar directamente, si es mayor se especifica a travs de CL. Ejemplos: SAR AX, CL SAR BP,1 SHR (Desplazamiento lgico a la derecha). Sintaxis: SHR destino, contador Indicadores: OF DF IF TF SF ZF AF PF CF X x x ? x x Desplaza a la derecha los bits del operando destino el nmero de los bits especificados en el segundo operando. Los bits de la izquierda se llena con cero. Si el nmero de bits a desplazar es 1 se puede especificar directamente en el caso en que no ocurra se pone el valor en CL:

Ejemplos: SHR AX,CL SHR CL,1 AND (y lgico). Sintaxis: AND destino, origen Indicadores: OF DF IF TF SF ZF AF PF CF 0 x x ? x 0 Realiza una operacin de Y lgico entre el operando origen y destino quedando el resultado en el destino. Son vlidos operandos byte o palabra, pero ambos del mismo tipo. Ejemplos: AND AX,BX AND BL, BYTE PTR ES:[SI+10H] NOT (No lgico). Sintaxis: NOT destino Indicadores: OF DF IF TF SF ZF AF PF CF Realiza el complemento a uno del operando destino, invirtiendo cada uno de sus bits. Los indicadores no resultan afectados. Ejemplo: NOT AX OR (O lgico). Sintaxis: OR destino, origen Indicadores: OF DF IF TF SF ZF AF PF CF 0 x x ? x 0 Realiza una operacin O lgico a nivel de bits entre los dos operandos, almacenndose despus el resultado en el operando destino. Ejemplo: OR AX,BX XOR (O exclusivo). Sintaxis: XOR destino, origen Indicadores: OF DF IF TF SF ZF AF PF CF 0 x x ? x 0 Operacin OR exclusivo a nivel de bits entre los operandos origen y destino almacenndose el resultado en este ltimo. Ejemplo: XOR DI, AX Instrucciones de Desplazamiento Circular RCL (Rotacin a la izquierda con acarreo). Sintaxis: RCL destino, contador Indicadores: OF DF IF TF SF ZF AF PF CF x x

Rotar a la izquierda los bits del operando destino junto con el indicador de acarreo CF el nmero de bits especificado en el segundo operando. Si el nmero de bits a desplazar es 1, se puede especificar directamente, en caso contrario el valor debe cargarse en CL y especificar CL como segundo operando. No es conveniente que CL sea mayor de 7, en bytes; 15, en palabras. Ejemplos: RCL AX,1 RCL AL,CL RCL DI,1 RCR (Rotacin a la derecha con acarreo). Sintaxis: RCR destino, contador Indicadores: OF DF IF TF SF ZF AF PF CF x x Rotar a la derecha los bits del operando destino junto con el indicador de acarreo CF el nmero de bits especificado en el segundo operando. Si el nmero de bits es 1 se puede especificar directamente; en caso contrario su valor debe cargarse en CL y especificar CL como segundo operando: Ejemplos: RCR BX,CL RCR BX, ROL (Rotacin a la izquierda). Sintaxis: ROL destino, contador Indicadores: OF DF IF TF SF ZF AF PF CF x x Rota a la izquierda los bits del operando destino el nmero de bits especificado en el segundo operando, que puede ser 1 CL previamente cargado con el valor del nmero de veces. Ejemplos: ROL DX,CL ROL AH,1 ROR (Rotacin a la derecha). Sintaxis: ROR destino, contador Indicadores: OF DF IF TF SF ZF AF PF CF x x Rota a la derecha los bits del operando destino el nmero de bits especificado en el segundo operando. Si el nmero de bits es 1 se puede poner directamente, en caso contrario debe ponerse a travs de CL. Ejemplos: ROR CL,1 ROR AX,CL Procesos de Control NOP (Operacin nula). Sintaxis: NOP Indicadores: OF DF IF TF SF ZF AF PF CF Realiza una operacin nula, es decir, el microprocesador decodifica la instruccin y pasa a la siguiente. Realmente se trata de la instruccin XCHG AX,AX. ESC (Salida a un coprocesador).

Sintaxis: ESC cdigo_operacin, origen Indicadores: OF DF IF TF SF ZF AF PF CF Se utiliza en combinacin con procesadores externos, tales como los coprocesadores de coma flotante o de E/S, y abre al dispositivo externo el acceso a las direcciones y operandos requeridos. Al mnemnico ESC le siguen los cdigos de operacin apropiados para el coprocesador as como la instruccin y la direccin del operando necesario. Ejemplo: ESC 21,AX HLT (Parada hasta interrupcin o reset). Sintaxis: HLT Indicadores: OF DF IF TF SF ZF AF PF CF El procesador se detiene hasta que se restaura el sistema o se recibe una interrupcin. Como en los PC se producen normalmente 18,2 interrupciones de tipo 8 por segundo (del temporizador) algunos programadores utilizan HLT para hacer pausas y bucles de retardo. Sin embargo, el mtodo no es preciso y puede fallar con ciertos controladores de memoria. LOCK (Bloquea los buses). Sintaxis: LOCK Indicadores: OF DF IF TF SF ZF AF PF CF Es una instruccin que se utiliza en aplicaciones de recursos compartidos para asegurar que no accede simultneamente a la memoria ms de un procesador. Cuando una instruccin va precedida por LOCK, el procesador bloquea inmediatamente el bus, introduciendo una seal por la patilla LOCK. WAIT (Espera). Sintaxis: WAIT Indicadores: OF DF IF TF SF ZF AF PF CF Provoca la espera del procesador hasta que se detecta una seal en la patilla TEST. Ocurre, por ejemplo, cuando el coprocesador ha terminado una operacin e indica su finalizacin. Suele preceder a ESC para sincronizar las acciones del procesador y coprocesador. XLAT (traduccin). Sintaxis: XLAT tabla Indicadores: OF DF IF TF SF ZF AF PF CF La instruccin XLAT tabla carga en el registro AL el contenido de la posicin [BX][AL], en donde el registro BX ha de apuntar al comienzo de una tabla. Dicho de otra manera, AL hace de ndice de la tabla y de almacn destino del contenido de la tabla. Por ejemplo, el siguiente programa: DATOS SEGMENT TABLA DB 2, 3, 5, 8, 16, 23 DATOS ENDS CODIGO SEGMENT MOVE BX, OFFSET TABLA ;Inicializa BX con la direccin donde comienza la tabla

MOVE AL, 5 XLAT TABLA CODIGO ENDS Hace que al final el contenido de AL sea 16 ya que es el quinto elemento de la tabla y AL antes de XLAT TABLA contena el valor 5. Otro ejemplo: MOV BX, OFFSET TABLA MOV AL, 4 XLAT TABLA Para finalizar con las instrucciones de transferencia veremos un grupo de tres instrucciones: LEA o cargar direccin efectiva LDS o cargar el puntero en DS LES o cargar el puntero en ES denominadas de transferencia de direcciones. LEA (carga direccin efectiva). Sintaxis: LEA destino, origen Indicadores: OF DF IF TF SF ZF AF PF CF Transfiere el desplazamiento del operando fuente al operando destino. Otras instrucciones pueden a continuacin utilizar el registro como desplazamiento para acceder a los datos que constituyen el objetivo. El operando destino no puede ser un registro de segmento. En general, esta instruccin es equivalente a MOV destino, OFFSET fuentey de hecho los buenos ensambladores (TASM) la codifican como MOV para economizar un byte de memoria. Sin embargo, LEA es en algunos casos ms potente que MOV al permitir indicar registros de ndice y desplazamiento para calcular el offset: En el ejemplo de arriba, el valor depositado en DX es elOFFSET de la etiquetaDATO S ms el registro SI. Esa sola instruccin es equivalente a estas dos: MOV DX, OFFSET DATOS ADD DX, SI LDS (carga un puntero utilizando DS). Sintaxis: LDS destino, origen Indicadores: OF DF IF TF SF ZF AF PF CF Traslada un puntero de 32 bits (direccin completa de memoria compuesta por segmento y desplazamiento), al destino indicado y a DS. A partir de la direccin indicada por el operando origen, el procesador toma 4 bytes de la memoria: con los dos primeros forma una palabra que deposita endestino y, con los otros dos, otra en DS. Ejemplo: PUNT DD 12345678H LDS SI, PUNT Como resultado de esta instruccin, en DS:SI se hace referencia a la posicin de memoria 1234h:5678h; 'DD' sirve para definir una variable larga de 4 bytes (denominadaPUNT en el ejemplo). LES (carga un puntero utilizando ES). Sintaxis: LES destino, origen Esta instruccin es anloga a LDS, pero utilizando ES en lugar de D Bloques en ensamblador MODELOS DE MEMORIA. Los modelos de memoria constituyen las diversas maneras de acceder a la memoria por parte de los compiladores de C. En el caso del Turbo C se pueden distinguir los siguientes:

TINY: Se emplea en los programas donde es preciso apurar el consumo de memoria hasta el ltimo byte. Los 4 registros de segmento (CS, DS, ES, SS) estn asignados a la misma direccin, por lo que existe un total de 64 Kb donde se mezclan cdigo, datos y pila. Los programas de este tipo pueden convertirse a formato COM. SMALL: Se utiliza en aplicaciones pequeas. Los segmentos de cdigo y datos son diferentes y no se solapan. Por ello, hay 64 kb para cdigo y otros 64 Kb a repartir entre datos y pila. Segmentos Punteros Modelo Cdigo Datos Pila Cdigo Datos Tiny 64 Kb near near Small 64 Kb 64 Kb near near Medium 1 Mb 64 Kb far near Compact 64 Kb 1 Mb near far Large 1 Mb 1 Mb far far Huge 1 Mb 1 Mb (Bloques > 64 Kb) far far MEDIUM: Este modelo es ideal para programas largos que no manejan demasiados datos. Se utilizan punteros largos para el cdigo (que puede extenderse hasta 1 Mb) y cortos para los datos: la pila y los datos juntos no pueden exceder de 64 Kb. COMPACT: Al contrario que el anterior, este modelo es el apropiado para los programas pequeos que emplean muchos datos. Por ello, el programa no puede exceder de 64 Kb aunque los datos que controla pueden alcanzar el Mb, ya que los punteros de datos son de tipo far por defecto. LARGE: Empleado en las aplicaciones grandes y tambin por los programadores de sistemas que no tienen paciencia para andar forzando continuamente el tipo de los punteros (para rebasar el lmite de 64 Kb). Tanto los datos como el cdigo pueden alcanzar el Mb, aunque no se admite que los datos estticos ocupen ms de 64 Kb. Este modo es el que menos problemas da para manejar la memoria, no siendo quiz tan lento y pesado como indica el fabricante. HUGE: Similar al anterior, pero con algunas ventajas: por un lado, todos los punteros son normalizados automticamente y se admiten datos estticos de ms de 64 Kb. Por otro, y gracias a esto ltimo, es factible manipular bloques de datos de ms de 64 Kb cada uno, ya que los segmentos de los punteros se actualizan correctamente. Sin embargo, este modelo es el ms costoso en tiempo de ejecucin de los programas. Usando la pila Una seccin de la memoria del programa es reservado para el uso de una pila. La Intel 80386 y procesadores superiores contienen un registro llamado puntero a la pila, esp, el cual almacena la direccin del tope de la pila, la figura 1 de abajo muestra 3 valores enteros, 49, 30 y 72, almacenados en la pila(cada entero ocupando 4 bytes) con el registro esp apuntando a la direccin del tope de la pila. A diferencia de una pila creciendo hacia arriba, en las mquinas intel crecen hacia abajo. En la Figura 2 muestra las capas de la pila despus de la ejecucin pushl $15. El punter de la pila es decrementado de cuatro en cuatro y el nmero 15 es almacenando como lugares de 4 bytes, 1988, 1989, 1990 y 1991 La instruccin popl %eax copia el valor del tope de la pila(4 bytes) a eax e incrementa esp en 4. Qu sucede si no quieres copiar el valor del tope de la pila a un registro?. Puedes ejecutar la instruccin addl $4, %esp el cual simplemente incrementa el puntero de la pila. #Listing 3 .globl main main: movl $10, %eax call foo ret foo: addl $5, %eax ret

En Listing 3, la instruccin call foo pone la direccin de la instruccin despus de call en la llamada al programa sobre la pila y va hacia foo. La subrutina termina con ret, el cual transfiere el control a la instruccin cuya direccin se toma desde el tope de la pila. Obviamente el tope de la pila debe contener una direccin vlida ENTRADA Y SALIDA Funciones que realiza Vamos a sealar las funciones que debe realizar un computador para ejecutar trabajos de entrada/salida: - Direccionamiento o seleccin del dispositivo que debe llevar a cabo la operacin de E/S. - Transferencia de los datos entre el procesador y el dispositivo (en uno u otro sentido). - Sincronizacin y coordinacin de las operaciones. Esta ltima funcin es necesaria debido a la deferencia de velocidades entre los dispositivos y la CPU y a la independencia que debe existir entre los perifricos y la CPU (por ejemplo, suelen tener relojes diferentes). Se define una transferencia elemental de informacin como la transmisin de una sola unidad de informacin (normalmente un byte) entre el procesador y el perifrico o viceversa. Para efectuar una transferencia elemental de informacin son precisas las siguientes funciones: - Establecimiento de una comunicacin fsica entre el procesador y el perifrico para la transmisin de la unidad de informacin. - Control de los perifricos, en que se incluyen operaciones como prueba y modificacin del estado del perifrico. Para realizar estas funciones la CPU gestionar las lneas de control necesarias. Definiremos una operacin de E/S como el conjunto de acciones necesarias para la transferencia de un conjunto de datos (es decir, una transferencia completa de datos). Para la realizacin de una operacin de E/S se deben efectuar las siguientes funciones: - Recuento de las unidades de informacin transferidas (normalmente bytes) para reconocer el fin de operacin. - Sincronizacin de velocidad entre la CPU y el perifrico. - Deteccin de errores (e incluso correccin) mediante la utilizacin de los cdigos necesarios (bits de paridad, cdigos de redundancia cclica, etc.) - Almacenamiento temporal de la informacin. Es ms eficiente utilizar un buffer temporal especfico para las operaciones de E/S que utilizan el rea de datos del programa. - Conversin de cdigos, conversin serie/paralelo, etc. Dispositivos externos Una de las funciones bsicas del ordenador es comunicarse con los dispositivos exteriores, es decir, el ordenador debe ser capaz de enviar y recibir datos desde estos dispositivo. Sin esta funcin, el ordenador no sera operativo porque sus clculos no seran visibles desde el exterior. Existe una gran variedad de dispositivos que pueden comunicarse con un ordenador, desde los dispositivos clsicos (terminales, impresoras, discos, cintas, etc.) hasta convertidores A/D y D/A para aplicaciones de medida y control de procesos, De todos los posibles perifricos, algunos son de lectura, otros de escritura y otros de lectura y escritura (es importante resaltar que este hecho siempre se mira desde el punto de vista del proceso). Por otra parte, existen perifricos de almacenamiento tambin llamados memorias auxiliares o masivas. La mayora de los perifricos estn compuestos por una parte mecnica y otra parte electrnica. Estas partes suelen separarse claramente para dar una mayor modularidad. A la componente electrnica del perifrico se le suele denominar controlador del dispositivo o, tambin, adaptador del dispositivo. Si el dispositivo no tiene parte mecnica (como, por ejemplo, la pantalla de un terminal), el controlador estar formado por la parte digital del circuito. Frecuentemente los controladores de los dispositivos estn alojados en una placa de circuito impreso diferenciada del resto del perifrico. En este caso es bastante habitual que un mismo controlador pueda dar servicio a dispositivos de caractersticas similares. El principal problema planteado por los perifricos es su gran variedad que tambin afecta a las velocidades de transmisin. Por tanto, el mayor inconveniente que encontramos en los perifricos es la diferencia entre sus velocidades de transmisin y la diferencia entre stas y la velocidad de operacin del ordenador. PROCEDIMIENTOS EXTERNOS Este tipo de procedimientos permiten crear bibliotecas de funciones de ensamblador, permitiendo a su vez asemejarse ms a la programacin de alto nivel. El nombre del procedimiento debe estar presente, ser nico y seguir las reglas para la formacin de nombres del lenguaje. El operando far est relacionado con la ejecucin del programa. Cuando se solicita la ejecucin de un programa, el cargador de programas del DOS utiliza este nombre de procedimiento como el punto de entrada para la

primera instruccin a ejecutar. La directiva ENDP indica el fin de un procedimiento y contiene el mismo nombre que el enunciado PROC para permitir que el ensamblador relacione a los dos. Ya que los procedimientos deben estar por completo dentro de un segmento, ENDP define el final de un procedimiento antes que ENDS defina el final de un segmento. La organizacin de un programa en procedimientos proporciona los beneficios siguientes: 1. Reduce la cantidad de cdigo, ya que un procedimiento comn puede ser llamado desde cualquier lugar en el segmento de cdigo. 2. Fortalece la mejor organizacin del programa. 3. Facilita la depuracin del programa, ya que los errores pueden ser aislados con mayor claridad. 4. Ayuda en el mantenimiento progresivo de programas, ya que los procedimientos son identificados de forma rpida para su modificacin. Los procedimientos externos, a diferencia de los internos, se declaran en mdulos o programas separados al programa donde el procedimiento es llamado, en otras palabras, la llamada al procedimiento se encuentra en un programa y el procedimiento en otro. Para poder utilizar procedimientos externos, es necesario que sean declarados como pblicos en el programa donde se encuentran y que sean llamados como externos en el programa donde sern usados. Se debe contar con tres directivas de ensamble: .PUBLIC para declarar los procedimientos como pblicos, .EXTERN para indicar que el procedimiento que se va a usar est fuera del programa y .INCLUDE para enlazar el programa que contiene los procedimientos con el programa que los llama. Con estas capacidades, es fcil crear bibliotecas de procedimientos y macros que puedan ser utilizados constantemente por los dems programas, ahorrando con ello tiempo de programacin al reutilizar cdigo fuente. El segmento de cdigo contiene el cdigo ejecutable de un programa. Tambin tiene uno o mas procedimientos, definidos con la directiva PROC. Un segmento que tiene solo un procedimiento puede aparecer como sigue: NOMBRE OPERACION OPERANDO COMENTARIO nomsegmento SEGMENT PARA nomproc PROC FAR ;Un ;procedimiento ;dentro ;del segmento nomproc ENDP ;de cdigo nomsegmento ENDS Operaciones CALL y RET La instruccin CALL transfiere el control a un procedimiento llamado, y la instruccin RET regresa del procedimiento llamado al procedimiento original que hizo la llamada. RET debe ser la ultima instruccin en un procedimiento llamado. Los formatos generales para CALL y RET son: El cdigo objeto particular que CALL y RET generan depende de si la operacin implica un procedimiento NEAR (cercano) o un procedimiento FAR (lejano). Llamada y regreso cercanos. Una llamada (CALL) a un procedimiento dentro del mismo segmento es cercana y realiza lo siguiente: Disminuye el SP en 2 (una palabra) Mete el IP (que contiene el desplazamiento de la instruccin que sigue al CALL) en la pila. Inserta la direccin del desplazamiento del procedimiento llamado en el IP (esta operacin vaca el resultado de la instruccin previamente procesada), Un RET que regresa desde un procedimiento cercano realiza lo siguiente: Saca el antiguo valor de IP de la pila y lo enva al IP (lo cual tambin vaca el resultado de la instruccin previamente procesada). Incrementa el SP en 2. Ahora el CS:IP apunta a la instruccin que sigue al CALL original en la llamada del procedimiento, en donde se reasume la ejecucin. Llamada y regreso lejanos. Una llamada (CALL) lejana llama a un procedimiento etiquetado con FAR, tal vez en un segmento de cdigo separado. Un CALL lejano mete a la pila al CS y al IP, y RET los saca de la pila. PROCEDIMIENTOS INTERNOS Procedimiento o subrutina. Es un grupo de instrucciones que, por lo general, desempean una tarea. Un procedimiento es una seccin de un programa que se puede volver a utilizar y que se almacena en memoria, pero se emplea tan a menudo como se necesite. Esto ahorra espacio en la memoria y facilita el desarrollo de la programacin. La desventaja de usar procedimientos es que la computadora requiere tiempo para ligarse con el procedimiento y regresar desde l. La instruccin CALL liga al procedimiento y la instruccin RET regresa del procedimiento.

Ejemplo: SUMS PROC NEAR ADD AX, BX ADD AX, CX ADD AX, DX SUMS ENDP SUMS1 PROC FAR ADD AX, BX ADD AX, CX ADD AX, DX SUMS ENDP Cuando se comparan estos dos procedimientos, la nica diferencia es el cdigo de operacin de la instruccin para el retorno. Para NEAR el cdigo de operacin es C3H; para FAR es CBH. Cuando un procedimiento debe ser global, se debe definir como FAR. Los que realizan tareas locales se suelen definir como NEAR. Las principales ventajas en el uso de procedimientos son: permiten una codificacin ms limpia y compacta, es decir el cdigo fuente es ms pequeo; tambin permiten el ahorro de memoria, esto es porque un mismo procedimiento puede ser llamado varias veces en el mismo programa y slo requiere memoria una vez. Las partes que componen a un procedimiento son: Declaracin del procedimiento Cdigo del procedimiento Directiva de regreso Terminacin del procedimiento Por ejemplo, si queremos una rutina que nos sume dos bytes, almacenados en AH y AL cada uno y guardar la suma en el registro BX: suma PROC NEAR ;Declaracin del procedimiento mov Bx, 0 ;Contenido del procedimiento mov Bl, Ah mov Ah, 00 add Bx, Ax Ret ;Directiva de regreso suma Endp ;Declaracin de final del procedimiento En la declaracin la primera palabra, Suma, corresponde al nombre de nuestro procedimiento, Proc lo declara como tal y la palabra Near le indica al MASM que el procedimiento es intrasegmento. La directiva Ret carga la direccin IP almacenada en la pila para regresar al programa original, por ltimo, la directiva Suma Endp indica el final del procedimiento. Para declarar un procedimiento intersegmento sustituimos la palabra Near por la palabra FAR. El llamado de este procedimiento se realiza de la siguiente forma: Call Suma Las macros ofrecen una mayor flexibilidad en la Programacin comparadas con los procedimientos, pero no por ello se dejarn de utilizar estos ltimos. MACROS. Una macro es un grupo de instrucciones que efectan una tarea. Al ser llamada se inserta en el programa como nuevo cdigo que contiene una secuencia de instrucciones. Se utilizan las directivas MACRO y ENDM para delimitar una macrosecuencia. El primer enunciado de una macro es el que contiene el nombre y sus parmetros relacionados con ella. Por ejemplo TRANSF MACRO A,B que define la macro TRANSF. El ltimo enunciado de una macro es la instruccin ENDM que es una lnea por s sola. Es necesario definir la macro antes de utilizarla. Una macro puede llamar a otra. Variable local en una macro. Es aquella que aparece dentro del cuerpo de la macro, pero no est disponible fuera de ella. Para definir una variable local se utiliza la directiva LOCAL. Se puede utilizar para declarar etiquetas de saltos que requieren ser llamados varias veces y evita que marque error al expandir la macro. Ejemplo:
MINIMO MACRO dato1, dato2, resultado LOCAL ya_esta MOV AX,dato1 CMP AX,dato2 ; es dato1 el menor? JB ya_esta ; s MOV AX,dato2 ; no, es dato2 MOV resultado,AX ENDM

ya_esta:

La etiqueta ya_esta solo aparecer en la definicin de la macro, pero al expandirse ser sustituida por ??0000, ??0001, etc. Parmetros Formales y Parmetros Actuales. Cuando se llama a una macro se le pueden pasar opcionalmente un cierto nmero de parmetros de cierto tipo. A estos parmetros se le denominan parmetros actuales. En la definicin de la macro, dichos parmetros aparecen asociados a ciertos nombres, cuya nica funcin es permitir distinguir unos parmetros de otros e indicar el orden en que son entregados, estos son los parmetros formales. Al expandir la macro los parmetros formales son sustituidos por sus parmetros actuales. Es una buena prctica utilizar PUSH y POP al inicio y al final de las MACROS para mantener los valores de los registros, en caso de ser necesario. Si se indican ms parmetros de los que una macro necesita, se ignorarn los restantes. En caso de faltar se dar un mensaje de advertencia o error, dependiendo del ensamblador. Como buena prctica se debe evitar. Ejemplo:
SUMAR MACRO a,b,total PUSH AX MOV AX,a ADD AX,b MOV total,AX POP AX ENDM .... SUMAR positivos, negativos, total

Es posible que no sea vlido expandir una macro. Por ejemplo ejecutar SUMAR AX, BX, DL porque DL es de 8 bits. Operador ;; Indica que lo que viene a continuacin es un comentario que no debe aparecer al expansionar la macro. Cuando al ensamblar se genera un listado del programa, las macros suelen aparecer expandidas en los puntos en que se invocan; sin embargo slo aparecern los comentarios normales que comiencen por (;). Los comentarios relacionados con el funcionamiento interno de la macro deberan ir con (;;), los relativos al uso y sintaxis de la misma con (;). Esto es adems conveniente porque durante el ensamblaje son mantenidos en memoria los comentarios de macros (no los del resto del programa) que comienzan por (;), y no conviene desperdiciar memoria. Operador & Utilizado para concatenar texto o smbolos. Es necesario para lograr que el ensamblador sustituya un parmetro dentro de una cadena de caracteres o como parte de un smbolo: SALUDO MACRO c MOV AL,"&c" etiqueta&c: CALL imprimir ENDM Al ejecutar SALUDO A se producir la siguiente expansin: MOV AL,"A" etiquetaA: CALL imprimir Si no se hubiera colocado el & se hubiera expandido como MOV AL,"c" Cuando se utilizan estructuras repetitivas REPT, IRP o IRPC (que se vern ms adelante) existe un problema adicional al intentar crear etiquetas, ya que el ensamblador se come un & al hacer la primera sustitucin, generando la misma etiqueta a menos que se duplique el operador &: MEMORIA MACRO x IRP i, <1, 2> x&i DB i ENDM ENDM Si se invoca MEMORIA ET se produce el error de "etiqueta ETi repetida", que se puede salvar aadiendo tantos '&' como niveles de anidamiento halla en las estructuras repetitivas empleadas, como se ejemplifica a continuacin: MEMORIA MACRO x IRP i, <1, 2> x&&i DB i ENDM ENDM

Lo que con MEMORIA ET generar correctamente las lneas: ET1 DB 1 ET2 DB 2 Operador ! o <> Empleado para indicar que el carcter que viene a continuacin debe ser interpretado literalmente y no como un smbolo. Por ello, !; es equivalente a <;>. Operador % Convierte la expresin que le sigue -generalmente un smbolo- a un nmero; la expresin debe ser una constante (no relocalizable). Slo se emplea en los argumentos de macros. Dada la macro siguiente:
PSUM MACRO mensaje, suma %OUT * mensaje, suma * ENDM

(Evidentemente, el % que precede a OUT forma parte de la directiva y no se trata del % operador que estamos tratando) Supuesta la existencia de estos smbolos:
SIM1 SIM2
PSUM

EQU EQU

120 500

Invocando la macro con las siguientes condiciones:


< SIM1 + SIM2 = >, (SIM1+SIM2) %OUT * SIM1 + SIM2 = (SIM1+SIM2) *

Se produce la siguiente expansin: Sin embargo, invocando la macro de la siguiente manera (con %):
PSUM < SIM1 + SIM2 = >, %(SIM1+SIM2)

Se produce la expansin deseada:


%OUT * SIM1 + SIM2 = 620 *

Directivas PUBLIC y EXTRN(EXTERN) La directiva PUBLIC se suele colocar en el campo de cdigo de un enunciado para definir que una etiqueta es pblica, a fin de poder emplearla en otros mdulos. Esta etiqueta puede ser una direccin para salto, una direccin de datos o todo un segmento. Cuando los segmentos se hacen pblicos se combinan con otros segmentos pblicos que contienen datos con el mismo nombre del segmento. La directiva EXTRN aparece en los segmentos de datos y de cdigo para definir que las etiquetas son externas al segmento. Si se define que los datos son externos, su tamao se debe expresar como BYTE, WORD o DWORD. Si una direccin para salto o para llamada son externas, se deben representar como Cercana(NEAR) o Lejana(FAR). Ejemplo:

Se le llama macro interna a aquella que se declara y se llama dentro del mismo programa.
MACROS EXTERNAS Una macro externa es aquella que es declarada en un archivo externo. Estos archivos tambin son conocidos como bibliotecas de macrosecuencias y pueden ser llamados con la directiva INCLUDE. Existe una directiva que permite que el archivo sea ledo una sola vez en la primera pasada, sta directiva es IF1 ENDIF. En s la definicin de la macro no consume memoria, por lo que es indiferente declarar muchas macros a ninguna.

REPT veces ... ENDM (Repeat) Permite repetir cierto nmero de veces una secuencia de instrucciones. El bloque de instrucciones se delimita con ENDM (no confundirlo con el final de una macro). Por ejemplo: REPT 2 OUT DX,AL ENDM Esta secuencia se transformar, al ensamblar, en lo siguiente: OUT DX,AL OUT DX,AL Empleando smbolos definidos con (=) y apoyndose adems en las macros se puede llegar a crear pseudo-instrucciones muy potentes: SUCESION MACRO n num = 0 REPT n DB num num = num + 1 ENDM ; fin de REPT ENDM ; fin de macro La sentencia SUCESION 3 provocar la siguiente expansin: DB 0 DB 1 DB 2 IRP simbolo_control, <arg1, arg2, ..., arg_n> ... ENDM (Indefinite repeat) Es relativamente similar a la instruccin FOR de los lenguajes de alto nivel. Los ngulos (<) y (>) son obligatorios. El smbolo de control va tomando sucesivamente los valores (no necesariamente numricos) arg1, arg2, ... y recorre en cada pasada todo el bloque de instrucciones hasta alcanzar el ENDM (no confundirlo con fin de macro) sustituyendo simbolo_control por esos valores en todos los lugares en que aparece: IRP i, <1,2,3> DB 0, i, i*i ENDM Al expansionarse, este conjunto de instrucciones se convierte en lo siguiente: DB 0, 1, 1 DB 0, 2, 4 DB 0, 3, 9 Nota: Todo lo encerrado entre los ngulos se considera un nico parmetro. Un (;) dentro de los ngulos no se interpreta como el inicio de un comentario sino como un elemento ms. Por otra parte, al emplear macros anidadas, deben indicarse tantos smbolos angulares '<' y '>' consecutivos como niveles de anidamiento existan. Lgicamente, dentro de una macro tambin resulta bastante til la estructura IRP:
TETRAOUT MACRO p1, p2, p3, p4, valor PUSH AX PUSH DX MOV AL,valor IRP cn, <p1, p2, p3, p4> MOV DX, cn OUT DX, AL ENDM ; fin de IRP POP DX POP AX ENDM ; fin de macro

Al ejecutar TETRAOUT 318h, 1C9h, 2D1h, 1A4h, 17 se obtendr:


PUSH PUSH MOV MOV OUT MOV OUT MOV OUT MOV OUT POP POP AX DX AL, 17 DX, 318h DX, AL DX, 1C9h DX, AL DX, 2D1h DX, AL DX, 1A4h DX,AL DX AX

Cuando se pasan listas como parmetros hay que encerrarlas entre '<' y '>' al llamar, para no confundirlas con elementos independientes. Por ejemplo, supuesta la macro INCD:
INCD MACRO lista, p IRP i, <lista> INC i ENDM ; fin de IRP DEC p ENDM ; fin de macro

Se comprende la necesidad de utilizar los ngulos: INCD AX, BX, CX, DX se expandir:
INC AX DEC BX; CX y DX se ignoran (4 parmetros)

INCD <AX, BX, CX>, DX se expandir:


INC AX INC BX INC CX DEC DX

; (2 parmetros)

* IRPC simbolo_control, <c1c2 ... cn> ... ENDM (Indefinite repeat character) Esta directiva es similar a la anterior, con una salvedad: los elementos situados entre los ngulos (<) y (>) -ahora opcionales, por cierto- son caracteres ASCII y no van separados por comas:
IRPC i, <813> DB i ENDM

El bloque anterior generar al expandirse:


DB DB DB 8 1 3

Ejemplo de utilizacin dentro de una macro (en combinacin con el operador &):
INICIALIZA MACRO a, b, c, d IRPC iter, <&a&b&c&d> DB iter ENDM ; fin de IRPC ENDM ; fin de macro

Al ejecutar INICIALIZA 7, 1, 4, 0 se produce la siguiente expansin:


DB 7 DB 1 DB 4 DB 0 EXITM

Sirve para abortar la ejecucin de un bloque MACRO, REPT, IRP IRPC. Normalmente se utiliza apoyndose en una directiva condicional (IF...ELSE...ENDIF). Al salir del bloque, se pasa al nivel inmediatamente superior (que puede ser otro bloque de estos). Como ejemplo, la siguiente macro reserva n bytes de memoria a cero hasta un mximo de 100, colocando un byte 255 al final del bloque reservado:
MALLOC MACRO n maximo=100 REPT n IF maximo EQ 0 ; ya van 100? EXITM ; abandonar REPT ENDIF maximo = maximo - 1 DB 0 ; reservar byte ENDM DB 255 ; byte de fin de bloque ENDM

existe la posibilidad de chequear condicionalmente la presencia de un parmetro por medio de IFNB, o su ausencia con IFB. Uniendo esto a la potencia de IRP es posible crear macros extraordinariamente verstiles. Como ejemplo, valga la siguiente macro, destinada a introducir en la pila un nmero variable de parmetros (hasta 10): es especialmente til en los programas que gestionan interrupciones:
XPUSH MACRO R1,R2,R3,R4,R5,R6,R7,R8,R9,R10 IRP reg, <R1,R2,R3,R4,R5,R6,R7,R8,R9,R10> IFNB <reg> PUSH reg ENDIF ENDM ; fin de IRP ENDM ; fin de XPUSH

Por ejemplo, la instruccin: Se expandir en:


PUSH AX PUSH AX PUSH DS PUSH ES PUSH VAR1

XPUSH AX,BX,DS,ES,VAR1

El ejemplo anterior es ilustrativo del mecanismo de comprobacin de presencia de parmetros. Sin embargo, este ejemplo puede ser optimizado notablemente empleando una lista como nico parmetro:
XPUSH MACRO lista IRP i, <lista> PUSH i ENDM ENDM XPOP MACRO lista IRP i, <lista> POP i ENDM ENDM

La ventaja es el nmero indefinido de parmetros soportados (no slo 10). Un ejemplo de uso puede ser el siguiente:
XPUSH <AX, BX, CX> XPOP <CX, BX, AX>

Que al expandirse queda:


PUSH PUSH PUSH POP POP POP AX BX CX CX BX AX

S-ar putea să vă placă și