Forth http://www.fforum.winglion.ru/ |
|
Quark: команды сканирования битов http://www.fforum.winglion.ru/viewtopic.php?f=23&t=2433 |
Страница 1 из 2 |
Автор: | Hishnik [ Пн фев 15, 2010 03:51 ] |
Заголовок сообщения: | Quark: команды сканирования битов |
В системе команд x86 есть полезные команды BSF и BSR. Это команды определения первого установленного бита, начиная с младшего (BSF) и старшего (BSR) разрядов. Команды имеют источник и приемник, и в приемник попадает индекс бита источника, считая самый младший бит равным 0. При этом флаг нуля устанавливается в соответствии с успехом поиска хотя бы одного ненулевого бита. Однако для Форта два числа на стеке выглядят в данной ситуации избыточными. Вроде бы напрашивается решение о прибавлении к индексу единички, чтобы результат был в диапазоне 1-32 для найденных битов, и равен 0, если таковых нет. Польза от команд заключается в их аппаратной реализации в x86, что исключает необходимость искать более или менее эффективное решение на высоком уровне. Пока предполагается синтаксис вида BSF, BSR, потому что подходящих мнемоник для этого случая не припомню. Разве что SCANLEFT, SCANRIGHT... но все равно безусловно подходящего варианта как-то не видится. |
Автор: | chess [ Пн фев 15, 2010 09:54 ] |
Заголовок сообщения: | |
Хищник писал(а): Пока предполагается синтаксис вида BSF, BSR, потому что подходящих мнемоник для этого случая не припомню. Разве что SCANLEFT, SCANRIGHT... но все равно безусловно подходящего варианта как-то не видится.
Я назвал бы LO-BIT и HI-BIT Код: : LO-BIT ( n -- i) A=L\A L1 J0= A++ L1: ; SEE LO-BIT : HI-BIT ( n -- i) A=H\A L1 J0= A++ L1: ; SEE HI-BIT \ TEST CR 0 LO-BIT . 1 LO-BIT . 0 HI-BIT . 0x80000000 HI-BIT . LOG Код: CODE LO-BIT
5AEB5F 0FBCC0 BSF EAX , EAX 5AEB62 7401 JE 5AEB65 5AEB64 40 INC EAX 5AEB65 C3 RET NEAR END-CODE ( 7 bytes, 4 instructions ) CODE HI-BIT 5AEB7B 0FBDC0 BSR EAX , EAX 5AEB7E 7401 JE 5AEB81 5AEB80 40 INC EAX 5AEB81 C3 RET NEAR END-CODE ( 7 bytes, 4 instructions ) 0 1 0 32 Ok |
Автор: | Hishnik [ Пн фев 15, 2010 11:16 ] |
Заголовок сообщения: | |
chess писал(а): Я назвал бы LO-BIT и HI-BIT
В принципе можно. У меня, однако, вызывают некоторую настороженность мнемоники с дефисами и неполным написанием слов. Потому что LO-BIT также можно написать как LOW-BIT, а также LOWBIT LOW_BIT LO_BIT и т.п. |
Автор: | dynamic-wind [ Пн фев 15, 2010 18:55 ] |
Заголовок сообщения: | |
Историческая ваксовая команда FFS: возвращяет номер младшего 1-го бита плюс 1 (то есть 1..33) либо 0 С тех пор у сишников есть ffs() и fls() (для поиска в обратном направлении). Большой ПЛЮС этих названий: не надо придумывать новые аббревиатуры. |
Автор: | mOleg [ Пн фев 15, 2010 19:15 ] |
Заголовок сообщения: | |
а еще где-то было LBIT и RBIT , если не ошибаюсь |
Автор: | in4 [ Пн фев 15, 2010 19:52 ] |
Заголовок сообщения: | |
Можно LOB HIB - вроде, нигде не попадалось и коротко... |
Автор: | Hishnik [ Пн фев 15, 2010 22:27 ] |
Заголовок сообщения: | |
dynamic-wind писал(а): Историческая ваксовая команда FFS: возвращяет номер младшего 1-го бита плюс 1 (то есть 1..33) либо 0
С тех пор у сишников есть ffs() и fls() (для поиска в обратном направлении). Большой ПЛЮС этих названий: не надо придумывать новые аббревиатуры. Хороший вариант. |
Автор: | вопрос [ Пн фев 15, 2010 23:18 ] |
Заголовок сообщения: | |
Цитата: В принципе можно. У меня, однако, вызывают некоторую настороженность мнемоники с дефисами и неполным написанием слов. именно поэтому всякому языку желательно опиратся на какие-то грамматически-лексические условности
|
Автор: | chess [ Вт фев 16, 2010 13:26 ] |
Заголовок сообщения: | |
dynamic-wind писал(а): Большой ПЛЮС этих названий: не надо придумывать новые аббревиатуры.
А на счет таких, тоже полезных, конструкций: Код: SET-BIT ( n N -- n') установить бит N есть уже готовые названия?
CLR-BIT ( n N -- n') cброcить бит N GET-BIT ( n N -- 0|1) дать значение бита N |
Автор: | dynamic-wind [ Вт фев 16, 2010 15:03 ] |
Заголовок сообщения: | |
set-bit = bis, or ('bit set' pdp-11) clr-bit = bic ('bit clear' на arm, pdp-11) get-bit = ldb У pdp-10 были команды ldb (load byte) и dpb (deposit byte). они вообще могли извлекать/замещать битовое поле заданной длины, начиная с заданного бита. Потом в маклиспе и коммон-лиспе появились функции с такими названиями. Можно и в Форт такое перетащить |
Автор: | вопрос [ Вт фев 16, 2010 15:33 ] |
Заголовок сообщения: | |
В форт лучше тащить из ассемблеров |
Автор: | garbler [ Вт фев 16, 2010 20:42 ] |
Заголовок сообщения: | |
вообще-то есть ещё мнемоники msb и lsb (most significant bit / least significant bit) так что можно назввать слова как-нибудь вроде msbi и lsbi (most significant bit index / least significant bit index) |
Автор: | chess [ Вт фев 16, 2010 21:22 ] |
Заголовок сообщения: | |
garbler писал(а): так что можно назввать слова как-нибудь вроде msbi и lsbi
(most significant bit index / least significant bit index) А чем еще может характеризоваться наиболее/наимение значимый бит, кроме номера своего места? Пусть будет MSB и LSB, по-моему это лучше чем FFS/FLS. Вот еще полезная операция: Код: CHANGE-BITS ( n N1 N2 -- n') обмен битов
тоже длинное название. |
Автор: | вопрос [ Вт фев 16, 2010 21:25 ] |
Заголовок сообщения: | |
Н-да, опыт показывает. что 1. длительная работа над названием необходима - во избежание легкомысленного 2. работа не должна быть в духе "а вот можно ещё" - признак плохой, бесконечно перебирать можно |
Автор: | Hishnik [ Ср фев 17, 2010 00:42 ] |
Заголовок сообщения: | |
dynamic-wind писал(а): set-bit = bis, or ('bit set' pdp-11)
clr-bit = bic ('bit clear' на arm, pdp-11) get-bit = ldb Вообще можно, но оно делается с помощью AND и OR с соответствующей битовой маской, так что команда в Форте превращается в приятное дополнение. А вот поиск старшего/младшего значащего бита уже чуть посложнее, требует дополнительного внимания, тестирования слова в проекте, а также занимает лишнее время, поскольку пишется на чистом Форте. Отсылка к машинным командам тут разом убивает ворох проблем. |
Страница 1 из 2 | Часовой пояс: UTC + 3 часа [ Летнее время ] |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |