Программирование для микропроцессоров
Чтобы обработать информацию на микрокомпьютере, нужно шаг за шагом описать весь процесс обработки. Такое описание называется программой. Реальная программа, выполняемая микрокомпьютером, должна состоять только из тех команд, которые предусмотрены его конструкцией. Совокупность этих команд составляет так называемый машинный язык, или язык машинных команд данного компьютера. Как мы видели в гл. 4, команды, выполняемые аппаратурой микропроцессора, довольно просты и немногочисленны. И тем не менее вычислительные возможности микропроцессора, как и любого другого компьютера, вообще говоря, не ограничены, поскольку эти команды можно объединять в программы. Совокупность программ, написанных для микрокомпьютера, составляют его программное обеспечение. В этой главе мы рассмотрим программирование для микрокомпьютеров. Основное внимание будет уделено программированию на языке машинных команд описанных в предыдущей главе иллюстративного микропроцессора. На примере нескольких программ мы познакомимся с основными приемами программирования и попутно глубже поймем работу микропроцессора и пределы его возможностей. В заключение будут рассмотрены такие средства программирования, как ассемблеры и компиляторы. Ассемблеры выполняют трансляцию на машинный язык программ, написанных в символической форме, близкой к машинному языку. Компиляторы — это трансляторы для языков высокого уровня.
Программирование на машинном языке Как уже говорилось, программа должна быть представлена в той форме, в какой ее воспринимает машина. В частности, команды должны быть представлены в виде последовательностей из нулей и единиц, поскольку это единственно понятная аппаратуре форма. Однако выписывать длинные последовательности из нулей и единиц довольно утомительно. Поэтому при записи команд применяется более удобная шестнадцатеричная система.
Между шестнадцатеричной и двоичной системами счисления преобразования выполняются очень легко. Каждая группа из 4 двоичных цифр соответствует ровно одной шестнадцатеричной цифре. Поэтому, если не оговорено противное, все программы на машинном языке в этой книге мы будем записывать шестнадцатеричными цифрами. Например, трехбайтовая команда нашего иллюстрированного процессора, загружающая в аккумулятор содержимое ячейки памяти с адресом 0110 1111 1101 10112, имеет вид В шестнадцатеричных обозначениях эта команда запишется как 6F DB Тем не менее и двоичное, и шестнадцатеричное представление машинного языка неудобно и ненаглядно для человека. Поэтому, как правило, команды представляются в символической форме — используются легко запоминаемые мнемонические обозначения команд. Например, в соответствии с табл. 2 предыдущую команду можно записать в виде LDR 0 6F DB Второй и третий байты по-прежнему записаны шестнадцатеричными цифрами, и аккумулятор задан своим номером среди общих регистров, равным 0. Однако операция обозначена трехбуквенным мнемоническим именем LDR. В приложении приведены для справок две таблицы П1 и П2, в которых устанавливается соответствие между шестнадцатеричной и символической формой команд иллюстративного микропроцессора. Теперь введем соглашение, которое будет действовать и далее. Все программы для нашего микропроцессора, если не сделано особых оговорок, мы будем записывать в символической форме. Таким образом, первый байт каждой команды будет выглядеть, как в табл. 2 (или П1 и П2). Номера общих регистров в командах мы будем задавать одной шестнадцатеричной цифрой, причем F16 будет обозначать косвенную адресацию. И наконец, значение второго и третьего байта в командах мы также будем задавать шестнадцатеричными цифрами.
Проиллюстрируем теперь наши соглашения на примере небольшой программы, в которой к числу, находящемуся в ячейке 000А16 главной памяти, прибавляется шестнадцатеричная константа ЗС. Программа приведена в табл. 5.1. Она выполняется следующим образом. Прежде всего подается внешний импульс на линию «сброс», по которому на программный счетчик устанавливается 0. Затем подается импульс на линию «пуск», и начинается выполнение программы. Выбираются 3 байта, составляющие первую команду, и программный счетчик увеличивается на 1 после выборки каждого байта. Первая команда пересылает содержимое ячейки памяти 000А в аккумулятор. Поскольку программный счетчик продвинулся на 3 единицы, он теперь содержит 0003. Это адрес следующей команды — загрузки регистра с непосредственным адресом. Команда содержит в себе операнд и удобна для задания константы. Ее выполнение приводит к засылке значения ЗС, содержащегося во втором байте команды, в общий регистр 1, Теперь программный счетчик содержит 0005, т. е. адрес третьей команды. Ее выборка и выполнение приводят к прибавлению содержимого регистра 1 к содержимому аккумулятора и занесению суммы в аккумулятор. Следующая команда передает содержимое аккумулятора в ячейку памяти 00В. Последняя команда останавливает микропроцессор, Таблица 5.1 Пример программы: «прибавить константу к числу в памяти и записать результат снова в память»
Разветвления в программах Одно из наиболее мощных свойств компьютеров заключается в их способности принимать решения в ходе выполнения программы. Эти решения принимаются в зависимости от простых условий, сложившихся на данный момент. Обычно в результате принятия решения либо сохраняется последовательный порядок выполнения программы, либо происходит переход на другую часть программы. Сложные решения реализуются в виде нескольких простых разветвлений. Чтобы пояснить сказанное, рассмотрим программу, которая выбирает наибольшее из трех 8-битовых целых положительных чисел х, у и z. Сначала определяется наибольшее из двух чисел х и у путем вычитания второго из первого и проверки заема в старший разряд. Отсутствие заема говорит о том, что х больше или равен у. С другой стороны, присутствие такого заема означает, что у больше х. Затем аналогичным образом отыскивается наибольшее из двух чисел: z и найденного ранее наибольшего из х и у.
На рис. 5.1. описанная выше процедура представлена в виде диаграммы. Такие диаграммы называются блок-схемами. Они весьма удобны для построения схемы вычисленного процесса. Программа, решающая нашу задачу, приведена в табл. 5.2. Предполагается, что три исходных числа х, у и z расположены в ячейках 001В, 001С и 001D. Программа должна поместить наибольшее число в аккумулятор. Первая команда программы загружает х в аккумулятор, а вторая помещает у в общий регистр 1. Затем осуществляется их сравнение путем вычитания у из х. Если у строго больше х, тогда возникает заем в старший разряд, который сохраняется в виде единицы в триггере переноса С. Однако еще до проверки переноса С значение х как «пробное» наибольшее из х и у загружается в регистр 2. Эта загрузка не влияет на состояние триггера переноса С.
Рис. 5.1. Блок-схема программы выбора наибольшего из трех положительных чисел x, y и z
Таблица 5.2
Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|