web-dev-qa-db-fra.com

Fonction d'assemblage movq

Je lisais du code et je n'étais pas sûr de ce que faisait cette ligne:

movq (%rsp), %rsp
25
jamesatha

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

movq (%rsp), %rsp

ressemble beaucoup à du code qui remontera dans les cadres de pile. Cette instruction particulière saisit le mot quadruple pointé par le pointeur de pile actuel et le charge dans le pointeur de pile, en le remplaçant.

À titre d'exemple, cette séquence de code (basée sur du code réel et au format Intel plutôt que AT&T) chargera en continu le pointeur de pile de son contenu jusqu'à ce que la valeur 16 octets au-delà soit 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 défilement de cadres de pile, mais il est inhabituel car il sous-estimerait le pointeur de pile pour quelque chose pour lequel il n'est généralement pas utilisé.

Il est inhabituel dans la mesure où le déplacement vers le haut des cadres de pile implique généralement un pointeur de pile et un pointeur de base, mais cela ne sert généralement qu'à remonter d'un niveau (c'est-à-dire un retour d'une fonction).

Pour le type de code indiqué ci-dessus où vous souhaitez monter de plusieurs niveaux, il est probablement plus rapide d'utiliser simplement le pointeur de pile jusqu'à ce que vous obteniez où vous devez être, puis ouvrez le pointeur de base (les conventions d'appel poussent souvent la base actuelle pointeur avant de le changer, pour qu'un simple pop récupère l'ancienne valeur).

34
paxdiablo

Il s'agit d'un mouvement de valeur 64 bits. Son 64 bits à cause du "q" dans movq qui est quad et quad est 64 bits.

Il peut y avoir un autre exemple tel que movl dans lequel l vaut 32 bits.

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

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

ce qu'il fait, c'est qu'il recherche dans le registre% rsp obtient sa valeur et va dans la mémoire [le crochet "()" signifie entrer dans la valeur de la 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: disons que% rsp a la valeur 22. Mais la mémoire de% rsp est 30.

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

la nouvelle valeur de% rsp est 30. Encore une fois parce que (% rsp) obtient la valeur de% rsp qui est supposée 22 puis (% rsp) va à la valeur de mémoire 30 et l'affecte ensuite à% rsp sur la destination, qui est % rsp lui-même.

15
bmm