Jump to content

НОП (код)

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

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

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

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

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

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

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

Архитектура процессора инструкций Мнемоника Байты Код операции Примечания
Intel x86 процессоров Семейство NOP 1; 1–9 для i686 и x86-64 0x90 [2] 0x90 декодирует в NOP. Хотя многие люди верят, что xchg rax, rax переводится на NOP (0x90), это явно неверно, поскольку в трансляции отсутствует байт ModR/M , который кодирует регистры.

Вместо xchg rax, rax кодируется как «0x4887c0», с «48» в качестве префикса для 64-битных чисел и «87» в качестве кода операции для xchg и «c0» как байт ModR/M для двух одинаковых регистров с индексом 0, rax.

Однако большинство ассемблеров кодируют xchg rax, rax как "0x90", как для оптимизации ( xchg выполнение занимает больше времени, чем nop) и потому что они ведут себя одинаково.

Таким образом, «0x4890» не декодируется в xchg rax, rax в 64-битном режиме и «0x90» не декодируется в xchg eax, eax в 32-битном режиме.

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

Intel 8051 / MCS-51 Семейство NOP 1 0x00
ДЕК Альфа NOP 4 0x47FF041F Код операции для BIS r31,r31,r31, инструкция, которая выполняет побитовое ИЛИ для регистра всегда-0 самого себя.
29 тыс. драмов РА NOP 4 0x70400101 Код операции для aseq 0x40,gr1,gr1, инструкция, которая утверждает, что регистр стека равен самому себе. [3]
АРМ А32 NOP 4 0x00000000 Это означает andeq r0, r0, r0. Инструкция по сборке nop скорее всего, расширится до mov r0, r0 который закодирован 0xE1A00000 (архитектура с прямым порядком байтов). [4]
ARM T32 (16 бит) NOP 2 0xb000 Код операции для ADD SP, #0 - Добавить ноль к указателю стека (нет операции). Инструкция по сборке nop скорее всего, расширится до mov r8, r8 который закодирован 0x46C0. [5]
ARM T32 (32 бит) NOP 4 0xF3AF 8000
ARM A64 (64 бит) NOP 4 0xD503201F
АВР NOP 2 0x0000 один тактовый цикл
IBM System/360 , IBM System/370 , IBM System/390 , z/Architecture , UNIVAC Series 90 NOP 4 0x47000000 или 0x470nnnnn или 0x47n0nnnn, где «n» — любое 4-битное значение. NOP («No-Op») и NOPR («Регистр No-Op») являются подмножеством инструкций «Переход по условию» или «Переход по регистру условия» соответственно; обе версии имеют два варианта генерации NO-OP.

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

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

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

NOPR 2 0x0700 или 0x070n или 0x07n0, где «n» — любое 4-битное значение.
СуперХ NOP 2 0x0009
МИПС NOP 4 0x00000000 Означает sll r0,r0,0, что означает: Логический сдвиг нулевых битов регистра 0 влево и сохранение результата в регистре 0. Запись в регистр 0 игнорируется; он всегда содержит 0.
МИПС-Х NOP 4 0x60000019 (расширенный код операции для add r0,r0,r0)
СМЕШИВАНИЕ NOP 1 слово ± * * * * 0 Байты * являются произвольными и могут иметь любое значение от 0 до максимального байта (должно быть в диапазоне 63–99). MIX использует представление знак-величина.
ММИКС SWYM 4 0xFD****** SWYM означает «Сочувствуйте своей технике». Цифры * могут быть выбраны произвольно.
Семейство Motorola 68000 NOP 2 0x4E71 Это синхронизирует конвейер и предотвращает перекрытие инструкций. [1]
Моторола 6809 NOP 1 0x12
МОП-технология 65xx (например, 6502 ) NOP 1 0xEA NOP потребляет два такта. Неопределенные коды операций в версиях NMOS семейства 65xx были преобразованы в NOP с различной длиной инструкций и временем цикла в 65C02 .
ПА-РИСК NOP 4 0x08000240 Код операции для OR 0,0,0. [6]
LDI 26,0 4 0x34000034 Палиндромный NOP — то есть инструкция, которая выполняется как NOP независимо от того, интерпретируется ли порядок байтов как прямой или обратный порядок байтов . За некоторыми системными инструкциями PA-RISC должны следовать семь палиндромных NOP. [6]
PowerPC NOP 4 0x60000000 (расширенный код операции для ori r0,r0,0)
PIC-микроконтроллер NOP 12 бит 0b000000000000 MOVW 0,W
РИСК-V NOP 4 0x00000013 ADDI x0, x0, 0
C.NOP 2 0x0001 C.ADDI x0, 0. Доступно только на процессорах RISC-V, поддерживающих расширение «C» (сжатые инструкции). [7]
СПАРК NOP 4 0x01000000 Означает sethi 0, %g0 который обнуляет зашитое значение до нуля %g0 зарегистрироваться [8]
Z80 NOP 1 0x00 Есть и другие инструкции без какого-либо эффекта (и в те же сроки): LD A, A, LD B, B и т. д.
ПДП-10 JFCL 0, (общепринятый)
JUMP, SETA, SETAI, CAI, TRN, TLN
1 слово 25500******* (восьмеричный) Никогда не прыгай
Никогда не прыгайте, ничего не устанавливайте, никогда не пропускайте
ПДП-11 NOP 16 бит 000240 (восьмеричный) Удалить ни один из кодов состояний
ВАКС NOP 1 0x01 Задержка зависит от типа процессора

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

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

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

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

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

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

Имейте в виду, что ваш 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]
  • Используйте функцию NOP, доступную в сторонней библиотеке — см. ниже;
  • Определите пользовательскую функцию NOP, как в следующем примере (используя синтаксис функции стрелки ES6 ):
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 когда он должен быть пуст.

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

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

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

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

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

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

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

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

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

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

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

200 NOOP to you too!

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

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

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

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

См. также

[ редактировать ]
  1. ^ Jump up to: а б «Справочное руководство программиста 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. ^ Jump up to: а б 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 ничего не делает», когда сталкивается с \relax. На самом деле, \relax может сказать TeX: «Это конец того, что вы делали».
  18. ^ Викибук TeX - расслабься
  19. ^ "ftpd.c" . Проверено 19 июня 2016 г.
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 4ba90f3e1482fe014a64a61d2784ad11__1721377380
URL1:https://arc.ask3.ru/arc/aa/4b/11/4ba90f3e1482fe014a64a61d2784ad11.html
Заголовок, (Title) документа по адресу, URL1:
NOP (code) - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)