请查看以下代码片段:
int& sum(int& num1, int& num2) {
num1++;
num2++;
}
00000000 <_Z3sumRiS_>:
0: 55 push %ebp
1: 89 e5 mov %esp,%ebp
3: e8 fc ff ff ff call 4 <_Z3sumRiS_+0x4> // why here is a jump
8: 05 01 00 00 00 add $0x1,%eax
// why 0x8, my understanding is there are in total 3 parameters
// num2 -- 0xc(%ebp), num1 -- 0x8(%ebp), this -- 0x4(%ebp)
// am I right????
d: 8b 45 08 mov 0x8(%ebp),%eax
10: 8b 00 mov (%eax),%eax
12: 8d 50 01 lea 0x1(%eax),%edx // what the heck is this?
15: 8b 45 08 mov 0x8(%ebp),%eax
18: 89 10 mov %edx,(%eax)
1a: 8b 45 0c mov 0xc(%ebp),%eax
1d: 8b 00 mov (%eax),%eax
1f: 8d 50 01 lea 0x1(%eax),%edx
22: 8b 45 0c mov 0xc(%ebp),%eax
25: 89 10 mov %edx,(%eax)
27: 90 nop
28: 5d pop %ebp
29: c3 ret
我需要弄清楚每一行的意思,有点困惑。
what the heck is this?
,lea 0x1(%eax),%edx
加载了eax
指向的值,加上一,然后将结果存储在edx
中。换句话说,这是你的num1++;
的一部分——随后的存储到内存完成它。 - 500 - Internal Server Error&
引用说明了这一点。但它不是一个成员函数,所以没有this
指针。如果你在那个函数中做了auto tmp = this;
,那么它将会是一个编译时错误。 - Peter Cordes0x8(%ebx)
而不是0x4(%ebx)
开始。@PeterCordes - Edeecall
/add
是因为这是一个32位PIE,并且在禁用优化的情况下,GCC正在生成代码以获取指向GOT的指针。而您正在查看.o
的反汇编,因此链接器尚未填充偏移量。请使用objdump -drwC
(最好使用-Mintel
,除非您真的喜欢AT&T语法)。或者更好的方法是查看编译器asm输出,而不是从二进制文件中反汇编。 - Peter Cordes