2012-05-08 12 views

risposta

16

È 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.

+1

Quest'ultimo, a meno che GCC non sia un generatore di codice maldestro. Grazie per la risposta rapida. – Brian

+3

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

+3

.... quindi il punto di AMD "consiglia NOP multibyte". –