Wie Schreibe ich Einfache inline-asm-Anweisung von C auf Linux 64 bit?
Schreibe ich ein einfaches c-Programm, und meine Anforderung ist, drucken RIP(Instruction Pointer) von einigen Funktion des Programms. ich möchte nicht zu verwenden ptrace.
die eine Sache, die ich habe versucht, mit inline-asm ist:
asm("movl %%rip, %0;" : "=r"(val) )
dies sollte Kopie meines rip-register-Wert zu variable val, aber ich bin immer Kompilierungsfehler.
wenn ich mit ebp/esp, die base-pointer und stack-Pointer für 32-bit-Computer, i dont get any compilation Fehler und meine val hat einige Hexadezimalzahl zugewiesen.
ich habe paar Fragen hier:
1) meine Maschine ist 63 bit, wie oben Unterweisung in der Lage zu Lesen 32-bit-Register?
2) warum bin ich nicht in der Lage zu Lesen alle register für 64 bit, gibt es eine Ausgabe b'caz von 'r'?
3) wenn ich eip ist für die 32-bit bekomme ich Kompilierungsfehler, bedeutet das IP-Register sind beschränkt zum Lesen?
Du musst angemeldet sein, um einen Kommentar abzugeben.
gcc
, versuchen Sie es mit der-m64
Flagge, oder Lesen Sie in der compiler-Dokumentation für weitere Informationen.rip
, dieeip
register kann nicht direkt aufgerufen werden. Sie können den Wert abrufen, dereip
in der beschriebenen Weise Jim in seiner Antwort.[1] Sie wäre in der Lage zu Lesen, die 32-bit-Register auf einem 64-bit executable wie auch immer; die 32-bit-Register sind noch in 64-bit-Modus, wie kann man den Zugriff auf die 16-bit-Register, die im 32-bit-Modus.
Gibt es ein paar Probleme noch in Ihrer Beispiel:
Erste, obwohl
rip
zugänglich ist, in 64-bit-Modus, es ist zugänglich als addressing mode; es ist nicht eine normale register. Wenn Sie möchten, laden Ihr Wert, den Sie verwenden müssenLEA
, nichtMOV
.Zweitens, weil
rip
ist ein 64-bit register ist, müssen Sie dieq
suffix auf Ihre Anweisungen, anstattl
. Hier ist ein Beispiel für ein Programm mit diesen zwei Themen angesprochen:scheint zu funktionieren auf meinem Rechner.
Können Sie den Wert des EIP-register by doing:
und dann kann man nur Lesen ebx.
rip
.lea rax, [rip]
.