gcc - PowerPC GCC 在没有 % 符号的汇编中打印寄存器

标签 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

最佳答案

当面向 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/

相关文章:

c++ - 为什么 typeid.name() 使用 GCC 返回奇怪的字符以及如何使它打印未损坏的名称?

c - 编译C文件和汇编文件时出现链接错误

cpu-registers - 使用 CPU 寄存器进行临时数据存储比使用内存位置有什么优势?

c - 禁用 SSE 的 SSE 寄存器返回

c - 有没有办法在 GCC 二进制文字中进行分组?

c++ - 强制调用者捕获返回值并在 C++ 中生成编译错误或警告的编译器标志

c - 如何在汇编语言中使用c库函数fgets?

assembly - 每个进程的内核虚拟内存包含什么?

optimization - 什么是桌面 CPU 上的 8 位寄存器?

c - 寄存器数据类型变量是否有限?