0x8049413 <main+19>: mov %eax,%eax
0x8049415 <main+21>: mov %eax,%ebx
0x8049417 <main+23>: push %ebx
0x8049418 <main+24>: call 0x804c90c <__8MyClass1>
0x804941d <main+29>: add $0x4,%esp
0x8049420 <main+32>: mov %eax,%esi
0x8049422 <main+34>: jmp 0x8049430 <main+48>
0x8049424 <main+36>: call 0x8049c3c <__throw>
0x8049429 <main+41>: lea 0x0(%esi,1),%esi
0x8049430 <main+48>: mov %esi,0xfffffff8(%ebp)
0x8049433 <main+51>: push $0x24
0x8049435 <main+53>: call 0x804b580 <__builtin_new>
0x804943a <main+58>: add $0x4,%esp
0x804943d <main+61>: mov %eax,%eax
0x804943f <main+63>: mov %eax,%esi
0x8049441 <main+65>: push %esi
0x8049442 <main+66>: call 0x804c8ec <__8MyClass2>
0x8049447 <main+71>: add $0x4,%esp
0x804944a <main+74>: mov %eax,%edi
0x804944c <main+76>: jmp 0x8049455 <main+85>
0x804944e <main+78>: mov %esi,%esi
0x8049450 <main+80>: call 0x8049c3c <__throw>
0x8049455 <main+85>: mov %edi,0xfffffffc(%ebp)
0x8049458 <main+88>: push $0x804cda2
0x804945d <main+93>: mov 0xfffffff8(%ebp),%eax
0x8049460 <main+96>: push %eax
0x8049461 <main+97>: call 0x804c930 <SetBuffer__9BaseClassPc>
0x8049466 <main+102>: add $0x8,%esp
0x8049469 <main+105>: push $0x804cdaa
---Type <return> to continue, or q <return> to quit---
0x804946e <main+110>: mov 0xfffffffc(%ebp),%eax
0x8049471 <main+113>: push %eax
0x8049472 <main+114>: call 0x804c930 <SetBuffer__9BaseClassPc>
0x8049477 <main+119>: add $0x8,%esp
0x804947a <main+122>: mov 0xfffffff8(%ebp),%edx
0x804947d <main+125>: mov 0x20(%edx),%eax
0x8049480 <main+128>: add $0x8,%eax
0x8049483 <main+131>: mov 0xfffffff8(%ebp),%edx
0x8049486 <main+134>: push %edx
0x8049487 <main+135>: mov (%eax),%edi
0x8049489 <main+137>: call *%edi
0x804948b <main+139>: add $0x4,%esp
0x804948e <main+142>: mov 0xfffffffc(%ebp),%edx
0x8049491 <main+145>: mov 0x20(%edx),%eax
0x8049494 <main+148>: add $0x8,%eax
0x8049497 <main+151>: mov 0xfffffffc(%ebp),%edx
0x804949a <main+154>: push %edx
0x804949b <main+155>: mov (%eax),%edi
0x804949d <main+157>: call *%edi
0x804949f <main+159>: add $0x4,%esp
0x80494a2 <main+162>: xor %eax,%eax
0x80494a4 <main+164>: jmp 0x80494d0 <main+208>
0x80494a6 <main+166>: jmp 0x80494d0 <main+208>
0x80494a8 <main+168>: push %ebx
0x80494a9 <main+169>: call 0x804b4f0 <__builtin_delete>
0x80494ae <main+174>: add $0x4,%esp
0x80494b1 <main+177>: jmp 0x8049424 <main+36>
0x80494b6 <main+182>: push %esi
0x80494b7 <main+183>: call 0x804b4f0 <__builtin_delete>
0x80494bc <main+188>: add $0x4,%esp
0x80494bf <main+191>: jmp 0x8049450 <main+80>
0x80494c1 <main+193>: jmp 0x80494c8 <main+200>
0x80494c3 <main+195>: call 0x8049c3c <__throw>
0x80494c8 <main+200>: call 0x8049fc0 <terminate__Fv>
0x80494cd <main+205>: lea 0x0(%esi),%esi
0x80494d0 <main+208>: lea 0xffffffec(%ebp),%esp
0x80494d3 <main+211>: pop %ebx
0x80494d4 <main+212>: pop %esi
0x80494d5 <main+213>: pop %edi
---Type <return> to continue, or q <return> to quit---
0x80494d6 <main+214>: leave
0x80494d7 <main+215>: ret
0x80494d8 <main+216>: nop
0x80494d9 <main+217>: nop
0x80494da <main+218>: nop
0x80494db <main+219>: nop
0x80494dc <main+220>: nop
0x80494dd <main+221>: nop
0x80494de <main+222>: nop
0x80494df <main+223>: nop
End of assembler dump.
(gdb)
以下是对该程序汇编代码的解释:
0x8049400 <main>: push %ebp
0x8049401 <main+1>: mov %esp,%ebp
0x8049403 <main+3>: sub $0x8,%esp
0x8049406 <main+6>: push %edi
0x8049407 <main+7>: push %esi
0x8049408 <main+8>: push %ebx
构建堆栈。为Object[]数组保留8个字节(即两个4字节指针地址),则Object[0]的指针存放在0xfffffff8(%ebp),Object[1]的指针存放在0fffffffc(%ebp)。接着保存寄存器。
0x8049409 <main+9>: push $0x24
0x804940b <main+11>: call 0x804b580 <__builtin_new>
0x8049410 <main+16>: add $0x4,%esp
首先调用__builtin_new,在堆(heap)中分配0x24(36字节)给Object[0],并将其首地址保存到EAX寄存器中。这36字节中前32字节是Buffer变量的,后4字节由VPTR占用。
0x8049413 <main+19>: mov %eax,%eax
0x8049415 <main+21>: mov %eax,%ebx
0x8049417 <main+23>: push %ebx
0x8049418 <main+24>: call 0x804c90c <__8MyClass1>
0x804941d <main+29>: add $0x4,%esp