![]() |
1
3
gcc扩展
您应该使用内联汇编将这些特殊寄存器的值读入局部变量,并将它们保存到其他地方。 |
![]() |
2
2
登记册-
只有当它们被用作扩展asm语句的操作数时,才能保证它们位于指定的寄存器中( gcc manual )。这允许编译器在需要时跨函数调用溢出/重新加载寄存器。 更重要的是,为函数中的寄存器asm局部变量指定一个新值将导致编译器在函数序言/尾声中保存/恢复调用者的值。看见 this example on the Godbolt compiler explorer :
因此,您可能能够生成恰好适用于您的代码 节省物 调用方的寄存器,但如果没有内联asm,您将无法编写作为上下文切换的一部分恢复寄存器的代码。
此外,您不想保存/恢复所有8个字节的
我不知道PowerPC的调用惯例,但我猜所有的CR都是调用失败的。在只有一个标志/条件代码寄存器的ISA上,它总是调用Clobbred。 如果确实需要保存/恢复CR,则可能必须用纯asm编写整个函数,因为任何编译器生成的代码在恢复CR后都可能会破坏CR。 要保存/恢复整个CR,请参阅 this PPC ISA quick reference .
使用
|
![]() |
Darky · 多重定义…c++vsCode[重复] 2 年前 |
![]() |
Ty Q. · 分段故障GLFW3/GLAD 2 年前 |
![]() |
Noè Murr · 如何获得C函数的基本编译二进制代码? 2 年前 |
![]() |
AvirukBasak · gcc中无return语句的尾部递归 2 年前 |
![]() |
hepl · gcc如何决定在创建可执行文件时使用dynamics库? 2 年前 |