Префиксы rep, seg, 66h, 67h, lock

Тема в разделе "WASM.ASSEMBLER", создана пользователем Ustus, 3 окт 2005.

  1. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    Занимаюсь тут дизассемблированием и назрел вопрос - как будут себя вести процессоры, если инструкция имеет больше одного однотипного префикса? Вроде бы действителен только последний, но должен же быть какой-то предел длины инструкции, после которого #UD, или я чего-то не понимаю? Где-то вроде натыкался на число 15 байт, но что-то никак не могу наткнуться повторно... и кажется, это не для всех процов... Имеет ли вообще значение последовательность префиксов? Мануалы Intel & AMD вроде говорят, что сие как бы безразлично, но мало ли...
     
  2. Nothing

    Nothing New Member

    Публикаций:
    0
    Регистрация:
    4 авг 2003
    Сообщения:
    139
    Адрес:
    Russia
    Там все хитро :)

    Длина команды ограничена 15 байтами строго. Все 15 префиксами быть не могут - #GP(0) кажется или #UD. Значит может идти 14 префиксов и 1 байтовая команда или 13 и 2-байтовая и т.д. И у AMD и у Intel все одинаково на этот счет. Порядок может играть роль а может и не играть, смотря какие префиксы смешивать. Для замены сегмента всегда используется последний встреченный, 66/67 работают как переключатели 16/32 (если их много). LOCK нельзя использовать более 1 раза (да и то не со всеми командами - иначе исключение). REP[NE] хитрый префикс, он может быть частью команды (SSE1/2/3, также как и 66/67 впрочем), иметь свой смысл (строковые команды), или не играть вообще никакой роли. Разрешается многократное использование repxx - результат аналогичен однократному. Более того разрешено писать REPZ: REPNZ: - по факту используется последний встреченный. Насчет комбинаций префиксов и их использования с командами - тут сложно. Зависит от набора префиксов и команды, поэтому лучше в движке дизассемблера префиксы определять как 1-байтовые конструкции независимо от команд - так надежнее. А вообще в мануале Intel кое-что раскопать можно, но все случаи и там не описаны - я просто брал в руки дебаггер и проверял сам - чего и советую сделать, потому что пишу по памяти и мог что-то напутать или забыть.
     
  3. diamond

    diamond New Member

    Публикаций:
    0
    Регистрация:
    21 май 2004
    Сообщения:
    507
    Адрес:
    Russia
    По-моему, два префикса 66/67 эквивалентны одному и переключают 16/32 один раз
     
  4. diamond

    diamond New Member

    Публикаций:
    0
    Регистрация:
    21 май 2004
    Сообщения:
    507
    Адрес:
    Russia
    В смысле, в 32-bit mode 66 66 40 = 66 40 = inc ax, а не 40 = inc eax
     
  5. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    Nothing

    Спасибо, исчерпывающий ответ. Но все равно в неясных местах буду шчупать руками, а то мало ли...

    А насчет SSE - имеет ли значение позиция префикса, если он часть команды? Как бы объяснить... можно ли, к примеру определять por xmm0, [cs:eax] как 66 2E 0F EB 00? Или только 2E 66 0F EB 00? А что тогда 66 2E 0F EB 00 - что ли por mm0, [cs:eax], а 66 - игнорируется?

    <font color="666666]добавил позже...</font><!--color-->

    таки ему все равно -

    26 66 0F EB 00

    26 66 66 0F EB 00

    66 26 0F EB 00

    - все сие есть por xmm0, [es:eax]

    на Northwood'е по крайней мере...



    diamond

    Спасибо, проверил - так и есть. А Watcom'овский дизасёмблёр думает, что 66 66 40 - это inc eax, хе-хе, наивный :) Ну да ладно, тоже мне инструмент хакера... :)))
     
  6. Nothing

    Nothing New Member

    Публикаций:
    0
    Регистрация:
    4 авг 2003
    Сообщения:
    139
    Адрес:
    Russia
    Насчет вообще всех комбинаций префиксов - если уж эта тема так интересует можно набросать легко "полиморфа" который проверит все комбинации префиксов для данной команды :)

    до (15-длина команды) любых префиксов просто перебором - вроде несложно...

    Да, в SSE можно переставлять префиксы - это не влияет на команду. Кстати, там есть команды, которые не работают _без_ префиксов "0F D6" например, или "0F E6"...



    p.s. за поправки всем спасибо.
     
  7. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    Собственно все можно проверить, но вопрос, который меня больше всего смущает - одинаково ли это работает на разных процах, а то у меня в непосредственном доступе только - Celeron Mendocino, Pentium4 Northwood, Athlon XP Thorton и все... небогатый выбор, честно говоря... :dntknw: