SSE эмулятор

Тема в разделе "WASM.NT.KERNEL", создана пользователем cppasm, 17 мар 2008.

  1. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    Я так и думал...
    Тут проблема ещё как этот самый lock обеспечить если одна SSE команда заменяется несколькими...
     
  2. ofCros

    ofCros New Member

    Публикаций:
    0
    Регистрация:
    18 дек 2007
    Сообщения:
    25
    Можно так:
    Код (Text):
    1. cmp byte [sse_addr-1],lock
    2.    je ;уход на ветку где все команды с префиксами lock, или крит. секция
     
  3. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.348
    lock не со всеми командами можно использовать, а крит. секция тут не поможет.
     
  4. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    Вот и я о том же... Прийдётся пока lock просто игнорировать видимо.
    -[Добавлено]-
    Ещё тут с кодированием некоторых команд вопрос.
    Например всё та же movss.
    В мануалах написано следующее:
    Код (Text):
    1. F3 0F 10 /r MOVSS xmm1, xmm2/m32
    2. F3 0F 11 /r MOVSS xmm2/m32, xmm1
    Там же написано что для некоторых SSE команд префикс F3 (REP) является обязательным (mandatory).
    Вот вопрос - это всё-таки префикс, или часть команды (т.е. оно конечно не часть опкода, но важна ли последовательность)?
    Т.е. обязательно должна соблюдаться последовательность F3 0F 10/F3 0F 11 или после F3 могут идти другие префиксы?
    Т.е. к примеру movss xmm0,es:[ebx]
    Лично у меня на P4 работает как это
    Код (Text):
    1. 0047F95C     26:F3:0F1003   MOVSS XMM0,DWORD PTR ES:[EBX]
    так и это
    Код (Text):
    1. 0047F95C     F3:26:0F1003   MOVSS XMM0,DWORD PTR ES:[EBX]
    без исключений.
    Вопрос это на всех процессорах воспринимается как нормальная команда, или всё таки на некоторых может плачевно закончиться?
     
  5. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    Подскажите ещё с TLS.
    Сделал хранение состояния SSE регистров через список структур.
    Поиск сделал по полю структуры - ThreadID.
    Поиск получается долгим, особенно с учётом синхронизации через мютекс.
    Решил всё таки на TLS перейти, не надо ничего искать и не нужна синхронизация.
    Но вот проблема:
    при DLL_PROCESS_ATTACH делаю TlsAlloc, создание структуры для основного потока и SetTlsValue
    при DLL_PROCESS_DETACH GetTlsValue, делаю освобождение памяти и TlsFree
    при DLL_THREAD_ATTACH выделение памяти, SetTlsValue
    при DLL_THREAD_DETACH GetTlsValue и освобождение памяти.
    Но! При завершении процесса приходит только DLL_PROCESS_DETACH, а если в этот момент были ещё потоки они просто тихо умирают.
    Вопрс как мне память освободить?
    Думал в DLL_PROCESS_DETACH перечислить все потоки и потом для каждого освобождать память, но ведь нельзя прочитать TLS другого потока.
    Может можно как-то заставить поток послать DLL_THREAD_DETACH?
    Или рассчитано на то что раз процесс завершается, то и фиг с ним - система всё сама подчистит?
     
  6. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    порядок следования префиксов не имеет значения
     
  7. Joes

    Joes New Member

    Публикаций:
    0
    Регистрация:
    5 янв 2008
    Сообщения:
    98
    1. Порядок префиксов не имеет значения.
    2. Пофиг на TLS - система сама освобождает все ресурсы.

    Кстати, я вот не помню, вызывается ли thread attach для уже существующих потоков или нет... (созданных до момента инжекта)
     
  8. t00x

    t00x New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2007
    Сообщения:
    1.921
    префикс, являющийся частью команды.
    без использования префикса это будет уже другая команда.
     
  9. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    У меня нет момента инжекта :)
    Моя dll добавлена в импорт самой верхней записью и подгружается загрузчиком ещё до старта самого процесса.
    Это понятно. То что префикс F3 должен присутствовать это ясно.
    Я имел ввиду должна ли сохраняться последовательность, т.е. должен ли префикс F3 идти непосредственно перед опкодом, или после него могут быть другие префиксы.
    На практике оказалось что могут.
     
  10. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    Тут возник вопросик...
    Как определить есть ли у команды поле mod/rm? У nop допустим нету.
    Это от опкода зависит? А как тогда определять, таблицу на все опкоды делать?
    Смотрел дизассемблер длин hde32 - там таблиц не наблюдается...
    Ну то есть я анализирую команду, вначале отбираю все префиксы - их значения известны.
    Потом читаю первый байт опкода - если не 0F, значит всё.
    Если 0F - читаю второй. Если второй 38 или 3A - значит есть третий, читаю его.
    Если нет, значит опкод двухбайтовый и мы его прочитали.
    А вот как дальше определить есть у команды mod/rm или нет - не могу понять :dntknw:
     
  11. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    от опкода зависит
    например
    add ac, im -> 04w im
    но
    add r, im -> 80sw /2 im
     
  12. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.348
    cppasm
    определяй по таблице. Или +256 байт настолько критичны?..
     
  13. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    не критичны, у меня даже намного меньше будет - мне ведь только SSEx надо, а их не так много.
    ну насчёт 256 ты тоже погорячился - больше будет.
    есть же ещё и двухбайтовые и трёхбайтовые опкоды.
    просто я вот смотрел реализацию hde32 - ну нету там таких больших таблиц.
    вообще нету. а команды понимает все за исключением трёхбайтовых опкодов (SSSE3).
    вот и интересен общий принцип.
    сейчас буду подетальней копаться в исходниках...
     
  14. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.348
  15. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    да, с твоими pdf-ками немного удобнее :)
    кстати если кому-то надо то вот ещё есть дока: http://dump.ru/files/o/o46620728/
    это больше просто перевод мануала на русский (хотя особо переводить там нечего).
    таблица опкодов правда не новая - команды до MMX включительно.
    это приложение к книге Зубкова "Ассемблер для DOS, Windows и Unix", которого в электронном варианте нет. правда возможны опечатки, распознавалось со скана...
    хотя вроди и проверял.
     
  16. Novi4ek

    Novi4ek New Member

    Публикаций:
    0
    Регистрация:
    3 авг 2007
    Сообщения:
    317
    У меня есть в электронном Зубков вместе с этим приложением. Кому надо если пишите.
     
  17. Joes

    Joes New Member

    Публикаций:
    0
    Регистрация:
    5 янв 2008
    Сообщения:
    98
    Юзаю http://ref.x86asm.net/ - очень толково, но нашел пару ошибок (в основном с флагами).
     
  18. Novi4ek

    Novi4ek New Member

    Публикаций:
    0
    Регистрация:
    3 авг 2007
    Сообщения:
    317
    я юзаю институтские лекции и пдфки с интел.ком =]
     
  19. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    Ты сам что-ли делал?
    В том chm что по всему инету гудяет таблица обрезана.
    Там только страница или две, остального нет.
    В принципе я когда-то эту таблицу и в chm добавлял, но не думаю что тот вариант разошёлся крупным тиражом :)

    Тогда уж лучше нануалы интеловские...
     
  20. Novi4ek

    Novi4ek New Member

    Публикаций:
    0
    Регистрация:
    3 авг 2007
    Сообщения:
    317
    Не, не сам. У меня два варианта: чм и джву. Вот джву: http://webfile.ru/1842514