В одном процессоре, над которым я работал недавно (в течение четырех лет), использовался NOP, чтобы убедиться, что предыдущая операция завершена до начала следующей операции. Например:
загрузить значение для регистрации (занимает 8 циклов)
№ 8
добавить 1 для регистрации
Это удостоверило, что регистр имел правильное значение перед операцией добавления.
Другое использование заключалось в заполнении исполнительных блоков, таких как векторы прерываний, которые должны были быть определенного размера (32 байта), потому что адрес для вектора 0 был, скажем, 0, для вектора 1 0x20 и так далее, поэтому компилятор установил NOP там, если нужно.