2013-09-30 16 views
8

Ich studiere, wie C++ die richtigen Elementfunktionen durch Assemblersprache aufruft. Das einfache Programm, das ich mit kommen, ist wie folgt:Was bedeutet es, einen Stern vor ein Register zu setzen?

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

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


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

    return 0;     
}        

seiner Montage als die folgende ist:

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 

meine Fragen sind:

  1. ich Google für NWM gesucht, es sagt mir nur, dass C++ es verwendet, um Speicher zuzuweisen, könnte jemand mir mehr darüber erzählen? ist es in einer lib? Wenn möglich, kann ich den Quellcode bekommen? Wie?
  2. ich bin nicht vertraut mit dieser Syntax, was will es tun?
+2

Ihr Code leckt Speicher, BTW ... jeder neue muss mit einem löschen übereinstimmen ... – Goz

+4

@Goz: Die Chancen stehen, dass Alex das bereits weiß und einfach wollte Erstellen Sie ein [Short, Self Contained, Correct (Compilable), Beispiel] (http://meta.stackexchange.com/questions/22754/sscce-how-to-provide-example-for-programming-questions). –

+0

@Goz, ich denke, dass Martin Liversage schon deine Bedenken beantwortet hat, danke Martin für deine Antwort und danke Goz, dass er es auf mich gerichtet hat. – Alex

Antwort

11

Die * wird vor absoluten Adressen in AT & T Assembly-Syntax für Aufruf oder Sprung Anweisungen verwendet. Dies bedeutet, dass es zu der Adresse springt, die in dem Register enthalten ist. Die Alternative ist ein relativer Sprung, der relativ zur aktuellen Anweisung ist.

Vom GNU as manual:

AT & T absoluten (im Gegensatz zu PC relativ gegen) Sprung/Aufruf Operanden von `* 'vorangestellt werden; Sie sind in Intel-Syntax unbegrenzt.

In Ihrem Code ist es sinnvoll, dass Sie eine Adresse in einem Register anrufen. Aufruf pA->show() erfordert ein Nachschlagen, um zu sehen, was die richtige Funktion aufgerufen werden soll. Dies ist, weil es eine virtuelle Funktion auf Klasse A ist.

+0

Ich schreibe dies, um sicherzustellen, dass ich es richtig verstehe. Laut dem von Ihnen angegebenen Link bedeutet das, dass die Funktion aufgerufen wird, die an der in diesem Register gespeicherten Adresse beginnt? – Alex

+0

@GavinSmith, Kann ein Register auch einen Offset enthalten, zu dem Sie springen könnten, anstatt eine absolute Adresse? Sonst würde dieses Zitat ohnehin keinen Sinn ergeben. – Devolus

+1

@Devolus Ja zu beiden. Ich habe meine Antwort aktualisiert, um dies zu erfassen. –

Verwandte Themen