Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Вт мар 19, 2024 07:02

...
Google Search
Forth-FAQ Spy Grafic

Часовой пояс: UTC + 3 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 72 ]  На страницу 1, 2, 3, 4, 5  След.
Автор Сообщение
 Заголовок сообщения: битовые накопительные массивы
СообщениеДобавлено: Ср июн 27, 2007 23:45 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
вдруг понадобилась такая штука...
Код:
\ 25-06-2007 ~mOleg
\ Copyright [C] 2007 mOleg mininoleg@yahoo.com
\ битовый буффер накопитель

REQUIRE ?DEFINED devel\~mOleg\lib\util\ifdef.f
REQUIRE B@       devel\~mOleg\lib\util\bytes.f


        USER retain \ количество сохраненных бит

               8 CONSTANT bits/addr \ бит в байте
bits/addr CELLS CONSTANT bits/cell \ бит в ячейке

\ вернуть адрес и смещение конца битового массива
: bAddr ( base --> disp addr ) retain @ bits/addr /MOD ROT + ;

\ сместить битовое поле u в старшие разряды
: [barr ( u # --> |u # ) TUCK bits/cell SWAP - LSHIFT SWAP ;

\ поменять порядок байт в числе
: bSwap ( u --> u ) [ 0x0F B, 0xC8 B, ] ;

\ сдвинуть число u вправо на # бит с получением результата двойной длины
: shrd ( u # --> D )
       [ 0x8B B, 0xC8 B, 0x33 B, 0xC0 B, 0x8B B,
         0x55 B, 0x00 B, 0x0F B, 0xAD B, 0xD0 B,
         0xD3 B, 0xEA B, 0x89 B, 0x55 B, 0x00 B, ] ;

\ добавить битовое поле в конец битового массива
\ битовое поле начинается со старшего бита числа и занимает # бит вправо
: accrue ( u # base --> )
         bAddr >R SWAP retain +! shrd
         bSwap R@ CELL + ! bSwap R> +! ;


       USER barray
            \ адрес начала буфера

\ добавить битовое поле в конец массива
\ битовое поле начинается с 0 бита и занимает # бит влево
: bPlus ( u # --> ) [barr barray @ accrue ;

\ перед использованием bPlus надо обнулить retain и установить barray
\ shrd можно реализовать через цикл с D2/ - просто будет дольше выполняться
\ bSwap просто меняет порядок следования байт в cell на обратный
\ буфер, перед сохранением в него битового потока должен быть очищен с помощью
\ ERASE

?DEFINED test{ \EOF -- тестовая секция ---------------------------------------

test{ 0x12 8 [barr 8 = SWAP 0x12000000 = AND 0= THROW               \ [barr
      0x12345678 bSwap 0x78563412 <> THROW                          \ bSwap
      0x12345678 0x10 shrd 0x56780000 = SWAP 0x1234 = AND 0= THROW  \ shrd
      HERE 10 + barray ! 5 5 bPlus 0x12345678 0x20 bPlus
      0 bAddr 5 4 D= 0= THROW                                       \ bAddr
      barray @ @ 0xB3A29128 <> THROW                                \ bPlus
      0x11111111 0x20 bPlus barray @ CELL + @ 0x888888C0 <> THROW   \ bPlus
  S" passed" TYPE
}test




За это сообщение автора mOleg поблагодарил: Sotnik
Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Ср июн 27, 2007 23:50 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
использование приведенной выше либы для трансляции потоков чисел в битовые массивы
Код:
\ 24-06-2007 ~mOleg
\ Copyright [C] 2007 mOleg mininoleg@yahoo.com
\ преобразование потока чисел в бинарное представление

REQUIRE ?DEFINED devel\~moleg\lib\util\ifdef.f
REQUIRE SkipChar devel\~mOleg\lib\util\parser.f
REQUIRE >CIPHER  devel\~moleg\lib\parsing\number.f
REQUIRE bPlus    devel\~moleg\lib\arrays\barray.f

        USER-VALUE bit-size \ сколько бит занимает один символ
        USER-VALUE max-char \ максимально допустимое цифровое значение символа

\ направляем битовый поток в PAD
: |bbuf ( --> )
        SYSTEM-PAD DUP barray ! PAD OVER - ERASE
        0 retain ! ;

\ вернуть адрес начала битового массива и его длину в байтах
: bbuf> ( --> addr # )
        barray @ retain @ bits/addr
        /MOD SWAP 0<> NEGATE + ;

\ определяем тип потока
: stream-type ( --> )
              SkipDelimiters PeekChar
              \ шестнадцатиричные
              [CHAR] x OVER = OVER [CHAR] X = OR
                     IF DROP SkipChar 4 TO bit-size 0x10 TO max-char EXIT THEN
              \ восьмиричные
              [CHAR] o OVER = OVER [CHAR] O = OR
                     IF DROP SkipChar 3 TO bit-size 0x8 TO max-char EXIT THEN
              \ двоичные
              [CHAR] b OVER = OVER [CHAR] B = OR
                     IF DROP SkipChar 1 TO bit-size 0x2 TO max-char EXIT THEN

              \ по умолчанию 16ричные числа
              DROP 4 TO bit-size 0x10 TO max-char
              ;

\ разобрать входной поток до завершающей скобки '}' или ']'
: parse-stream ( --> )
               BEGIN SkipDelimiters GetChar WHILE \ не исчерпан входной поток
                     >CIPHER DUP 0 max-char WITHIN WHILE \ допустимые символы
                     bit-size bPlus
                     SkipChar
                  REPEAT \ возможно завершающая скобка
                     PeekChar [CHAR] } = PeekChar [CHAR] ] = OR
                     IF SkipChar DROP EXIT THEN
               THEN DROP -1 THROW ;

\ вернуть адрес преобразованного потока в двоичное представление
: STREAM{ ( /stream} --> addr # )
          |bbuf stream-type
                ['] parse-stream CATCH THROW
          bbuf> ;

\ компилировать поток в текущее определение
: STREAM[ ( /stream --> ) STREAM{ S, ; IMMEDIATE

?DEFINED test{ \EOF -- тестовая секция ---------------------------------------

test{ STREAM{ FAD3C5EB} DROP @ 0xEBC5D3FA <> THROW
      STREAM{ o1234560} DROP @ 0x80CB29 <> THROW
      STREAM{ b1110 1010 1101 0101 0101 0111 } DROP @ 0x57D5EA <> THROW
  S" passed" TYPE
}test


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Ср июн 27, 2007 23:55 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
и пример использования различных методик для создания ассемблерных приметивов
первый вариант с использованием ассемблера(правда псеводассемблера)
второй, типичный для СПФ без подключения асма
третий с использованием приведенных выше либ...

Код:
\ 24-06-2007 ~mOleg
\ Copyright [C] 2007 mOleg mininoleg@yahoo.com
\ манипуляции данными на стеке возвратов
\ в трех вариантах исполнения

REQUIRE ?DEFINED  devel\~moleg\lib\util\ifdef.f
REQUIRE STREAM[   devel\~mOleg\lib\arrays\stream.f

\ REQUIRE B@        devel\~mOleg\lib\util\bytes.f
\ REQUIRE dpush     devel\~mOleg\lib\asm\psevdoasm.f

\ поменять местами два числа
\ верхнее на стеке данных с верхним на стеке возвратов
\ CODE R><D ( r: a d: b --> r: b d: a )
\          rpop addr
\          XCHG tos , [rtop]
\        JMP addr
\     END-CODE
\ : R><D ( r: a d: b --> r: b d: a )
\       [ 0x5B B, 0x87 B, 0x04 B, 0x24 B, 0xFF B, 0xE3 B, ] ;
: R><D ( r: a d: b --> r: b d: a ) STREAM[ x5B870424FFE3 ] ;

\ поменять местами два числа на стеке возвратов
\ CODE RSWAP ( r: a b --> r: b a )
\            rpop addr
\            rpop temp
\            rpop cntr
\            rpush temp
\            rpush cntr
\          JMP addr
\       END-CODE
\ : RSWAP ( r: a b --> r: b a )
\        [ 0x5B B, 0x5A B, 0x59 B, 0x52 B, 0x51 B, 0xFF B, 0xE3 B, ] ;

: RSWAP ( r: a b --> r: b a ) STREAM[ x5B5A595251FFE3 ] ;

\ удалить второй по счету элемент от вершины стека возвратов
\ CODE RNIP ( r: a b --> r: b )
\          rpop addr
\          rpop temp
\          rpop cntr
\          rpush temp
\        JMP addr
\     END-CODE
\ : RNIP ( r: a b --> r: b )
\       [ 0x5B B, 0x5A B, 0x59 B, 0x52 B, 0xFF B, 0xE3 B, ] ;
: RNIP ( r: a b --> r: b ) STREAM[ x5B5A5952FFE3 ] ;

\ копировать верхний элемент на вершине стека возвратов
\ CODE RDUP ( r: a --> r: a a )
\          rpop addr
\          MOV temp , [rtop]
\          rpush temp
\        JMP addr
\     END-CODE
\ : RDUP ( r: a --> r: a a )
\       [ 0x5B B, 0x8B B, 0x14 B, 0x24 B, 0x52 B, 0xFF B, 0xE3 B, ] ;
: RDUP ( r: a --> r: a a ) STREAM[ x5B8B142452FFE3 ] ;

\ положить поверх верхнего элемента копию нижнего на стеке возвратов
\ CODE ROVER ( r: a b --> r: a b a )
\           rpop addr
\           MOV temp , CELL [rtop]
\           rpush temp
\         JMP addr
\      END-CODE
\ : ROVER ( r: a b --> r: a b a )
\        [ 0x5B B, 0x8B B, 0x54 B, 0x24 B, 0x04 B, 0x52 B, 0xFF B, 0xE3 B, ] ;
: ROVER ( r: a b --> r: a b a ) STREAM[ x5B8B54240452FFE3 ] ;

\ подложить копию верхнего элемента, находящегося на вершине стека
\ возвратов под нижний
\ CODE RTUCK ( r: a b --> r: b a b )
\           rpop addr
\           rpop temp
\           rpop cntr
\           rpush temp
\           rpush cntr
\           rpush temp
\         JMP addr
\      END-CODE
\ : RTUCK ( r: a b --> r: b a b )
\        [ 0x5B B, 0x5A B, 0x59 B, 0x52 B, 0x51 B, 0x52 B, 0xFF B, 0xE3 B, ] ;
: RTUCK ( r: a b --> r: b a b ) STREAM[ x5B5A59525152FFE3 ] ;

\ провернуть три верхних элемента на вершине стека возвратов влево
\ CODE RROT ( r: a b c --> r: b c a )
\          rpop addr
\          rpop temp
\          rpop cntr
\          rpop templ
\          rpush cntr
\          rpush temp
\          rpush templ
\        JMP addr
\     END-CODE
\ : RROT ( r: a b c --> r: b c a )
\       [ 0x5B B, 0x5A B, 0x59 B, 0x5E B, 0x51 B, 0x52 B, 0x56 B,
\         0xFF B, 0xE3 B, ] ;
: RROT ( r: a b c --> r: b c a ) STREAM[ x5B5A595E515256FFE3 ] ;

\ добавить число к находящемуся на стеке возвратов
\ : R+ ( r: a d: b --> r: a+b ) 2R> -ROT + >R >R ;
\ CODE R+ ( r: a d: b --> r: a+b )
\        rpop addr
\        ADD [rtop] , tos
\        dpop tos
\      JMP addr
\   END-CODE
\ : R+ ( r: a d: b --> r: a+b )
\     [ 0x5B B, 0x01 B, 0x04 B, 0x24 B, 0x8B B, 0x45 B, 0x00 B,
\       0x8D B, 0x6D B, 0x04 B, 0xFF B, 0xE3 B, ] ;
: R+ ( r: a d: b --> r: a+b ) STREAM[ x5B0104248B45008D6D04FFE3 ] ;

?DEFINED test{ \EOF -- тестовая секция ---------------------------------------

test{ : first   1 >R 2 R><D R> ; first 1 2 D= 0= THROW          \ R><D
      : second  1 >R 2 >R RSWAP R> R> ; second 1 2 D= 0= THROW  \ RSWAP
      : thrid   1 >R 2 >R RNIP R> ; thrid 2 <> THROW            \ RNIP
      : fourth  1 >R RDUP R> R> ; fourth <> THROW               \ RDUP
      : fifth   1 >R 2 >R ROVER R> R> R> ;
        fifth 1 = SWAP 2 = AND SWAP 1 = AND 0= THROW            \ ROVER
      : sixth   1 >R 2 >R RTUCK R> R> R> ;
        sixth 2 = SWAP 1 = AND SWAP 2 = AND 0= THROW            \ RTUCK
      : seventh 1 >R 2 >R 3 >R RROT R> R> R> ;
        seventh 2 = SWAP 3 = AND SWAP 1 = AND 0= THROW          \ RROT
      : eighth  10 1 >R R+ R> ; eighth 11 <> THROW              \ R+

  S" passed" TYPE
}test


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт июн 28, 2007 00:06 
---


Последний раз редактировалось profiT Сб мар 01, 2008 01:04, всего редактировалось 1 раз.

Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт июн 28, 2007 00:11 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
profiT писал(а):
SPF_DEVEL:

Цитата:

REQUIRE x.mask ~mlg/SrcLib/bitfield.f \ Битовые структуры

а у меня не структуры, и туда, между прочим я первым делом посмотрел 8)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: битовые накопительные массивы
СообщениеДобавлено: Чт фев 03, 2022 01:05 
Не в сети

Зарегистрирован: Пн окт 05, 2009 18:21
Сообщения: 405
Откуда: Минск SotnikSTO@mail.ru
Благодарил (а): 48 раз.
Поблагодарили: 3 раз.
mOleg писал(а):
вдруг понадобилась такая штука...
Код:
\ 25-06-2007 ~mOleg\ поменять порядок байт в числе
: bSwap ( u --> u ) [ 0x0F B, 0xC8 B, ] ;
вот спасибочки, как вовремя - акурат цикл убыстрится
Код:
12345678 bswap .
78563412  Ok
побольше бы таких быстрых примитивов

ещё бы два быстрых слова для анализа в цикле
Код:
: I4 ( u32 -> a b c d ) число на стеке 32 бит разложить на составные 4 байта   11223344 -> 11 22 33 44
: 4I ( a b c d -> u32 ) числа (младшие байты) на стеке  собрать в одно число   11 22 33 44 -> 11223344
или где-то такие быстрые слова тихенько сидят в переписке, как bSwap, и помалкивают? :)

_________________
Сотник. SotnikSTO@mail.ru


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: битовые накопительные массивы
СообщениеДобавлено: Чт фев 03, 2022 13:18 
Не в сети

Зарегистрирован: Чт янв 07, 2016 19:14
Сообщения: 1285
Благодарил (а): 3 раз.
Поблагодарили: 18 раз.
Если говорить про bSwap, то для придумывания данного примитива достаточно поковыряться в справочнике по архитектуре x86 от Интела)

I4 4I зачем они?
Я делал что-то подобное для удобного задания IP-адресов

Код:
: IP:
SkipDelimiters
'.' PARSE STR>NUM THROW
   \   0x00 LSHIFT
'.' PARSE STR>NUM THROW
      0x08 LSHIFT
'.' PARSE STR>NUM THROW
      0x10 LSHIFT
PARSE-NAME STR>NUM THROW
      0x18 LSHIFT

+ + +
?LIT
; IMMEDIATE




: >IP \ N1 N2 N3 N4 -- IP

[
BASE @ HEX
C1 C, E0 C, 0x18 C,   \   SHL     EAX , 18
8B C, 4D C, 0x00 C, \   MOV     ECX , 0 [EBP]
8B C, 55 C, 0x04 C, \     MOV     EDX , 4 [EBP]
8B C, 5D C, 0x08 C, \     MOV     EBX , 8 [EBP]
C1 C, E1 C, 0x10 C, \      SHL     ECX , 10
C1 C, E2 C, 0x08 C, \      SHL     EDX , 8
8D C, 04 C, 10 C,   \   LEA     EAX , [EAX] [EDX]
8D C, 04 C, 08 C,   \   LEA     EAX , [EAX] [ECX]
8D C, 04 C, 18 C,   \   LEA     EAX , [EAX] [EBX]

BASE !
]
NIP NIP NIP
;


_________________
Цель: сделать 64-битную Нову под Винду



За это сообщение автора Victor__v поблагодарил: Sotnik
Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: битовые накопительные массивы
СообщениеДобавлено: Чт фев 03, 2022 16:06 
Не в сети

Зарегистрирован: Пн окт 05, 2009 18:21
Сообщения: 405
Откуда: Минск SotnikSTO@mail.ru
Благодарил (а): 48 раз.
Поблагодарили: 3 раз.
Victor__v писал(а):
Если говорить про bSwap, то для придумывания данного примитива достаточно поковыряться в справочнике по архитектуре x86 от Интела)
I4 4I зачем они?
Я делал что-то подобное для удобного задания IP-адресов
Иногда надо работать с байтами очень быстро, а сдвигать долго.
Порыться в асме можно, десятки лет назад я так и делал. Потиху надо вспоминать.
Victor__v писал(а):
Код:
: IP:
SkipDelimiters
'.' PARSE STR>NUM THROW
   \   0x00 LSHIFT
'.' PARSE STR>NUM THROW
      0x08 LSHIFT
'.' PARSE STR>NUM THROW
      0x10 LSHIFT
PARSE-NAME STR>NUM THROW
      0x18 LSHIFT
+ + +
?LIT
; IMMEDIATE

'.' PARSE STR>NUM THROW
^ -2003 WORD OR FILE NOT FOUND
'.' - в наработках упоминается применение, исходника нет
STR>NUM - тож неведом - в комплекте не упоминается, что надо подключить?
LSHIFT - тормозит цикл раза в четыре, почему я тут и спрашиваю прямые коды
Victor__v писал(а):
Код:
: >IP \ N1 N2 N3 N4 -- IP
[  BASE @ HEX
C1 C, E0 C, 0x18 C, \     SHL     EAX , 18
8B C, 4D C, 0x00 C, \     MOV     ECX , 0 [EBP]
8B C, 55 C, 0x04 C, \     MOV     EDX , 4 [EBP]
8B C, 5D C, 0x08 C, \     MOV     EBX , 8 [EBP]
C1 C, E1 C, 0x10 C, \     SHL     ECX , 10
C1 C, E2 C, 0x08 C, \     SHL     EDX , 8
8D C, 04 C, 10 C,   \     LEA     EAX , [EAX] [EDX]
8D C, 04 C, 08 C,   \     LEA     EAX , [EAX] [ECX]
8D C, 04 C, 18 C,   \     LEA     EAX , [EAX] [EBX]
BASE ! ] NIP NIP NIP  ;
Код:
12 34 56 78  >IP   .   78563412
>IP отработало великолепно!!! Спасибо! :)

_________________
Сотник. SotnikSTO@mail.ru


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: битовые накопительные массивы
СообщениеДобавлено: Чт фев 03, 2022 17:33 
Не в сети
Аватара пользователя

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2168
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 41 раз.
На встроенном ассемблере очень просто реализуется с минимумом обращений к памяти
Код:
: I4 ( u32 -> a b c d )
$ -C Pa
D=A $ FF000000  D&# $ 18 #D>> $ 8 @P=D
D=A $ FF0000    D&# $ 10 #D>> $ 4 @P=D
D=A $ FF00      D&# $  8 #D>> $ 0 @P=D
    $ FF        A&#
; SEE I4

: 4I ( a b c d -> u32 )
$ 8 D=@P $ 18 #D<< A|D
$ 4 D=@P $ 10 #D<< A|D
$ 0 D=@P $  8 #D<< A|D
$ C Pa
; SEE 4I

HEX
11223344 I4
11 22 33 44 4I


: TST 0x11223344 I4 ; TIME
: tst 0x11 0x22 0x33 0x44 4I ; time
ЛОГ
Код:
CODE I4
622BA3 8D6DF4           LEA     EBP , F4 [EBP]
622BA6 8BD0             MOV     EDX , EAX
622BA8 81E2000000FF     AND     EDX , # FF000000
622BAE C1EA18           SHR     EDX , 18
622BB1 895508           MOV     8 [EBP] , EDX
622BB4 8BD0             MOV     EDX , EAX
622BB6 81E20000FF00     AND     EDX , # FF0000
622BBC C1EA10           SHR     EDX , 10
622BBF 895504           MOV     4 [EBP] , EDX
622BC2 8BD0             MOV     EDX , EAX
622BC4 81E200FF0000     AND     EDX , # FF00
622BCA C1EA08           SHR     EDX , 8
622BCD 895500           MOV     0 [EBP] , EDX
622BD0 81E0FF000000     AND     EAX , # FF
622BD6 C3               RET     NEAR
END-CODE
( 52 bytes, 15 instructions )


CODE 4I
622BE7 8B5508           MOV     EDX , 8 [EBP]
622BEA C1E218           SHL     EDX , 18
622BED 0BC2             OR      EAX , EDX
622BEF 8B5504           MOV     EDX , 4 [EBP]
622BF2 C1E210           SHL     EDX , 10
622BF5 0BC2             OR      EAX , EDX
622BF7 8B5500           MOV     EDX , 0 [EBP]
622BFA C1E208           SHL     EDX , 8
622BFD 0BC2             OR      EAX , EDX
622BFF 8D6D0C           LEA     EBP , C [EBP]
622C02 C3               RET     NEAR
END-CODE
( 28 bytes, 11 instructions )

     4 ns ( время I4, при тактовой частоте процессора 3500 Ггц)
     2 ns ( время 4I)

_________________
С уважением, chess


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: битовые накопительные массивы
СообщениеДобавлено: Чт фев 03, 2022 19:49 
Не в сети

Зарегистрирован: Пн окт 05, 2009 18:21
Сообщения: 405
Откуда: Минск SotnikSTO@mail.ru
Благодарил (а): 48 раз.
Поблагодарили: 3 раз.
chess писал(а):
Код:
     4 ns ( время I4, при тактовой частоте процессора 3500 Ггц)
     2 ns ( время 4I)
Впечатляет!

\ сразу подавился на $, порылся в библиотеках - нашёл и попробовал все 4 варианта - не то
\ ------------------------------
\ получить очередную цифру
\ : $ ( n --> n*base C) CurrentBase @ UM* >digit ; \ ? - CurrentBase
\ получить очередную цифру
\ : $ ( n --> n*base ) BASE @ UM* >DIGIT KEEP ; \ ? - >DIGIT
\ : $ ( D -- Char ) @BASE UM* >DIGIT ; \ ? - >DIGIT ? - @BASE
\ : $ ( n -- ) _cell this-var @ variant! this-var @ _currency coerce-variant ?AUERROR ; \ ? - _cell
\ ------------------------------
chess писал(а):
На встроенном ассемблере очень просто реализуется с минимумом обращений к памяти
по поиску нашёл 14 (четырнацать) файлов.f с именем *asm*.f
какой подключать?
А можно сразу в кодах, как слово >IP реализовано?

какой день сегодня интересный, столько секса :-/
А язык Форт, конечно, самый-самый на планете. Блин... :)

_________________
Сотник. SotnikSTO@mail.ru


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: битовые накопительные массивы
СообщениеДобавлено: Чт фев 03, 2022 20:46 
Не в сети

Зарегистрирован: Пн янв 07, 2013 22:40
Сообщения: 2141
Благодарил (а): 8 раз.
Поблагодарили: 74 раз.
Sotnik писал(а):
какой день сегодня интересный, столько секса :-/
А язык Форт, конечно, самый-самый на планете. Блин... :)

Ну да, от пользователя к пользователю пеpедаётся знание при прямом контакте
или по пониманию умолчаний в представленном коде. :)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: битовые накопительные массивы
СообщениеДобавлено: Чт фев 03, 2022 21:05 
Не в сети
Аватара пользователя

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2168
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 41 раз.
Код:
HEX
: I4
[
8D C, 6D C, F4 C,                      \ LEA     EBP , F4 [EBP]
8B C, D0 C,                            \ MOV     EDX , EAX
81 C, E2 C, 00 C, 00 C, 00 C, FF C,    \ AND     EDX , # FF000000
C1 C, EA C, 18 C,                      \ SHR     EDX , 18
89 C, 55 C, 08 C,                      \ MOV     8 [EBP] , EDX
8B C, D0 C,                            \ MOV     EDX , EAX
81 C, E2 C, 00 C, 00 C, FF C, 00 C,    \ AND     EDX , # FF0000
C1 C, EA C, 10 C,                      \ SHR     EDX , 10
89 C, 55 C, 04 C,                      \ MOV     4 [EBP] , EDX
8B C, D0 C,                            \ MOV     EDX , EAX
81 C, E2 C, 00 C, FF C, 00 C, 00 C,    \ AND     EDX , # FF00
C1 C, EA C, 08 C,                      \ SHR     EDX , 8
89 C, 55 C, 00 C,                      \ MOV     0 [EBP] , EDX
81 C, E0 C, FF C, 00 C, 00 C, 00 C,    \ AND     EAX , # FF
]
;
: 4I
[
8B C, 55 C, 08 C,   \ MOV     EDX , 8 [EBP]
C1 C, E2 C, 18 C,   \ SHL     EDX , 18
0B C, C2 C,         \ OR      EAX , EDX
8B C, 55 C, 04 C,   \ MOV     EDX , 4 [EBP]
C1 C, E2 C, 10 C,   \ SHL     EDX , 10
0B C, C2 C,         \ OR      EAX , EDX
8B C, 55 C, 00 C,   \ MOV     EDX , 0 [EBP]
C1 C, E2 C, 08 C,   \ SHL     EDX , 8
0B C, C2 C,         \ OR      EAX , EDX
8D C, 6D C, 0C C,   \ LEA     EBP , C [EBP]
]
;

Можно и так тупо переписать. Но лучше немного времени посвятить ассемблеру.

_________________
С уважением, chess



За это сообщение автора chess поблагодарил: Sotnik
Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: битовые накопительные массивы
СообщениеДобавлено: Пт фев 04, 2022 00:38 
Не в сети

Зарегистрирован: Пн окт 05, 2009 18:21
Сообщения: 405
Откуда: Минск SotnikSTO@mail.ru
Благодарил (а): 48 раз.
Поблагодарили: 3 раз.
chess писал(а):
Но лучше немного времени посвятить ассемблеру.
Вспомнить надо. :)
Сейчас есть примеры.
Спасибо.

>> по поиску нашёл 14 (четырнацать) файлов.f с именем *asm*.f
>> какой подключать?
Что выбрать?

_________________
Сотник. SotnikSTO@mail.ru


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: битовые накопительные массивы
СообщениеДобавлено: Пт фев 04, 2022 11:14 
Не в сети
Аватара пользователя

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2168
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 41 раз.
Sotnik писал(а):
Что выбрать?

SPF4\lib\ext\spf-asm.f

_________________
С уважением, chess


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: битовые накопительные массивы
СообщениеДобавлено: Вс фев 06, 2022 18:03 
Не в сети
Аватара пользователя

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2168
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 41 раз.
Для преобразования кода слов, написанных на ассемблере(а ассемблер у каждого может быть свой), в текст, который поймет транслятор форт-системы, можно использовать что-то вроде этого:
Код:
: code->txt { xt }
  HEX
  ." : NAME" CR
  ." ["
  xt 200 aDO
             I xt - 8 MOD 0= IF CR THEN
             I C@ DUP 0xC3 <>
             IF   2 .0 ."  C, "
             ELSE DROP LEAVE
             THEN
         LOOP
  CR
  ." ]" CR
  ." ;" CR
;

Пример использования:
Код:
: I4 ( u32 -> a b c d )
$ -C Pa
D=A $ FF000000  D&# $ 18 #D>> $ 8 @P=D
D=A $ FF0000    D&# $ 10 #D>> $ 4 @P=D
D=A $ FF00      D&# $  8 #D>> $ 0 @P=D
    $ FF        A&#
;
' I4 code->txt

LOG
Код:
: NAME
[
8D C, 6D C, F4 C, 8B C, D0 C, 81 C, E2 C, 00 C,
00 C, 00 C, FF C, C1 C, EA C, 18 C, 89 C, 55 C,
08 C, 8B C, D0 C, 81 C, E2 C, 00 C, 00 C, FF C,
00 C, C1 C, EA C, 10 C, 89 C, 55 C, 04 C, 8B C,
D0 C, 81 C, E2 C, 00 C, FF C, 00 C, 00 C, C1 C,
EA C, 08 C, 89 C, 55 C, 00 C, 81 C, E0 C, FF C,
00 C, 00 C, 00 C,
]
;

NAME можно затем заменить на любое имя.

_________________
С уважением, chess


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 72 ]  На страницу 1, 2, 3, 4, 5  След.

Часовой пояс: UTC + 3 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
phpBB сборка от FladeX // Русская поддержка phpBB