Uto escribió:sjasm tiene un motón de macros incorporadas, para que los torpes no tengamos problemas. A mi me pasó una vez que puse LD HL, BC o algo así, y el tío me lo aceptó y cambió en el código a LD H, B / LD L, C. Lo malo es que me puse a depurar, y me puse a a hacer scroll en el depurador a ver donde estaba el trozo de código que yo quería, y precisamente mi ojo iba buscando el LD HL, BC, y claro no lo veía.
Este tipo de macros empieza a ser muy útil cuando estás programando en ensamblador todo el día, porque acabas cansado de escribir tantas líneas. Hay programadores que tienen docenas y docenas de macros, y agrupadas por niveles.
Hay macros como éstas, que "imitan" instrucciones reales, que reducen el tamaño del código fuente, que ese ensamblador llama "
fake instructions".
Otras macros son para hacer operaciones especiales, como inicializar_hardware, limpiar_memoria_video, que a veces son tan extensas que más que macros son llamadas a subrutinas, pero como solo se usan una vez, el programador las pone como macros y así se ahorra toda la parafernalia de poner argumentos, salvar la pila, saltar a la subrutina, regresar, ajustar la pila, etc.
Un ejemplo que suelo usar para 68000:
Para cambiar la paleta de colores, en el Atari ST pongo esto
conteniendo el registro a0 la dirección de memoria donde se define la nueva paleta de colores que se debe usar. ¿A qué es cómodo?
Bueno, naturalmente, Setpalette no es una instrucción del ensamblador del 68000. Es una macro que equivale a esto:
Que quiere decir que mete el primer argumento (\1) en la pila y luego hace una llamada a la BIOS, más concretamente, la parte Xbios, la función 6. El segundo 6 tiene otro significado que explico a continuación. Es decir... que Xbios es
otra macro, que vale esto:
Vemos que hay una sentencia llamada maktrap, con tres argumentos. El primero es fijo (14) y luego siguen los dos argumentos pasados antes (los dos 6 de antes). Y... de nuevo... maktrap no es una instrucción de ensamblador para 68000... es
otra macro, que vale esto:
Por fin, ya vemos lenguaje ensamblador... move, trap... Vemos que el primer move mete en la pila el segundo argumento (es el primer 6 de la llamada original). Luego, hace un trap con el primer argumento (el 14, valor fijo), y luego... llama a
otra macro, suma, con el tercer argumento (el segundo 6). Esa macro suma tiene este aspecto (no asustarse, por favor):
Código: Seleccionar todo
suma macro
ifne \1
ifle \1-8
addq.l #\1,sp
elseif
lea \1(sp),sp
endc
endc
endm
Aquí hay varias sentencias que son directivas del ensamblador, para generar código condicional (según lo que ocurra, genera un código u otro). En la primera línea se pregunta si el primer argumento es distinto de 0. Si es así, en la segunda línea se pregunta si el primer argumento es inferior a 8. Si es así, genera la sentencia addq.l, es decir, una suma rápida para ajustar la posición de la pila. Si no es así, genera una sentencia lea con direccionamiento relativo a la pila. Así ajustamos la pila para desplazamientos de 16 bits.
Bueno... en resumen... lo que hace
es equivalente a
¿Demasiado lioso para solo cuatro instrucciones de código máquina? Sí, pero hay que recordar que en un programa pueden aparecer docenas y docenas de estas llamadas. Además, es más claro poner Setpalette ya que es el nombre de la propia función en la documentación de la BIOS.
Perdón, me he enrollado como una persiana
