esp bestimmen
-
Hallo c-community,
ich versuche mit einem kleinen Testprogramm esp auszulesen. In einer Quelle habe ich folgendes Testprogramm gefunden, was aber bei mir mit einem Segmentation fault endet.
Hier erstmal das kleine Testprogramm:#include <stdio.h> //printf unsigned long sp(void){__asm__("mov %eax, %esp");} // <-- hier SegFault int main(void){ unsinged long esp = sp(); printf("%u\n", esp); return 1; }
Die Stelle mit dem Assembler-Code scheint hierbei die Problematische zu sein. Woher kommt der SegFault?
Vielen Dank
mirrowwinger
-
Hmm, woher hast du das? % ist AT&T Syntax, also ist die Reihenfolge Quelle -> Ziel. Damit schreibst du eax ins esp und machst den Stack Pointer kaputt, deswegen wohl der Segmentation Fault. Du müsstest die Operanden vertauschen.
-
Wie wäre es mit einer Registervariable:
register unsigned out asm("%esp");
-
Ich glaube außerdem dass das ASM-Statement eher so aussehen sollte (GCC):
asm("mov %%esp, %%eax" ::: "%eax");
eax
muss ja geclobbert werden.
-
Danke für die Beiträge, ich habe die von Mechanics gewählt. Nur noch eine Kurze Zusatzfrage, wie schreibe ich es wenn ich esp+4 abfragen will?
Folgende beiden Versuche lassen sich nicht kompilieren:
unsigned long sp(void){__asm__("mov %esp+4, %eax");}
unsigned long sp(void){__asm__("mov %[esp+4], %eax");}
-
unsigned long sp(void){__asm__("mov 4(%esp), %eax");}
-
Arcoth schrieb:
eax
muss ja geclobbert werden.Warum? Ist doch der "Clou", dass im eax dann der Rückgabewert steht.
-
wie funktioniert das mit esp-4? Folgendes funktioniert nicht:
mov -4(%esp), %eax
-
mirrowwinger schrieb:
wie funktioniert das mit esp-4? Folgendes funktioniert nicht:
mov -4(%esp), %eax
Doch, das ist die Syntax dazu.
Hier ein paar "Übersetzungen", falls du die Intel-Syntax schon kennst:
http://www.imada.sdu.dk/Courses/DM18/Litteratur/IntelnATT.htm