关于 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
最佳答案
当面向 PowerPC 时,对于汇编列表的语法,您基本上有两种选择:
您可以使用 IBM 语法(在 IBM 汇编程序上很常见),其中寄存器不使用任何类型的特殊前缀:它们只是用数字引用。是的,这使得很难将它们与立即数区分开来。
或者,您可以使用 Gnu/AT&T 语法,它总是在寄存器前加上 %
符号(在这种情况下是 r
)。这不仅使区分寄存器和立即数更容易,而且还可以区分整数寄存器(%r?
)和浮点寄存器(%f?
)。
没有中间选项,您可以获得 r
(或 f
)前缀,但没有前导 %
。如果你需要这个,你可以像 Jester 建议的那样对输出进行后处理,使用正则表达式 %r[0-9]+
进行匹配。
关于gcc - PowerPC GCC 在没有 % 符号的汇编中打印寄存器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44909835/