Реферат: Аналитический обзор книги Л. А. Левенталь, У. Сэйвилл "Программирование на языке ассемблера для микропроцессоров 8080 и 8085"

Аналитический обзор книги Ланс А.Левенталь, Уинтроп Сэйвилл «Программирование на языке ассемблера длямикропроцессоров 8080 и 8085».

ПРЕДМЕТ: Программирование Микро-ЭВМ

Студенты: Терехов Д.А. Терехова О.Н.

МОСКОВСКИЙ ГОСУДАРСТВЕННЫЙ ИНСТИТУТРАДИОТЕХНИКИ, ЭЛЕКТРОНИКИ И АВТОМАТИКИ (ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ)

Москва 1997 г.

Глава 1. ОБРАБОТКА МАССИВОВ

Элементмассива проще всего выбрать, поместив его адрес в регистры Н и L. В этом случае можно:

 работатьс элементом, обращаясь к нему как к регистру М;

 выбиратьследующий элемент массива (по следующему большему адресу);

 используякоманду INX для увеличения значения пары регистров Ни L, или предыдущий элемент (по предыдущемуменьшему адресу), используя DCX дляуменьшения Н и L.

 выбиратьлюбой произвольный элемент, загрузив в другую пару регистров смещения элементаотносительно адреса, содержащегося в НL, ииспользовав команду DAD (16-ричное сложение).

ПОИСК В ТАБЛИЦЕ

Таккак в процессорах 8080 и 8085 отсутствует индексация, то адрес, необходимый дляпоиска в таблице, должен вычисляться явно с использованием команды DAD. Как и при работе с массивами, поиск втаблице является простым, если таблица содержит 8-разрядные элементы данных;сложнее, когда таблица содержит более длинные элементы или же адреса. В этомслучае могут быть полезны команды XCHG, PCHL и SPHL, но они требуют, чтобы программист помещал результаты вопределенные пары регистров.

РАБОТА С СИМВОЛАМИ

Простейшийспособ работы с символами в процессорах 8080 и 8085 состоит в обращении с нимикак с 8-разрядными числами без знака. Буквы и цифры составляют упорядоченнуюпоследовательность набора символов в кодах ASCII (например, представление буквы А в коде ASCII на единицу меньше, чем представление буквы В). Приложение В) вконце книги содержит полный набор символов ASCII.

ПРЕОБРАЗОВАНИЕ КОДОВ

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

АРИФМЕТИЧЕСКИЕ ОПЕРАЦИИ ПОВЫШЕННОЙТОЧНОСТИ

Арифметическиеоперации повышенной точности требуют ряда 8-разрядных операций. Необходимовыполнять следующее:

 сначалаочистить флаг переноса, так как никогда не происходит переноса в младшие байтыили заема из них;

 использоватькоманды сложения с переносом (ADC) иливычитание с заемом (SBB) для выполнения 8-разрядных операций,которые включают перенос или заем из предыдущей операции.

УМНОЖЕНИЕ И ДЕЛЕНИЕ

Существуютмного способов выполнения умножения. Один из подходов состоит в заменеумножения небольших целых чисел на определенную короткую последовательностьсложений и сдвигов влево. Деление на число, являющееся степенью 2, можновыполнить с помощью ряда логических сдвигов вправо. Если умножаются или делятсячисла со знаком, то необходимо обращать внимание на отделение знака отабсолютной величины. Логические сдвиги должны быть заменены на арифметические,сохраняющие знаковый разряд.

ОБРАБОТКА СПИСКОВ

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

 непредусмотрена индексация;

 косвеннаяадресация возможна только через пары регистров;

 адресав парах регистров могут быть использованы только для получения или записи8-разрядных данных.

РАСПРОСТРАНЕННЫЕ СТРУКТУРЫ ДАННЫХ

Болеераспространенные структуры данных можно обрабатывать с помощью процедур,предназначенных для работы с массивами, таблицами и списками. Краспространенным структурам данных относятся очереди или связанные списки, атакже стеки.

СПОСОБЫ ПЕРЕДАЧИ ПАРАМЕТРОВ

Наиболееобщими способами передачи параметров в микропроцессорах 8080 и 8085 являютсяследующие:

Врегистрах. Доступными являются семь 8-разрядных регистров общего назначение ( A, B, C, D, E, H и L ), при этом три пары регистров (B, D и H) могут служить для передачи адресов.

 Взаданной области памяти.  Для реализации этого подхода проще всего поместитьбазовый адрес заданной области в регистры H и L. Вызывающая программа до передачиуправления подпрограмме должна хранить параметры в памяти и загрузить базовыйадрес в регистры H и L.

Впамяти программы непосредственно за вызовом подпрограммы.

Встеке.

ПРОСТОЙ ВВОД — ВЫВОД

Простойввод — вывод можно выполнить, используя или 8-разрядные адреса устройств, или16-разрядные адреса памяти. Преимущества адресов устройств состоят в том, что оникороче и используют отдельное адресное пространство. Недостаток состоит в том,что команды IN и OUT содержат адреса устройств и допускают только прямую адресацию, т.е. команды IN и OUT требуют, чтобы были определены адреса; в этом случае отсутствуетпрямой способ передачи адресов устройств ввода — вывода в виде параметров, такчтобы одна программа ввода — вывода поддерживала много устройств. С другойстороны, если порты ввода — вывода занимают адреса памяти, то с помощью любыхкоманд, обращающихся к памяти, может выполнятся также ввод — вывод. Проблемы,связанные с этим подходом, состоят в его нестандартности, что создает трудностив тех случаях, когда надо отличить передачи ввода — вывода от передач в памяти,а также когда требуется, чтобы некоторая область памяти была зарезервированадля устройств ввода — вывода.

СОСТОЯНИЕ И УПРАВЛЕНИЕ

Сигналысостояния и управления могут обрабатываться так же, как любые другие данные.Единственная особенность состоит в том, что процессор не может читать из портавывода; если необходимо знать текущее состояние порта вывода, необходимохранить копию данных в оперативной памяти.

ПЕРИФЕРИЙНЫЕ ИНТЕГРАЛЬНЫЕ МИКРОСХЕМЫ

Всистемах 8080 и 8085 наиболее общими периферийными интегральными микросхемамиявляются последовательный интерфейс 8251, программируемый таймер 8253 ипараллельны интерфейс 8255. Все эти устройства могут выполнять множествофункций, большинство из которых подобно функциям самого микропроцессор.Конечно, периферийные интегральные микросхемы выполняют меньше различныхфункций, чем процессор, и диапазон этих функций существенно уже. В этой частикниги описывается устройство 8255.

НАПИСАНИЕ ПРОГРАММ, РАБОТАЮЩИХ ПОПРЕРЫВАНИЯМ

Вбольшинстве систем прерывания 8080 и 8085 используются команды RST и входные сигналы, которые передаютуправление по определенным адресам памяти. Все команды RST и входные сигналы сохраняют старое значение программного счетчикав вершине стека, но не сохраняют автоматически остальные регистры. Словосостояния процессора (PSW) содержитаккумулятор (старший байт) и флаги (младший байт). Прерывания должны бытьразрешены явно с помощью команды EIнепосредственно перед командой RET,заканчивающей обслуживающую программу. Команда EI задерживает действительное разрешение прерываний на один такткоманды во избежания лишней записи адреса возврата в стек.

УВЕЛИЧЕНИЕ БЫСТРОДЕЙСТВИЯ ПРОГРАММ

Ускоритьвыполнение можно только определив, где теряется время. Для этого необходимоопределить, какие циклы процессор выполняет наиболее часто. Основное влияние наснижение затрат времени часто выполняемого цикла оказывает счетчик числациклов. Таким образом, важно определить, как часто выполняются команды, иработать далее с циклами в порядке частоты их выполнения.

Послетого, как уточнено, какие циклы выполняются наиболее часто, время их выполненияможно уменьшить, используя следующие правила:

 Исключениеизбыточных операций;

 Реорганизацияцикла так, чтобы уменьшалось число команд перехода;

 Использованиелинейной способности команд вместо подпрограмм;

 Использованиедля временного хранения стек вместо определенных адресов памяти;

 Назначениерегистров таким образом, чтобы получить максимальный выигрыш отспециализированных команд, как LHLD,SHLD,XCHG,XTHL и  PCHL;

 Везде,где возможно, для работы с 16-разрядными данными использование 16-разряднвхкоманд;

 Использованиекоманд MVI M, INR M и DCR M для работы с данными памяти;

 Использованиекоманд  MOV, MVI, INR, DCR, INX, DCX, SHLD, LHLD, XCHG, XTHL, PUSH, POP, PCHL и SPHL для работы с данными в регистрах;

 ИспользованиеRST,PCHL или RET в качестве коротких команд перехода;

 Организацияпоследовательности условных переходов таким образом, чтобы была минимизациясреднего времени выполнения;

 Проверкана условия, при которых последовательность команд не выполняется, и обход этойпоследовательности для случая выполнения условий.

Обычныйпуть к снижению времени выполнения состоит в замене длинных последовательностейкоманд таблицами. Если не предусмотрены специальные выходы или не введеныэлементы логики программы, то с помощью отдельного просмотра таблицы могутвыполняться те же операции, что и с помощью последовательности команд. Ценойэтого является необходимость в расходах на дополнительную память, но при ееналичии это может быть оправдано. Если емкость памяти достаточна, то поиск втаблице может быть рациональным подходом, даже если многие записи ее одинаковы.Кроме того, что ускоряется работа, поиск в таблице обычно легче программироватьи проще изменять.

УМЕНЬШЕНИЕ ДЛИНЫ ПРОГРАММЫ

Длинупрограммы можно значительно уменьшить, выделив общие последовательности команди заменив их подпрограммами. В результате получается одна копия этих командвместо нескольких копий.

Поискпо таблице обычно требует большего объема памяти, но снижает время выполнения.

ГЛАВА 2. РЕАЛИЗАЦИЯ ДОПОЛНИТЕЛЬНЫХ КОМАНДИ СПОСОБОВ АДРЕСАЦИИ

Вэтой главе показано, как реализовать команды и способы адресации, которые невходят в набор команд 8080 или 8085. Конечно, нет выбора команд, которыйвключал бы все возможные комбинации. Разработчик должен выбирать набор команд,исходя из того, сколько кодов операций доступно, насколько легко могут бытьвыполнены дополнительные комбинации и как часто они могут использоваться.Описание дополнительных команд и способов адресации не означает, что основнойнабор команд является неполным или же плохо разработанным.

РАСШИРЕНИЕ НАБОРА КОМАНД

Командыделятся на следующие группы: арифметические, логические, передачи данных,перехода, пропуска, вызова подпрограммы, возврата из подпрограммы и смешанные.Типы операндов для каждого типа команд обсуждаются в соответствующем порядке:байт, слово, десятичный операнд, разряд, число, составной операнд. Приобсуждении способов адресации используется следующий порядок: прямая,косвенная, непосредственная, индексная, регистровая, автоиндексирование спредварительным увеличением адреса, автоиндексирование с предварительнымуменьшением адреса, автоиндексирование с последующем уменьшением адреса,косвенная с предварительным индексированием, и косвенная с последующеминдексированием .

АРИФМЕТИЧЕСКИЕ КОМАНДЫ

Вэту группу включены следующие команды: сложение, сложение с флагом переноса,вычитание, вычитание при перестановке операндов, вычитание с флагом переноса(заем), увеличение на 1, уменьшение на 1, умножение, деление, сравнение,получение дополнения до двух (отрицательного числа) и расширение. Для удобствате команды, принадлежность которых к конкретной категории неясна, повторяютсяво всех категориях, к которым они могли бы быть отнесены.

ЛОГИЧЕСКИЕ КОМАНДЫ

Этагруппа включает следующие команды: логическое И, логическое ИЛИ, логическоеИСКЛЮЧАЮЩЕЕ ИЛИ, логическое НЕ (дополнение), сдвиг, циклический сдвиг ипроверку. Она включает также те арифметические команды (такие, как сложение саккумулятора с самим собой), которые выполняют логические функции.

КОМАНДЫ ПЕРЕДАЧИ ДАННЫХ

Этагруппа включает команды загрузки, запоминания, пересылки, обмена, ввода,вывода, очистки и установки. Кроме того, она включает арифметические команды(такие как вычитание аккумулятора из самого себя), которые заносят определенноезначение или содержимое какого-либо регистра в аккумулятора или другой регистрназначения, не изменяя при этом данных.

КОМАНДЫ ПЕРЕХОДА

Этагруппа включает следующие виды переходов:

 Командыбезусловного перехода

Перейтикосвенно;

Перейтипо индексу, предполагая, что базовый адрес таблицы адресов находится врегистрах Н и L, а индекс в аккумуляторе;

Перейтии связать, т.е. передать управление по адресу DEST, сохранив текущее состояние счетчика команд в регистрах Н и L.

 Командыусловного перехода

Перейтипри равенстве нулю;

Перейтипри неравенстве нулю;

Перейти,если значения равны;

Перейти,если значения не равны;

Перейти,если значение положительное;

Перейти,если значение отрицательное;

Переходыс учетом знака;

Перейти,если больше (без учета знака), т.е. если операнды не равны и при сравнении нетребуется заема;

Перейти,если значение не больше (без учета знака), т.е. если сравниваемые операндыравны или при их сравнении требуется заем;

Перейти,если значение меньше (без учета знака), т.е. если сравнение без знака требуетзаема;

Перейти,если значение не меньше (без учета знака), т.е. если сравнение без знака нетребует заема.

КОМАНДЫ ПРОПУСКА

Вмикропроцессорах 8080 или 8085 команда пропуска может быть выполнена с помощьюкоманды перехода с соответствующем адресом назначения. Этот адрес назначениядолжен указывать на команду, следующую после той, которая стоит непосредственноза командой перехода. Действительное число пропускаемых байтов будет меняться,так как команды микропроцессоров 8080 и 8085 могут иметь длину 1-3 байта.

КОМАНДЫ ВЫЗОВА ПОДПРОГРАММ И ВОЗВРАТА ИЗПОДПРОГРАММ

 Команда безусловного вызова.

Вмикропроцессорах 8080 или 8085 косвенный вызов может быть выполнен с помощьюобращения к промежуточной подпрограмме, которая переходит косвенно навызываемую подпрограмму.

Командаусловного вызова.

Вмикропроцессоре 8080 или 8085 условный вызов подпрограммы  может быть выполненс помощью последовательностей команд для условного перехода. Единственноеотличие состоит в том, что команды перехода к действительным адресам назначениядолжны быть заменены на команды вызова подпрограмм.

Командывозврата из подпрограмм разделяются на:

Командыбезусловного возврата

Командыусловного возврата

Командывозврата с пропуском

Командывозврата после прерывания

СМЕШАННЫЕ КОМАНДЫ

Вэту категорию входят следующие команды: нет операции, запись в стек, получениеиз стека, останов, ожидание, захват (программное прерывание) и другие, непопавшие в описание ранее категории команд.

ДОПОЛНИТЕЛЬНЫЕ СПОСОБЫ АДРЕСАЦИИ

 Косвенная адресация. В процессорах 8080 и 8085 косвенную адресациюможно выполнить с помощью загрузки косвенных адресов в регистры Н и L, используя команду LHLD. После этого обращение к регистру М является эквивалентомкосвенной операции. Таким образом, этот процесс всегда включает два шага. Крометого, можно использовать также пары регистров В и D в командах LDAX  и STAX.

 Индекснаяадресация. Индексную адресацию можно выполнить, добавляя индекс с помощьюкоманды DAD к базе. Понятно, что программное сложениетребует дополнительного времени выполнения.

 Предувеличение.При предувеличении адресный регистр перед использованием автоматическиувеличивается. В процессоре 8080 или 8085 предувеличение может быть реализованос помощью увеличения пары регистров перед ее использованием в качестве адреса.

 Послеувеличение.При послеувеличении адресный регистр после использования в командеавтоматически увеличивается. В процессоре 8080 или 8085 послеувеличение можетбыть реализовано с помощью увеличения пары регистров после ее использования вкачестве адреса.

 Предуменьшение.При предуменьшении адресный регистр перед использованием автоматическиуменьшается. В процессоре 8080 или8085 предуменьшение может быть выполнено спомощью уменьшения пары регистров перед ее использованием в качестве адреса.

 Послеуменьшение.При послеуменьшении адресный регистр после использования автоматическиуменьшается. В процессоре 8080 или 8085 Послеуменьшение может быть выполнено спомощью уменьшения пары регистров после использования ее в качестве адреса.

 Косвеннаяадресация с предварительным индексированием (предындексирование). Припредындексировании процессор должен сначала вычислить индексный адрес, а затемиспользовать этот адрес косвенно. Так как таблица, для которой производитсяиндексирование, должна содержать двухбайтные косвенные адреса, индексированиедолжно сопровождаться умножением на 2.

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

ГЛАВА 3. РАСПРОСТРАНЕННЫЕ ОШИБКИ ПРОГРАММИРОВАНИЯ

Вэтой главе описываются распространенные ошибки в программах на языке ассемблера8080 и 8085. Заключительный раздел данной главы посвящен описанию частовстречающихся ошибок в драйверах ввода-вывода и программах обслуживанияпрерываний. Эта глава преследует следующие цели:

 Предупредитьпрограммиста о возможных неприятных местах и источниках ошибок,

 Описатьвероятные источники ошибок программирования,

 Подчеркнутьте методы и предостережения, которые обсуждались в главах 1 и 2,

 Информироватьпрограммистов, занимающихся поддержкой математического обеспечения, о возможныхместах ошибок и неправильных толкований,

 Датьначинающему программисту отправную точку в трудном процессе обнаружения иисправления ошибок.

Конечно,никакой список ошибок не может быть полным, тем не менее, данное в этой главеописание поможет читателю отлаживать большинство программ.

КЛАССИФИКАЦИЯ ОШИБОК ПРОГРАММИРОВАНИЯ

Рассмотренныеошибки программирования для микропроцессоров 8080 и 8085 могут быть разделенына следующие категории:

 Перестановкаоперандов ли частей операндов. К типичным ошибкам этого рода относятсяперестановка операндов, указывающих на источник и назначение в командахпересылки, перевертывание формата, в котором запоминаются 16-разрядныезначения, изменение направления при вычитаниях и сравнениях.

 Неправильноеиспользование флагов. Типичные ошибки следующие:

 использованиене того флага, который в данном конкретном случае должен проверяться (как,например, флага знака вместо флага переноса),

условныйпереход после команд, которые не воздействуют на данный флаг,

инвертированиеусловий перехода (особенно при использовании флага нуля),

неправильныйусловный переход в случаях равенства и случайное изменение флага перед условнымпереходом.

 Смешиваниерегистров и пар регистров. Типичная ошибка состоит в работе с регистром (В, D или Н) вместо пары регистров с аналогичным именем.

 Смешиваниеадресов и данных. К типичным ошибкам относятся использование непосредственнойадресации вместо прямой адресации или наоборот, смешивание регистров с ячейкамипамяти, адресуемыми через пары регистров.

 Использованиеневерных форматов. Типичные ошибки состоят в использовании формата BCD (десятичного) вместо двоичного илинаоборот и использование двоичного и шестнадцатеричного кода вместо ASCII.

 Неправильнаяработа с массивами. Обычная ошибка состоит в выходе за границы массивов.

 Неучетнеявных эффектов. К типичным ошибкам относятся использование аккумулятора, парырегистров, указателя стека, флагов или ячеек памяти без учета влиянияучаствующих в работе команд. Большинство ошибок вызываются командами, которыедают непредвиденные, неявные или косвенные результаты.

 Ошибкипри задании необходимых начальных условий для отдельных программ или микро-ЭВМв целом. Большинство программ требует инициализации счетчиков, косвенныхадресов, регистров, флагов и ячеек для временного хранения. Микро-ЭВМ в целомтребует инициализации всех общих ячеек в ОЗУ (особо отметим косвенные адреса исчетчики).

 Неправильнаяорганизация программы. К типичным ошибкам относятся обход или повторение секцийинициализации, ошибочное изменение регистров с адресами или счетчиками и потеряпромежуточных или окончательных результатов.

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

Болеесложные источники конфликтов связаны с системой прерываний, портамиввода-вывода, стеком и флагами. Системные программы в конечном счете должныэксплуатировать те же самые ресурсы, что и программы пользователя. При этомобычно в системных программах предусматривается сохранение и восстановлениепрограммной среды, в которой работают пользовательские программы, но это частоприводит к трудноуловимым или неожиданным последствиям. Сделать такуюоперационную систему, которая была бы совершенно прозрачной для пользователя — это задача, сравнимая с выработкой правил и законов или сводов о налогах,которые не имели бы лазеек или побочных эффектов.

РАСПОЗНОВАНИЕ ОШИБОК АССЕМБЛЕРОМ

Большинствоассемблеров немедленно распознает наиболее распространенные ошибки, такие как:

 Неопределенныйкод операции (обычно это неправильное написание или отсутствие двоеточия илиметки);

 Неопределенноеимя (часто это неправильное написание или отсутствие определенного имени);

 Неверныйсимвол (например, 2 в двоичном числе или В в десятичном числе);

 Неправильноезначение (обычно это число, которое слишком велико для 8 или 16 разрядов);

 Отсутствуетоперанд;

 Двойноеопределение (одному и тому же имени присваиваются два различных значения);

 Недопустимаяметка (например, метка, предписанная псевдооперации, не допускающей метки);

 Отсутствиеметки ( например, при псевдооперации EQU, длякоторой требуется метка).

Этиошибки неприятны, но они легко исправимы. Единственная трудность возникаеттогда, когда ошибка (такая, как отсутствие точки с запятой у строки скомментарием) приводит ассемблер в «замешательство», результатом чегоявляется ряд бессмысленных сообщений об ошибках.

Существует,однако, много простых ошибок, которые ассемблер не может распознать.Программисту следует иметь в виду, что его программа может содержать такиеошибки, даже если ассемблер и не сообщил о них. Типичны следующие примеры.

 Пропущенныестроки.

 Пропущенныеопределения.

 Ошибкив написании, когда запись сама по себе допустима.

 Обозначениекоманд как комментариев.

 Еслив команде, которая работает с парой регистров, задается одинарный регистр.

 Есливводится неправильная цифра, такая как Х в десятичном или шестнадцатеричномчисле или 7 в двоичном числе.

Вассемблере могут распознаваться только такие ошибки, которые предусмотрел егоразработчик. Программисты же часто способны делать ошибки, которые разработчикне мог и вообразить, такие ошибки возможно найти при проверке программ вручнуюстрочка за строчкой.

РАСПРОСТРАНЕННЫЕ ОШИБКИ В ДРАЙВЕРАХ ВВОДА- ВЫВОДА

Таккак большинство ошибок в драйверах ввода-вывода связано как с аппаратурным, таки с программным обеспечением, они трудно поддаются классификации. Приведемнекоторые возможные случаи.

 Смешиваниепортов ввода и вывода.

 Попыткавыполнить операции, которые физически невозможны.

 Упущенныеиз вида неявных эффектов аппаратуры.

 Чтениеили запись без проверки состояния.

 Игнорированиеразличия между вводом и выводом.

 Ошибкапри сохранении копии выводимых данных.

 Чтениеданных до того, как они стабилизируются, или во время их изменения.

 Отсутствиеизменения полярности данных, которые передаются к устройству или от устройства,работающего с отрицательной логикой.

 Смешиваниедействительных портов ввода-вывода с внутренними регистрами интегральных схемввода-вывода.

 Неправильноеиспользование двунаправленных портов.

 Отсутствиеочистки состояния после выполнения команды ввода-вывода.

РАСПРОСТРАНЕННЫЕ ОШИБКИ В ПРОГРАММАХПРЕРЫВАНИЯ

Многиеошибки, связанные с прерываниями, зависят как от аппаратного, так ипрограммного обеспечения. Самыми распространенными ошибками являются следующие.

Отсутствиеразрешения прерываний.

 Отсутствиесохранения регистров.

 Сохранениеили восстановление регистров в неправильном порядке.

 Разрешениепрерываний до инициализации приоритетов и других параметров системы прерываний.

 Неучеттого, что реакция на прерывание включает сохранение счетчика команд в вершинестека.

 Отсутствиезапрещения прерываний во время многобайтных передач или выполненияпоследовательности команд, которая не должна прерываться.

 Отсутствиеразрешения прерываний после последовательности команд, которая должнавыполняться без прерываний.

 Отсутствиеочистки сигнала, вызывающего прерывание.

 Ошибкав общении с основной программой.

 Отсутствиесохранения и восстановления приоритетов.

 Отсутствиеразрешения прерываний от дополнительных аппаратурных входов, котороевыполняется с помощью очистки разрядов масок в регистре I.

 Неправильноеиспользование разрядов разрешения прерываний в командах SIM.

ВВЕДЕНИЕ В ПРОГРАММНЫЙ РАЗДЕЛ

Программныйраздел содержит наборы подпрограмм на языке ассемблера для микропроцессоров8080 и 8085. Каждой подпрограмме предпосланы введение и комментарии; за каждойподпрограммой следует по крайней мере один пример ее использования. Введениесодержит следующую информацию: назначение подпрограммы, процедуру еевыполнения, используемые регистры, время выполнения, размер памяти, необходимыйдля программы и ее данных, а также специальные случаи, входные и выходныеусловия.

Каждаяподпрограмма сделана настолько общей, насколько это возможно.

Вовсех подпрограммах был использован следующий метод передачи параметров:

 Первый8-разрядный параметр передается в аккумуляторе, второй 8-разрядный параметр-регистре В, а третий- в регистре С.

 Первый16-разрядный параметр передается в регистрах Н и L, при этом старший байт- в регистре Н. Второй 16-разрядныйпараметр передается в регистрах D и Е со старшимбайтом в D.

 Большеечисло параметров передается в стеке, прямо или косвенно. Считается, что вход вподпрограмму осуществляется с помощью команды CALL, которая помещает адрес возврата в вершину стека и,следовательно, выше параметров.

Длябольшинства коротких подпрограмм было определено время выполнения.

Приведеннаяздесь документация всегда содержит по крайней мере один типовой пример,показывающий приблизительное или максимальное время выполнения.

Приводятсяследующие подпрограммы:

 Преобразованиекодов

 Преобразованиедвоичных данных в код BCD;

 Преобразованиеданных в коде BCD в двоичные;

 Преобразованиедвоичных данных в шестнадцатеричные в коде ASCII;

 Преобразованиешестнадцатеричных данных в коде ASCII вдвоичные;

 Преобразованиедвоичного числа в десятичное к коде ASCII;

 Преобразованиедесятичного числа в коде ASCII вдвоичное;

 Трансляциястрочных букв в прописные;

 Преобразованиекода символа из системы ASCII в систему EBCDIC;

 Преобразованиекода символа из системы EBCDIC в системуASCII.

 Работас массивами и индексирование

 Заполнениепамяти;

 Пересылкаблоков;

 Индексированиедвухмерного массива байтов;

 Индексированиедвухмерного массива слов;

 ИндексированиеN- мерного массива;

Арифметическиеоперации

 16-разрядное вычитание;

 16-разрядное умножение;

 16-разрядное деление;

 16-разрядное сравнение;

 Двоичноесложение с повышенной точностью;

 Двоичноевычитание с повышенной точностью;

 Двоичноеумножение с повышенной точностью;

 Двоичноеделение с повышенной точностью;

 Двоичноесравнение с повышенной точностью;

 Десятичноесложение с повышенной точностью;

 Десятичноевычитание с повышенной точностью;

 Десятичноеумножение с повышенной точностью;

 Десятичноеделение с повышенной точностью;

 Десятичноесравнение с повышенной точностью;

 Работас разрядами и сдвиги

 Установкаразряда;

 Очисткаразряда;

 Проверкаразряда;

 Выделениеполя разрядов;

 Записьполя разрядов;

 Арифметическийсдвиг вправо с повышенной точностью;

 Логическийсдвиг влево с повышенной точностью;

 Логическийсдвиг вправо с повышенной точностью;

 Циклическийсдвиг вправо с повышенной точностью;

 Циклическийсдвиг влево с повышенной точностью;

 Работасо строками

 Сравнениестрок;

 Объединениестрок;

 Поискпозиции подстроки;

 Копированиеподстроки из строки;

 Удалениеподстроки из строки;

 Вставкаподстроки в строку;

 Операциис массивами

 Суммирование8-разрядного массива;

 Суммирование16-разрядного массива;

 Поискминимального элемента длиной 1 байт;

 Поискмаксимального элемента длиной 1 байт;

 Двоичныйпоиск;

 Быстраясортировка;

 ТестОЗУ;

 Таблицапереходов;

 Ввод- вывод

 Чтениестроки с терминала;

 Записьстроки на устройство вывода;

 Проверкаи генерация 16-разрядного кода контроля по избыточности;

 Диспетчертаблицы устройств ввода — вывода;

 Инициализацияпортов ввода — вывода;

 Задержкав миллисекундах;

 Прерывания

 Небуферизованныйввод — вывод о прерываниям с использованием программируемого интерфейса связи8251;

 Небуферизованныйввод — вывод о прерываниям с использованием программируемого параллельногоинтерфейса 8255;

 Буферизованныйввод — вывод о прерываниям с использованием программируемого интерфейса связи8251;

 Часыреального времени и календарь

АРИФМЕТИЧЕСКИЕ ОПЕРАЦИИ

Шестнадцатиразрядноевычитание

Вычитаютсядва 16-разрядных числа. При этом флаг переноса действует как заем.

Процедура.Просто из уменьшаемого вычитается вычитаемое по одному байту за один раз,начиная с младших байтов. При вычитании старших байтов учитывается заем. Привычитании старших байтов устанавливаются флаги.

Шестнадцатиразрядноеумножение

Умножаютсядва 16-разрядных операнда и возвращается младшее по значению слово(16-разрядное) произведения.

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

Шестнадцатиразрядноеделение

Делятсядва 16-разрядных операнда и возвращается частное и остаток. Имеются две входныеточки: SDIV16 делит два 16-разрядных операнда сознаками, в то время как    USDIV16 делитдва 16-разрядных операнда без знаков. При делении на 0 флаг переносаустанавливается в 1, а частное и остаток равны 0; в противном случае флагпереноса очищается.

Процедура.Если операнды имеют знаки, то определяется знак частного и берутся абсолютныезначения отрицательных операндов. Кроме того, должен сохраняться знак делимого,так как он определяет знак остатка. Затем с помощью алгоритма сдвигов ивычитания выполняется беззнаковое деление. Частное и делимое сдвигаются влево,при этом каждый раз, когда пробное вычитание было успешным, единичный разрядпомещается в частное. Если операнды имели знаки, то программа должна превратитьв отрицательное число (т.е. вычесть из 0) частное или остаток, если только онидолжны быть отрицательными. При делении без ошибок флаг переноса очищается, апри делении на 0 — устанавливается. Кроме того, если делитель равен 0, точастное и остаток также равны 0.

Шестнадцатиразрядноесравнение

Сравниваютсядва 16-разрядных операнда и соответствующим образом устанавливаются флаги. Флагнуля всегда указывает, были ли операнды равны. Если операнды были беззнаковые,то флаг переноса указывает, какой из них больше (флаг переноса = 1, есливычитаемое больше, и 0 — в противном случае). Если операнды имеют знаки, то флагзнака указывает, какой из них больше (флаг знака равен 1, если вычитаемоебольше, и 0 — в противном случае); при этом учитывается переполнение подополнению до двух, и если оно происходит, то флаг знака инвертируется.

Процедура.Сначала проверяется, может ли произойти переполнение по дополнению да двух. Этовозможно только в том случае, если знаки операндов различаются. Еслипереполнение по дополнению до двух возможно, то вычитается младший байтвычитаемого из уменьшаемого. Если младшие байты равны, то устанавливаются тоустанавливаются флаги по результату вычитания старших байтов. Если младшиебайты не равны, перед выходом должен очистится флаг нуля (с помощью логическойоперации ИЛИ с 1,  но при неизменных остальных флагах). Если переполнение подополнению до двух может произойти, то устанавливается флаг знака по знакууменьшаемого. Это выполняется с помощью загрузки в аккумулятор старшего байтауменьшаемого перед установкой флага знака.

Двоичноесложение чисел с повышенной точностью

Складываютсядва многобайтовых двоичных числа. Числа хранятся в памяти таким образом, что ихсамые младшие по значению байты занимают самые младшие адреса. Сумма заменяетпервое слагаемое.

Процедура.Сначала очищается флаг переноса, а затем складываются операнды, по байту за раз,начиная с самых младших по значению байтов. В конце флаг переноса отражаетрезультат сложения самых старших байтов. Длина 0 вызывает немедленный выход безсложения.

Двоичноевычитание чисел с повышенной точностью

Вычитаютсядва многобайтовых беззнаковых двоичных числа. Оба числа хранятся в памяти такимобразом что их самые младшие по значению байты занимают самые младшие адреса.Разность замещает уменьшаемое. Длина чисел равна 255 байт или меньше.

Процедура.Сначала очищается флаг переноса, а затем вычисляются операнды, по байту за одинраз, начиная с самых младших по значению байтов. В конце флаг переноса отражаетрезультат вычитания самых старших байтов. Длина 0 вызывает немедленный выходбез вычитания.

Двоичноеумножение чисел с повышенной точностью

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

Процедура.Используется обычный механизм сложения и сдвигов, при котором множимоедобавляется к частичному произведению каждый раз, когда в множителе находитсяединичный разряд. Промежуточное произведение и множимое сдвигаются на числоразрядов в множимом плюс один; этот дополнительный цикл сдвигает окончательныйфлаг переноса в произведении. Полное беззнаковое промежуточное произведениедвойной длины хранится в ячейках памяти и в множимом. Длина 0 вызываетнемедленный выход без умножения.

Двоичноеделение чисел повышенной точности

Делятсядва многобайтовых беззнаковых двоичных числа. Оба числа хранятся в памяти такимобразом что их самые младшие по значению байты занимают самые младшие адреса.Частное замещает делимое; адрес младшего по значению байта остатка находится врегистрах H и L. Длина чисел равна 255 байт или меньше. Если нет ошибок, флагпереноса очищается; при попытке деления на ноль флаг переноса устанавливается в1, делимое остается без изменения, а остаток равен 0.

Процедура.С помощью обычного алгоритма сдвигов и вычитания осуществляется деление, приэтом сдвигается частное и делимое и 1 помещается в делимое каждый раз, когдавычитание успешно. Результат пробного вычитания хранится в дополнительномбуфере; если пробное вычитание успешно, то указатели этого буфера и буфераделимого просто переключаются (т.е. буферы меняются местами). Еслиопределяется, что делитель равен нулю, немедленно осуществляется выход изпрограммы и устанавливается флаг переноса. В противном случае флаг переносаочищается.

Двоичноесравнение чисел с повышенной точностью

Сравниваютсядва многобайтовых беззнаковых двоичных числа и соответствующим образомустанавливаются флаги. Флаг нуля всегда указывает, были ли операнды равны. Еслиоперанды были беззнаковые, то флаг переноса указывает, какой из них больше(флаг переноса = 1, если вычитаемое больше, и 0 — в противном случае). Флагпереноса устанавливается в 1, если вычитаемое больше уменьшаемого; в противномслучае флаг переноса очищается. Таким образом, флаги устанавливаются так же,как если бы вычитаемое вычиталось из уменьшаемого.

Процедура.Сравниваются операнды побайтно, начиная с самых старших байтов и продолжая дотех пор, пока не будут найдены неравные соответствующие байты. Если все байтыравны, осуществляется выход с флагом нуля, установленном в 1. Заметим, что писравнении работа происходит с операндами, начиная с самых старших байтов, в то времякак при вычитании — начиная с самых младших.

ЗАКЛЮЧЕНИЕ

Проанализировавпредставленную к рассмотрению книгу Ланс А. Левенталь, Уинтроп Сэйвилл«Программирование на языке ассемблера для микропроцессора 8080 и8085» выделим достоинства данной публикации:

 материализложен в хорошо структурированной форме;

 авторымногократно повторяют некоторые части материала для лучшего усвоения;

 книгаснабжена подробным указателем, словарем терминов и приложениями.

Кнедостаткам данной книги можно отнести следующее:

 принаписании Программного раздела применялись стандартные и общеизвестныеалгоритмы вычислений;

 некоторыечасти описаний даны слишком сжато и предназначены для программистов имеющихопыт в написании программ на языке ассемблера;

 отсутствуетприложение с обобщающим описанием мнемоники команд и кратким пояснениемвыполняемых действий — необходимое для программистов начального уровня.

Понашей оценке книга предназначена для опытных программистов, желающих получитьсведения для использования микропроцессоров 8080 или 8085 в прикладных целях.

Списоклитературы

Дляподготовки данной работы были использованы материалы с сайта  www.ed.vseved.ru/

еще рефераты
Еще работы по информатике, программированию