PowerPC GCC打印在没有%符号的程序集中注册

时间:2017-07-04 15:36:38

标签: gcc assembly cpu-registers powerpc

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

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

例如,void nop () {} with gcc4.8 PowerPC -O0 -mregnames

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

2 个答案:

答案 0 :(得分:6)

在定位PowerPC时,您基本上有两种方法可用于汇编列表的语法:

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

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

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

答案 1 :(得分:2)

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

使用-mregnames时,可以使用"%r0"或" r0"或" 0"汇编源代码文件中的寄存器名称格式。

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

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