Certains codes NOP sont-ils traités différemment des autres?


12

Je suis curieux de cela, disons que j'ai:

00000000001 90                              nop        
00000000002 90                              nop        
00000000003 90                              nop 

Est-il exécuté exactement de la même manière?

00000000001 0F1F00                          nop        dword [ds:rax]

Quel effet aurait le deuxième exemple par rapport au premier?


1
Je serais enclin à penser que la seconde s'exécuterait plus rapidement que la première car c'est une instruction plutôt que 3. Il est possible que le pipelining moderne change cela, cependant.
Loren Pechtel

1
Pourquoi est-ce marqué c ?
Keith Thompson

Google pour multi byte nop, se présente pas mal de résultats.
phant0m

1
@KeithThompson - J'ai retiré les balises de style C et de codage; ils n'appartenaient pas.

@ phant0m - pourriez-vous mettre ce commentaire dans une réponse et résumer certains des résultats les plus pertinents? Nous n'avons pas tous les antécédents pour bien comprendre ce qui reviendrait de cette requête de recherche.

Réponses:


2

Cela dépend de l'architecture de la machine. Le KA-10 classique (pdp-10) avait beaucoup de codes nop, probablement une conséquence de son jeu d'instructions très régulier et du fait qu'il a été implémenté par des composants discrets, pas par un microcode. Certains NOP ont fait référence à la mémoire, certains étaient des tests de sauts qui n'ont jamais sauté, mais ont néanmoins testé la condition qui aurait pu provoquer un saut, etc. "JFCL 0", a été annoncé dans le manuel comme le nop le plus rapide.


J'ai travaillé sur un assembleur (8085?) Qui offrait la possibilité de remplacer plusieurs NOP par une seule instruction JMP. Vous avez obtenu l'alignement que vous vouliez sans payer la pénalité de performance. Pratique lorsque vous aviez des chaînes en PIC, pas si pratique si vous aviez des boucles de synchronisation basées sur le processeur (c'est pourquoi il était désactivé par défaut).
TMN

La plupart du temps, l'instruction NOP est utilisée pour insérer un court délai, généralement en raison de certaines dépendances matérielles ou d'errata de périphérique. La pénalité de performance est la raison de l'utilisation du NOP.
2012

1
les nops ont beaucoup d'utilisations ésotériques. Certaines architectures ont des exigences d'alignement d'octets pour les sauts. Le code auto-modifiant (horreurs!) Utilisait des nops comme points d'épissage. Les systèmes de bogues utilisaient nops pour stocker des informations sur les assertions ayant échoué.
2012

@ddyer: Certains processeurs ont des instructions (parfois documentées, parfois non) qui vont récupérer un octet de mémoire et ignorer complètement la valeur récupérée, ou ne rien faire avec, sauf des indicateurs définis dont le programmeur peut ne pas se soucier. Sur le 6502, il était assez courant d'utiliser l'instruction "BIT abs" comme moyen d'avaler les deux octets suivants; il existe également des opcodes non documentés qui se comportent de la même manière, sauf qu'ils ne mettent à jour aucun indicateur. Une mise en garde avec de telles astuces, cependant: elles entraîneront la lecture d'un octet d'espace d'adressage. Certains périphériques 6502 peuvent réagir aux opérations de lecture.
supercat

0

Il semble que le deuxième exemple devrait s'exécuter plus rapidement que le premier. Dans le premier exemple, trois instructions distinctes seront exécutées. Dans le second, une seule instruction. Les NOP multi-octets sont destinés à être utilisés pour des "conseils" CPU (exactement comment et quand est apparemment confidentiel ). Ils peuvent être utiles à des fins d'alignement (pour démarrer une boucle étroite sur une ligne de cache), mais ils n'ont actuellement aucune autre utilisation. Il n'est pas clair si le CPU évalue réellement les arguments, il n'est donc pas possible de dire s'il augmente le temps de décodage des instructions ou encourt une pénalité d'accès à la mémoire. Quelqu'un avec un bon ICE veut tester l'un d'eux et voir quelles adresses apparaissent sur une trace de bus?


Bien que de nombreux assembleurs 6502 utilisent le mnémonique "NOP" pour les opcodes non documentés qui effectuent une extraction de mémoire (par exemple NOP $ 1FF9) serait une instruction à deux octets qui lit l'adresse 0x1FF9 et ignore la valeur lue), je ne m'attendrais pas à ce qu'un fabricant de puces utilisez le terme "nop" pour une instruction qui ne fait rien de plus que faire avancer le compteur de programme / pointeur d'instruction car il n'y a aucune garantie qu'un processeur ne sera pas connecté au matériel qui déclenche des actions (par exemple passer à la banque de codes 1) lorsque certaines adresses (comme 0x1FF9 ) sont accessibles, et un tel déclenchement n'est pas exactement "aucune opération" ,.
supercat
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.