На x86 NOP
инструкция являетсяXCHG AX, AX
В 2 мнемонические инструкции по сборке в том же двоичном op- код.
(На самом деле, я полагаю, что ассемблер мог использовать любой регистр
xchg
с самим собой, но
AX
или
EAX
- это то, что обычно используется для
nop
, насколько я знаю).
xchg ax, ax
имеет свойства изменения значений регистра и изменения флагов (эй - это не операция!).
Редактировать (в ответ на замечание Anon.):
О порядке - теперь я помню, есть несколько кодировок для xchg
инструкции. Некоторые берут набор мод/г/м бит (как и многие инструкции архитектуры Intel x86), которые указывают источник и назначение. Эти кодировки занимают более одного байта. Существует также специальная кодировка, которая использует один байт и обменивает регистр общего назначения с (E)AX
. Если указанный регистр также равен (E)AX
, то вы имеете однобайтную инструкцию NOP. вы также можете указать, что (E)AX
обмениваться с самим собой, используя более крупный вариант инструкции xchg
.
Я предполагаю, что MSVC использует несколько версии байтов xchg
с (E)AX
в качестве источника и назначения, когда он хочет, чтобы жевать более чем один байт без всякой операции - она занимает такое же число циклов как один байт xchg
, но использует больше места. При разборке вы не увидите многократный байт xchg
, декодированный как NOP
, даже если результат тот же.
В частности xchg eax, eax
или nop
может быть закодирован как опкодами 0x90
или 0x87 0xc0
в зависимости от того, хотите ли вы его использовать 1 или 2 байта. Разборщик Visual Studio (и, возможно, другие) будет декодировать код операции 0x90
в качестве инструкции NOP
и будет декодировать код операции 0x87 0xc0
как xchg eax, eax
.
Это было время, так как я сделал подробный ассемблерную работу, поэтому есть вероятность, что я не прав, по крайней мере, один отсчет здесь ...
следующие байты, связанные с этими инструкциями: nop должен быть hex 90. is xchg ax, ax 2-байтная инструкция? –
Это оказалось вопросом с немного более нюансом, чем я изначально думал (или помнил в любом случае). –
эй ты можешь рассказать мне, как смотреть на ассемблерный код, подобный твоему. я хотел бы видеть, как простой prgoram преобразуется в сборку. спасибо – masfenix