Я так и думал... Тут проблема ещё как этот самый lock обеспечить если одна SSE команда заменяется несколькими...
Можно так: Код (Text): cmp byte [sse_addr-1],lock je ;уход на ветку где все команды с префиксами lock, или крит. секция
Вот и я о том же... Прийдётся пока lock просто игнорировать видимо. -[Добавлено]- Ещё тут с кодированием некоторых команд вопрос. Например всё та же movss. В мануалах написано следующее: Код (Text): F3 0F 10 /r MOVSS xmm1, xmm2/m32 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): 0047F95C 26:F3:0F1003 MOVSS XMM0,DWORD PTR ES:[EBX] так и это Код (Text): 0047F95C F3:26:0F1003 MOVSS XMM0,DWORD PTR ES:[EBX] без исключений. Вопрос это на всех процессорах воспринимается как нормальная команда, или всё таки на некоторых может плачевно закончиться?
Подскажите ещё с 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? Или рассчитано на то что раз процесс завершается, то и фиг с ним - система всё сама подчистит?
1. Порядок префиксов не имеет значения. 2. Пофиг на TLS - система сама освобождает все ресурсы. Кстати, я вот не помню, вызывается ли thread attach для уже существующих потоков или нет... (созданных до момента инжекта)
У меня нет момента инжекта Моя dll добавлена в импорт самой верхней записью и подгружается загрузчиком ещё до старта самого процесса. Это понятно. То что префикс F3 должен присутствовать это ясно. Я имел ввиду должна ли сохраняться последовательность, т.е. должен ли префикс F3 идти непосредственно перед опкодом, или после него могут быть другие префиксы. На практике оказалось что могут.
Тут возник вопросик... Как определить есть ли у команды поле mod/rm? У nop допустим нету. Это от опкода зависит? А как тогда определять, таблицу на все опкоды делать? Смотрел дизассемблер длин hde32 - там таблиц не наблюдается... Ну то есть я анализирую команду, вначале отбираю все префиксы - их значения известны. Потом читаю первый байт опкода - если не 0F, значит всё. Если 0F - читаю второй. Если второй 38 или 3A - значит есть третий, читаю его. Если нет, значит опкод двухбайтовый и мы его прочитали. А вот как дальше определить есть у команды mod/rm или нет - не могу понять
не критичны, у меня даже намного меньше будет - мне ведь только SSEx надо, а их не так много. ну насчёт 256 ты тоже погорячился - больше будет. есть же ещё и двухбайтовые и трёхбайтовые опкоды. просто я вот смотрел реализацию hde32 - ну нету там таких больших таблиц. вообще нету. а команды понимает все за исключением трёхбайтовых опкодов (SSSE3). вот и интересен общий принцип. сейчас буду подетальней копаться в исходниках...
да, с твоими pdf-ками немного удобнее кстати если кому-то надо то вот ещё есть дока: http://dump.ru/files/o/o46620728/ это больше просто перевод мануала на русский (хотя особо переводить там нечего). таблица опкодов правда не новая - команды до MMX включительно. это приложение к книге Зубкова "Ассемблер для DOS, Windows и Unix", которого в электронном варианте нет. правда возможны опечатки, распознавалось со скана... хотя вроди и проверял.
Ты сам что-ли делал? В том chm что по всему инету гудяет таблица обрезана. Там только страница или две, остального нет. В принципе я когда-то эту таблицу и в chm добавлял, но не думаю что тот вариант разошёлся крупным тиражом Тогда уж лучше нануалы интеловские...