CLASE 15 MACROS Y PROCEDIMIENTOS

Slides:



Advertisements
Presentaciones similares
MOVIMIENTO JOVENES DE LA CALLE CIUDAD DE GUATEMALA chi siamo quienes-somos qui sommes-nous who we are attività actividades activités activities scuola.
Advertisements

SIES – SISTEMA INTEGRADO DE EDUCACIÓN SUPERIOR
1 Datos sobre webloggers Datos extraidos de la encuesta a webloggers disponibles en la web de los autores.
DATSI, FI, UPM José M. Peña Programación en C DATSI, FI, UPM José M. Peña Programación en C.
La mediana La mediana es el valor tal que el 50 % de las observaciones son menores y 50 % de ellas son mayores a dicho valor. En otra palabras, la mediana.
1 LA UTILIZACION DE LAS TIC EN LAS MICROEMPRESAS GALLEGAS. AÑO mayo 2005.
1 INFORME RESUMEN SOBRE EL NIVEL DE UTILIZACION DE LAS TIC EN LAS EMPRESAS GALLEGAS ( Resumen PYMES ) Noviembre de 2004.
AYUDA A LA FUNCIÓN DOCENTE Internet
TEMA 2 MÚLTIPLOS Y DIVISORES
02- Plan Organización Docente v.2 Noviembre 2009 SIES – SISTEMA INTEGRADO DE EDUCACIÓN SUPERIOR.
02- PLAN DOCENTE Febrero 2009 SIES – SISTEMA INTEGRADO DE EDUCACIÓN SUPERIOR.
01- OFERTA FORMATIVA v.2 Noviembre 2009 SIES – SISTEMA INTEGRADO DE EDUCACIÓN SUPERIOR.
Respuestas Buscando a Nemo.
ABECEDARIO FIGURAS GEOMÉTRICAS NÚMERO
MOVIMIENTO ARMÓNICO SIMPLE MOVIMIENTO ARMÓNICO SIMPLE
Ejemplo A continuación aparecen las tasas de retorno de dos fondos de inversión durante los últimos 10 años. 1. ¿Cuál es más riesgoso? 2. ¿En cuál invertiría.
CLASE 13 INTERRUPCIONES E INTERRUPCIONES DE ENTRADA/SALIDA
Pbn © Jaime Alberto Parra Plaza CLASE 19 BIBLIOTECAS Y ARCHIVOS DE INCLUSIÓN.
CLASE 4 EL ENSAMBLADOR.
CLASE 3 SOFTWARE DEL MICROPROCESADOR
CLASE 6 TALLER: MACROENSAMBLADOR
Pbn © Jaime Alberto Parra Plaza CLASE 14 TALLER: INTERRUPCIONES E INTERRUPCIONES DE ENTRADA/SALIDA.
Pbn © Jaime Alberto Parra Plaza CLASE 16 TALLER: MACROS Y PROCEDIMIENTOS.
Unidad de competencia II Estadística descriptiva:
5 pt 5 pt 5 pt 5 pt 5 pt 10 pt 10 pt 10 pt 10 pt 10 pt 15 pt 15 pt
C ONFIGURACIÓN C UENTAS D E C ORREO ZTE N281. C ONFIGURACIÓN C UENTAS D E C ORREO ZTE N281 1-Ingrese a menú 2-Ingrese a Mensajes 3-Ingrese a Correo 4-Seleccione.
Generación de Números Seudo-Aleatorios
Distribuciones de probabilidad bidimensionales o conjuntas
Estrategias en el aula con alumnos con problemas de atención y comportamiento Curso Actividad formativa: Seminario CRA “Entreviñas” - Fuensaldaña.
Tutorial Proceso de Compra
Phone2Wave-Server Manual de Operación.
Parte 3. Descripción del código de una función 1.
No. Lista 31 Teresita Ramírez Uribe HORA: 8:00-9:00AM.
N.L 32 ROMERO HERNÁNDEZ GABRIELA VERÓNICA. HORA: 8:00-9:00AM ESQUELETO DE UN PROGRAMA EN ENSAMBLADOR.
EL OSO APRENDIZ Y SUS AMIGOS
Operaciones con expresiones algebraicas
50 principios 1. Los clientes asumen el mando.
1 PROYECTO DE PRESUPUESTO DE EGRESOS DE LA FEDERACION 2002 COORDINACIÓN DE POLITICA ECONOMICA GP-PRD.
SEMANA 9_2.
Ecuaciones Cuadráticas
DIAGRAMAS DE FLUJO Y PSEUDOCÓDIGO
C REACIÓN DE B LOGS EN ESPOL Profesora: Eva María Mera Intriago Escuela Superior Politécnica del Litoral Impulsando la sociedad del conocimiento Instituto.
INFORMATICA I Arreglos 1 CLASE 17.
¿Qué es un conjunto? Un conjunto es una colección de objetos considerada como un todo. Los objetos de un conjunto son llamados elementos o miembros del.
INTRODUCCIÓN A LA PROGRAMACIÓN
Programación en Lenguaje Ensamblador.
MSc. Lucía Osuna Wendehake
¿Qué es un PUNTERO?: Un puntero es un objeto que apunta a otro objeto. Es decir, una variable cuyo valor es la dirección de memoria de otra variable. No.
Funciones en lenguaje C
CI TEORIA semana 8 Subprogramas o funciones Definición de funciones.
Estructuras de control
Introducción al NASM The Netwide Assembler MIA J. Rafael Rojano C.
ESTADIGRAFOS DE DISPERSION
MODOS DE DIRECCIONAMIENTO
Práctica 7 AOC. Gestión de la pila Una pila es una estructura de datos caracterizada por que el último dato que se almacena es el primero que se obtiene.
Introducción al lenguaje ensamblador
Semana 5 Subprogramas..
Informática Ingeniería en Electrónica y Automática Industrial
PBN © Jaime Alberto Parra Plaza CLASE 5 LOS SEGMENTOS.
Microprocesador (80X86) Universidad Nacional de Ingeniería
PBN © Jaime Alberto Parra Plaza CLASE 9 INSTRUCCIONES ARITMÉTICAS. GENERACIÓN DE EXPRESIONES.
Unidad I: Registros e Interrupciones Facilitador: Ing. Eduardo Brando.
Elementos básicos del lenguaje
 En computación es un conjunto de líneas de señal que el microprocesador o CPU utilizan para intercambiar datos con otros componentes como teclados,
Términos algoritmo diseñar algoritmo implementar algoritmo
SEMANA 01_2.
MEMORIA DINÁMICA.
Lenguaje ensamblador Conceptos introductorios. Formatos de Instrucción. Modos de Direccionamiento. Conjunto de instrucciones básico. Introducción al Lenguaje.
Lenguaje ensamblador Resumen en diapositivas
Omar Herrera Caamal Rigoberto Lizárraga Luis Cetina Luna.
Transcripción de la presentación:

CLASE 15 MACROS Y PROCEDIMIENTOS

Una de las claves para poder solucionar un problema complejo está en la capacidad de fragmentarlo en subproblemas. En la medida en que los subproblemas sean correctamente identificados, la solución será mejor que otras posibles.

En programación hay disponibles, en primera instancia, dos herramientas para ayudar a hacer esta fragmentación: una es provista por el microprocesador (los procedimientos) otra por el ensamblador (las macros).

MACROS: Al familiarizarse con las interrupciones se descubre que la interacción con ellas se realiza normalmente siguiendo tres labores: Paso de parámetros Llamado Recepción de resultados

1) Ubicar en ciertos registros la información requerida por la interrupción (paso de parámetros) 2) Invocar a la interrupción (llamada) 3) Tomar los resultados entregados de los registros correspondientes (valores retornados) Sería deseable disponer de un mecanismo para automatizar esta labor y eso es precisamente lo que hace una macro.

DEFINICIÓN DE MACRO: Una macro es una utilidad que brinda el ensamblador y que permite insertar un trozo de código en una posición cualquiera de un programa, escribiendo en tal posición una palabra que representa el código mencionado. Además, la macro permite la recepción de parámetros, lo cual simplifica el llamado a interrupciones y a procedimientos.

DECLARACION: nombre MACRO [parámetros] ; cuerpo de la macro ENDM nombre es el identificador que representa a la macro. Las palabras reservadas MACRO y ENDM marcan los límites de la definición. Se puede colocar, opcionalmente, una lista de parámetros para que la macro reciba y/o entregue información.

Ejemplo: Se sabe ya que para escribir un carácter en la pantalla se usa el siguiente esquema: MOV AH, 02H MOV DL, carácter INT 21H

A través de una macro quedaría así: Putch MACRO CharVar MOV AH, 02H MOV DL, CharVar INT 21H ENDM ; fin de la macro Putch Observe que la “variable” CharVar es en realidad un comodín que se usa para representar lo que debe ir en la segunda línea de la macro, no es una variable que exista físicamente.

Una vez declarada la macro, lo cual debe hacerse al comienzo del programa, se invoca simplemente colocando su nombre y añadiendo, si es el caso, los parámetros correspondientes. A continuación se muestra un programa de ejemplo:

MOV AL, A Putch AL ; pueden pasarse registros Putch 5 ; pueden pasarse constantes Putch var8 ; pueden pasarse variables LEA SI, var8 Putch [SI] ; pueden pasarse punteros

Es importante aclarar que una macro NO REDUCE el tamaño del programa, es sólo una utilidad que brinda el ensamblador. Cuando el ensamblador procesa un programa, usualmente realiza tres pasadas sobre él:

Primera pasada: cambia las constantes por sus valores reales y expande las macros por el código que representan. Segunda pasada: traduce cada instrucción por su código binario equivalente y va creando una tabla donde almacena las direcciones que corresponden a cada etiqueta. Tercera pasada: remplaza las referencias a etiquetas que han quedado pendientes por sus valores, según la tabla creada.

De acuerdo con lo dicho, el siguiente programa es IDÉNTICO al ejemplo mencionado anteriormente: MOV AL, A MOV AH, 02H MOV DL, AL INT 21H MOV AH, 02H MOV DL, 5 INT 21H ... < sigue > ...

... < viene > ... MOV AH, 02H MOV DL, var8 INT 21H LEA SI, var8 MOV AH, 02H MOV DL, [SI] INT 21H

En suma, se establece para los macros que: 1. Son sólo una utilidad que le ahorra al programador tiempo, al poder remplazar con una sola palabra una secuencia de instrucciones. 2. Permiten que un programa sea más comprensible. 3. Por su propia naturaleza, no deben ser muy grandes. Se sugiere que tengan, máximo, 15 líneas de código.

El uso de los macros se recomienda en estas situaciones: 1. Para llamar interrupciones y procedimientos, facilitando el paso de parámetros y la recepción de valores retornados 2. Para darle un nombre significativo a un código que, aunque aparezca sólo una vez, realiza algún trabajo importante o poco claro

Ejemplo del segundo caso: Empezar MACRO MOV AX, DATA MOV DS, AX MOV ES, AX ENDM ; fin de Empezar Esta macro busca darle sentido a las primeras líneas que usualmente inician un programa típico en ensamblador.

MACROS NO SON PROCS: Dado que las macros NO son procedimientos o funciones no deben tener etiquetas ni saltos dentro de ellas, en particular, NUNCA utilice la opción LOCAL que permiten algunos ensambladores.

Debe tenerse un cuidado mínimo con los parámetros que se entregan a una macro. Las principales causas de problemas al interactuar con una macro tienen que ver con la discrepancia entre los argumentos y los parámetros en cuanto a: El orden en que se pasan El tipo que se utiliza El valor de los argumentos se altera dentro de la macro

Para el ejemplo dado, observe estos casos: MOV AH, ‘L’ Putch AH MOV BX, 102 Putch BX El primer caso falla porque al empezar la macro, el valor de AH se cambia por 02H, así que la ‘L’ entregada se pierde. En el segundo caso, el registro BX no se corresponde en tamaño con el registro DL que es quien recibe el parámetro.

PROCEDIMIENTOS: Un procedimiento actúa como un servicio de interrupción, pero tiene frente a él dos diferencias importantes: Usualmente es creado sólo para solucionar un problema particular en el programa de usuario No se invoca con la orden INT sino con la instrucción CALL.

Desde el punto de vista físico cuando el uP detecta una orden CALL Etiqueta Procede de una forma similar a cuando se encuentra con una orden INT: Guarda en la pila el valor de IP (y CS si es un llamado lejano) y carga en este registro el valor indicado por Etiqueta. Los flags no son guardados en esta operación.

SINTAXIS SOBRE PROCEDIMIENTOS: Para invocar un procedimiento, se utiliza la orden Call, que requiere como operando la dirección de inicio del procedimiento, la cual usualmente se da en forma de etiqueta, mediante el propio nombre del procedimiento: CALL NombreProc

Para crear un procedimiento, se declara en la forma: NombreProc PROC [Opciones] ; cuerpo del procedimiento RET ; fin del procedimiento NombreProc ENDP

Las opciones pueden ser: NEAR o FAR Las opciones pueden ser: NEAR o FAR. Un procedimiento tipo near sólo puede ser invocado desde dentro del segmento en el cual él existe. Si es de tipo far podrá ser invocado desde cualquier otro procedimiento, esté o no en el mismo segmento.

El fin del procedimiento (y retorno al lugar de llamado) se hace con la orden RET. Aunque puede existir más de una orden RET en un procedimiento, la programación estructurada sugiere colocar uno solo y que sea justamente la última instrucción del procedimiento. Si hay más de un punto de retorno en el código, simplemente se coloca un salto hacia esa última instrucción.

ALCANCE DE LOS SALTOS CONDICIONALES: Cuando se realizan ciclos (del tipo for, while o do) es importante tener en cuenta que los saltos condicionales tienen un alcance MÁXIMO de 128 bytes. Si el ciclo es mayor a este valor es una indicación de mala programación.

ALCANCE DE LOS SALTOS CONDICIONALES: Una solución temporal a este problema consiste en ubicar todo o parte del cuerpo del ciclo en un procedimiento.

PASO DE PARÁMETROS: No existe un mecanismo prefijado por el microprocesador para el paso de parámetros a un procedimiento (tal como decir call nomproc parámetros). Por ello, el programador debe escoger entre las posibilidades que se han desarrollado o una ideada por él mismo.

Las formas tradicionales son: A través de registros Mediante la pila La primera tiene la ventaja de permitir intercambio rápido de información, pero a costa de no ser un mecanismo estandarizado; la segunda si es estandarizada, pero tiene por falencia su lentitud.

EJEMPLOS DE PROCEDIMIENTOS: Para visualizar mejor estas ideas se darán por ejemplo de procedimientos aquéllos para lectura y escritura de cadenas, que se utilizan en conjunto con sus macros respectivas, lo cual es usual para sistematizar el paso de parámetros desde el procedimiento llamador hacia el procedimiento llamado.

LECTURA DE CADENA: Se empieza por describir la macro que actúa como parte pública o interfaz con el exterior. En esencia, la macro se encarga se ubicar los parámetros en el sitio en donde el procedimiento supone que estarán (registros o pila). También, se encarga de salvar el valor de los registros que pudiesen ser cambiados por el procedimiento:

Gets MACRO. MaxChar, InString ; Primero: preservar registros actuantes Gets MACRO MaxChar, InString ; Primero: preservar registros actuantes PUSH CX PUSH SI ; Segundo: cargar parámetros MOV CL, MaxChar LEA SI, InString ; Tercero: invocar el procedimiento CALL pGets ; Cuarto: restaurar registros usados POP SI POP CX ENDM ; Gets

Ahora se trabajará con el procedimiento, el cual hace la tarea como tal. El nombre del procedimiento puede ser similar al de la macro, el instructor recomienda esta nomenclatura: Para la macro: Nombre Para el procedimiento: pNombre Es decir, preceder el nombre del procedimiento con una letra ‘p’.

El procedimiento a su vez hace uso de las macros Getch (Int El procedimiento a su vez hace uso de las macros Getch (Int. 21H, Servicio 08H) y Putch (Int. 21H, Servicio 02H) para leer y escribir caracteres. Se asume, además, que se han declarado las constantes: CR EQU 13 ; retorno de carro BS EQU 8 ; retroceso BEEP EQU 7 ; pitido NULL EQU 0 ; nulo

Para facilitar la comprensión de un procedimiento se acostumbra colocar al comienzo comentarios que indiquen: ; nombre: < del procedimiento > ; propósito: < labor que hace > ; prototipo: < declaración equivalente en C > ; entrada: < registros que reciben ... ... parámetros > ; salida: < registros que entregan ... ... resultados > ; registros: < otros registros utilizados >

; nombre: pGets ; propósito: Leer desde teclado una cadena ; ; nombre: pGets ; propósito: Leer desde teclado una cadena ; ASCIIZ (tamaño máximo de ; 255 caracteres) ; prototipo: unsinged pGets (unsigned, char *); ; entrada: CL = Número máximo de ; caracteres a leer ; SI = puntero a la variable ; cadena receptora ; salida: BL = número de caracteres leídos ; registros: AX, DL

pGets. PROC. PUSH. AX. PUSH. DX. MOV. BX, 0. ; BX=cuenta cars. DO90: pGets PROC PUSH AX PUSH DX MOV BX, 0 ; BX=cuenta cars. DO90: Getch AL ; leer un caracter SWITCH90: CASE91: CMP AL, CR JE ENDSWITCH90

CASE92:. CMP. AL, BS. JNE. DEFAULT90 IF90:. CMP. BL, 0. JBE CASE92: CMP AL, BS JNE DEFAULT90 IF90: CMP BL, 0 JBE ELSE90 THEN90: DEC BL Putch BS ; borrar último ... Putch ' ' ; ... carácter ... Putch BS ; ... escrito JMP ENDIF90

ELSE90:. Putch. BEEP. ; error de edición ENDIF90:. JMP ELSE90: Putch BEEP ; error de edición ENDIF90: JMP ENDSWITCH90 DEFAULT90: IF91: CMP BL, CL JAE ELSE91

THEN91:. MOV. [SI][BX], AL. INC. BL. Putch. AL. ; escribir el carácter THEN91: MOV [SI][BX], AL INC BL Putch AL ; escribir el carácter JMP ENDIF91 ELSE91: Putch BEEP ; máximo alcanzado ENDIF91: ENDSWITCH90:

WHILE90:. CMP. AL, CR. JNE. DO90 ENDWHILE90: ; colocar final de cadena WHILE90: CMP AL, CR JNE DO90 ENDWHILE90: ; colocar final de cadena MOV BYTE PTR [SI][BX], NULL POP DX POP AX RET pGets ENDP

ESCRITURA DE CADENA: El proceso aquí es mucho más simple. Simplemente se leen caracteres de una variable existente hasta encontrar el carácter terminador NULO. Como en el caso anterior, se presenta primero la macro y después el procedimiento respectivo.

Puts MACRO OutString PUSH SI LEA SI, OutString CALL pPuts POP SI ENDM ; Puts

; nombre: pPuts ; propósito: Escribir en pantalla una ; ; nombre: pPuts ; propósito: Escribir en pantalla una ; cadena ASCIIZ ; prototipo: void pPuts ( char * ); ; entrada: SI = puntero a la cadena ; salida: Ninguna ; registros: AH, DL

pPuts. PROC. PUSH. AX. PUSH. DX WHILE92:. CMP. BYTE PTR [SI], NULL. JE pPuts PROC PUSH AX PUSH DX WHILE92: CMP BYTE PTR [SI], NULL JE ENDWHILE92 Putch [SI] INC SI JMP WHILE92 ENDWHILE92: POP DX POP AX RET pPuts ENDP

RECOMENDACIONES: Es opcional preservar los registros que se usarán en una macro o procedimiento. Al hacerlo, se tiene la tranquilidad de que no se alterarán inadvertidamente sin que se tenga conocimiento de ello fuera de la macro o del procedimiento. Su desventaja es que aumenta el tamaño del código y el tiempo de ejecución

Por razón similar, nunca deben usarse variables globales dentro de una macro o procedimiento, si se requieren, se pasarán como parámetros o mediante un puntero Usar solamente una instrucción RET por procedimiento y ubicarla como instrucción final

PREGUNTA 15: ¿Cómo funciona el uso de caracteres comodines dentro de las macros y qué utilidad tienen?.

< FIN DE LA CLASE 15 >