,-0x8(%rbp)
1366: 48 8d 35 a1 0c 00 00 lea 0xca1(%rip),%rsi # 200e <_ZStL19piecewise_construct+0xa>
136d: 48 8d 3d cc 2c 00 00 lea 0x2ccc(%rip),%rdi # 4040 <_ZSt4cout@@GLIBCXX_3.4>
1374: e8 37 fd ff ff callq 10b0 <_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc@plt>
1379: 48 89 c2 mov %rax,%rdx
137c: 48 8b 05 4d 2c 00 00 mov 0x2c4d(%rip),%rax # 3fd0 <_ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_@GLIBCXX_3.4>
1383: 48 89 c6 mov %rax,%rsi
1386: 48 89 d7 mov %rdx,%rdi
1389: e8 32 fd ff ff callq 10c0 <_ZNSolsEPFRSoS_E@plt>
138e: 90 nop
138f: c9 leaveq
1390: c3 retq
1391: 66 2e 0f 1f 84 00 00 nopw %cs:0x0(%rax,%rax,1)
1398: 00 00 00
139b: 0f 1f 44 00 00 nopl 0x0(%rax,%rax,1)
00000000000013a0 <__libc_csu_init>:
13a0: f3 0f 1e fa endbr64
13a4: 41 57 push %r15
13a6: 4c 8d 3d bb 29 00 00 lea 0x29bb(%rip),%r15 # 3d68 <__frame_dummy_init_array_entry>
13ad: 41 56 push %r14
13af: 49 89 d6 mov %rdx,%r14
13b2: 41 55 push %r13
13b4: 49 89 f5 mov %rsi,%r13
13b7: 41 54 push %r12
13b9: 41 89 fc mov %edi,%r12d
13bc: 55 push %rbp
13bd: 48 8d 2d b4 29 00 00 lea 0x29b4(%rip),%rbp # 3d78 <__do_global_dtors_aux_fini_array_entry>
13c4: 53 push %rbx
13c5: 4c 29 fd sub %r15,%rbp
13c8: 48 83 ec 08 sub $0x8,%rsp
13cc: e8 2f fc ff ff callq 1000 <_init>
13d1: 48 c1 fd 03 sar $0x3,%rbp
13d5: 74 1f je 13f6 <__libc_csu_init+0x56>
13d7: 31 db xor %ebx,%ebx
13d9: 0f 1f 80 00 00 00 00 nopl 0x0(%rax)
13e0: 4c 89 f2 mov %r14,%rdx
13e3: 4c 89 ee mov %r13,%rsi
13e6: 44 89 e7 mov %r12d,%edi
13e9: 41 ff 14 df callq *(%r15,%rbx,8)
13ed: 48 83 c3 01 add $0x1,%rbx
13f1: 48 39 dd cmp %rbx,%rbp
13f4: 75 ea jne 13e0 <__libc_csu_init+0x40>
13f6: 48 83 c4 08 add $0x8,%rsp
13fa: 5b pop %rbx
13fb: 5d pop %rbp
13fc: 41 5c pop %r12
13fe: 41 5d pop %r13
1400: 41 5e pop %r14
1402: 41 5f pop %r15
1404: c3 retq
1405: 66 66 2e 0f 1f 84 00 data16 nopw %cs:0x0(%rax,%rax,1)
140c: 00 00 00 00
0000000000001410 <__libc_csu_fini>:
1410: f3 0f 1e fa endbr64
1414: c3 retq
Disassembly of section .fini:
0000000000001418 <_fini>:
1418: f3 0f 1e fa endbr64
141c: 48 83 ec 08 sub $0x8,%rsp
1420: 48 83 c4 08 add $0x8,%rsp
1424: c3 retq
局部对象的构造和析构
首先我们找到main函数的反汇编代码:
00000000000011e9 <main>:
11e9: f3 0f 1e fa endbr64
11ed: 55 push %rbp
11ee: 48 89 e5 mov %rsp,%rbp
11f1: 48 83 ec 10 sub $0x10,%rsp
11f5: 64 48 8b 04 25 28 00 mov %fs:0x28,%rax
11fc: 00 00
11fe: 48 89 45 f8 mov %rax,-0x8(%rbp)
1202: 31 c0 xor %eax,%eax
1204: 48 8d 45 f4 lea -0xc(%rbp),%rax
1208: be 02 00 00 00 mov $0x2,%esi
120d: 48 89 c7 mov %rax,%rdi
1210: e8 e7 00 00 00 callq 12fc <_ZN6ObjectC1Ei>
1215: 48 8d 45 f4 lea -0xc(%rbp),%rax
1219: 48 89 c7 mov %rax,%rdi
121c: e8 35 01 00 00 callq 1356 <_ZN6ObjectD1Ev>
1221: b8 00 00 00 00 mov $0x0,%eax
1226: 48 8b 55 f8 mov -0x8(%rbp),%rdx
122a: 64 48 33 14 25 28 00 xor %fs:0x28,%rdx
1231: 00 00
1233: 74 05 je 123a <main+0x51>
1235: e8 96 fe ff ff callq 10d0 <__stack_chk_fail@plt>
123a: c9 leaveq
123b: c3 retq
从main函数的反汇编代码中,我们可以看出,在main函数只构造了o2这一个对象,o2的构造函数被命名为 _ZN6ObjectC1Ei,析构函数被命名为 _ZN6ObjectD1Ev。
第10行,将对象的地址传递给rax寄存器。
第11行,将括号中的参数传递给寄存器esi。
第12行,将rax寄存器的地址传递给隐藏参数&obj(this指针)。
在第16行,调用析构函数,释放函数占用的资源。
构造函数:
00000000000012fc <_ZN6ObjectC1Ei>:
12fc: f3 0f 1e fa endbr64
1300: 55 push %rbp
1301: 48 89 e5 mov %rsp,%rbp
1304: 48 83 ec 10 sub $0x10,%rsp
1308: 48 89 7d f8 mov %rdi,-0x8(%rbp)
130c: 89 75 f4 mov %esi,-0xc(%rbp)
130f: 48 8b 45 f8 mo
|