代码之家  ›  专栏  ›  技术社区  ›  Nathan Campos

如何创建一个GNU GAS宏,它可以扩展到一个表达式,比如“(x+y*240)*2”?

  •  4
  • Nathan Campos  · 技术社区  · 14 年前

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

    我该如何对此执行宏: (x+y*240)*2 ,是 x y int ,将这样使用:

    mov r0, MACRO_SHOULD_BE_CALLED_HERE
    

    我怎样才能做一个宏,它应该被称为:

    JUST_MACRO_CALLED_HERE_TO_DO_SOMETHING
    

    它只会做一些已经在它内部定义的事情,比如打印函数。

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

    r0 是手臂调节器,比如 eax x86的

    3 回复  |  直到 9 年前
        1
  •  3
  •   Joe    14 年前

    GAS vs NASM comparison - Macros 显示了执行参数化宏的方法,但只是简单的替换。

        2
  •  3
  •   artless-noise-bye-due2AI    9 年前

    下面是第一种类型的内联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”预处理器。

        3
  •  1
  •   Carl Norum    14 年前

    我从来没有见过像第一个例子那样支持宏的汇编程序。第二个例子非常简单,即使是最基本的汇编文档也应该包含它。对于GNU as

    .macro JUST_MACRO_CALLED_HERE_TO_DO_SOMETHING
        ...
    .endm
    

    把你想要的指令放在 ... .

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

    推荐文章