Facultad de Ingeniería. UNJu TP 9 LABORATORIO DE COMPUTADORAS Tema: Macros Apellido y Nombre: LU: Carrera: Fecha: 2013 CONCEPTOS A. Investigue sobre las directivas condicionales. Ejemplifique. B. ¿Bajo qué condiciones recomendaría el uso de procedimientos? C. ¿Qué significa un procedimiento intrasegmento y un procedimiento intersegmento? D. ¿Bajo qué condiciones recomendaría el uso de macros? E. Describa los principales operadores y directivas útiles para macros. F. ¿Qué significa Programación Híbrida? G. Describa y ejemplifique las partes de un procedimiento. H. Codifique la primera y la última línea de una macro sencilla llamada SETUP. EJERCICIOS 1. El siguiente programa utiliza la macro ESCRIBE para visualizar una cadena de caracteres. Observe que la macro utiliza como parámetro la cadena de caracteres a visualizar. title 'escribe_cadena' cr equ 13 lf equ 10 escribe macro palabra lea dx,palabra call escribir endm datos segment texto1 db cr,lf,'Ingrese cadena:','$' texto2 db cr,lf,'Cadena ingresada:','$' cadena db 10 dup(' '),'$' datos ends pila segment stack db 64 dup('pila') pila ends codigo segment inicio proc far assume ds:datos,ss:pila,cs:codigo push ds sub ax,ax push ax mov ax,datos mov ds,ax escribe texto1 sub si,si mov ah,01 UNJU. FACULTAD DE INGENIERÍA ingreso:int 21h cmp al,13 je fingreso mov cadena[si],al inc si cmp si,09 jle ingreso fingreso:mov cadena[si],'$' escribe texto2 escribe cadena call esperar ret escribir proc push ax mov ah,09 int 21h pop ax ret escribir endp esperar proc push ax mov ah,00 int 16h pop ax ret esperar endp inicio endp codigo ends end inicio Página 1 LABORATORIO DE COMPUTADORAS Codifique y compile el programa anterior (por ejemplo, macro.asm), indicando que se genere el archivo ESCRIBE.LST C:\MASM>masm macro.asm Microsoft MACRO Assembler Version 3.00 (C)Copyright Microsoft Corp 1981, 1983, 1984 Object filename [macro.OBJ]: Source listing [NUL.LST]: ESCRIBE Cross reference [NUL.CRF]: 49602 Bytes free Warning Severe Errors Errors 0 0 Revise el contenido del archivo ESCRIBE.lst e identifique las expansiones de la macro ESCRIBE en el código del programa. C:\MASM>edit ESCRIBE.asm 0004 B8 ---- R 0007 8E D8 0009 000D 0010 0012 0024 8D E8 2B B4 16 0000 R 003B R F6 01 C6 84 0026 R 24 0029 002D 8D 16 0012 R E8 003B R 0030 0034 0037 003A 8D 16 0026 R E8 003B R E8 0042 R CB . . . mov ax,datos mov ds,ax escribe texto1 + + sub si,si mov ah,01 . . . lea dx,texto1 call escribir fingreso:mov cadena[si],'$' escribe texto2 + lea dx,texto2 + call escribir escribe cadena + lea dx,cadena + call escribir call esperar ret . . . Observe que el código de la macro sustituye al llamado o invocación de ésta, insertando sus instrucciones. 2. Escriba una macro llamada LEE que permita almacenar una cadena de caracteres ingresada por el usuario. Considere que la macro utiliza como parámetros la cadena y la longitud de ésta. 3. Escriba una macro llamada INTERCAMBIO que intercambie el contenido de 2 datos de tipo byte. Considere que la macro utiliza como parámetros los datos a intercambiar. 4. Escriba una macro llamada REPITE que visualice una cadena de caracteres un número determinado de veces. Considere que la macro utiliza como parámetros la cadena y el número de veces que se debe visualizar. 5. Escriba una macro llamada LETRAS que visualice los caracteres de un rango especificado. Considere que la macro utiliza como parámetros carácter_mínimo y carácter_máximo. UNJU. FACULTAD DE INGENIERÍA Página 2 LABORATORIO DE COMPUTADORAS 6. Escriba una macro llamada CONFIGURA que permita asociar los registros de segmento CS, DS y SS con los segmentos del programa (primeras instrucciones que aparecen en el programa ensamblador). 7. Escriba una macro llamada GPILA que permita almacenar el valor de los registros acumuladores en la pila. También escriba la macro SPILA que permita recuperar el contenido de los registros acumuladores desde la pila. 8. Escriba una macro llamada MAXMIN que determine los valores máximo y mínimo de vector de memoria. Considere que la macro utiliza como parámetro el vector a analizar. 9. Escriba una macro llamada PRODUCTO que calcule el producto, por medio de sumas sucesivas, de 2 valores introducidos por el usuario. Considere que la macro utiliza como parámetros los valores a multiplicar. 10. Escriba una macro llamada POTENCIA que calcule la potencia de un número A elevado al exponente B, por medio productos sucesivos. Considere que la macro utiliza como parámetros la base y el exponente. 11. Escriba una macro llamada DIVIDE que calcule la división (entera), por medio de restas sucesivas, de 2 valores introducidos por el usuario. Considere que la macro utiliza como parámetros el dividendo, el divisor, el cociente y el resto. 12. Escriba una macro llamada MINUSCULAS que convierta una cadena ingresada por el usuario a mayúsculas. Tenga en cuenta que la cadena introducida puede contener letras (en mayúsculas y/o minúsculas), símbolos y/o dígitos. Considere que la macro utiliza como parámetro la cadena ingresada. 13. Escriba una macro llamada INVIERTE que genere la cadena inversa de una cadena de caracteres dada. Considere que la macro utiliza como parámetros la cadena original y la inversa. 14. Escriba una macro llamada CONCATENA que concatene 2 cadenas. Considere que la macro utiliza como parámetros las cadenas a concatenar y la cadena resultado. 15. Escriba una macro llamada COMPARA que determine si dos cadenas son iguales (igual longitud y contenido), si la primera es mayor o si la segunda es mayor. Considere que la macro utiliza como parámetros las cadenas a comparar. 16. Escriba una macro llamada BORRA_LETRA que elimine todas las apariciones de un carácter en una cadena dada. Considere que la macro utiliza como parámetros la cadena y el carácter a eliminar. 17. Escriba una macro llamada ORDENALISTA que ordene un vector de memoria en forma creciente. Considere que la macro utiliza como parámetro el vector a ordenar. 18. Escriba una macro llamada INSERTA que inserte (en orden) un carácter en una cadena de caracteres. Considere que la macro utiliza como parámetros la cadena y el carácter a insertar. 19. Escriba una macro llamada INTERCALA que realice la mezcla (intercalación) de 2 vectores en un tercero. Considere que la macro utiliza como parámetros los vectores a intercalar y el vector mezcla. 20. Escriba una macro llamada SUBCADENA que determine si una cadena es subcadena de otra. Considere que la macro utiliza como parámetros la subcadena y la cadena a analizar. UNJU. FACULTAD DE INGENIERÍA Página 3 LABORATORIO DE COMPUTADORAS 21. La directiva INCLUDE permite agregar código a un programa en ensamblador a partir de otros archivos. Por ejemplo, para el programa del ítem 1 (primero.asm) se almacenó el código de la macro ESCRIBE en el archivo primero.lib que se incluye en el programa mediante la directiva INCLUDE primero.lib. primero.asm title 'escribe_cadena' cr equ 13 lf equ 10 primero.lib escribe macro palabra lea dx,palabra call escribir endm INCLUDE primero.lib datos segment texto1 db cr,lf,'Ingrese cadena:','$' texto2 db cr,lf,'Cadena ingresada:','$' cadena db 10 dup(' '),'$' datos ends lee macro cad, long ... endm pila segment stack db 64 dup('pila') pila ends codigo segment inicio proc far assume ds:datos,ss:pila,cs:codigo ... escribe texto1 lee cadena,09 escribe texto2 escribe cadena ... inicio endp codigo ends end inicio Considerando esto, guarde todas las macros desarrolladas en este práctico en el archivo macros.lib y sustituya sus definiciones por la correspondiente sentencia INCLUDE. 22. Analice la macro: XPUSH MACRO R1, R2, R3, R4, R4, R5, R6, R7, R8, R9, R10 IRP reg; <R1, R2, R3, R4, R4, R5, R6, R7, R8, R9, R10> IFNB <reg> PUSH reg ENDIF ENDM ENDM Considerando que la macro XPUSH se invoca como sigue XPUSH AX, BX, DS, ES, VAR1 Determine: a) Finalidad de la macro. b) Resultado de la expansión de la macro con el formato de la invocación señalado. c) ¿Se puede escribir la macro de otra manera y que cumpla el mismo cometido? En caso afirmativo escriba el código de la macro, invocación y expansión. UNJU. FACULTAD DE INGENIERÍA Página 4