SSE-инструкции и префиксы

Тема в разделе "WASM.ASSEMBLER", создана пользователем inviZ, 31 май 2009.

  1. inviZ

    inviZ Сергей

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    92
    Адрес:
    Хабаровск
    Как правильно декодировать SSE-инструкции, в которых встречается несколько префиксов, каждый из которых может быть mandatory ?

    Например: F3 66 0F 10 C1
    IDA воспринимает это как rep movupd xmm0, xmm1
    А, например, OllyDBG: movss xmm0, xmm1 , т.е. для него префикс 0xF3 важней.

    Можно, конечно, было бы еще проверить несколько дизассемблеров, но пока лень, хочется истину знать.
     
  2. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    У Olly есть проблема с выполнением взаимоисключающих параграфов :). Учитывается тот префикс, который ближе к опкоду, IDA права.
     
  3. inviZ

    inviZ Сергей

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    92
    Адрес:
    Хабаровск
    Тогда получается, что тоже не права, т.к. 66 F3 0F 10 C1 - все равно в итоге rep movupd xmm0, xmm1.
    А в мануалах эта информация есть, или проверено опытным путем? Сейчас в исходниках diStorm'а в тоже такой комментарий нашел, что учитывается ближайший префикс.
     
  4. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    inviZ
    Я читал где-то в мануале. Вероятно, том 2А, в первых главах, сейчас не помню точно.
     
  5. inviZ

    inviZ Сергей

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    92
    Адрес:
    Хабаровск
    Да, нашел. Надо было просто вдумчиво прочитать этот параграф... А вообще, в самих мануалах зачастую находишь мелкие ошибки/опечатки по ходу написания дизасма. Например, в таблице опкодов во втором томе кое-где операнды неправильно обозначены.
     
  6. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    inviZ
    в SSE инструкциях 66 F3(F2 или в обратном порядке) на новых процессорах будет вызывать исключение. А вот в случае начилия F2 и F3(без 66) будет действовать последний префикс.
     
  7. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    inviZ
    Например? Я только обнаружил там отсутствие некоторых команд. Опечаток, вроде бы, не помню. Правда, я другой источник использую.

    Black_mirror
    А можно чуть подробнее? Где про это можно почитать?
     
  8. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    AMD x86-64 Architecture Programmer’s Manual
    Volume 3: General-Purpose and System Instructions

    1.2.2 Operand-Size
    Override Prefix

    The result of using an F2h or F3h repeat prefix along with a 66h
    prefix in 128-bit or 64-bit media instructions is unpredictable.

    У интела думаю тоже есть похожие слова.
     
  9. t00x

    t00x New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2007
    Сообщения:
    1.921
  10. inviZ

    inviZ Сергей

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    92
    Адрес:
    Хабаровск
    Mika0x65, например, у pextrw или pmovmskb первый операнд обозначен - Gd, т.е. 32-битный GPR. А на самом деле это может быть и 64-битный GPR (в 64-битном режиме, если REX.W = 1). В общем-то, видимо просто недоглядели и забыли таблицу подредактировать.
    Далее, cvtpd2pi (66 F0 2D) - вместо Qpi должно быть Ppi. В общем, такие опечатки/ошибки мелкие в основном. Еще несколько было, но скачал последние мануалы - их все-таки исправили.)