4

这是我之前关于切换 C 调用堆栈的问题。但是,C++ 使用不同的调用约定(thiscall)并且可能需要一些不同的 asm 代码。有人可以解释差异并指出或提供一些切换 C++ 调用堆栈的代码片段(最好在 GCC 内联 asm 中)吗?

谢谢,詹姆斯

4

2 回答 2

2

上一个问题中给出的代码应该可以正常工作。

thiscall 调用约定的不同之处仅在于谁负责将参数从堆栈中弹出。在 thiscall 调用约定下,被调用者弹出参数(另外,this指针被传入ecx);在 C 调用约定下,调用者弹出参数。这不会影响上下文切换。

但是,如果您要自己进行上下文切换,请注意除了切换堆栈之外,您还需要保存和恢复寄存器(可能在堆栈上)。

请注意,顺便说一句,C++ 并不总是使用 thiscall ——它只用于具有固定数量参数的方法(除此之外,它是微软主义...... g++ 不使用它)。

于 2009-09-03T14:57:22.733 回答
2

注意 C++ 的 ABI 没有明确定义。

这个想法是编译器制造商能够针对这种情况使用最佳调用约定,从而使 C++ 更快。

不利的一面是每个编译器都有自己的调用约定,因此来自不同编译器的代码不兼容(即使来自同一编译器的不同版本(甚至不同优化标志)的代码也可能不兼容)。

于 2009-09-03T20:14:19.107 回答