Истинный "семантический nop" - это инструкция, которая не имеет никакого эффекта, кроме как занять некоторое время и продвинуть счетчик программ. Многие машины, на которых перемещения от регистра к регистру не влияют на флаги, например, имеют многочисленные инструкции, которые перемещают регистр к себе. Например, на 8088 любое из следующего будет семантическим NOP:
mov al,al
mov bl,bl
mov cl,cl
...
mov ax,ax
mob bx,bx
mov cx,cx
...
xchg ax,ax
xchg bx,bx
xchg cx,cx
...
Обратите внимание, что все вышеперечисленное, кроме "xchg ax, ax", является двухбайтовой инструкцией. Поэтому Intel заявила, что «xchg ax, ax» следует использовать, когда требуется однобайтовая NOP. Действительно, если собрать «mov ax, ax» и разобрать его, он будет разобран как «NOP».
Обратите внимание, что в некоторых случаях команда или последовательность команд могут иметь потенциальные побочные эффекты, но, тем не менее, более желательны, чем обычный "nop". Например, на 6502, если требуется задержка в 7 циклов и указатель стека действителен, но значение вершины стека не имеет значения, PHP, за которым следует PLP, убьет семь циклов, используя только два байта кода. Однако, если значение вершины стека не является резервным байтом ОЗУ, последовательность завершится ошибкой.