In questo output del compilatore, sto cercando di capire come la macchina-codice codifica dell'istruzione nopw
funziona:AMD64 - istruzioni di montaggio nopw?
00000000004004d0 <main>:
4004d0: eb fe jmp 4004d0 <main>
4004d2: 66 66 66 66 66 2e 0f nopw %cs:0x0(%rax,%rax,1)
4004d9: 1f 84 00 00 00 00 00
V'è una certa discussione su "nopw" presso http://john.freml.in/amd64-nopl. Qualcuno può spiegare il significato di 4004d2-4004e0? Dall'esame dell'elenco dei codici operativi, sembra che i codici 66 ..
siano espansioni multibyte. Sento che probabilmente potrei ottenere una risposta migliore a questo qui rispetto a quanto farei a meno che non provassi a estrarre l'elenco dei codici di accesso per alcune ore.
Tale uscita ASM dalla seguente codice (folle) in C, che ottimizza giù ad un semplice ciclo infinito:
long i = 0;
main() {
recurse();
}
recurse() {
i++;
recurse();
}
Quando compilato con gcc -O2
, il compilatore riconosce la ricorsione e giri infinita in un ciclo infinito; lo fa così bene, infatti, che in realtà si aggira nel main()
senza chiamare la funzione recurse()
.
Nota editoriale: le funzioni di riempimento con NOP non sono specifiche per i loop infiniti. Ecco una serie di funzioni con una serie di lunghezze di NOP, on the Godbolt compiler explorer.
Stiamo solo guardando casualmente il junk padding? –
Forse! Non lo so davvero! Questa è la bellezza di tutto! Wheee. In realtà, però, ottengo dal collegamento che il processore STAI caricando un blocco come una sola istruzione per l'ottimizzazione della velocità, sebbene grazie al 'jmp', non lo sia. Ho appena capito il significato. So cosa sia 0x90, ma non so cosa succede con '66 .. ..', o perché è lungo 72 bit. –
Qui non è il motivo, ma potresti trovare [My, che strani NOP hai! - The Old New Thing] (http://blogs.msdn.com/b/oldnewthing/archive/2011/01/12/10114521.aspx) una lettura interessante. – ephemient