【问题标题】:PowerPC GCC Print registers in assembly without % signPowerPC GCC 在没有 % 符号的汇编中打印寄存器
【发布时间】:2017-12-08 03:42:46
【问题描述】:

在 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

【问题讨论】:

  • 如果省略%,寄存器可能会与符号混淆:) 为什么要这样做?手册似乎没有办法做到这一点。
  • @Jester:我已经习惯在没有它们的情况下阅读汇编
  • 如果是供您个人阅读,显然只需搜索和替换 %r[0-9]+ 即可。
  • @Jester:是的,但这看起来很麻烦,但感谢你的建议,如果这是你能做的最好的事情
  • 专业提示:将装配列表发布为 文本,而不是图像。

标签: gcc assembly cpu-registers powerpc


【解决方案1】:

当面向 PowerPC 时,对于汇编列表的语法,您基本上有两种选择:

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

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

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

【讨论】:

  • 请注意,objdump 默认情况下会生成“r 前缀而没有%”格式。试图弄清楚如何使 gcc 产生这种格式是我来到这里的原因,但 %r 前缀对我的目的同样适用。
【解决方案2】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-24
    • 2018-01-10
    • 2011-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多