程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了GCC 将汇编引脚局部变量扩展到除 r12 之外的任何寄存器大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决GCC 将汇编引脚局部变量扩展到除 r12 之外的任何寄存器?

开发过程中遇到GCC 将汇编引脚局部变量扩展到除 r12 之外的任何寄存器的问题如何解决?下面主要结合日常开发的经验,给出你关于GCC 将汇编引脚局部变量扩展到除 r12 之外的任何寄存器的解决方法建议,希望对你解决GCC 将汇编引脚局部变量扩展到除 r12 之外的任何寄存器有所启发或帮助;

基本上,我正在寻找一种将临时文件固定到除 r12 之外的任何寄存器的方法。

我知道我可以“提示”编译器固定到单个寄存器:

// Toy example. ObvIoUsly an unbalanced `pop` in 
// extended assembly will cause serIoUs problems.

register long tmp asm("rdi"); // or just clober rdi and use it directly.
asm volatile("pop %[tmp]\n"   // using pop hence don't want r12
             : [tmp] "=&r" (tmp)
             :
             :);

这通常可以避免r12,但可能会在其他地方弄乱编译器的寄存器分配。

是否可以在不强制编译器使用单个寄存器的情况下执行此操作?

解决方法

请注意,register asm 并没有真正将变量“固定”到寄存器,它只是确保将该变量用作内联 asm 中的操作数将使用该寄存器。原则上,变量可以存储在两者之间的其他地方。见https://gcc.gnu.org/onlinedocs/gcc-11.1.0/gcc/Local-Register-Variables.html#Local-Register-Variables。但听起来您真正需要的是确保您的 pop 指令不使用 r12为其操作数,可能是因为 Why is POP slow when using register R12?。我不知道有什么方法可以做到这一点,但这里有一些可能会有所帮助的选项。

寄存器 rax,rbx,rcx,rdx,rsi,rdi 每个都有自己的约束字母 a,b,c,d,S,D(其他寄存器没有)。所以你可以做到一半以上

long tmp;
asm volatile("pop %[tmp]\n"
             : [tmp] "=&abcdSD" (tmp)
             :
             :);

通过这种方式,编译器可以选择这六个寄存器中的任何一个,这应该会给寄存器分配器带来更大的灵活性。

另一种选择是声明你的 asm clobbers r12,这将阻止编译器在那里分配操作数:

long tmp;
asm volatile("pop %[tmp]\n"
             : [tmp] "=&r" (tmp)
             :
             : "r12");

权衡是它也不会使用 r12asm 缓存局部变量,因为它假定它可能会被修改。希望它足够聪明,完全避免在代码的那部分使用 r12,但如果不能,它可能会发出额外的寄存器移动或溢出到 asm 周围的堆栈。尽管如此,它不如 -ffixed-r12 残酷,后者会阻止编译器在整个源文件中的任何位置使用 r12


未来的读者应该注意,在 x86-64 上修改 inline asm 内部的堆栈指针通常是不安全的。编译器假定 rsp 不会被内联 asm 更改,并且它可以随时通过相对于 rsp 具有恒定偏移量的有效地址访问堆栈变量。此外,x86-64 使用 red zone,因此即使是 push/pop 对也是不安全的,因为 rsp 下可能存储了重要数据。 (意外的 pop 可能意味着其他重要数据不再在红色区域中,因此会被信号处理程序覆盖。)因此,除非您“愿意在每次重新编译后仔细阅读生成的程序集,以确保编译器没有决定做任何这些事情。 (在您提出要求之前,您无法通过声明 rsp 的破坏来解决此问题;这是不受支持的。)

大佬总结

以上是大佬教程为你收集整理的GCC 将汇编引脚局部变量扩展到除 r12 之外的任何寄存器全部内容,希望文章能够帮你解决GCC 将汇编引脚局部变量扩展到除 r12 之外的任何寄存器所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。