Интересно можно ли пользуясь FASM выполнить оптимизацию деревом. Насколько мне известно многие компиляторы умеют это делать. Идея заключается в следующем Пусть есть переменная Key которая может равнятся одному из пяти значение 1, 2, 3, 4, 5 (Частный случай значения могут быть любыми) В зависимости от того какое значения оно приняло программа должна переходить по одной из пяти меток Решение в лоб: cmp [Key], 1 je .lbOne cmp [Key], 2 je .lbTwo cmp [Key], 3 je .lbThree cmp [Key], 4 je .lbFour cmp [Key], 5 je .lbFive jmp .lbDef .lbOne: . ... .lbTwo: . ... .lbThree: . ... .lbFour: . ... .lbFive: . ... .lbDef: Тут еще должны быть jmp .lbEnd после каждого условия но и так понятно. Можно, конечно, тут применить Decобразную оптимизацию. но суть не в этом Идея в другом чтобы получилось так: cmp [Key], 3 ja .lbBigger1 jc .lbSmaller1 .lbThree: ...... .lbSmaller1: cmp [Key], 2 ja .lbBigger2 (Невозможный переход, но скорее всего такие переходы будут в результате получаться) jc .lbSmaller2 .lbTwo: ..... .lbSmaller2: cmp [Key1], 1 ja .lbBigger3 (Еще один невозможный переход) jc .lbDef .lbOne: .... .lbBigger1: cmp [Key], 4 ja .lbBigger3 jc .lbSmaller3 (И еще один такой) .lbFour: ...... .lbBigger3: cmp [Key], 5 ja .lbDef jc .lbSmaller4 (Последний невозможный переход) .lbFive: ...... .lbDef: ...... Так как сравнений получается намного меньше, то при большом количестве таких значений скорость выполнения такой программы будет напорядок выше. Мысль такая как бы написать макрос, который умел бы такое делать Примерно он бы выглядел так Switch 1,.lbOne, 2, .lbTwo, 3, .lbThree, 4, .lbFour, 5, .lbFive или Switch 1,2,3,4,5 Labels .lbOne, .lbTwo, .lbThree, .lbFour, .lbFive В результате бы получилось что-то вроде описанного выше кода.
Miller Rabin Сделать можно. Но нет смысла в уродстве вида Можно писать как обычный switch: Код (Text): switch [wmsg] case WM_CREATE ; ... case WM_DESTROY ; ... default ; ... endswitch Switch на основе jump-table уже реализовали. Можно и tree-switch сделать, если подумать.
Так вот я и думаю как можно сделать tree-switch Начнем с малого. Если взять конструкцию switch [wmsg] case WM_CREATE ; ... case WM_DESTROY ; ... default ; ... endswitch То из всех возможных значений [wmsg] в case нужно выбрать то которое будет ближе всех к середине чтобы от него строить дерево. Как это сделать в такой конструкции?
Во-первых, если ты слаб в макросах фасма, но хочешь разобраться сам, то почитай мануал и FAQ по макросам на форуме фасма. Или задай вопрос там. Также поищи там последние макросы switch и посмотри их реализацию. По реализации: нужно выбирать среднее значение из диапазона констант (case) и строить таблицы переходов. Вообще, обработку можно делать в switch, case, endswitch, но в данном случае должен быть доступен весь набор констант, поэтому реализация откладывается на endswitch. Хотя, глядя на последний макрос (switch-table) я думаю, что можно также использовать проходы ассемблера и разделить реализацию на preprocess-time и assembly-time. А вообще, попробуй реализовать этот алгоритм просто на каком-нибудь ЯВУ (си, паскаль), потом будет проще переписать на макроязык фасма.