这是我之前关于切换 C 调用堆栈的问题。但是,C++ 使用不同的调用约定(thiscall)并且可能需要一些不同的 asm 代码。有人可以解释差异并指出或提供一些切换 C++ 调用堆栈的代码片段(最好在 GCC 内联 asm 中)吗?
谢谢,詹姆斯
上一个问题中给出的代码应该可以正常工作。
thiscall 调用约定的不同之处仅在于谁负责将参数从堆栈中弹出。在 thiscall 调用约定下,被调用者弹出参数(另外,this
指针被传入ecx
);在 C 调用约定下,调用者弹出参数。这不会影响上下文切换。
但是,如果您要自己进行上下文切换,请注意除了切换堆栈之外,您还需要保存和恢复寄存器(可能在堆栈上)。
请注意,顺便说一句,C++ 并不总是使用 thiscall ——它只用于具有固定数量参数的方法(除此之外,它是微软主义...... g++ 不使用它)。
注意 C++ 的 ABI 没有明确定义。
这个想法是编译器制造商能够针对这种情况使用最佳调用约定,从而使 C++ 更快。
不利的一面是每个编译器都有自己的调用约定,因此来自不同编译器的代码不兼容(即使来自同一编译器的不同版本(甚至不同优化标志)的代码也可能不兼容)。