НОП (код)
Машинный код |
---|
Общие понятия |
Инструкции |
В информатике 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 , который кодирует регистры.
Вместо Однако большинство ассемблеров кодируют Таким образом, «0x4890» не декодируется в Поскольку ассемблер знает об этом, он может произвести такую замену, что может вызвать путаницу. Чтобы действительно вставить |
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
[ редактировать ]В языке JavaScript нет встроенного оператора NOP. Возможны многие реализации:
- Используйте
;
пустое заявление [10] или{}
оператор пустого блока так же, как в примерах C и производных ; - Используйте
undefined
илиnull
выражение как полный оператор ( оператор-выражение ), когда предыдущие методы не разрешены синтаксисом.
Альтернативами в ситуациях, когда требуется функция, являются:
- Используйте
Function.prototype()
встроенная функция, которая принимает любые аргументы и возвращаетundefined
; [11] - Используйте функцию NOP, доступную в сторонней библиотеке — см. ниже;
- Определите пользовательскую функцию NOP, как в следующем примере (используя синтаксис функции стрелки ES6 ):
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 имеет Макроязык типографской системы \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 , который позволяет выполнять код, когда точное значение указателя инструкции является неопределенным (например, когда переполнение буфера приводит к перезаписи адреса возврата функции в стеке).
См. также
[ редактировать ]- Комментарий (компьютерное программирование) - аннотации, обычно предназначенные для программистов, которые игнорируются компиляторами и интерпретаторами.
- Компьютерная архитектура
- Текст-заполнитель
- Halt and Catch Fire – также приостанавливает работу процессора.
- HLT (инструкция x86) – приостанавливает работу процессора.
- Функция идентификации – функциональное программирование, эквивалентное NOP.
- IEFBR14 - тавтология мэйнфреймов
- xyzzy (вычисления) — команда, иногда используемая вместо NOP.
- Списки инструкций X86#Добавлено в процессорах класса P5/P6 -
NOPL
, официальный длинныйNOP
Ссылки
[ редактировать ]- ^ Jump up to: а б «Справочное руководство программиста Motorola 68000» (PDF) .
- ^ «Руководство разработчика программного обеспечения для архитектур Intel 64 и IA-32: Справочник по набору команд AZ» (PDF) . Проверено 1 марта 2012 г.
- ^ AMD, Руководство пользователя микропроцессора Am29050 , 1991, страницы 223 и 257.
- ^ «4.8.4. Псевдоинструкция NOP ARM» . Инструменты компиляции RealView для руководства по ассемблеру BREW .
- ^ «5.6.3. Псевдоинструкция NOP Thumb» . Инструменты компиляции RealView для руководства по ассемблеру BREW .
- ^ Jump up to: а б Hewlett-Packard, Архитектура PA-RISC 2.0 , 1995, страницы 2–21 и 7–103. Архивировано 21 июня 2020 г.
- ^ RISC-V Foundation, Руководство по набору команд RISC-V, Том 1: ISA уровня пользователя , версия 2.2, 7 мая 2017 г., стр.79.
- ^ Уивер, Д.Л.; Джермонд, Т., ред. (1994). Руководство по архитектуре SPARC, версия 9 (PDF) . Прентис Холл . ISBN 0-13-825001-4 . Архивировано из оригинала (PDF) 18 января 2012 г. Проверено 9 января 2014 г.
Обратите внимание, что NOP — это частный случай инструкции SETHI, где imm22 = 0 и rd = 0.
- ^ Справочное руководство Ada — нулевые операторы . «Выполнение null_statement не имеет никакого эффекта».
- ^ Справочник по MDN JavaScript — пустой оператор . «Пустой оператор представляет собой точку с запятой (
;
), указывающее, что ни один оператор не будет выполнен, даже если синтаксис JavaScript этого требует». - ^ Спецификация языка ECMAScript – Редакция 5.1 – Свойства объекта прототипа функции
- ^ jQuery.noop() из документации API jQuery.
- ^ «Документация Лодаша» . lodash.com . Проверено 15 декабря 2017 г.
- ^ Расширенное руководство по написанию сценариев Bash > Глава 3. Специальные символы
- ^ bash manpage > ВСТРОЕННЫЕ КОМАНДЫ SHELL
- ^ Страница руководства zsh (zshbuiltins) > ВСТРОЕННЫЕ КОМАНДЫ ОЧКОВКИ
- ^ Баусум, Дэвид (2002). «Примитивные управляющие последовательности TeX». Справочное руководство TeX . Академическое издательство Kluwer . Проверено 1 апреля 2020 г.
Согласно The TeXbook, «TeX ничего не делает», когда сталкивается с
\relax
. На самом деле,\relax
может сказать TeX: «Это конец того, что вы делали». - ^ Викибук TeX - расслабься
- ^ "ftpd.c" . Проверено 19 июня 2016 г.