Contenido UNIDAD 1 INTRODUCCION A LENGUAJE ENSAMBLADOR ...................................................................... 4 1.1 IMPORTANCIA DE LA PROGRAMACIN EN LENGUAJE ENSAMBLADOR ....................................... 4 1.2 EL PROCESADOR Y SUS REGISTROS INTERNOS ............................................................................. 4 1.3 LA MEMORIA PRINCIPAL (RAM) .................................................................................................... 8 1.4 CONCEPTO DE INTERRUPCIN. ..................................................................................................... 9 1.5 LLAMADAS A SERVICIOS DEL SISTEMA........................................................................................ 10 1.6 MODOS DE DIRECCIONAMIENTO. ............................................................................................... 11 1.7 PROCESO DE ENSAMBLADO Y LIGADO ....................................................................................... 15 1.8 DESPLEGADO DE MENSAJES EN EL MONITOR ............................................................................ 16 UNIDAD 2 PROGRAMACION BASICA ..................................................................................................... 23 2.1 ENSAMBLADOR Y LIGADOR A UTILIZAR ...................................................................................... 23 2.2 CICLOS NUMERICOS .................................................................................................................... 24 2.3 CAPTURA BSICA DE CADENAS ................................................................................................... 25 2.4 COMPARACION Y PRUEBA .......................................................................................................... 25 2.5 SALTOS ........................................................................................................................................ 25 2.6 CICLOS DE CONDICIONALES ........................................................................................................ 26 2.7 INCREMENTO Y DECREMENTO ................................................................................................... 27 2.8 CAPTURA DE CADENAS CON FORMATO ..................................................................................... 28 2.9 INSTRUCCIONES ARITMTICAS ................................................................................................... 29 2.10 MANIPULACIN DE PILA ........................................................................................................... 30 2.11 OBTENCION DE CADENA CON REPRESENTACION HEXADECIMAL ............................................ 31 2.12 INSTRUCCIONES LGICAS ......................................................................................................... 35 2.13 DESPLAZAMIENTO Y ROTACIN ............................................................................................... 36 2.14 OBTENCIN DE REPRESENTACION DE CADENAS DECIMAL ...................................................... 38 2.15 CAPTURA Y ALMACENAMIENTO DE DATOS NUMERICOS ......................................................... 40 2.16 OPERACIONES BASICAS SOBRE ARCHIVOS DE DISCO ............................................................... 43 UNIDAD 3 MODULARIZACION ............................................................................................................... 45 3.1 Macros......................................................................................................................................... 45 3.1.1 Internas. ................................................................................................................................... 45 3.1.2 Externas. ................................................................................................................................... 46 3.2 Procedimientos. .......................................................................................................................... 47 3.2.1 Internos. ................................................................................................................................... 47 3.2.2 Externos. .................................................................................................................................. 48 UNIDAD 4 PROGRAMACION DE DISPOSITIVOS ..................................................................................... 49 4.1 El Buffer De Video En Modo Texto .............................................................................................. 49 4.2 Acceso A Discos En Lenguaje Ensamblador ................................................................................ 50 4.3 Programacin Del Puerto Serial .................................................................................................. 55 4.4 Programacin Del Puerto Paralelo .............................................................................................. 62 4.5 Programacin Hbrida ................................................................................................................. 66 4.6 Programacin De Puerto USB (Universal Serial Bus). ................................................................. 67 TRADUCCIONES ..................................................................................................................................... 69 PCASM BOOK .................................................................................................................................... 69 USO DE MACROS ............................................................................................................................... 79 PROGRAMAS ....................................................................................................................................... 148 HOLA MUNDO ................................................................................................................................. 148 SUMATORIA DE NUMEROS DEL 1 AL 20 ......................................................................................... 149 SUMATORIA DE NUMEROS PARES DEL 1 AL 100 ............................................................................ 151 SUMATORIA DE TODOS LOS NUMEROS DEL 1 AL 100 .................................................................... 153 MULTIPLICACION DE 4 NUMEROS .................................................................................................. 155 EL MAYOR DE 4 NUMEROS ............................................................................................................. 159 DETERMINA EL RANGO DE UN NUMERO DADO ............................................................................. 162 LEE UN NUMERO Y LO CLASIFICA DE ACUERDO A CALIFICACION .................................................. 163 SUMA 4 NUMEROS Y SACA EL PROMEDIO ..................................................................................... 165 PROGRAMA QUE LEE NOMBRE Y CALIFICACIONES Y DETERMINA PROMEDIO .............................. 167 RECIBE UN NUMERO Y TE DICE SI ES MULTIPLO DE 2 O NO ........................................................... 169 CALCULA EL AREA DE UN TRIANGULO ............................................................................................ 170 CONTADOR IMPRIME HASTA UN NUMERO DADO ......................................................................... 174 NUMERO PRIMO ............................................................................................................................. 176 APROBADO O REPROBADO ............................................................................................................. 179 SUMA DE NUMERO PARES .............................................................................................................. 181 CALCULO DE PROMEDIO Y CALIFICACION ARRIBA DEL PROMEDIO ............................................... 183 CICLO DECREMENTAL ...................................................................................................................... 186
UNIDAD 1 INTRODUCCION A LENGUAJE ENSAMBLADOR 1.1 IMPORTANCIA DE LA PROGRAMACIN EN LENGUAJE ENSAMBLADOR Definicin: El lenguaje ensamblador es un tipo de lenguaje de bajo nivel utilizado para escribir programas informticos, y constituye la representacin ms directa del cdigo mquina especfico para cada arquitectura de microprocesador.
La importancia del lenguaje ensamblador es principalmente que se trabaja directamente con el microprocesador; por lo cual se debe de conocer el funcionamiento interno de este, tiene la ventaja de que en l se puede realizar cualquier tipo de programas que en los lenguajes de alto nivel no lo pueden realizar. Otro punto sera que los programas en ensamblador ocupan menos espacio en memoria. Ventajas y desventajas del Lenguaje Ensamblador
Ventajas
1. Como trabaja directamente con el microprocesador al ejecutar un programa, pues como este lenguaje es el ms cercano a la mquina la computadora lo procesa ms rpido. 2. Eficiencia de tamao.- Un programa en ensamblador no ocupa mucho espacio en memoria porque no tiene que cargan libreras y dems como son los lenguajes de alto nivel. 3. Flexibilidad.- En lenguaje ensamblador se pueden hacer tareas especficas que en un lenguaje de alto nivel no se pueden llevar acabo porque tienen ciertas limitantes que no se lo permite.
1.2 EL PROCESADOR Y SUS REGISTROS INTERNOS El procesador es un elemento importante del hardware de la PC. Es la unidad del sistema, que contiene una tarjeta de sistema, fuente de poder y ranuras de expansin para tarjetas opcionales. Los elementos de la tarjeta de sistema son un microprocesador, memoria de solo lectura (ROM) y memoria de acceso aleatorio (RAM).
REGISTROS INTERNOS DEL PROCESADOR. Los registros del procesador se emplean para controlar instrucciones en ejecucin, manejar direccionamiento de memoria y proporcionar capacidad aritmtica. Los registros son direccionables por medio de un nombre. Los bits por convencin, se numeran de derecha a izquierda, como en:
... 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
Registros de segmento
Un registro de segmento tiene 16 bits de longitud y facilita un rea de memoria para direccionamiento conocida como el segmento actual.
Registro CS. El DOS almacena la direccin inicial del segmento de cdigo de un programa en el registro CS. Esta direccin de segmento, ms un valor de desplazamiento en el registro apuntador de instruccin (IP), indica la direccin de una instruccin que es buscada para su ejecucin. Registro DS. La direccin inicial de un segmento de datos de programa es almacenada en el registro DS. En trminos sencillos, esta direccin, ms un valor de desplazamiento en una instruccin, genera una referencia a la localidad de un byte especifico en el segmento de datos. Registro SS. El registro SS permite la colocacin en memoria de una pila, para almacenamiento temporal de direcciones y datos. El DOS almacena la direccin de inicio del segmento de pila de un programa en el registro SS. Esta direccin de segmento, ms un valor de desplazamiento en el registro del apuntador de pila (SP), indica la palabra actual en la pila que est siendo direccionada. Registros ES. Algunas operaciones con cadenas de caracteres (datos de caracteres) utilizan el registro extra de segmento para manejar el direccionamiento de memoria. En este contexto, el registro ES est asociado con el registro DI (ndice). Un programa que requiere el uso del registro ES puede inicializarlo con una direccin de segmento apropiada. Registros FS y GS. Son registros extra de segmento en los procesadores 80386 y posteriores.
Registros de propsito general.
Son nicos en el sentido de que se puede direccionarlos como una palabra o como una parte de un byte. El ltimo byte de la izquierda es la parte "alta", y el ltimo byte de la derecha es la parte "baja". Por ejemplo, el registro CX consta de una parte CH (alta) y una parte Cl (baja), y usted puede referirse a cualquier parte por su nombre.
Registro AX. El registro AX, el acumulador principal, es utilizado para operaciones que implican entrada/salida y la mayor parte de la aritmtica. Por ejemplo, las instrucciones para multiplicar, dividir y traducir suponen el uso del AX. Tambin, algunas operaciones generan cdigo ms eficiente si se refieren al AX en lugar de a los otros registros.
Registro BX. El BX es conocido como el registro base ya que es el nico registro de propsito general que puede ser ndice para direccionamiento indexado. Tambin es comn emplear el BX para clculos.
Registro DX. El DX es conocido como el registro de datos. Algunas operaciones de entrada/salida requieren uso, y las operaciones de multiplicacin y divisin con cifras grandes suponen al DX y al AX trabajando juntos.
Registro de Apuntador de Instrucciones.
El registro apuntador de instrucciones (IP) de 16 bits contiene el desplazamiento de direccin de la siguiente instruccin que se ejecuta. El IP est asociado con el registro CS en el sentido de que el IP indica la instruccin actual dentro del segmento de cdigo que se est ejecutando actualmente. Los procesadores 80386 y posteriores tienen un IP ampliado de 32 bits, llamado EIP.
Registros Apuntadores.
Los registros SP (apuntador de la pila) Y BP (apuntador de base) estn asociados con el registro SS y permiten al sistema accesar datos en el segmento de la pila.
Registro SP. El apuntador de la pila de 16 bits est asociado con el registro SS y proporciona un valor de desplazamiento que se refiere a la palabra actual que est siendo procesada en la pila. El sistema maneja de forma automtica estos registros.
Registro BP. El BP de 16 bits facilita la referencia de parmetros, los cuales son datos y direcciones transmitidos va pila.
Registros ndice.
Los registros SI y DI estn disponibles para direccionamiento indexado y para sumas y restas.
Registro SI. El registro ndice fuente de 16 bits es requerido por algunas operaciones con cadenas (de caracteres). En este contexto, el SI est asociado con el registro DS.
Registro DI. El registro ndice destino tambin es requerido por algunas operaciones con cadenas de caracteres. En este contexto, el DI est asociado con el registro ES.
Registro de Banderas.
Sirven para indicar el estado actual de la mquina y el resultado del procesamiento. Muchas instrucciones que piden comparaciones y aritmtica cambian el estado de las banderas, algunas cuyas instrucciones pueden realizar pruebas para determinar la accin subsecuente:
OF (Overflow, desbordamiento). Indica desbordamiento de un bit de orden alto (mas a la izquierda) despus de una operacin aritmtica. DF (direccin). Designa la direccin hacia la izquierda o hacia la derecha para mover o comparar cadenas de caracteres.
IF (interrupcin). Indica que una interrupcin externa, como la entrada desde el teclado, sea procesada o ignorada. TF (trampa). Permite la operacin del procesador en modo de un paso. Los programas depuradores, como el DEBUG, activan esta bandera de manera que usted pueda avanzar en la ejecucin de una sola instruccin a un tiempo, para examinar el efecto de esa instruccin sobre los registros de memoria. SF (signo). Contiene el signo resultante de una operacin aritmtica (0 = positivo y 1 = negativo). ZF (cero). Indica el resultado de una operacin aritmtica o de comparacin (0 = resultado diferente de cero y 1 = resultado igual a cero). AF (acarreo auxiliar). Contiene un acarreo externo del bit 3 en un dato de 8 bits para aritmtica especializada. PF (paridad). Indica paridad par o impar de una operacin en datos de 8 bits de bajo orden (mas a la derecha). CF (acarreo). Contiene el acarreo de orden ms alto (ms a la izquierda) despus de una operacin aritmtica; tambin lleva el contenido del ltimo bit en una operacin de corrimiento o de rotacin.
Las banderas estn en el registro de banderas en las siguientes posiciones:
1.3 LA MEMORIA PRINCIPAL (RAM) RAM es el acrnimo ingls de Random Access Memory (memoria de acceso aleatorio). Se trata de una memoria de semiconductor en la que se puede tanto leer como escribir informacin. Es una memoria voltil, es decir, pierde su contenido al desconectar la energa elctrica. Se utiliza normalmente como memoria temporal para almacenar resultados intermedios y datos similares no permanentes. En estas memorias se accede a cada celda (generalmente se direcciona a nivel de bytes) mediante un cableado interno, es decir, cada byte tiene un camino prefijado para entrar y salir, a diferencia de otros tipos de almacenamiento, en las que hay una cabeza lectograbadora que tiene que ubicarse en la posicin deseada antes de leer el dato deseado.
Se dicen "de acceso aleatorio" porque los diferentes accesos son independientes entre s. Por ejemplo, si un disco rgido debe hacer dos accesos consecutivos a sectores alejados fsicamente entre s, se pierde un tiempo en mover la cabeza hasta la pista deseada (o esperar que el sector pase por debajo, si ambos estn en la misma pista), tiempo que no se pierde en la RAM.
Las RAM se dividen en estticas y dinmicas. Una memoria RAM esttica mantiene su contenido inalterado mientras est alimentada. La informacin contenida en una memoria RAM dinmica se degrada con el tiempo, llegando sta a desaparecer, a pesar de estar alimentada. Para evitarlo hay que restaurar la informacin contenida en sus celdas a intervalos regulares, operacin denominada refresco.
Las memorias se agrupan en mdulos, que se conectan a la placa base del computador. Segn los tipos de conectores que lleven los mdulos, se clasifican en Mdulos SIMM (Single In-line Memory Module), con 30 o 72 contactos, mdulos DIMM (Dual In-line Memory Module), con 168 contactos y mdulos RIMM (RAMBUS In-line Memory Module) con 184 contactos. 1.4 CONCEPTO DE INTERRUPCIN. Un procesador no puede procesar simultneamente varios trozos de informacin (procesa un trozo de informacin a la vez), un programa que est siendo ejecutado puede, gracias al pedido de interrupcin, ser momentneamente suspendido mientras se produce una interrupcin. El programa interrumpido puede continuar ejecutndose luego. Existen 256 direcciones de interrupcin diferentes. Una interrupcin se convierte en una interrupcin de hardware cuando es solicitada por uno de los componentes de hardware del equipo. En efecto, existen varios perifricos en un equipo. Estos perifricos necesitan generalmente utilizar los recursos del sistema aunque slo sea para comunicarse con el sistema mismo.
Cuando un perifrico desea acceder a un recurso, enva un pedido de interrupcin al procesador para llamar su atencin. Los perifricos cuentan con un nmero de interrupcin que se denomina IRQ (Peticiones de Interrupcin. Es como si cada perifrico tirara de un "hilo" que est atado a una campana para sealarle al equipo que desea que le preste atencin Este "hilo" es, de hecho, una lnea fsica que conecta cada ranura de expansin as como cada interfaz E/S a la placa madre. Para una ranura ISA de 8 bits, por ejemplo, hay 8 lneas IRQ que unen ranuras ISA de 8 bits a la placa madre (IRQ0 a IRQ7). Estos IRQ estn controlados por un "controlador de interrupcin" que se encarga de cederle la palabra al IRQ que posee la mayor prioridad.
Al aparecer las ranuras de 16 bits, se agregaron IRQ 8 a 15. En consecuencia, fue necesario agregar un segundo controlador de interrupcin. Los dos grupos de interrupciones estn unidos por IRQ 2 el cual se conecta (o "produce una cascada") a IRQ 9. En cierto modo, esta cascada "inserta" IRQ 8 a 15 entre IRQ1 y 3:
Dado que la prioridad va del IRQ inferior al superior y que se insertan IRQ 8 a 15 entre IRQ 1 y 3, el orden de prioridad es el siguiente:
1.5 LLAMADAS A SERVICIOS DEL SISTEMA. Las llamadas al sistema comnmente usan una instruccin especial de la CPU que causa que el procesador transfiera el control a un cdigo privilegiado. Previamente especificado por el mismo cdigo. Esto permite al cdigo privilegiado especificar donde va a ser conectado as como el estado del procesador.
Cuando una llamada al sistema es invocada, la ejecucin del programa que invoca es interrumpida y sus datos son guardados, normalmente en su PCB (Bloque de Control de Proceso del ingls Process Control Block), para poder continuar ejecutndose luego. El procesador entonces comienza a ejecutar las instrucciones de cdigo de alto nivel de privilegio, para realizar la tarea requerida. Cuando esta finaliza, se retorna al proceso original, y contina su ejecucin. El retorno al proceso demandante no obligatoriamente es inmediato, depende del tiempo de ejecucin de la llamada al sistema y del algoritmo de planificacin de CPU.
Las llamadas son peticiones a ejecucin de rutinas y proporcionan la interfaz entre el sistema operativo y un programa en ejecucin. Estas llamadas son instrucciones de lenguaje ensamblador y se presentan en los manuales que emplean los programadores de este lenguaje.
Las llamadas al sistema para ejecucin y el control de programas, usualmente incluyen un conjunto completo de los servicios accesibles por la va del lenguaje de rdenes, tales como: RUN, EXECUTE, ABORT y planificacin relacionada con el tiempo, adems los usuarios con las llamadas del sistema pueden suspender, establecer o cambiar atributos del tiempo de ejecucin de uno o ms programas.
Las llamadas del sistema para el gestor de recursos, proporcionan servicios para la asignacin, reserva y reclamacin de los recursos del sistema. Por ejemplo, existen llamadas del sistema para extender o reducir la cantidad de memoria poseda por el programa que se llama. Las llamadas del sistema pueden asignar o reservar otros tipos de objetos del sistema y despus destruir o devolver su custodia al sistema operativo.
Las llamadas al sistema se pueden agrupar en cinco categoras:
1. Control de proceso (Crear, cargar, ejecutar un proceso, obtener y establecer atributos, esperar un suceso, liberar memoria, abortar y terminar proceso).
2. Manipulacin de archivos (Crear, abrir, leer, obtener y establecer atributos, cerrar y eliminar archivos).
3. Manipulacin de perifricos (Solicitar, escribir, leer, obtener y establecer atributos, liberar perifrico).
4. Manipulacin de la informacin (Obtener fecha y hora, establecer fecha y hora, obtener y establecer datos del sistema, obtener y establecer atributos).
5. Comunicaciones (Crear conexin, enviar mensajes, recibir mensajes, transferir informacin del estado y eliminar conexin. 1.6 MODOS DE DIRECCIONAMIENTO. Los llamados modos de direccionamiento son las diferentes maneras de especificar en informtica un operando dentro de una instruccin en lenguaje ensamblador.
Un modo de direccionamiento especifica la forma de calcular la direccin de memoria efectiva de un operando mediante el uso de la informacin contenida en registros y / o constantes, contenida dentro de una instruccin de la mquina o en otra parte Las operaciones se hacen entre registros o registros y memoria, pero nunca entre memoria y memoria (salvo algunas operaciones con cadenas de caracteres). Los modos de direccionamiento determinan el lugar en que reside un operando, un resultado o la siguiente instruccin a ejecutar segn el caso.
Tenga en cuenta que no existe una forma generalmente aceptada de nombrar a los distintos modos de direccionamiento. En particular, los distintos autores y fabricantes de equipos pueden dar nombres diferentes para el modo de hacer frente al mismo, o los mismos nombres, a los diferentes modos de direccionamiento
Direccionamiento Inmediato.
En este modo el operando es especificado en la instruccin misma. En otras palabras, una instruccin de modo inmediato tiene un campo de operando en vez de un campo de direccin. El campo del operando contiene el operando actual que se debe utilizar en conjunto con la operacin especificada en la instruccin. Las instrucciones de modo inmediato son tiles para inicializar los registros en un valor constante.
Cuando el campo de direccin especifica un registro del procesador, la instruccin se dice que est en el modo de registro.
Direccionamiento Directo.
Es directo cuando la instruccin contiene el lugar donde se encuentra el operando. Segn el lugar donde se encuentra el operando puede ser: Direccionamiento directo a registro. Direccionamiento directo a memoria Direccin completa (p. ej. Z80 sobre 64 Kb con 16 bits) Direccin sobre una pgina del mapa de memoria; tambin se conoce como direccionamiento de pgina base.
Direccionamiento Relativo. La instruccin indica el desplazamiento del operando con respecto a un puntero: La direccin efectiva es calculada por la unidad de control sumando, o restando, el desplazamiento al puntero de referencia que suele estar en un registro. Dependiendo del puntero se tienen diferentes modos de direccionamiento. Direccin efectiva = Reg. Referencia + desplazamiento.
Modo de direccionamiento / Registro de referencia / Clculo direccin efectiva:
Relativo a contador de programa Contador de programa (CP) DE = CP + desplazamiento. Relativo a registro base Un registro base (R B) DE = RB + desplazamiento. Relativo a registro ndice Un registro ndice (R I) DE = RI + desplazamiento. Relativo a pila Registro de pila (SP) DE = SP + desplazamiento.
Ventajas
Las instrucciones son ms compactas. El cdigo puede cambiar de lugar en el mapa de memoria con cambiar el valor del puntero. Gran facilidad de manejo de estructuras de datos.
Inconvenientes
Se requiere una operacin adicional para el clculo de la direccin del operando.
Direccionamiento Indirecto.
La posicin indicada por la instruccin no es el operando sino la direccin de memoria en la que se encuentra, por lo que se necesita un acceso adicional a memoria.
La direccin de memoria se puede dar mediante:
Direccionamiento directo a memoria Direccionamiento relativo Es posible que se realicen mltiples niveles de indireccin. Su utilidad ms comn es la de acceso a diversas informaciones mediante tablas de punteros.
Direccionamiento Implcito.
En este modo de direccionamiento no es necesario poner ninguna direccin de forma explcita, ya que en el propio cdigo de operacin se conoce la direccin del (de los) operando(s) al (a los) que se desea acceder o con el (los) que se quiere operar. Requiere que el programador conozca con que operandos se est trabajando.
Direccionamiento de Registro.
Sirve para especificar operandos que estn en registros.
Direccionamiento Indirecto por Registro.
En este modo el campo de la direccin de la instruccin da la direccin en donde la direccin efectiva se almacena en la memoria. El control localiza la instruccin de la memoria y utiliza su parte de direccin para acceder a la memoria de nuevo para leer una direccin efectiva. Unos pocos modos de direccionamiento requieren que el campo de direccin de la instruccin sea sumado al control de un registro especificado en el procesador. La direccin efectiva en este modo se obtiene del siguiente clculo:
Dir. Efectiva = Dir. de la parte de la instruccin + Contenido del registro del procesador.
1.7 PROCESO DE ENSAMBLADO Y LIGADO Para poder crear un programa se requieren varias herramientas: Primero un editor para crear el programa fuente. Segundo un compilador que no es ms que un programa que "traduce" el programa fuente a un programa objeto. Y tercero un enlazador o linker, que genere el programa ejecutable a partir del programa objeto. El editor puede ser cualquier editor de textos que se tenga a la mano, como compilador utilizaremos el MASM (macro ensamblador de Microsoft) ya que es el ms comn, y como enlazador utilizaremos el programa link.
La extensin usada para que MASM reconozca los programas fuente en ensamblador es .ASM; una vez traducido el programa fuente, el MASM crea un archivo con la extensin .OBJ, este archivo contiene un "formato intermedio" del programa, llamado as porque an no es ejecutable pero tampoco es ya un programa en lenguaje fuente. El enlazador genera, a partir de un archivo .OBJ o la combinacin de varios de estos archivos, un programa ejecutable, cuya extensin es usualmente .EXE aunque tambin puede ser .COM, dependiendo de la forma en que se ensambl.
1.8 DESPLEGADO DE MENSAJES EN EL MONITOR Para poder desplegar mensajes en lenguaje ensamblador primero debemos conocer la estructura del programa en ensamblador.
Comentarios En Lenguaje Ensamblador.
El uso de comentarios a lo largo de un programa puede mejorar su claridad, en especial en lenguaje ensamblador, donde el propsito de un conjunto de instrucciones con frecuencia no es claro. Un comentario empieza con punto y coma (;) y, en donde quiera que lo codifique, el ensamblador supone que todos los caracteres a la derecha de esa lnea son comentarios. Un comentario puede contener cualquier carcter imprimible, incluyendo el espacio en blanco.
Un comentario puede aparecer solo en una lnea o a continuacin de una instruccin en la misma lnea, como lo muestran los dos ejemplos siguientes:
Toda esta lnea es un comentario. ADD AX, BX; Comentario en la misma lnea que la instruccin.
Ya que un comentario aparece solo en un listado de un programa fuente en ensamblador y no genera cdigo de mquina, puede incluir cualquier cantidad de comentarios sin afectar el tamao o la ejecucin del programa ensamblado. Otra manera de proporcionar comentarios es por medio de la directiva COMMENT.
Palabras Reservadas
Ciertas palabras en lenguaje ensamblador estn reservadas para sus propsitos propios, y son usadas solo bajo condiciones especiales. Por categoras, las palabras reservadas incluyen:
Instrucciones, como MOV y ADD, que son operaciones que la computadora puede ejecutar. Directivas como END o SEGMENT, que se emplean para proporcionar comandos al ensamblador. Operadores, como FAR y SIZE, que se utilizan en expresiones. Smbolos predefinidos, como @Data y @Model, que regresan informacin a su programa.
Identificadores.
Un identificador es un nombre que se aplica a elementos en el programa. Los dos tipos de identificadores son: nombre, que se refiere a la direccin de un elemento de dato y etiqueta, que se refiere a la direccin de una instruccin. Un identificador puede usar los siguientes caracteres:
1. Letras del alfabeto: Desde la A hasta la Z(maysculas o minsculas) 2. Dgitos: Desde el 0 al 9 (no puede ser el primer carcter) 3. Caracteres especiales: Signo de interrogacin ( ? ) Subrayado ( _ ), Signo de pesos ( $ ), Arroba ( @ ), Punto ( . ) (no puede ser el primer carcter)
El primer carcter de un identificador debe ser una letra o un carcter especial, excepto punto. Ya que el ensamblador utiliza algunos smbolos especiales en palabras que inician con el smbolo @, debe evitar usarlo en sus definiciones.
En consecuencia, en una instruccin tal como:
ADD AX, BX: El ensamblador sabe de forma automtica que AX y BX se refieren a los registros. Sin embargo, en una instruccin como: MOV REGSAVE, AX: El ensamblador puede reconocer el nombre REGSAVE solo si se define en algn lugar del programa.
Identificador, operacin y operando pueden empezar en cualquier columna. Sin embargo, si de manera consistente se inicia en la misma columna para estas tres entradas se hace un programa ms legible.
IDENTIFICADOR: Como ya se explic, el termino nombre se aplica al nombre de un elemento o directiva definida, mientras que el termino etiqueta se aplica al nombre de una instruccin. OPERACIN: La operacin, que debe ser codificada, es con mayor frecuencia usada para la definicin de reas de datos y codificacin de instrucciones. Para un elemento de datos, una operacin como DB o DW define un campo, rea de trabajo o constante. OPERANDO: El operando (si existe) proporciona informacin para la operacin que acta sobre l. Para un elemento de datos, el operando identifica su valor inicial. Por ejemplo, en la definicin siguiente de un elemento de datos llamado COUNTER, la operacin DB significa "definir byte", y el operando inicializa su contenido con un valor cero:
Para una instruccin, un operando indica en donde realizar la accin. Un operando de una instruccin puede tener una, dos o tal vez ninguna entrada. Aqu estn tres ejemplos:
Directivas Para Listar: Page Y Title.
La directiva PAGE y TITLE ayudan a controlar el formato de un listado de un programa en ensamblador. Este es su nico fin, y no tienen efecto sobre la ejecucin subsecuente del programa.
PAGE. Al inicio de un programa, la directiva PAGE designa el nmero mximo de lneas para listar en una pgina y el nmero mximo de caracteres en una lnea. Su formato general es:
PAGE [longitud][, ancho]
El ejemplo siguiente proporciona 60 lneas por pgina y 132 caracteres por lnea: PAGE 60, 132
El nmero de lneas por pgina puede variar desde 10 hasta 255, mientras que el nmero de caracteres por lnea desde 60 hasta 132. La omisin de PAGE causa que el ensamblador tome PAGE 50, 80.
TITLE. Se puede emplear la directiva TITLE para hacer que un ttulo para un programa se imprima en la lnea 2 de cada pgina en el listado del programa. Puede codificar TITLE de una vez, al inicio del programa. Su formato general es:
TITLE Texto.
Para el operando texto, una tcnica recomendada es utilizar el nombre del programa como se registra en el disco. Por ejemplo:
TITLE Prog1 Mi primer programa en ensamblador
Directiva Segment.
Un programa ensamblado en formato .EXE consiste en uno o ms segmentos. Un segmento de pila define el almacn de la pila, un segmento de datos define los elementos de datos y un segmento de cdigo proporciona un cdigo ejecutable. Las directivas para definir un segmento, SEGMENT y ENDS tienen el formato siguiente:
El enunciado SEGMENT define el inicio de un segmento. El nombre del segmento debe estar presente, ser nico y cumplir las convenciones para nombres del lenguaje. EL enunciado ENDS indica el final del segmento y contiene el mismo nombre del enunciado SEGMENT. El tamao mximo de un segmento es de 64K. El operando de un enunciado SEGMENT puede tener tres tipos de opciones: alineacin, combinar y clase, codificadas en este formato:nombre SEGMENT alineacin combinar ' clase
TIPO ALINEACION. La entrada alineacin indica el lmite en el que inicia el segmento. Para el requerimiento tpico, PARA, alinea el segmento con el lmite de un prrafo, de manera que la direccin inicial es divisible entre 16, o 10H. En ausencia de un operando hace que el ensamblador por omisin tome PARA.
TIPO COMBINAR. La entrada combinar indica si se combina el segmento con otros segmentos cuando son enlazados despus de ensamblar. Los tipos de combinar son STACK, COMMON, PUBLIC y la expresin AT. Por ejemplo, el segmento de la pila por lo comn es definido como:
nombre SEGMENT PARA STACK
Puede utilizar PUBLIC y COMMON en donde tenga el propsito de combinar de forma separada programas ensamblados cuando los enlaza. En otros casos, donde un programa no es combinado con otros, puede omitir la opcin o codificar NONE.
TIPO CLASE. La entrada clase, encerrada entre apstrofos, es utilizada para agrupar segmentos cuando se enlazan. Se utiliza la clase 'code' para el segmento de cdigos, 'data' por segmento de datos y 'stack' para el segmento de la pila. El ejemplo siguiente define un segmento de pila con tipos alineacin, combinar y clase:
nombre SEGMENT PARA STACK 'Stack'
Directiva Assume.
Un programa utiliza el registro SS para direccionar la pila, al registro DS para direccionar el segmento de datos y el registro CS para direccionar el segmento de cdigo. Para este fin, usted tiene que indicar al ensamblador el propsito de cada segmento en el programa.
La directiva para este propsito es ASSEME, codificada en el segmento de cdigo como sigue:
Los operandos pueden aparecer en cualquier orden. Al igual que otras directivas, ASSUME es solo un mensaje que ayuda al ensamblador a convertir cdigo simblico a cdigo maquina; an puede tener que codificar instrucciones que fsicamente cargan direcciones en registros de segmentos en el momento de la ejecucin.
PAGE 60,132
TITLE P04ASM1 ESTRUCTURA DE UN PROGRAMA .EXE ;------------------------------------------------------------------------------ STACKSG SEGMENT PARA STACK 'Stack' ... STACKSG ENDS ------------------------------------------------------------------------------ DATASG SEGMENT PARA 'Data' ... DATASG ENDS ;------------------------------------------------------------------------------ CODESG SEGMENT PARA 'Code' BEGIN PROC FAR ASSUME SS:STACKSG, DS:DATASG,CS:CODESG MOV AX, DATASG ;Obtiene la direccin del segmento de datos MOV DS, AX ;Almacena direccin en DS ... MOV AX, 4C00H ;Peticion INT 21H ;Salida al DOS BEGIN ENDP CODESG ENDS END BEGIN
Directivas Simplificadas De Segmentos
Los ensambladores de Microsoft y de Borland proporcionan algunas formas abreviadas para definir segmentos. Para usar estas abreviaturas, inicialice el modelo de memoria antes de definir algn segmento. El formato general (incluyendo el punto inicial) es:
.MODEL modelo de memoria
El modelo de memoria puede ser TINY, SMALL, MEDIUM, COMPACT o LARGE. Los requisitos para cada modelo son:
Puede utilizar cualquiera de estos modelos para un programa autnomo (esto es, un programa que no est enlazado con algn otro). El modelo TINY est destinado para uso exclusivo de programas .COM, los cuales tienen sus datos, cdigo y pila en un segmento.
El modelo SMALL exige que el cdigo quepa en un segmento de 64K y los datos en otro segmento de 64K. La directiva .MODELL genera automticamente el enunciado ASSUME necesario.
Los formatos generales (incluyendo el punto inicial) para las directivas que define los segmentos de la pila, de datos y de cdigo son:
.STACK [tamao] .DATA .CODE [nombre]
Cada una de estas directivas hace que el ensamblador genere el enunciado SEGMENT necesario y su correspondiente ENDS. Los nombres por omisin de los segmentos (que usted no tiene que definir) son STACK, DATA y TEXT (para el segmento de cdigo).
UNIDAD 2 PROGRAMACION BASICA 2.1 ENSAMBLADOR Y LIGADOR A UTILIZAR
Un ensamblador es el programa que convierte un listado de cdigo fuente, escrito en un fichero de texto, en cdigo objeto, es decir, lenguaje mquina (el que finalmente interpretar el procesador) en el que slo le faltan las referencias a rutinas externas. El cdigo fuente es un fichero que contiene la secuencia de instrucciones en lenguaje ensamblador que forma el programa, as como ciertas directivas o comandos para el propio ensamblador, que ha sido creado utilizando un editor de texto. El cdigo objeto consta del cdigo en lenguaje mquina y de la informacin necesaria para enlazarlo con otros mdulos objeto. Con TASM el proceso de ensamblado se realiza escribiendo lo siguiente en la ventana de comandos: tasm /zi /l nombre donde nombre es el nombre del fichero .asm con el cdigo fuente. La extensin no es necesaria ponerla y los parmetros /zi y /l slo son tiles si queremos hacer un proceso de depuracin (debug) con el Turbo Debugger. Tras la ejecucin de esta lnea se nos crear un fichero nombre.obj
Linkado y montado
Al construir un programa algunos de sus mdulos pueden colocarse en el mismo mdulo fuente y ensamblarse juntos, otros pueden estar en mdulos diferentes y ser ensamblados separadamente. En cualquier caso, los mdulos objeto resultantes, algunos de los cuales pueden estar agrupados en libreras, deben ser enlazados para formar el mdulo de carga, antes de que se pueda ejecutar el programa. Adems de dar como salida el mdulo de carga, el linker o enlazador imprime un mapa de memoria que indica donde sern cargados los mdulos objeto en la memoria. Despus de crearse el mdulo de carga, ste es cargado por el cargador en la memoria del ordenador y comienza la ejecucin. Para linkar con TASM escribimos: tlink /v nombre Tras esto se nos crear el fichero ejecutable (.exe o .com) que el sistema operativo se encargar de cargar en memoria cuando lo ejecutemos. De nuevo, la extensin no es necesaria ponerla y el parmetro /v slo es til para el Turbo Debugger.
2.2 CICLOS NUMERICOS
Un bucle es un grupo de instrucciones que se ejecutan cclicamente un nmero concreto de veces. Para construir bucles disponemos de las siguientes instrucciones:
stas posibilitan el grupo de control ms elemental de nuestros programas. Un bucle es un bloque de cdigo que se ejecuta varias veces. Hay 4 tipos de bucles bsicos: o Bucles sin fin o Bucles por conteo, Bucles hasta o Bucles mientras. Las instrucciones de control de bucles son las siguientes:
INC incrementar
DEC decrementar
LOOP realizar un bucle
LOOPZ, LOOPE realizar un bucle si es cero LOOPNZ, LOOPNE realizar un bucle si no es cero
JCXZ salta si CX es cero
2.3 CAPTURA BSICA DE CADENAS Una cadena es una secuencia de bytes contiguos. Las operaciones que se pueden realizar sobre las cadenas son las siguientes:
2.4 COMPARACION Y PRUEBA Este grupo es una continuacin del anterior, incluye las siguientes instrucciones:
TEST verifica
CMP compara
2.5 SALTOS
JMP salta
JE, JZ salta si es igual a cero
JNE, JNZ salta si no igual a cero
JS salta si signo negativo
JNS salta si signo no negativo
JP, JPE salta si paridad par
JNP, JOP salta si paridad impar
JO salta si hay capacidad excedida
JNO salta si no hay capacidad excedida
JB, JNAE salta si por abajo (no encima o igual)
JNB, JAE salta si no est por abajo (encima o igual)
JBE, JNA salta si por abajo o igual (no encima)
JNBE, JA salta si no por abajo o igual (encima)
JL, JNGE salta si menor que (no mayor o igual)
JNL, JGE salta si no menor que (mayor o igual)
JLE, JNG salta si menor que o igual (no mayor)
JNLE, JG salta si no menor que o igual (mayor)
2.6 CICLOS DE CONDICIONALES Ciclo For La Sintaxis empleada por el ciclo for es la siguiente:
for (valores de entrada ; condicin de terminacin ; iteracin por ciclo)
Las tres partes del ciclo se encuentran separadas por ; (punto y coma) La primer parte del ciclo especifica valores previos a su inicio. La segunda parte indica la condicin de terminacin para el ciclo, la cual est directamente relacionada con los valores iniciales. Finalmente, la ltima parte especifica cmo sern manipulados los valores iniciales en cada iteracin del ciclo.
Ciclo IF
Una caracterstica del ciclo if/else es el uso de llaves { }, en el ejemplo anterior pudo notar que no fueron utilizadas llaves { } para delimitar las condicionales, al no emplearse este mecanismo, se asume que el ciclo o condicional tendr efecto nicamente en la linea contigua a su inicio. Aunque es recomendable utilizar llaves ({ } ) para incrementar la legibilidad del cdigo, es importante sealar que esta sintaxis de no utilizar llaves ({ } ) es vlida y muy comn (Lamentablemente) Existe otra variacin de if/else que agrupa las condicionales en una sola expresin: if (expresion Boolean ? operacin verdadera : operacin falsa)
Ciclo While En este ciclo el cuerpo de instrucciones se ejecuta mientras una condicin permanezca como verdadera, en el momento en que la condicin se convierte en falsa el ciclo termina. Su formato general es: Cargar o inicializar variable de condicin; While (condicin) { Grupo cierto de instrucciones; Instruccin(es) para salir del ciclo; };
2.7 INCREMENTO Y DECREMENTO
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) 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: memoria. Fuente: acumulador Destino: acumulador. Fuente: memoria Destino: registro de segmento. Fuente: memoria/registro Destino: memoria/registro. Fuente: registro de segmento Destino: registro. Fuente: registro Destino: registro. Fuente: memoria Destino: memoria. Fuente: registro Destino: registro. Fuente: dato inmediato Destino: memoria. Fuente: dato inmediato
La instruccin MOV y los modos de direccionamiento. He aqu nuestra primera instruccin: MOV destino, origen
Efectivamente, sirve para mover. Lo que hace es copiar lo que haya en "origen" en "destino". Lo de que primero vaya el destino y luego el origen es comn a todas las instrucciones del 8086 que tengan dos operandos, lo cual crear ms de un quebradero de cabeza al principio.
MOV AX,BL
MOV AX, BX sin embargo hace que el procesador coja el contenido de BX y lo copiara en AX; lo que haba anteriormente en AX se pierde (puesto que un registro al fin y al cabo es un nmero, en este caso de 16 bits, y ahora le hemos asignado un nuevo valor), mientras que BX no se ve afectado. Cuando decimos "mover" en realidad sera ms apropiado "copiar", porque no alteramos en absoluto el operando origen.
2.8 CAPTURA DE CADENAS CON FORMATO Permiten el movimiento, comparacin o bsqueda rpida en bloques de datos:
MOVC transferir carcter de una cadena
MOVW transferir palabra de una cadena CMPC comparar carcter de una cadena
CMPW comparar palabra de una cadena
SCAC buscar carcter de una cadena
SCAW buscar palabra de una cadena
LODC cargar carcter de una cadena
LODW cargar palabra de una cadena
STOC guardar carcter de una cadena
STOW guardar palabra de una cadena
REP repetir
CLD poner a 0 el indicador de direccin
STD poner a 1 el indicador de direccin
2.9 INSTRUCCIONES ARITMTICAS
Instrucciones Aritmticas.
Estas instrucciones son las que realiza directamente el 8086/8088
a. Grupo de adicin:
ADD suma
ADC suma con acarreo
AAA ajuste ASCII para la suma
DAA ajuste decimal para la suma
b. Grupo de sustraccin:
SUB resta
SBB resta con acarreo negativo
AAS ajuste ASCII para la resta
DAS ajuste decimal para la resta
c. Grupo de multiplicacin:
MUL multiplicacin
IMUL multiplicacin entera
AAM ajuste ASCII para la multiplicacin
d. Grupo de divisin:
DIV divisin
IDIV divisin entera
AAD ajuste ASCII para la divisin
e. Conversiones:
CBW pasar octeto a palabra CWD pasar palabra a doble palabra
NEG negacin 2.10 MANIPULACIN DE PILA Una de las funciones de la pila del sistema es la de salvaguardar (conservar) datos (la otra es la de salvaguardar las direcciones de retorno de las llamadas a subrutinas): PUSH introducir
POP extraer POPF extraer indicadores
PUSHF introducir indicadores
2.11 OBTENCION DE CADENA CON REPRESENTACION HEXADECIMAL 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 el OFFSET de la etiqueta DATOS 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 en destino 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 (denominada PUNT 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
2.12 INSTRUCCIONES LGICAS
Son operaciones bit a bit que trabajan sobre octetos o palabras completas: NOT negacin
AND producto lgico
OR suma lgica
XOR suma lgica exclusiva
2.13 DESPLAZAMIENTO Y ROTACIN 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
2.14 OBTENCIN DE REPRESENTACION DE CADENAS DECIMAL 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
2.15 CAPTURA Y ALMACENAMIENTO DE DATOS NUMERICOS 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 DatosPila Cdigo Datos
Tiny 64 Kbnear near
Small 64 Kb64 Kbnear near Medium 1 Mb 64 Kbfar near Compact 64 Kb1 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 puntero 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:
foo: movl $10, %eax call foo ret 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
2.16 OPERACIONES BASICAS SOBRE ARCHIVOS DE DISCO
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). e 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 este 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.
UNIDAD 3 MODULARIZACION 3.1 Macros. Una macro es un grupo de instrucciones repetitivas en un programa que se codifican solo una vez y pueden utilizarse cuantas veces sea necesario. La principal diferencia entre una macro y un procedimiento es que en la macro se hace posible el paso de parmetros y en el procedimiento no (esto es aplicable solo para el TASM, hay otros lenguajes de programacin que si lo permiten). Al momento de ejecutarse la macro cada parmetro es sustituido por el nombre o valor especificado al momento de llamarla.
Podemos decir entonces que un procedimiento es una extensin de un determinado programa, mientras que la macro es un mdulo con funciones especficas que puede ser utilizado por diferentes programas. Otra diferencia entre una macro y un procedimiento es la forma de llamar a cada uno, para llamar a un procedimiento se requiere el uso de una directiva, en cambio la llamada a las macros se realiza como si se tratara de una instruccin del ensamblador.
3.1.1 Internas.
Una macro es un conjunto de instrucciones que se pueden mandar a llamar desde cualquier parte del programa. Para definir una macro, se utiliza la directiva MACRO. El formato de esta directiva es : (nombre_de_macro) MACRO (lista_parmetros).Una macro interna es aquella que se declara y se llaman dentro del mismo programa.
Una macro consta de tres partes esenciales:
a) CABECERA: Contiene el nombre de la macro la pseudo-op MACRO y opcionalmente ,variables ficticias que sern pasadas desde la macro.
b) CUERPO: Contiene el cdigo real que ser insertado en cualquier programa que llame al nombre de la macro.
c) FIN: Debe incluir la sentencia ENDM.
El nombre de esta macro es INICIO, aunque es aceptable cualquier otro nombre vlido que sea nico. La directiva MACRO en la primer lnea indica al ensamblador que las instrucciones que siguen, hasta ENDM (fin de la macro), son parte de la definicin de la macro. La directiva ENDM termina la definicin de la macro. Las instrucciones entre MACRO y ENDM comprenden el cuerpo de la definicin de la macro. Si su programa realiza frecuentemente funciones de entrada/salida,
las macros ofrecen la facilidad de codificar una sola vez un conjunto de instrucciones y reutilizar el cdigo cuantas veces desee dentro de su programa.
3.1.2 Externas.
Una de las facilidades que ofrece el uso de las macros es la creacin de bibliotecas, las cuales son grupos de macros que pueden ser incluidas en un programa desde un archivo diferente. La creacin de estas bibliotecas es muy sencilla, nicamente tenemos que escribir un archivo con todas las macros que se necesitarn y guardarlo como archivo de texto.
Para llamar a estas macros solo es necesario utilizar la instruccin Include <Nombre_Del_Archivo>, en la parte de nuestro programa donde escribiramos normalmente las macros, esto es, al principio de nuestro programa (antes de la declaracin del modelo de memoria). Suponiendo que se guard el archivo de las macros con el nombre de MACROS.TXT la instruccin Include se utilizara de la siguiente forma:
;Inicio del programa Include MACROS.TXT .MODEL SMALL .DATA ;Aqui van los datos .CODE Inicio: ;Aqui se inserta el cdigo del programa .STACK ;Se define la pila End Inicio
3.2 Procedimientos.
Un procedimiento es un conjunto de instrucciones que tienen la finalidad de ejecutar una tarea especifica dentro de un programa. Los procedimientos son muy similares a las macros. Un procedimiento es un conjunto de instrucciones a los que podemos dirigir el flujo de nuestro programa, y una vez terminada la ejecucin de dichas instrucciones se devuelve el control a la siguiente lnea a procesar del cdigo que mando llamar al procedimiento. Un procedimiento se declara una sola vez en el cdigo fuente y cuando el programa se ensambla y ejecuta, el procedimiento se coloca en memoria para que pueda ser utilizado por el programa. Los procedimientos nos ayudan a crear programas legibles y fciles de modificar. Sintaxis de un procedimiento Existen dos tipos de procedimientos , los intrasegmentos, que se encuentran en el mismo segmento de instrucciones y los intersegmentos que pueden ser almacenados en diferentes segmentos de memoria. 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.
Los procedimientos tienen la desventaja de que reducen la velocidad de ejecucin de los programas, esto se debe a la forma en que los procedimientos se ejecutan. A continuacin se presentan los pasos necesarios para ejecutar un procedimiento:
1.- Se encuentra la llamada Call 2.- El microprocesador almacena en la Pila el contenido del IP 3.- Se coloca en el IP el valor del desplazamiento correspondiente al Procedimiento 4.- El microprocesador ejecuta las instrucciones del procedimiento 5.- El procedimiento termina cuando se encuentra la instruccin Ret 6.- Se saca de la pila el valor original del IP y se continua el flujo del programa
3.2.1 Internos.
Los procedimientos internos son aquellos que se declaran y se llaman dentro del mismo programa, tambin son llamados procedimientos locales. El listado anterior muestra la forma de utilizar procedimientos internos.
3.2.2 Externos.
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. Cuenta 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. Por ejemplo Este programa muestra la forma de utilizar procedimientos y datos externos en los programas por medio de las directivas de inclusin include y public.
.MODEL TINY .INCLUDE proc2.ASM ;Incluir el archivo proc2.asm ;el cual contiene la variable de cadena ;Cad1 y los procedimientos externos ;usados en este programa. .DATA Cad2 db 'Esta es una cadena de prueba 2...',13,10,'$' .CODE INICIO: ;Punto de entrada al programa Mov Dl,20 ;X=20 Mov Dh,10 ;Y=10 Call GotoXY ;GotoXY 20,10 Lea DX,Cad2 ;DX->Cad2 en Proc3.asm Call Imprime_Cad ;Imprime Cad2 Lea DX,Cad1 ;DX->Cad1 en Proc2.asm Call Imprime_Cad ;Imprime Cad1 Mov AX,04C00h ;Fin del programa Int 21h ; END INICIO END
UNIDAD 4 PROGRAMACION DE DISPOSITIVOS 4.1 El Buffer De Video En Modo Texto
Buffer: Es la ubicacin de la memoria de un dispositivo digital o una computadora que est reservada para el almacenamiento temporal de informacin. Mientras los datos estn en el buffer, aguardan para ser procesados. Un ejemplo de buffer tiene lugar cuando se intenta ejecutar aplicaciones de audio o video directamente desde Internet, sin descargarlas a la computadora. Esta prctica, conocida como streaming, requiere de la utilizacin de un buffer para reducir el riesgo de que se corte la reproduccin ante problemas en el ancho de banda.
Abarcando los aspectos ms importantes del modo de video: ENDP
prepararPantalla proc near
mov ah, 06h;funcion de limpiar pantalla mov bh, 80h;Atributos de color de fondo mov al, 00h;cantidad de Filas a Borrar Enrollar
mov cx, 00h;columna inicial en Ch, Columna Inicial en Cl mov dx, 30a0h;columna Final en Dh,Columna Final en Dl int 10h
ret prepararPantalla endp
para llamarlo debes hacerlo asi:
call prepararPantalla
En los atributos de color de fondo puedes ver un 80h, el primer nmero es el color del fondo ( el 8) y el segundo es el color del texto ( el 0). 4.2 Acceso A Discos En Lenguaje Ensamblador
Para leer o escribir en un disco, no se realiza byte a byte, sino ms bien en bloques de bytes, debido a que el acceso a disco implica movimientos mecnicos adems de que el acceso se da por sectores; en este proceso no intervienen el CPU, puesto que solo enva los comandos a la interface que maneja la unidad de disco y sta es la que se encarga de leer o escribir informacin de un rea especial de memoria, llamada DMA; este proceso es conocido como acceso directo a memoria.
El sistema de almacenamiento en disco constituye el soporte externo de la informacin. Los datos se registran sobre la superficie del disco en una serie de circunferencias concntricas llamadas pistas (track). Varias pistas, una por cada cara del disco (generalmente 2), componen un Clster. Cada pista est dividida en porciones iguales llamadas sectores (unidad bsica de almacenamiento en disco). El tamao de un sector se mide en bytes, y depende de las caractersticas del disco. En esta seccin se presentan 3 rutinas que permiten lectura y escritura absoluta de sectores, as como la determinacin del espacio libre disponible en un disco.
Rutina _AbsoluteRead: Transfiere el contenido de uno ms sectores del disco al buffer especificado, accesando directamente a los sectores lgicos. En caso de error, se enciende el bit de acarreo y AX contiene el cdigo del error. Invocacin push <unidad de disco> push <nmero de sectores a leer> push <prime r sector a leer> push SEG <buffer> push
OFFSET <buffer> call _AbsoluteRead PUBLIC _AbsoluteRead
_AbsoluteRead PROC NEAR
ARG Buffer:DWORD,Start:WORD,NumSect:WORD,Drive:BYTE= ArgLen push bp ; salvar BP mov bp,sp ; permitir acceso a los argumentos push bx ; salvar registros push cx push dx push ds mov al,Drive ; lectura absoluta de disco mov cx,NumSect mov dx,Start lds bx,Buffer i n t
2 5 h
p o p
b x
p o p
d s ; recuperar registros p o p d x p o p c x p o p b x p o p b p r e t A r g L e n _AbsoluteRead ENDP
Rutina _AbsoluteWrite: Transfiere el contenido del buffer especificado a uno o ms sectores de disco, accesando directamente a los sectores lgicos. En caso de error, se enciende el bit de acarreo y AX contiene el cdigo del error. Invocacin: push <unidad de disco> push <nmero de sectores a escribir> push <primer sector a escribir> push SEG <buffer push OFFSET <buffer> call _AbsoluteWrite PUBLIC _Absolut eWrite _AbsoluteWrit e PROC NEAR ARG Buffer:DWORD,Start:WORD,NumSect:WORD,Drive:BYTE= ArgLen push bp ; salvar BP mov bp,sp ; permitir acceso a los argumentos push bx ; salvar registros push cx push dx push ds mov al,Drive ; escritura absoluta a disco mov cx,NumSect mov dx,Start lds bx,Buffer i n t
2
6 h
p o p
b x
p o p
d s ; recuperar registros pop dx pop cx pop bx pop bp ret ArgLen _Absolut eWrite ENDP Rutina _FreeDiskSpace: Devuelve en DX:AX el espacio libre en disco (en Kb). En caso de error, se enciende el bit de accarreo.
Invocacin: push <unidad de disco> call _FreeDiskSpace PUBLIC _FreeDiskSpace _FreeDiskSpace PROC NEAR
ARG Drive:BYTE= ArgLen push bp ; salvar
mov bp,sp ; permitir acceso a los argumentos push bx ; salvar registros push cx mov ah,36h ; funcin 36h mov dl,Drive int 21h ; del DOS mul cx ; DX:AX= bytes por cluster mov cx,1024 ; CX= 1 Kb div cx ; DX:AX= Kb por cluster mul bx ; DX:AX= Kb libres en el disco pop cx ; recuperar registros pop bx pop bp ret ArgLen _FreeDiskSpace
4.3 Programacin Del Puerto Serial
Puerto serial, puerto COM, puerto de comunicaciones y puerto RS-232 ("Recomendad Standard-232"), hacen referencia al mismo puerto. Se le llama serial, porque permite el envo de datos, uno detrs de otro. El puerto serie nos permite la facilidad de conectar nuestro ordenador personal
a cualquier desarrollo realizado con microcontrolador.
Puerto Serial para la comunicacin en puerto serial debemos tomar en cuenta que existe un dispositivo transmisor y un dispositivo receptor el cual se encuentra comunicado a travs de una sola lnea de comunicacin, por lo tanto los nmeros binarios que se
transmiten se codifican a travs de un tren de pulsos. Dicha codificacin de los pulsos deber ser interpretado por el dispositivo receptor, para ello se deben establecer parmetros de hardware por los que se deber de transmitir la seal. De manera general en MATLAB se deben realizar 2 procedimientos para configurar y manipular el puerto serial. El primer paso es configuracin y el segundo es abrir el puerto serial.
PUERTO
Puerto serial COM integrado en la tarjeta principal ("motherboard").
Smbolo del puerto COM. Conector hembra serial del cable del dispositivo.
caractersticas del puerto serial COM
En el mbito de la electrnica comercial se le denomina como conector DB9 ("D-subminiature type B, 9 pin"), esto es D-subminiatura tipo B, con 9 Se utilizaba principalmente para la conexin del ratn (Mouse), algunos tipos antiguos de escneres y actualmente para dispositivos como PDAs ("Personal Digital Assistant") asistentes personales digitales. Cada puerto, permite conectar solamente 1 dispositivo. Para conectar y desconectar los dispositivos, as como para que la computadora los reconozca de manera correcta, es necesario apagar y reiniciar la computadora. Terminales elctricas del puerto serial
El puerto serial cuenta con 9 contactos tipo pin; se muestran las lneas elctricas y su descripcin bsica 1.- DCD (Detecta la portadora)
2.- RxD (Recibe datos) 3.- TxD (Transmite datos) 4.- DTR (Terminal de datos listo) 5.- SG (Tierra) Esquema de las lneas del puerto serial COM.
6.- DSR (Equipo de datos listo)
7.- RTS (Solicita enviar) 8.- CTS (Disponible para enviar) 9.- RI (Indica llamada) El uso principal que se le asignaba era para conectar el ratn (Mouse), e incluso escneres, pero con la salida al mercado del puerto USB se dej de utilizar con este fin. Un uso actual es para conectar algunos tipos de PDAs, agendas electrnicas, conexiones directas entre computadoras ("Laplink"), dispositivos electrnicos para prcticas acadmicas y colectoras de datos.
Para programar cualquier microcontrolador necesitas dos elementos:
Tipos de Comunicaciones Seriales:
La Existen dos tipos de comunicaciones seriales: la sncrona y asncrona .En la comunicacin serial sincrona adems de una lnea sobre la cual se transmitirn indicaran cuando un datos es vlido.
Ejemplos de este tipo de comunicacin son:
I2C ONE WIRE SPI En la comunicacin serial asncrona, no son necesarios los pulsos de reloj.
La duracin de cada bit esta determinada por la velocidad con la cual se realiza la transferencia de datos. La siguiente figura muestra la estructura de una carcter que se trasmite en forma
Pasos para poder enviar datos a travs del Puerto Serial: Insertar el control MS Comm sobre la forma: Establecer las siguientes propiedades: ComPort: Settings: Handshaking: Abrir el puerto, si este ya est abierto por otra aplicacin, entonces se debe cerrar esa aplicacin, para despus volverlo a abrir el puerto con una aplicacin en
Visual Basic, esto se hace utilizando la siguiente instruccin: MSComm1.Portopen = true
Definir el tamao del buffer receptor, esto se hace con la propiedad InputLen MSComm1.InputLen = 1024
Enviar los datos que se desean Cuando la aplicacin se termine se debe cerrar el puerto.
Aplicacin #1
1. Cree un Nuevo proyecto Form1 (es creado por default).
2. Seleccione del men Project ,verifique que el control MicrosoftComm, este en la barra de herramientas 3. Agregue el control MSCOMM a la forma.
4. Agregue 2 controles Command Buttons a la forma. Agregue el siguiente cdigo a sus respetivos controles: Option Explicit Const Xon = &H11
Const Xoff = &H13
Private Sub Form_Load()
Form1.Caption = "Primera aplicacin con el Puerto Serial
With MSComm1
.Handshaking = 2 - comRTS
.RThreshold = 1
.RTSEnable = True
.Settings = "9600,n,8,1"
.SThreshold = 1
.PortOpen = True
End With
Command1.Caption = "&Send Xoff" Command2.Caption = "Send &Xon" End Sub Private Sub Command1_Click()
MSComm1.Output = "123456789" & Chr$(Xoff) End Sub
Private Sub Command2_Click()
MSComm1.Output = "987654321" & Chr$(Xon) End Sub
Private Sub Form_Unload(Cancel As Integer) MSComm1.PortOpen = False End Sub
c l e a r a l l ; c l o s e a l l ; c l c ;
PS = serial('COM1')
set(PS,'Baudrate',9600);%Se configura la velocidad a 9600 bps set(PS,'StopBits',1);%Se configura el bit de paro set(PS,'DataBit',8);%Se configura que el dato es de 8 bits set(PS,'Parity','none');%Se configura la paridad set(PS,'Terminator','CL/RF');%"c" carcter con que se finaliza el envo set(PS,'OutputBufferSize',1);%"n" es el nmero de bytes a enviar set(PS,'InputBufferSize',1);%"n" es el nmero de bytes a recibir set(PS,'Timeout',5);% 5 Segundos de tiempo de espera. fopen(PS)
Para leer los datos del puerto serial se debe poner la instruccin
variable = fread(PS,1,'uint8');
Para escribir el dato en el puerto serial se ocupa la siguiente instruccin Fwrite (PS,variable,'uint16'); Finalmente, nunca vez que lees del puerto o escribes en el se debe de cerrar a travs de las instrucciones
Close (PS); Delete (PS); Clear PS;
UART.- Decodifica serial a paralelo.
DSP .- Dispositivo Digital Programable. 4.4 Programacin Del Puerto Paralelo
Conocido tambin con el nombre de CENTRONICS INTERFACE transmite los datos en paralelo mediante un bus de 8 lneas ms las lneas de control del protocolo y del estado de la impresora, esto nos permite disponer de varias lneas digitales que podremos controlar independientemente y de forma inmediata mediante las instrucciones de control de puertos (por ejemplo: outportb(), inportb() en C++). Esto hace que podamos, de forma muy sencilla, controlar directamente dispositivos electrnicos como pueden ser Leds, microreles, pulsadores, etc...
El puerto paralelo tiene dos inconvenientes fundamentales; el primero es que cada vez menos PC los llevan incorporado y el segundo es que cuando trabajamos con un sistema operativo Windows XP, NT y 2000, necesitamos un driver que nos permita acceder a los puertos.
Descripcin Fsica Del Conector.
El puerto paralelo del pc dispone de un conector subD de 25 pines hembra al que normalmente conectamos un cable Centronics de impresora que en un extremo tiene el conector SubD 25 pines macho y por el otro un conector Centronics de 36 pines. La asignacin de pines, tanto en el conector D-25 como en el Centronics es la siguiente:
Pin
(ND- N(Ce Pntronics) in Lnea Puerto SPP Direccin Registro(bit) 25)
Para el control de estas lneas utilizamos tres puertos que estn direccionados segn la siguiente tabla:
Puerto Direccin Direccin LPT1 LPT2 Datos 378H 278H Estado 379H 279H
*FELIPE CAMPOS AVILES Con estas dos tablas podemos modificar o leer cualquiera de las lneas del puerto paralelo mediante el uso de las instrucciones de acceso a puerto, para C++ estas son outportb e inportb, para Delphi no hay, por lo que tendrs que usar los dos procedimientos siguientes:
// Envia el valor almacenado en num a puerto. Procedure EnviaByte(puerto:word;num:Byte); begin asm Mov DX,puerto Mov AL,num Out DX,AL end; end;
// Lee el valor actual de puerto. Control 37AH 27AH
Function RecibeByte(puerto:word):Byte; begin asm Mov DX,puerto IN Al,DX Mov @Result,Al end; end;
Este es un programa para enviar distintas secuencias al puerto paralelo y as
tener efectos con Leds.
; Programacin en Ensamblador ; Ejemplo de escritura en puertos ; VILLARREAL ROMERO MAGDALENA ; mag_fairy.sweet@hotmail.com ; Este programa tiene como funcin demostrar como se puede escribir datos en un ; puerto, en este caso usamos el puerto paralelo del PC el cual es sencillo ; de visualizar conectando 8 leds a los pines 2 a 9 cada uno en serie con una ; resistencia de 220 ohms, los datos visualizados corresponden a las valores ; ASCII de la tecla presionada. ; el programa termina cuando se presiona * ;Declaracin del segmento de pila STACK SEGMENT PARA STACK 'STACK' DB 256 DUP(0) ;256 BYTES DE ESPACIO EN EL STACK STACK ENDS ASSUME CS:COD ,DS:COD COD SEGMENT ; Mensajes MES1 DB 'EJEMPLO DE ACCESO A PUERTOS VILLARREAL ROMERO MAGDALENA JULIO 15 DE 2013','$' MES2 DB 'OPRIMA * PARA SALIR','$'
MES3 DB 'ADIOS','$' MENSAJE DW 0 MAIN PROC FAR *FELIPE CAMPOS AVILES MOV AX,CS MOV DS,AX ; Escribir mensaje inicial ; EJEMPLO DE ACCESO A PUERTOS VILLARREAL ROMERO MAGDALENA JULIO 15 DE 2013 ; OPRIMA * PARA SALIR MOV MENSAJE,OFFSET MES1 CALL ESCRIBIR MOV MENSAJE,OFFSET MES2 CALL ESCRIBIR ;Bucle principal que captura los caracteres del teclado y enva su valor ASCII ; al bus de datos del puerto paralelo el corresponde a la direccin 378h bucle: ; LEE EL CARACTER DEL TECLADO MOV AH,1 MOV DL,0FFH
INT 21H ; Verifica si el carcter corresponde al * para salir del programa CMP AL,'*' ;Compara el valor de AL con el valor ASCII del asterisco JE ADIOS ;si la anterior comparacin dio igual saltar a adis MOV DX,378H ; DIRECCION DEL PUERTO PARALELO ; El comando OUT tiene como funcin escribir en el puerto cuya direccin de 16 bits ;se encuentra almacenada en DX, el valor a escribir de 8 bits se almacena en AL OUT DX,AL JMP bucle MAIN ENDP ;Rutina para desplegar mensajes ESCRIBIR PROC NEAR PUSH AX PUSH DX MOV AH,09H MOV DX,MENSAJE INT 21H
MOV AH,06 MOV DL,0DH INT 21H MOV AH,06H MOV DL,0AH INT 21H POP DX POP AX RET ESCRIBIR ENDP ; Rutina de salida ADIOS: ;Se escribe un return o alimentacion de linea MOV AH,06 MOV DL,0DH INT 21H MOV AH,06H MOV DL,0AH INT 21H ; Se escribe adis. MOV MENSAJE,OFFSET MES3 CALL ESCRIBIR ; La funcio 4CH de la inte 21HF devuelve el control al sistema operativo MOV AH,4CH INT 21H COD ENDS END MAIN
4.5 Programacin Hbrida
La programacin hbrida proporciona un mecanismo por medio del cual podemos aprovechar las ventajas del lenguaje ensamblador y los lenguajes de alto nivel, todo esto con el fin escribir programas ms rpidos y eficientes. En esta seccin se mostrar la forma para crear programas hbridos utilizando el lenguaje ensamblador y Turbo Pascal. Turbo Pascal permite escribir procedimientos y funciones en cdigo ensamblador e incluirlas como parte de los programas en lenguaje Pascal; para esto, Turbo Pascal cuenta con dos palabras reservadas: Assembler y Asm. Assembler permite indicarle a Turbo Pascal que la rutina o procedimiento que Se est escribiendo est totalmente escrita en cdigo ensamblador. EJEMPLO: Procedimiento hbrido: } Procedure Limpia_Pantalla; Assembler; Asm Mov AX,0600h Mov BH,18h Mov 78 CX,0000h Mov DX,184Fh Int 10h End;
El procedimiento del listado 23 utiliza la funcin 06h de la Int 10h del BIOS para limpiar la pantalla, este procedimiento es anlogo al procedimiento ClrScr de la unidad CRT de Turbo Pascal.
4.6 Programacin De Puerto USB (Universal Serial Bus).
Lnea serial universal de transporte de datos. Es un conector rectangular de 4 terminales que permite la transmisin de datos entre una gran gama de dispositivos externos (perifricos) con la computadora; por ello es considerado puerto; mientras que la definicin de la Real Academia Espaola de la lengua es "toma de conexin universal de uso frecuente en las computadoras".
Smbolo de USB El puerto USB 1.0 reemplaz totalmente al Gameport. Caractersticas del puerto USB
La versin USB 1.0 Aparece en el mercado, junto con el lanzamiento del microprocesador Intel Pentium II en 1997. Cada puerto, permite conectar hasta 127 dispositivos externos, pero solo se recomiendan como mximo 8, porque se satura la lnea del puerto y se ralentiza el sistema al tener que administrarse todos simultneamente. Cuenta con tecnologa "Plug&Play" la cual permite conectar, desconectar y reconocer dispositivos sin necesidad de reiniciar apagar la computadora. Las versiones USB 1.X y USB 2.0 transmiten en un medio unidireccional los datos, esto es solamente se enva recibe datos en un sentido a la vez, mientras que la versin USB 3 cuenta con un medio Duplex que permite enviar y recibir datos de manera simultnea. A pesar de que el puerto USB 3, est actualmente integrado ya en algunas placas de nueva generacin, an no hay dispositivos comerciales/populares para esta tecnologa.
Hay 2 formas de medir la velocidad de transmisin de datos del puerto USB:
1. En MegaBytes /segundo (MB/s).
2. En Megabits por segundo (Mbps).
Un error tpico, es creer que lo anterior es lo mismo, debido a que los fabricantes manejan en sus descripciones de producto la segunda cantidad, pero no es as. Existe una equivalencia para realizar la trasformacin de velocidades con una simple "regla de tres": 8 Mbps (Megabits por segundo) = 1 MB/s (MegaByte/segundo)
Ejemplo: si el fabricante de una memoria USB, seala que su producto tiene una velocidad de transmisin de hasta 480 Mbps, entonces:
Velocidad en MB/s = (480 Mbps X 1 MB/s) / 8 Mbps
Velocidad en MB/s = (480 MB/s) / 8
Velocidad en MB/s = 60 MB/s
Uso Especfico del puerto USB.
Se utilizan para conectar todo tipo de dispositivos, tales como memorias USB, cmaras fotogrficas digitales, videocmaras digitales, dispositivos para captura de video, reproductores MP3, impresoras, reproductores MP4, discos duros externos, grabadores de CD-DVD externos, conexin directa entre computadoras (Laplink), reproductores iPOD de
Apple, etc., mientras que la versin USB 3 tendr el objetivo de aumentar de manera radical las velocidades de transmisin entre los anteriores dispositivos con las computadoras.
TRADUCCIONES PCASM BOOK 1.2.2 El CPU La Unidad Central de Procesamiento (CPU ) es el dispositivo fsico que lleva a cabo las instrucciones. Las instrucciones que realizan las CPU son generalmente muy simple . Las instrucciones pueden requerir los datos que actan sobre estar en lugares especiales de almacenamiento en la CPU y esta llamada registros. La CPU puede acceder a los datos en los registros mucho ms rpido que los datos en la memoria . Sin embargo , el nmero de registros en una CPU es limitado, por lo que el programador debe tener cuidado de mantener los datos utilizados en la actualidad slo en los registros . Las instrucciones de un tipo de CPU ejecuta conforman el lenguaje de mquina de la CPU. Programas de la mquina tienen una estructura mucho ms bsico que las lenguas higherlevel . Instrucciones en lenguaje mquina se codifican como nmeros en bruto , no en los formatos de texto amistosos. Una CPU debe ser capaz de decodificar el propsito de una instruccin muy rpidamente para funcionar de manera eficiente . El lenguaje de mquina est diseada con este objetivo en mente , para no ser fcilmente descifrado por los seres humanos . Los programas escritos en otros idiomas deben ser convertidos al lenguaje de mquina nativo de la CPU para ejecutarse en el ordenador. Un compilador es un
programa que traduce programas escritos en un lenguaje de programacin en el lenguaje de mquina de una arquitectura de computadora en particular . En general, todo tipo de CPU tiene su propio lenguaje de mquina nica. Esta es una razn por la cual los programas escritos para un Mac no se pueden ejecutar en un PC de tipo IBM . Los equipos utilizan un reloj para sincronizar la ejecucin de las instrucciones. Los impulsos del reloj a una frecuencia fija (conocida como la velocidad de reloj). Cuando usted compra una computadora 1.5 GHz, 1.5 GHz es la frecuencia de reloj. El reloj no hace un seguimiento de los minutos y los segundos. Simplemente late a un ritmo constante. La electrnica de la CPU utiliza los latidos para llevar a cabo sus operaciones de forma correcta, como la forma de los latidos de una ayuda del metrnomo se toca msica en el ritmo correcto. El nmero de beats (o como se les suele llamarse ciclos) una instruccin requiere depende de la generacin de la CPU y del modelo. El nmero de ciclos depende de las instrucciones que se le han y otros factores tambin. 1.2.3 La familia 80x86 de CPUs De tipo IBM PC contienen una CPU de la familia 80x86 de Intel (o un clon de uno ) . Los de la CPU en esta familia todos tienen algunas caractersticas comunes, como un lenguaje de la mquina base. Sin embargo , los miembros ms recientes mejoran en gran medida las caractersticas.8088,8086 : Estos CPU de desde el punto de vista de programacin son idnticos. Eran la CPU del utilizado en el primer PC. Ofrecen varios registros de 16 bits : AX , BX , CX , DX , SI, DI , BP , SP, CS , DS, SS , ES, IP , BANDERAS . Ellos slo admiten un mximo de un megabyte de memoria y slo funcionan en modo real. En este modo , un programa puede acceder a cualquier direccin de memoria , incluso la memoria de otros programas ! Esto hace que la depuracin y la seguridad muy difcil ! Adems, la
memoria de programa tiene que ser dividido en segmentos . Cada segmento no puede ser mayor que 64 KB . 80286 : Esta CPU se utiliza en la clase PC de AT. Se aade algunas nuevas instrucciones al lenguaje mquina de base de la 8088/86 . Sin embargo , su nueva funcin principal es el modo protegido de 16 bits . En este modo , se puede acceder a un mximo de 16 megabytes y proteger los programas de acceso a la memoria de cada uno. Sin embargo , los programas siguen divididos en segmentos que no podra ser ms grande que 64 KB . 80386 : Esta CPU mejorado en gran medida el 80286 . En primer lugar, se extiende a muchos de los registros de celebrar 32 -bits ( EAX , EBX , ECX , EDX , ESI , EDI, EBP , ESP, EIP ) y aade dos nuevos registros de 16 bits FS y GS . Tambin agrega un nuevo modo protegido de 32 bits. En este modo , se puede acceder a un mximo de 4 gigabytes. Los programas se dividen a su vez en segmentos, pero ahora cada segmento tambin puede ser de hasta 4 gigabytes de tamao ! 80486/Pentium/Pentium Pro : Estos miembros de la familia 80x86 aadir muy pocas novedades. Aceleran principalmente por la ejecucin de las instrucciones. Pentium MMX : Este procesador aade las instrucciones MMX ( MultiMedia extensiones) para el Pentium . Estas instrucciones pueden acelerar las operaciones de grficos comunes. Pentium II: Este es el procesador Pentium Pro con las instrucciones MMX agreg. ( El Pentium III es esencialmente slo un Pentium II ms rpido . ) 1.2.4 8.086 registros de 16 bits
El 8086 CPU original contemplaba cuatro de 16 bits registros de propsito general : AX , BX , CX y DX . Cada uno de estos registros se puede descomponer en dos registros de 8 bits . Por ejemplo , el registro AX podra descomponerse en la AH y AL registra como figura 1.5 muestra . El registro AH contiene los superiores ( o alto) con 8 bits de AX y AL contiene los 8 bits inferiores de AX . A menudo AH y AL se utilizan como registros de un byte independientes , sin embargo , es importante darse cuenta de que no son independientes de AX. Cambiar AX de valor cambiar AH y AL y viceversa. Los registros de propsito general se utilizan en muchas de las instrucciones de movimiento de datos y aritmticas . Hay dos registros ndice de 16 bits : SI y DI . A menudo se utilizan como punteros , pero puede ser utilizado por muchas de las mismas tareas que en general registros . Sin embargo, no se pueden descomponer en registros de 8 bits . Los registros de BP y SP 16 bits se utilizan para apuntar a los datos en la mquina pila lengua y se llama el puntero base y Stack Pointer, respectivamente . Estos sern discutidos ms adelante. Los registros CS , DS , SS y ES 16 bits son los registros de segmento . ellos denotar lo que la memoria se utiliza para las diferentes partes de un programa . gradas CS para el cdigo de segmento , DS para el segmento de datos , SS de Pila de segmentos y ES para
Segmento Extra. ES se utiliza como un registro de segmento temporal. Los detalles de estos registros se encuentran en las secciones 1.2.6 y 1.2.7 . El puntero de instrucciones ( IP) registro se utiliza con el registro CS para realizar un seguimiento de la direccin de la siguiente instruccin a ejecutar por el De la CPU. Normalmente , como se ejecuta una instruccin , IP es avanzado para que apunte a la siguiente instruccin en la memoria. El registro de banderas almacena informacin importante sobre los resultados de una instruccin anterior. Estos resultados se almacenan como bits individuales en el registrarse. Por ejemplo , el bit Z es 1 si el resultado de la instruccin anterior fue cero o 0 si no es cero . No todas las instrucciones que modifican los bits de banderas, consulte la tabla en el apndice para ver como instrucciones individuales afectan el registro de banderas . 1.2.5 80.386 registros de 32 bits Los procesadores 80386 y posteriores han ampliado los registros. Por ejemplo, el registro AX 16 bits se extiende a ser de 32-bits. Para ser compatible hacia atrs, AX todava se refiere al registro de 16 bits y EAX se utiliza para referirse a la extendida registro de 32 bits. AX es los 16 bits ms bajos de EAX igual al es el 8-bits ms bajos de AX (y EAX). No hay manera de acceder a los 16 bits superiores de EAX directamente. Los otros registros extendidos son EBX, ECX, EDX, ESI y EDI. Muchos de los otros registros se extienden tambin. BP se convierte en EBP; SP se convierte en ESP; BANDERAS convierte EFLAGS e IP se convierte EIP. Sin embargo, a diferencia del ndice y registros de propsito general, en modo protegido de 32 bits (vase
ms adelante) se utilizan slo las versiones extendidas de estos registros. Los registros de segmento siguen siendo de 16 bits en el 80386. Tambin hay dos nuevos registros de segmento: FS y GS. Sus nombres no significan nada. Son registros de segmentos temporales adicionales (como EN). Una de las definiciones de la palabra trmino se refiere al tamao de los registros de datos de la CPU. Para la familia 80x86, el trmino es ahora un poco confuso. En la Tabla 1.2, se ve que la palabra se define como 2 bytes (o 16 bits). Se le ha dado este significado cuando el 8086 fue lanzado primero. Cuando el 80386 fue desarrollado, se decidi dejar la definicin de la palabra sin cambios, a pesar de que el tamao del registro cambi. 1.2.6 Modo Real En modo real , la memoria se limita a slo un megabyte ( 220 bytes ) . Rango de direcciones Vlido desde (en hexadecimal ) 00000 a FFFFF . Estas direcciones requieren un 20 - el nmero de bit . Obviamente , un nmero de 20 bits no se ajusta a ninguno de los registros de la 8086 de 16 bits. Intel soluciona este problema, mediante el uso de dos valores de 16 bits para determinar una direccin. El primer valor de 16 bits se llama el selector . Valores de selectores deben ser almacenados en los registros de segmento . El segundo valor de 16 bits se llama el desplazamiento . La direccin fsica que hace referencia un selector de 32 bits : offset par es calculado por la frmula 16 selector + offset Multiplicar por 16 en hexadecimal es fcil, slo tiene que aadir un 0 a la derecha del nmero . Por ejemplo
, las direcciones fsicas que se hace referencia por 047C : 0048 viene dada por : 047C0 0048 04808 En efecto , el valor del selector es un nmero del prrafo ( vase el Cuadro 1.2 ) . Direcciones Bienes segmentados tienen desventajas : Un solo valor del selector slo puede hacer referencia a 64K de memoria (el lmite superior de la 16 bits de desplazamiento ) . Qu pasa si un programa tiene ms de 64 KB de cdigo? Un valor nico en CS no se puede utilizar para toda la ejecucin del programa. El programa debe ser dividido en secciones (denominadas segmentos) de menos de 64 KB de tamao. Cuando la ejecucin se mueve desde un segmento a otro, el valor de CS debe ser cambiado. Problemas similares ocurren con grandes cantidades de datos y los registro DS. Esto puede ser muy incmodo! Cada byte en la memoria no tiene una direccin segmentada nica. El 04808 direccin fsica puede hacer referencia a 047C: 0048, 047D: 0038, 047E: 0028 o 047B: 0058. Esto puede complicar la comparacin de direcciones segmentados. 1.2.7 de 16 bits en modo protegido En el modo de 16 bits protegido del 80286, los valores de selector se interpretan completamente diferente que en modo real. En el modo real, un valor de selector es un nmero del prrafo de la memoria fsica. En el modo protegido, un valor de selector es un ndice en una tabla de descriptores. En ambos modos, los
programas se dividen en segmentos. En el modo real, estos segmentos estn en posiciones fijas en la memoria fsica y el valor del selector de puntos marca el nmero de prrafo del principio del segmento. En el modo protegido, los segmentos no estn en posiciones fijas en la memoria fsica. De hecho, que no tienen que estar en la memoria en absoluto! El modo protegido usa una tcnica llamada memoria virtual. La idea bsica de un sistema de memoria virtual es slo para mantener los datos y el cdigo en la memoria que los programas estn utilizando actualmente. Otros datos y el cdigo se almacenan temporalmente en el disco hasta que se necesiten de nuevo. En el modo protegido de 16 bits, los segmentos se mueven entre la memoria y el disco, segn sea necesario. Cuando un segmento se devuelve a la memoria desde el disco, es muy probable que se puede poner en un rea diferente de la memoria que estaba antes de ser movido en el disco. Todo esto se hace de forma transparente por el sistema operativo. El programa no tiene que ser escrito de manera diferente para la memoria virtual para trabajar. En el modo protegido, cada segmento se le asigna una entrada en una tabla de descriptores. Esta entrada tiene toda la informacin que el sistema necesita saber sobre el segmento. Esta informacin incluye: es actualmente en la memoria, y si en la memoria, dnde est; permisos de acceso (por ejemplo, de slo lectura). El ndice de la entrada del segmento es el valor del selector que se almacena en registros de segmento. Una gran desventaja de modo protegido de 16 bits es que las compensaciones son todava cantidades de 16
bits. Como consecuencia de esto, tamaos de segmento son todava limitados Toat ms de 64K. Esto hace que el uso de grandes matrices problemtica! 1.2.8 de 32 bits en modo protegido El 80386 introdujo el modo protegido de 32 bits. Hay dos diferencias principales entre 386 de 32 bits y 286 modos de 16 bits protegidas: 1. Las compensaciones se expandieron a ser de 32- bits. Esto permite un desplazamiento en un rango de hasta 4 millones de dlares. Por lo tanto, los segmentos pueden tener tamaos de hasta 4 gigabytes. 2. Los segmentos pueden ser divididos en unidades de 4K de tamao ms pequeos llamados pginas. El sistema de memoria virtual trabaja con pginas ahora en lugar de segmentos. Esto significa que slo las partes del segmento pueden estar en la memoria en cualquier momento. En 286 el modo de 16 bits, o bien todo el segmento est en la memoria o nada de esto es. Esto no es prctico Con los segmentos de mayor tamao que el modo de 32 bits permite. En Windows 3.x, modo estndar se refiere a 286 modo protegido de 16 bits y el modo mejorado se refiere al modo de 32 bits. Windows 9X, Windows NT/2000/XP, OS / 2 y Linux todos se ejecutan en modo protegido de 32 bits paginado. 1.2.9 Interrupciones A veces el flujo normal de un programa debe ser interrumpido para procesar los eventos que requieren una respuesta rpida. El hardware de un ordenador proporciona un mecanismo llamado interrumpe para controlar estos eventos. Por ejemplo, cuando se mueve el ratn, el hardware del ratn interrumpe el
programa en curso para manejar el movimiento del ratn (para mover el cursor del ratn, etc) Control causa interrupciones para ser pasado a un manejador de interrupciones. El manejador de interrupciones son rutinas que procesan la interrupcin. Cada tipo de interrupcin se le asigna un nmero entero. Al comienzo de la memoria fsica, una tabla de vectores de interrupcin reside que contiene las direcciones segmentados de los controladores de interrupcin. El nmero de interrupciones es esencialmente un ndice en esta tabla. Las interrupciones externas son criados desde fuera del CPU. (El ratn es un ejemplo de este tipo.) Muchos de los dispositivos de E / S plantean interrupciones (por ejemplo, teclado, temporizador, unidades de disco, CD-ROM y tarjetas de sonido). Interrupciones internas son criados desde el interior de la CPU, ya sea de un error o de la instruccin de interrupcin. Interrupciones de error tambin se llaman trampas. Interrupciones generadas a partir de la instruccin de interrupcin se llaman interrupciones de software. DOS utiliza este tipo de interrupciones para implementar su API (Interfaz de Programacin de Aplicaciones). Sistemas operativos ms modernos (como Windows y UNIX) utilizan una interfaz de C basado. Muchos controladores de interrupcin devuelven el control al programa interrumpido cuando terminen. Restauran todos los registros a los mismos valores que tenan antes de producirse la interrupcin. As, el programa interrumpido se ejecuta como si nada hubiera pasado (salvo que perdi algunos ciclos de
CPU). Trampas generalmente no regresan. A menudo abortar el programa. USO DE MACROS Pgina 1 225 CAPTULO 9 Uso de macros Una "macro" es un nombre simblico que le das a una serie de personajes (una macro de texto) oa una o ms sentencias (un procedimiento o funcin macro). Como el ensamblador evala cada lnea de su programa, que analiza el cdigo fuente de los nombres de previamente definido macros. Cuando encuentra uno, se sustituye el texto de la macro de el nombre de la macro. De esta manera, se puede evitar escribir el mismo cdigo varias lugares en su programa. Este captulo describe los siguientes tipos de macros:
Macros de texto, que se expanden al texto de una declaracin de origen.
Procedimientos de macro, que se expanden a una o ms completos y declaraciones opcionalmente puede tener parmetros.
Repita los bloques, los cuales generan un grupo de sentencias un nmero determinado de veces o hasta que una condicin especificada sea verdadera.
Funciones de macro, que se parecen procedimientos macro y pueden utilizarse como texto macros, sino que tambin devuelve un valor.
Macro funciones predefinidas y directivas de cuerda, que realizan cadena
operaciones. En este captulo se explica cmo utilizar macros para sustituciones simples de cdigo y cmo escribir macros sofisticadas con listas de parmetros y repetir los bucles. Tambin describe cmo utilizar estas caractersticas en conjunto con los smbolos locales, macro operadores y funciones de macro predefinidas. Nombre del archivo: LMAPGC09.DOC Pro yecto: Plantilla: MSGRIDA1.DOT Autor: rick Debroux Guardado por: Ruth L Silverio Revisin #: 86 Pgina: 225 de 1 Impreso: 10/02/00 16:22
Pgina 2 226 Gua del programador Macros de texto Usted puede dar a una secuencia de caracteres de un nombre simblico y luego use el nombre en lugar del texto ms adelante en el cdigo fuente. El texto con el nombre se llama un texto macro. La directiva TEXTEQU define una macro de texto, como muestran estos ejemplos: nombrar TEXTEQU <text> nombrar TEXTEQU macroId | textmacro nombrar TEXTEQU% constexpr En las lneas anteriores, el texto es una secuencia de caracteres entre parntesis angulares, macroId es una funcin de macro previamente definida, textmacro es una previamente
macro texto definido y% constexpr es una expresin que se evala como texto. He aqu algunos ejemplos: msg TEXTEQU <algn <texto ; Texto asignado al smbolo cadena TEXTEQU msg ; Macro de texto asignado a smbolo msg TEXTEQU <algn otra <texto ; Nuevo texto asignado a smbolo valor TEXTEQU% (3 + num); La representacin de texto de resolverse ; expresin asignada a smbolo La primera lnea de texto asigna al smbolo msg . La segunda lnea es igual al texto de la msg macro de texto con una nueva macro de texto llamado cadena . La tercera lnea asigna nuevo texto msg . Aunque msg tiene un nuevo texto, cadena
conserva su texto original valor. La cuarta lnea asigna a 7 valor si num es igual a 4. Si una macro de texto se expande a otra macro de texto (o la funcin macro, como se comenta en la pgina 248), el resultante macro texto se expandir de forma recursiva. Macros de texto son tiles para nombrar las cadenas de texto que no se evalan en nmeros enteros. Por ejemplo, puede utilizar una macro de texto para nombrar de punto flotante constante o una expresin entre corchetes. He aqu algunos ejemplos prcticos: pi TEXTEQU <3.1416> ; Flotante constante WPT TEXTEQU <word PTR> ; Secuencia de palabras clave arg1 TEXTEQU <[pb 4]> ; Expresin entre corchetes Procedimientos Macro Si su programa tiene que realizar la misma tarea varias veces, usted puede evitar tecleando repetidamente las mismas declaraciones cada vez escribiendo un procedimiento macro. Piense en los procedimientos de macro (comnmente llamados macros) como el procesamiento de textos mecanismos que generan de forma automtica texto repetido.
Nombre del archivo: LMAPGC09.DOC Pro yecto: Plantilla: MSGRIDA1.DOT Autor: rick Debroux Guardado por: Ruth L Silverio Revisin #: 86 Pgina: 226 de 2 Impreso: 10/02/00 16:22
Pgina 3 Captulo 9 Uso de macros 227 En esta seccin se utiliza el trmino "procedimiento de macro" en lugar de "macro" cuando necesario distinguir entre un procedimiento y una funcin de macro macro. Funciones de macro se describen en "Devolver valores con funciones de macro." Conforme al uso comn, en este captulo de vez en cuando habla de "el que llama" una macro, un trmino que merece un examen ms detallado. Es natural pensar en un programa llamar a un procedimiento de macro en la misma forma en que se llama a una subrutina normales procedimiento, ya que parecen funcionar de forma idntica. Sin embargo, una macro es simplemente un representante para el cdigo real. Cada vez que un nombre de macro aparece en su programa, por lo que en realidad hace todo el cdigo de la macro representa. Una macro no hacer que el procesador de servir como vector fuera a una nueva ubicacin al igual que un procedimiento normal. Por lo tanto, la expresin "llamar a una macro" puede implicar el efecto, pero no lo hace describir con precisin lo que realmente ocurre. Crear procedimientos Macro
Puede definir un procedimiento macro sin parmetros colocando el deseado declaraciones entre las directivas MACRO y ENDM: Nombre de la macro declaraciones ENDM Por ejemplo, supongamos que desea un programa para que suene cuando se encuentra con cierta errores. Se podra definir una bip macro de la siguiente manera: MACRO pitido mov ah, 2 ;; Seleccione la funcin de impresin de Char DOS dl mov, 7 ;; Seleccione ASCII 7 (campana) int 21h ;; Llama al DOS ENDM Los dobles y comas marcan el comienzo de los comentarios de macro. Macro comentarios aparecen en un archivo de lista nica en la definicin inicial de la macro, no en el punto donde se hace referencia a la macro y se expandi. Listados suelen ser ms fciles de leer si los comentarios no se expanden en varias ocasiones. Sin embargo, los comentarios regulares (Los que tienen un solo punto y coma) se enumeran en expansiones de macros. Vase el Apndice C para la inclusin de archivos y ejemplos de cmo las macros se expanden en los listados. Una vez definida una macro, puede llamar a cualquier lugar en el programa mediante el uso de la El nombre de la macro como una declaracin. El ejemplo siguiente se llama al
bip macro de dos veces si un indicador de error se ha establecido. . SI error; Si la bandera de error es cierto un pitido; ejecutar macro dos veces bip . ENDIF Nombre del archivo: LMAPGC09.DOC Pro yecto: Plantilla: MSGRIDA1.DOT Autor: rick Debroux Guardado por: Ruth L Silverio Revisin #: 86 Pgina: 227 de 3 Impreso: 10/02/00 16:22
Pgina 4 228 Gua del programador Durante el montaje, las instrucciones de la macro sustituir la referencia macro. La lista demuestra el expediente: . SI error 0017 80 3E 0000 R 00 * cmp
ah, 2 0026 B2 07 1 mov dl, 7 0028 CD 21 1 int 21h . ENDIF 002A * @ C0001: Esto contrasta con los resultados de la definicin bip como un procedimiento mediante el PROC Directiva y luego llamar con la instruccin CALL. Muchas de estas tareas pueden ser manejados, ya sea como una macro o un procedimiento. Al decidir el mtodo a utilizar, debe elegir entre velocidad y tamao. Para repetitivo tareas, un procedimiento produce un cdigo ms pequeo, porque las instrucciones fsicamente aparecer slo una vez en el programa montado. Sin embargo, cada llamada a la procedimiento consiste en la sobrecarga adicional de una llamada y la instruccin RET. Las macros no requieren un cambio en el flujo del programa y as se ejecutan ms rpidamente, pero generar el mismo cdigo varias veces en lugar de una sola vez.
Pasar argumentos a macros Mediante la definicin de los parmetros de las macros, puede definir una tarea general y luego ejecutar variaciones de la misma al pasar argumentos diferentes cada vez que se llama a la macro. La sintaxis completa de un procedimiento macro incluye una lista de parmetros: nombrar ParameterList MACRO declaraciones ENDM El ParameterList puede contener cualquier nmero de parmetros. Utilice comas para separe cada parmetro de la lista. No puede utilizar palabras reservadas como parmetro nombres a menos que deshabilite la palabra clave con la opcin NOKEYWORD. Usted Tambin debe establecer el modo de compatibilidad con OPCIN M510 o el / Zm opcin de lnea de comandos. Para pasar argumentos a una macro, coloque los argumentos despus del nombre de la macro cuando se llama a la macro: arglist macroname Nombre del archivo: LMAPGC09.DOC Pro yecto: Plantilla: MSGRIDA1.DOT Autor: rick Debroux Guardado por: Ruth L Silverio Revisin #: 86 Pgina: 228 de 4 Impreso: 10/02/00 16:22
Pgina 5 Captulo 9 Uso de macros
229 Las delicias de ensamblador como un elemento todo el texto entre comillas coincidentes en un arglist. La bip macro introducida en la seccin anterior utiliza la interrupcin de MS-DOS a escribir slo el carcter de campana (ASCII 7). Podemos reescribir la macro con un parmetro que acepta cualquier personaje: WriteChar caracteres MACRO mov ah, 2 ;; Seleccione la funcin de impresin de Char DOS dl mov, carbn de lea ;; Seleccione caracteres ASCII int 21h ;; Llama al DOS ENDM Cada vez que se expande la macro, el ensamblador reemplaza cada instancia de carbn de lea con el valor del argumento dado. La macro reescrito ahora escribe cualquier personaje para la pantalla, no slo ASCII de 7: WriteChar 7; Causas ordenador emita un sonido WriteChar 'A'; Escribe la A a la pantalla Si pasa ms argumentos que los que hay parmetros, los argumentos adicionales generar una advertencia (a menos que utilice la palabra clave vararg; consulte la pgina 242). Si se pasa menos argumentos que el procedimiento macro espera, el ensamblador asigna cadenas vacas a los parmetros restantes (a menos que haya especificado
valores por defecto). Esto puede provocar errores. Por ejemplo, una referencia a la WriteChar macro sin resultados de argumentos en la lnea siguiente: dl mov, El ensamblador genera un error para la declaracin expandido pero no para la definicin de la macro o la llamada a la macro. Puedes hacer las macros ms flexible, dejando fuera los argumentos o agregar argumentos adicionales. La siguiente seccin le dice algunas de las formas en que sus macros pueden manejar argumentos faltantes o adicionales. Especificar los parmetros requeridos y predeterminados Parmetros macro pueden tener atributos especiales para hacerlos ms flexibles y mejorar la gestin de errores. Puede hacer que los parmetros necesarios, darles forma predeterminada valores, o varan su nmero. Los parmetros variables se utilizan casi exclusivamente con la Directiva para, por lo que se tratan en "Bucles FOR y de longitud variable Parmetros ", ms adelante en este captulo. Nombre del archivo: LMAPGC09.DOC Pro yecto: Plantilla: MSGRIDA1.DOT Autor: rick Debroux Guardado por: Ruth L Silverio Revisin #: 86 Pgina: 229 de 5 Impreso: 10/02/00 16:22
Pgina 6 230
Gua del programador La sintaxis de un parmetro requerido es: parmetro: REQ Por ejemplo, se puede reescribir la WriteChar macro para requerir la carbn de lea parmetro: WriteChar caracteres MACRO: REQ mov ah, 2 ;; Seleccione la funcin de impresin de Char DOS dl mov, carbn de lea ;; Seleccione caracteres ASCII int 21h ;; Llama al DOS ENDM Si la llamada no incluye un argumento coincidente, el ensamblador informa del error en la lnea que contiene la referencia macro. REQ por lo tanto puede mejorar error la presentacin de informes. Tambin puede adaptarse a los parmetros que faltan al especificar un valor por defecto, de esta manera: parmetro: = textValue Suponga que usted utiliza a menudo WriteChar a pitar imprimiendo ASCII 7. El macro siguiente definicin utiliza el signo igual para decirle al ensamblador para asumir la parmetro
carbn de lea es 7 menos que se especifique lo contrario: WriteChar caracteres MACRO: = <7> mov ah, 2 ;; Seleccione la funcin de impresin de Char DOS dl mov, carbn de lea ;; Seleccione caracteres ASCII int 21h ;; Llama al DOS ENDM Si una referencia a esta macro no incluye el argumento carbn de lea , El ensamblador llena el espacio en blanco con el valor por defecto de 7 y los macro pitidos cuando se le llama. Encierre el valor predeterminado del parmetro entre corchetes angulares por lo que el ensamblador reconoce el valor proporcionado como un valor de texto. Esto se explica en detalle en "Texto Los delimitadores y el Operador Literal-Character ", ms adelante en este captulo. Argumentos que faltan tambin se pueden manejar con la IFB, IFNB,. ERRB y directivas. ERRNB. Se describen en la seccin "Directivas condicionales" en el captulo 1 y en la Ayuda. Aqu es un poco ms compleja macro que utiliza algunos de estas tcnicas: Nombre del archivo: LMAPGC09.DOC Pro yecto: Plantilla: MSGRIDA1.DOT Autor: rick Debroux Guardado por: Ruth L Silverio
Revisin #: 86 Pgina: 230 de 6 Impreso: 10/02/00 16:22
Pgina 7 Captulo 9 Uso de macros 231 MACRO distancia de desplazamiento: REQ, attrib: = <7>, Tcol, Trow, bcol, frente IFNB <tcol>;; No haga caso de los argumentos si est en blanco mov cl, Tcol ENDIF <TRow> IFNB ch mov, trow ENDIF <bcol> IFNB dl mov, bcol ENDIF <brow> IFNB dh mov, frente ENDIF IFDIFI <ATTRIB>, <bh>;; No mueva BH sobre s mismo mov bh, attrib ENDIF SI LE distancia 0;; Rollos negativos para arriba, positiva hacia abajo mov
hacha, 0600H + (- (distancia) Y 0FFh) ELSE mov ax, 0700h + (distancia Y 0FFh) ENDM ENDIF int 10h En esta macro, la distancia parmetro es necesario. La attrib parmetro tiene un valor por defecto de 7 (blanco sobre negro), pero la macro tambin pone a prueba para asegurarse de que la argumento correspondiente no est BH, ya que sera ineficiente (aunque legal) cargar un registro en s mismo. La directiva IFNB se utiliza para probar para el blanco argumentos. Estos son ignorados para permitir al usuario manipular filas y columnas directamente en los registros CX y DX en tiempo de ejecucin. A continuacin se muestran dos formas vlidas para llamar a la macro: ; Supongamos DL y CL ya cargado diciembre dh ; Decrementamos fila superior inc ch ; Fila inferior Incremento Desplcese -3 ; Blanco Desplcese en dinmica negro ; ventana de tres lneas De desplazamiento 5, 17h, 2, 2, 14, 12; Blanco Desplcese en azul constante
; ventanilla cinco lneas Esta macro puede generar cdigo completamente diferente, en funcin de sus argumentos. En este sentido, no es comparable a un procedimiento, que siempre tiene el mismo cdigo, independientemente de los argumentos. Nombre del archivo: LMAPGC09.DOC Pro yecto: Plantilla: MSGRIDA1.DOT Autor: rick Debroux Guardado por: Ruth L Silverio Revisin #: 86 Pgina: 231 de 7 Impreso: 10/02/00 16:22
Pgina 8 232 Gua del programador Definir smbolos locales en Macros Usted puede hacer un smbolo local a una macro al identificarlo en el inicio de la macro con la directiva LOCAL. Cualquier identificador puede ser declarada local. Usted puede elegir si desea que equipara numricos y macros de texto a ser locales o global. Si un smbolo se usar slo dentro de una macro determinada, puede declararlo local para que el nombre estar disponible para otras declaraciones fuera la macro. Debe declarar como locales las etiquetas dentro de una macro, ya que puede ocurrir una etiqueta slo una vez en la fuente. La directiva local hace un caso especial de la etiquetar cada vez que aparezca macro. Esto evita que la redefinicin de la etiqueta cuando
la expansin de la macro. Tambin le permite reutilizar la etiqueta en otro lugar de su cdigo. Debe declarar todos los smbolos locales inmediatamente despus de la MACRO declaracin (aunque las lneas en blanco y los comentarios pueden preceder el smbolo local). Separe cada smbolo con una coma. Puede adjuntar comentarios a la LOCAL declaracin y la lista de mltiples declaraciones local en la macro. He aqu un ejemplo macro que declara etiquetas locales: factor de potencia MACRO: REQ, exponente: REQ LOCAL de nuevo, gotzero;; Smbolos locales sub dx, dx ;; Claro superior mov ax, 1 ;; Multiplique por uno en primer bucle mov cx, exponente;; Conteo de carga jcxz gotzero;; Hecho si es cero exponente bx mov, el factor;; El factor de carga nuevo: mul bx ;; Multiplicar factor por exponente bucle de nuevo ;; Resultado en AX gotzero: ENDM Si las etiquetas de nuevo
y gotzero no fueron declaradas local, el macro hara trabajar la primera vez que se llama, pero sera generar errores de redefinicin en las llamadas posteriores. MASM implementa etiquetas locales mediante la generacin de distintos nombres para ellos cada vez que la macro se llama. Esto se puede ver en el listado de archivos. La etiquetas en el potencia macro podra ser ampliado para ?? 0000 y ?? 0001 en la primera convocatoria y para ?? 0002 y ?? 0003 en el segundo. Nombre del archivo: LMAPGC09.DOC Pro yecto: Plantilla: MSGRIDA1.DOT Autor: rick Debroux Guardado por: Ruth L Silverio Revisin #: 86 Pgina: 232 de 8 Impreso: 10/02/00 16:22
Pgina 9 Captulo 9 Uso de macros 233 Usted debe evitar el uso de etiquetas annimas en las macros (ver "Las etiquetas annimos" en el Captulo 7). Aunque legal, pueden producir resultados no deseados si expande un macro cerca de otro sello en el anonimato. Por ejemplo, considere lo que sucede en el siguiente: Actualizar arg1 MACRO @ @ :. . . loop @ B ENDM @ @: . . . jcxz @ F Update hacha En expansin Actualizacin pone otra etiqueta annima entre el salto y su objetivo. La lnea jcxz @ F en consecuencia, salta al principio del bucle en lugar de a travs del bucle-exactamente
lo contrario de lo que pretende el programador. Variables Asamblea en tiempo y Operadores Macro En la creacin de macros, se le suele asignar y modificar los valores asignados a los smbolos. Piense en estos smbolos como variables en tiempo de montaje. Al igual que las variables de memoria, son smbolos que representan valores. Pero ya que las macros se procesan en tiempo de montaje, cualquier smbolo modificado de una macro debe resolverse como una constante por el extremo del conjunto. Los tres tipos de variables en tiempo de la asamblea son:
Parmetros de macro
Macros de texto
Las funciones macro Cuando el ensamblador se expande una macro, que procesa los smbolos en el orden se muestra aqu. MASM primero reemplaza parmetros de macro con el texto de su actual argumentos, luego se expande macros de texto. Nombre del archivo: LMAPGC09.DOC Pro yecto: Plantilla: MSGRIDA1.DOT Autor: rick Debroux Guardado por: Ruth L Silverio Revisin #: 86 Pgina: 233 de 9 Impreso: 10/02/00 16:22
Pgina 10 234 Gua del programador Parmetros de macro son similares a los parmetros del procedimiento en algunos aspectos, pero que tambin tienen diferencias importantes. En un procedimiento, un parmetro tiene un tipo y un ubicacin de memoria. Su valor puede ser modificada dentro del procedimiento. En una macro, un parmetro es un marcador de posicin para el texto argumento. El valor slo se puede asignar a otra seal o utilizado directamente; no se puede modificar. El mayo macro interpretar el texto argumento que recibe ya sea como un valor numrico o como un texto valor. Es importante entender la diferencia entre los valores de texto y numrica valores. Los valores numricos se pueden procesar con operadores aritmticos y asignados que equipara numricos. Los valores de texto se pueden procesar con funciones de macro y asignado a las macros de texto. Operadores de macro suelen ser tiles en el tratamiento de variables en tiempo de montaje. Tabla 9.1 muestra los operadores de macro que MASM proporciona. Tabla 9.1 MASM Operadores Macro Smbolo Nombre Descripcin <> Los delimitadores de texto Abre y cierra una cadena literal. !
Operador Literal-Character Se usa para tratar el siguiente carcter como un carcter literal, incluso si normalmente tendra otro significado. % Operador de Expansin Hace que el ensamblador para expandir una constante expresin o texto macro. Y Operador Sustitucin Le dice al ensamblador para reemplazar una macro parmetro o de texto Nombre de macro, con su valor real. Las siguientes secciones explican estos operadores en detalle. Los delimitadores de texto y el Operador Literal-Character Los corchetes angulares (<>) son delimitadores de texto. Un valor de texto es por lo general delimitada al asignar una macro de texto. Usted puede hacer esto con TEXTEQU, como antes muestran, o con las directivas SUBSTR y CATSTR discuten en "String Directivas y funciones predefinidas, "ms adelante en este captulo. Por delimitar el texto de argumentos de la macro, se puede pasar de texto que incluye espacios, comas, puntos y comas y otros caracteres especiales. La siguiente ejemplo expande una macro llamada trabajo de dos maneras diferentes: trabajar <1, 2, 3, 4, 5>; Pasa una discusin con 13 caracteres, ; incluyendo comas y espacios trabajar 1, 2, 3, 4, 5; Pasa cinco argumentos, cada uno
; 1 con carcter Nombre del archivo: LMAPGC09.DOC Pro yecto: Plantilla: MSGRIDA1.DOT Autor: rick Debroux Guardado por: Ruth L Silverio Revisin #: 86 Pgina: 234 de 10 Impreso: 10/02/00 16:22
Pgina 11 Captulo 9 Uso de macros 235 El operador literal-character (!) Le permite incluir corchetes angulares como parte de un delimitado por valor de texto, as que el compilador no los interpreta como delimitadores. La ensamblador trata el carcter que sigue! literalmente y no como un especial carcter, as: errstr TEXTEQU <expresin !> 255>; errstr = "Expression> 255" Delimitadores de texto tambin tienen un uso especial con el PARA Directiva, como se explica en "PARA Loops y parmetros de longitud variable," ms adelante en este captulo. Operador de Expansin El operador de expansin (%) expande macros de texto o convierte constante expresiones en sus representaciones de texto. Se lleva a cabo estas tareas de manera diferente en diferentes contextos, como se discute en la siguiente. La conversin de las expresiones numricas en texto El operador de expansin puede convertir nmeros a texto. Las fuerzas de operador
evaluacin inmediata de una expresin constante y lo reemplaza con un valor de texto que consta de los dgitos del resultado. Los dgitos se generan en el radix actual (Decimal por omisin). Esta aplicacin del operador de expansin es til al definir una macro de texto, como las siguientes lneas muestran. Observe cmo se puede incluir expresiones con parntesis para que sean ms legibles: un TEXTEQU <3 + 4> ; a = "3 + 4" b TEXTEQU% 3 + 4 ; b = "7" c TEXTEQU% (3 + 4) ; c = "7" Al asignar macros de texto, puede utilizar equipara numricos en la constante expresiones, pero no las macros de texto: num EQU 4 ; num = 4 numstr TEXTEQU <4> ; numstr = <4> un TEXTEQU% 3 + num ; A = <7> b
TEXTEQU% 3 + numstr ; b = <7> El operador de expansin le da flexibilidad a la hora de pasar argumentos a macros. Te permite pasar un valor calculado en lugar del texto literal de una expresin. El siguiente ejemplo ilustra mediante la definicin de una macro trabajo Arg MACRO mov ax, arg * 4 ENDM Nombre del archivo: LMAPGC09.DOC Pro yecto: Plantilla: MSGRIDA1.DOT Autor: rick Debroux Guardado por: Ruth L Silverio Revisin #: 86 Pgina: 235 de 11 Impreso: 10/02/00 16:22
Pgina 12 236 Gua del programador que acepta diferentes argumentos: trabajo 2 + 3 ; Pasa "2 + 3" ; Cdigo: mov ax, 2 + (3 * 4) trabajo
2% + 3 ; Pasa 5 ; Cdigo: mov ax, 5 * 4 trabajo 2 + num ; Pasa "2 + num" trabajo % 2 + num ; Pasa "6" trabajo 2 + numstr ; Pasa "2 + numstr" trabajo % 2 + numstr ; Pasa "6" Debe tener en cuenta la precedencia de operadores cuando se utiliza el operador de expansin. Los parntesis dentro de la macro puede forzar la evaluacin en un orden deseado: trabajo Arg MACRO mov ax, (arg) * 4 ENDM trabajar 2 + 3 ; Cdigo: mov ax, (2 + 3) * 4 trabajo% 2 + 3 ; Cdigo: mov ax, (5) * 4 Varios otros usos para el operador de la expansin se revisan en "Valores que regresan
con funciones de macro ", ms adelante en este captulo. Operador de expansin como primer carcter de una lnea El operador de expansin tiene un significado diferente cuando se utiliza como el primer carcter en una lnea. En este caso, se indica al ensamblador para expandir las macros de texto y funciones de macro que encuentre en el resto de la lnea. Esta caracterstica hace posible el uso de macros de texto con directivas como ECHO, TTULO, y el subttulo, que toman un argumento que consiste en un texto nico valor. Por ejemplo, ECHO despliega su argumento en el dispositivo de salida estndar durante el montaje. Tal expansin puede ser til para las macros de depuracin y expresiones, pero el requisito de que su argumento sea un nico valor de texto puede tener resultados inesperados. Considere este ejemplo: ECHO Bytes por cada elemento:% (array SIZEOF / array LENGTHOF) En lugar de evaluar la expresin, esta lnea se hace eco de ello: Bytes por cada elemento:% (array SIZEOF / array LENGTHOF) Sin embargo, se puede lograr el resultado deseado mediante la asignacin del texto de la expresin a una macro de texto y utilizando el operador de expansin en el principio de la lnea de fuerza de expansin de la macro de texto. Nombre del archivo: LMAPGC09.DOC Pro yecto: Plantilla: MSGRIDA1.DOT Autor: rick Debroux Guardado por: Ruth L Silverio Revisin #: 86 Pgina: 236 de 12 Impreso: 10/02/00 16:22
Pgina 13 Captulo 9 Uso de macros 237 TEXTEQU temp% (array SIZEOF / array LENGTHOF) % ECHO Bytes por cada elemento: temp Tenga en cuenta que usted no puede conseguir los mismos resultados con slo poner el% en la a partir de la primera lnea de eco, porque% se expande slo las macros de texto, no equipara numricos o expresiones constantes. Aqu hay ms ejemplos de que el operador de expansin en el inicio de una lnea: ; Asumir memmod, lang, y os especificados con la opcin / D % SUBTTULO Modelo: memmod Idioma: lang Sistema operativo: OS ; Supongamos num definido anteriormente tnum TEXTEQU% num %. ERRE num LE 255, <Failed porque tnum !> 255> Operador Sustitucin Las referencias a un parmetro dentro de una macro a veces puede ser ambigua. En tales casos, el ensamblador no pueden ampliar el argumento de los que haba previsto. La operador de sustitucin (&) le permite identificar de forma inequvoca cualquier parmetro dentro de un macro. Como ejemplo, considere la siguiente macro: num MACRO errgen, msg Errnum PBLICA BYTE errnum "num Error: msg" ENDM Esta macro est abierto a varias interpretaciones:
Es errnum una palabra distinta o la palabra errar junto al parmetro num ?
Debera num y msg dentro de la cadena de ser tratado, literalmente, como parte de la cadena o como argumentos? En cada caso, el ensamblador elige la interpretacin ms literal. Es decir, se golosinas errnum como una palabra distinta, y num y msg partes literales de la cadena. El operador de sustitucin puede obligar a diferentes interpretaciones. Si volvemos a escribir la macro con el operador &, que se ve as: num MACRO errgen, msg Err PBLICO & num
errar & num BYTE "Error & num: & msg" ENDM Nombre del archivo: LMAPGC09.DOC Pro yecto: Plantilla: MSGRIDA1.DOT Autor: rick Debroux Guardado por: Ruth L Silverio Revisin #: 86 Pgina: 237 de 13 de Impreso: 10/02/00 16:22
Pgina 14 238 Gua del programador Cuando se llama con los siguientes argumentos, errgen 5, duro> <Unreadable la macro ahora genera este cdigo: Err5 PBLICA BYTE Err5 "Error 5: disco ilegible" Cuando encuentra el operador y, el ensamblador interpreta texto subsiguiente como una nombre del parmetro hasta la siguiente y o hasta que el siguiente carcter separador (tal como un espacio, tabulador o coma). Por lo tanto, el ensamblador analiza correctamente la expresin err & num porque num est delimitada por & y un espacio. La expresin tambin podra
ser escrito como err & num y , Que a su vez identifica de forma inequvoca num como un parmetro. La norma tambin funciona a la inversa. Puede delimitar un parmetro de referencia con y en al final en lugar de al principio. Por ejemplo, si num es 5, la expresin num y 12 se resuelve como "512". El ensamblador procesa los operadores de sustitucin de izquierda a derecha. Esto puede tener resultados inesperados cuando se est pegando a dos parmetros de la macro. Para ejemplo, si arg1 tiene el valor var y arg2 tiene el valor 3 , Usted podra pegar juntos con esta declaracin: Y arg1 arg2 && y BYTE "Texto" La eliminacin de los operadores de sustitucin de ms, se podra esperar que los siguientes son
equivalentes: Y arg1 y arg2 BYTE "Texto" Sin embargo, esta realidad produce el smbolo vararg2, porque en el procesamiento de izquierda a derecha, los socios de ensamblador tanto la primera como la segunda y smbolos con el primer parmetro. El ensamblador sustituye Y arg1 y por var , productor vararg2 . La arg2 Nunca se evala. La abreviatura correcta es: arg1 arg2 && BYTE "Texto" que produce el smbolo deseado var3 . El smbolo arg1 arg2 && se sustituye por var y arg2 , Que se sustituye por var3 .
El operador de sustitucin tambin es necesario si desea sustituir una macro de texto entre comillas. Por ejemplo, Nombre del archivo: LMAPGC09.DOC Pro yecto: Plantilla: MSGRIDA1.DOT Autor: rick Debroux Guardado por: Ruth L Silverio Revisin #: 86 Pgina: 238 de 14 Impreso: 10/02/00 16:22
Pgina 15 Captulo 9 Uso de macros 239 arg TEXTEQU <hello> % Echo Esto es una cadena "& arg"; Produce: Esto es una cadena "hola" % Echo Esta es una "arg" string; Produce: Se trata de un "arg" string Tambin puede utilizar el operador de sustitucin en las lneas que empiezan con la expansin smbolo de operador (%), incluso fuera de macros (ver pgina 236). Puede ser necesario utilizar el operador de sustitucin para pegar los nombres de texto de macro a personajes adyacentes o nombres de smbolos, como se muestra aqu: <var> TEXTEQU texto valor TEXTEQU% 5 % ECHO textValue es texto && valor Esto se hace eco del mensaje textValue es var5
Sustitucin de macros siempre se produce antes de la evaluacin del control de alto nivel estructuras. Por tanto, el ensamblador puede confundir un operador bit a prueba (&) en su macro para un operador de sustitucin. Usted puede garantizar que el ensamblador correctamente reconoce un operador bit a prueba encerrando sus operandos entre parntesis, como se muestra aqu: MACRO prueba de x . SI ax == y X; Y x sustituido con valor de parmetro mov ax, 10 . ELSEIF hacha y (x); Y es AND bit a bit mov ax, 20 . ENDIF ENDM Las reglas para el uso del operador de sustitucin han cambiado significativamente desde MASM 5.1, por lo que el comportamiento macro ms consistente y flexible. Si usted tiene macros escritas para MASM 5.1 o una versin anterior, puede especificar el antiguo comportamiento utilizando OLDMACROS o M510 con la directiva OPCIN (ver pgina 24). Definicin de Bloques Repita con las Directivas de bucle Un "bloque de repeticin" es una macro sin nombre definido con una directiva de bucle. El bucle Directiva genera las instrucciones dentro del bloque de la repeticin de un nmero determinado de veces o hasta una determinada condicin sea verdadera. MASM proporciona varias directivas de asa, que permiten especificar el nmero de iteraciones del bucle de diferentes maneras. Algunas directivas de asa tambin pueden aceptar los argumentos para cada iteracin. Aunque por lo general se especifica el nmero de iteraciones en el
directiva, puede utilizar la directiva EXITM para salir del lazo anticipadamente. Nombre del archivo: LMAPGC09.DOC Pro yecto: Plantilla: MSGRIDA1.DOT Autor: rick Debroux Guardado por: Ruth L Silverio Revisin #: 86 Pgina: 239 de 15 Impreso: 10/02/00 16:22
Pgina 16 240 Gua del programador Repita los bloques se pueden usar macros fuera, pero con frecuencia aparecen en el interior definiciones de macros para realizar alguna operacin repetida en la macro. Desde repeticin bloques son propios macros, terminan con la directiva ENDM. Nombre del archivo: LMAPGC09.DOC Pro yecto: Plantilla: MSGRIDA1.DOT Autor: rick Debroux Guardado por: Ruth L Silverio Revisin #: 86 Pgina: 240 de 16 Impreso: 10/02/00 16:22
Pgina 17 Captulo 9 Uso de macros
241 En esta seccin se explican los siguientes cuatro directivas loop: REPEAT, WHILE, FOR, y FORC. En las versiones de MASM anteriores a 6.0, REPEAT fue llamado REPETIR PARA fue llamado PIR, y FORC fue llamado IRPC. MASM 6.1 reconoce los nombres antiguos. El ensamblador evala bloques de repeticin en slo el primer pase. Usted debe por lo tanto, evitar el uso de luces de direcciones como contadores de bucles, como en este ejemplo: REPEAT (OFFSET label1 - label2 OFFSET); No hagas esto! Dado que la distancia entre dos etiquetas puede cambiar en el montaje subsiguiente que pasa como el ensamblador optimiza el cdigo, usted no debe suponer que la direccin luces permanecen constantes entre las pasadas. Nota REPEAT y directivas Aunque no se deben confundir con el REPEAT y directivas while (vase "directivas Loop-Generacin" en el Captulo 7), lo que generar instrucciones del bucle y salte para el control del programa en tiempo de ejecucin. Loops REPEAT REPEAT es la directiva de bucle simple. En l se especifica el nmero de veces que generar las sentencias dentro de la macro. La sintaxis es: Constexpr REPEAT declaraciones ENDM El constexpr puede ser una constante o una expresin constante, y no debe contener reenviar referencias. Desde el bloque de repeticin se expande en el tiempo de montaje, el nmero de iteraciones debe ser conocida a continuacin. He aqu un ejemplo de un bloque de repeticin utilizada para generar datos. Se inicializa una matriz contiene valores ASCII secuenciales para todas las letras maysculas.
alfa ETIQUETA BYTE ; Nombra los datos generados letter = 'A' ; Inicializar contador REPEAT 26 ;; Repita el procedimiento para cada letra BYTE carta ;; Asignar cdigo ASCII para la letra carta = Carta + 1 ;; Incrementar contador ENDM Nombre del archivo: LMAPGC09.DOC Pro yecto: Plantilla: MSGRIDA1.DOT Autor: rick Debroux Guardado por: Ruth L Silverio Revisin #: 86 Pgina: 241 de 17 de Impreso: 10/02/00 16:22
Pgina 18 242 Gua del programador Aqu hay otro uso de REPEAT, esta vez dentro de una macro:
pitido iter MACRO: = <3> mov ah, 2 ;; Funcin de salida de caracteres dl mov, 7 ;; Personaje de Bell Iter REPEAT ;; Repetir el numero especificado por macro int 21h ;; Llama al DOS ENDM ENDM MIENTRAS Loops La directiva MIENTRAS es similar a la repeticin, pero el bucle contina mientras un condicin dada es cierta. La sintaxis es: Mientras que la expresin declaraciones ENDM La expresin debe ser un valor que se puede calcular en tiempo de montaje. Normalmente, la expresin utiliza operadores relacionales, pero puede ser cualquier expresin que evala a cero (false) o distinto de cero (verdadero). Por lo general, la condicin cambia durante la evaluacin de la macro para que el bucle no intentar generar una infinita cantidad de cdigo. Sin embargo, usted puede utilizar la directiva EXITM romper fuera del bucle. El siguiente bloque de repeticin se utiliza la directiva MIENTRAS asignar las variables inicializado a valores calculados. Esta es una tcnica comn para generar las operaciones de bsqueda mesas. (Una tabla de consulta es cualquier lista de resultados precalculados, como una tabla
de pago de intereses o valores trigonomtricos o logaritmos. Programas optimizados para la velocidad a menudo utilizan las tablas de bsqueda, ya que el clculo de un valor a menudo toma ms tiempo de mirar hacia arriba en una tabla.) BYTE cubos ETIQUETA;; Nombra los datos generados root = 1 ;; Inicialice raz cube = root * root * raz;; Calcular primer cubo MIENTRAS cubo LE 32767;; Repita hasta que el resultado es demasiado grande Cubo PALABRA ;; Asignar cubo raz = Root + 1 ;; Calcular el prximo raz y el cubo cubo = Root * root * root ENDM Nombre del archivo: LMAPGC09.DOC Pro yecto: Plantilla: MSGRIDA1.DOT Autor: rick Debroux Guardado por: Ruth L Silverio Revisin #: 86 Pgina: 242 de 18 Impreso: 10/02/00 16:22
Pgina 19
Captulo 9 Uso de macros 243 PARA Loops y parmetros de longitud variable Con la directiva para que pueda recorrer una lista de argumentos, trabajando en cada uno de ellos a su vez. Tiene la siguiente sintaxis: PARA parmetro, <argumentlist> declaraciones ENDM El parmetro es un marcador de posicin que representa el nombre de cada argumento en el interior el bloque FOR. La lista de argumentos debe contener argumentos separados por comas y siempre deben ir entre parntesis angulares. He aqu un ejemplo de un bloque PARA: serie ETIQUETA BYTE PARA Arg, <1,2,3,4,5,6,7,8,9,10> DUP arg BYTE (arg) ENDM En la primera iteracin, la arg parmetro se reemplaza con el primer argumento, la valor 1. En la segunda iteracin, arg se sustituye con 2. El resultado es una matriz con el primer byte inicializado a 1, los prximos 2 bytes inicializados a 2, el prximo 3 bytes inicializa a 3, y as sucesivamente. La lista de argumentos se da especficamente en este ejemplo, pero en algunos casos la lista debe ser generada como una macro de texto. El valor de la macro de texto debe incluir el
corchetes angulares. arglist TEXTEQU <<3,6,9 >> ; Generar lista como texto macro % PARA arg, arglist . ; Haga algo para arg . . ENDM Observe el uso del operador de carcter literal ( ! ) para identificar corchetes angulares como caracteres, no delimitadores. Consulte "delimitadores de texto (<>) y el Literal-Character Operador ", anteriormente en este captulo. El POR directiva tambin proporciona una manera conveniente para procesar macros con una nmero variable de argumentos. Para ello, agregue vararg para el ltimo parmetro para indicar que un parmetro denominado nica tendr el valor real de todos argumentos adicionales. Por ejemplo, la siguiente definicin de la macro incluye la los atributos requeridos por tres parmetros es posible, por defecto y variable. Rarg MACRO trabajo: REQ, darg: = <5>, Varg: vararg Nombre del archivo: LMAPGC09.DOC Pro yecto: Plantilla: MSGRIDA1.DOT Autor: rick Debroux Guardado por: Ruth L Silverio Revisin #: 86 Pgina: 243 de 19 de Impreso: 10/02/00 16:22
Pgina 20 244 Gua del programador El argumento de la variable siempre debe ser el ltimo. Si esta macro se llama con el declaracin trabajar 4, 6, 7, a, b el primer argumento es recibido como el valor 4, el segundo se sustituye por el valor predeterminado 5, y los cuatro ltimos se reciben como argumento nico <6, 7, a, b> . Este es el mismo formato esperado por el PARA Directiva. El POR directiva descartes espacios iniciales pero reconoce los espacios finales. La macro siguiente ilustra argumentos variables: mostrar chr MACRO: vararg mov ah, 02h PARA arg, <chr> mov dl, arg int 21h ENDM ENDM Cuando se llama con mostrar 'O', 'K', 13, 10 la macro muestra cada uno de los caracteres especificados de una en una. El parmetro de una PARA bucle puede tener el atributo requerido o por defecto. Usted puede modificar el
show macro para argumentar en blanco generan errores: mostrar chr MACRO: vararg mov ah, 02h PARA arg: REQ, <chr> mov dl, arg int 21h ENDM ENDM La macro ahora genera un error si se llama con mostrar 'O', 'K', 13, 10 Nombre del archivo: LMAPGC09.DOC Pro yecto: Plantilla: MSGRIDA1.DOT Autor: rick Debroux Guardado por: Ruth L Silverio
Otro enfoque sera utilizar un argumento por defecto: mostrar chr MACRO: vararg mov ah, 02h PARA arg: = <''>, <chr> mov dl, arg int 21h ENDM ENDM Ahora llamar a la macro con mostrar 'O', 'K', 13, 10 inserta el carcter predeterminado, un espacio, para el argumento en blanco. FORC Loops El FORC directiva es similar a PARA, pero toma una cadena de texto en lugar de un lista de argumentos. Las declaraciones se montan una vez para cada carcter (Incluyendo espacios) en la cadena, la sustitucin de un carcter diferente para el parmetro cada vez a travs. La sintaxis es la siguiente: FORC parmetro , < texto > declaraciones ENDM El texto debe ir entre parntesis angulares. El siguiente ejemplo ilustra FORC : FORC arg, <ABCDEFGHIJKLMNOPQRSTUVWXYZ> BYTE '& arg';; Asignar letra mayscula BYTE '& arg' + 20h;; Asignar letra minscula
BYTE '& arg' - 40h;; Asignar ordinal de la carta ENDM Observe que el operador de sustitucin debe ser utilizado dentro de las comillas para asegurar que arg se expande a un personaje en lugar de tratarse como un literal cadena. Con versiones de MASM anteriores a la 6.0, FORC se utiliza a menudo para complejo anlisis de tareas. Una frase larga puede ser examinado carcter por carcter. Cada carcter es entonces o bien desecha o pega en un token de cadena, dependiendo de si se trata de un carcter separador. Las nuevas funciones de macro predefinidas y directivas de procesamiento de series que se tratan en la siguiente seccin son generalmente ms eficiente para estas tareas. Nombre del archivo: LMAPGC09.DOC Pro yecto: Plantilla: MSGRIDA1.DOT Autor: rick Debroux Guardado por: Ruth L Silverio Revisin #: 86 Pgina: 245 de 21 de Impreso: 10/02/00 16:22
Pgina 23 246 Gua del programador Directivas de Cuerda y funciones predefinidas
El ensamblador proporciona cuatro directivas para la manipulacin de texto: Directiva Descripcin SUBSTR Asigna parte de cadena en un nuevo smbolo. INSTR Las bsquedas de una cadena dentro de otra. SIZESTR Determina el tamao de una cadena. CATSTR Concatena una o ms cadenas de una sola cadena. Estas directivas asignan un valor a un tratamiento que una macro de texto o equate numrico. Para ejemplo, las siguientes lneas num = 7 newstr CATSTR <3 +>,% num, <=>,% 3 + num; "3 + 7 = 10" asignar la cadena "3 + 7 = 10" a newstr . CATSTR y SUBSTR asignacin texto de la misma forma que el TEXTEQU Directiva. SIZESTR y INSTR asignacin un nmero en la misma forma que el = operador. Las cuatro directivas de cuerda toman slo texto valora como argumentos. Utilice el operador de expansin ( % ) cuando se necesita asegurarse de que las constantes y equipara numricos se expanden para texto, como se muestra en la precedente lneas.
Cada una de las directivas de cuerda tiene una funcin macro predefinida correspondiente Versin: @ substr , InStr @ , @ SizeSt r Y @ CatSt r . funciones de macro son similar a las directivas de la secuencia, pero usted debe escribir sus argumentos en parntesis. Funciones de macro devuelven valores de texto y pueden aparecer en cualquier contexto donde se espera que el texto. En la siguiente seccin, "Devolver valores con Macro Funciones ", dice cmo escribir sus propias funciones de macro. La siguiente ejemplo es equivalente a la anterior CATSTR ejemplo: num = 7 newstr TEXTEQU @ CatStr (<3 +>,% num, <=>,% 3 + num) Funciones de macro son a menudo ms conveniente que sus contrapartes directiva porque se puede utilizar una funcin de macro como argumento para una directiva de cadena o de otra funcin macro. Directivas de cuerda A diferencia, la funcin macro predefinida nombres distinguen entre maysculas y minsculas cuando se utiliza la opcin de lnea de comandos / Cp. Cada directiva de cadena y funcin predefinida acta sobre una cadena, que puede ser cualquier elemento_texto . El elemento_texto puede ser texto entre corchetes angulares (<>), el nombre de una macro de texto o una expresin constante precedida por % (como en % constexpr ). Consulte el Apndice B, "gramtica de BNF," para obtener una lista de tipos que elemento_texto pueden representar. Nombre del archivo: LMAPGC09.DOC Pro yecto: Plantilla: MSGRIDA1.DOT Autor: rick Debroux
Guardado por: Ruth L Silverio Revisin #: 86 Pgina: 246 de 22 de Impreso: 10/02/00 16:22
Pgina 24 Captulo 9 Uso de macros 247 Las siguientes secciones resumen la sintaxis para cada una de las directivas de cuerda y funciones. Las explicaciones se centran en las directivas, pero las funciones de trabajo el mismo, excepto donde se indique. SUBSTR nombrar SUBSTR cadena , iniciar [[, longitud]] @ Substr ( cadena , iniciar [[, longitud ]]) El SUBSTR Directiva asigna una subcadena de una determinada cadena en el smbolo nombrar . El inicio parmetro especifica la posicin en la cadena , empezando por 1, para comenzar la subcadena. La longitud proporciona la longitud de la subcadena. Si no lo hace especificar la longitud , SUBSTR devuelve el resto de la cadena, incluyendo el inicio carcter. INSTR nombrar INSTR [[ inicio ,]] string , substring @ InStr ( [[ empezar ]], cadena , subcadena ) El INSTR directiva busca un determinado cadena para una aparicin de subcadena y le asigna su nmero de posicin para el nombre . La bsqueda distingue entre maysculas y minsculas. El comienzo parmetro es la posicin en la cadena para iniciar la bsqueda de subcadena . Si no lo hace especificar inicio , que se supone que es la posicin 1, el principio de la cadena. Si INSTR
no encuentra subcadena , asigna la posicin 0 a nombre . El INSTR Directiva asigna el valor de posicin de nombre como si fuera un valor numrico equiparar. En contraste, el @ InStr devuelve el valor como una cadena de dgitos en el radix actual. El @ InStr funcin tiene una sintaxis ligeramente diferente que el INSTR Directiva. Se puede omitir el primer argumento y su coma asociado de la Directiva. Puede dejar el primer argumento en blanco con la funcin, sino una funcin en blanco argumento todava debe tener una coma. Por ejemplo, pos INSTR <person>, <son> es el mismo que pos = @ InStr (, <person>, <son>) Tambin puede asignar el valor de retorno de una macro de texto, as: Nombre del archivo: LMAPGC09.DOC Pro yecto: Plantilla: MSGRIDA1.DOT Autor: rick Debroux Guardado por: Ruth L Silverio Revisin #: 86 Pgina: 247 de 23 de Impreso: 10/02/00 16:22
@ SizeSt r ( cadena ) El SIZESTR Directiva asigna el nmero de caracteres en la cadena de nombre . Un cadena vaca devuelve una longitud de cero. El SIZESTR Directiva asigna el tamao valor a un nombre como si se tratara de un EQUATE numrico. Los @ SizeStr funcin devuelve el valor como una cadena de dgitos de la raz actual. CATSTR nombrar CATSTR string [, string ] ... @ CatStr ( string [, string ] ... ) El CATSTR Directiva concatena una lista de valores de texto en un solo valor de texto y lo asigna al nombre . TEXTEQU es tcnicamente un sinnimo de CATSTR . TEXTEQU se utiliza normalmente para las tareas de una sola cuerda, mientras CATSTR es utilizado para multistring concatenaciones. El siguiente ejemplo se empuja y aparece un conjunto de registros, que ilustran varios usos de las directivas y funciones de cadena: Nombre del archivo: LMAPGC09.DOC Pro yecto: Plantilla: MSGRIDA1.DOT Autor: rick Debroux Guardado por: Ruth L Silverio Revisin #: 86 Pgina: 248 de 24 Impreso: 10/02/00 16:22
Pgina 26 Captulo 9 Uso de macros 249 ; SaveRegs - Macro para generar una instruccin de insercin para cada
; inscribirse en la lista de argumentos. Guarda cada nombre de registro en el ; macro texto regpushed. regpushed TEXTEQU <> ;; Inicializar cadena vaca SaveRegs regs MACRO: vararg Reg LOCAL PARA reg, <regs> ;; Empuje cada registro empuje reg ;; y aadirlo a la lista regpushed CATSTR <reg>, <,>, regpushed ENDM ;; Pele ltima coma CATSTR regpushed <<>, regpushed!;; Marcar comienzo de la lista con < regpushed SUBSTR regpushed, 1, @ SizeStr (regpushed) CATSTR regpushed regpushed, <! >>;; Marque el extremo con> ENDM ; RestoreRegs - Macro para generar una instruccin pop para los registros ; salvado por la macro SaveRegs. Restaura un grupo de registros. RestoreRegs MACRO Reg LOCAL % PARA reg, regpushed ;; Pop cada registro pop reg ENDM ENDM Observe cmo la
SaveRegs macro guarda su resultado en la regpushed texto macro para su uso posterior por el RestoreRegs macro. En este caso, una macro de texto se utiliza como un variable global. Por el contrario, la reg texto de la macro se utiliza slo en RestoreRegs . Se declara LOCAL por lo que no tendr el nombre reg Del nombre global espacio. El archivo MACROS.INC proporcionado con MASM 6.1 incluye la ampliacin versiones de estos mismos dos macros. Devolver valores con funciones de macro Una funcin macro es un grupo con nombre de declaraciones que devuelve un valor. Cundo llamar a una funcin macro, debe incluir la lista de parmetros entre parntesis, incluso si la lista est vaca. La funcin siempre devuelve el texto. MASM 6.1 ofrece varias funciones de macro predefinidos para las tareas comunes. La macros predefinidas incluyen @ Environ (ver pgina 10) y las funciones de cadena @ SizeStr , @ CatSt r , @ substr , y @ InStr (discutido en el prrafo anterior seccin). Se definen las funciones de macro exactamente de la misma manera que los procedimientos de macro,
excepto que una funcin de macro siempre devuelve un valor a travs de la EXITM Directiva. He aqu un ejemplo: Nombre del archivo: LMAPGC09.DOC Pro yecto: Plantilla: MSGRIDA1.DOT Autor: rick Debroux Guardado por: Ruth L Silverio Revisin #: 86 Pgina: 249 de 25 Impreso: 10/02/00 16:22
Pgina 27 250 Gua del programador Smbolo macro definida: REQ Smbolo IFDEF EXITM <-1> ;; Verdadero ELSE ENDM EXITM <0> ;; Falso ENDIF Esta macro funciona como el definido operador en el lenguaje C. Usted puede utilizarlo para probar el estado definido de varios smbolos diferentes con una sola instruccin, como se muestra aqu: SI SE DEFINE (DOS) y no se definen (XENIX)
;; Haga algo ENDIF Observe que la macro devuelve valores enteros como cadenas de dgitos, pero el SI declaracin evala valores o expresiones numricas. No hay conflicto, porque el ensamblador ve el valor devuelto por la funcin macro exactamente como si el usuario haba introducido los valores directamente en el programa: SI Y NO -1 0 Devolver valores con EXITM El valor de retorno tiene que ser un texto, un texto equivale nombre, o el resultado de otra funcin macro. Una funcin macro debe convertir primero un valor numrico como tales una constante, un valor numrico equivale, o el resultado de una expresin-antes numrico devolverlo. La funcin macro puede utilizar las escuadras o la expansin operador ( % ) para convertir los nmeros a texto. La DEFINIDO macro, por ejemplo, podra haber regresado de su valor como EXITM% -1 He aqu otro ejemplo de una funcin de macro que utiliza el MIENTRAS directiva para calcular los factoriales: Nombre del archivo: LMAPGC09.DOC Pro yecto: Plantilla: MSGRIDA1.DOT Autor: rick Debroux Guardado por: Ruth L Silverio Revisin #: 86 Pgina: 250 de 26 de Impreso: 10/02/00 16:22
Pgina 28 Captulo 9 Uso de macros 251 factorial Num MACRO: REQ LOCAL i, el factor = factor num i = 1 Mientras que el factor GT 1 i = i * factor de Factor = Factor - 1 ENDM EXITM% i ENDM El resultado entero del clculo se cambia a una cadena de texto con la expansin operador ( % ). La factorial macro puede definir los datos, como se muestra aqu: var WORD factorial (4) Esta sentencia inicializa var con el nmero 24 (el factorial de 4). Uso de las funciones de macro con listas de parmetros de longitud variable Usted puede utilizar el PARA directiva para manejar parmetros de la macro con la vararg atribuir. "PARA Loops y parmetros de longitud variable" en la pgina 242, explica
cmo hacer esto en casos simples donde los parmetros de las variables que se manipulan secuencialmente, de principio a fin. Sin embargo, a veces puede que tenga que procesar los parmetros en orden inverso o de forma no secuencial. Funciones de macro hacen estos tcnicas posibles. Por ejemplo, la siguiente funcin macro determina el nmero de argumentos en un vararg parmetro: @ ArgCount arglist MACRO: vararg Recuento LOCAL count = 0 PARA arg, <arglist> count = count + 1;; Cuente los argumentos ENDM ENDM EXITM% count Nombre del archivo: LMAPGC09.DOC Pro yecto: Plantilla: MSGRIDA1.DOT Autor: rick Debroux Guardado por: Ruth L Silverio Revisin #: 86 Pgina: 251 de 27 de Impreso: 10/02/00 16:22
Pgina 29 252 Gua del programador Usted puede usar
@ ArgCoun t dentro de una macro que tiene un vararg parmetro, como se muestra aqu: trabajar args MACRO: vararg ECHO% Nmero de argumentos es: @ ArgCount (args) ENDM Otra tarea til podra ser la de seleccionar un elemento de una lista de argumentos utilizando un ndice para indicar el artculo. La siguiente macro simplifica esto. @ Arg I ndice MACRO: REQ, arglist: vararg Recuento LOCAL, RetStr RetStr TEXTEQU <> ;; Inicialice conteo count = 0 ;; Inicializar cadena devuelta PARA arg, <arglist> count = count + 1 Si el ndice EQ conteo;; Artculo se encuentra RetStr TEXTEQU <arg>;; Establecer cadena devuelta EXITM ;; y salida IF ENDIF ENDM ENDM EXITM RetStr ;; Salir de la funcin Usted puede usar
@ Arg I de esta manera: trabajar args MACRO: vararg % ECHO tercer argumento es: @ ArgI (3, args) ENDM Por ltimo, es posible que tenga que procesar argumentos en orden inverso. La siguiente macro devuelve una nueva lista de argumentos en el orden inverso. @ ArgRe v MACRO arglist: REQ Txt LOCAL, arg txt TEXTEQU <> % PARA arg, <arglist> txt CATSTR <arg>, <,>, txt;; Pegue cada en la lista ENDM ;; Retire la terminacin comas ENDM txt SUBSTR txt, 1, @ SizeStr (% txt) - 1 txt CATSTR <<>, txt, <>> ;; Aadir parntesis angulares EXITM txt Nombre del archivo: LMAPGC09.DOC Pro yecto: Plantilla: MSGRIDA1.DOT Autor: rick Debroux Guardado por: Ruth L Silverio
Pgina 30 Revisin #: 86 Pgina: 252 de 28 de
Impreso: 10/02/00 16:22
Pgina 31 Captulo 9 Uso de macros 253 He aqu un ejemplo que muestra @ ArgRe v en uso: trabajar args MACRO: vararg % PARA arg, @ ArgRev (<args>);; Proceso en el orden inverso ECHO arg ENDM ENDM Estas tres funciones de macro aparecen en el MACROS.INC archivo de inclusin, que se encuentra en uno de los discos de distribucin MASM. Operador de Expansin de Funciones de Macro Esta lista se resume el comportamiento del operador de expansin ( % ) con macro funciones.
Si una funcin de macro est precedido por un % , que se ampliar. Sin embargo, si se se expande a una macro de texto o una llamada a una funcin macro, no se ampliar an ms.
Si utiliza una llamada a una funcin macro como argumento para otra funcin macro llamar, un % no es necesario.
Si una funcin macro es llamada dentro de parntesis angulares y est precedida por % , se
se ampliar. Tcnicas Avanzadas Macro El concepto de sustitucin de nombres de macro con el texto macro predefinida es simple en teora, pero tiene muchas implicaciones y complicaciones. Aqu est un breve resumen de algunas tcnicas avanzadas que puede utilizar en macros. Definicin de macros dentro de Macros Las macros se pueden definir otras macros, una tcnica llamada "macros de anidacin." MASM expande las macros, ya que se encuentra con ellas, por lo que las macros anidadas siempre se procesan con el fin de anidacin. No se puede hacer referencia a una macro anidada directamente en su programa, ya que el ensamblador comienza la expansin de la macro exterior. En efecto, un anidado macro es local a la macro que lo define. Slo la cantidad de memoria disponible limita el nmero de macros de un programa pueden anidar. Nombre del archivo: LMAPGC09.DOC Pro yecto: Plantilla: MSGRIDA1.DOT Autor: rick Debroux Guardado por: Ruth L Silverio Revisin #: 86 Pgina: 253 de 29 de Impreso: 10/02/00 16:22
Pgina 32 254 Gua del programador El siguiente ejemplo muestra cmo una macro puede definir otro. La
macro toma como argumento el nombre de un turno o de operacin de rotacin, a continuacin, crea otra macro que simplifica la instruccin para 8088/86 procesadores. desplaza opname MACRO ;; Macro genera macros opname & s Operando MACRO: REQ, gira: = <1> SI LE gira 2 ;; Uno a la vez es ms rpido REPEAT girar;; para 2 o menos operando opname, 1 ENDM ENDM ENDM ELSE ;; Uso de CL es ms rpido para mov Cl, gira;; ms de 2 operando opname, cl ENDIF Recordemos que el procesador 8086 slo permite 1 o CL como operando de turno y girar instrucciones. En expansin turnos genera una macro para el turno instruccin que utiliza cualquiera de los operandos es ms eficiente. Se crea la totalidad serie de macros, uno para cada operacin de desplazamiento, as: ; Llame macro varias veces para hacer nuevas macros
turnos ror ; Genera Rors turnos rol ; Genera rols turnos shr ; Genera SHRs turnos SHL ; Genera SHL turnos RCL ; Genera RCLS turnos rcr ; Genera RCRS turnos sal ; Genera sals turnos sar ; Genera sars A continuacin, utilice las nuevas macros para reemplazar las instrucciones de desplazamiento, as: SHR hacha, 5
rols bx, 3 Las pruebas para detectar Argument Type y Medio Ambiente Las macros se pueden ampliar los bloques condicionales de cdigo mediante la comprobacin para el tipo de discusin con la OPATTR operador. OPATTR devuelve una sola palabra constante que indica el tipo y el alcance de una expresin, como este: OPATTR expresin Si la expresin no es vlido o es delantero referencia-, OPATTR devuelve un 0. De lo contrario, el valor de retorno incorpora los indicadores de bits se muestran en la siguiente tabla. Nombre del archivo: LMAPGC09.DOC Pro yecto: Plantilla: MSGRIDA1.DOT Autor: rick Debroux Guardado por: Ruth L Silverio Revisin #: 86 Pgina: 254 de 30 Impreso: 10/02/00 16:22
Pgina 33 Captulo 9 Uso de macros 255 OPATTR sirve como una versin mejorada del TIPO. operador, que devuelve slo el byte bajo (bits 0-7) se muestra en la tabla. Bits 11-15 del valor de retorno no estn definidos. Poco Ajuste Si la expresin 0
Hace referencia a una etiqueta de cdigo de 1 Es una variable de memoria o tiene una etiqueta de datos reubicable 2 Es un valor inmediato 3 Utiliza la memoria de direccionamiento directo 4 Es un valor de registro 5 Las referencias no indefinidos smbolos y es sin error 6 Es en relacin con SS 7 Hace referencia a una etiqueta externa 8 - 10 Tiene los siguientes tipos idioma:
000-No tipo de lenguaje
001-C
010-SYSCALL
011-STDCALL
100-Pascal
101-FORTRAN
110-bsico Una macro puede utilizar OPATTR para determinar si un argumento es una constante, un registro, o un operando de memoria. Con esta informacin, la macro puede condicionalmente generar el cdigo ms eficiente en funcin de tipo de argumento. Por ejemplo, dado un argumento constante, una macro puede probarlo de 0. Dependiendo el valor del argumento, el cdigo puede seleccionar el mtodo ms eficaz para cargar el valorar en un registro: IF CONST mov bx, CONST ; Si CONST> 0, se mueven en BX ELSE sub bx, bx ; Ms eficiente si CONST = 0 ENDIF Nombre del archivo: LMAPGC09.DOC Pro yecto: Plantilla: MSGRIDA1.DOT Autor: rick Debroux Guardado por: Ruth L Silverio
Revisin #: 86 Pgina: 255 de 31 Impreso: 10/02/00 16:22
Pgina 34 256 Gua del programador El segundo mtodo es ms rpido que el primero, sin embargo, tiene el mismo resultado (con la subproducto de cambiar las banderas de procesador). La macro siguiente ilustra algunas de las tcnicas que utilizan OPATTR cargando un frente a un registro de desplazamiento especificada: MACRO carga reg: REQ, adr: REQ IF (OPATTR (adr)) Y 00010000y;; Registrar IFDIFI reg, adr ;; No cargue registro mov reg, adr;; sobre s mismo ENDIF ELSEIF (OPATTR (adr)) Y 00000100y mov reg, adr ;; Constante ELSEIF (TIPO (adr) BYTE EQ) OR (TIPO (adr) SBYTE EQ) mov reg, adr OFFSET;; Bytes ELSEIF (SIZE (TIPO (adr)) EQ 2 mov reg, adr ;; Cerca de puntero
ELSEIF (SIZE (TIPO (adr)) EQ 4 mov reg, WORD PTR adr [0];; Puntero del Lejano mov ds, WORD PTR adr [2] ELSE . ERR <Illegal argument> ENDM ENDIF Una macro tambin puede generar cdigo diferente dependiendo de la asamblea medio ambiente. La macro de texto predefinido @ Cpu devuelve una bandera para procesador escriba. El siguiente ejemplo utiliza la variacin constante ms eficiente de la PUSH instruccin si el procesador es un 80186 o superior. SI @ Cp U y 00000010y pushc op MACRO;; 80.186 o ms alto empujar op ELSE ENDM pushc op MACRO;; 8088/8086 mov ax, op empujar hacha ENDM ENDIF Otra macro puede utilizar ahora pushc en lugar de la prueba condicional para propio tipo de procesador. Aunque cualquiera de los casos produce el mismo cdigo, utilizando pushc
rene ms rpido debido a que el medio ambiente se comprueba una sola vez. Nombre del archivo: LMAPGC09.DOC Pro yecto: Plantilla: MSGRIDA1.DOT Autor: rick Debroux Guardado por: Ruth L Silverio Revisin #: 86 Pgina: 256 de 32 Impreso: 10/02/00 16:22
Pgina 35 Captulo 9 Uso de macros 257 Puede probar el idioma y el sistema operativo utilizando el @ Interface texto macro. El modelo de memoria se puede probar con el modelo @ , @ DataSize , o @ CodeSize macros de texto. Puede guardar los contextos dentro de macros con PUSHCONTEXT y POPCONTEXT . Las opciones para estas palabras clave son: Opcin Descripcin ASUME Guarda registro de segmento informacin RADIX Guarda actual default radix LISTADO Guarda la lista y
CREF informacin CPU Guarda CPU y el procesador actual TODO Todo de lo anterior Uso de macros recursivas Las macros pueden llamarse a s mismos. En MASM 5.1 y versiones anteriores, la recursividad es una tcnica importante para el manejo de argumentos variables. MASM 6.1 mangos argumentos variables mucho ms limpiamente con la PARA Directiva y el Vararg atributo, como se describe en "Bucles FOR y de longitud variable Parmetros ", anteriormente en este captulo. Sin embargo, la recursividad est libre puede ser til para algunas macros.
PROGRAMAS HOLA MUNDO
; include \masm32\include\masm32rt.inc ; comment * -----------------------------------------------------
Build this console app with "MAKEIT.BAT" on the PROJECT menu. ----------------------------------------------------- * .data? value dd ? .data item dd 0 .code start: ; call main inkey exit ; main proc cls print "Hola Mundo",13,10 ret main endp ; end start
SUMATORIA DE NUMEROS DEL 1 AL 20
; include \masm32\include\masm32rt.inc ;
comment * ----------------------------------------------------- Build this console app with "MAKEIT.BAT" on the PROJECT menu. ----------------------------------------------------- *
.data? value dd ?
.data item dd 0 incrementar dd 0 sumar dd 0 .code
start:
;
call main inkey exit
;
main proc
cls print chr$("Programa de ejemplo suma.",10) mov ax,1 xor ecx,ecx;xor=0 ciclo: mov ecx,sumar add ecx,eax inc eax mov incrementar,eax mov sumar,ecx print chr$("incrementando em -->") mov eax,incrementar sub eax,1 print str$(eax) print chr$("la suma es -->") mov ecx,sumar print str$(ecx) print chr$(10) mov eax,incrementar cmp eax,20 jle ciclo print chr$(7,"la suma de los numeros del 1 al 20 es")
comment * ----------------------------------------------------- Build this console app with "MAKEIT.BAT" on the PROJECT menu. ----------------------------------------------------- * .data? value dd ? .data item dd 0 incrementar dd 0
sumar dd 0 .code start: ; call main inkey exit ; main proc cls print chr$("Programa de ejemplo suma.",10) mov ax,2 xor eax,eax;xor consigo mismo siempre el resultado en cero (0) ciclo: mov ecx,sumar inc eax inc eax add ecx,eax mov incrementar,eax mov sumar,ecx print chr$("Incrementado en -> ") mov eax, incrementar print str$(eax) sub eax,1 print chr$(" la suma es -> ") mov ecx,sumar print str$(ecx) print chr$(10) mov eax, incrementar cmp eax,98 jle ciclo ;jle -> salta si es menor o igual o salta si no es mas grande print chr$(7,"La suma de los numeros del 1 al 100 es ") mov ecx, sumar print str$(ecx) print chr$(7,10) print chr$(7,10) inkey exit ret main endp ; end start
SUMATORIA DE TODOS LOS NUMEROS DEL 1 AL 100
; include \masm32\include\masm32rt.inc ; comment * ----------------------------------------------------- Build this console app with "MAKEIT.BAT" on the PROJECT menu. ----------------------------------------------------- * .data? value dd ? .data item dd 0 incrementar dd 0 sumar dd 0 .code start: ; call main inkey exit ; main proc cls print chr$("Programa de ejemplo suma.",10) mov ax,1 xor ecx, ecx ;xor consigo mismo siempre el resultado en cero (0) ciclo: mov ecx,sumar
add ecx,eax inc eax mov incrementar,eax mov sumar,ecx print chr$("Incrementado en -> ") mov eax, incrementar sub eax,1 print str$(eax) print chr$(" la suma es -> ") mov ecx,sumar print str$(ecx) print chr$(10) mov eax, incrementar cmp eax,100 jle ciclo ;jle -> salta si es menor o igual o salta si no es mas grande print chr$(7,"La suma de los numeros del 1 al 100 es ") mov ecx, sumar print str$(ecx) print chr$(7,10) print chr$(7,10) inkey exit ret main endp ; end start
MULTIPLICACION DE 4 NUMEROS
; include \masm32\include\masm32rt.inc ;
comment * ----------------------------------------------------- Build this console app with "MAKEIT.BAT" on the PROJECT menu. ----------------------------------------------------- *
; include \masm32\include\masm32rt.inc ; comment * ----------------------------------------------------- Build this console app with "MAKEIT.BAT" on the PROJECT menu. ----------------------------------------------------- * .data? value dd ? num1 dd ? num2 dd ? num3 dd ? num4 dd ? .data item dd 0 sum dd 0 prod dd 0 prod2 dd 0 aux dd 0 .code start: ;
call main inkey exit
;
main proc
cls mov EAX,sval(input("Teclea el primer numero: ")) mov num1,EAX mov EAX,sval(input("teclea el segundo numero: ")) mov num2,EAX mov EAX,sval(input("Teclea el tercer numero: ")) mov num3,EAX mov EAX,sval(input("teclea el cuarto numero: ")) mov num4,EAX
comment * ----------------------------------------------------- Build this console app with "MAKEIT.BAT" on the PROJECT menu. ----------------------------------------------------- * .data? value dd ? rango dd ? .data item dd 0 .code start:
; call main inkey exit ; main proc cls mov EAX,sval(input("Teclea RANGO: ")) mov rango,EAX
.if eax>=1 && eax<=10
print chr$("Rango entre 1 y 10",10) .elseif eax>=11 && eax<=27 print chr$("Rango entre 11 y 27",10) .elseif eax>=28 && eax<=36 print chr$("Rango entre 28 y 36",10) .else print chr$("FUERA DE RANGO",10) .endif
ret
main endp
;
end start LEE UN NUMERO Y LO CLASIFICA DE ACUERDO A CALIFICACION
; include \masm32\include\masm32rt.inc ; comment * ----------------------------------------------------- Build this console app with "MAKEIT.BAT" on the PROJECT menu. ----------------------------------------------------- * .data? value dd ? .data item dd 0
.code start: ; call main inkey exit
;
main proc
cls mov EAX,sval(input("Teclea la calificacion: "))
; include \masm32\include\masm32rt.inc ; comment * ----------------------------------------------------- Build this console app with "MAKEIT.BAT" on the PROJECT menu. ----------------------------------------------------- * .data? value dd ? num1 dd ? num2 dd ? num3 dd ? num4 dd ? .data item dd 0 sum dd 0 prod dd 0 prod2 dd 0 aux dd 0 .code start: ; call main inkey exit ; main proc
cls mov num1,sval(input("Teclea el primer numero: ")) mov num2,sval(input("teclea el segundo numero: ")) mov num3,sval(input("Teclea el tercer numero: ")) mov num4,sval(input("teclea el cuarto numero: ")) ;SUMA add EAX,num1 add EAX,num2 add EDX,num3 add EAX,num4 mov sum,EAX ;imprima suma print chr$(7,"la suma es: ") print str$(sum) print chr$(10) ;DIVISION xor EDX,EDX mov EAX,sum mov EBX,4 div EBX
mov prod,EAX print chr$(7,"la promedio es: ") print str$(prod) print chr$(10) ret main endp ; end start
PROGRAMA QUE LEE NOMBRE Y CALIFICACIONES Y DETERMINA PROMEDIO
; include \masm32\include\masm32rt.inc ; comment * ----------------------------------------------------- Build this console app with "MAKEIT.BAT" on the PROJECT menu. ----------------------------------------------------- * .data? value dd ? nombre dd ? num1 dd ? num2 dd ? num3 dd ? num4 dd ? num5 dd ? .data item dd 0 prod dd 0 .code start: ; call main inkey exit ; main proc cls
COMMENT JOSE MANUEL CALLEJA ZAMORA mov nombre,sval(input("Ingrese el nombre del alumno: ")) mov num1,sval(input("Teclea calificacion 1: ")) mov num2,sval(input("teclea calificacion 2: ")) mov num3,sval(input("Teclea calificacion 3: ")) mov num4,sval(input("teclea calificacion 4: ")) mov num5,sval(input("teclea calificacion 5: ")) ;SUMA Xor EAX,EAX add EAX,num1 add EAX,num2 add EAX,num3 add EAX,num4 add EAX,num5 ;DIVISION PARA PROMEDIO xor EDX,EDX mov EBX,5 div EBX
mov prod,EAX print chr$(7,"El promedio es: ") print str$(prod) print chr$(10) ;COMPARACION mov EDX,num1 .if EDX>prod print chr$("La calificacion 1 es mayor al promedio",10) .endif mov EDX,num2 .if EDX>prod print chr$("La calificacion 2 es mayor al promedio",10) .endif mov EDX,num3 .if EDX>prod print chr$("La calificacion 3 es mayor al promedio",10) .endif mov EDX,num4 .if EDX>prod print chr$("La calificacion 4 es mayor al promedio",10) .endif mov EDX,num5 .if EDX>prod print chr$("La calificacion 5 es mayor al promedio",10) .endif
ret
main endp ; end start
RECIBE UN NUMERO Y TE DICE SI ES MULTIPLO DE 2 O NO
; include \masm32\include\masm32rt.inc ; comment * ----------------------------------------------------- Build this console app with "MAKEIT.BAT" on the PROJECT menu. ----------------------------------------------------- * .data? value dd ? num dd ? .data item dd 0 .code start: ; call main inkey exit ; main proc cls
COMMENT JOSE MANUEL CALLEJA ZAMORA mov num,sval(input("Teclea numero: ")) ;DIVISION ENTRE DOS xor EDX,EDX mov EAX,num mov EBX,2 div EBX ;COMPARACION DEL RESIDUO EDX .if EDX==0 print chr$("El numero SI es multiplo de 2",10) .else print chr$("El numero NO es multiplo de 2",10) .endif ret main endp ; end start
CALCULA EL AREA DE UN TRIANGULO
; include \masm32\include\masm32rt.inc ; comment * ----------------------------------------------------- Build this console app with "MAKEIT.BAT" on the PROJECT menu. ----------------------------------------------------- * .data? value dd ?
num1 dd ? num2 dd ? .data item dd 0 area dd 0 .code start: ; call main inkey exit ; main proc cls mov num1,sval(input("Introducir Base: ")) mov num2,sval(input("Introducir Altura: ")) xor EAX,EAX ;multiplicacion mov EAX,num1 mov EBX,num2 mul EBX ;division xor EDX,EDX mov EBX,2 div EBX mov area,EAX print chr$(7,"El area es: ") print str$(area) print chr$(10) ret main endp ;
end start
MENU: SUMA, RESTA, MULTIPLICACION Y DIVISION
; include \masm32\include\masm32rt.inc ; comment * ----------------------------------------------------- Build this console app with "MAKEIT.BAT" on the PROJECT menu. ----------------------------------------------------- *
; include \masm32\include\masm32rt.inc ; comment * ----------------------------------------------------- Build this console app with "MAKEIT.BAT" on the PROJECT menu. ----------------------------------------------------- * .data? value dd ? numero dd ? .data item dd 0 sali dd 0 impre dd 0 .code start: ; call main inkey exit ; main proc cls mov numero,sval(input("introduzca el numero N: "))
; include \masm32\include\masm32rt.inc ; comment * ----------------------------------------------------- Build this console app with "MAKEIT.BAT" on the PROJECT menu. ----------------------------------------------------- * .data? numero dd ? .data cero dd 0 uno dd 1 dos dd 2 .code start: ; call main inkey exit ; main proc
cls print chr$("VERIFICADOR DE NUMEROS PRIMOS") print chr$(10) print chr$(10) mov eax, sval(input("Introduzca el numero a evaluar: "))
mov numero, eax
cmp eax,cero je neutro
cmp eax,uno je primo
cmp eax,dos je primo
mov ebx, dos
ciclo: mov eax,numero xor edx,edx div ebx inc ebx test edx,edx je noprimo cmp numero,ebx je primo jl ciclo neutro: print chr$("El cero es numero neutro") print chr$(10) ret
noprimo: print chr$("El numero ") print str$(numero) print chr$(" no es primo") print chr$(10) ret primo: print chr$("El numero ") print str$(numero) print chr$(" si es primo") print chr$(10) ret main endp ; end start
PUBLIC _AbsoluteRead PROC NEAR ARG Buffer:DWORD,Start:WORD,NumSelect:WORD,Drive:BYTE=ArgLen push bp ;salvar BP mov bp,sp ;permitir acceso a los argumentos push bx ;salvar registros push cx push dx push ds
mov al,Drive ;lectura absoluta de disco mov cx,NumeSelect mov dx,Start lds bx,Buffer
int 25h pop bx
pop ds ;recuperar registros pop dx pop cx pop bx pop bp ret ArgLen ENDP APROBADO O REPROBADO
; include \masm32\include\masm32rt.inc ;
comment * ----------------------------------------------------- Build this console app with "MAKEIT.BAT" on the PROJECT menu. ----------------------------------------------------- *
comment * ----------------------------------------------------- Build this console app with "MAKEIT.BAT" on the PROJECT menu. ----------------------------------------------------- *
.data? num dd ?
.data resul dd 0 cont dd 0 suma dd 0
.code
start:
;
call main inkey exit
;
main proc
cls ciclo: mov eax,sval(input("Numero PAR a sumar: ")) mov num,eax mov ebx,2 xor edx,edx div ebx mov resul,edx cmp resul,0 jne ciclo
; include \masm32\include\masm32rt.inc ; .data? .data num dd 0 .code start: ; call main inkey exit ; main proc cls mov num,10 ciclo: print chr$(7,"El numero: ") print str$(num) print chr$(10) dec num cmp num,0 jnz ciclo ret main endp ; end start