Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

В компьютерной науке , в NOP , не-оп , или NOOP (не произносятся «не оп», короткой для не работы ) является ассемблер инструкции, программирование языка оператора или протокола компьютера команды , которая ничего не делает.

Инструкции на машинном языке [ править ]

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

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

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

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

Код [ править ]

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

Ада [ править ]

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

C и производные [ править ]

Вторая строка ниже - это пример одного оператора C, который ведет себя как NOP. На практике большинство компиляторов не генерируют код для этого оператора:

 int я = 0; я + 1;

Этот оператор выполняет сложение и отбрасывает результат. Действительно, любой оператор без побочных эффектов (и который не влияет на поток управления, например, break, return) может быть удален, так как результат вычисления отбрасывается.

Простейший возможный оператор в C, который ведет себя как NOP, - это так называемый пустой оператор , который представляет собой просто точку с запятой в контексте, требующем оператора. (В этом случае компилятор не требуется для генерации инструкции NOP; обычно никакие инструкции не генерируются.)

 ;

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

 {}

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

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

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

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

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

или короче:

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

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

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

Фортран [ править ]

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

JavaScript [ править ]

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

  • Используйте « ;» пустое заявление [7] или « {}» пустое заявление блока таким же образом , как и в С и производные примеров;
  • Используйте выражение undefinedили nullкак полный оператор (оператор выражения ), если предыдущие методы не допускаются синтаксисом.

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

  • Используйте Function.prototype()встроенную функцию, которая принимает любые аргументы и возвращает undefined; [8]
  • Используйте функцию NOP, доступную в сторонней библиотеке - см. Ниже;
  • Определите пользовательскую функцию NOP, как в следующем примере (с использованием синтаксиса стрелочной функции ES6 ):
const  noop  =  ()  =>  {};

AngularJS [ править ]

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

jQuery [ править ]

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

Лодаш [ править ]

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

Паскаль [ править ]

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

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

Python [ править ]

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

Сценарии оболочки (bash, zsh и т. Д.) [ Править ]

Команда ' :' [двоеточие] - это встроенная оболочка, которая имеет такой же эффект, что и «NOP» (операция «ничего не делать»). Технически это не NOP, так как он меняет специальный параметр $? (статус выхода последней команды) на 0. Это может считаться синонимом встроенной оболочки «истина», а ее статус выхода - истина (0). [11] [12] [13]

Макроязык TeX (ConTeXt, LaTeX и т. Д.) [ Править ]

В принятом в TeX Макроязык ТИПОГРАФИЧЕСКИХ систем имеет \relaxкоманду. [14] Сам по себе он ничего не делает, но может использоваться для предотвращения анализа всех последующих токенов непосредственно предшествующей командой. [15]

Команды протокола NOP [ править ]

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

  • телнет
  • FTP
  • SMTP
  • X11
  • POP3
  • NNTP
  • Палец
  • IMAP4
  • BitTorrent

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

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

200 NOOP и тебе!

Взлом [ править ]

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

Эксплойты безопасности [ править ]

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

См. Также [ править ]

  • Компьютерная архитектура
  • HLT (инструкция x86)
  • Функция идентичности - функциональное программирование, эквивалентное NOOP
  • xyzzy (команда) - команда, иногда используемая вместо NOOP
  • IEFBR14
  • Текст-заполнитель
  • Комментарий (компьютерное программирование) - аннотации для программистов, игнорируемые компиляторами и интерпретаторами.

Ссылки [ править ]

  1. ^ a b «Справочное руководство программиста Motorola 68000» (PDF) .
  2. ^ "Руководство разработчика программного обеспечения для архитектур Intel 64 и IA-32: набор инструкций AZ" (PDF) . Проверено 1 марта 2012 .
  3. ^ "4.8.4. Псевдо-инструкция NOP ARM" . Инструменты компиляции RealView для BREW Assembler Guide .
  4. ^ "5.6.3. Псевдо-инструкция NOP Thumb" . Инструменты компиляции RealView для BREW Assembler Guide .
  5. ^ Уивер, DL; Germond, T., eds. (1994). Руководство по архитектуре SPARC, версия 9 (PDF) . SPARC International, Inc . Прентис Холл . ISBN  0-13-825001-4. Архивировано из оригинального (PDF) 18 января 2012 года . Проверено 9 января 2014 . Обратите внимание, что NOP - это частный случай инструкции SETHI, с imm22 = 0 и rd = 0.
  6. ^ Справочное руководство по Ada - пустые операторы . «Выполнение null_statement не имеет никакого эффекта».
  7. ^ Справочник по MDN JavaScript - пустой оператор . «Пустой оператор - это точка с запятой (;), указывающая, что ни один оператор не будет выполняться, даже если синтаксис JavaScript этого требует».
  8. ^ Спецификация языка ECMAScript - Редакция 5.1 - Свойства объекта прототипа функции
  9. ^ jQuery.noop () из документации API jQuery
  10. ^ "Документация Lodash" . lodash.com . Проверено 15 декабря 2017 .
  11. ^ Расширенное руководство по сценариям на Bash> Глава 3. Специальные символы
  12. ^ bash manpage> ВСТРОЕННЫЕ КОМАНДЫ ОБОЛОЧКИ
  13. ^ zsh manpage (zshbuiltins)> ВСТРОЕННЫЕ КОМАНДЫ ОБОЛОЧКИ
  14. ^ Bausum, Дэвид (2002). «Последовательности примитивного управления TeX». Справочное руководство TeX . Kluwer Academic Publishers . Проверено 1 апреля 2020 года . Согласно The TeXbook, «TeX ничего не делает», когда встречается . Фактически, может сказать TeX: «Это конец того, чем вы занимались».\relax\relax
  15. ^ TeX wikibook - расслабьтесь
  16. ^ "ftpd.c" . Проверено 19 июня 2016 .