В информатике NOP , no-op или NOOP (произносится как «no op»; сокращение от « нет операции ») — это инструкция машинного языка и ее мнемоника языка ассемблера, оператор языка программирования или команда компьютерного протокола , которая ничего не делает.
Некоторые наборы компьютерных команд включают в себя инструкцию, явной целью которой является не изменять состояние каких-либо доступных программисту регистров , флагов состояния или памяти . Для выполнения часто требуется четко определенное количество тактов . В других наборах команд нет явной инструкции NOP, но мнемоника NOP языка ассемблера представляет собой инструкцию, которая действует как NOP; например, на SPARC , sethi 0, %g0
.
NOP не должен обращаться к памяти, так как это может вызвать сбой памяти или страничный сбой .
NOP чаще всего используется для целей синхронизации, для принудительного выравнивания памяти , для предотвращения опасностей , для занятия слота задержки ветвления , для аннулирования существующей инструкции, такой как переход, в качестве цели инструкции выполнения или в качестве места. держатель, который будет заменен активными инструкциями позже при разработке программы (или заменить удаленные инструкции, если реорганизация будет проблематичной или трудоемкой). В некоторых случаях NOP может иметь незначительные побочные эффекты; например, на процессорах Motorola серии 68000 опкод NOP вызывает синхронизацию конвейера . [1]
Ниже перечислены инструкции NOP для некоторых архитектур ЦП:
С точки зрения проектирования аппаратного обеспечения неотображенные области шины часто проектируются так, чтобы возвращать нули; поскольку поведение слайда NOP часто желательно, оно дает предвзятость к его кодированию с использованием опкода со всеми нулями.
Функция или последовательность операторов языка программирования являются оператором NOP или нулевым, если он не имеет никакого эффекта. Нулевые операторы могут требоваться синтаксисом некоторых языков в определенных контекстах.
В Ada оператор null
служит NOP. [9] Поскольку синтаксис запрещает пустые операторы управления или функции, null
оператор должен использоваться для указания того, что никаких действий не требуется. (Таким образом, если программист забудет написать последовательность операторов, программа не сможет скомпилироваться.)
Самый простой оператор NOP в C — это нулевой оператор , который представляет собой просто точку с запятой в контексте, требующем оператора.
;
Пустой блок (составной оператор) также является NOP и может быть более разборчивым:
{}
В некоторых случаях, например, в теле функции, необходимо использовать блок, но он может быть пустым. В C операторы не могут быть пустыми — простые операторы должны заканчиваться символом ; (точка с запятой), а составные операторы заключаются в {} (фигурные скобки), которые сами по себе не требуют последующей точки с запятой. Таким образом, в контекстах, где оператор является грамматически обязательным, можно использовать такой нулевой оператор.
Оператор null сам по себе бесполезен, но его можно использовать в более широком контексте, например, в контексте цикла:
while ( getchar () != '\n' ) {}
альтернативно,
while ( getchar () != '\n' ) ;
или более кратко:
while ( getchar () != '\n' );
(обратите внимание, что последняя форма может сбивать с толку и поэтому генерирует предупреждение с некоторыми компиляторами или опциями компилятора, поскольку точка с запятой обычно указывает на конец инструкции вызова функции, если она помещена после скобки в конце строки).
Приведенный выше код продолжает вызывать функцию getchar() до тех пор, пока она не вернет символ \n (новая строка), по сути, пересылая текущее место чтения стандартного ввода вперед к началу следующей строки.
В Фортране этот CONTINUE
оператор используется в некоторых контекстах, например, в качестве последнего оператора в цикле DO, хотя его можно использовать где угодно и он не имеет никакой функциональности.
В языке JavaScript нет встроенного оператора NOP. Возможны многие реализации:
;
пустой оператор [10] или {}
пустой оператор блока так же, как в примерах C и его производных;undefined
или null
как полный оператор ( оператор выражения ), если предыдущие методы не разрешены синтаксисом.Альтернативами в ситуациях, когда требуется функция, являются:
Function.prototype()
встроенную функцию, которая принимает любые аргументы и возвращает undefined
; [11]const noop = () => {};
Фреймворк AngularJS предоставляет функцию angular.noop, которая не выполняет никаких операций.
Библиотека jQuery предоставляет функцию jQuery.noop()
, которая ничего не делает. [12]
Библиотека Lodash предоставляет функцию _.noop()
, которая возвращает неопределенное значение и ничего не делает. [13]
Как и в случае с C, ; Используемый сам по себе может использоваться как пустой оператор в Паскале . Фактически, из-за спецификации языка в блоке BEGIN/END точка с запятой необязательна перед оператором END, поэтому используемая там точка с запятой является лишней.
Кроме того, блок, состоящий из, BEGIN END;
может использоваться в качестве заполнителя для обозначения отсутствия действия, даже если он помещен внутри другого блока BEGIN/END.
В языке программирования Python есть pass
оператор , который не оказывает никакого эффекта при выполнении и, таким образом, служит NOP. Он в основном используется для обеспечения правильного синтаксиса из-за синтаксиса Python, чувствительного к отступам ; например, синтаксис определения класса требует наличия блока с отступом с логикой класса, которая должна быть выражена так, pass
будто она должна быть пустой.
Команда ' :
' [двоеточие] — это встроенная команда оболочки, действие которой аналогично команде «NOP» (ничего не делающая операция). Технически это не NOP, поскольку он меняет специальный параметр $? (статус завершения последней команды) на 0. Это можно считать синонимом встроенного в оболочку значения «истина», и его статус завершения равен истине (0). [14] [15] [16]
Макроязык типографской системы TeX имеет команду . [17] Сама по себе она ничего не делает, но может использоваться для предотвращения анализа любых последующих токенов непосредственно предшествующей командой. [18]\relax
Многие компьютерные протоколы , такие как telnet , включают команду NOP, которую клиент может ввести, чтобы запросить ответ от сервера, не запрашивая никаких других действий. Такую команду можно использовать, чтобы убедиться, что соединение все еще активно или что сервер отвечает. Команда NOOP является частью следующих протоколов ( это неполный список ):
Обратите внимание, что в отличие от других перечисленных протоколов, команда IMAP4 NOOP имеет конкретную цель — она позволяет серверу отправлять любые ожидающие уведомления клиенту.
Хотя большинство серверов telnet или FTP отвечают на команду NOOP «ОК» или «+OK», некоторые программисты добавляют причудливые ответы клиенту. Например, ftpd
демон MINIX отвечает на NOOP сообщением: [19]
И тебе 200 НООП!
NOP часто используются при взломе программного обеспечения, которое проверяет серийные номера, конкретные требования к аппаратному или программному обеспечению, наличие или отсутствие аппаратных ключей и т. д. в форме слайда NOP . Этот процесс осуществляется путем изменения функций и подпрограмм для обхода проверок безопасности и вместо этого просто возврата проверяемого ожидаемого значения. Поскольку большинство инструкций в процедуре проверки безопасности не будут использоваться, они будут заменены NOP, тем самым удаляя функциональность безопасности программного обеспечения без изменения положения всего, что следует за ним в двоичном файле.
Код операции NOP может использоваться для формирования слайда NOP , который позволяет выполнять код, когда точное значение указателя инструкции является неопределенным (например, когда переполнение буфера приводит к перезаписи адреса возврата функции в стеке).
Обратите внимание, что NOP — это частный случай инструкции SETHI, где imm22 = 0 и rd = 0.
;
), указывающую, что ни один оператор не будет выполнен, даже если синтаксис JavaScript требует этого».Согласно The TeXbook, «TeX ничего не делает», когда встречает файлы
.
На самом деле,
он может сказать TeX: «Это конец того, что вы делали».
\relax
\relax