assembly 如何在ARM汇编中扩展宏?

u1ehiz5o  于 2022-12-04  发布在  其他
关注(0)|答案(1)|浏览(177)
.macro f x,y
    ...
.endm
....
    f x10,x11

如何扩展宏f x10,x11的使用?gcc -E似乎没有帮助,FWIW。

iecba09b

iecba09b1#

假设你提到的gcc是GNU汇编程序,你可以生成一个包含.macro扩展的列表文件,它在the manual中没有提到,但在as --help中确实出现了:

-a[sub-option...]   turn on listings
                          Sub-options [default hls]:
                          c      omit false conditionals
                          d      omit debugging directives
                          g      include general info
                          h      include high-level source
                          l      include assembly
                          m      include macro expansions
                          n      omit forms processing
                          s      include symbols
                          =FILE  list to FILE (must be last sub-option)

看起来-am是你想要的,但实际上它产生了一个空的列表文件。
因此,如果您的源代码是

.macro square dst, src
    mul \dst, \src, \src
    .endm
    
    square x0, x1

您可以

as -alm=foo.lst foo.s

并在foo.lst中获得以下内容:

AARCH64 GAS  foo.s          page 1

   1                        .macro square dst, src
   2                        mul \dst, \src, \src
   3                        .endm
   4                        
   5                        square x0, x1
   5 0000 207C019B  >  mul x0,x1,x1
   6

宏扩展显示在第5行。
关于您对gcc -E的评论,了解GNU工具链提供了两种完全独立的方式来在汇编中使用宏,这将有助于理解:

  • 在将源代码输入汇编程序之前,可以先通过C语言的预处理器,这样就可以使用#define风格的宏,就像Frant的答案一样。你可以自动地将文件命名为带有大写S的foo.S,然后使用gcc进行汇编,比如gcc -c foo.S
  • .macro风格的宏是由汇编器自己处理的,与C预处理器无关,这就是gcc -E没有任何作用的原因。

相关问题