是否可以在不使用汇编的情况下告诉clang哪些寄存器用于代码的某些部分
Is it possible to tell clang which registers to use for certain parts of the code without using assembly
我正在进行一个项目,该项目要求它同时在Linux和Windows上运行
但是,由于clang
和msvc
下的寄存器不同,有些代码在Linux上不起作用。
是否有方法使寄存器使用一致或请求clang
在操作期间使用特定寄存器?我想找到一个不涉及重写程序集中部分的解决方案。以下是我所说的不同输出代码。
https://godbolt.org/z/DO9pQN
感谢您的帮助。
编辑每条注释:
这是用于模拟器的,因此某些寄存器用于某些任务。其中一件主要的事情是,我们对某个变量使用RSI,然后clang在函数调用中使用RSI。编译的MSVC不会遇到同样的问题。
编辑2每条评论:
这是针对xbox360模拟器Xenia的
我们目前正在努力完成Linux方面的工作。然而,clang在函数调用中使用与存储上下文相同的寄存器时遇到了问题
我们的想法是要求clang不要使用那个特定的寄存器,但如果不在Assembly中写下来,我就找不到方法。该解决方案的另一个问题是gcc
在不同的寄存器上可能也有相同的问题。具体来说,我们正在研究ppc测试。上面的链接是clang与msvc相比的输出。
以下是相关代码:
-
https://github.com/xenia-project/xenia/blob/e79e18bb271212b13bcb65a610d957b6058f34db/src/xenia/cpu/backend/x64/x64_backend.cc
-
https://github.com/xenia-project/xenia/blob/master/src/xenia/cpu/ppc/testing/ppc_testing_main.cc
rsi
不能在linux上用于您自己的目的,因为它在函数调用约定psABI-x86_64 中使用
但是,如果您可以使用其他寄存器作为用Gcc编译的r10
代码,并且选项-ffixed-r10
将不使用r10
(演示)。
- 本质:使用__128寄存器
- 将寄存器设计成可由C和C++访问的外设的最佳实践
- 在模拟器中使用并集来模拟CPU寄存器有多合适
- 使用英特尔 PIN 修改寄存器
- AVX 指令中寄存器和指针之间的客观差异
- 如何确定我的处理器有多少个 AVX 寄存器?
- 除非使用某些寄存器,否则函数挂钩会崩溃
- 寄存器上的管道计算
- 其中关于内存和寄存器的左值和右值
- 有没有办法强制C++编译器将变量存储在寄存器中?
- "变量":函数中函数作用域不允许初始化的自动或寄存器变量'naked'
- Atmel Studio:返回一个包含数组的寄存器
- 使用 googletest 测试嵌入式C++代码时处理外设寄存器的重复符号
- 移位寄存器74HC595输出电流
- 超过255的Modbus寄存器无法访问SimpleModbus
- 如何在程序集函数中将元素数组作为参数传递时转发 ARM 寄存器的地址指针
- xmm 寄存器中的__m128何时?
- 是否可以在 GCC 中使用带有 C++17 的显式寄存器变量?
- 是否可以在不使用汇编的情况下告诉clang哪些寄存器用于代码的某些部分
- 为什么gcc/clang使用两个128位的xmm寄存器来传递单个值