2010-09-23 38 views
8

Je rencontre un accident, et en enquêtant sur je me suis retrouvé totalement bloqué par le code suivant:du mal à comprendre un préambule de la fonction x86-64

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) 

Ceci est généré en exécutant objdump --disassemble /usr/lib64/libc.a sur un 64 bits Linux x86 système, puis en recherchant dans la sortie. C'est AT&T syntax, donc les destinations sont sur la droite. En particulier, je ne comprends pas la dernière instruction.

Il semble écrire la valeur du registre rdx dans la mémoire quelque part sur la pile (loin, très loin), avant que la fonction ait touché ce registre. Pour moi, cela n'a aucun sens.

J'ai essayé de lire sur les conventions d'appel, et ma meilleure théorie maintenant est que rdx est utilisé pour un paramètre, de sorte que le code revient à "renvoyer" directement la valeur du paramètre. Ce n'est pas la fin de la fonction, donc ça ne revient pas vraiment, bien sûr.

+0

Peut-être que Raymond pourrait vous aider: http://blogs.msdn.com/b/oldnewthing/archive/2004/01/ 14/58579.aspx – ruslik

Répondre

12

Oui, c'est un paramètre. Le ABI used by Linux affecte jusqu'à 6 "integer" (< = nombre entier de 64 bits, ou pointeur) paramètres de type à registres, ce qui est évident et facile à mémoriser l'ordre %rdi, %rsi, %rdx, %rcx, %r8, %r9.

La trame de pile est de 1648 octets (sub $0x648,%rsp revendications 1608 octets, plus 5 registres 64 bits ont été poussés avant cela), et 0xfffffffffffff998 est -1640. Par conséquent, le code stocke le troisième paramètre près du bas de la trame de la pile.

(Note:. Windows 64 bits ABI est différent de celui de Linux)

+0

Génial, merci. Je devrais vraiment prendre un certain temps (5-10 ans) et revenir dans le groove avec la programmation d'assemblage. – unwind