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

...
Google Search
Forth-FAQ Spy Grafic

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




Начать новую тему Ответить на тему  [ Сообщений: 11 ] 
Автор Сообщение
 Заголовок сообщения: префиксный Форт-ассемблер для процессорного ядра AVR32
СообщениеДобавлено: Ср дек 06, 2006 09:48 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Ср дек 06, 2006 09:23
Сообщения: 660
Благодарил (а): 7 раз.
Поблагодарили: 25 раз.
Автор: diver
Дата публикации: Дек 06, 2006 на данном форуме.

Форт-ассемблер для процессоров на базе ядра AVR32

Приводится описание кросс компилятора языка ассемблера для микропроцессорного ядра фирмы Atmel – AVR32, реализованного на языке Форт. Кратко описаны особенности языка ассемблера и структуры программных кодов процессорного ядра. Представлены варианты решений компилятора, рассмотрена реализация групп команд по способу компиляции кода и отдельных команд, не входящих в подобные группы.

Введение
Рынок современных контроллеров представлен широким спектром 4-8-16-32-х разрядных решений многих фирм производителей. Как правило, большинство контроллеров имеют солидную поддержку программным обеспечением как то фирм производителей, поставляющих ассемблеры для своих изделий, так целого ряда фирм, специализирующихся на компиляторах языков среднего и высокого уровня (IAR systems, Sun Microsystems, Forth Inc.[1-3]), представляющих на рынке компиляторы языков C/C++, Java, Forth, для встраиваемых систем. Эта тенденция не обходит стороной и проекты с открытыми исходными кодами (Open Source Projects)[4].
Несмотря на достаточно недавнее появление на рынке процессорного ядра AVR32 и микроконтроллеров на его основе, многие компании уже предлагают для него соответствующие компиляторы, в частности языка С/С++. Ядро AVR32 обладает достаточной производительностью и объемом адресного пространства для поддержания достаточно серьезных операционных систем.
Основные языки для написания программ и операционных систем для встраиваемых систем на сегодняшний день – C, Java и ассемблер. Причем ассемблер используется для написания критичных по времени приложений, функций, либо простейших операционных сред. В этом ключе несколько обделены вниманием форт-системы, появившиеся в конце 70-х начале 90-х годов прошлого века [6]. Форт-системы изначально сочетали в себе функции компилятора, интерпретатора, среды разработки и операционной системы. Из-за своей специфики форт-системы сегодня являются узкоспециализированными эффективными системами.
Целью данной работы является реализация языка ассемблера процессорного ядра AVR32 для использования при целевой компиляции программ и в качестве основы для написания ядра виртуальной форт машины (FVM). Форт ассемблер реализован при помощи компилятора SP-Forth 4.07 [5].

Особенности архитектуры AVR32
Хотя AVR23 заявлен Atmel как процессор с RISC архитектурой набор его команд имеет довольно длинный список в 180 команд, включая поддержку DSP,языка Java, взаимодействие с математическим сопроцессором [7]. Команды процессора могут содержать до 4-х операндов, и до 5-ти операндов содержат команды работы с сопроцессором. Команды работы с памятью содержат 2 – 4 операнда, при этом одной мнемонике может соответствовать до 5-ти вариантов кода и, соответственно комбинаций кода, одним из примеров является команда загрузки слова в память:
Код:
  ld.w Rd, Rp++
  ld.w Rd, --Rp
  ld.w Rd, Rp[disp4]
  ld.w Rd, Rp[disp16]
  ld.w Rd, Rp[Ri<<sa]
  ld.w Rd, Rp[Ri:half<<2].

Следует отметить, что Atmel , по-видимому, были приложены значительные усилия по достижению компактного бинарного кода. Количество видов кодировки инструкций и операндов, по документации, равно 58. Из них 18 видов (~32%) являются 16-ти битными. Оборотной стороной этого является повышенная нагрузка на компилятор, который должен корректно обрабатывать многочисленные варианты кодировок инструкций. В частности, затруднена работа с константами и непосредственными численными значениями: часто число при этом “рассеяно” по двум или четырем байтам кода [7]. Регистры процессора представлены 13-ю регистрами общего назначения, указателем стека, программным счетчиком, регистром связи, регистром статуса и набором из 71-го системного регистра, отраженных в адресное пространство процессора.

Форт-ассемблер
Как отмечено в [8-10], Форт является простейшим языком для написания ассемблера. Любая Форт-система имеет текстовый интерпретатор для разбора текстовых строк и выполнения соответствующих команд. А основной задачей ассемблера является преобразование текстовых строк в байты кода. Операнды и режимы адресации также реализуются через слова Форта.
Язык также включает определяющие слова, которые позволяют легко описать большие наборы слов с общим действием. Эта возможность очень полезна при определении мнемоник ассемблера. При работе ассемблера доступны все слова Форта, и они могут быть использованы при использовании ассемблера не только для вычисления адресов и операндов, но и для выполнения более сложных действий.

Реализация Форт-ассемблера avr32fasm
Avr32fasm состоит из двух словарей. Словарь avr32-cross, содержит слова для работы с памятью целевой системы, выделения и разбора операндов, сборки и компиляции процессорных команд в выделенную область памяти инструментальной системы. Слова из avr32-cross используют базовый словарь Форт системы – FORTH.
Словарь avr32-asm содержит слова, определяющие аппаратные ресурсы целевого процессора, коды условий переходов и реализации самих команд ядра AVR32.
Avr32-asm при компиляции новых определений использует слова двух словарей avr32-cross и FORTH.
Изначальная ориентация avr32fasm на интеграцию в Форт систему позволяет исползовать набор ранее определенных меток и ссылок на них (аналогично словам @@1:, @@1 в реализации ассемблера для x86/Pentium [11]), так называемые локальные метки, действующие внутри слов. Данное решение позволяет применять однопроходовую технологию, характерную для большинства Форт-систем. При способе упаковки кода, примененного в AVR32, это упрощает компиляцию меток внутри слов и вызовов слов непосредственно из ассемблерных определений.

Словарь avr32-cross
Словарь avr32-cross состоит из слов, необходимых для компиляции ассемблерных инструкций в область памяти, отведенную под целевой код. Начало целевой памяти находится в value-переменной THERE0, переменная THERE содержит текущее значение. Слово TW, компилирует слово в целевое пространство:
Код:
: TW, ( x -- )    THERE W! THERE 2 + TO THERE ;
.
Поскольку ассемблер префиксный, в задачи слова, компилирующего инструкцию, входит разбор строки операндов, сборка кода инструкции и компиляция его в целевое пространство. Синтаксис, реализованный в avr32fasm, близок к синтаксису ассемблера AVR32, за исключением зависимости от регистра и строгой необходимости разделять пробелами команду и операнды, а так же сами операнды между собой:
Код:
инструкция операнд_1,  операнд_2, … операнд_N .

Для разбора части строки, следующей за инструкцией, используются слова Форта для интерпретации входного потока. Операнды при этом являются словами ассемблерного словаря и при исполнении оставляют свой код на стеке, например:
Код:
: next-reg:half  ( 1|0 -- Rd :x )   \ разделяет операнд вида: 'Rd:x,' и 'Rd:x'
  NextWord ROT -   \ x -- addr n-x \ 'Rd:t'
  2DUP 2 - SFIND IF EXECUTE ELSE 2DROP ABORT THEN \ -- addr n Rd
    -ROT + 2- 2
    SFIND IF EXECUTE ELSE 2DROP ABORT THEN   \ -- Rd :x
;

Для ассемблерных инструкций с несколькими наборами операндов, таких как группы команд обмена с памятью ld и st, применяется рекурсивный алгоритм разбора строки операндов.
Код:
: l/s-operand ( addr n -- x[...] type )
  reg++ IF 4 EXIT THEN
  --reg IF 5 EXIT THEN
  0x5B str !      \ ищем [
  2DUP      \ -- addr n addr n
  str 1  SEARCH    \ addr n addr[ n2 io
    IF         \ --  addr n addr[ n2
      DUP >R  2SWAP R> - take-op -ROT    \ -- Rp addr[ n2   ,-взяли Rp
      SWAP 1+ SWAP 2-         \ -- Rp addr2 n2    ,убрали [ из строки
       10 n +! RECURSE         \ n=1
    ELSE  2DROP   THEN
  0x3C3C str !       \ ищем <<
  2DUP str 2      \ -- addr2 n2 addr2 n2
   SEARCH       \ -- addr2 n2 addr<< n3 io
   IF          \ -- addr2 n2 addr<< n3
     2DUP 2>R    NIP -       \ addr2 n2-n3
       2DUP S" :" SEARCH NIP NIP   \ addr2 n2-n3 :half?
   IF             \ часть регистра
      reg:half-str 4 LSHIFT OR   \ -- Ri :half \ -- :halfRi
     2 n +!
   ELSE            \ целый регистр и sa
     take-op       \ -- Ri addr<< n3    ,-взяли Ri
   THEN
     2R> 2 - SWAP 2+ SWAP   \ -- Ri addrSA n4    , осталась строка в фомате str
       2 n +! RECURSE   \ n=2
   ELSE  2DROP  THEN   \ -- addrSA n4
        take-op                      \ при операндах типа [Rp] - неопределенная ситуация
   DUP 7 > IF -1 n +! THEN     
    n 1+!   \ -- disp|sa   
    n @    0 n !      
   LEAVE                       
;                               

Слово l/s-operand определяет операнды видов: Rp++, --Rp, Rp[disp4], Rp[disp16], Rp[Ri<<sa], Rp, Rp[Ri:x<<sa] . Оставляет на стеке коды составляющих операнда и число, идентифицирующее его тип.
В отдельную группу можно выделить слова, компилирующие коды операций и операндов в область целевой памяти, осуществляющие сборку кодов ассемблерных инструкций. Реализации этих слов различаются только из-за специфики формирования кода каждого из типов инструкций, примеры компилирующих слов:
Код:
: dsp-halfword ( Rd Rx :x Ry :y opcode -- )
  4 LSHIFT SWAP 4 LSHIFT OR   \ -- Rd Rx :x Ry opcode_0:y00
  2 ROLL 5 LSHIFT OR      \ -- Rd Rx Ry opcode:x:y00
  3 ROLL OR TW,                       \  opcode:x:yRd -- Rx Ry
  0xE000 OR SWAP 9 LSHIFT OR TW,  ;

По способу компиляции кода инструкции были выделены в тридцать пять групп. В пределах группы ассемблерные инструкции имеют один формат. Для компиляции кода инструкций определены специальные слова, созданные на основе конструкции CREATE DOES>:
Код:
: halfword-arith-instr   \ using op1 halfword-arith-instr instr-name
         \  syntax:  addhh.w Rd, Rx:x, Ry:y
  CREATE , CELL ALLOT
  DOES> @ >R   1 next-reg 1 next-reg:half 0 next-reg:half \ -- Rd Rx :x Ry :y
    R> dsp-halfword  ; 

и др.
Определяющие слова используют один или несколько кодов инструкций и вызывают необходимые для каждого типа ассемблерных команд слова выборки операндов. В словаре avr32-asm эти слова применяются при создании ассемблерных инструкций форт-ассемблера.

Словарь avr32-asm
Словарь avr32-asm содержит коды операндов, условий перехода и ключи модификации операндов. В данный словарь включены инструкции, компилированные при помощи определяющих слов из avr32-cross, а также инструкции в силу специфики своего кода, не вошедшие в группы и определенные через двоеточие.
Регистры файл-регистра процессора и системные регистры, отраженные в адресное пространство определены в словаре, как обыкновенные константы (при помощи слова CONSTANT). Аналогичным образом определены и условия перехода.
Большинство инструкций ассемблера компилируются с помощью определяющих слов из словаря avr32-cross:
Код:
0xA100 0x0002 0xE0E0 0x0000 0xA110 0xA101 load-instr ld.d
\ syntax: ld.d Rd, Rp++         
\ syntax: ld.d Rd, --Rp         
\ syntax: ld.d Rd, Rp[disp4]   
\ syntax: ld.d Rd, Rp[disp16]   
\ syntax: ld.d Rd, Rp[Ri<<sa]   
\ syntax: ld.d Rd, Rp[Ri:half<<2] 
.
Двадцать три команды, образующие “группы” из одной команды, определены через двоеточие, к примеру, инструкции работы с кэш памятью, сопроцессором, поддержки языка Java и некоторые арифметические операции:
Код:
: cop      \ syntax: cop CP#, CRd, CRx, CRy, Op
  1 next-op 1 next-reg 1 next-reg 1 next-reg 0 next-op    \ -- CP#, CRd, CRx, CRy, Op
  DUP 2/ >R            \ сохранили Ор на будущее
  0x1 AND 12 LSHIFT >R      \ -- CP#, CRd, CRx, CRy ; r: -- op op'
  SWAP 4 LSHIFT OR SWAP 8 LSHIFT OR SWAP 13 LSHIFT OR
\ собрали операнды
\ -- CP#0CRdCRxCRy r: -- op op'
  R> OR TW,
  R> DUP 0xF AND SWAP 0x30 AND 5 LSHIFT OR   \ -- op''
  0xE1A0 OR TW, ;

Выводы и результаты
Словарь кросс ассемблера содержит порядка 335 слов, включая инструкции и регистры процессорного ядра. Общий размер скомпилированного кода форт-ассемблера asm32fasm составляет 25697 байт. Представленный форт-ассемблер avr32fasm предоставляет программисту максимально близкий синтаксис к обычному ассемблеру при сохранении функциональности языка Форт, и представляет собой однопроходной префиксный ассемблер без оптимизации кода. Текущая версия компилируется системой SP-Forth 4.007 [5].

Литература
1. IAR systems./ http://www.iar.com
2. Sun Microsystems. / http://www.sun.com
3. Forth Inc. / http://www.forth.com
4. Open Source Projects / http://www.sourceforge.net
5. SP-FORTH - ANS FORTH 94 for Win95/98/ME/NT/2000/XP Open source project / http://spf.sf.net
6. Дьяконов В.Н. Форт-системы программирования персональных ЭВМ. – М.:Наука. Гл. ред. физ.-мат. лит., 1992 – 352с.
7. AVR32 Architecture Document, Atmel Corporation 2006 / http://www.atmel.com/literature
8. С.Н. Баранов, Н.Р. Ноздрунов Язык Форт и его реализации. Лениград. Машиностроение, Ленинградское отделение,1988.
9. Leo Brodie Thinking FORTH A Language and Philosophy for Solving Problems Englewood Cliffs, N.J., Prentice-Hall, Inc., 1984
10. Brad Rodriguez Build Your Own (Cross-) Assembler....in Forth / ftp://ftp.forth.org/pub/Forth.
11. 486 and Pentium assembler for Windows 32bit Forth, version 1.26 1994, 1995, by Jim Schneider / ftp://ftp.netcom.com/pub/ja/japs/486asm.zip


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Ср дек 06, 2006 18:08 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7960
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
Очень интересно! А это в бумажных изданиях где-нибудь публиковалось, или планируется?


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт дек 07, 2006 09:06 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Ср дек 06, 2006 09:23
Сообщения: 660
Благодарил (а): 7 раз.
Поблагодарили: 25 раз.
Хищник писал(а):
Очень интересно! А это в бумажных изданиях где-нибудь публиковалось, или планируется?

Послал в "Академический журнал западной сибири" (вариант практически этот же). Если получится, выложу исхоники но sourceforge.net. Единственно пока работает в диалоговом режиме и целевой код собирает в памяти, далее в ручную :). Тестов тоже пока не проводил, времени маловато, да и "железа" нет.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт дек 07, 2006 18:54 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7960
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
Интерфейс - второстепенный вопрос. Главное, что выбрана концепция транслятора и продукта вообще. Характеристики, режим работы - вопросы инженерной доработки. Важно, что проведена работа с префиксным синтаксисом.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пт дек 08, 2006 10:51 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Ср дек 06, 2006 09:23
Сообщения: 660
Благодарил (а): 7 раз.
Поблагодарили: 25 раз.
Исходные тексты доступны на http://www.forth.org.ru/~diver/avr32fasm


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пт май 04, 2007 01:45 
Не в сети

Зарегистрирован: Пт май 04, 2007 01:29
Сообщения: 1
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
2 diver
Интересный материал. Я как раз занимаюсь освоением данного процессора. Открыл специально для этих целей одноимённый ресурс в зоне ру. 8) http://www.avr32.ru/f2/viewforum.php?f=7
В ближайшее время буду располагать железом и постараюсь попробовать Форт-ассемблер. :roll:


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пт май 04, 2007 06:27 
Пока похоже на рекламу. :(


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пт май 04, 2007 10:26 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Ср дек 06, 2006 09:23
Сообщения: 660
Благодарил (а): 7 раз.
Поблагодарили: 25 раз.
AVR32 писал(а):
В ближайшее время буду располагать железом и постараюсь попробовать Форт-ассемблер.


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


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

Зарегистрирован: Ср дек 06, 2006 09:23
Сообщения: 660
Благодарил (а): 7 раз.
Поблагодарили: 25 раз.
После долгого перерыва вернулся к данной теме. Текущая версия компилятора доступна для тестирования по запросу на электронку или в личное сообщение (пока windows версия), пока не разберусь с нашей проксей и не доберусь до своих страничек на forth.org.ru
По сравнению с предыдущей версией - исправлены баги с компиляцией кода (была проблемка с big-endian форматом, исправлены некоторые слова генерации кода команд ), добавлена поддержка компиляции переходов (переходы разделены на два класса - близкие и дальние (у них разный формат команд)), добавлена работа с метками, появилась возможность сохранять бинарный код, регистрам можно присваивать любые имена, выравнивать код по произвольному адресу в целевом пространстве, доступно создание макроопределений.
Немного о технических решениях.
Слова, отвечающие за регистры процессора вынесены в отдельный словарь avr32-regs. При помощи слова reg: , есть возможность задавать кодам регистров пользовательские обозначения.
Код:
: reg:
GET-CURRENT \ -- x wid
SWAP ALSO avr32-regs DEFINITIONS
CREATE ,  PREVIOUS SET-CURRENT
DOES> @
;

Пример - регистру r13 присваивается имя sp (r13 в словаре avr32-regs определён как константа со значением 13):
Код:
r13 reg: sp.
При выполнени слова sp на стеке останется опкод регистра r13.
Соответсвенно были изменены слова, ответственные за различение в строке ассемблерной команды чисел и регистров (определение типа операндов) - проводится поиск по словарю регистров.Если слово не найдено, пытаемся истолковать его как число или адрес.
Код:
: parse-reg-or-sa? ( addr n -- Rs|sa 1|0 )
  2DUP
      2DUP + 1- C@  44 = \ .S CR
          IF \ ." \ если запятая присутсвует" CR
             1-
          THEN
  reglist SEARCH-WORDLIST \ ищем по списку регистров -- addr n 0 | xt 1/-1
  IF  \ -- addr n xt
    NIP NIP EXECUTE 1
  ELSE \ addr n
    NOTFOUND 0
  THEN
;
: reg-or-sa?   (  -- Rs|sa 1|0 )
  NextWord
  parse-reg-or-sa?
;


Компилятор реализует традиционную для форт-систем однопроходную технологию. По причине того, что заранее неизвестно насколько длинным будет переход, и длина опкодов различна, контроль за типом переходов ложится на программиста. Для работы с произвольным числом меток были определены специальные слова, создающие в словаре имена меток и позволяющие компилировать ближние и дальние переходы. Слова разделены на слова, ставящие метки в программе n: l: и слова позволяющие создать переход на метки n@, l@ (соответственно ближние и дальние переходы).
Механизмы работы слов подобны. Рассмотрим два случая применения меток и переходов:
Код:
пример1:
n: label mov s0, s1
        ld.w s1, sp++
   cp s0, s1
   br eq, n@ label

пример2:
         cp s0, s1
    br eq, n@ label
n: label add s0, s1
         ld.w s1, sp++;
соответственно с меткой в известном положении и с меткой определенной после её вызова.
Слова n: и l: создают слова-метки, на которые впоследствии можно будет перейти. Их синтаксис:
n: метка,
l: метка
Определяющее слово n: (l:) ищет в словаре метку с указанным именем, если не находит (пример1 - переход будет осуществлен позже, возврат по ходу программы) - создает слово-метку, которое при создании запоминает текущее значение адреса целевого пространства, а при исполнении возвращает. Если указанная метка есть - т.е. уже создана по n@ (пример2 - переход по метке вперед) вызывает слово-метку на исполнение. На стеке остается адрес целевого пространства, куда надо вписать относительный адрес перехода, вычисляется относительный адрес, который прописывается в заранее подготовленное место словом (brn).
Код:
: n:   \  ." call n: "
  NextWord 2DUP SFIND \ -- addr n io
  IF \ ." found "   \ -- addr n xt  \ если слово найдено
    NIP NIP EXECUTE
    THERE OVER - 2/ \ -- куда-поместить смещение
    0 \ -- куда-поместить смещение 0
    -ROT
    (brn) \ прописываем смещение перехода
  ELSE \ ." not_found " 
    CREATED THERE , 2DROP
    DOES> @
  THEN
;

Слова n@, l@ создают "вызывающую" метку, располагается в месте программы откуда осуществлятся переход. Слово ищет метку с данным именем в словаре если находит - исполняет, получает адрес перехода, вычисляет относительный адрес, компилирует переход - пример1. Если имя не найдено - запоминает адрес в целевом пространстве, по которому необходимо править метку и который вернется по исполнению слова (пример2) прописывает 0-е смещение в опкод команды в качестве адреса перехода .
Код:
: n@ \  ." call n@ "
  NextWord 2DUP SFIND \  \ -- addr n io
  IF \ ." found "  \ если слово найдено \ пример1 "
    NIP NIP EXECUTE  \ -- абсолютный адрес перехода в целевом пространстве
    THERE  - 2/ \  смещение
    THERE SWAP  \ -- cond addr disp
    (brn) \ прописываем смещение перехода
    THERE 2 + TO THERE  \  ." (brn)"
  ELSE 2DROP \  not_found
    CREATED THERE ,  \ cond addr disp
    THERE 0 (brn) THERE 2 + TO THERE
    DOES> @
  THEN
;
Слово (brn) собственно выполняет всю техническую работу по вклеиванию кода перехода в уже готовый код, берёт со стека условие перехода; адрес памяти целевого пространства, куда прописать опкод; смещение перехода, подготавливает опкод программы. Аналогично организована работа с «длинными» переходами, слово, компилирующее адрес длинного перехода - (brl).
Ассемблерная команда перехода (слово-мнемоника перехода) опрделяется как:
Код:
: br \ syntax: br cond3 n@ (или l@) disp8 (disp21)
  0 next-op 0 next-op
;

Фактически, br - просто выбирает два последовательных операнда, запуская их на выполнение.
Слова equ является просто синонимам форт-слова: CONSTANT (базовый словарь FORTH).
Слово org переносит указатель целевого пространства на указанную позицию:
Код:
: org ( -- )   \ syntax: org смещение
\  переносит указатель целевого пространства на указанную позицию:
0 next-op
  THERE0 + TO THERE
;
Слово macro: создает именованный блок кода в специально отведенной области памяти. При исполнении макроса соответсвующий блок вставляется в исполнимый код в целевом пространстве.
Код:
0 VALUE TMACRO0
0 VALUE TMACRO
0 VALUE MACRO_BEGIN
: macro: ( -- here )
  CREATE TMACRO DUP TO MACRO_BEGIN , HERE 0 ,
\ меняем на время местами области маросов и целевую
  TMACRO0 THERE0 TO TMACRO0 TO THERE0
  TMACRO  THERE TO TMACRO TO THERE
  DOES> 2@ SWAP 2DUP \ -- macro n
  THERE SWAP .S CR
  CMOVE
  NIP THERE + TO THERE
;
: endmacro; ( here -- )
\ меняем обратно местами области маросов и целевую
TMACRO0 THERE0 TO TMACRO0 TO THERE0
TMACRO  THERE TO TMACRO TO THERE
TMACRO MACRO_BEGIN - SWAP ! \ вычислили и запомнили длину макроопределения
;

пример:
Код:
org 0x10
macro: asr_test
  asr r0, r1, r2    \ V shift-instr
  asr r0, 5   \ V
  asr r0, r1, 3   \ V
end_macro;
org 0x100
  asr_test
  abs r0
......


В ближайших планах - сохранение программ в виде elf(в основном atmel ориентирует применение проца под Linux - тестовые и оценочные платки поставляются с предустановленным линухом) и hex файлов.


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

Зарегистрирован: Чт май 04, 2006 18:18
Сообщения: 456
Благодарил (а): 0 раз.
Поблагодарили: 1 раз.
diver писал(а):
о причине того, что заранее неизвестно насколько длинным будет переход, и длина опкодов различна, контроль за типом переходов ложится на программиста.

Можно было бы ошибки кидать в таком случае. Т.е. n: в дополнение к адресу запоминает тег "короткий переход", а n@ проверяет соответствие этого тега, аналогично для l: l@.

_________________
http://forth.org.ru/~ygrek


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пт ноя 28, 2008 07:58 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Ср дек 06, 2006 09:23
Сообщения: 660
Благодарил (а): 7 раз.
Поблагодарили: 25 раз.
последняя версия доступна на:
http://downloads.sourceforge.net/avr32fasm/avr32fasm_v1_22.rar


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 11 ] 

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


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

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


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

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