Question

Je lisais un code et n'étais pas sûr de ce que cette ligne ne:

movq (%rsp), %rsp
Était-ce utile?

La solution

movq (en supposant que vous parlez x86) est un mouvement d'une quadword (valeur 64 bits). Cette instruction particulière:

movq (%rsp), %rsp

ressemble beaucoup à code qui marcheront à travers des cadres de pile. Cette instruction particulière saisit la quadword pointée par le pointeur de la pile en cours, et la charge dans le pointeur de la pile, le remplacer.

A titre d'exemple, cette séquence de code (basé sur le code réel, et Intel plutôt que AT & format T) charge en continu le pointeur de la pile 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 soit pas le code de marche pile-cadre, mais il est inhabituel, car il serait suborner le pointeur de la pile pour quelque chose, il est généralement pas utilisé.

inhabituel en ce déplaçant les cadres de pile implique généralement pointeur 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 ci-dessus où vous voulez remonter de plusieurs niveaux, il est probablement plus rapide d'utiliser simplement le pointeur de la pile jusqu'à ce que vous obtenez où vous devez être, pop alors le pointeur de base hors tension, puis (les conventions d'appel pousseront souvent le pointeur de la base actuelle avant de le changer, de sorte qu'un pop simple, récupérera la valeur ancienne).

Autres conseils

Il est une valeur de 64 bits mov. Son 64bit en raison de la "q" dans movq qui est quad et quad est 64bit.

Il peut y avoir d'autres tels que par exemple movl où l est 32 bits.

mais dans le cas de movq (% RÉR), en utilisant la syntaxe% rsp ATT ..

Le movq (% RSP),% rsp -.> Movq est appelé opcode, (% rsp) est appelée la source ou src et rsp% est appelée la destination ou la dst

ce qu'il fait est qu'il semble dans le registre% rsp obtient sa valeur et se dirige vers la mémoire [le support « () » des moyens d'entrer dans la valeur de la mémoire] de cette valeur et affecte ensuite à% rsp.

Alors que les deux sont même registre, la différence est que la valeur des variations% RÉR.

EG: permet de dire% rsp a la valeur 22. Mais la mémoire de% est rsp 30.

En utilisant cette movq d'instruction (% rsp),% rsp

la nouvelle valeur de% rsp est 30. Encore une fois parce que (% RÉR) obtient la valeur de% rsp qui assume 22 et (% RÉR) va à la valeur de la mémoire 30 et attribue ensuite à% rsp sur la destination , qui est lui-même rsp%.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top