Как работает asm ( "nop" ); работает?

Я отменил определение http://en.wikipedia.org/wiki/NOP, но мне все еще нужно более простое определение.

Я наткнулся на код, и я точно не знаю, что он делает:

switch (Something)
    {

        case this_one:
            asm ("nop");
            break;
        case other_one:
            asm ("nop");
            break;
        default:
            asm ("nop");
            break;
    }

Ответ 1

nop - инструкция сборки, которая ничего не делает - так же, как и все, что угодно, и вы все еще выполняете машинную инструкцию, что означает (возможно) ДЕЙСТВИТЕЛЬНО крошечный бит времени (что может иметь ограниченное значение в некоторых приложениях реального времени.

В этом случае оператор asm("nop"); не делает семантической разницы с программой. Единственная причина, по которой я могу думать, что он может присутствовать, заключается в том, чтобы "заставить" компилятор НЕ сбрасывать коды кода, делая структуру машины оператора switch видимой, если вы посмотрите на код объекта или разобщите машинный код или просмотрите его в отладчик.

Ответ 2

NOP полезен для отладки. Даже когда ничего не делает, потому что означает "нет операции", NOP является инструкцией о том, что вы можете установить точку останова в отладчике. Я считаю, что программист хотел узнать значение "Что-то" таким образом. Это выглядит глупо, но для одного опытного программиста потребовалось несколько часов, чтобы выяснить, почему

if(Something);
{
 ...
}

всегда находился внутри области действия, не зависящей от значения Something. Я подозреваю, что у кого-то была аналогичная проблема с switch(). Если программист опускает NOP, компилятор может более легко удалить целую инструкцию switch(). Я также использую __asm__("#start"); для создания четких границ для некоторого кода в Максимальная скорость от IOS/iPad/iPhone, но __asm__("nop"); тоже будет делать.

Также, как уже говорилось, он может использоваться для приложений реального времени. Например, http://www.rickard.gunee.com/projects/video/pic/tetris.php может использовать это.

Ответ 3

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

Ответ 4

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

Это обычно полезно во встроенных приложениях без операционных систем, где вам часто приходится анализировать переменные и/или регистры состояния во время критического раздела.

На многих RISC-процессорах (ARM, AVR) команда, следующая сразу после развязки прерываний, по-прежнему будет замаскирована, поэтому, если вы просто поместите sei/cli рядом, вы не допустите какого-либо прерывания.

Каждый nop, добавленный между sei и cli, позволяет еще одно прерывание до возобновления критического раздела.

Ответ 5

Как уже упоминалось, он используется во встроенном мире. Иногда вам нужно дождаться цикла или два, прежде чем булавка на самом деле будет установлена ​​в определенном состоянии, особенно на некоторых датчиках и т.д. В эпоху палеолита в 6581 cpu nop был использован для создания задержки, поскольку часы были примерно 0.7mhz... Также верно то, что сказано о прерываниях.

Ответ 6

A nop - это компьютерная инструкция, которая ничего не делает. В этом конкретном случае, вероятно, существует вероятность того, что коммутатор не будет оптимизирован. Эта реализация специфична для компилятора в лучшем случае, так как ничего не останавливает ее от разбора и оптимизации операторов asm.

Зачем это делать? Это может быть для тестирования генерации машинного кода каким-то образом. Функционально это не полезно.

Ответ 7

В Intel x86 atleast, nop является мнемоником для xchg eax,eax, поэтому он обменивает регистр eax с собой. Существуют и другие формы, которые делают то же самое, но занимают больше места (например, lea esi,[esi + eiz] - добавляет 0 к esi), но это не "официальная" инструкция nop.