Ключи ассемблирования
Первое число, следующее за командой A, называют ключами ассемблирования, потому что в зависимости от него трансляция протекает с теми или иными условиями. Ключи похожи на флаги, так как каждому из них соответствует определенный бит задаваемого значения. При объединении нескольких битов можно получить комбинацию различных условий. Перечислим значения всех используемых ключей при установке соответствующего бита в 1:
бит 0 (1) - заставляет ассемблер вывести таблицу адресов меток и значений констант в конце второго прохода трансляции;
бит 1 (2) - произвести проверку синтаксиса строк программы, не создавая при этом машинного кода;
бит 2 (4) - вывести на втором проходе листинг ассемблирования программы;
бит 3 (8) - на время трансляции назначить вывод вместо экрана на принтер;
бит 4 (16) - реально размещать машинный код сразу за таблицей меток (адрес, указанный в директиве ORG влияет только на создание ссылок в программе);
бит 5 (32) - не делать проверки расположения кода в памяти (обычно же максимальная верхняя граница задается системной переменной UDG и может быть изменена командой редактора U).
Поясним смысл некоторых наиболее важных ключей и покажем, как ими пользоваться на практике. Первый ключ бывает совершенно необходим, по крайней мере, в двух случаях: при отладке достаточно больших программ, чтобы знать, где искать ту или иную процедуру и для определения адресов подпрограмм и переменных при использовании машинного кода совместно с программами на других языках или для связи различных модулей, транслируемых раздельно (что поделаешь, память Speccy весьма ограничена и иногда поневоле приходится изощряться). В таких программах, как БИТВА С НЛО или ГЕНЕРАТОР СПРАЙТОВ мы предложили простой способ выбора необходимой процедуры из пакета, но он не всегда может оказаться пригодным. Более того, в ГЕНЕРАТОРЕ СПРАЙТОВ переменные располагались в буфере принтера, а это в некоторых случаях не допускается. Например, в компьютере ZX Spectrum 128, как мы уже говорили, в этой области содержится важная информация, разрушать которую никак нельзя. Вот здесь-то и поможет ключ 1. Разместите все переменные внутри программы и оттранслируйте ее командой A1. Когда ассемблирование закончится, на экран (или на принтер, если задать режим A9 - 1+8) будет выдана таблица меток, в которой найдите нужное имя, а рядом с ним - адрес. Для обращения к этому адресу из Бейсика вам останется только перевести шестнадцатеричное значение в десятичное.
Ключи 2 и 4 бывают особенно полезны на этапе отладки, а вот без ключа 16 не обойтись при трансляции больших программ или если машинный код должен располагаться в недоступных иными средствами областях памяти. Как уже говорилось, при использовании этого ключа исполняемый код располагается сразу за таблицей символов, создаваемой ассемблером на первом проходе трансляции (которая, в свою очередь, помещается следом за исходным текстом). Это позволяет отвести для исполняемого модуля всю свободную память. Однако после сохранения полученной программы на ленте или диске адрес загрузки ее кодов в заголовке файла окажется равным тому, который вы указали в директиве ORG. Все адреса переходов, естественно, также будут правильными.
Применять последний ключ 32 можно лишь в тех случаях, когда вы абсолютно уверены, что исполняемый код полностью уместится в оперативной памяти, иначе «хвост» программы залезет в начальные адреса ПЗУ, где толку от него не будет никакого. Этот ключ может принести пользу, пожалуй, лишь при создании операционных систем или перемещаемых модулей, но эта тема уже выходит за рамки нашей книги.