Пятница, 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
 Каталог статей
Главная » Статьи » О псевдокомандах и компановке

Еще раз о псевдокомандах, метках и компоновке

Способы адресации были подробно рассмотрены в одном из предыдущих файлов руководства. Но замечания читателей заставляют еще раз вернуться к этому, видимо, наиболее сложному разделу ассемблера, и поговорить в основном о соотношении меток и абсолютных адресов. Как организовать переход по метке, конечно, ясно всем (BR met, например).

Как переслать содержимое адреса, помеченного меткой, куда-либо, ясно, конечно, тоже (MOV met,R0). Но представим, что у нас где-либо в программе размещается текстовое сообщение, которое нужно выдать на экран. Как это можно сделать?

Проще всего - с помощью системной п/программы, обращение к которой - по адресу @#163270 (напомним, что концом текста при этом должен быть нулевой байт или слово). Перед обращением к п/программе мы должны задать адрес начала текста в регистре R4.

Но мы ведь еще не знаем этого адреса, а даже если и узнаем его (пометив начало текста меткой, оттранслировав программу, и прочитав в таблице меток этот адрес), это мало что даст: ведь его придется вписать в текст программы вручную, да еще и сделать поправку на адрес загрузки! Это неудобно. Не может ли ассемблер помочь нам? Как бы мы поступили, чтобы узнать адрес метки?

Наверное, вначале в текст программы записали бы:
MOV #1000,R4
JSR PC,@#163270
где 1000 - произвольный адрес-заместитель. Оттранслируем программу. Пусть начало текста помечено в ней меткой tex, и пусть в таблице меток после трансляции мы имеем: tex=1236.
вернемся в редактор и впишем вместо 1000 нужное число:
MOV #1236,R4
JSR PC,@#163270

теперь все в порядке, текст будет выведен на экран. Но если таких текстов много? И если мы будем дальше редактировать программу, и адреса их изменятся? Переписывать все метки? Вернемся к нашему примеру, и запишем:
MOV #tex,R4
JSR PC,@#163270 #tex
- псевдокоманда "получение адреса метки".

Оттранслируем программу. Но что это? Меток <тех в таблице стало две! Одна из них выглядит, как обычно, и имеет адрес 1236, зато вторая - инверсная, и адрес ее совсем другой! Что произошло? Если мы теперь просмотрим с помощью деассемблера загрузочный модуль, то обнаружим вместо оператора "MOV #tex,R4" оператор: "MOV #0,R4"!

Но почему? Дело в том, что любой ассемблер - это 2-проходный транслятор. При первом проходе, который мы сделали, он еще "не знает" адрес метки tex, т.к. таблица меток не сформирована. Он, как это сделали мы раньше, записав число #1000, зарезервировал под адрес метки ячейку ОЗУ, записав туда #0. Но что же дальше? Ведь адрес текста у нас не равен 0? Нужен второй проход транслятора, т.е. компоновка. Если наша программа не длинна, и состоит из 1 модуля, компоновка делается сразу после трансляции, с помощью соответственных команд (в микро8 и 9 например, это LL). При этом предполагается, что адрес загрузки программы будет равен 1000. Выполним LL. Что видим? Выдана та же самая таблица меток? Нет, не та! Теперь инверсной метки tex нет. Снова воспользуемся деассемблером, и что же? Вместо #0 в программе нужный нам адрес: "MOV #1236, R4"! Ну, а если адрес загрузки программы не равен 1000, а иной, например, 12000? Тогда воспользуемся командой компоновки ls. Выдан запрос: а= - это ассемблер запрашивает адрес загрузки. Введем: а=12000 ввод. Ага, теперь уже таблица меток другая, и вместо "tex=1236" имеем: "tex=12236". Деассемблер легко нам продемонстрирует, что, действительно, на этот раз получен оператор: "MOV #12236,R4".

Вот и весь фокус! Следует только учесть, что если в программе несколько модулей, то после трансляции необходимо выгрузить их на МЛ в виде объектных модулей, представляющих из себя программу (или ее части), полученную после трансляции, вместе с таблицей меток. Затем с помощью соответствующих команд модули грузятся и компонуются один за другим, с заданием начального адреса, или без него, если адрес загрузки = 1000. Таким образом, если у нас сохранился исходный текст программы, мы всегда можем изменить адрес ее загрузки на другой. Программа становится как бы перемещаемой, поэтому ассемблер такого типа и называется перемещающим ассемблером. Но как быть, если нам нужна не "как бы", а на самом деле перемещаемая программа, т.е. такая, которую можно грузить с любого адреса? Очевидно, описанный прием здесь не годится! Ведь нам нужно получить не адрес метки, а "смещение к метке", т.е. ее относительный адрес. В микроассемблерах БК-0010 есть псевдокоманда .@мет, называемая как раз "смещение к метке".
Что она делает? Записывает в ячейку текущего адреса (при трансляции) смещение метки, относительно этого адреса. Вспомним теперь, что регистр счетчика команд PC всегда содержит в момент обращения адрес следующей команды.
Для нашего примера с текстом запишем:

MOV PC,R4 (1)
ADD (PC)+,R4 (2)
.@tex+2 (3)
JSR PC,@#163270

и это все: в регистре R4 теперь будет абсолютный адрес метки tex, причем при любом адресе загрузки!

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

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

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