2010-03-31 3 views
2

좀 C++ 코드 (objdump에서) GCC (4)는 다음과 같은 어셈블리로 컴파일"전화"명령

#include <cstdio> 
#include <boost/bind.hpp> 
#include <boost/function.hpp> 

class A { 
public: 
    void do_it() { std::printf("aaa"); } 
}; 

void 
call_it(const boost::function<void()> &f) 
{ 
    f(); 
} 

void 
func() 
{ 
    A *a = new A; 
    call_it(boost::bind(&A::do_it, a)); 
} 

가 있습니다

00000030 <func()>: 
    30: 55      push %ebp 
    31: 89 e5     mov %esp,%ebp 
    33: 56      push %esi 
    34: 31 f6     xor %esi,%esi 
    36: 53      push %ebx 
    37: bb 00 00 00 00   mov $0x0,%ebx 
    3c: 83 ec 40    sub $0x40,%esp 
    3f: c7 04 24 01 00 00 00 movl $0x1,(%esp) 
    46: e8 fc ff ff ff   call 47 <func()+0x17> 
    4b: 8d 55 ec    lea 0xffffffec(%ebp),%edx 
    4e: 89 14 24    mov %edx,(%esp) 
    51: 89 5c 24 04    mov %ebx,0x4(%esp) 
    55: 89 74 24 08    mov %esi,0x8(%esp) 
    59: 89 44 24 0c    mov %eax,0xc(%esp) 
    ; the rest of the function is omitted 

나는 이해할 수 없다 여기에 call 명령어의 피연산자가 있습니다. 왜 그 자체가 호출 되나, 1 바이트 꺼져 있습니까?

+2

우리는 C++ 코드도 볼 수 있을까요? –

+0

@Andreas Brinck 업데이트. –

답변

11

호출이 외부 함수에 대한 것일 수 있으며 표시되는 주소 (FFFFFFFC)는 링커 및/또는 로더가 나중에 처리 할 실제 주소의 자리 표시 자일뿐입니다.

+0

네 정답입니다. 연결되지 않은 .o 파일을 objdump하면 이들 중 많은 수를 볼 수 있습니다. –

+0

예, 그게 전부입니다. 사실, 나는 .o 파일을 objdumping했다. –