NOP (код)

редактировать

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

Содержание
  • 1 Инструкции на машинном языке
  • 2 Код
    • 2.1 Ada
    • 2.2 C и производные
    • 2.3 Fortran
    • 2.4 JavaScript
      • 2.4.1 AngularJS
      • 2.4. 2 jQuery
      • 2.4.3 Lodash
    • 2.5 Pascal
    • 2.6 Python
    • 2.7 Создание сценариев оболочки (bash, zsh и т. Д.)
    • 2.8 Макроязык TeX (ConTeXt, LaTeX и т. Д.)
  • 3 команды протокола NOP
  • 4 Взлом
  • 5 Эксплойты безопасности
  • 6 См. Также
  • 7 Ссылки
Инструкции на машинном языке

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

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

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

Архитектура ЦПИнструкция мнемоника Байт Код операции Примечания
Intel x86 ЦП семействоNOP1; 1–9 для i686 и x86-640x 900x90 декодируется в xchg eax, eaxво всех режимах, кроме длинного режима, где код операции 0x90 по-прежнему не действует. Более длинные кодировки описаны в руководстве Intel.
Intel 8051 / Семейство MCS-51 NOP10x00
ARM A32 NOP40x00000000Это означает и r0, r0, r0. Инструкция сборки nop, скорее всего, будет расширена до mov r0, r0, который закодирован 0xE1A00000 (архитектура с прямым порядком байтов).
ARM T32 (16 бит)NOP20xb000Код операции для ADD SP, # 0- добавить ноль в указатель стека (нет операции). Инструкция сборки nop, скорее всего, будет расширена до mov r8, r8, который закодирован 0x46C0.
ARM T32 (32 бит)NOP40xF3AF 8000
ARM A64 (64 бит)NOP40xD503201F
AVR NOP20x0000один тактовый цикл
IBM System / 360, IBM System / 370, IBM System / 390, z / Architecture, UNIVAC Series 90 NOP40x47000000 или 0x470nnnnn или 0x47n0nnnn, где «n» - любое 4-битное значение.NOP («Нет операции») и NOPR («Регистр без операции») являются подмножеством инструкций «Переход по условию» или «Переход по регистру условий» соответственно; обе версии имеют два варианта создания NO-OP.

В случае инструкций NOP и NOPR первый 0 во втором байте является значением «маски», условием для проверки, таким как равенство, не равно, высокий, низкий и т. Д. Если маска равна 0, ветвления нет.

В случае инструкции NOPR второе значение во втором байте - это регистр для перехода. Если выбран регистр 0, ветвление не происходит независимо от значения маски. Таким образом, если одно из двух значений во втором байте равно 0, ветвление не произойдет.

В случае команды NOP второе значение во втором байте является «базовым» регистром объединенного базового регистра, регистра смещения и адреса смещения. Если базовый регистр также равен 0, переход не выполняется независимо от значения регистра смещения или адреса смещения.

NOPR20x0700 или 0x070n или 0x07n0, где «n» - любое 4-битное значение.
SuperH NOP20x0009
MIPS NOP40x00000000Означает sll r0, r0,0, что означает: регистр логического сдвига 0 нулевых битов слева и сохранить результат в регистре 0
MIPS-X NOP40x60000019(расширенный код операции для добавить r0, r0, r0)
MIX NOP1 слово± * * * * 0* байты являются произвольными и могут быть любыми от 0 до максимального байта (требуется, чтобы он находился в диапазоне 63-99). MIX использует знаковое представление.
MMIX SWYM40xFD ******SWYM означает «Сочувствовать вашей технике». Цифры * могут выбирается произвольно.
Семейство Motorola 68000 NOP20x4E71Это синхронизирует конвейер и предотвращает перекрытие команд.
Motorola 6809 NOP10x12
Технология MOS 65xx (например, 6502 )NOP10xEANOPпотребляет два тактовых цикла. Неопределенные коды операций в NMOS версии семейства 65xx были преобразованы в NOP с различными инструкциями длины и время цикла в 65C02.
PowerPC NOP40x60000000(расширенный код операции для ori r0, r0,0)
микроконтроллер PIC NOP12 бит0b000000000000MOVW 0, W
RISC-V NOP40x00000013ADDI x0, x0, 0
SPARC NOP40x01000000Обозначает sethi 0,% g0, который обнуляет фиксированное значение % g0регистра
Z80 NOP10x00Есть некоторые другие инструкции без какого-либо эффекта (и с таким же временем): LD A, A, LD B, Bи т. Д.
PDP-11 NOP16 бит000240 (восьмеричное)Не сбрасывать ни один из кодов условий
VAX NOP10x01Задержка зависит от типа процессора

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

Код

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

Ada

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

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

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

int i = 0; я + 1;

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

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

;

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

{}

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

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

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

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

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

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

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

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

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

Fortran

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

JavaScript

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

  • Используйте пустой оператор ';' или оператор пустого блока '{}' так же, как в C и производных examples;
  • Используйте выражение undefinedили nullв качестве полного оператора (оператора выражения), когда предыдущие методы не допускаются синтаксисом.

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

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

AngularJS

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

jQuery

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

Lodash

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

Pascal

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

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

Python

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

Создание сценария оболочки (bash, zsh и т. Д.)

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

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

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

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

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

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

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

200 NOOP и вам!
Взлом

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

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

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

См. Также
Ссылки
Последняя правка сделана 2021-05-31 07:14:51
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте