2013-09-30 12 views
8

我正在研究C++如何通過彙編語言調用正確的成員函數。 簡單的程序,我帶着舉例如下:在登記冊前放置一顆星星的含義是什麼?

class A       
{        
    public:      
     virtual void show() {} 
};        

class B : public A    
{        
    public:      
     void show() {}   
};        


int main()      
{        
    A* pA = new B;    
    pA->show();     

    return 0;     
}        

其組裝是因爲以下幾點:

main: 
.LFB2: 
    .cfi_startproc 
    .cfi_personality 0x3,__gxx_personality_v0 
    pushq %rbp 
    .cfi_def_cfa_offset 16 
    movq %rsp, %rbp 
    .cfi_offset 6, -16 
    .cfi_def_cfa_register 6 
    pushq %rbx 
    subq $24, %rsp 
    movl $8, %edi 
    .cfi_offset 3, -24 
    call _Znwm   <<<================ 1 
    movq %rax, %rbx 
    movq %rbx, %rax 
    movq %rax, %rdi 
    call _ZN1BC1Ev 
.L11: 
    movq %rbx, %rax 
    movq %rax, -24(%rbp) 
    movq -24(%rbp), %rax 
    movq (%rax), %rax 
    movq (%rax), %rdx 
    movq -24(%rbp), %rax 
    movq %rax, %rdi 
    call *%rdx    <<<=== 2 
    movl $0, %eax 
    addq $24, %rsp 
    popq %rbx 
    leave 
    ret 
    .cfi_endproc 

我的問題是:

  1. 我搜索谷歌爲NWM,它只告訴我,C++使用它來分配內存, 可能有人告訴我更多關於它的內容嗎?它在一個lib中嗎?如果可能,我可以得到它的源代碼嗎?怎麼樣?
  2. 我對這個語法不太熟悉,它想做什麼?
+2

你的代碼泄漏內存,順便說一句...每一個新的必須與刪除匹配... – Goz

+4

@Goz:Alex有機會已經知道這一點,只是想創建一個[Short,Self Contained,Correct(Compilable),Example](http://meta.stackexchange.com/questions/22754/sscce-how-to-provide-examples-for-programming-questions)。 –

+0

@Goz,我認爲Martin Liversage已經回答了您的問題,謝謝Martin的回答,並感謝Goz爲我指出了這一點。 – Alex

回答

11

*用於AT & T調用或跳轉指令的彙編語法之前。這意味着它將跳轉到寄存器中包含的地址。另一種方法是相對於當前指令的相對跳轉。

GNU as manual

AT &Ť絕對(而不是相對PC) 跳轉/呼叫操作數通過'*'前綴;它們在 英特爾語法中未被限制。

在你的代碼中,有一個調用寄存器中的地址是有意義的。調用pA->show()需要查看正確的函數是什麼。這是因爲它是A類的虛函數。

+0

我寫這個是爲了確保我正確理解它。根據您提供的鏈接,是否意味着它會調用從該寄存器中存儲的地址開始的函數? – Alex

+0

@GavinSmith,寄存器是否可以包含一個可以跳轉的偏移量,而不是絕對地址?否則,這個引用無論如何都是沒有意義的。 – Devolus

+1

@Devolus對兩者都是。我已經更新了我的答案以涵蓋此內容。 –

相關問題