Ich schreibe Code, um vorübergehend meinen eigenen Stapel für Experimente zu verwenden. Dies funktionierte, wenn ich die Inline-Assemblierung in Literalformat verwendete. Ich habe die variablen Standorte als Offsets von ebp hart codiert. Ich wollte jedoch, dass mein Code funktioniert, ohne Speicheradressen fest codieren zu müssen. Daher habe ich GCCs EXTENDED INLINE ASSEMBLY untersucht. Was ich habe, ist die folgende:
volatile intptr_t new_stack_ptr = (intptr_t) MY_STACK_POINTER;
volatile intptr_t old_stack_ptr = 0;
asm __volatile__("movl %%esp, %0\n\t"
"movl %1, %%esp"
: "=r"(old_stack_ptr) /* output */
: "r"(new_stack_ptr) /* input */
);
Der Punkt dieser ist, zuerst den Stapelzeiger in die Variable old_stack_ptr zu speichern. Als nächstes wird der Stapelzeiger (% esp) mit der Adresse überschrieben, die ich in new_stack_ptr gespeichert habe.
Trotzdem fand ich, dass GCC das% esp in old_stack_ptr speicherte, aber% esp nicht durch new_stack_ptr ersetzte. Bei tiefer Inspektion, fand ich es erweiterte eigentlich meinen Montag und seine eigene Anweisungen gegeben, die die folgenden:
mov -0x14(%ebp),%eax
mov %esp,%eax
mov %eax,%esp
mov %eax,-0x18(%ebp)
denke ich GCC das% esp zu bewahren versucht, weil ich es nicht explizit deklariert als ein "Ausgabe" -Operand ... Ich könnte total falsch damit sein ...
Ich wollte wirklich erweiterte Inline-Assembly, um dies zu tun, denn wenn nicht, es scheint, als ob ich den Ort "hart codieren" muss Offsets von% ebp in die Assembly, und ich würde lieber die Variablennamen so verwenden ... vor allem, weil dieser Code auf einigen verschiedenen Systemen funktionieren muss, die alle meine Variablen auf unterschiedliche Weise zu kompensieren scheinen, also die erweiterte Inline-Assemblierung verwenden erlaubt mir das explizit zu machen Ich sage die Variable location ... aber ich verstehe nicht, warum es die zusätzlichen Sachen macht und ich darf den Stack-Pointer nicht überschreiben, wie es vorher war, seit ich angefangen habe, Extended Assembly zu verwenden, macht es das.
Ich schätze jede Hilfe !!!
Nicht sicher, ob das hilft, aber vielleicht würde '-Fomit-frame-pointer' (das mit' -O1' und höher aktiviert ist) die Notwendigkeit beseitigen, sich um '% ebp' zu kümmern. – DaoWen
Das zusätzliche Zeug ist wahrscheinlich da, weil Sie eine Debug (keine Optimierung) Build und GCC tut es standardmäßig, um potenzielle Fehler zu fangen. Suchen Sie nach "GCC Stack Frame Checks", um zu sehen, welche Optionen GCC bietet. – Skizz