5

我正在使用 GAS 为 ARM Linux 构建一个程序,但我想做一些宏来使我的开发更加智能。然后我想知道:

我怎么能为此做一个宏:(x+y*240)*2, werexyare int,将像这样使用:

mov r0, MACRO_SHOULD_BE_CALLED_HERE

我怎么能做一个应该这样调用的宏:

JUST_MACRO_CALLED_HERE_TO_DO_SOMETHING

这只会做一些已经在其中定义的事情,例如打印功能。

另外,如果我需要宏或函数调用的一些参数。我怎么能做到?

PS:r0是一个ARM寄存器,像eaxx86

4

3 回答 3

3

GAS 与 NASM 比较 - 宏显示了执行参数化宏的方法,但它是简单的替换。

于 2010-06-27T19:16:51.927 回答
3

这是第一种类型的内联 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”预处理器来代替。

于 2015-04-10T21:33:43.243 回答
1

对于第一个示例,我从未见过像您想要的那样支持宏的汇编程序。第二个例子非常简单——即使是最基本的汇编文档也应该涵盖它。对于 GNU as,您可能想要类似的东西:

.macro JUST_MACRO_CALLED_HERE_TO_DO_SOMETHING
    ...
.endm

将您想要的任何说明放在....

小心汇编宏,不要踩到用来保存重要数据的一堆寄存器。通常函数调用是解决这些问题的更好方法。

于 2010-06-27T16:42:06.813 回答