Cómo crear una macro GNU gas que se expande a una expresión como “(x + y * 240) * 2”?

StackOverflow https://stackoverflow.com/questions/3127905

  •  30-09-2019
  •  | 
  •  

Pregunta

Estoy construyendo un programa para ARM Linux que utilizan gas, pero quiero hacer algunas macros para hacer mi desarrollo un poco más inteligente. Entonces me gustaría saber:

¿Cómo podría hacer una macro para esto: (x+y*240)*2, fuera x y y son int, que será utilizado como esto:

mov r0, MACRO_SHOULD_BE_CALLED_HERE

Y cómo podría hacer una macro que debería llamarse así:

JUST_MACRO_CALLED_HERE_TO_DO_SOMETHING

Eso sólo va a hacer algo que ya está definido en su interior, como una función de impresión, por ejemplo.

Además, si necesito algunos argumentos de la macro o una llamada de función. Cómo podría hacerlo?

PS: r0 es un registro de ARM, como eax de x86

¿Fue útil?

Solución

GAS vs comparación NASM -. presenta macros maneras de hacer las macros parametrizados, pero es sustituciones simples

Otros consejos

Aquí es una muestra gcc inline del primer tipo.

int foo(unsigned short *p)
{
        int c;
        asm(".macro pixw nm, x, y\n"
            " .set \\nm, (\\x+\\y*240)*2\n"
            ".endm\n"
            "pixw pixo,1,2\n"
            "ldrh  %0, [%1, #pixo]\n" : "=r" (c) : "r" (p));
        return c;
}

O en ensamblador,

.macro pixw nm, x, y
 .set \nm, (\x+\y*240)*2
.endm
pixw pix10_2,10,2 ; variable pixo is macro as parameters
 ldrh  r0, [r1, #pix10_2] ; get pixel offset.

A menudo la gente utiliza un pre-procesador de 'C' en su lugar.

nunca he visto un ensamblador que apoyó las macros como usted desea para su primer ejemplo. El segundo ejemplo es bastante sencillo, aunque - incluso la documentación ensamblador más básico debe cubrirlo. Para as GNU, es probable que desee algo como:

.macro JUST_MACRO_CALLED_HERE_TO_DO_SOMETHING
    ...
.endm

instrucciones de poner lo que desea en lugar de la ....

Tenga cuidado con las macros del ensamblador que no pisa fuerte en un grupo de registros que estaba utilizando para guardar datos importantes. Por lo general, una llamada de función es una mejor manera de resolver estos problemas.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top