Segmentierungsfehler beim Öffnen des x86-Stapels, um auf Funktion arg zuzugreifen

Lesezeit: 2 Minuten

Benutzeravatar von Susmit Agrawal
Gipfel Agrawal

Ich versuche, x86-Assembly und C zu verknüpfen.

Mein C-Programm:

extern int plus_10(int);

# include <stdio.h>

int main() {
    int x = plus_10(40);
    printf("%d\n", x);
    return 0;
}

Mein Montageprogramm:

[bits 32]

section .text

global plus_10
plus_10:
    pop edx
    mov eax, 10
    add eax, edx
    ret

Ich kompiliere und verlinke die beiden wie folgt:

gcc -c prog.c -o prog_c.o -m32
nasm -f elf32 prog.asm -o prog_asm.o
gcc prog_c.o prog_asm.o -m32

Wenn ich jedoch die resultierende Datei ausführe, erhalte ich einen Segmentierungsfehler.

Aber wenn ich ersetzen

pop edx

mit

bewegen edx, [esp+4]

das programm funktioniert einwandfrei. Kann mir bitte jemand erklären, warum das passiert?

  • pop edx bewegt den Stapelzeiger, mov edx, [esp+4] nicht. Normalerweise ist es in C Sache des Aufrufers, den Stack zu bereinigen.

    – Jabberwocky

    13. Mai 2019 um 13:52 Uhr


  • Gut gestellte Frage. +1

    – fuz

    13. Mai 2019 um 13:52 Uhr

  • @Jabberwocky Aber warum sollte das einen Segmentierungsfehler verursachen? Der Stack ist für beide Funktionen gleich, richtig?

    – Agrawal erfüllen

    13. Mai 2019 um 13:53 Uhr


  • Weil Sie die Absenderadresse und nicht das Argument angegeben haben. Du kannst Pop nicht so verwenden.

    – R.. GitHub HÖR AUF, EIS ZU HELFEN

    13. Mai 2019 um 13:55 Uhr

  • @SusmitAgrawal, weil sich die Absenderadresse auf dem Stack befindet. Dein pop edx knallt tatsächlich die Rücksendeadresse vom Stapel und wenn die ret ausgeführt wird, springt der Prozessor zu der Adresse, die sich auf dem Stapel befindet

    – Jabberwocky

    13. Mai 2019 um 13:55 Uhr


  • Die cdecl-Aufrufkonvention erwartet jedoch, dass der Wert über eax zurückgegeben wird. Sie können die asm-Funktion also nicht einfach so schreiben, wie Sie möchten, sie muss mit dem vom Compiler generierten C kompatibel sein.

    – Ludin

    13. Mai 2019 um 14:12 Uhr

  • @Lundin anscheinend verwendet seine Plattform die cdecl-Konvention. Ich habe auch geschrieben es ist möglich Assembler-Code, je nach Plattform kann es also etwas anders sein. Bearbeitet und präzisiert. Vielen Dank.

    – Jabberwocky

    13. Mai 2019 um 14:14 Uhr


1390690cookie-checkSegmentierungsfehler beim Öffnen des x86-Stapels, um auf Funktion arg zuzugreifen

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy