thiscall是C++中的非静态类成员函数的默认调用约定,对象的每个函数隐含接收this参数。采用thiscall约定时,函数的参数按照从右到左的顺序入栈,被调用的函数在返回前清理传送参数的栈。
#include <iostream>
class csum
{
public:
int add(int a, int b) /* 实际上原型 add(this, int a, int b) */
{
return (a + b);
}
};
int main()
{
csum sum;
sum.add(1, 2);
return 0;
}
/*
int main()
{
1189: f3 0f 1e fa endbr64
118d: 55 push %rbp
118e: 48 89 e5 mov %rsp,%rbp # rbp = rsp
1191: 48 83 ec 10 sub $0x10,%rsp # 申请两个8字节栈空间
1195: 64 48 8b 04 25 28 00 mov %fs:0x28,%rax # 把fs的偏移值x28放入rax
# 指向特定于线程或定义的结构
# %fs:0x28主要起金丝雀的作用,
# 防止overflow的,即进行安全保护
119c: 00 00
119e: 48 89 45 f8 mov %rax,-0x8(%rbp) # rbp-0x8 = rax
11a2: 31 c0 xor %eax,%eax # eax 清零
csum sum;
sum.add(1, 2);
11a4: 48 8d 45 f7 lea -0x9(%rbp),%rax # rbp-0x9的地址放入rax,即this指针
11a8: ba 02 00 00 00 mov $0x2,%edx # edx = 2
11ad: be 01 00 00 00 mov $0x1,%esi # esi = 1
11b2: 48 89 c7 mov %rax,%rdi # rdi = rax = this
11b5: e8 82 00 00 00 callq 123c <_ZN4csum3addEii>
return 0;
11ba: b8 00 00 00 00 mov $0x0,%eax # 返回值
}
000000000000123c <_ZN4csum3addEii>:
int add(int a, int b)
123c: f3 0f 1e fa endbr64
1240: 55 push %rbp
1241: 48 89 e5 mov %rsp,%rbp
1244: 48 89 7d f8 mov %rdi,-0x8(%rbp) # rbp-0x8 = rdi = this
1248: 89 75 f4 mov %esi,-0xc(%rbp) # rbp-0xc = esi = 1
124b: 89 55 f0 mov %edx,-0x10(%rbp) # rbp-0x10 = edx = 2
return (a + b);
124e: 8b 55 f4 mov -0xc(%rbp),%edx # 1
1251: 8b 45 f0 mov -0x10(%rbp),%eax # 2
1254: 01 d0 add %edx,%eax # edx = 1 + 2
}
1256: 5d pop %rbp
1257: c3 retq
*/