Domanda

Stavo leggendo un codice e non ero sicuro di quello che fa questa linea:

movq (%rsp), %rsp
È stato utile?

Soluzione

movq (supponendo che si sta parlando di x 86) è una mossa di un quadword (valore a 64 bit). Questa particolare istruzione:

movq (%rsp), %rsp

è molto simile il codice che vi guiderà attraverso stack frame. Questa particolare istruzione afferra il quadword puntato dal puntatore stack corrente, e lo carica nel puntatore dello stack, sovrascrivendo esso.

A titolo di esempio, questa sequenza di codice (basato sul codice reale, e in Intel piuttosto che AT & format T) continuamente caricare il puntatore dello stack dal contenuto fino al valore di 16 byte là è 0.

576  cmpq    [rsp+0x10],0x0
582  jz      594
588  movq    rsp,[rsp]
592  jmp     576
594  ...

E 'possibile che non può essere pila-frame codice a piedi ma è insolito in quanto sarebbe suborning lo stack pointer per qualcosa che non è di solito utilizzato per.

è insolito in quanto movimento fino stack frame di solito comporta stack pointer e base puntatore, ma che di solito solo per salire di un livello (vale a dire, un ritorno da una funzione).

Per il tipo di codice mostrato sopra in cui si desidera spostare su più livelli, è probabilmente più veloce basta usare lo stack pointer fino ad arrivare dove devi essere, quindi pop il puntatore base fuori allora (convenzioni di chiamata spesso spinta il puntatore base corrente prima di esso, in modo che un semplice pop si riprenderà il vecchio valore).

Altri suggerimenti

Si tratta di un valore di 64 bit mov. 64bit sua causa della "q" in movq che è quad e quad è a 64 bit.

Ci può essere altro esempio come movl in cui l è 32 bit.

, ma nel caso di movq (% RSP), RSP% utilizzando la sintassi ATT ..

Il movq (% RSP),% RSP -.> Movq si chiama codice operativo, (% RSP) si chiama di origine o di src e% RSP è chiamata la destinazione o DST

quello che fa è che si guarda nel registro% RSP prende il suo valore e va alla memoria [la staffa "()" significa che vanno in valore di memoria] di tale valore e poi lo assegna al% RSP.

Mentre entrambi sono stesso registro differenza è che il valore di variazione% RSP.

EG: diciamo% RSP ha valore 22. Ma il ricordo del% RSP è 30.

Con questo movq istruzione (% RSP),% RSP

il nuovo valore di% RSP è 30. Sempre a causa (% RSP) ottiene il valore di% RSP che è assumere 22 e poi (% RSP) passa al valore di memoria 30 e poi assegna a% RSP sulla destinazione , che è% RSP stesso.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top