ich einen Absturz erlebe, und während der Untersuchung fand ich mich völlig durch den folgenden Code gesperrt:Schwierigkeiten zu verstehen, eine x86-64 Funktion Präambel
0000000000000a00 <_IO_vfprintf>:
a00: 55 push %rbp
a01: 48 89 e5 mov %rsp,%rbp
a04: 41 57 push %r15
a06: 41 56 push %r14
a08: 41 55 push %r13
a0a: 41 54 push %r12
a0c: 53 push %rbx
a0d: 48 81 ec 48 06 00 00 sub $0x648,%rsp
a14: 48 89 95 98 f9 ff ff mov %rdx,0xfffffffffffff998(%rbp)
Dies, indem Sie objdump --disassemble /usr/lib64/libc.a
auf einer 64-Bit-Linux-x86 erzeugt wird System und dann durch die Ausgabe suchen. Dies ist AT&T syntax, so sind die Ziele auf der rechten Seite.
Insbesondere verstehe ich die letzte Anweisung nicht. Es scheint den Wert des rdx
Registers irgendwo im Stapel (weit, weit entfernt) in den Speicher zu schreiben, bevor die Funktion dieses Register berührt hat. Für mich ergibt das keinen Sinn.
Ich habe versucht, die Aufrufkonventionen zu lesen, und meine beste Theorie ist jetzt, dass rdx
für einen Parameter verwendet wird, so dass der Code im Grunde den Parameterwert direkt "zurückgibt". Das ist nicht das Ende der Funktion, also kommt es natürlich nicht zurück.
Vielleicht Raymond könnte Ihnen helfen: http://blogs.msdn.com/b/oldnewthing/archive/2004/01/ 14/58579.aspx – ruslik