nop
pseudolyszt.net couvre nop et d'autres instructions RISC-V plus en détail.
Description
nop ne fait rien. Le nom est l'abréviation de « no operation » (aucune opération). Lorsque le processeur atteint un nop, aucun registre ne change, aucune mémoire n'est touchée, et l'exécution se poursuit avec l'instruction suivante. Il occupe un emplacement dans le programme et un tick de temps s'écoule.
nop est une pseudo-instruction pour la ligne ci-dessous.
addi zero, zero, 0
RISC-V inclut un registre appelé zero qui contient toujours 0. Une lecture renvoie 0, et une écriture est ignorée. Ce addi ajoute 0 et 0 et ignore le résultat, donc l'instruction se termine et rien ne change. RISC-V n'a pas besoin d'un nop dédié car le registre zero en fournit un.
Les processeurs réels utilisent les nops comme remplissage, afin qu'une instruction ultérieure commence à une frontière mémoire que le matériel gère plus rapidement, et comme espaces réservés que les outils écrasent plus tard avec de vraies instructions. Les compilateurs les insèrent systématiquement, c'est pourquoi le code désassemblé en contient même si aucun programmeur ne les a saisis.
Le manuel RISC-V indique que nop ne modifie aucun état visible architecturalement, c'est-à-dire rien qu'un programme puisse observer, hormis l'avancement du pc et l'incrémentation des éventuels compteurs de performance. Il en donne deux usages : aligner des segments de code sur des frontières d'adresses adaptées au matériel, et laisser de la place pour des modifications ultérieures du code. Le manuel explique que l'encodage utilise addi parce que cette instruction coûte le moins de ressources sur la plupart des systèmes, puisqu'elle ne lit qu'un seul registre.
Dans ce simulateur, nop sert d'espacement ou de marqueur pendant les expériences. Sauter par-dessus un nop avance le pc de 4 et ne modifie aucun registre ni emplacement mémoire.
Se développe en
addi zero, zero, 0
L'assembleur remplace cette pseudo-instruction par la ou les instructions réelles listées ci-dessus.
Exemple
li t0, 1 nop # advances one instruction, changes nothing addi t0, t0, 1 # t0 = 2
