Бонус-конкурс 1 - послесловие

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

  1. ‹ аs-прога› ::= ‹ аs-строка› {‹ nl› ‹ аs-строка›}
  2. ‹ аs-строка› ::= [‹ метка›:‹ отступ›] ‹ аs-предл› [ ‹ коммент› ] | ‹ коммент›
  3. ‹ коммент› ::= //{‹ знак›}
  4. ‹ метка›::= ‹ идр›
  5. ‹ аs-предл›::= ‹ оператор› | ‹ директива›
  6. ‹ оператор›::= ‹ оп-f0› | ‹ оп-f1›
  7. ‹ оп-f0›::= ‹ коп-f0›
  8. ‹ коп-f0›::=IN | OUT | HALT
  9. ‹ оп-f1›::= ‹ коп-f1› ‹ пробел› ‹ отступ› ‹ адресное_выр›
  10. ‹ отступ›::= { ‹ пробел› }
  11. ‹ коп-f1›::= ADD | SUB | ...
  12. ‹ адресное_выр› ::= ‹ метка› | ‹ метка› + ‹ цбз› | ‹ метка› - ‹ цбз› | ‹ цбз›
  13. ‹ директива›::= ‹ дир_выделен_памяти› | ‹ дир_назнач_старт_адр›
  14. ‹ дир_выделен_памяти› ::= DS ‹ пробел› ‹ отступ› [ ‹ цбз› ]W
  15. ‹ дир_назнач_старт_адр› ::= START ‹ пробел› ‹ отступ› ‹ адресное_выр›

ПОЯСНЕНИЯ.

‹nl› - символ новой строки;

DS ‹ пробел› ‹ отступ› [ ‹ цбз› ]W  -  предписание компилятору, начав с места появления этой директивы  резервировать указанное в параметре количество (цбз) слов памяти под данные;

START ‹ пробел› ‹ отступ› ‹ адресное_выр› - предписание компилятору оставить информацию загрузчику о начальном значении   (адресное_выр)  содержимого РА (т.е. о команде программы, которая должна выполняться 1-й). Наличие такой директивы позволит, например, память под данные отводить не в конце программы, а в её начале (как того хотела Наташа Стаценко Laughing).

ПРИМЕР ПРОГРАММЫ ВЫЧИТАНИЯ:

// Вычитание, вариант 1:

     IN

     ST   A

     IN

     ST   B

     LD   A

     SUB  B

     OUT

     HALT

A:  DS   W   // отвести одно слово для А

B:  DS   W  // и ещё одно - для B

// т.к SТART He указана, стартовым адресом считается адрес загрузки программы в ОП

 

// Вариант 2.

 A:     DS   2W  // резервировали 2 слова

M:     IN    //первая выполнимая команда программы. Об этом надо сказать компилятору

         ST   A

         IN

         ST   A+2 // во второе слово из двух резервированных

         LD   A

         SUB  A+2

         OUT

         HALT

         START  M

 

Кстати, у Антона Богомолова - автора доступной для скачки реализации МиК-ассемблера, в плане распределения памяти принято несколько другое решение, позволяющее пользователю (т.е. вам) обходиться без директив.

А именно, память под программные "переменные" распределяется неявно (как в Бейсике). Просто в конце программы, в процессе её компиляции, невидимым для программиста образом резервируется область - по одному слову на каждую метку, используемую в программе для данных. С адресами слов из этой области и ассоциируются "переменные" программы. Это, конечно, проще (и для программиста и для реализатора), но лишает программиста некоторых возможностей ( как, например, резервировать, да потом ещё циклически и обработать, память под массив в 100 слов? ).  

4.8
Your rating: Нет Average: 4.8 (5 votes)

Комментарии

Что такое <знак> в третьей

Что такое <знак> в третьей строке? В эмуляторе можно обойтись без директив, а можно и воспользоваться? Или они вообще не работают? Хочу воспользоваться START Laughing. И еще вопрос: в настоящем полном ассемблере точно такая же логика? Я понимаю, что синтаксис может быть другим...

‹знак›   - ASKII-символ.

  1. ‹знак›   - ASKII-символ.
  2. Согласно задания конкурса - это всего лишь уточненное описание и ПРОЕКТ расширения МиК-ассемблера. Я же написал, что у Антона директив нет. Правда, он, имея эту точную БНФ-спецификацию, может теперь полностью её и реализовать.
  3. Ассемблеры разные, потому и отсылал вас к МiXу Д.Кнута. Но на идейном уровне современные ассемблеры во многом совпадают.

Я нашла хорошую

Я нашла хорошую ссылку:

http://educomp.org.ru/mmix/usemmix.html

Куча информации по устройству компьютера, а также куча эмуляторов, есть и MIX и MMIX

Действительно, интересный

Действительно, интересный материал! Но, оставьте что-то и на потом. Курс по Ассемблеру IBM PC ещё впередиLaughing!