funzionalità di un assieme movq
Domanda
Stavo leggendo un codice e non ero sicuro di quello che fa questa linea:
movq (%rsp), %rsp
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.