PowerPC GCC 在没有 % 符号的情况下在程序集中打印寄存器
PowerPC GCC Print registers in assembly without % sign
在 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 建议的那样 post-process 输出,使用正则表达式 %r[0-9]+
进行匹配。
一个更新:
powerpc-linux-gnu-gcc 版本 5.4.0(默认包 Ubuntu 16.04)
使用 -mregnames 时,您可以在汇编源代码文件中使用“%r0”或"r0"或“0”格式作为寄存器名称。
对于反汇编,powerpc-linux-gnu-objdump 默认为 "r0" 格式(我同意这种格式更容易阅读)。
在该网页的示例中,它似乎显示了编译器的列表输出,而不是使用 objdump。我不知道有什么方法可以控制列表输出格式。
在 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 建议的那样 post-process 输出,使用正则表达式 %r[0-9]+
进行匹配。
一个更新:
powerpc-linux-gnu-gcc 版本 5.4.0(默认包 Ubuntu 16.04)
使用 -mregnames 时,您可以在汇编源代码文件中使用“%r0”或"r0"或“0”格式作为寄存器名称。
对于反汇编,powerpc-linux-gnu-objdump 默认为 "r0" 格式(我同意这种格式更容易阅读)。
在该网页的示例中,它似乎显示了编译器的列表输出,而不是使用 objdump。我不知道有什么方法可以控制列表输出格式。