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.
Peut-être que Raymond pourrait vous aider: http://blogs.msdn.com/b/oldnewthing/archive/2004/01/ 14/58579.aspx – ruslik