Машинный код |
---|
Общие понятия |
инструкции |
В компьютерной науке , в NOP , не-оп , или NOOP (не произносятся «не оп», короткой для не работы ) является ассемблер инструкции, программирование языка оператора или протокола компьютера команды , которая ничего не делает.
Инструкции на машинном языке [ править ]
Некоторые наборы компьютерных инструкций включают инструкции, явная цель которых - не изменять состояние каких-либо регистров , доступных для программиста , флагов состояния или памяти . Для выполнения часто требуется четко определенное количество тактов . В других наборах команд NOP можно моделировать, выполняя команду, имеющую операнды, которые вызывают такой же эффект; например, для процессора SPARC инструкция sethi 0, %g0
является рекомендуемым решением.
NOP чаще всего используется для целей синхронизации, для принудительного выравнивания памяти , для предотвращения опасностей , для занятия слотом задержки перехода , для аннулирования существующей инструкции, такой как переход, или в качестве заполнителя, который позже будет заменен активными инструкциями. при разработке программы (или замена удаленных инструкций, когда реорганизация будет проблематичной или отнимет много времени). В некоторых случаях NOP может иметь незначительные побочные эффекты; например, в процессорах Motorola серии 68000 код операции NOP вызывает синхронизацию конвейера . [1]
Ниже перечислены инструкции NOP для некоторых архитектур ЦП:
Архитектура процессора | Мнемоника инструкций | Байты | Код операции | Примечания |
---|---|---|---|---|
Семейство процессоров Intel x86 | NOP | 1; 1–9 для i686 и x86-64 | 0x 90 [2] | 0x90 декодируется xchg eax, eax во всех режимах, кроме длинного режима , где код операции 0x90 все еще не действует. Более длинные кодировки описаны в руководстве Intel. |
Семейство Intel 8051 / MCS-51 | NOP | 1 | 0x00 | |
ARM A32 | NOP | 4 | 0x00000000 | Это означает andeq r0, r0, r0 . Инструкция сборки nop , скорее всего, расширится до mov r0, r0, которая закодирована 0xE1A00000 (архитектура с прямым порядком байтов). [3] |
ARM T32 (16 бит) | NOP | 2 | 0xb000 | Код операции для ADD SP, # 0 - добавить ноль в указатель стека (нет операции). Инструкция сборки nop , скорее всего, расширится до mov r8, r8, которая закодирована 0x46C0. [4] |
ARM T32 (32 бит) | NOP | 4 | 0xF3AF 8000 | |
ARM A64 (64 бит) | NOP | 4 | 0xD503201F | |
AVR | 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 Register») являются подмножеством инструкций «Branch on Condition» или «Branch on Condition Register», соответственно; обе версии имеют два варианта создания NO-OP. В случае инструкций NOP и NOPR первый 0 во втором байте является значением «маски», условием для проверки, например, равно, не равно, высокий, низкий и т. Д. Если маска равна 0, ветвления нет. происходит. В случае инструкции NOPR второе значение во втором байте - это регистр, по которому следует перейти. Если выбран регистр 0, ветвление не происходит независимо от значения маски. Таким образом, если одно из двух значений во втором байте равно 0, ветвление не произойдет. В случае команды NOP второе значение во втором байте является «базовым» регистром комбинированного базового регистра, регистра смещения и адреса смещения. Если базовый регистр также равен 0, переход не выполняется независимо от значения регистра смещения или адреса смещения. |
NOPR | 2 | 0x0700 или 0x070n или 0x07n0, где «n» - любое 4-битное значение. | ||
SuperH | NOP | 2 | 0x0009 | |
MIPS | NOP | 4 | 0x00000000 | Означает sll r0,r0,0 , что означает: логически сдвинуть нулевые биты регистра 0 влево и сохранить результат в регистре 0 |
MIPS-X | NOP | 4 | 0x60000019 | (расширенный код операции для add r0,r0,r0 ) |
СМЕШИВАНИЕ | NOP | 1 слово | ± * * * * 0 | Байты * являются произвольными и могут быть любыми от 0 до максимального байта (требуется, чтобы он находился в диапазоне 63-99). MIX использует представление величины знака. |
MMIX | SWYM | 4 | 0xFD ****** | SWYM означает «Сочувствуйте своей технике». Цифры * могут быть выбраны произвольно. |
Семейство Motorola 68000 | NOP | 2 | 0x4E71 | Это синхронизирует конвейер и предотвращает перекрытие инструкций. [1] |
Motorola 6809 | NOP | 1 | 0x12 | |
Технология MOS 65xx (например, 6502 ) | NOP | 1 | 0xEA | NOP потребляет два тактовых цикла. Неопределенные коды операций вверсиях NMOS семейства 65xx были преобразованы в NOP различной длины команд и времени цикла в 65C02 . |
PowerPC | NOP | 4 | 0x60000000 | (расширенный код операции для ori r0,r0,0 ) |
Микроконтроллер PIC | NOP | 12 бит | 0b000000000000 | MOVW 0,W |
RISC-V | NOP | 4 | 0x00000013 | ADDI x0, x0, 0 |
SPARC | NOP | 4 | 0x01000000 | Обнуляет регистр sethi 0, %g0 фиксированного обнуления [5]%g0 |
Z80 | NOP | 1 | 0x00 | Есть и другие инструкции, не имеющие никакого эффекта (и те же сроки): LD A, A и LD B, B т. Д. |
PDP-11 | NOP | 16 бит | 000240 (восьмеричный) | Очистить ни один из кодов условий |
VAX | NOP | 1 | 0x01 | Задержка зависит от типа процессора |
С точки зрения проектирования оборудования, неотмеченные области шины часто предназначены для возврата нулей; так как поведение слайда 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
- Текст-заполнитель
- Комментарий (компьютерное программирование) - аннотации для программистов, игнорируемые компиляторами и интерпретаторами.
Ссылки [ править ]
- ^ a b «Справочное руководство программиста Motorola 68000» (PDF) .
- ^ "Руководство разработчика программного обеспечения для архитектур Intel 64 и IA-32: набор инструкций AZ" (PDF) . Проверено 1 марта 2012 .
- ^ "4.8.4. Псевдо-инструкция NOP ARM" . Инструменты компиляции RealView для BREW Assembler Guide .
- ^ "5.6.3. Псевдо-инструкция NOP Thumb" . Инструменты компиляции RealView для BREW Assembler Guide .
- ^ Уивер, 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.
- ^ Справочное руководство по Ada - пустые операторы . «Выполнение null_statement не имеет никакого эффекта».
- ^ Справочник по MDN JavaScript - пустой оператор . «Пустой оператор - это точка с запятой (
;
), указывающая, что ни один оператор не будет выполняться, даже если синтаксис JavaScript этого требует». - ^ Спецификация языка ECMAScript - Редакция 5.1 - Свойства объекта прототипа функции
- ^ jQuery.noop () из документации API jQuery
- ^ "Документация Lodash" . lodash.com . Проверено 15 декабря 2017 .
- ^ Расширенное руководство по сценариям на Bash> Глава 3. Специальные символы
- ^ bash manpage> ВСТРОЕННЫЕ КОМАНДЫ ОБОЛОЧКИ
- ^ zsh manpage (zshbuiltins)> ВСТРОЕННЫЕ КОМАНДЫ ОБОЛОЧКИ
- ^ Bausum, Дэвид (2002). «Последовательности примитивного управления TeX». Справочное руководство TeX . Kluwer Academic Publishers . Проверено 1 апреля 2020 года .
Согласно The TeXbook, «TeX ничего не делает», когда встречается
.
Фактически,
может сказать TeX: «Это конец того, чем вы занимались».
\relax
\relax
- ^ TeX wikibook - расслабьтесь
- ^ "ftpd.c" . Проверено 19 июня 2016 .