Как по мне это бред! ты лучше бы не фигнёй страдал, так как Iczelion при изучение масма довольно хорошо всё описал...! а вот если ты так хочешь переписать его статьи с пользой, то лучше переведи его статьи на fasm так как он сейчас довольно популярен следи начинаюших...! ну там сделай подробные описания и т. д.
Djinn Iczelion'у наверное, то же твердили. "К чему это, на С все давно написано?" В чем собственно бред? Не знаю, вот и спросил про хэш... Можешь написать лучше, пиши... А по поводу fasm Iczelion уже переписан, смотри http://sulaiman.netadvant.com maxdiver за оптимизированный вариант типа "дерево" меня уже отругали в #25 #30. Может быть есть другие мысли как ускорить процесс обработки сообщений? Y_Mur сообщения отсортированы по частоте их поступления. Я внес исправления в #20.
Mikl__ Проект хороший и тебе и другим на пользу Имхо в данном случае лучше всего как я уже писал - размещать в таблице только сообщения которые реально используются, но отсортировать их по частоте поступления, тогда простой линейный поиск будет быстрее всяких хитрых извращений (которые безусловно хороши и отлично, что ты пишешь такие примеры) но не в этой задаче
Знаешь, он и вообще довольно популярен, и не беспричинно кстати. Довольно хороший компилер, жалко, что не хватает некоторых полезных опций, например препроцессор слегка слабоват и линковку контролировать можно не полностью.
оптимизация обработчика сообщений Пусть наше приложение обрабатывает следующие сообщения: WM_CREATE=1 WM_ACTIVE=6 WM_SETREDRAW=11 WM_CLOSE=16. Для увеличения скорости просмотра очереди сообщений строим таблицу MsgTable, где номер элемента таблицы соответствует номеру сообщения. Сами табличные элементы представляют собой адреса (процедур), где эти сообщения обрабатываются. Пусть в таблице будут пока номера сообщений, необрабатываемым сообщениям соответствует 0 1000→10000→1, 6, 11, 16, default0600600000011011000000016160000A[i,j]=A[(j-1)×n+i-1] A[i,i]=A[(i-1)×(n+1)] n=4 Код (Text): .data table dd addr_WM_CREATE, addr_WM_ACTIVE, addr_WM_SETREDRAW, addr_WM_CLOSE .code xor edx,edx mov ecx,5;ecx=n+1 mov eax,uMsg cmp eax,max_msg;WM_CLOSE=16 ja a1 dec eax div ecx test edx,edx; остаток=0? jnz a1 jmp table[eax*4] a1: jmp default
Y_Mur Если X делим на k=2N тогда Остаток = X AND (k-1) иначе Остаток = X - X * "Магическое число" * k = X * (1 - "Магическое число" * k) так как "Магическое число" и k известны, (1 - "Магическое число" * k) можно рассчитать заранее 1 - "Магическое число" * k = "Магическое_число_1" Остаток = X * "Магическое_число_1" а умножение быстрее чем деление
Это. конечно, все супер. Молодец. Мне нравиться. Только, как начинающему, хотелось бы видеть исходники, а еще лучше, исходники с комментариями. У Iczelion'a, они все-таки были. Просто экзешник в твоем архиве, мне ни о чем не говорит, кроме того, что ты крут )))
Пусть наше приложение обрабатывает следующие сообщения: WM_DESTROY=2 WM_SETFOCUS=7 WM_KILLFOCUS=8 WM_SETREDRAW=11 WM_GETTEXT=13 WM_CLOSE=16. Для увеличения скорости просмотра очереди сообщений строим таблицу MsgTable, где номер элемента таблицы соответствует номеру сообщения. Сами табличные элементы представляют собой адреса (процедур), где эти сообщения обрабатываются. Пусть в таблице будут пока номера сообщений, необрабатываемым сообщениям соответствует 0. Пусть количество столбцов будет кратным 2N 012302000107802011013300160V=(0,1,1,2,2,3); номера строк обрабатываемых сообщений H=(0,1,2,1,3,2); номера столбцов обрабатываемых сообщений Z=(@@WM_DESTROY, @@WM_SETFOCUS, @@WM_KILLFOCUS, @@WM_SETREDRAW, @@WM_GETTEXT,@@WM_CLOSE); адреса обработки сообщений Код (Text): mov eax,Msg cmp eax,WM_CLOSE; номер максимального обрабатываемого сообщения ja default sub eax,WM_DESTROY;номер минимального обрабатываемого сообщения mov edx,eax shr eax,2; получили номер строки and edx,3;получили номер столбца xor ecx,ecx; индекс в таблицах a1: cmp al,V[ecx] ja default; обработка по умолчанию jne a2 cmp dl,H[ecx] jne a2 jmp dword ptr Z[ecx*4]; переход на адрес обработки сообщения a2: inc ecx jmp a1
Mikl__, сорри что не в тему... как можно написать этот код на ассемблере, так же компактно как в твоих примерах? Я в асме нуб =(