Macros Gnu汇编程序:在宏参数中计算符号?

Macros Gnu汇编程序:在宏参数中计算符号?,macros,gnu-assembler,Macros,Gnu Assembler,在GNU汇编程序(v.2.31.1)中,我希望将.eq(或.set)设置的符号传递给宏。 作为ARM上的一个示例,我想将整数符号转换为字符串: .equ WIDTH, 100 .macro numToString label, num \label : .asciz "\num" .equ \label\()Len, .-\label .endm numToString xyzWidthStr, WIDTH 但是,这会导致以空结尾的字符串“WIDTH”而不是“100”出现标签“xyzWid

在GNU汇编程序(v.2.31.1)中,我希望将.eq(或.set)设置的符号传递给宏。 作为ARM上的一个示例,我想将整数符号转换为字符串:

.equ WIDTH, 100

.macro numToString label, num
\label :
.asciz "\num"
.equ \label\()Len, .-\label
.endm

numToString xyzWidthStr, WIDTH
但是,这会导致以空结尾的字符串“WIDTH”而不是“100”出现标签“xyzWidthStr”。是否有办法强制宏在使用参数之前对其求值/替换

是否有办法强制宏在使用参数之前对其求值/替换

您可以使用C预处理器在

#定义宽度100

使用arm gcc组装(不是arm as)。如果文件扩展名是
.S
.sx
,gcc将在组装文件之前调用文件的C预处理器。如果使用不同的扩展名,则可以

armgcc-x汇编程序,带有cpp code.asm


如果要查看中间的预处理代码,请将
-save temps
添加到
。gcc将把它保存到
code.s

谢谢你的回答!我知道CPP或M4,但我特别感兴趣的是GAS宏是否可以用这种方式编写。如果您更喜欢GAS宏,那么将宽度定义为.macro?此时对numToString的“调用”会是什么样子?如果这真的是唯一的方法,我会接受这个答案,因为我不可能按照我想要的方式将GAS宏与.eq一起使用。