· Начало · Статистика · WASM.RU · Noir.Ru ·

 WASM Phorum (Оффлайн - 24.11.2003) —› WASM.ASSEMBLER —› Таблица переходов

Посл.отвђт Сообщен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