Почему Визуальная Студия применяет xchg топор, топор

Я просматривал disassmbly своей программы (потому что это потерпело крах), и заметил много из

xchg    ax, ax

Я googled это и узнанный это - по существу NOP, но почему визуальная студия делает xchg вместо noop?

Применение - применение 64 битов C#.NET3.5, собранное визуальной студией

29
задан Crashworks 26 January 2010 в 01:57
поделиться

3 ответа

На 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 .

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

37
ответ дан 28 November 2019 в 01:22
поделиться

MSVC ставит NOP в скомпилированном коде для отладки сборки, как правило,. Это позволяет редактировать и продолжать работать.

4
ответ дан 28 November 2019 в 01:22
поделиться

По умолчанию cron выполняет свои задания, используя любую идею sh вашей системы. Это может быть фактическая оболочка Борна или тире , зола , ksh или bash (или другой), связанные с sh (и в результате работающие в POSIX режимы).

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

-121--580070-

На 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 с инструкциями, которые ничего не делают?

Сомнительно почему вы видите обе мнемоники напечатанными. Я думаю, что это просто недостаток в вашей разборке, нет никакой бинарной разницы.

9
ответ дан 28 November 2019 в 01:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: