PowerPC GCC Print在汇编中寄存器,不带%符号



在Matt Godbolt的Compiler Explorer网站上,您可以使用各种预安装的编译器编译代码。 使用PowerPC gcc 4.8时,无法将寄存器与即时寄存器区分开来(例如addi 11,31,16)。

但是,当使用-mregnames选项时,所有寄存器都标有%r,后跟寄存器索引。如何省略%符号以获得r1而不是%r1

例如,使用 gcc4.8 PowerPC-O0 -mregnamesvoid nop () {}

nop():
stwu %r1,-16(%r1)
stw %r31,12(%r1)
mr %r31,%r1
addi %r11,%r31,16
lwz %r31,-4(%r11)
mr %r1,%r11
blr

当面向 PowerPC 时,基本上有两个程序集列表语法选项:

您可以使用 IBM 语法(在 IBM 汇编程序上很常见),其中寄存器不使用任何类型的特殊前缀:它们只是用数字引用。是的,这使得很难将它们与即时区分开来。

或者,您可以使用 Gnu/AT&T 语法,它总是在寄存器前面加上%符号(在本例中为r)。这不仅使得区分寄存器和即时寄存器更容易,而且还使得区分整数寄存器(%r?)和浮点寄存器(%f?)成为可能。

没有中间选项,您可以在其中获得r(或f)前缀,但没有前导%。如果需要,您可以按照 Jester 的建议进行操作,并使用正则表达式%r[0-9]+进行匹配对输出进行后处理。

更新:
powerpc-linux-gnu-gcc 版本 5.4.0(Ubuntu 16.04 的默认软件包)

使用-mregnames 时,可以在程序集源代码文件中对寄存器名称使用"%r0"或"r0"或"0"格式。

对于反汇编,powerpc-linux-gnu-objdump默认为"r0"格式(我同意它更容易阅读)。

在该网页的示例中,它看起来像是显示编译器的列表输出,而不是使用 objdump。我不知道控制列表输出格式的方法。

最新更新