В информатике, a NOP, no-op, или NOOP (произносится как «no op»; сокращение от no operation ) - инструкция языка ассемблера, язык программирования оператор или компьютерный протокол команда, которая ничего не делает.
Некоторые компьютерные наборы команд включают инструкция, явная цель которой - не изменять состояние какого-либо из доступных для программиста регистров, флагов состояния или памяти. Часто для выполнения требуется четко определенное количество тактовых циклов. В других наборах команд NOP можно моделировать, выполняя команду, имеющую операнды, которые вызывают такой же эффект; например, на процессоре SPARC инструкция sethi 0,% g0
является рекомендуемым решением.
NOP чаще всего используется для целей синхронизации, для принудительного выравнивания памяти, для предотвращения опасностей, чтобы занять слот задержки перехода, для аннулирования существующей инструкции, такой как переход, или в качестве заполнителя, который будет заменен активными инструкциями позже при разработке программы (или для замены удаленных инструкций, когда реорганизация будет проблематичной или требует много времени). В некоторых случаях NOP может иметь незначительные побочные эффекты; например, на процессорах серии Motorola 68000 код операции NOP вызывает синхронизацию конвейера.
Ниже перечислены инструкции NOP для некоторых архитектур ЦП:
Архитектура ЦП | Инструкция мнемоника | Байт | Код операции | Примечания |
---|---|---|---|---|
Intel x86 ЦП семейство | NOP | 1; 1–9 для i686 и x86-64 | 0x 90 | 0x90 декодируется в xchg eax, eax во всех режимах, кроме длинного режима, где код операции 0x90 по-прежнему не действует. Более длинные кодировки описаны в руководстве Intel. |
Intel 8051 / Семейство MCS-51 | NOP | 1 | 0x00 | |
ARM A32 | NOP | 4 | 0x00000000 | Это означает и r0, r0, r0. Инструкция сборки nop, скорее всего, будет расширена до mov r0, r0, который закодирован 0xE1A00000 (архитектура с прямым порядком байтов). |
ARM T32 (16 бит) | NOP | 2 | 0xb000 | Код операции для ADD SP, # 0- добавить ноль в указатель стека (нет операции). Инструкция сборки nop, скорее всего, будет расширена до mov r8, r8, который закодирован 0x46C0. |
ARM T32 (32 бит) | NOP | 4 | 0xF3AF 8000 | |
ARM A64 (64 бит) | NOP | 4 | 0xD503201F | |
AVR | NOP | 2 | 0x0000 | один тактовый цикл |
IBM System / 360, IBM System / 370, IBM System / 390, z / Architecture, UNIVAC Series 90 | NOP | 4 | 0x47000000 или 0x470nnnnn или 0x47n0nnnn, где «n» - любое 4-битное значение. | NOP («Нет операции») и NOPR («Регистр без операции») являются подмножеством инструкций «Переход по условию» или «Переход по регистру условий» соответственно; обе версии имеют два варианта создания NO-OP. В случае инструкций NOP и NOPR первый 0 во втором байте является значением «маски», условием для проверки, таким как равенство, не равно, высокий, низкий и т. Д. Если маска равна 0, ветвления нет. В случае инструкции NOPR второе значение во втором байте - это регистр для перехода. Если выбран регистр 0, ветвление не происходит независимо от значения маски. Таким образом, если одно из двух значений во втором байте равно 0, ветвление не произойдет. В случае команды NOP второе значение во втором байте является «базовым» регистром объединенного базового регистра, регистра смещения и адреса смещения. Если базовый регистр также равен 0, переход не выполняется независимо от значения регистра смещения или адреса смещения. |
NOPR | 2 | 0x0700 или 0x070n или 0x07n0, где «n» - любое 4-битное значение. | ||
SuperH | NOP | 2 | 0x0009 | |
MIPS | NOP | 4 | 0x00000000 | Означает sll r0, r0,0 , что означает: регистр логического сдвига 0 нулевых битов слева и сохранить результат в регистре 0 |
MIPS-X | NOP | 4 | 0x60000019 | (расширенный код операции для добавить r0, r0, r0 ) |
MIX | NOP | 1 слово | ± * * * * 0 | * байты являются произвольными и могут быть любыми от 0 до максимального байта (требуется, чтобы он находился в диапазоне 63-99). MIX использует знаковое представление. |
MMIX | SWYM | 4 | 0xFD ****** | SWYM означает «Сочувствовать вашей технике». Цифры * могут выбирается произвольно. |
Семейство Motorola 68000 | NOP | 2 | 0x4E71 | Это синхронизирует конвейер и предотвращает перекрытие команд. |
Motorola 6809 | NOP | 1 | 0x12 | |
Технология MOS 65xx (например, 6502 ) | NOP | 1 | 0xEA | NOPпотребляет два тактовых цикла. Неопределенные коды операций в NMOS версии семейства 65xx были преобразованы в NOP с различными инструкциями длины и время цикла в 65C02. |
PowerPC | NOP | 4 | 0x60000000 | (расширенный код операции для ori r0, r0,0 ) |
микроконтроллер PIC | NOP | 12 бит | 0b000000000000 | MOVW 0, W |
RISC-V | NOP | 4 | 0x00000013 | ADDI x0, x0, 0 |
SPARC | NOP | 4 | 0x01000000 | Обозначает sethi 0,% g0 , который обнуляет фиксированное значение % g0 регистра |
Z80 | NOP | 1 | 0x00 | Есть некоторые другие инструкции без какого-либо эффекта (и с таким же временем): LD A, A , LD B, B и т. Д. |
PDP-11 | NOP | 16 бит | 000240 (восьмеричное) | Не сбрасывать ни один из кодов условий |
VAX | NOP | 1 | 0x01 | Задержка зависит от типа процессора |
С точки зрения проектирования оборудования неотмеченные области шины часто предназначены для возврата нулей; поскольку поведение слайда NOP часто бывает желательным, оно дает предвзятость к его кодированию с помощью кода операции «все нули».
NOP иногда используется как описание действия, выполняемого функцией или последовательностью операторов языка программирования, если функция или код не действуют (это также может называться избыточный код ). Обычная оптимизация компилятора - это обнаружение и удаление этого вида кода. Такой код может потребоваться грамматикой языка программирования, которая не допускает пропусков.
В Ada оператор null
служит NOP. Поскольку синтаксис запрещает, чтобы операторы управления или функции были пустыми, необходимо использовать оператор null
, чтобы указать, что никаких действий не требуется. (Таким образом, если программист забудет написать последовательность операторов, программа не сможет скомпилировать.)
Вторая строка ниже является примером единственного Оператор C, который ведет себя как NOP. На практике большинство компиляторов не генерируют код для этого оператора:
int i = 0; я + 1;
Этот оператор выполняет сложение и отбрасывает результат. В самом деле, любой оператор без побочных эффектов (и который не влияет на поток управления, например, break, return) может быть удален, так как результат вычисления отбрасывается.
Простейшим возможным оператором в C, который ведет себя как NOP, является так называемый пустой оператор, который представляет собой всего лишь точку с запятой в контексте, требующем оператора. (В этом случае компилятор не требуется для генерации инструкции NOP; обычно никакие инструкции не генерируются.)
;
В качестве альтернативы можно использовать пустой блок (составной оператор), который может быть более разборчивым:
{}
В некоторых случаях, например в теле функции, должен использоваться блок, но он может быть пустым. В C операторы не могут быть пустыми - простые операторы должны заканчиваться на; (точка с запятой), а составные операторы заключаются в {} (фигурные скобки), что само по себе не требует следующей точки с запятой. Таким образом, в контекстах, где грамматически требуется оператор, можно использовать такой пустой оператор.
Пустой оператор сам по себе бесполезен, но он может иметь синтаксическое использование в более широком контексте, например, в контексте цикла:
while (getchar ()! = '\ N') {}
в качестве альтернативы
while (getchar ()! = '\ N');
или более кратко:
while (getchar ()! = '\ N');
(обратите внимание, что последняя форма может сбивать с толку и, как таковая, генерирует предупреждение с некоторыми компиляторами или параметрами компилятора, поскольку точка с запятой обычно указывает на конец инструкции вызова функции, когда помещается после скобки в конце строки).
Приведенный выше код продолжает вызывать функцию getchar () до тех пор, пока она не вернет символ \ n (новая строка), по существу переместив текущее место чтения стандартного ввода в начало следующей строки.
В Fortran оператор CONTINUE
используется в некоторых контекстах, таких как последний оператор в цикле DO, хотя он может быть используется где угодно и не имеет никакого функционала.
Язык JavaScript не имеет встроенного оператора NOP. Возможны многие реализации:
;
' или оператор пустого блока '{}
' так же, как в C и производных examples;undefined
или null
в качестве полного оператора (оператора выражения), когда предыдущие методы не допускаются синтаксисом.Альтернативы в ситуациях, когда функция требуется:
Function.prototype ()
, которая принимает любые аргументы и возвращает undefined
;const noop = () =>{};
Фреймворк AngularJS предоставляет функцию angular.noop, которая не выполняет никаких операций.
Библиотека jQuery предоставляет функцию jQuery.noop ()
, которая ничего не делает.
Библиотека Lodash предоставляет функцию _.noop ()
, которая возвращает undefined и ничего не делает.
Как и в случае с C, то; сам по себе может использоваться как пустой оператор в Pascal. Фактически, из-за спецификации языка в блоке BEGIN / END точка с запятой является необязательной перед оператором END, поэтому точка с запятой, используемая там, является излишней.
Кроме того, блок, состоящий из BEGIN END;
, может использоваться в качестве заполнителя для обозначения отсутствия действия, даже если он помещен в другой блок BEGIN / END.
В языке программирования Python есть оператор pass
, который не действует при выполнении и, таким образом, служит НОП. Он в основном используется для обеспечения правильного синтаксиса из-за синтаксиса Python , чувствительного к отступам ; например, синтаксис для определения class требует блока с отступом с логикой класса, который должен быть выражен как pass
, когда он должен быть пустым.
Команда ':
' [двоеточие] - это встроенная оболочка, которая имеет эффект, аналогичный «NOP» ( бездействие). Технически это не NOP, поскольку он меняет специальный параметр $? (статус выхода последней команды) на 0. Это может считаться синонимом встроенной оболочки «истина», а ее статус выхода - истина (0).
Макроязык типографской системы TeX имеет команду \ relax
. Сам по себе он ничего не делает, но может использоваться для предотвращения анализа всех последующих токенов непосредственно предшествующей командой.
Многие компьютерные протоколы, например telnet, включите команду NOP, которую клиент может выполнить, чтобы запросить ответ от сервера, не запрашивая никаких других действий. Такую команду можно использовать , чтобы убедиться, что соединение все еще активно или что сервер отвечает. Команда NOOP является частью следующих протоколов (это неполный список):
Обратите внимание, что в отличие от других перечисленных протоколов, команда IMAP4 NOOP имеет определенное назначение - она позволяет серверу отправлять любые ожидающие уведомления клиенту.
Хотя большинство серверов telnet или FTP отвечают на команду NOOP с помощью «OK» или «+ OK», некоторые программисты добавили необычные ответы клиенту. Например, демон ftpd
из MINIX отвечает на NOOP сообщением:
200 NOOP и вам!
NOP часто используются при взломе программного обеспечения, которое проверяет серийные номера, конкретные требования к оборудованию или программному обеспечению, наличие или отсутствие аппаратных электронных ключей и т. д. Этот процесс выполняется путем изменения функций и подпрограмм , чтобы обойти проверки безопасности и вместо этого просто вернуть проверяемое ожидаемое значение. Поскольку большинство инструкций в подпрограмме проверки безопасности не будут использоваться, они будут заменены на NOP, что приведет к удалению функций безопасности программного обеспечения без изменения расположения всего, что следует в двоичном файле.
Код операции NOP может использоваться для формирования слайда NOP, который позволяет коду выполняться, когда точное значение указателя инструкции не определено (например, когда переполнение буфера вызывает перезапись адреса возврата функции в стеке).