切换C ++函数的callstack

时间:2009-09-03 13:24:04

标签: c++ c gcc assembly inline-assembly

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

谢谢, 詹姆斯

2 个答案:

答案 0 :(得分:2)

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

thiscall calling convention的区别仅在于谁负责从堆栈中弹出参数。在thiscall调用约定下,被调用者弹出参数(此外,this指针在ecx)中传递;在C调用约定下,调用者弹出参数。这不会影响上下文切换。

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

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

答案 1 :(得分:1)

请注意,未明确定义ABI for C ++。

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

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