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/