stringtranslate.com

НОП (код)

В информатике NOP , no-op или NOOP (произносится как «no op »; сокращение от no operation ) — это инструкция машинного языка и ее мнемоника языка ассемблера , оператор языка программирования или команда компьютерного протокола , которая ничего не делает.

Инструкции на машинном языке

Некоторые наборы компьютерных инструкций включают инструкцию, явное назначение которой — не изменять состояние любого из доступных программисту регистров , флагов состояния или памяти . Часто для ее выполнения требуется четко определенное количество тактов . В других наборах инструкций явной инструкции NOP нет, но мнемоника языка ассемблера NOP представляет собой инструкцию, которая действует как NOP; например, на SPARC , sethi 0, %g0.

NOP не должен обращаться к памяти, так как это может привести к сбою памяти или ошибке страницы .

NOP чаще всего используется для целей синхронизации, принудительного выравнивания памяти , предотвращения опасностей , занятия слота задержки перехода , аннулирования существующей инструкции, такой как переход, в качестве цели инструкции выполнения или в качестве заполнителя, который будет заменен активными инструкциями позже в разработке программы (или для замены удаленных инструкций, когда реорганизация будет проблематичной или займет много времени). В некоторых случаях NOP может иметь незначительные побочные эффекты; например, на процессорах серии Motorola 68000 код операции NOP вызывает синхронизацию конвейера . [ 1]

Ниже перечислены инструкции NOP для некоторых архитектур ЦП:

С точки зрения проектирования оборудования неотображенные области шины часто проектируются так, чтобы возвращать нули; поскольку поведение скольжения NOP часто желательно, это дает предубеждение к его кодированию с помощью кода операции «все нули».

Код

Функция или последовательность операторов языка программирования является NOP или нулевым оператором, если она не имеет эффекта. Нулевые операторы могут потребоваться синтаксисом некоторых языков в определенных контекстах.

Ада

В языке Ada оператор nullвыполняет функцию NOP. [9] Поскольку синтаксис запрещает, чтобы управляющие операторы или функции были пустыми, nullоператор должен использоваться для указания того, что никаких действий не требуется. (Таким образом, если программист забудет написать последовательность операторов, программа не сможет скомпилироваться.)

C и производные

Простейшим оператором NOP в языке C является нулевой оператор , который представляет собой просто точку с запятой в контексте, требующем оператора.

Большинство компиляторов C не генерируют код для пустых операторов, что обусловлено историческими причинами и проблемами производительности.

  ;

Пустой блок (составной оператор) также является NOP и может быть более понятным, но компилятор все равно не сгенерирует для него код.

 {}

В некоторых случаях, например, в теле функции, необходимо использовать блок, но он может быть пустым. В языке C операторы не могут быть пустыми — простые операторы должны заканчиваться ;(точкой с запятой), в то время как составные операторы заключаются в {}(фигурные скобки), которые сами по себе не нуждаются в последующей точке с запятой. Таким образом, в контекстах, где оператор грамматически обязателен, может использоваться некоторый такой пустой оператор.

Сам по себе оператор null бесполезен, но он может иметь синтаксическое применение в более широком контексте, например, в контексте цикла:

 в то время как ( getchar () != '\n' ) {}    

в качестве альтернативы,

 пока ( getchar () != '\n' ) ;    

или более кратко:

 пока ( getchar () != '\n' );   

(обратите внимание, что последняя форма может оказаться запутанной и, как таковая, может вызвать предупреждение в некоторых компиляторах или с некоторыми параметрами компилятора, поскольку точка с запятой обычно указывает на конец инструкции вызова функции, если она размещена после скобки в конце строки).

Приведенный выше код продолжает вызывать функцию getchar()до тех пор, пока она не вернет \nсимвол (новой строки), по сути, быстро перемещая текущее положение чтения стандартного ввода на начало следующей строки.

Фортран

В Фортране этот CONTINUEоператор используется в некоторых контекстах, например, в качестве последнего оператора в цикле DO, хотя его можно использовать где угодно, и он не имеет никакой функциональности.

JavaScript

В языке JavaScript нет встроенного оператора NOP. Возможны многие реализации:

Альтернативами в ситуациях, когда требуется функция, являются:

константа нуп = () => {};     

AngularJS

Фреймворк AngularJS предоставляет функцию angular.noop, которая не выполняет никаких операций.

jQuery

Библиотека jQuery предоставляет функцию jQuery.noop(), которая ничего не делает. [12]

Лодаш

Библиотека Lodash предоставляет функцию _.noop(), которая возвращает undefined и ничего не делает. [13]

Паскаль

Как и в языке C, ;, используемый сам по себе, может использоваться в качестве пустого оператора в Pascal . Фактически, из-за спецификации языка, в блоке BEGIN / END точка с запятой необязательна перед оператором END, поэтому точка с запятой, используемая там, излишня.

Кроме того, блок, состоящий из, BEGIN END;может использоваться в качестве заполнителя для указания отсутствия действия, даже если он помещен внутри другого блока BEGIN / END.

Питон

В языке программирования Python есть passоператор , который не имеет эффекта при выполнении и, таким образом, служит NOP. Он в основном используется для обеспечения правильного синтаксиса из-за синтаксиса Python, чувствительного к отступам ; например, синтаксис для определения класса требует отступа блока с логикой класса, который должен быть выражен как, passкогда он должен быть пустым.

Скрипты оболочки (bash, zsh и т. д.)

Команда ' :' [двоеточие] — это встроенная команда оболочки, которая имеет эффект, аналогичный "NOP" (операция бездействия). Технически это не NOP, так как она изменяет специальный параметр $? (статус выхода последней команды) на 0. Ее можно считать синонимом встроенной команды оболочки 'true', и ее статус выхода — true (0). [14] [15] [16]

Макроязык TeX (ConTeXt, LaTeX и т. д.)

В макроязыке типографской системы TeX есть команда . [17] Сама по себе она ничего не делает, но может использоваться для предотвращения разбора последующих токенов непосредственно предшествующей командой. [18]\relax

Команды протокола NOP

Многие компьютерные протоколы , такие как telnet , включают команду NOP, которую клиент может выдать, чтобы запросить ответ от сервера, не запрашивая никаких других действий. Такая команда может использоваться, чтобы убедиться, что соединение все еще активно или что сервер отвечает. Команда NOOP является частью следующих протоколов ( это неполный список ):

Обратите внимание, что в отличие от других перечисленных протоколов команда IMAP4 NOOP имеет конкретную цель — она позволяет серверу отправлять клиенту любые ожидающие уведомления.

В то время как большинство серверов telnet или FTP отвечают на команду NOOP сообщением "OK" или "+OK", некоторые программисты добавили клиенту необычные ответы. Например, ftpdдемон MINIX отвечает на команду NOOP сообщением: [19]

200 NOOP и вам!

Трещины

NOP часто используются при взломе программного обеспечения, которое проверяет серийные номера, определенные требования к оборудованию или программному обеспечению, наличие или отсутствие аппаратных ключей и т. д. в форме слайда NOP . Этот процесс выполняется путем изменения функций и подпрограмм для обхода проверок безопасности и вместо этого простого возврата ожидаемого значения, которое проверяется. Поскольку большинство инструкций в процедуре проверки безопасности не будут использоваться, они будут заменены NOP, тем самым удаляя функциональность безопасности программного обеспечения без изменения позиционирования всего, что следует в двоичном файле.

Эксплойты безопасности

Код операции NOP может использоваться для формирования слайда NOP , который позволяет коду выполняться, когда точное значение указателя инструкции неопределено (например, когда переполнение буфера приводит к перезаписи адреса возврата функции в стеке).

Смотрите также

Ссылки

  1. ^ ab "Справочное руководство программиста Motorola 68000" (PDF) .
  2. ^ abcd "Руководство разработчика программного обеспечения для архитектур Intel 64 и IA-32: Справочник по набору инструкций от AZ" . Получено 01.03.2012 .
  3. ^ AMD, Руководство пользователя микропроцессора Am29050, 1991, страницы 223 и 257.
  4. ^ "4.8.4. Псевдоинструкция NOP ARM". Инструменты компиляции RealView для ассемблера BREW. Руководство .
  5. ^ "5.6.3. Псевдоинструкция NOP Thumb". Инструменты компиляции RealView для ассемблера BREW. Руководство .
  6. ^ ab Hewlett-Packard, PA-RISC 2.0 Architecture, 1995, страницы 2-21 и 7-103. Архивировано 21 июня 2020 г.
  7. ^ RISC-V Foundation, Руководство по набору инструкций RISC-V, Том 1: ISA уровня пользователя, версия 2.2, 7 мая 2017 г., стр. 79.
  8. ^ Weaver, DL; Germond, T., ред. (1994). Руководство по архитектуре SPARC, версия 9 (PDF) . Prentice Hall . ISBN 0-13-825001-4. Архивировано из оригинала (PDF) 2012-01-18 . Получено 2014-01-09 . Обратите внимание, что NOP является особым случаем инструкции SETHI, с imm22 = 0 и rd = 0.
  9. ^ Справочное руководство по Ada — пустые операторы. «Выполнение null_statement не имеет никакого эффекта».
  10. ^ Справочник MDN JavaScript – пустой оператор. «Пустой оператор – это точка с запятой ( ;), указывающая, что никакой оператор не будет выполнен, даже если синтаксис JavaScript этого требует».
  11. ^ Спецификация языка ECMAScript – Издание 5.1 – Свойства объекта прототипа функции
  12. ^ jQuery.noop() из документации jQuery API
  13. ^ "Lodash Documentation". lodash.com . Получено 2017-12-15 .
  14. ^ Расширенное руководство по написанию сценариев Bash > Глава 3. Специальные символы
  15. ^ bash manpage > ВСТРОЕННЫЕ КОМАНДЫ ОБОЛОЧКИ
  16. ^ zsh manpage (zshbuiltins) > ВСТРОЕННЫЕ КОМАНДЫ ОБОЛОЧКИ
  17. ^ Bausum, David (2002). "TeX Primitive Control Sequences". Справочное руководство TeX. Kluwer Academic Publishers . Получено 1 апреля 2020 г. Согласно The TeXbook, «TeX ничего не делает», когда сталкивается с . На самом деле, может сказать TeX: «Это конец того, что вы делали».\relax\relax
  18. ^ TeX wikibook – расслабьтесь
  19. ^ "ftpd.c" . Получено 2016-06-19 .