Frage

Ich habe über den Zweck philosophiert ein wenig stapeln und nach einiger Codierung i herausgefunden, was es ist Stärke ist. Das einzige, was in meiner stomache liegt, ist, wie es mit Funktionen funktioniert? Ich habe versucht, eine einfache Funktion zum Hinzufügen von zwei Zahlen mit Universalregistern zu machen, aber ich nehme an, das ist nicht, wie es zum Beispiel in C funktioniert .. wo sind alle Parameter, lokale Variablen und wo das Ergebnis gespeichert?

Wie würden Sie dieses umschreiben Assembler? (Wie für C-Compiler würde es neu schreiben?)

int function(int a, int &b, int *c){
 return a*(b++)+(*c);
}

Ich weiß, das Beispiel irgendwie saugt .. aber auf diese Weise ich alle Möglichkeiten verstehen

War es hilfreich?

Lösung

Was Sie suchen ist, Informationen über Aufrufkonventionen . Die Art und Weise, die Funktionen aufgerufen werden und zurückgegeben wird, ist abhängig von vielen Faktoren ab, einschließlich der Prozessorarchitektur, Compiler und Betriebssystem. Der Anrufer und der Angerufene muss auf dem Kongress, um Parameter und Rückgabewert übereinstimmen korrekt weitergeleitet werden.

Andere Tipps

Zunächst einmal, Referenzen (int&) sind nicht in C, nur C ++.

Wenn Sie sehen wollen, was mit gcc unter der Haube passiert, verwenden Sie die -S Flagge. Sie brauchen nicht ein tatsächliches Programm haben.

g++ -S func.c

erstellt eine Datei func.s, die (minus Kopf- und solche, auf einer x86-Box):

    .text
.globl __Z8functioniRiPi
__Z8functioniRiPi:
LFB2:
    pushq   %rbp
LCFI0:
    movq    %rsp, %rbp
LCFI1:
    movl    %edi, -4(%rbp)
    movq    %rsi, -16(%rbp)
    movq    %rdx, -24(%rbp)
    movq    -16(%rbp), %rax
    movl    (%rax), %edx
    movl    %edx, %ecx
    imull   -4(%rbp), %ecx
    movq    -24(%rbp), %rax
    movl    (%rax), %eax
    addl    %eax, %ecx
    incl    %edx
    movq    -16(%rbp), %rax
    movl    %edx, (%rax)
    movl    %ecx, %eax
    leave
    ret

Beachten Sie die C ++ Namen Mangeln (__Z8functioniRiPi). Jetzt geben wir g ++ die -O2 Flagge:

    .text
    .align 4,0x90
.globl __Z8functioniRiPi
__Z8functioniRiPi:
LFB2:
    pushq   %rbp
LCFI0:
    movq    %rsp, %rbp
LCFI1:
    movl    (%rsi), %ecx
    movl    %ecx, %eax
    imull   %edi, %eax
    addl    (%rdx), %eax
    incl    %ecx
    movl    %ecx, (%rsi)
    leave
    ret

-O3 gibt den gleichen Code; es gibt nicht wirklich etwas anderes zu optimieren.

Viel Spaß beim Spielen um mit Montage. ^ _ ^

Was Aaron sagte über Aufrufkonventionen ist die richtige Antwort. Für meine eigene persönliche Auseinandersetzung mit dem Thema habe ich gefunden Smashing den Stapel für Spaß und Profit zu sein eine große Übung in der Rolle eines Stapelrahmens und was passieren kann, wenn es beschädigt wird. Finlay Ich empfehle die Montage Primer für Hacker der wichtigen Assembler Konzepte sowie Spaß Dinge geht über Sie mit Ihrem Debugger tun können.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top