Subrutinas vs macros

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í:

Subrutina

Y el código máquina quedaría así:

Subrutina_CM

En cambio, si la función la hacemos con una macro, el código ensamblador quedaría así:

Macro

Y el código máquina quedaría así:

Macro_CM

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

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google photo

Estás comentando usando tu cuenta de Google. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s