Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Чт мар 28, 2024 20:33

...
Google Search
Forth-FAQ Spy Grafic

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




Ответить
Имя пользователя:
Заголовок:
Текст сообщения:
Введите текст вашего сообщения. Длина сообщения в символах не более: 60000

Размер шрифта:
Цвет шрифта
Настройки:
BBCode ВКЛЮЧЕН
[img] ВЫКЛЮЧЕН
[flash] ВЫКЛЮЧЕН
[url] ВКЛЮЧЕН
Смайлики ВЫКЛЮЧЕНЫ
Отключить в этом сообщении BBCode
Не преобразовывать адреса URL в ссылки
Вопрос
Теперь гостю придется вводить здесь пароль. Не от своей учетной записи, а ПАРОЛЬ ДЛЯ ГОСТЯ, получить который можно после регистрации на форуме через ЛС.:
Этот вопрос предназначен для выявления и предотвращения автоматических регистраций.
   

Обзор темы - Перекодирование файла для прошивки ПЗУ(случай из практики)
Автор Сообщение
  Заголовок сообщения:   Ответить с цитатой
WingLion писал(а):
Может, я туплю, но как этот адрес станет редким при 20 штуках адресов всего?
Чтобы ошибиться в таблицах, что у меня в решении, надо быть не только косоглазым, но и криворуким, чтобы не на те кнопки нажимать и не увидеть, что нажал не то.

Бывает и такое :))

Чернушный офтоптный стишок

- Шеф, помоги - гдЕ я ступил? -
так "ламер" "хакера" просил...
Никак не хочет код работать -
найти ошибку нету сил...

Лукаво хакер смотрит в код
(а дел своих невпроворот):

- Ошибку вижу я
пока ...
прости, лишь только - в ДНК
Сообщение Добавлено: Пн мар 22, 2010 17:52
  Заголовок сообщения:   Ответить с цитатой
\ Раз уж Форт позиционирует себя как язык для встраевыемых систем то - вообще то должна быть базовая библиотечка для работы с битами с числами разной длинны
\ нечто вроде GetBit( N i -- 0|1) SetBit (N 0/1 i --) SwapBit (N i1/i2 --) ещё чего?
\ потому что решая в лоб легко ошибиться - я ошибся раз 5 пока не отладил инициализацию массивов.

Код:
Create m 8 allot
: m@          ( i --0/1 )   m + c@ ;
: m!          ( 0/1 i-- )   m + c! ;
: razval_byte ( b --    )   8 0 DO 2 /Mod swap I m! LOOP drop ;
: .m          ( --      )   8 0 DO I m@ . LOOP ;
: sbor_Adr    ( -- b    )   0 m@ 2* 1 m@ + 2* 6 m@ + 2* 7 m@ + 2* 4 m@ + 2*  5 m@ + 2* 2 m@ + 2* 3 m@ + ;
: sbor_DAT    ( -- b    )   7 m@ 2* 6 m@ + 2* 2 m@ + 2* 3 m@ + 2* 4 m@ + 2*  5 m@ + 2* 6 m@ + 2* 7 m@ + ;


create Mass_ADR 32  allot
create Mass_DAT 256 allot

: init_ ADR ( --) 32  0 DO i razval_byte sbor_Adr 31 AND i  Mass_ADR + c! LOOP ; init_ ADR
: init_ DAT ( --) 256 0 DO i razval_byte sbor_DAT        i  Mass_DAT + c! LOOP ; init_ DAT

\ основные процедуры:
: GetAdr ( A--A)  dup 31 AND Mass_ADR + c@ swap 224 AND + ; \ меняем только младшие 5 бит  - экономим  224 байта
: GetDAT ( A--A)  Mass_DAT + c@ ;  / меняем всё 8 младших 8 бит - быстрее,
Сообщение Добавлено: Пн мар 22, 2010 12:44
  Заголовок сообщения:   Ответить с цитатой
Цитата:
Шина A0 у него пошла на вывод A4 ПЗУ, шина A1 на вывод A5,
шина D1 на вывод D6, шина D2 на вывод D7.


: rszbor ( b -- 1..2..3..4.....8..) 8 0 DO 2 /mod LOOP ;
: sborADR ( 1..2..3.....8..-- b) 2* + 2* + 2* + >R 3 Pick 2* + 2* + 2*+ R> 2* +
: sborDATA (1..2..3.....8..-- b) ... ... ...

реально бы наверное использовал для создания 2-х массивов для перекодировки младших 4-х бит адреса (16 ячеек) и байта данных (256 ячеек)
Сообщение Добавлено: Вс мар 21, 2010 19:20
  Заголовок сообщения:   Ответить с цитатой
Хищник писал(а):
Ошибиться в программировании вычисления маски существенно проще, поскольку результат не виден.

Тут надо уточнить, ошибиться в чем: в алгоритме или в кодировании алгоритма.
Форт средство интерактивное и позволит быстро протестировать и отладить простейшую функцию
переброса разрядов(у меня к примеру обмениваются только два разряда).

Вот вариант с классическими решающими таблицами:

Код:
16 CONSTANT NADDR \ разрядность адреса
8 CONSTANT NDATA \ разрядность данных

0 VALUE [Amix]    \ нач. адрес таблицы перепутывания адресов
0 VALUE [Dmix]    \ нач. адрес таблицы перепутывания данных

\ обмен пары разрядов
: SWAPB ( bitmask n  -- n')
  SWAP 2DUP AND OVER 1 SWAP WITHIN AND XOR ;

: LOAD-TABLES
  BASE @ >R 0x2 BASE !
  1 NADDR LSHIFT DUP DUP ALLOCATE THROW DUP TO [Amix] SWAP ERASE
  0
  DO
  \ FEDCBA9876543210
    0000000000010001  \ обмен шин A0 и A4 на выводах ПЗУ
    0000000000100010  \ обмен шин A1 и A5

    I SWAPB SWAPB [Amix] I + C!
  LOOP
  1 NDATA LSHIFT DUP DUP ALLOCATE THROW DUP TO [Dmix] SWAP ERASE
  0
  DO
  \ 76543210
    01000010  \ обмен шин D1 и D6 на выводах ПЗУ
    10000100  \ обмен шин D2 и D7

    I SWAPB SWAPB [Dmix] I + C!
  LOOP R> BASE ! ;

\ табличное преобразование адреса и данных
: Aperf ( A -- A') [Amix] + C@ ;
: Dperf ( D -- D') [Dmix] + C@ ;

Остальное типовая обертка

ПС. Из табличных вариантов решений - этот самый быстрый, но и требует соответствующего объема памяти.
Сообщение Добавлено: Ср мар 17, 2010 17:21
  Заголовок сообщения:   Ответить с цитатой
mOleg писал(а):
То есть такие ошибки наиболее тяжело отыскиваются в силу своей редкости и неожиданности.
Короче, если есть возможность не набирать таблицу, а вычислить ее, лучше вычислять особенно, если таблица большая.

То есть вычисление таблицы программируется проще, чем сама таблица? :shock: И что значит "большая таблица"? В ней число элементов равно числу разрядов. Кстати, проверка целостности данных делается очень просто - OR по всем элементам, и должно получиться число, у которого единицы во всех младших разрядах, а их число равно разрядности адреса/данных. Это будет гарантией того, что каждая маска упомянута в таблице по одному разу. Вот уж гарантия правильного размещения масок - извините, это "проверка на криворукость". Ошибиться в программировании вычисления маски существенно проще, поскольку результат не виден.
Сообщение Добавлено: Вт мар 16, 2010 23:24
  Заголовок сообщения:   Ответить с цитатой
mOleg писал(а):
страшнее случайностью проявления. Например, один какой-либо редкий код(адрес) может вообще не встречаться долгое время, а потом вдруг появиться.


Может, я туплю, но как этот адрес станет редким при 20 штуках адресов всего?
Чтобы ошибиться в таблицах, что у меня в решении, надо быть не только косоглазым, но и криворуким, чтобы не на те кнопки нажимать и не увидеть, что нажал не то.

mOleg писал(а):
Короче, если есть возможность не набирать таблицу, а вычислить ее, лучше вычислять Smile особенно, если таблица большая.

У меня она фактически вычисляется... каждый элемент таблицы - в момент использования
Сообщение Добавлено: Вт мар 16, 2010 19:41
  Заголовок сообщения:   Ответить с цитатой
WingLion писал(а):
и чем эти проблемы страшнее косоглазого тополога?

страшнее случайностью проявления. Например, один какой-либо редкий код(адрес) может вообще не встречаться долгое время, а потом вдруг появиться.
То есть такие ошибки наиболее тяжело отыскиваются в силу своей редкости и неожиданности.
Короче, если есть возможность не набирать таблицу, а вычислить ее, лучше вычислять :) особенно, если таблица большая.
Сообщение Добавлено: Вт мар 16, 2010 19:31
  Заголовок сообщения:   Ответить с цитатой
mOleg писал(а):
кстати да. Табличные решения могут давать непредсказуемые проблемы (достаточно не правильно один бит набрать...).

и чем эти проблемы страшнее косоглазого тополога?
Сообщение Добавлено: Вт мар 16, 2010 19:22
  Заголовок сообщения:   Ответить с цитатой
Хищник писал(а):
Однако эти решения годятся для произвольного количества перестановок, а не только для одного переставленного бита. К тому же сразу видо, что и куда пошло.

кстати да. Табличные решения могут давать непредсказуемые проблемы (достаточно не правильно один бит набрать...).

насчет обработки группы бит, это и я заметил, но решил без них.
Сообщение Добавлено: Вт мар 16, 2010 19:04
  Заголовок сообщения:   Ответить с цитатой
chess писал(а):
2. Быстродействие данных решений не в пользу табличных, так
как таблицы здесь не выдают результаты за одно обращение к ним,
а требуется пробежать по таблице.

Однако эти решения годятся для произвольного количества перестановок, а не только для одного переставленного бита. К тому же сразу видо, что и куда пошло.
Сообщение Добавлено: Пн мар 15, 2010 22:48
  Заголовок сообщения:   Ответить с цитатой
chess писал(а):
При криптовании больших массивов или при защите потоков данных по каналам связи методом "перепутывания"
более быстрые алгоритмы будут иметь преимущество.

Самый быстрый алгоритм - это "тополог с кривыми руками"... перепутает - мама не горюй - а расхлебывать ой-ой-ой...
Сообщение Добавлено: Пн мар 15, 2010 19:38
  Заголовок сообщения:   Ответить с цитатой
Некоторые заметки по решениям:
1. Решения от Winglion'a и Хищника близки по алгоритму и используют
на промежуточных этапах решающие таблицы.
Решение от mOlega и мое таблиц не используют.
2. Быстродействие данных решений не в пользу табличных, так
как таблицы здесь не выдают результаты за одно обращение к ним,
а требуется пробежать по таблице.
3. Обмен 2х разрядов в ячейке можно задать одним числом, с единицами в обмениваемых разрядах.
Например 0x42 -- разряд 2(нумеруем разряды начиная с 1-го, а не с 0-го) обмениваем с разрядом 7.
Код процедуры обмена будет и короче и быстрее:
Код:
: SWAPB ( n bitmask -- n')
2DUP AND OVER 1 SWAP WITHIN AND XOR ;
на ассме это делается еще короче и быстрее
Код:
: swapb ( n bitmask -- n')
D=@P D&A C=A D-A Ac-A A&C XOR ;


При криптовании больших массивов или при защите потоков данных по каналам связи методом "перепутывания"
более быстрые алгоритмы будут иметь преимущество.
Сообщение Добавлено: Пн мар 15, 2010 10:58
  Заголовок сообщения:   Ответить с цитатой
мое решение для форка
<pre>
branch/ for-next.fts
math/ asmadd.fts

\ тут можно использовать табличный метод (будет быстрее), однако решение
\ зависит от разрядности данных, таблица для 32 битных данных уже слишком велика
: >DATA> ( u --> u )
DUP >L 0x39 AND \ неизмененные битики не трогаем
2 L@ AND 5 LSHIFT OR \ D1>D6
4 L@ AND 5 LSHIFT OR \ D2>D7
\ так как не указано, куда пошли D6 и D7 считаем, что был обмен пар
0x40 L@ AND 5 RSHIFT OR
0x80 L> AND 5 RSHIFT OR
;

\ преобразование порядка бит
: trans-data ( addr # --> addr # ) FOR DUP B@ >DATA> OVER B! 1 + TILL DROP ;

\ преобразование адреса
: >ADDR> ( addr --> addr )
DUP A>L 0x33 AND
1 AL@ AND 4 LSHIFT OR
2 AL@ AND 4 LSHIFT OR
\ так же считаем, что был обмен битов
0x10 AL@ AND 4 RSHIFT OR
0x20 AL> AND 4 RSHIFT OR
;

\ перемещение данных с учетом перепутывания адресов
: exch ( base addr --> )
DUP 0x33 AND IFNOT DDROP ;THEN \ если переставлять нечего
\ --> base addr
DDUP + DUP A>L B@ >L \ исходное значение и адрес сохраняем в локальном стеке
>ADDR> + DUP B@ L> ROT B! AL> B! ;

\ преобразование порядка байт
\ считаем, что образ начинается с нулевого байта
: trans-addr ( addr # --> addr # ) FOR DUP R@ exch TILL DROP ;

\ сохранить содержимое буфера в файл
: >FILE ( addr # asc # --> ior )
W/O OPEN-FILE *IF NIP NIP NIP ;THEN DROP
DUP >L WRITE-FILE
L> CLOSE-FILE DROP ;

\ преобразовать согласно ТЗ исходный файл с именем, определенным строкой asc #
: perform ( asc # --> )
DDUP FILE>HEAP 0 = ABORT" Не могу открыть исходный файл!"
DDUP trans-data
DDUP trans-addr
DSWAP >FILE ABORT" Не могу сохранить данные в файл!" ;
</pre>
Сообщение Добавлено: Сб мар 13, 2010 21:14
  Заголовок сообщения:   Ответить с цитатой
Код:
CREATE BMASK[] 1 C, 2 C, 4 C, 8 C, 16 C, 32 C, 64 C, 128 C,
CREATE NEWMASK[] 1 C, 64 C, 128 C, 8 C, 16 C, 32 C, 2 C, 4 C,  \ 2 на 7, 1 на 6

: SWAPBITS \ X -- Y
  0
  8 0 DO
    OVER I BMASK[] + C@ AND
    IF I NEWMASK[] + C@ OR THEN
  LOOP
  NIP
;

Это как переставлять биты. Таблицы все равно работают, и руками набирать ничего не надо, все можно сгенерировать.
Сообщение Добавлено: Сб мар 13, 2010 14:56
  Заголовок сообщения:   Ответить с цитатой
Таблица для перепутывания данных фактически пуста, так как в ТЗ есть неувязка в этом вопросе.
(данные не перепутаны, но перекодировка формально сделана, надо только заполнить данные для перепутывания)
С точки зрения перепутывания адресов и данных решение пригодно
для любых комбинаций перепутывания при заполнении полей соответствий битов.

Код:
\ "Решение" задачи из http://fforum.winglion.ru/viewtopic.php?t=2512
\ Автор: WingLion admin@winglion.ru
\ предупреждаю сразу - непроверено (не на чем проверять) - здесь только голая идея (для 32-хразрядного форта)

CREATE АTAB \ таблица соответствия адресов
\ маска адреса в разводке : соответствующая маска адреса в исходной прошивке ПЗУ
0x0002 , 0x0010 , \ элемент перепутанного адреса А1 -> А4
0x0010 , 0x0020 , \ элемент перепутанного адреса А4 -> А5
0x0020 , 0x0002 , \ элемент перепутанного адреса А5 -> А1

0x0001 , 0x0001 , \ элемент неперепутанного адреса A0 -> A0
0x0004 , 0x0004 , \ элемент неперепутанного адреса A2 -> A2
0x0008 , 0x0008 , \ элемент неперепутанного адреса A3 -> A3

0x0040 , 0x0040 , \ элемент неперепутанного адреса A6 -> A6
0x0080 , 0x0080 , \ элемент неперепутанного адреса A7 -> A7
0x0100 , 0x0100 , \ элемент неперепутанного адреса A8 -> A8

0x0200 , 0x0200 , \ элемент неперепутанного адреса A8 -> A9
0x0400 , 0x0400 , \ элемент неперепутанного адреса A8 -> A10
0x0800 , 0x0800 , \ элемент неперепутанного адреса A8 -> A11

\ таблица может быть и большего размера хоть 20 адресов для ПЗУ мегабайтного объема
\ важно! исходные биты адреса, как и результирующие в таблице должны быть все!

12 CONSTANT ATAB-SIZE \ константа фактически равна разрядности адреса ПЗУ
4096 ROM-SIZE \ размер ПЗУ равен 2 в степени ATAB-SIZE - ПЗУ-шек произвольного размера не бывает!

CREATE DTAB \ таблица соответствия данных
\ маска бита данных в разводке : соответствующая маска бита данных в исходной прошивке ПЗУ
0x0001 , 0x0001 , \ элемент неперепутанных данных D0 -> D0
0x0002 , 0x0002 , \ элемент неперепутанных данных D1 -> D1
0x0004 , 0x0004 , \ элемент неперепутанных данных D2 -> D2
0x0008 , 0x0008 , \ элемент неперепутанных данных D3 -> D3

0x0010 , 0x0010 , \ элемент неперепутанных данных D4 -> D4
0x0020 , 0x0020 , \ элемент неперепутанных данных D5 -> D5
0x0040 , 0x0040 , \ элемент неперепутанных данных D6 -> D6
0x0080 , 0x0080 , \ элемент неперепутанных данных D7 -> D7

\ таблица может быть и большего размера например 16 шин данных для 16-рзрядного ПЗУ
\ важно! исходные биты данных, как и результирующие в таблице должны быть все!

8 CONSTANT DTAB-SIZE \ константа фактически равна разрядности данных ПЗУ

: АTAB[] 8 * АTAB + ; \ адрес записи в таблице шин адресов
: DTAB[] 8 * DTAB + ; \ адрес записи в таблице шин даных

: DECODE-A ( ADR --> ADR')
0 \ начальное значение ADR'
ATAB-SIZE 0 DO
OVER \ достать ADR
I АTAB[] @ AND \ выделить бит адреса который надо переставлять
IF \ если бит установлен,
I АTAB[] 4 + @ OR \ установить в ADR' соответствующий бит (по таблице)
THEN \ если бит не установлен - ничего не делать
LOOP \ перейти к обработке следующего элемента таблицы
DROP \ удалить исходный ADR, оставив на стеке теолько ADR'
; \закончить определение

: DECODE-D ( DATA --> DATA')
0 \ начальное значение DATA'
DTAB-SIZE 0 DO
OVER \ достать ADR
I DTAB[] @ AND \ выделить бит адреса который надо переставлять
IF \ если бит установлен,
I DTAB[] 4 + @ OR \ установить в ADR' соответствующий бит (по таблице)
THEN \ если бит не установлен - ничего не делать
LOOP \ перейти к обработке следующего элемента таблицы
DROP \ удалить исходный ADR, оставив на стеке теолько ADR'
; \закончить определение

CREATE PLACE4RESULT ROM-SIZE ALLOT

: FULL-DECODE (adr u --> adr' u' ) \ массив декодируется в новое место
ROM-SIZE = IF ABORT" Длина массива данных не равна размеру ПЗУ. Работа не выполнена." THEN
\ на вершине стека адрес перекодируемого массива
ROM-SIZE 0 DO
DUP I DECODE-A
\ тут можно проверять на невыход за пределы массива и занулять данные, если адрес больше
+ \ адрес в исходном массиве
B@ \ получить байт
DECODE-D \ перекодировать
I PLACE4RESULT + \ адрес в результирующем массиве
B! \ записать результат
LOOP
PLACE4RESULT ROM-SIZE \ выдать результат
\ длина на выходе равна объему ПЗУ, но не входной длине!
;

Сообщение Добавлено: Сб мар 13, 2010 14:09

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


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