Я просматривал disassmbly своей программы (потому что это потерпело крах), и заметил много из
xchg ax, ax
Я googled это и узнанный это - по существу NOP, но почему визуальная студия делает xchg вместо noop?
Применение - применение 64 битов C#.NET3.5, собранное визуальной студией
На x86 инструкция NOP
имеет вид XCHG AX, AX
Две мнемонические инструкции собираются в тот же двоичный код операции. (На самом деле, я полагаю, ассемблер может использовать любой xchg
регистр с самим собой, но AX
или EAX
обычно используются для ] nop
насколько мне известно).
xchg ax, ax
имеет свойства без изменения значений регистров и без изменения флагов (эй, это не операция!).
Правка (в ответ на комментарий Анона):
Ой, сейчас я вспомнил, что для инструкции xchg
есть несколько кодировок.Некоторые принимают набор битов mod / r / m (как многие инструкции архитектуры 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
.
Прошло много времени с тех пор, как я проделал детальную работу над языком ассемблера, так что, скорее всего, я ошибаюсь хотя бы в одном пункте ...
MSVC ставит NOP в скомпилированном коде для отладки сборки, как правило,. Это позволяет редактировать и продолжать работать.
По умолчанию cron
выполняет свои задания, используя любую идею sh
вашей системы. Это может быть фактическая оболочка Борна или тире
, зола
, ksh
или bash
(или другой), связанные с sh
(и в результате работающие в POSIX режимы).
Лучше всего убедиться, что ваши сценарии имеют то, что им нужно, и предположить, что для них ничего не предусмотрено. Поэтому необходимо использовать полные спецификации каталога и самостоятельно устанавливать переменные среды, такие как $ PATH
.
На x86 команда NOP
имеет значение XCHG AX, AX
. 2 Мнемонические команды собираются в один и тот же двоичный op-код. (На самом деле, я полагаю, ассемблер может использовать любой xchg
регистра с собой, но AX
или EAX
- это то, что обычно используется для nop
, насколько мне известно).
xchg ax, ax
имеет свойства изменения значений регистра и изменения флагов (эй - это no op!).
Изменить (в ответ на комментарий Анона.):
О, верно - теперь я помню, что есть несколько кодировок для инструкции xchg
. Некоторые принимают набор битов mod/r/m (например, многие команды архитектуры Intel x86), которые указывают источник и место назначения. Эти кодировки занимают более одного байта. Существует также специальная кодировка, использующая один байт и обменивающаяся регистром общего назначения с (E) AX
. Если указан регистр (E) AX
, то имеется однобайтовая команда NOP. можно также указать, что обмен (E) AX
между собой осуществляется с помощью большего варианта инструкции xchg
.
Я предполагаю, что MSVC использует многобайтовую версию xchg
с (E) AX
в качестве источника и назначения, когда он хочет пережечь более одного байта без операции - он занимает то же количество циклов, что и одиночный байт xchg
, но использует больше места. При разборке не отображается несколько байтов xchg
, декодированных как NOP
, даже если результат одинаков.
В частности, xchg eax, eax
или nop
могут быть закодированы в виде opcodes 0x90
или 0x87 0xc0
в зависимости от того, требуется ли использовать 1 или 2 байт. Разборщик Visual Studio (и, возможно, другие) декодирует код операции 0x90
как команду NOP
и декодирует код операции 0x87 0xc0
как xchg eax, eax
.
Прошло много времени с тех пор, как я сделал подробную работу на языке сборки, так что, скорее всего, я ошибаюсь по крайней мере на один счет здесь...
-121--1381799- xchg ax, ax
и nop
на самом деле одна и та же инструкция, они сопоставляются с одним и тем же кодом операции (0x90 iirc). Это нормально, xchg ax, ax
является No-Op.Почему следует тратить дополнительные кодировки opcode с инструкциями, которые ничего не делают?
Сомнительно почему вы видите обе мнемоники напечатанными. Я думаю, что это просто недостаток в вашей разборке, нет никакой бинарной разницы.