stringtranslate.com

НОП (код)

В информатике 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оператор должен использоваться для указания того, что никаких действий не требуется. (Таким образом, если программист забудет написать последовательность операторов, программа не сможет скомпилироваться.)

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

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

  ;

Пустой блок (составной оператор) также является NOP и может быть более разборчивым:

 {}

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

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

 while ( getchar () != '\n' ) {}    

альтернативно,

 while ( getchar () != '\n' ) ;    

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

 while ( getchar () != '\n' );   

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

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

Фортран

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

JavaScript

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

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

const noop = () => {};     

AngularJS

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

jQuery

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

Лодаш

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

Паскаль

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

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

Питон

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

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

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

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

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

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

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

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

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

И тебе 200 НООП!

Крекинг

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

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

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

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

Рекомендации

  1. ^ ab «Справочное руководство программиста Motorola 68000» (PDF) .
  2. ^ «Руководство разработчика программного обеспечения для архитектур Intel 64 и IA-32: Справочник по набору команд AZ» (PDF) . Проверено 1 марта 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, 1995, страницы 2-21 и 7-103. Архивировано 21 июня 2020 г.
  7. ^ RISC-V Foundation, Руководство по набору инструкций RISC-V, Том 1: ISA уровня пользователя, версия 2.2, 7 мая 2017 г., стр.79.
  8. ^ Уивер, Д.Л.; Джермонд, Т., ред. (1994). Руководство по архитектуре SPARC, версия 9 (PDF) . Прентис Холл . ISBN 0-13-825001-4. Архивировано из оригинала (PDF) 18 января 2012 г. Проверено 9 января 2014 г. Обратите внимание, что NOP — это частный случай инструкции SETHI, где imm22 = 0 и rd = 0.
  9. ^ Справочное руководство Ada — нулевые операторы. «Выполнение null_statement не имеет никакого эффекта».
  10. ^ Справочник по MDN JavaScript – пустой оператор. «Пустой оператор представляет собой точку с запятой ( ;), указывающую, что ни один оператор не будет выполнен, даже если синтаксис JavaScript требует этого».
  11. ^ Спецификация языка ECMAScript – Редакция 5.1 – Свойства объекта прототипа функции
  12. ^ jQuery.noop() из документации API jQuery.
  13. ^ "Документация Лодаша" . lodash.com . Проверено 15 декабря 2017 г.
  14. ^ Расширенное руководство по написанию сценариев Bash > Глава 3. Специальные символы
  15. ^ bash manpage > ВСТРОЕННЫЕ КОМАНДЫ SHELL
  16. ^ Страница руководства zsh (zshbuiltins) > ВСТРОЕННЫЕ КОМАНДЫ ОЧКОВКИ
  17. ^ Баусум, Дэвид (2002). «Примитивные управляющие последовательности TeX». Справочное руководство TeX. Академическое издательство Kluwer . Проверено 1 апреля 2020 г. Согласно The TeXbook, «TeX ничего не делает», когда встречает файлы . На самом деле, он может сказать TeX: «Это конец того, что вы делали».\relax\relax
  18. ^ Викибук TeX - расслабься
  19. ^ "ftpd.c" . Проверено 19 июня 2016 г.