cresta С лишними push\pop и с тормозной BT ес-но побитовый вариант хуже. Но, ведь можно и класику типа and ecx,7 + shr al,cl использовать. Если нужен компромисс размера и скорости, то и с размером таблицы можно особо не мелочиться, вполне подойдет классический дельфовый вариант set of char c 32 байтной таблицей (<= одной линейки кэша) - зато без лишних jcc
n0name Что в приоретете, автор пока даже сам не определился Если есть варианты (по скорости, по размеру), выкладывай. Из того, что я в этом топике видел, пока работа с битами самая медленная. И не самая маленькая по размеру. Давай варианты. Мысль с битами твоя - вот и давай нормальную реализацию leo pop/push ebx никак не лишние: в задаче оговорено незадействование регистров (кроме аккумулятора). Давай тоже варианты. P.S. Маленький код по-моему давно уже перестал быть приорететом. В отличие от скорости. ИМХО.
в #18 - 46 байт. Код (Text): format binary use16 org 100h cmp al, 7Ah jge _end sub al, 2Dh js _end bt word [table], ax _end: ; some code ; 43210fed cba98765 table db 11111011b, 00011111b ; 2d db 11111000b, 11111111b ; 3d db 11111111b, 00111111b ; 4d db 11110100b, 11111111b ; 5d db 11111111b, 00111111b ; 6d 23 байта
n0name надо добавить clc, причем 2 штуки (+2 байта), иначе числа больше 7А и меньшие 2D будут давать неверные значения на короткой (10 байт) таблице. И заменить jge на jae. Код (Text): clc cmp al, 7Ah jae @F sub al, 2Dh clc js @F bt word ptr [table], ax @@: Если делать таблицу 32 байта (256 бит) и использовать bt, то код станет 12 байт: Код (Text): and ax,0FFh bt word ptr [table], ax Этот вариант почти вдвое быстрее предыдущего варианта (34/64), правда на 9 байт длиннее (44/35). Возможно это и есть компромисс между скоростью и размером. leo and cl, 7 + rcr al,cl не очень впечатлило... ~90 тиков (10 проходов).
немного переделанный код от n0name на 2 байта короче Код (Text): ; надо заменить это cmp al, 7Ah jge _end sub al, 2Dh js _end ; на это sub al,2dh cmp al,4dh ja .exit
cresta На атлонах bt рулит в цикле, т.к. она конвееризована (throughput = 2), а вот на P4 это отстой полнейший
Код (Text): ;;в al код символа ;; ah должен быть сброшен - поддержка unicode ;)) ;;CF = 0 если символ входит в заданный диапазон nsumbol: sub al,2dh cmp al,4dh ja .exit ;; ???????? bt word [table],ax ;; ???????? .exit: ret table db 00000100b, 11100010b, 00001111b, 00000000b db 00000000b, 11000000b, 00001011b, 00000000b db 00000000b, 00000000b 15 байт