|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Окт 7, 2003 21:53:36 Говорят, что с помощью таблицы переходов можно ускорить выполнение программы вместо использования условных и безусловных переходов!!! Кто нибудь пробывал делать такое? и как это может выглядеть? |
|
|
Дата: Окт 8, 2003 11:17:50 Ускорить – навряд ли. Просто удобно в ряде случаев. Как выглядеть - у меня в статье ближе к концу есть фраза call [procs+eax*4] ; вызовет процедуру в соответствии с селектором - вот это оно и есть. |
|
|
Дата: Окт 8, 2003 17:39:34 masquer я не очень понял! Какую именно эта строчка вызовет процедуру??? к примеру EAX=5 |
|
|
Дата: Окт 8, 2003 18:08:58 Хм, ну, по адресу, на который указывает proc лежат указатели на процедуры, соответствующие индексу. Отсюда eax=5 соответствует вызову процедуры DoFinish (если по статье смотреть). |
|
|
Дата: Окт 8, 2003 19:37:37 Такое было когда я писал враппер для winsock. Так вот, там в нормальном режиме вызывались оригинальные функции winsock, а в режиме sniffer - мои собственные (с перехватом траффика :) Таблицы переходов были очень кстати. |
|
|
Дата: Окт 8, 2003 19:53:56 masquer Т.е. фишка в том чтобы выровнять все процедуры а потом по номеру к ним обращаться!! Если смотреть в статье то вме процедуры выровнены ALIGN4 а вызов идет такой call [proc+eax*4] Где можно почитать про технику создания таких таблиц?Quantummasquer |
|
|
Дата: Окт 8, 2003 19:59:58 emergenter Выравнивание здесь особой роли не играет. Ты про IAT знаешь? Принцип тотже. |
|
|
Дата: Окт 8, 2003 20:01:40 Quantum Что это такое? Если можно по подробнее... |
|
|
Дата: Окт 9, 2003 02:24:26 · Поправил: Dr.Golova Ну чего тут можно говорить? Таблицы удобны когда у тебя есть несколько веток с подряд идущими условиями, типа: if ( a == 0 ) do_proc_0(); else if ( a == 1 ) do_proc_1(); else if ( a == 2 ) do_proc_2(); else if ( a == 3 ) do_proc_3(); ну и так далее (это типа развернутый switch если кто не понял), на асме это может выглядеть в общем случае примерно так (если без оптимизации через dec [a]/jz proc): mov eax, [a] cmp eax, 0 jz do_proc_0 cmp eax, 1 jz do_proc_1 cmp eax, 2 jz do_proc_2 cmp eax, 3 jz do_proc_3 получается довольно много однообразного кода, а с таблицей адресов это делается так:
mov eax, [a]
jmp dword ptr [j_table + eax*4]
...
;; и где-нить в конце функции собсно табличка офсетов
j_table: dd offset do_proc_0
dd offset do_proc_1
dd offset do_proc_2
dd offset do_proc_3
|
|
|
Дата: Окт 9, 2003 11:01:58 Dr.Golova СПАСИБО ОГРОМНОЕ!! |
|
|
Дата: Окт 9, 2003 14:02:18 Dr.Golova только я так понял все усовные переходы таким методом не заменишь... |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.036 |