Guia Ensamblador

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 30

Universidad Catlica Andrs Bello Estructura del Computador Preparadora: Aneriz Rodrguez.

Ensamblador
Registros de la CPU La CPU tiene 14 registros internos, cada uno de 16 bits. Los primeros cuatro, AX, BX, CX, y DX son registros de uso general y tambin pueden ser utilizados como registros de 8 bits, para utilizarlos como tales es necesario referirse a ellos como por ejemplo: AH y AL, que son los bytes alto (high) y bajo (low) del registro AX. Esta nomenclatura es aplicable tambin a los registros BX, CX y DX. Los registros son conocidos por sus nombres especficos: AX Acumulador BX Registro base CX Registro contador DX Registro de datos DS Registro del segmento de datos ES Registro del segmento extra SS Registro del segmento de pila CS Registro del segmento de cdigo BP Registro de apuntadores base SI Registro ndice fuente DI Registro ndice destino SP Registro del apuntador de la pila IP Registro de apuntador de siguiente instruccin F Registro de banderas Es posible visualizar los valores de los registros internos de la CPU utilizando el programa Debug. Para empezar a trabajar con Debug digite en el prompt de la computadora: C:\> Debug [Enter] En la siguiente lnea aparecer un guin, ste es el indicador del Debug, en este momento se pueden introducir las instrucciones del Debug. Utilizando el comando: - r [Enter] Se desplegaran todos los contenidos de los registros internos de la CPU; una forma alternativa de mostrarlos es usar el comando "r" utilizando como parmetro el nombre del registro cuyo valor se quiera visualizar. Por ejemplo: - rbx Esta instruccin desplegar nicamente el contenido del registro BX y cambia el indicador del Debug de " - " a " : "

Estando as el prompt es posible cambiar el valor del registro que se visualiz tecleando el nuevo valor y a continuacin [Enter], o se puede dejar el valor anterior presionando [Enter] sin teclear ningn valor. Es posible cambiar el valor del registro de banderas, as como utilizarlo como estructura de control en nuestros programas como se ver mas adelante. Cada bit del registro tiene un nombre y significado especial, la lista dada a continuacin describe el valor de cada bit, tanto apagado como prendido y su relacin con las operaciones del procesador: Overflow NV = no hay desbordamiento; OV = s lo hay Direction UP = hacia adelante; DN = hacia atrs; Interrupts DI = desactivadas; EI = activadas Sign PL = positivo; NG = negativo Zero NZ = no es cero; ZR = s lo es Auxiliary Carry NA = no hay acarreo auxiliar; AC = hay acarreo auxiliar Parity PO = paridad non; PE = paridad par; Carry NC = no hay acarreo; CY = S lo hay La estructura del ensamblador En el lenguaje ensamblador las lneas de cdigo constan de dos partes, la primera es el nombre de la instruccin que se va a ejecutar y la segunda son los parmetros del comando u operandos. Por ejemplo: add ah bh Aqu "add" es el comando a ejecutar (en este caso una adicin) y tanto "ah" como "bh" son los parmetros. El nombre de las instrucciones en este lenguaje esta formado por dos, tres o cuatro letras. A estas instrucciones tambin se les llama nombres mnemnicos o cdigos de operacin, ya que representan alguna funcin que habr de realizar el procesador. Existen algunos comandos que no requieren parmetros para su operacin, as como otros que requieren solo un parmetro.

Algunas veces se utilizarn las instrucciones como sigue: add al,[170] Los corchetes en el segundo parmetro nos indican que vamos a trabajar con el contenido de la casilla de memoria nmero 170 y no con el valor 170, a esto se le conoce como direccionamiento directo. Interrupciones Definicin de interrupcin: Una interrupcin es una instruccin que detiene la ejecucin de un programa para permitir el uso de la CPU a un proceso prioritario. Una vez concluido este ltimo proceso se devuelve el control a la aplicacin anterior (aunque no siempre es as). Por ejemplo, cuando estamos trabajando con un procesador de palabras y en ese momento llega un aviso de uno de los puertos de comunicaciones, se detiene temporalmente la aplicacin que estbamos utilizando para permitir el uso del procesador al manejo de la informacin que est llegando en ese momento. Una vez terminada la transferencia de informacin se reanudan las funciones normales del procesador de palabras. Las interrupciones ocurren muy seguido, sencillamente la interrupcin que actualiza la hora del da ocurre aproximadamente 18 veces por segundo. Para lograr administrar todas estas interrupciones, la computadora cuenta con un espacio de memoria, llamado memoria baja, donde se almacenan las direcciones de cierta localidad de memoria donde se encuentran un juego de instrucciones que la CPU ejecutar para despus regresar a la aplicacin en proceso. El manejo directo de interrupciones es una de las partes ms fuertes del lenguaje ensamblador, ya que con ellas es posible controlar eficientemente todos los dispositivos internos y externos de una computadora gracias al completo control que se tiene sobre operaciones de entrada y salida. Formato Externo de un programa Adems de definir ciertas reglas para que el ensamblador pueda entender una instruccin es necesario darle cierta informacin de los recursos que se van a utilizar, como por ejemplo los segmentos de memoria que se van a utilizar, datos iniciales del programa y tambin donde inicia y donde termina nuestro cdigo. Un programa sencillo puede ser el siguiente: .MODEL SMALL .CODE Programa: MOV AX,4C00H INT 21H .STACK END Programa

El programa realmente no hace nada, nicamente coloca el valor 4C00H en el registro AX, para que la interrupcin 21H termine el programa, pero nos da una idea del formato externo en un programa de ensamblador. La directiva .MODEL define el tipo de memoria que se utilizar; la directiva .CODE nos indica que lo que esta a continuacin es nuestro programa; la etiqueta Programa indica al ensamblador el inicio del programa; la directiva .STACK le pide al ensamblador que reserve un espacio de memoria para las operaciones de la pila; la instruccin END Programa marca el final del programa. Ejemplo prctico de un programa Aqu se ejemplificar un programa que escriba una cadena en pantalla: .MODEL SMALL .CODE Programa: MOV AX, @DATA MOV DS, AX MOV DX, Offset Texto MOV AH, 9 INT 21H MOV AX,4C00H INT 21H .DATA Texto DB 'Mensaje en pantalla. $' .STACK END Programa Los primeros pasos son iguales a los del programa anterior: se define el modelo de memoria, se indica donde inicia el cdigo del programa y en donde comienzan las instrucciones. A continuacin se coloca @DATA en el registro AX para despus pasarlo al registro DS ya que no se puede copiar directamente una constante a un registro de segmento. El contenido de @DATA es el nmero del segmento que ser utilizado para los datos. Luego se guarda en el registro DX un valor dado por "Offset Texto" que nos da la direccin donde se encuentra la cadena de caracteres en el segmento de datos. Luego utiliza la opcin 9 (Dada por el valor de AH) de la interrupcin 21H para desplegar la cadena posicionada en la direccin que contiene DX. Por ltimo utiliza la opcin 4CH de la interrupcin 21H para terminar la ejecucin del programa (aunque cargamos al registro AX el valor 4C00H la interrupcin 21H solo toma como opcin el contenido del registro AH). La directiva .DATA le indica al ensamblador que lo que est escrito a continuacin debe almacenarlo en el segmento de memoria destinado a los datos. La directiva DB es utilizada para Definir Bytes, esto es, asignar a cierto identificador (en este caso "Texto") un valor, ya sea una constante o una cadena de caracteres, en este ltimo caso deber estar entre comillas sencillas ' y terminar con el smbolo "$".

Segmentos La arquitectura de los procesadores x86 obliga al uso de segmentos de memoria para manejar la informacin, el tamao de estos segmentos es de 64kb. La razn de ser de estos segmentos es que, considerando que el tamao mximo de un nmero que puede manejar el procesador esta dado por una palabra de 16 bits o registro, no sera posible accesar a ms de 65536 localidades de memoria utilizando uno solo de estos registros, ahora, si se divide la memoria de la PC en grupos o segmentos, cada uno de 65536 localidades, y utilizamos una direccin en un registro exclusivo para localizar cada segmento, y entonces cada direccin de una casilla especfica la formamos con dos registros, nos es posible accesar a una cantidad de 4.294.967.296 bytes de memoria, lo cual es, en la actualidad, ms memoria de la que veremos instalada en una PC. Para que el ensamblador pueda manejar los datos es necesario que cada dato o instruccin se encuentren localizados en el rea que corresponde a sus respectivos segmentos. El ensamblador accesa a esta informacin tomando en cuenta la localizacin del segmento, dada por los registros DS, ES, SS y CS, y dentro de dicho registro la direccin del dato especfico. Es por ello que cuando creamos un programa empleando el Debug en cada lnea que vamos ensamblando aparece algo parecido a lo siguiente: 1CB0:0102 MOV AX, BX En donde el primer nmero, 1CB0, corresponde al segmento de memoria que se est utilizando, el segundo se refiere la direccin dentro de dicho segmento, y a continuacin aparecen las instrucciones que se almacenaran a partir de esa direccin. La forma de indicarle al ensamblador con cuales de los segmentos se va a trabajar es por medio de las directivas .CODE, .DATA y .STACK. Las instrucciones del ensamblador Instrucciones de transferencia Son utilizadas para mover los contenidos de los operandos. Cada instruccin se puede usar con diferentes modos de direccionamiento. MOV MOVS (MOVSB) (MOVSW) Instrucciones de carga Son instrucciones especficas de los registros. Son usadas para cargar en algn registro bytes o cadenas de bytes. LODS (LODSB) (LODSW) LAHF LDS LEA LES Instrucciones de la pila Estas instrucciones permiten el uso de la pila para almacenar y extraer datos. POP POPF PUSH PUSHF

Instruccin MOV * Propsito: Transferencia de datos entre celdas de memoria, registros y acumulador. * Sintaxis: MOV Destino, Fuente Donde Destino es el lugar a donde se movern los datos y fuente es el lugar donde se encuentran dichos datos. Los diferentes movimientos de datos permitidos para esta instruccin son: Destino: Destino: Destino: Destino: Destino: Destino: Destino: Destino: Destino: Ejemplo: MOV AX, 0006h MOV BX, AX MOV AX, 4C00h INT 21H Este pequeo programa mueve el valor 0006H al registro AX, luego mueve el contenido de AX (0006h) al registro BX, por ltimo mueve el valor 4C00h al registro AX para terminar la ejecucin con la opcin 4C de la interrupcin 21h. Instruccin MOVS (MOVSB) (MOVSW) * Propsito: Mover cadenas de bytes o palabras desde la fuente, direccionada por SI, hasta el destino direccionado por DI. * Sintaxis: MOVS Este comando no necesita parmetros ya que toma como direccin fuente el contenido del registro SI y como destino el contenido de DI. La secuencia de instrucciones siguiente ilustran esto: MOV SI, OFFSET VAR1 MOV DI, OFFSET VAR2 MOVS Primero inicializamos los valores de SI y DI con las direcciones de las variables VAR1 y VAR2 respectivamente, despus al ejecutar MOVS se copia el contenido de VAR1 a VAR2. Los comandos MOVSB y MOVSW se utilizan de la misma forma que MOVS, el primero mueve un byte y el segundo una palabra. memoria. Fuente: acumulador acumulador. Fuente: memoria registro de segmento. Fuente: memoria/registro memoria/registro. Fuente: registro de segmento registro. Fuente: registro registro. Fuente: memoria memoria. Fuente: registro registro. Fuente: dato inmediato memoria. Fuente: dato inmediato

Instruccin LODS (LODSB) (LODSW) * Propsito: Cargar cadenas de un byte o palabra al acumulador. * Sintaxis: LODS Esta instruccin toma la cadena que se encuentre en la direccin especificada por SI, la carga al registro AL (o AX) y suma o resta 1 (segn el estado de DF) a SI si la transferencia es de bytes o 2 si la transferencia es de palabras. MOV SI, OFFSET VAR1 LODS La primer lnea carga la direccin de VAR1 en SI y la segunda lnea lleva el contenido de esa localidad al registro AL. Los comandos LODSB y LODSW se utilizan de la misma forma, el primero carga un byte y el segundo una palabra (utiliza el registro completo AX). Instruccin LAHF * Propsito: Transfiere al registro AH el contenido de las banderas * Sintaxis: LAHF Esta instruccin es til para verificar el estado de las banderas durante la ejecucin de nuestro programa. Las banderas quedan en el siguiente orden dentro del registro: SF ZF ? AF ? PF ? CF El smbolo "?" significa que en esos bits habr. un valor indefinido. Instruccin LDS * Propsito: Cargar el registro del segmento de datos * Sintaxis: LDS destino, fuente El operando fuente debe ser una palabra doble en memoria. La palabra asociada con la direccin ms grande es transferida a DS, o sea que se toma como la direccin del segmento. La palabra asociada con la direccin menor es la direccin del desplazamiento y se deposita en el registro sealado como destino. Instruccin LEA * Propsito: Carga la direccin del operando fuente. * Sintaxis: LEA destino, fuente El operando fuente debe estar ubicado en memoria, y se desplazamiento en el registro ndice o apuntador especificado en destino. coloca su

Para ilustrar una de las facilidades que tenemos con este comando pongamos una equivalencia: MOV SI, OFFSET VAR1 Equivale a: LEA SI, VAR1 Es muy probable que para el programador sea ms sencillo crear programas extensos utilizando este ltimo formato. Instruccin LES * Propsito: Carga el registro del segmento extra * Sintaxis: LES destino, fuente El operando fuente debe ser un operando en memoria de palabra doble. El contenido de la palabra con la direccin mayor se interpreta como la direccin del segmento y se coloca en ES. La palabra con la direccin menor es la direccin del desplazamiento y se coloca en el registro especificado en el parmetro destino. 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. Este incremento se debe a que la pila va creciendo desde la direccin mas alta de memoria del segmento hacia la mas baja, y la pila solo trabaja con palabras (2 bytes), entonces al incrementar en dos el registro SP realmente se le esta restando dos al tamao real de la pila. 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. 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 lgicas. Son utilizadas para realizar operaciones lgicas sobre los operandos. AND NEG NOT OR TEST XOR Instrucciones aritmticas. Se usan para realizar operaciones aritmticas sobre los operandos. ADC ADD DIV IDIV MUL IMUL SBB SUB

Instruccin AND * Propsito: Realiza la conjuncin de los operandos bit por bit. * Sintaxis: AND destino, fuente Con esta instruccin se lleva a cabo la operacin "y" lgica de los dos operandos: Fuente Destino | Destino -------------------------11 | 1 10 | 0 01 | 0 00 | 0 El resultado de la operacin se almacena en el operando destino. Instruccin NEG * Propsito: Genera el complemento a 2 * Sintaxis: NEG destino Esta instruccin genera el complemento a 2 del operando destino y lo almacena en este mismo operando. Por ejemplo, si AX guarda el valor de 1234H, entonces: NEG AX Nos dejara almacenado en el registro AX el valor EDCCH. Instruccin NOT * Propsito: Lleva a cabo la negacin bit por bit del operando destino. * Sintaxis: NOT destino El resultado se guarda en el mismo operando destino. Instruccin OR * Propsito: OR inclusivo lgico * Sintaxis: OR destino, fuente La instruccin OR lleva a cabo, bit por bit, la disyuncin inclusiva lgica de los dos operandos:

Fuente Destino | Destino -------------------------11 | 1 10 | 1 01 | 1 00 | 0

Instruccin TEST Propsito: Comparar lgicamente los operandos Sintaxis: TEST destino, fuente Realiza una conjuncin, bit por bit, de los operandos, pero a diferencia de AND esta instruccin no coloca el resultado en el operando destino, solo tiene efecto sobre el estado de las banderas. Instruccin XOR * Propsito: OR exclusivo * Sintaxis: XOR destino, fuente Su funcin es efectuar bit por bit la disyuncin exclusiva lgica de los dos operandos.

Fuente Destino | Destino -------------------------11 | 0 00 | 1 01 | 1 00 | 0 Instruccin ADC * Propsito: Adicin con acarreo. * Sintaxis: ADC destino, fuente Lleva a cabo la suma de dos operandos y suma uno al resultado en caso de que la bandera CF est activada, esto es, en caso de que exista acarreo. El resultado se guarda en el operando destino. Instruccin ADD * Propsito: Adicin de los operandos. * Sintaxis: ADD destino, fuente Suma los dos operandos y guarda el resultado en el operando destino. Instruccin DIV * Propsito: Divisin sin signo * Sintaxis: DIV fuente El divisor puede ser un byte o palabra y es el operando que se le da a la instruccin.

Si el divisor es de 8 bits se toma como dividendo el registro de 16 bits AX y si el divisor es de 16 bits se tomara como dividendo el registro par DX:AX, tomando como palabra alta DX y como baja AX. Si el divisor fue un byte el cociente se almacena en el registro AL y el residuo en AH, si fue una palabra el cociente se guarda en AX y el residuo en DX. Instruccin IDIV * Propsito: Divisin con signo * Sintaxis: IDIV fuente Consiste bsicamente en lo mismo que la instruccin DIV, solo que esta ltima realiza la operacin con signo. Para sus resultados utiliza los mismos registros que la instruccin DIV. Instruccin MUL * Propsito: Multiplicacin sin signo * Sintaxis: MUL fuente El ensamblador asume que el multiplicando ser del mismo tamao que el del multiplicador, por lo tanto multiplica el valor almacenado en el registro que se le da como operando por el que se encuentre contenido en AH si el multiplicador es de 8 bits o por AX si el multiplicador es de 16 bits. Cuando se realiza una multiplicacin con valores de 8 bits el resultado se almacena en el registro AX y cuando la multiplicacin es con valores de 16 bits el resultado se almacena en el registro par DX:AX. Instruccin IMUL * Propsito: Multiplicacin de dos enteros con signo. * Sintaxis: IMUL fuente Este comando hace lo mismo que el anterior, solo que si toma en cuenta los signos de las cantidades que se multiplican. Los resultados se guardan en los mismos registros que en la instruccin MUL. Instruccin SBB * Propsito: Substraccin con acarreo * Sintaxis: SBB destino, fuente Esta instruccin resta los operandos y resta uno al resultado si CF est activada. El operando fuente siempre se resta del destino. Este tipo de substraccin se utiliza cuando se trabaja con cantidades de 32 bits.

Instruccin SUB * Propsito: Substraccin * Sintaxis: SUB destino, fuente Resta el operando fuente del destino. Instrucciones de salto. Son utilizadas para transferir el flujo del proceso al operando indicado. JMP JA (JNBE) JAE (JNBE) JB (JNAE) JBE (JNA) JE (JZ) JNE (JNZ) JG (JNLE) JGE (JNL) JL (JNGE) JLE (JNG) JC JNC JNO JNP (JPO) JNS JO JP (JPE) JS Instrucciones para ciclos. Instruccin JMP * Propsito: Salto incondicional * Sintaxis: JMP destino Esta instruccin se utiliza para desviar el flujo de un programa sin tomar en cuenta las condiciones actuales de las banderas ni de los datos. Instruccin JA (JNBE) * Propsito: Brinco condicional * Sintaxis: JA Etiqueta Despus de una comparacin este comando salta si est arriba o salta si no est abajo o si no es igual. Esto significa que el salto se realiza solo si la bandera CF esta desactivada o si la bandera ZF esta desactivada (que alguna de las dos sea igual a cero).

Instruccin JAE (JNB) * Propsito: salto condicional * Sintaxis: JAE etiqueta Salta si est arriba o si es igual o salta si no est abajo. El salto se efecta si CF esta desactivada. Instruccin JB (JNAE) * Propsito: salto condicional * Sintaxis: JB etiqueta Salta si est abajo o salta si no est arriba o si no es igual. Se efecta el salto si CF esta activada. Instruccin JBE (JNA) * Propsito: salto condicional * Sintaxis: JBE etiqueta Salta si est abajo o si es igual o salta si no est arriba. El salto se efecta si CF est activado o si ZF est activado (que cualquiera sea igual a 1). Instruccin JE (JZ) * Propsito: salto condicional * Sintaxis: JE etiqueta Salta si es igual o salta si es cero. El salto se realiza si ZF est activada. Instruccin JNE (JNZ) * Propsito: salto condicional * Sintaxis: JNE etiqueta Salta si no es igual o salta si no es cero. El salto se efecta si ZF est desactivada. Instruccin JG (JNLE) * Propsito: salto condicional, se toma en cuenta el signo. * Sintaxis: JG etiqueta Salta si es ms grande o salta si no es menor o igual. El salto ocurre si ZF = 0 OF = SF.

Instruccin JGE (JNL) * Propsito: salto condicional, se toma en cuenta el signo. * Sintaxis: JGE etiqueta Salta si es ms grande o igual o salta si no es menor que. El salto se realiza si SF = OF Instruccin JL (JNGE) * Propsito: salto condicional, se toma en cuenta el signo. * Sintaxis: JL etiqueta Salta si es menor que o salta si no es mayor o igual. El salto se efecta si SF es diferente a OF. Instruccin JLE (JNG) * Propsito: salto condicional, se toma en cuenta el signo. * Sintaxis: JLE etiqueta Salta si es menor o igual o salta si no es ms grande. El salto se realiza si ZF = 1 o si SF es diferente a OF Instruccin JC * Propsito: salto condicional, se toman en cuenta las banderas. * Sintaxis: JC etiqueta Salta si hay acarreo. El salto se realiza si CF = 1 Instruccin JNC * Propsito: salto condicional, se toma en cuenta el estado de las banderas. * Sintaxis: JNC etiqueta Salta si no hay acarreo. El salto se efecta si CF = 0. Instruccin JNO Propsito: salto condicional, se toma en cuenta el estado de las banderas. Sintaxis: JNO etiqueta Salta si no hay desbordamiento. El salto se efecta si OF = 0.

Instruccin JNP (JPO) * Propsito: salto condicional, toma en cuenta el estado de las banderas. * Sintaxis: JNP etiqueta Salta si no hay paridad o salta si la paridad es non. El salto ocurre si PF = 0. Instruccin JNS * Propsito: salto condicional, toma en cuenta el estado de las banderas. * Sintaxis: JNP etiqueta Salta si el signo esta desactivado. El salto se efecta si SF = 0. Instruccin JO * Propsito: salto condicional, toma en cuenta el estado de las banderas. * Sintaxis: JO etiqueta Salta si hay desbordamiento (overflow). El salto se realiza si OF = 1. Instruccin JP (JPE) * Propsito: salto condicional, toma en cuenta el estado de las banderas. * Sintaxis: JP etiqueta Salta si hay paridad o salta si la paridad es par. El salto se efecta si PF = 1. Instruccin JS * Propsito: salto condicional, toma en cuenta el estado de las banderas. * Sintaxis: JS etiqueta Salta si el signo est prendido. El salto se efecta si SF = 1. Instruccin LOOP * Propsito: Generar un ciclo en el programa. * Sintaxis: LOOP etiqueta La instruccin loop decrementa CX en 1, y transfiere el flujo del programa a la etiqueta dada como operando si CX es diferente a 1.

Instruccin LOOPE * Propsito: Generar un ciclo en el programa considerando el estado de ZF * Sintaxis: LOOPE etiqueta Esta instruccin decrementa CX en 1. Si CX es diferente a cero y ZF es igual a 1, entonces el flujo del programa se transfiere a la etiqueta indicada como operando. Instruccin LOOPNE * Propsito: Generar un ciclo en el programa, considerando el estado de ZF * Sintaxis: LOOPNE etiqueta Esta instruccin decrementa en uno a CX y transfiere el flujo del programa solo si ZF es diferente a 0. Instruccin DEC * Propsito: Decrementar el operando * Sintaxis: DEC destino Esta operacin resta 1 al operando destino y almacena el nuevo valor en el mismo operando. Instruccin INC * Propsito: Incrementar el operando. * Sintaxis: INC destino La instruccin suma 1 al operando destino y guarda el resultado en el mismo operando destino. Instruccin CMP * Propsito: Comparar los operandos. * Sintaxis: CMP destino, fuente Esta instruccin resta el operando fuente al operando destino pero sin que ste almacene el resultado de la operacin, solo se afecta el estado de las banderas.

Instruccin CMPS (CMPSB) (CMPSW) * Propsito: Comparar cadenas de un byte o palabra. * Sintaxis: CMP destino, fuente Con esta instruccin la cadena de caracteres fuente se resta de la cadena destino. Se utilizan DI como ndice para el segmento extra de la cadena fuente y SI como ndice de la cadena destino. Solo se afecta el contenido de las banderas y tanto DI como SI se incrementan. Instruccin CLC * Propsito: Limpiar bandera de acarreo. * Sintaxis: CLC Esta instruccin apaga el bit correspondiente a la bandera de acarreo, o sea, lo pone en cero. Instruccin CLD * Propsito: Limpiar bandera de direccin * Sintaxis: CLD La instruccin CLD pone en cero el bit correspondiente a la bandera de direccin. Instruccin CLI * Propsito: Limpiar bandera de interrupcin * Sintaxis: CLI CLI pone en cero la bandera de interrupciones, deshabilitando as aquellas interrupciones enmascarables. ** Una interrupcin enmascarable es aquella cuyas funciones son desactivadas cuando IF = 0. ** Instruccin CMC * Propsito: Complementar la bandera de acarreo. * Sintaxis: CMC Esta instruccin complementa el estado de la bandera CF, si CF = 0 la instruccin la iguala a 1, y si es 1 la instruccin la iguala a 0. Podemos decir que nicamente "invierte" el valor de la bandera.

Instruccin STC * Propsito: Activar la bandera de acarreo. * Sintaxis: STC Esta instruccin pone la bandera CF en 1. Instruccin STD * Propsito: Activar la bandera de direccin. * Sintaxis: STD La instruccin STD pone la bandera DF en 1. Instruccin STI * Propsito: Activar la bandera de interrupcin. * Sintaxis: STI La instruccin activa la bandera IF, esto habilita las interrupciones externas enmascarables (las que funcionan nicamente cuando IF = 1).

Interrupciones Interrupciones internas de hardware Las interrupciones internas son generadas por ciertos eventos que surgen durante la ejecucin de un programa. Este tipo de interrupciones son manejadas en su totalidad por el hardware y no es posible modificarlas. Interrupciones externas de hardware Las interrupciones externas las generan los dispositivos perifricos, como pueden ser: teclado, impresoras, tarjetas de comunicaciones, etc. Tambin son generadas por los coprocesadores. Interrupciones de software La eleccin del tipo de interrupcin a utilizar depender nicamente de las caractersticas que le quiera dar a su programa: velocidad (utilizando las del BIOS) o portabilidad (utilizando las del DOS). Interrupcin 21H * Propsito: Llamar a diversas funciones del DOS. * Sintaxis: Int 21H Nota: Cuando trabajamos en MASM es necesario especificar que el valor que estamos utilizando es hexadecimal. Esta interrupcin tiene varias funciones, para accesar a cada una de ellas es necesario que el registro AH se encuentre el nmero de funcin que se requiera al momento de llamar a la interrupcin. Funciones para desplegar informacin al video. 02H Exhibe salida 09H Impresin de cadena (video) 40H Escritura en dispositivo/Archivo Funciones para leer informacin del teclado. 01H Entrada desde teclado 0AH Entrada desde teclado usando buffer 3FH Lectura desde dispositivo/archivo Mtodo FCB 0FH Abrir archivo 14H Lectura secuencial 15H Escritura secuencial 16H Crear archivo 21H Lectura aleatoria 22H Escritura aleatoria Handles 3CH Crear archivo 3DH Abrir archivo 3EH Cierra manejador de archivo 3FH Lectura desde archivo/dispositivo 40H Escritura en archivo/dispositivo 42H Mover apuntador de lectura/escritura en archivo

** Funcin 02H Uso: Despliega un carcter a la pantalla. Registros de llamada: AH = 02H DL = Valor del carcter a desplegar. Esta funcin nos despliega el carcter cuyo cdigo hexagesimal corresponde al valor almacenado en el registro DL, no se modifica ningn registro al utilizar este comando. Es recomendado el uso de la funcin 40H de la misma interrupcin en lugar de esta funcin. ** Funcin 09H Uso: Despliega una cadena de caracteres en la pantalla. Registros de llamada: AH = 09H DS:DX = Direccin de inicio de una cadena de caracteres Esta funcin despliega los caracteres, uno a uno, desde la direccin indicada en el registro DS:DX hasta encontrar un carcter $, que es interpretado como el final de la cadena. Se recomienda utilizar la funcin 40H en lugar de esta funcin. ** Funcin 40H Uso: Escribir a un dispositivo o a un archivo. Registros de llamada: AH = 40H BX = Va de comunicacin CX = Cantidad de bytes a escribir DS:DX = Direccin del inicio de los datos a escribir Registros de retorno: CF = 0 si no hubo error AX = Nmero de bytes escritos CF = 1 si hubo error AX = Cdigo de error El uso de esta funcin para desplegar informacin en pantalla se realiza dndole al registro BX el valor de 1 que es el valor preasignado al video por el sistema operativo MS-DOS. ** Funcin 01H Uso: Leer un carcter del teclado y desplegarlo. Registros de llamada: AH = 01H Registros de retorno: AL = Carcter ledo Con esta funcin es muy sencillo leer un carcter del teclado, el cdigo hexadecimal del carcter ledo se guarda en el registro AL. En caso de que sea un carcter extendido el registro AL contendr el valor de 0 y ser necesario llamar de nuevo a la funcin para obtener el cdigo de este carcter.

** Funcin 0AH Uso: Leer caracteres del teclado y almacenarlos en un buffer. Registros de llamada: AH = 0AH DS: DX = Direccin del rea de almacenamiento BYTE 0 = Cantidad de bytes en el rea BYTE 1 = Cantidad de bytes ledos desde BYTE 2 hasta BYTE 0 + 2 = caracteres ledos Los caracteres son ledos y almacenados en un espacio predefinido de memoria. La estructura de este espacio le indica que en el primer byte del mismo se indican cuantos caracteres sern ledos. En el segundo byte se almacena el nmero de caracteres que ya se leyeron, y del tercer byte en adelante se escriben los caracteres ledos. Cuando se han almacenado todos los caracteres indicados menos uno la bocina suena y cualquier carcter adicional es ignorado. Para terminar la captura de la cadena es necesario darle [ENTER]. ** Funcin 3FH Uso:

Leer informacin de un dispositivo o archivo.


Registros de llamada: AH = 3FH BX = Nmero asignado al dispositivo CX = Nmero de bytes a procesar DS:DX = Direccin del rea de almacenamiento Registros de retorno: CF = 0 si no hay error y AX = nmero de bytes ledos. CF = 1 si hay error y AX contendr el cdigo del error. ** Funcin 0FH Uso: Abrir archivo FCB Registros de llamada: AH = 0FH DS:DX = Apuntador a un FCB Registros de retorno: AL = 00H si no hubo problema, de lo contrario regresa 0FFH ** Funcin 14H Uso: Leer secuencialmente un archivo FCB. Registros de llamada: AH = 14H DS:DX = Apuntador a un FCB ya abierto. Registros de retorno: AL = 0 si no hubo errores, de lo contrario se regresara el cdigo correspondiente de error: 1 error al final del archivo, 2 errores en la estructura del FCB y 3 errores de lectura parcial. Esta funcin lo que hace es que lee el siguiente bloque de informacin a partir de la direccin dada por DS:DX, y actualiza este registro.

** Funcin 15H Uso: Escribir secuencialmente a un archivo FCB Registros de llamada: AH = 15H DS:DX = Apuntador a un FCB ya abierto Registros de retorno: AL = 00H si no hubo errores, de lo contrario contendr el cdigo del error: 1 disco lleno o archivo de solo lectura, 2 errores en la formacin o especificacin del FCB. La funcin 15H despus de escribir el registro al bloque actual actualiza el FCB. ** Funcin 16H Uso: Crear un archivo FCB. Registros de llamada: AH = 16H DS:DX = Apuntador a un FCB ya abierto. Registros de retorno: AL = 00H si no hubo errores, de lo contrario contendr el valor 0FFH Se basa en la informacin proveda en un FCB para crear un archivo en el disco.

** Funcin 21H Uso:

Leer en forma aleatoria un archivo FCB.


Registros de llamada: AH = 21H DS:DX = Apuntador a un FCB ya abierto. Registros de retorno: A = 00H si no hubo error, de lo contrario AH contendr el cdigo del error: 1 si es fin de archivo, 2 si existe error de especificacin de FCB y 3 si se ley un registro parcial o el apuntador del archivo se encuentra al final del mismo. Esta funcin lee el registro especificado por los campos del bloque actual y registro actual de un FCB abierto y coloca la informacin en el DTA (rea de transferencia de disco o Disk Transfer Area).

** Funcin 22H Uso: Escribir en forma aleatoria en un archivo FCB. Registros de llamada: AH = 22H DS:DX = Apuntador a un FCB abierto. Registros de retorno: AL = 00H si no hubo error, de lo contrario contendr el cdigo del error: 1 si el disco est lleno o es archivo de solo lectura y 2 si hay error en la especificacin de FCB. Escribe el registro especificado por los campos del bloque actual y registro actual de un FCB abierto. Escribe dicha informacin a partir del contenido del DTA (rea de transferencia de disco).

** Funcin 3CH Uso: Crear un archivo si no existe o dejarlo en longitud 0 si existe. (Handle) Registros de llamada: AH = 3CH CH = Atributo de archivo DS:DX = Apuntador a una especificacin ASCII Registros de retorno: CF = 0 y AX el nmero asignado al handle si no hay error, en caso de haberlo CF ser 1 y AX contendr el cdigo de error: 3 ruta no encontrada, 4 no hay handles disponibles para asignar y 5 acceso negado. Esta funcin sustituye a la 16H. El nombre del archivo es especificado en una cadena ASCIIZ, la cual tiene como caracterstica la de ser una cadena de bytes convencional terminada con un carcter 0. El archivo creado contendr los atributos definidos en el registro CX en la siguiente forma: Valor Atributos 00H Normal 02H Escondido 04H Sistema 06H Escondido y de sistema El archivo se crea con los permisos de lectura y escritura. No es posible crear directorios utilizando esta funcin.

** Funcin 3DH Uso: Abre un archivo y regrese un handle Registros de llamada: AH = 3DH AL = modo de acceso DS:DX = Apuntador a una especificacin ASCII Registros de retorno: CF = 0 y AX = nmero de handle si no hay errores, de lo contrario CF = 1 y AX = cdigo de error: 01H si no es vlida la funcin, 02H si no se encontr el archivo, 03H si no se encontr la ruta, 04H si no hay handles disponibles, 05H en caso de acceso negado, y 0CH si el cdigo de acceso no es vlido. El handle regresado es de 16 bits. El cdigo de acceso se especifica en la siguiente forma:

BITS 7654321 . . . . 0 0 0 Solo lectura . . . . 0 0 1 Solo escritura . . . . 0 1 0 Lectura/Escritura . . . X . . . RESERVADO

** Funcin 3EH Uso: Cerrar archivo (Handle). Registros de llamada: AH = 3EH BX = Handle asignado Registros de retorno: CF = 0 si no hubo errores, en caso contrario CF ser 1 y AX contendr el cdigo de error: 06H si el handle es invlido. Esta funcin actualiza el archivo y libera o deja disponible el handle que estaba utilizando. ** Funcin 3FH Uso: Leer de un archivo abierto una cantidad definida de bytes y los almacena en un buffer especfico. Registros de llamada: AH = 3FH BX = Handle asignado CX = Cantidad de bytes a leer DS:DX = Apuntador a un rea de trabajo. Registros de retorno: CF = 0 y AX = nmero de bytes ledos si no hubo error, en caso contrario CF = 1 y AX = cdigo de error: 05H si acceso negado y 06H si no es vlido el handle. ** Funcin 40H Uso: Escribe a un archivo ya abierto una cierta cantidad de bytes a partir del buffer designado. Registros de llamada: AH = 40H BX = Handle asignado CX = Cantidad de bytes a escribir. DS:DX = Apuntador al buffer de datos. Registros de retorno: CF = 0 y AX = nmero de bytes escritos si no hay errores, en caso de existir CF = 1 y AX = cdigo del error: 05H si el acceso es negado y 06H si el handle es invlido. ** Funcin 42H Uso: Mover apuntador al archivo (Handle) Registros de llamada: AH = 42H AL = mtodo utilizado BX = Handle asignado CX = La parte ms significativa del offset DX = La parte menos significativa del offset Registros de retorno: CF = 0 y DX:AX = la nueva posicin del apuntador. En caso de error CF ser 1 y AX = cdigo de error: 01H si la funcin no es vlida y 06H si el handle no es vlido.

El mtodo utilizado se configura como sigue: Valor de AL Mtodo 00H A partir del principio del archivo 01H A partir de la posicin actual 02H A partir del final del archivo

Interrupcin 10H * Propsito: Llamar a diversas funciones de video del BIOS. * Sintaxis: Int 10H Esta interrupcin tiene diversas funciones, todas ellas nos sirven para controlar la entrada y salida de video, la forma de acceso a cada una de las opciones es por medio del registro AH. Funciones comunes de la interrupcin 10H. ** 02H Seleccin de posicin del cursor ** 09H Escribe atributo y carcter en el cursor ** 0AH Escribe carcter en la posicin del cursor ** 0EH Escritura de caracteres en modo alfanumrico ** Funcin 02H Uso: Posiciona el cursor en la pantalla dentro de las coordenadas vlidas de texto. Registros de llamada: AH = 02H BH = Pgina de video en la que se posicionar el cursor. DH = Fila DL = Columna Las posiciones de localizacin del cursor son definidas por coordenadas iniciando en 0,0, que corresponde a la esquina superior izquierda hasta 79,24 correspondientes a la esquina inferior derecha. Tenemos entonces que los valores que pueden tomar los registros DH y DL en modo de texto de 80 x 25 son de 0 hasta 24 y de 0 hasta 79 respectivamente. ** Funcin 09H Uso: Desplegar un carcter un determinado nmero de veces con un atributo definido empezando en la posicin actual del cursor. Registros de llamada: AH = 09H AL = Carcter a desplegar BH = Pgina de video en donde se desplegar BL = Atributo a usar Nmero de repeticiones. Esta funcin despliega un carcter el nmero de veces especificado en CX pero sin cambiar la posicin del cursor en la pantalla.

** Funcin 0AH Uso: Desplegar un carcter en la posicin actual del cursor. Registros de llamada: AH = 0AH AL = Carcter a desplegar BH = Pgina en donde desplegar BL = Color a usar (slo en grficos). CX = Nmero de repeticiones La nica diferencia entre esta funcin y la anterior es que sta no permite modificar los atributos, simplemente usa los atributos actuales. Tampoco se altera la posicin del cursor con esta funcin.

** Funcin 0EH Uso: Desplegar un carcter en la pantalla actualizando la posicin del cursor. Registros de llamada: AH = 0EH AL = Carcter a desplegar BH = Pgina donde se desplegara el carcter BL = Color a usar (solo en grficos)

Interrupcin 16H * Propsito: Manejar la entrada/salida del teclado. * Sintaxis: Int 16H Veremos dos opciones de la interrupcin 16H, estas opciones, al igual que las de otras interrupciones, son llamadas utilizando el registro AH. ** Funcin 00H Uso: Leer un carcter del teclado. Registros de llamada: AH = 00H Registros de retorno: AH = cdigo de barrido (scan code) del teclado AL = Valor ASCII del carcter. Cuando se utiliza esta interrupcin se detiene la ejecucin del programa hasta que se introduzca un carcter desde el teclado, si la tecla presionada es un carcter ASCII su valor ser guardado en el registro AH, de lo contrario el cdigo de barrido ser guardado en AL y AH contendr el valor 00H. El cdigo de barrido fue creado para manejar las teclas que no tienen una representacin ASCII como [ALT], [CONTROL], las teclas de funcin, etc.

** Funcin 01H Uso: Leer estado del teclado. Registros de llamada: AH = 01H Registros de retorno: Si la bandera de cero, ZF, est apagada significa que hay informacin en el buffer, si se encuentra prendida es que no hay teclas pendientes. En caso de existir informacin el registro AH contendr el cdigo de la tecla guardada en el buffer.

Interrupcin 17H * Propsito: Manejar la entrada/salida de la impresora. * Sintaxis: Int 17H Esta interrupcin es utilizada para escribir caracteres a la impresora, inicializarla y leer su estado.

Mtodos de trabajo con archivos Existen dos formas de trabajar con archivos, la primera es por medio de bloques de control de archivos o "FCB" y la segunda es por medio de canales de comunicacin, tambin conocidos como "handles". El FCB est formado por los siguientes campos: POSICION LONGITUD SIGNIFICADO 00H 1 Byte Drive 01H 8 Bytes Nombre del archivo 09H 3 Bytes Extensin 0CH 2 Bytes Nmero de bloque 0EH 2 Bytes Tamao del registro 10H 4 Bytes Tamao del archivo 14H 2 Bytes Fecha de creacin 16H 2 Bytes Hora de creacin 18H 8 Bytes Reservados 20H 1 Byte Registro actual 21H 4 Bytes Registro aleatorio Para seleccionar el drive de trabajo se sigue el siguiente formato: drive A = 1; drive B = 2; etc. Si se utiliza 0 se tomar como opcin el drive que se est utilizando en ese momento. El nombre del archivo debe estar justificado a la izquierda y en caso de ser necesario se debern rellenar los bytes sobrantes con espacios, la extensin del archivo se coloca de la misma forma.

El bloque actual y el registro actual le dicen a la computadora que registro ser accesado en operaciones de lectura o escritura. Un bloque es un grupo de 128 registros. El primer bloque del archivo es el bloque 0. El primer registro es el registro 0, por lo tanto el ltimo registro del primer bloque sera 127, ya que la numeracin inici con 0 y el bloque puede contener 128 registros en total. Abrir archivos Para abrir un archivo FCB se utiliza la interrupcin 21H, funcin 0FH. La unidad, el nombre y extensin del archivo deben ser inicializados antes de abrirlo. El registro DX debe apuntar al bloque. Si al llamar a la interrupcin sta regresa valor de FFH en el registro AH es que el archivo no se encontr, si todo sali bien se devolver un valor de 0. Si se abre el archivo DOS inicializa el bloque actual a 0, el tamao del registro a 128 bytes y el tamao del mismo y su fecha se llenan con los datos encontrados en el directorio. Crear un archivo nuevo Para la creacin de archivos se utiliza la interrupcin 21H funcin 16H. DX debe apuntar a una estructura de control cuyos requisitos son que al menos se encuentre definida la unidad lgica, el nombre y la extensin del archivo. En caso de existir algn problema se devolver el valor FFH en AL, de lo contrario este registro contendr el valor de 0. Escritura secuencial Antes de que podamos realizar escrituras al disco es necesario definir el rea de transferencia de datos utilizando para tal fin la funcin 1AH de la interrupcin 21H. La funcin 1AH no regresa ningn estado del disco ni de la operacin, pero la funcin 15H, que es la que usaremos para escribir al disco, si lo hace en el registro AL, si ste es igual a cero no hubo error y se actualizan los campos del registro actual y bloque. Lectura secuencial Antes que nada debemos definir el rea de transferencia de archivos o DTA. Para leer secuencialmente utilizamos la funcin 14H de la int 21H. El registro a ser ledo es el que se encuentra definido por el bloque y el registro actual. El registro AL regresa el estado de la operacin, si AL contiene el valor de 1 o 3 es que hemos llegado al final del archivo. Un resultado de 2 significa que el FCB est mal estructurado. En caso de no existir error AL contendr el valor de 0 y los campos bloque actual y registro actual son actualizados.

Lectura y escritura aleatoria La funcin 21H y la funcin 22H de la interrupcin 21H son las encargadas de realizar las lecturas y escrituras aleatorias respectivamente. El nmero de registro aleatorio y el bloque actual son usados para calcular la posicin relativa del registro a leer o escribir. El registro AL regresa la misma informacin que para lectura o escritura secuencial. La informacin que ser leda se regresar en el rea de transferencia de disco, as mismo la informacin que ser escrita reside en el DTA. Cerrar un archivo Para cerrar un archivo utilizamos la funcin 10H de la interrupcin 21H. Si despus de invocarse esta funcin el registro AL contiene el valor de FFH significa que el archivo ha cambiado de posicin, se cambi el disco o hay un error de acceso al disco. Trabajando con handles El uso de handles para manejar los archivos facilita en gran medida la creacin de archivos y el programador puede concentrarse en otros aspectos de la programacin sin preocuparse en detalles que pueden ser manejados por el sistema operativo. La facilidad en el uso de los handles consiste en que para operar sobre un archivo nicamente es necesario definir el nombre del mismo y el nmero del handle a utilizar, toda la dems informacin es manejada internamente por el DOS. Cuando utilizamos este mtodo para trabajar con archivos no existe una distincin entre accesos secuenciales o aleatorios, el archivo es tomado simplemente como una cadena de bytes. Funciones para utilizar handles Las funciones utilizadas para el manejo de archivos por medio de handles son descritas en la unidad 6: Interrupciones, en la seccin dedicada a la interrupcin 21H.

También podría gustarte