Wie springt die Programmausführung an einer bestimmten Adresse in C?
Ich soll das Programm den Sprung zu einer bestimmten Adresse im Speicher und fortsetzen von dieser Adresse. Ich dachte über die Verwendung goto
aber ich habe nicht ein label, sondern nur eine Adresse im Speicher.
Gibt es keine Notwendigkeit zu befürchten, wieder zurück aus dem Sprung-Adresse.
edit: mit GCC-compiler
vielleicht könnte Ihnen helfen, stackoverflow.com/questions/61341/...
das ist Wild-Plattform abhängig ; die OS / compiler verwenden Sie ?
Schreiben Sie irgendeine Art von nutzen?
C oder C++? Und warum wollen Sie dies tun?
Verstehen Sie, dass wenn Sie dies tun (entweder mit einer inline-assembly-Anweisung springen, oder eine Funktion Zeiger bodge), dann werden Variablen nicht unbedingt behalten Ihre Werte über die zu springen? Eine variable kann zwischengespeichert werden, in einem register an der Stelle, springen Sie ab, und einem anderen register in dem Punkt springen, und das ist vorausgesetzt, die beiden Punkte sind auch in der gleichen Funktion. Also, wenn die Ziel-Adresse wird der code in C geschrieben ist, ist es fast garantiert, um zu arbeiten.
das ist Wild-Plattform abhängig ; die OS / compiler verwenden Sie ?
Schreiben Sie irgendeine Art von nutzen?
C oder C++? Und warum wollen Sie dies tun?
Verstehen Sie, dass wenn Sie dies tun (entweder mit einer inline-assembly-Anweisung springen, oder eine Funktion Zeiger bodge), dann werden Variablen nicht unbedingt behalten Ihre Werte über die zu springen? Eine variable kann zwischengespeichert werden, in einem register an der Stelle, springen Sie ab, und einem anderen register in dem Punkt springen, und das ist vorausgesetzt, die beiden Punkte sind auch in der gleichen Funktion. Also, wenn die Ziel-Adresse wird der code in C geschrieben ist, ist es fast garantiert, um zu arbeiten.
InformationsquelleAutor Sam | 2011-11-16
Du musst angemeldet sein, um einen Kommentar abzugeben.
Inline Assembler könnte die einfachste und "eleganteste" Lösung, obwohl dies zu tun, ist sehr ungewöhnlich, es sei denn, Sie schreiben einen debugger oder einigen spezialisierten introspektive system.
Andere Möglichkeit könnte sein, zu deklarieren, die einen Zeiger auf eine void-Funktion (
void (*foo)(void)
), dann setzen Sie den Zeiger enthalten die Adresse ein, und dann rufen Sie:Gibt es Dinge, die auf den stack geschoben, da der compiler denkt, du machst einen Unterprogramm-Aufruf, aber da brauchen Sie sich keine sorgen über die Rücksendung, das funktionieren könnte.
InformationsquelleAutor Randall Cook
gcc hat eine Erweiterung, die es ermöglicht das springen an eine willkürliche Adresse:
Dies ist so ziemlich das gleiche wie eine Funktion verwenden, die Zeiger, dass du auf einen festen Wert eingestellt, sondern es wird sogar eine jump-Anweisung statt einer call-Anweisung (also der stack wird nicht verändert)
InformationsquelleAutor Chris Dodd
Natürlich, dies ruft nicht definiertes Verhalten, ist Plattform-abhängig, geht davon aus, dass code-Adressen sind die gleiche Größe wie
int
, etc, etc.Ich kann mich dafür verbürgen, dass dieser trick funktioniert auch meistens, solange die Ziel-Funktion hat keine Argumente und Sie versuchen nicht, um einen Wert zurückzugeben. Ich geändert es zu
void*
stattunsigned int
und das funktionierte für mich. Aber als eine Allgemeine Lösung zu ersetzen x86 jmp inline-asm, funktioniert nicht gut genug.InformationsquelleAutor Robᵩ
Sollte es etwa so Aussehen:
Aber es ist nicht eine sehr sichere operation, springen einige unbekannte Adresse wird wahrscheinlich zu einem Absturz führen!
InformationsquelleAutor Andro
Da ist die Frage hat einen C++ - tag, hier ein Beispiel von einem C++ Aufruf einer Funktion mit einer Signatur wie main()--
int main(int argc, char* argv[])
:InformationsquelleAutor U007D
Haben Sie Kontrolle über den code an die Adresse, die Sie wollen, um zu springen? Ist das C oder C++?
Ich zögernd empfehlen
setjmp() /longjmp()
wenn Sie C und ausführen könnensetjmp()
wo Sie brauchen, um zurück zu wechseln. Dass gesagt wird, du musst SEHR vorsichtig mit diesen.Als für C++ finden Sie in der folgenden Diskussion über
longjmp()
abkürzens Ausnahmebehandlung und Destruktoren Destruktoren. Dies würde mich noch mehr zögern schlagen vor, Sie verwenden in C++.C++: Verwendung Sicher longjmp und setjmp?
Exception-handling ist ein großer nutzen für Sie, ja. Dass gesagt wird, je nachdem, was der code in Frage aussieht, wäre es möglich, einen longjmp () - Sprung zu einem bekannten Punkt im code, ohne sich Gedanken über die Adresse, vorausgesetzt, dass die setjmp () - Aufruf ausgeführt werden kann.
InformationsquelleAutor Taylor Price
Ich Propos diesen code:
InformationsquelleAutor Bahman
Dies ist, was ich benutze für meine bootstrap-loader(MSP430AFE253,Compiler = gcc,CodeCompeserStudio);
InformationsquelleAutor İlkerK