Lors de la première instruction, rip contient 0, lors de la seconde instruction rip contient 10.
Et pourtant, le résultat de ces deux instructions est de mettre ce qu'il y a dans la mémoire à l'adresse data dans %eax. Non ?
Je ne comprend pas comment il fait pour calculer.
rip c'est bien le compteur ordinal ? Raw Instruction Pointer. Autrement dit, le contenu de ce registre change à chaque nouvelle instructions.
Un peu de vrai code :
inta=0;voidf(void){a=a+a;}
l'assembleur généré :
.file"a.c".globla.bss.align4.typea,@object.sizea,4a:.zero4.text.globlf.typef,@functionf:.LFB0:.cfi_startprocpushq%rbp.cfi_def_cfa_offset16.cfi_offset6,-16movq%rsp,%rbp.cfi_def_cfa_register6movla(%rip),%edxmovla(%rip),%eaxaddl%edx,%eaxmovl%eax,a(%rip)popq%rbp.cfi_def_cfa7,8ret.cfi_endproc.LFE0:.sizef,.-f.ident"GCC: (GNU) 4.6.3 20120306 (Red Hat 4.6.3-2)".section.note.GNU-stack,"",@progbits
Dans le AMD64 Architechture Programmer's Manual v1 on lit :
The 64-bit RIP instruction-pointer register contains the address of the next instruction to be executed.
Autrement dit la valeur contenue dans ce registre change après chaque instruction traitée par le processeur.
Et pourtant dans mon code C, il n'y a qu'un seul 'a', qui a une position fixe dans la mémoire. Et dans le code assembleur généré, et dans le binaire il est question du registre rip pour y accéder, avec la même syntaxe que pour le l'adressage indexé. mov offset(registre),registre. Bref, on accède à une position fixe grâce à un registre dont la valeur qu'il contient change après chaque instruction traitée.
La question : Comment ça marche ?
[^] # Re: Questions pas très claire
Posté par Zylabon . En réponse au message adressage relatif en assembleur amd64, je suis perdu. Évalué à 1. Dernière modification le 02 avril 2012 à 00:05.
Lors de la première instruction, rip contient 0, lors de la seconde instruction rip contient 10.
Et pourtant, le résultat de ces deux instructions est de mettre ce qu'il y a dans la mémoire à l'adresse data dans %eax. Non ?
Je ne comprend pas comment il fait pour calculer.
rip c'est bien le compteur ordinal ? Raw Instruction Pointer. Autrement dit, le contenu de ce registre change à chaque nouvelle instructions.
Un peu de vrai code :
l'assembleur généré :
et le binaire généré a.o :
Dans le AMD64 Architechture Programmer's Manual v1 on lit :
Autrement dit la valeur contenue dans ce registre change après chaque instruction traitée par le processeur.
Et pourtant dans mon code C, il n'y a qu'un seul 'a', qui a une position fixe dans la mémoire. Et dans le code assembleur généré, et dans le binaire il est question du registre rip pour y accéder, avec la même syntaxe que pour le l'adressage indexé. mov offset(registre),registre. Bref, on accède à une position fixe grâce à un registre dont la valeur qu'il contient change après chaque instruction traitée.
La question : Comment ça marche ?
Please do not feed the trolls