2010-06-27 30 views
3

我正在使用GAS构建ARM Linux的程序,但我想要做一些宏以使我的开发更加智能。然后,我想知道:如何创建扩展为“(x + y * 240)* 2”等表达式的GNU GAS宏?

我怎么会做这样的宏:(x+y*240)*2,是xyint,将像这样被使用:

mov r0, MACRO_SHOULD_BE_CALLED_HERE 

而且我怎么可能做一个宏应该这样调用:

JUST_MACRO_CALLED_HERE_TO_DO_SOMETHING 

这只是做一些已经在里面定义的东西,比如打印功能。

此外,如果我需要在宏或函数调用一些参数。我怎么能做到这一点?

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

+0

什么是'x'和'y':寄存器还是常量?对于常量,请考虑使用'.altmacro'和'%':http://stackoverflow.com/questions/19776992/gas-altmacro-macro-with-a-percent-sign-in-a-default-parameter-fails- with-oper – 2015-09-23 10:46:22

回答

2

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

+4

现在链接已关闭,但它仍然可用[在返程机器上](http://web.archive.org/web/20090215122116/http://www.ibm.com/developerworks/library /l-gas-nasm.html)。 – Geier 2014-07-15 09:38:32

1

eax我从来没有见过像你想为你的第一个例子是支持的宏汇编。第二个例子非常简单 - 即使是最基本的汇编文档也应该覆盖它。对于GNU as,你可能想是这样的:你在地方...的想要的任何指令

.macro JUST_MACRO_CALLED_HERE_TO_DO_SOMETHING 
    ... 
.endm 

看跌。

请注意汇编宏,你不会踩在你用来存放重要数据的一堆寄存器上。通常函数调用是解决这些问题的更好方法。

+0

但是如果我需要一些关于宏或函数调用的参数。我怎么能做到这一点? – 2010-06-27 16:49:59

+0

@Nathan,也许你应该阅读文档。 – 2010-06-27 22:10:43

+0

这就是我现在正在做的。 **;)** – 2010-06-28 00:56:57

1

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

+0

'.set'就是我所需要的。谢谢。 Docs明确声明可以在程序集中多次“设置”相同的符号,以防万一任何人在宏中使用它时感到不安。 – doug65536 2016-10-25 10:06:57