Главная страница


ru.algorithms

 
 - RU.ALGORITHMS ----------------------------------------------------------------
 From : Sashka Yackubtchick                  2:5054/29.54   13 Nov 2001  23:00:03
 To : Egor Alexeev
 Subject : Case
 -------------------------------------------------------------------------------- 
 
 
 12 Nov 01 21:03, Egor Alexeev писАл(а) к All:
 
  EA> 1)Сделать просто с помощью оператора Case. Hо, так как параметров выбора
  EA> достаточно много(256), то по скорости он меня не очень
  EA> устраивает. 2)Создать массив(A[0..255]) процедурного типа и, обращаясь к
  EA> его соответствующему элементу выполнять ту или иную процедуру(A[m]). Этот
  EA> способ плох тем, что тратится большое количество времени на постоянный
  EA> вызов процедур(причем с FAR моделью вызова).
 
  EA> Может есть какой нибудь способ у которого не будет ни недостатка перебора
  EA> Case'а, ни вызова процедур?
 
 Hе знаю насколько это поможет, мой основной язык asm x86 для flat модели.
 Очень часто случаются похожие ситуации когда кейсы можно представить или
 получить в виде упорядоченого непрерывного массива и тогда их можно использовать
 как индексы к таблице переходов, причём при подобной технике
 нет разницы насколько много кейсов(единственное условие чтобы их можно было
 представить как непрерываные значения) - правильный обработчик будет вызван
 за одно и тоже время.
 Причём несмотря на создание таблицы переходов не только растёт скорость
 но и уменьшается расход памяти и размер исполнительного модуля поскольку
 на реализацию стандартной case обработки уходит больше байтов на каждый
 "служебный" код нежели на один указатель в секции данных.
 
 Схема примерно такая
 1. В секции данных распологаются адреса обработчиков разных кейсов
 по мере роста индексов кейсов.
 hCase dd @case1 ;массив данных DWORD -32х разрядных указателей.
       dd @case2
       dd @case3
       ....
       dd @case256
 2. В секции кода пришедшее значение кейса используется как индекс элемента
 в таблице-массиве hCase и делается переход по этому элементу
 например он пришел в wParam
     mov eax,wParam
     mov eax,[eax*4][offset hCase]
     jmp eax
 
     ....
 @case1: здесь код для case1
     ...
     jmp @endcase
 @case2: здесь код для case2
     ...
     jmp @endcase
 @case3:
     ....
     jmp @endcase
 ....
 ....
 @case256:
 
     ...
 @endcase
 
 В независимости от колличества кейсов и номера нужный обработчик будет найден
 за 5 тактов процессора P5 и выше.
 Пока!
              Sashka, The Svin.
 
 --- GoldED/W32 3.00.Beta1+
  * Origin: Svin, Perm, Russia  (2:5054/29.54)
 
 

Вернуться к списку тем, сортированных по: возрастание даты  уменьшение даты  тема  автор 

 Тема:    Автор:    Дата:  
 Case   Egor Alexeev   12 Nov 2001 22:03:49 
 Case   Sashka Yackubtchick   13 Nov 2001 23:00:03 
 Case   Egor Alexeev   14 Nov 2001 21:10:00 
 Case   Gerasimov Gerasim   15 Nov 2001 10:05:14 
 Re: Case   Michael Ryazanov   14 Nov 2001 18:06:00 
 Case   Egor Alexeev   17 Nov 2001 22:53:01 
 Re: Case   Michael Ryazanov   19 Nov 2001 21:20:00 
Архивное /ru.algorithms/33843bf19ca5.html, оценка 1 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional