Je lisais un code et n'étais pas sûr de ce que cette ligne nefonction d'assemblage movq
movq (%rsp), %rsp
Merci
Je lisais un code et n'étais pas sûr de ce que cette ligne nefonction d'assemblage movq
movq (%rsp), %rsp
Merci
movq
(en supposant que vous parlez x86) est un mouvement d'un quadword (64- valeur de bit). Cette instruction particulière:
movq (%rsp), %rsp
ressemble beaucoup au code qui va passer à travers les cadres de la pile. Cette instruction particulière saisit le mot-clé pointé par le pointeur de pile en cours, et le charge dans le pointeur de la pile, en l'écrasant.
A titre d'exemple, cette séquence de code (basé sur le code réel, et dans Intel plutôt que AT & le format T) va charger en continu le pointeur de pile à partir de son contenu jusqu'à ce que la valeur de 16 octets au-delà est 0.
576 cmpq [rsp+0x10],0x0
582 jz 594
588 movq rsp,[rsp]
592 jmp 576
594 ...
Il est possible qu'il ne s'agisse pas d'un code de progression de pile, mais c'est inhabituel car il s'agit d'un sous-pointage du pointeur de la pile pour un élément qui n'est généralement pas utilisé.
Il est inhabituel que le déplacement des cadres de pile implique généralement le pointeur de pile et le pointeur de base, mais qui est plus souvent pour monter un niveau (à savoir un retour d'une fonction). Pour le type de code indiqué ci-dessus où vous voulez monter de plusieurs niveaux, il est probablement plus rapide d'utiliser le pointeur de la pile jusqu'à ce que vous soyez à l'endroit voulu, puis d'éteindre le pointeur de base (les conventions d'appel seront souvent appuyez sur le pointeur de base actuel avant de le changer, de sorte qu'un simple pop récupérera l'ancienne valeur).
Il s'agit d'une valeur mov de 64 bits. Son 64bit à cause du "q" dans movq qui est quad et quad est 64bit.
Il peut y avoir un autre exemple tel que movl dans lequel l est de 32 bits.
mais dans le cas de movq (% RÉR), en utilisant la syntaxe% rsp ATT ..
Le movq (% RÉR),% rsp -> movq est appelé opcode (% RÉR) est appelée la source ou src et% rsp sont appelés la destination ou le dst. Ce qu'il fait est qu'il recherche dans le registre% rsp obtient sa valeur et va à la mémoire [le crochet "()" signifie entrer dans la valeur mémoire] de cette valeur, puis l'affecte à% rsp.
Bien que les deux soient identiques, la différence est que la valeur de% rsp change.
EG: permet de dire% rsp a la valeur 22. Mais la mémoire de% rsp est 30.
En utilisant cette movq d'instructions (% rsp),% rsp
la nouvelle valeur de% rsp est 30 De nouveau parce que (% rsp) obtient la valeur de% rsp qui est supposée 22 et ensuite (% rsp) va à la valeur mémoire 30 et l'affecte à% rsp sur la destination, qui est% rsp elle-même.
C'est certainement 64 bits, puisque le registre RSP existe seulement en 64 bits (sur les architectures IA32, et je ne me souviens pas d'une autre architecture qui utilise RSP). L'analyse de son but semble raisonnable aussi. – Zooba