2010-09-23 10 views
8

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.

+0

Vielleicht Raymond könnte Ihnen helfen: http://blogs.msdn.com/b/oldnewthing/archive/2004/01/ 14/58579.aspx – ruslik

Antwort

12

Ja, es ist ein Parameter. Die ABI used by Linux ordnet bis zu 6 "INTEGER" (< = 64-Bit-Ganzzahl, oder einen Zeiger) Typ-Parameter-Register, das in der Hand und leicht zu merkende Reihenfolge %rdi, %rsi, %rdx, %rcx, %r8, %r9.

Der Stack-Frame ist 1648 Bytes (sub $0x648,%rsp Ansprüche 1608 Bytes, plus 5 64-Bit-Register wurden zuvor geschoben), und 0xfffffffffffff998 ist -1640.

Also der Code speichert den 3. Parameter in der Nähe des unteren Rands des Stack-Frame.

. (Anmerkung: die Windows 64-Bit-ABI unterscheidet auf den Linux-one)

+0

Ehrfürchtig, danke. Ich sollte mir wirklich etwas Zeit nehmen (5-10 Jahre oder so) und mit der Assemblerprogrammierung in den Groove zurückkehren. – unwind

Verwandte Themen