lea 0x0(%esi),%esi
Credo non abbia alcun risultato e sta semplicemente riempiendo lo spazio. È questo il caso?Qual è il significato di lea 0x0 (% esi),% esi
lea 0x0(%esi),%esi
Credo non abbia alcun risultato e sta semplicemente riempiendo lo spazio. È questo il caso?Qual è il significato di lea 0x0 (% esi),% esi
È un NOP. Aggiunge il contenuto di% esi e 0x0 e inserisce il risultato in% esi. Qualcuno ha un generatore di codice maldestro o ha bisogno di riempire N byte, dove questa istruzione ha le giuste dimensioni.
Le istruzioni LEA vengono eseguite abbastanza velocemente (in genere 1 orologio), quindi è molto meglio di N nops.
La x86 è strana come è, ha una varietà di istruzioni che in pratica non fanno altro che riempire numeri diversi di byte. Potresti trovare altre istruzioni inutili di diverse lunghezze. Tendi a trovare istruzioni lunghe ma eseguite in 1 orologio o meno.
Il manuale AMD x86-64 ha alcuni suggerimenti su cosa dovrebbe essere utilizzato per i NOP; suggeriscono uno degli opcode prefisso ripetuto un numero di volte prima di un effettivo NOP, IIRC. Tali codici di prefisso vengono consumati molto rapidamente dal motore di recupero delle istruzioni; per lo più il loro costo è nascosto nell'istruzione pre-fetch e non nel tempo di esecuzione delle istruzioni.
Quest'ultimo, a meno che GCC non sia un generatore di codice maldestro. Grazie per la risposta rapida. – Brian
Un punto interessante è che 'lea 0x0 (% esi),% esi' è un no-op solo nel codice a 32 bit. Nel codice a 64 bit, questa istruzione inoltre azzera la parola doppia più alta di% Rsi. Finora ho visto GCC inserire queste istruzioni solo nel codice a 32 bit. – Eugene
.... quindi il punto di AMD "consiglia NOP multibyte". –