Программирование, базы данных, ПО на языке ассемблер для микропроцессоров 8080 и 8085
ВВЕДЕНИЕ
Интенсивное развитие микроэлектроники и повышения степени интеграции открыли новое направление в ВТ - создание микропроцессоров и микрокомпьютеров. Появились вы числительные системы с малым уровнем потребления энергии и универсальными возможностями, которые позволяют решать задачи управления объектами различной физической природы. На основе их применения снижаются затраты на автоматизацию основных технических и вспомогательных процессов. В результате будет решена задача комплексной автоматизации производства во всех отраслях. Это позволит увеличить производительность труда, уменьшить себестоимость выпускаемой продукции и значительно сократить ручные операции в промышленности. Однако для широкого развития работ в данном направлении необходимо готовить значительное число инженеров - системотехников, умеющих создавать и применять микропроцессоры и микрокомпьютеры. Кроме того, следует выпускать и много инженеров - математиков, разрабатывающих соответствующее программное обеспечение. Для их обучения необходимо иметь учебные пособия, посвященные аппаратным и программным средствам современной вычислительной техники.
Несмотря на то, что выпущено значительное количество литературы, посвященной разработке и применению микропроцессоров и микрокомпьютеров, а также описание программных средств, предлагаемая книга представляет определенный интерес комплексным подходом и методической целостностью.
На обзор представлена книга американских авторов Левенталя Л. и Сэйвилла У. "Программирование на языке ассемблер для микропроцессоров 8080 и 8085". Книга переведена с английского, напечатана в 1987г. в издательстве Радио и связь. Издание включает в себя 488 страниц.
Для начала рассмотрим содержание этой книги, чтобы сделать окончательный анализ по ее достоинствам и недостаткам, а также конкретизировать к какой группе эта книга предназначена. На обзор кратко будут представлены части этой книги, затем остановим свое внимание на определенной главе.
Книга состоит из двух частей: обзора вопросов программирования на языке ассемблера и набора подпрограмм. Первая часть хорошо проиллюстрирована большим числом примеров, позволяющих быстро усвоить основные навыки программирования для рассматриваемых микропроцессоров. Подпрограммы, приведенные во второй части книги, могут удовлетворять потребности большинства программистов в стандартных процедурах.
Эта книга, можно сказать, является как бы справочным пособием для программистов, работающих на языке ассемблера. Она содержит краткий обзор вопросов программирования на языке ассемблера для конкретного микропроцессора и набор полезных подпрограмм. В этих подпрограммах использовались стандартные соглашения по формату, документированному оформлению и методам передачи параметров. При этом соблюдались правила наиболее распространенных ассемблеров; кроме того, описаны назначение, процедура, параметры, результаты, время выполнения и требования к памяти.
ГЛАВА 1. ОБЩИЕ МЕТОДЫ ПРОГРАММИРОВАНИЯ
Служит введением в программирование для данного процессора; в ней приводятся основные отличия этого процессора от других микропроцессоров и мини-ЭВМ. В этой главе описываются общие методы написания программ на языке ассемблера для микропроцессора 8080 и 8085. Она содержит способы выполнения следующих операций:
загрузка и сохранение регистров;
запоминание данных в памяти;
арифметические и логические операции;
работа с разрядами;
проверка разрядов;
проверка на определенные значения;
числовые сравнения;
организация циклов (повторяющихся последовательностей операций) ;
обработка массивов;
поиск в таблице;
работа с символами;
преобразование кодов;
арифметические операции повышенной точности;
умножение и деление;
обработка списков;
обработка структур данных.
В отдельных разделах описываются передача параметров подпрограммам, общие методы написания драйверов ввода-вывода и программ обработки прерываний, а также приемы, позволяющие ускорить выполнение программ и уменьшить используемую ими память.
Для тех, кто знаком с программированием на языке ассемблера на других вычислительных машинах, здесь дается краткий обзор особенностей процессоров 8080 и 8085.
Арифметические и логические операции разрешены только между аккумулятором и байтом непосредственных данных или между аккумулятором и регистром общего назначения. Однако один регистр общего назначения в действительности указывает на адрес в памяти; это регистр М, который в действительности обращается к адресу в памяти, содержащемуся в регистрах Н и L. Таким образом, команда ADD M, например, означает: прибавить к аккумулятору содержимое байта памяти, адресуемого через регистры H и L.
Аккумулятор и регистры Н и L являются специальными регистрами. Они являются единственными регистрами, которые могут быть прямо загружены или записаны в память. Аккумулятор является единственным регистром, который может быть инвертирован, сдвинут, косвенно загружен с использованием адреса в паре регистров В или D, косвенно записан в память по адресу, содержащемуся в паре регистров В или D, или использован в командах IN и ОUT. Регистры Н и L составляют единственную пару, которая может быть использована косвенно в арифметических командах, при записи в память данных, заданных непосредственно в команде, или при загрузке и записи в память других регистров, отличных от аккумулятора. Регистры Н и L являются также единственной парой, которая может быть передана в счетчик команд или указатель стека. Более того, эти регистры используются как аккумулятор двойной длины при сложении 16-разрядных чисел (команда DAD) . Регистры D и Е являются в некотором смысле также специальными, поскольку одной командой (XCHG) можно поменять их содержимое с содержимым регистров Н и L. Таким образом, регистры в 8080 и 8085 весьма асимметричны, и программист должен аккуратно выбирать, для каких данных и адресов какими регистрами пользоваться.
Часто для одних и тех же физических регистров используются несколько имен. Для многих команд A, B, C, D, E, H и L являются 8-разрядными регистрами. Для других команд регистры В и С (В- старший по значению) , D и Е (D- старший по значению) или Н и L (Н- старший по значению) являются 16-разрядной парой регистров. Термины пара регистров В, регистры В и С и пара регистров ВС имеют одно и тоже значение; подобные же варианты существуют для регистров D и Е и H и L. Заметим, что пара регистров и два одиночных регистра физически одно и то же, и они не могут служить одновременно для различных целей. Регистры Н и L фактически почти всегда применяют для косвенного адреса из-за наличия команд, имеющих доступ к регистру М, и таких специальных команд, как SPHL, PCHL, XTHL и XTHG. Благодаря тому, что существует команда XCHG, для второго адреса берут регистры D и Е, а не В и С. Регистры В и С используют обычно как отдельные 8-разрядные регистры для временного хранения данных.
Воздействие различных команд на флаги весьма непоследовательно. К некоторым особенно необычным действиям относятся следующие:
логические команды очищают флаг переноса; команды сдвига не действуют на другие флаги, кроме флага переноса; команды загрузки, записи, пересылки, увеличивают на 1 пары регистров и уменьшают на 1 пары регистров вообще не оказывают влияния на флаги; 16-разрядное сложение действует только на флаг переноса.
Отсутствует косвенная адресация через память и индексация. Отсутствие косвенной адресации через память компенсируется загрузкой косвенного адреса в регистры Н и L. Действительная косвенная адресация, таким образом, является двухшаговым процессом. При желании загрузить или записать в память аккумулятор можно также загрузить косвенный адрес в регистры В и С или D и Е. Отсутствие индексной адресации компенсируется добавлением пары регистров с помощью команды DAD. Эта команда добавляет пару регистров к Н и L. Таким образом, индексация требует нескольких шагов:
загрузить индекс в пару регистров, загрузить базовый адрес в другую пару (одной из пар регистров должны быть Н и L) , в) используя команду DAD, сложить две пары и г) использовать сумму как косвенный адрес (при помощи обращения к регистру М) . Индексация в 8080 и 8085 - долгий и неудобный процесс.
Нет флага переполнения при получении дополнения до двух, так что надо определять такое переполнение программным путем. Из этого следует, что трудно работать с числами со знаком. Многие обычные команды отсутствуют, но могут быть легко смоделированы с помощью регистровых команд. Примерами являются очистка аккумулятора (с использованием SUB A или XRA A) , логический сдвиг аккумулятора влево (с помощью ADD A) , очистка флага переноса (ANA A или ORA A) и проверка аккумулятора (ANA A или ORA A) . Команда ANA A и ORA A очищают флаг переноса и устанавливают остальные флаги в соответствии с содержимым аккумулятора. Причем загрузка регистра не действует на флаги. Нет относительных переходов. Фактически, единственной командой перехода, которая не требует абсолютного адреса, явл