Para terminar de entender mejor las similitudes y diferencias entre subrutinas y macros, lo mejor es hacer una comparación de diferentes aspectos:
Subrutina | Macro | |
Objetivo | Reutilizar código y crear niveles de abstracción. | Reutilizar código y crear niveles de abstracción. |
Código ensamblador | Empieza con una etiqueta (opcional, pero cómodo) y termina con “rts”. | Empieza con “defm” y termina con “endm”. |
Llamada | Se hace con “jsr etiqueta” o “jsr dirección”. | Se hace con el nombre de la macro y los parámetros separados por comas. |
Parámetros de entrada | Se pasan mediante los registros o mediante posiciones de memoria. | Se especifican en cada llamada, tras el nombre de la macro. Se usan con /1, /2, … |
Parámetros de salida | Se pasan mediante los registros o mediante posiciones de memoria. | El mecanismo de macros como tal no tiene parámetros de salida. |
Código máquina | Empieza en una posición de memoria y termina con “rts”. El código sólo aparece una vez en memoria. | En cada “llamada” a la macro, se copia el código de la macro y los parámetros de entrada se sustituyen por sus valores. |
Supongamos que tenemos un programa que tiene que imprimir por pantalla varios caracteres. Si la función para imprimir un carácter X la hacemos con una subrutina, el código ensamblador quedaría así:
Y el código máquina quedaría así:
En cambio, si la función la hacemos con una macro, el código ensamblador quedaría así:
Y el código máquina quedaría así:
Nótese que cada llamada a la macro es sustituía por una copia del código de la macro (defm … endm), y que en cada copia los parámetros son sustituidos por el valor con que se hizo la “llamada” (2 en este caso). De la macro como entidad independiente no queda ni rastro; no es más que una plantilla de código que se reutiliza.
Desde una subrutina es posible llamar a otra subrutina (así creamos diferentes niveles de abstracción) y también usar macros. Desde una macro es posible llamar a una subrutina, pero, en cambio, no es posible usar una segunda macro; el ensamblador se haría lío con tanta sustitución de código. Al menos con CBM prg Studio…
Programa de ejemplo: Prog22