Пятница, 15.12.2017, 09:13
БК-0010.01. Повесть о настоящем компьютере
Главная Регистрация Вход
Приветствую Вас, Гость · RSS
Меню сайта
Категории каталога
Введение в руководство [2]
Введение [0]
Организация БК-0010 [1]
Раздел 1. Организация БК-0010
Работа с МСД [1]
Раздел 2. Работа с МСД
Системные регистры [1]
Раздел 3. Системные регистры
Системное ПО [1]
Раздел 4. Системное программное обеспечение БК-0010
Прерывания. Приоритет ЦП [1]
Раздел 5. Система прерываний БК-0010. Приоритет процессора
Командные прерывания [1]
Раздел 6. Командные прерывания
ЕМТ БК-0010 [1]
Раздел 7. командные прерывания ЕМТ БК-0010
Коды и ассемблер. Мнемокод. [1]
Раздел 8. Коды и ассемблер. Мнемокод. Формат команды
Способы адресации [1]
Раздел 9. Способы адресации
Команды процессора БК-0010 [1]
Раздел 10. Система команд процессора БК-0010
Псевдокоманды. Метки. Комментарии [1]
Раздел 11. Псевдокоманды ассемблера. Метки. Комментарии
Программирование на ассемблере [1]
Раздел 12. Программирование на ассемблере. Начало. Трансляция программ. Ошибки
Отладка программ [1]
Раздел 13. Отладка программ. Позиционно-независимое программирование. Компановка
Подпрограммы ПЗУ БК-0010 [1]
Раздел 14. Подпрограммы ПЗУ БК-0010
Системная область ОЗУ БК-0010 [1]
Раздел 15. Системная область ОЗУ БК-0010. Некоторые секретные сведения об авторе и МП-клубе
Повышение быстродействия БК-0010 [1]
Раздел 16. Вопросы повышения быстродействия БК-0010
Об использовании ПЗУ [1]
Раздел 17. Полезная подпрограмма. Об использовании ПЗУ
Загадочные регистры [1]
Раздел 18. Загадочные регистры
Штурм системной области [1]
Раздел 19. Продолжаем штурм системной области
Об автозапуске программ [1]
Раздел 20. Об автозапуске программ
Коварные программы [1]
Раздел 21. Коварные программы
Еще о системной области [1]
Раздел 22. О пользе плагиата, или еще о системной области
О псевдокомандах и компановке [1]
Раздел 23. Еще раз о псевдокомандах, метках и компановке
Тук-тук, кто в стеке живет? [1]
Раздел 24. Тук-тук, кто в стеке живет?
Фокал с позиций ассемблера [1]
Раздел 25. Взгляд на фокал с позиций ассемблера
Наш опрос
Оцените мой сайт
Всего ответов: 47
 Каталог статей
Главная » Статьи » Псевдокоманды. Метки. Комментарии

Метки. Комментарии в ассемблере МИКРО для БК-0010

Теперь рассмотрим ту часть ассемблер-системы, аналога которой мы в фокале не имеем. Это объясняется тем, что ассемблер - это транслятор. после того, как листинг программы написан, он создает загрузочный модуль, т.е. саму программу, в процессе трансляции. Этот продукт по форме имеет очень мало общего с исходным текстом. более того, мы можем эти отличия еще более углубить, если это нужно. Что есть фокал-программа? Текст, занимающий определенное место в ОЗУ. Что есть загрузочный модуль ассемблера? Готовая последовательность команд и данных. Оператор фокала не есть машинная команда, это лишь указание интерпретатору, какие его подпрограммы нужно задействовать, что сделать, чтобы выполнить оператор. оператор ассемблера - готовое указание непосредственно ЦП, который его исполняет, "не думая": за него уже подумал программист. Если интерпретатор фокала сам определяет, какая часть ОЗУ свободна для переменных, сам их помещает в определенную зону ОЗУ, сам ищет их там (путем вычисления так называемой хеш-функции), то загрузочный модуль ассемблера должен получить все эти данные в готовом виде при трансляции. Это значит, что мы должны не только написать текст программы, но и позаботиться о месте для размещения переменных, текстовых сообщений, их использовании и выводе, и т.д. Как же обеспечить выполнение всех этих задач? Для этого в составе языка ассемблера есть так называемые псевдокоманды (ПК). Они имеют приставку "псевдо" потому, что не входят в окончательный текст программы. Это только указания транслятору, как ему работать при трансляции, как истолковать тот или иной код в листинге при создании загрузочного модуля, т.е. собственно программы.

Рассмотрим основные псевдокоманды ассемблера МИКРО8 и приемы их использования, начиная с самых простых.
Для отличия псевдокоманд от меток или операторов все они имеют особую форму: начинаются с точки.

Псевдокоманды.
.E - обнуление слова (байта).
Будучи помещенной в строку ассемблера, эта пк вызывает при трансляции запись по данному адресу нулевого слова, если адрес четный, или байта, если адрес нечетный. применяется как для создания нулевых байтов (обычно они отмечают конец какого-либо текста или массива), так и просто для получения четного адреса. Дело в том, что иногда в процессе написания программы массив или текст занимают нечетное число байт. При трансляции же необходимо разместить все операторы и метки только по четным адресам, иначе произойдет ошибка. Поэтому, если есть предположение, что после текста или массива получен нечетный адрес, употребляют команду .Е, после нее адрес всегда четный. Конечно, можно было бы пересчитать байты текста, и ввести, например, пробел, но это не всегда просто сделать. А после команды .Е можно не сомневаться: адрес всегда четный.

.+<n> - резервирование памяти, где n - число байт.
Будучи помещенной по любому адресу, Эта пк обнуляет зону памяти, начиная с текущего адреса, длиной n байт. Следующий оператор будет при трансляции помещен по адресу (текущий+n). применяется как для выделения зон ОЗУ для заданного числа переменных или текста, вводимого, например, с клавиатуры, так и просто для придания программе "круглой длины", для чего нужное число байт резервируется в конце текста, после пробной трансляции, когда мы уже знаем длину программы.
Пример: пусть нам в процессе работы программы придется вводить текст, например, с помощью команды ЕМТ 10, длиной до 20 байт. Поместив в нужное место программы пк .+20, решим задачу выделения буфера текста, т.е. зоны ОЗУ под вводимый текст. Пусть наша программа после трансляции имеет длину 373 байта. это - "некрасивое" число. Поместив в конце текста пк .+5, после новой трансляции имеем длину 400 байт.

.#<n> - запись слова n. поместив эту пк по данному адресу, мы имеем возможность ввести в загрузочный модуль просто восьмеричное число, например, константу. пример:
.#177777.#1.#0 - последовательно записаны слова: 177777, 000001, 000000.

.В:#<n> - запись байта. аналогична предыдущей, но позволяет записать по данному адресу байт. это нужно, когда мы хотим ввести в текст, например, код операции, т.к. перевести несколько байт в восьмеричные 2-байтовые слова в уме не так-то просто.
пример:
.В:14.В:233.В:12.В:40 - последовательно записаны байты кодов операций: очистка экрана; переключение режима 32/64; перевод строки; пробел.

.А:<строка символов> - ввод произвольного текста. Любые символы, следующие за данной пк до конца строки, воспринимаются при трансляции только как символьная информация, и, начиная с данного адреса, записываются, как коды символов. Применяется для задания текстовых сообщений. управляющие символы в этой строке недопустимы. Принято называть такую запись записью в коде asc-ii (читается: а-эс-це-и-и), хотя допустимые коды БК-0010 значительно шире, чем классический asc-ii. Пример: пусть нужно записать текст: <микро8>. можно, конечно, используя пк .В:, записать: .В:355.В:351.В:353.В:362.В:357.В:70 но такая запись очень неудобна, особенно, если нужен длинный текст. используя пк <.А:>, запишем: .А:МИКРО8 результат будет один и тот же.

 .R:<строка символов> - запись в коде radix-50. что это за код, и зачем он нужен? дело в том, что запись а коде asc-ii не всегда экономична. Например, в слово можно "упаковать" не более 2 символов. если ограничить набор символов только лат. загл. буквами и цифрами, можно упаковать в слово 3 символа. Это и есть код radix-50. Он применяется весьма редко, только когда надо записать очень длинный текст, экономя память.
приведем таблицу кодов radix-50
символ  8-ричный код
пробел 0
a...z 1...32
$ 33
. 34
не используется 35
0...9 ¦36...47

Как видим, код включает только 50 символов. Это позволяет кодировать каждый символ только 5 битами, а значит, разместить в 16-битовом слове 3 символа (а не 2, как в asc-ii).

Для понимания дальнейшего вначале рассмотрим метки ассемблера МИКРО8. Напомним, что метка есть символическое имя, обозначающее данный адрес. Метки МИКРО8 могут состоять не более, чем из 3 символов - лат. букв или цифр. Обратиться к метке, начинающейся с буквы, можно из любой точки программы. Такая метка называется обычной. Но в длинном тексте может быть очень много меток, и их легко перепутать. Чтобы избежать этого, применяются локальные метки. Такая метка начинается с цифры, и действительна только до первой обычной метки, в любую сторону. Таким образом, применяя локальные метки, мы можем их повторять неоднократно для разных блоков программы, не утруждая свою фантазию придумыванием различных имен, и заботясь лишь о том, чтобы блоки разделялись обычными метками. При этом, обращаясь к локальной метке, мы можем быть уверены, что не выйдем за пределы блока. Метка, как уже говорилось раньше, всегда ставится в начале строки, и, чтобы отличить ее от оператора, после нее ставится знак <:>.
Благодаря этому, нет запретных имен меток, например, можно использовать в качестве меток и имена операторов.

Примеры обычных меток:
а0: а1n: jmp: x:

Примеры локальных меток:
083: 1ав: 9е: 5:

Как видим, в качестве символов меток можно применять и цифры 8 и 9, недопустимые в иных случаях.

Последующие пк относятся к работе с метками.
Нередко возникает случай, когда нам необходим физический адрес метки. Мы можем поступить так: записать программу и оттранслировать ее. После трансляции ассемблер выдает таблицу меток. По ней определим адрес интересующей нас метки, и впишем его в текст программы, например, операндом с непосредственной адресацией в операторе пересылки.
Пример: имеем некоторую программу, где нам нужно занести в R4 адрес метки м1. Вначале запишем в нужном месте текста: MOV m1,R4 но при этом мы получаем запись в R4 содержимого ячейки по адресу м1. Оттранслируем текст. Пусть таблица меток выглядит: ...... М1=1276 .......
вернемся в редактор, и перепишем наш оператор так:
MOV #1276,R4
Мы достигли нужного результата, но довольно сложным путем. Кроме того, если мы загрузим программу по иному адресу, кроме 1000, наш адрес метки будет уже неверен.

Как сделать так, чтобы получить физический адрес метки в процессе исполнения программы, независимо от адреса загрузки? Для этого служит пк:

.@&<имя метки> - смещение к метке.
Если мы запишем эту пк по любому адресу, то в данной ячейке ОЗУ запишется в байтах расстояние от 1-го слова следующей команды до метки с данным именем. Но этого мало: мы должны внести поправку на адрес загрузки программы. Для этого вставим где-либо в текст программы команду сложения текущего адреса с ячейкой, в которой записано смещение.
Но, поскольку мы не можем записать эту команду в ту же строку, что и пк <.@Met>, у нас снова получится разница с физическим адресом метки.
если команда сложения стоит сразу за пк <.@Met>, то разница составит +4. Микро8 дает возможность внести поправку сразу. Запишем:

m1: .@Met-4 ADD PC,m1

Обратим внимание на то, что нам пришлось пометить первую строку: как иначе мы можем сложить с ней адрес? Теперь по адресу м1 мы получили физический адрес метки мет, причем метка мет может быть расположена в программе, где угодно. Но чтобы получить этот адрес, необходимо выполнить сложение, т.е. 2-ю строку. В то же время, 1-я строка исполняться не должна, там произвольное число. Сделаем "обход" 1-й строки:

.....
<предшествующий текст программы>
.....
BR a
m1: .@Met-4 a: ADD PC,m1
.....
<последующий текст программы>
.....
Вот теперь мы получили блок задания физического адреса метки с именем <мет>. Нам только остается запомнить, что этот адрес записан в ячейке по адресу м1. При необходимости мы можем его использовать, например, записать в регистр:
MOV m1,R4 - физический адрес метки мет записан в регистр R4.
Конечно, эта команда должна следовать где-либо после блока получения адреса, иначе адрес еще не будет получен. Другие пк МИКРО8 для работы с метками мы не будем рассматривать по следующей причине. Дело в том, что существует, увы, несколько версий МИКРО8, которые не идентичны.

В ряде из них предусмотрена команда:
#<имя метки>
, но она не реализуется.
Если бы она была реализована, было бы достаточно для получения физического адреса метки написать:
MOV #met,R4 - запись физического адреса метки мет в R4.
Читателю предоставляется самому проверить, не реализована ли эта команда в его версии МИКРО8, мы же можем только пожалеть, что авторы МИКРО8 не довели работу до конца, или что получили распространение неполноценные версии этого ассемблера.

В фокале мы имели возможность ввести в текст программы комментарии, отделив их оператором <с>.
Такая же возможность есть и в ассемблере. Если мы поместим в любое место командной строки (кроме текста, записанного пк .А:), символ <;>, то все последующее есть комментарий, при трансляции он игнорируется, но в тексте программы сохраняется.

Пример употребления комментариев и псевдокоманд:

; способ получения физического адреса метки.
;.................Предш.программа
; блок адреса метки
BR a
;"обход" адреса метки
m1: .@Met-4 ;ячейка для получения физ.Адреса
а: ADD PC,m1 ;поправка на текущий адрес
;.................Последующая программа
; использование адреса метки для вывода текста
MOV m1,R4
JSR PC,@#163270
halt
 ;.................Последующая программа
; текст с предшествующей очисткой экрана и переключением
; формата 32/64
. Мет: .В:14.В:233
.А: ассемблер микро#8s БК-0010
.В:233.Е
;возврат прежнего формата, конец текста

Обратим внимание на то, что после пк .А: мы не можем помещать ни операторы, ни пк, ни комментарии, т.к. Все это до конца строки будет воспринято, как текст. Все же другие пк мы можем помещать по нескольку в строку, но пробелы между ними недопустимы. Оператор же в строке должен быть "в одиночестве", сочетать операторы с пк в одной строке нельзя. Что касается пробелов, то они сохраняются в тексте, вводимом с помощью .А: , но игнорируются при трансляции в других местах программы, кроме указанного выше случая. Пробелы поэтому могут свободно использоваться для придания программе вида, удобного для чтения.

Подводя итог, можно указать, что в результате выполнения приведенных выше фрагментов будет отпечатан текст: ассемблер микро#8s БК-0010 перед этим будет установлен формат 32 (если исходный был 64), и очищен экран. После этого формат будет приведен к исходному, и программа остановится. Как можно догадаться, вывод текста осуществляет п/п по адресу 163270, имеющаяся в ПЗУ БК-0010. Об этом будет сказано дальше.

Категория: Псевдокоманды. Метки. Комментарии | Автор: ЗАЛЬЦМАН Ю.А., МП-КЛУБ, г.АЛМА-АТА
Просмотров: 2292 | Комментарии: 1 | Рейтинг: 0.0/0 |

Всего комментариев: 0
Имя *:
Email *:
Код *:
Используются технологии uCoz
Форма входа

Поиск
Друзья сайта
Статистика