Alcuni codici NOP sono trattati in modo diverso rispetto ad altri?


12

Sono curioso di questo, diciamo che ho:

00000000001 90                              nop        
00000000002 90                              nop        
00000000003 90                              nop 

Viene eseguito esattamente come questo?

00000000001 0F1F00                          nop        dword [ds:rax]

Che effetto avrebbe il secondo esempio rispetto al primo?


1
Sarei propenso a pensare che il secondo sarebbe eseguito più velocemente del primo poiché è un'istruzione anziché 3. È possibile che la pipeline moderna cambierebbe ciò, però.
Loren Pechtel,

1
Perché questo è taggato c ?
Keith Thompson,

Google per multi byte nop, mostra parecchi risultati.
phant0m

1
@KeithThompson - Ho estratto i tag C e di codifica; non appartenevano.

@ phant0m: inseriresti quel commento in una risposta e riassumi alcuni dei risultati più pertinenti? Non tutti noi abbiamo le basi per capire correttamente cosa sarebbe tornato da quella query di ricerca.

Risposte:


2

Dipende dall'architettura della macchina. Il classico KA-10 (pdp-10) aveva molti codici nop, probabilmente una conseguenza del suo set di istruzioni altamente regolare e del fatto che era tutto implementato da componenti descrittivi, non da microcodice. Alcuni NOP hanno fatto riferimento alla memoria, altri erano skip test che non sono mai stati ignorati, ma hanno comunque verificato la condizione che potrebbe aver causato un salto e così via. "JFCL 0" è stato pubblicizzato nel manuale come il nop più veloce.


Una volta ho lavorato su un assemblatore (8085?) Che offriva l'opzione di sostituire più NOP con una singola istruzione JMP. Hai ottenuto l'allineamento desiderato senza pagare la penalità di prestazione. Utile quando si avevano stringhe in PIC, non molto utile se si avessero loop di temporizzazione basati sulla CPU (motivo per cui era disattivato per impostazione predefinita).
TMN,

La maggior parte delle volte l'istruzione NOP viene utilizzata per inserire un breve ritardo, di solito a causa di una dipendenza hardware o di errori del dispositivo. La penalità prestazionale è la ragione per l'utilizzo del NOP.
uɐɪ

1
nops ha molti usi esoterici. Alcune architetture hanno requisiti di allineamento dei byte per i salti. Codice auto-modificante (orrori!) Usato nops come punti di giunzione. I sistemi di bug hanno usato nops per memorizzare informazioni su asserzioni fallite.
lugubre il

@ddyer: alcuni processori hanno istruzioni (a volte documentate, a volte no) che prenderanno un byte di memoria e ignoreranno completamente il valore recuperato, o non faranno nulla con esso tranne i flag impostati che potrebbero non interessarsi al programmatore. Sul 6502, era abbastanza comune usare l'istruzione "BIT abs" come mezzo per divorare i due byte successivi; ci sono anche alcuni codici operativi non documentati che si comportano in modo simile tranne che non aggiornano alcun flag. Un avvertimento con tali trucchi, tuttavia: causeranno la lettura di un byte di spazio degli indirizzi. Alcune periferiche 6502 possono reagire alle operazioni di lettura.
Supercat,

0

Sembra che il secondo esempio dovrebbe essere eseguito più rapidamente del primo. Nel primo esempio, verranno eseguite tre istruzioni separate. Nel secondo, solo un'istruzione. I NOP ​​multi-byte devono essere utilizzati per "suggerimenti" sulla CPU (esattamente come e quando apparentemente è riservato ). Possono essere utili ai fini dell'allineamento (per avviare un ciclo stretto su una riga della cache), ma attualmente non hanno altro utilizzo. Non è chiaro se la CPU valuti effettivamente gli argomenti, quindi non è possibile dire se aumenta il tempo di decodifica delle istruzioni o incorre in una penalità di accesso alla memoria. Qualcuno con un buon GHIACCIO vuole testarne uno e vedere quali indirizzi compaiono su una traccia del bus?


Sebbene molti 6502 assemblatori utilizzino il "NOP" mnemonico per codici operativi non documentati che eseguono un recupero di memoria (ad esempio NOP $ 1FF9) sarebbe un'istruzione a due byte che legge l'indirizzo 0x1FF9 e ignora il valore letto), non mi aspetto che un produttore di chip lo faccia usa il termine "nop" per un'istruzione che fa qualcosa in più rispetto al contatore del programma / puntatore alle istruzioni poiché non c'è garanzia che un processore non sarà agganciato all'hardware che innesca azioni (ad esempio il passaggio al banco di codici 1) quando determinati indirizzi (come 0x1FF9 ), e tale attivazione non è esattamente "nessuna operazione" ,.
supercat
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.