Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Программирование для микропроцессоров




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

Как мы видели в гл. 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

Пример программы: «прибавить константу к числу в памяти и записать результат снова в память»

 

Номер ячейки памяти (шест-надцатерич-ный) Команда на машин­ном языке Команда в символиче­ской форме Комментарий
    LDR 0 Передача содержимого ячейки памяти
      000 А в аккумулятор
   
    LRI 1 Загрузка в регистр 1 величины 3С
  ЗС ЗС  
    ADD 1 Сложение регистров 0 и 1, сумма в аккумуляторе
    SТR 0 Передача содержимого аккумулятора
      в ячейку 000В
  OB  
  FA HLT Останов программы
000А     Исходное число
000В     Сумма

 

 

Разветвления в программах

Одно из наиболее мощных свойств компьютеров заключается в их способности принимать решения в ходе выполнения программы. Эти решения принимаются в зависимости от простых условий, сложившихся на данный момент. Обычно в результате принятия реше­ния либо сохраняется последовательный порядок выполнения прог­раммы, либо происходит переход на другую часть программы. Слож­ные решения реализуются в виде нескольких простых разветвлений. Чтобы пояснить сказанное, рассмотрим программу, которая вы­бирает наибольшее из трех 8-битовых целых положительных чисел х, у и z. Сначала определяется наибольшее из двух чисел х и у путем вычитания второго из первого и проверки заема в старший разряд. Отсутствие заема говорит о том, что х больше или равен у. С другой стороны, присутствие такого заема означает, что у больше х. Затем аналогичным образом отыскивается наибольшее из двух чисел: z и найденного ранее наибольшего из х и у.

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

Программа, решающая нашу задачу, приведена в табл. 5.2. Пред­полагается, что три исходных числа х, у и z расположены в ячейках 001В, 001С и 001D.

Программа должна поместить наибольшее число в аккумулятор. Первая команда программы загружает х в аккумуля­тор, а вторая помещает у в общий регистр 1. Затем осуществляется их сравнение путем вычитания у из х. Если у строго больше х, тогда возникает заем в старший разряд, который сохраняется в виде еди­ницы в триггере переноса С. Однако еще до проверки переноса С значение х как «пробное» наибольшее из х и у загружается в регистр 2. Эта загрузка не влияет на состояние триггера переноса С.

 

 

Рис. 5.1. Блок-схема программы выбора наибольшего из трех положительных чисел x, y и z

 

 

Таблица 5.2

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...