根据 MSDN 文档,当使用类函数的默认__thiscall调用约定时,“this”指针存储在 ECX 中。尽管在翻译常规 C++ 代码时肯定会出现这种情况,但我在尝试使用内联汇编访问“this”时遇到了问题。
这是测试程序:
#include <cstdio>
class TestClass
{
long x;
public:
inline TestClass(long x):x(x){}
public:
inline long getX1(){return x;}
inline long getX2()
{
_asm
{
mov eax,dword ptr[ecx]
}
}
};
int main()
{
TestClass c(42);
printf("c.getX1() = %d\n",c.getX1());
printf("c.getX2() = %d\n",c.getX2());
return 0;
}
两个 Get 函数翻译如下:
?getX1@TestClass@@QAEJXZ (public: long __thiscall TestClass::getX1(void)):
00000000: 8B 01 mov eax,dword ptr [ecx]
00000002: C3 ret
?getX2@TestClass@@QAEJXZ (public: long __thiscall TestClass::getX2(void)):
00000000: 8B 01 mov eax,dword ptr [ecx]
00000002: C3 ret
我认为可以肯定地说这两个功能是相同的。然而,这是程序的输出:
c.getX1() = 42
c.getX2() = 1
显然,当调用第二个 Get 函数时,“this”不会存储在 ECX 中,所以我的问题是:如何确保包含内联汇编的类函数遵循调用约定和/或以与常规/非内联相同的方式调用职能?
编辑:主要功能是这样翻译的:
_main:
00000000: 51 push ecx
00000001: 6A 2A push 2Ah
00000003: 68 00 00 00 00 push offset $SG3948
00000008: E8 00 00 00 00 call _printf
0000000D: 83 C4 08 add esp,8
00000010: 8D 0C 24 lea ecx,[esp]
00000013: E8 00 00 00 00 call ?getX2@TestClass@@QAEJXZ
00000018: 50 push eax
00000019: 68 00 00 00 00 push offset $SG3949
0000001E: E8 00 00 00 00 call _printf
00000023: 33 C0 xor eax,eax
00000025: 83 C4 0C add esp,0Ch
00000028: C3 ret