Как создать макрос GNU GAS, который расширяется до выражения типа "(x + y * 240) * 2"? - PullRequest
4 голосов
/ 27 июня 2010

Я создаю программу для ARM Linux с использованием GAS, но я хочу сделать несколько макросов, чтобы сделать разработку более умной. Тогда я хочу знать:

Как я могу сделать макрос для этого: (x+y*240)*2, где x и y равны int, который будет использоваться следующим образом:

mov r0, MACRO_SHOULD_BE_CALLED_HERE

А как мне сделать макрос, который должен называться так:

JUST_MACRO_CALLED_HERE_TO_DO_SOMETHING

Это просто сделает что-то, что уже определено внутри него, например, функцию печати. ​​

Кроме того, если мне нужны аргументы для макроса или вызова функции. Как я мог это сделать?

PS: r0 - это регистр ARM, например eax из x86

Ответы [ 3 ]

3 голосов
/ 27 июня 2010

Сравнение GAS и NASM - макросы показывает способы выполнения параметризованных макросов, но это простые замены.

2 голосов
/ 11 апреля 2015

Вот пример встроенного gcc первого типа.

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;
}

или в ассемблере,

.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.

Часто люди используют вместо этого препроцессор 'C'.

1 голос
/ 27 июня 2010

Я никогда не видел ассемблера, который бы поддерживал макросы так, как вы хотите для первого примера.Второй пример довольно прост - даже самая простая документация на ассемблере должна охватывать его.Для GNU as вы, вероятно, захотите что-то вроде:

.macro JUST_MACRO_CALLED_HERE_TO_DO_SOMETHING
    ...
.endm

Поместите все необходимые инструкции вместо ....

Будьте осторожны с макросами ассемблера, которые вам не нужнытопайте кучу регистров, которые вы использовали для хранения важных данных.Обычно вызов функции - лучший способ решить эти проблемы.

...