我可以告诉MSVC编译器不要使用某个寄存器吗?

我可以告诉MSVC编译器不要使用某个寄存器吗?,c,visual-c++,C,Visual C++,有没有办法告诉MSVC编译器在短时间内不要修改某个寄存器?比如,在一个小循环中,为了告诉它不要使用ebx寄存器,它可以使用任何其他寄存器。在这种情况下,按下和弹出寄存器不起作用,因为在我弹出寄存器后,MSVC会自动重新排列代码以修改寄存器-它必须在那里看到某种优化。我认为您无法指示编译器不使用ebx。但是,听起来ebx在程序中的某个地方被设置为某个值,可能是您调用的函数的函数返回值的一部分,您希望ebx中的该值在程序中的某个其他点可用,可能在您要调用的另一个函数之前。那么以下可能是一种可能性:

有没有办法告诉MSVC编译器在短时间内不要修改某个寄存器?比如,在一个小循环中,为了告诉它不要使用ebx寄存器,它可以使用任何其他寄存器。在这种情况下,按下和弹出寄存器不起作用,因为在我弹出寄存器后,MSVC会自动重新排列代码以修改寄存器-它必须在那里看到某种优化。

我认为您无法指示编译器不使用ebx。但是,听起来ebx在程序中的某个地方被设置为某个值,可能是您调用的函数的函数返回值的一部分,您希望ebx中的该值在程序中的某个其他点可用,可能在您要调用的另一个函数之前。那么以下可能是一种可能性:

myFuncA(...);  // returns something in ebx
__asm push ebx
....
.... // C code
....
__asm pop ebx
myFuncB();   // wants something in ebx

注意:myFuncB可能没有参数,否则编译器可以使用ebx获取和推送参数;如果它有参数,您可能需要在asm中对整个函数调用进行编码。

听起来像是XY问题。不管你认为你需要这个寄存器做什么,没有它可能会更直接地完成。大概你在C{assembly code}中有for循环。如果你将ebx存储在一个局部变量中,然后重新加载它,那将产生与叠加它相同的效果,嘿,那也在堆栈上!编译器,还是输出可执行文件?无论哪种方式,如果您进行系统调用或硬件中断,ebx都会更改,然后再更改回来。你在干什么?@MartinJames你最后两条评论我都不明白。请解释一下。除了不编译/组装ebx的使用之外,没有办法告诉处理器不要使用ebx,为什么应用程序代码应该关心ebx在中断期间会发生什么?