127 votes

Quelle est la fonction des instructions push / pop utilisées sur les registres dans l'assemblage x86 ?

En lisant sur assembleur je rencontre souvent des gens écrivant qu'ils poussent un certain registre du processeur et le pop à nouveau plus tard pour restaurer son état précédent.

  • Comment pouvez-vous pousser un registre ? Où est-ce qu'il est poussé ? Pourquoi cela est-il nécessaire ?
  • Est-ce que cela se résume à une seule instruction de processeur ou est-ce plus complexe ?

175voto

Linus Kleen Points 15925

pousser une valeur (pas nécessairement stockée dans un registre) signifie l'écrire dans la pile.

faire sauter signifie restituer tout ce qui se trouve au-dessus de la pile dans un registre. Ce sont des instructions de base :

push 0xdeadbeef      ; push a value to the stack
pop eax              ; eax is now 0xdeadbeef

; swap contents of registers
push eax
mov eax, ebx
pop ebx

30voto

gowrath Points 1951

Pousser et faire sauter les registres sont dans les coulisses équivalent à cela :

push reg   <= same as =>      sub  $8,%rsp        # subtract 8 from rsp
                              mov  reg,(%rsp)     # store, using rsp as the address

pop  reg    <= same as=>      mov  (%rsp),reg     # load, using rsp as the address
                              add  $8,%rsp        # add 8 to the rsp

Notez qu'il s'agit de la syntaxe x86-64 At&t.

Utilisé comme une paire, cela vous permet d'enregistrer un registre sur la pile et de le restaurer plus tard. Il y a d'autres usages, aussi.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X