Cosa NOPL fare sistema x86?

qual è la funzione di NOPL in macchina x86? Ci si sente come non fare nulla, ma perché è sempre in codice assembly?

InformationsquelleAutor | 2012-09-24



3 Replies
  1. 35

    NOP è un byte di “non fare nulla” operazione, letteralmente “nessuna operazione”. NOPW, NOPL, ecc.. sono l’equivalente di fare nulla, ma prendere la parola e a lungo-size byte.

    ad esempio

    NOP //1byte opcode
    NOP //1byte opcode
    

    è equivalente a fare

    NOPW //2byte opcode.
    

    Sono molto pratico per imbottitura per le cose in modo un codice che inizia la sequenza di un particolare limite di memoria, prendendo un paio di byte di istruzione di spazio, ma in realtà non fa nulla.

    NOP è solo l’effetto della CPU è quello di incrementare IP/EIP da 1. Il NOPx equivalenti farà da 2, 4, ecc…

    • Non ho mai sentito parlare di operazione NOPW e NOPL nel set di istruzioni di un x86.. né appaiono in Intel Riferimento del Set di Istruzioni 🙂 Forse stai mescolando le diverse architetture
    • odori come AT&T sintassi per me
    • Non so.. gcc si lamenta se io uso nopw/nopl invece di nop
    • ha per te un operando?
    • ok che è strano, e purtroppo non ho la minima idea di dove è documentata (se ovunque..)
    • Su X86, NOP è semplicemente un alias per “XCHG AX,AX” dal momento che un singolo ciclo di istruzione con effetto al di là di incremento IP. Ci sono un certo numero di due byte istruzioni che potrebbero servire a tale scopo, compresi quelli che spostare un registro a se stesso (il codice operativo che rappresenta MOV AX,AX in alcuni contesti potrebbe rappresentare MOV EAX,EAX in altri, ma in entrambi i casi l’unico effetto sarebbe quello di IP da due).
    • Essere consapevoli del fatto che non si può “solo” scegliere un apparentemente idempotente operazione. XCHG AX,AX e XCHG BX,BX sono non identico. Il primo è ufficiale NOP e non non causa una dipendenza di dati.

  2. 33

    Secondo Giovanni Fremlin blog: Operandi NOP su AMD64, nopw, nopl etc. sono gas sintassi, non AT&T sintassi.

    Di seguito sono istruzioni codifiche generato da gas per diversi nop‘s da gas sorgente per l'istruzione lunghezze da 3 a 15 byte. Nota che alcuni sono la stessa Intel consiglia nop forme (vedi sotto), ma non tutti. In particolare, in più nop's gas usi multipli (fino a 5) consecutivi 0x66 operando prefissi diversi nop forme, considerando che Intel consiglia nop forme non usare mai più di uno 0x66 operando prefisso in ogni singolo raccomandato nop istruzione.

    nop codifiche dal il codice sorgente per gas 2.30 (riformattato per migliorare la leggibilità):

    /* nopl (%[re]ax) */
    static const unsigned char alt_3[] = {0x0f,0x1f,0x00};
    /* nopl 0(%[re]ax) */
    static const unsigned char alt_4[] = {0x0f,0x1f,0x40,0x00};
    /* nopl 0(%[re]ax,%[re]ax,1) */
    static const unsigned char alt_5[] = {0x0f,0x1f,0x44,0x00,0x00};
    /* nopw 0(%[re]ax,%[re]ax,1) */
    static const unsigned char alt_6[] = {0x66,0x0f,0x1f,0x44,0x00,0x00};
    /* nopl 0L(%[re]ax) */
    static const unsigned char alt_7[] = {0x0f,0x1f,0x80,0x00,0x00,0x00,0x00};
    /* nopl 0L(%[re]ax,%[re]ax,1) */
    static const unsigned char alt_8[] = {0x0f,0x1f,0x84,0x00,0x00,0x00,0x00,0x00};
    /* nopw 0L(%[re]ax,%[re]ax,1) */
    static const unsigned char alt_9[] =
      {0x66,0x0f,0x1f,0x84,0x00,0x00,0x00,0x00,0x00};
    /* nopw %cs:0L(%[re]ax,%[re]ax,1) */
    static const unsigned char alt_10[] =
      {0x66,0x2e,0x0f,0x1f,0x84,0x00,0x00,0x00,0x00,0x00};
    static const unsigned char *const alt_patt[] = {
      f32_1, f32_2, alt_3, alt_4, alt_5, alt_6, alt_7, alt_8,
      alt_9, alt_10
    };

    Intel utilizza una sintassi diversa, e ci sono nop'disponibile per tutte le istruzioni lunghezze da 1 a 9 byte. Ci sono diversi nop's, come tutti nop's più di due byte accettare 1 operando. Un byte nop (0x90) è sinonimo di xchg (e)ax,(e)ax.

    Intel® 64 e IA-32 Architetture Software Developer Manuale, Volume 2 (2A, 2B & 2C): Set di Istruzioni di Riferimento, A-Z, CAPITOLO 4: SET di ISTRUZIONI di RIFERIMENTO, M-Z liste raccomandato nop forme di istruzioni diverse lunghezze:

    Table 4-12. Recommended Multi-Byte Sequence of NOP Instruction
    
    Length   Assembly                                   Byte Sequence
    2 bytes  66 NOP                                     66 90H
    3 bytes  NOP DWORD ptr [EAX]                        0F 1F 00H
    4 bytes  NOP DWORD ptr [EAX + 00H]                  0F 1F 40 00H
    5 bytes  NOP DWORD ptr [EAX + EAX*1 + 00H]          0F 1F 44 00 00H
    6 bytes  66 NOP DWORD ptr [EAX + EAX*1 + 00H]       66 0F 1F 44 00 00H
    7 bytes  NOP DWORD ptr [EAX + 00000000H]            0F 1F 80 00 00 00 00H
    8 bytes  NOP DWORD ptr [EAX + EAX*1 + 00000000H]    0F 1F 84 00 00 00 00 00H
    9 bytes  66 NOP DWORD ptr [EAX + EAX*1 + 00000000H] 66 0F 1F 84 00 00 00 00 00H
    

    Quindi, oltre a questi nopconsigliato da Intel, ci sono molti altri nop's troppo. Oltre ad allineare l'istruzione di uno specifico limite di memoria, come Marc B cita nella sua risposta, nop's sono anche molto utili in self-modifica del codice, debug e di reverse engineering.

    • Si noti che su amd64, nop non è più sinonimo di xchg eax,eax. nop non a zero il top 32 bit di eax, ma xchg eax,eax fa.
  3. 6

    In realtà, NOP, saranno utilizzati nel codice assembly quando il codice deve essere applicata la patch.

    Perché la dimensione delle nuove istruzioni può essere diverso da quello dei vecchi, è necessaria la spaziatura.

    L’imbottitura istruzione dovrebbe agire come lo stesso come NOP, anche se può occupare diversi byte.

    La ragione che si inserisce in un più complesso di istruzioni, come 66 90, invece di diversi Pon, è una istruzione in genere viene eseguito più rapidamente rispetto a molti dei Pon.

Lascia un commento