2016-10-28 2 views
1

Что касается следующей ссылке опкод: http://ref.x86asm.net/coder32.htmlWin32 сборки условных переходов

Я пытаюсь понять немного больше вокруг условных переходов. Вы увидите ссылку, указанную выше, что код операции для «Jump short if zero/equal (ZF = 0)» равен . Поэтому, если мы (в отладчик) двоичном вставить байты и флаг ZF установлен в 0, то мы увидим короткий прямой скачок байт:

0207FF9F  74 04  JE SHORT 0207FFA5 

никаких проблем.

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

0207FFA5  850441  TEST DWORD PTR DS:[ECX+EAX*2],EAX 

Attempted conditional jump

Я явно не понимая, что-то здесь, кто-то может объяснить? Являются ли условные короткие скачки основаны на значениях флагов, ограниченных опкодами до 7F?

Большое спасибо за помощь!

+0

@mazegen сделал опечатку в ссылка, упомянутая выше: условие * Перейти, если нуль/равный * на самом деле ** ZF = 1 **, а не ZF = 0, и наоборот. – vitsoft

ответ

1

2-й номер 85, который вы нашли, находится в таблице двухкодовых команд операций, где каждая запись имеет префикс 0F.

«Рядом» (rel32) version of JZ/JE is 0F 85. (К сожалению, этот фрагмент HTML обрезает список кодировок, только добирается до нескольких версий rel32 0F ... Или на самом деле сломал форматирование без таблиц для остальных. См. Оригинал PDF в формате PDF.

Эти таблицы операций не являются инструкциями Если вы когда-нибудь путаете, посмотрите инструкцию в полном руководстве (ссылки в вики .

+0

Спасибо, Питер, проверял это, и 2-байтовый код операции действительно работает в терминах инициирования условного перехода. Единственный другой вопрос, который у меня есть, - это то, как я указываю длину байта байта? Ввод say, 04, после того, как код операции не инициирует 4-байтовый скачок - он фактически ссылается на неверный адрес памяти (в данном случае JE 434640A8). Я вижу, что в исходном коде кодекса Intel вы упомянули, что упомянутые условия перехода - * 0F 87 cd * - Я также рассмотрю * cd * vs * cb *, который присутствует во многих других прыжках. Thx! –

+0

@SirSaucealot: '0F 85' - это 32-разрядная версия версии. Вот почему есть два: для коротких прыжков (8-битное смещение) и 32-битная версия с добавленными в 386 («рядом с прыжками», в отличие от далеких прыжков, которые также изменяют CS). Прочтите инструкцию ввода инструкции: она объясняет кодировку. Или соберите инструкцию на ассемблере, чтобы узнать, что вы получаете. –

+0

Я вижу * cd * значение байта ссылки после кода операции, я получу там с большим чтением и тестированием! :) –

Смежные вопросы