Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


ПРОГРАММИРОВАНИЕ МИКРОПРОЦЕССОРОВ



1. Цель работы: изучить особенности программирования микропроцессоров биотехнических систем.

 

В результате самостоятельного изучения материалов и выполнения практических занятий студент должен овладеть следующей структурной составляющей в рамках общих компетенций ОК8 и ПК3:

Знать: типовую структуру микропроцессора и базовую систему его команд

Уметь составлять простые арифметические программы линейного и разветвляющегося типов на языке микропроцессора

Владеть общими представлениями о роли микропроцессорной техники в биотехнических системах.

 

2. Информационные материалы к занятию.

 

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

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

Перед первыми разработчиками современных средств вычислительной техники стояла достаточно серьезная проблема - как считать. Человечеству известно достаточно много различных систем вычислений (счислений1). Например, известна двенадцатеричная система счисления (счет дюжинами, английская система мер 1 фут=12 дюймов). В древнем Вавилоне существовала достаточно сложная шестидесятеричная система счисления, которая сохранилась в современном мире (1 час= 60 мин, 1 мин = 60 с, 1°=60 мин и т.д.). У древних ацтеков и народов Майя существовала двадцатеричная система счисления. Наша десятичная система возникла в Индии, а в Европу была перенесена арабами, поэтому у нас она называется Арабской системой счисления. Некоторые племена Австралии и Полинезии использовали двоичную систему счисления. В ходе развития технических средств вычислений механического, а затем и электронного типа человечество остановилось на двоичной системе счисления, в которой используется только два символа 0 и 1, а различные цифры, (впоследствии другая полезная информация, например, буквы) кодируется набором нулей и единиц.

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

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

С технической точки зрения для хранения одного разряда двоичного кода используется электронное устройство называемое триггером (ячейкой памяти). В простейшем случае триггер состоит из двух транзисторов со специально организованными связями и узлами управления, с помощью которых транзисторы переводятся в два хорошо различимых состояния (открыт, закрыт). Открытому состоянию транзистора соответствует практически нулевой потенциал на выходе транзистора, закрытому состоянию соответствует высокий (почти напряжение питания) потенциал на выходе транзистора и триггера в целом. Обычно договариваются, что открытому состоянию транзистора соответствует двоичный код – 0, закрытому состоянию двоичный код – 1. По цепям управления триггера имеется возможность управлять состоянием триггера. То есть переводить его из состояния 1 в состояние 0 и наоборот. При отсутствии управляющих воздействий триггер не меняет своего состояния, то есть хранит информацию о том, в какое состояние он установлен. Подробно способы построения и управления триггерами различных типов и назначений рассматриваются в курсе электроники. В качестве примера на рис 1 приведено условное обозначение простого так называемого R-S триггера «Т», у которого имеется два управляющих входа: установки в «0» (вход R) и установки в «1» (вход S).

 

Рис. 4.1. Условное обозначение R-S триггера.

 

Установка триггера производится следующим образом. Если на вход S подать электрический сигнал соответствующий напряжению единицы, на вход R подать сигнал соответствующий напряжению нуля, то на выходе Q, называемом прямым, устанавливается состояние «1», а на выходе , называемом инверсным выходом, устанавливается состояние «0». Если поменять местами напряжения на входах R и S, то на выходе Q устанавливается состояние «0», а на выходе состояние единицы. Если на обоих входах R и S установить низкий потенциал, то триггер будет хранить ту информацию, которая была записана ранее. Ситуация, когда на оба входа подается высокий потенциал для триггера, представленного на рис 1, является запрещенной.

Если в одном устройстве объединить несколько триггеров с элементами управления, то организуется схема хранения нескольких двоичных разрядов. Такая схема с элементами управления называется регистром (рис. 4.2.).

 

Рис. 4.2. Условное обозначение 4х разрядного регистра без инверсных выходов с двумя управляющими входами.

 

В примере, изображенном на рис 2 двоичный код, который следует передать (записать) в регистр (условное обозначение RG или Рг), устанавливается на входах D1,..., D4. Чтобы этот код был принят в регистр надо подать импульсный сигнал ( ) на вход записи V. Тогда этот код установится на выходах Q1, …, Q4 (прямые выходы триггеров регистра), и будет храниться там до тех пор, пока на входы D1,..., D4 не будет подан новый код, который должен быть обязательно сопровожден импульсом записи на входе V. Содержимое регистра может быть «стерто» с установлением на его выходах кода «0000» при подаче импульса на вход установки в «ноль» - R.

Если в одном устройстве (микросхеме) объединяются множество регистров со схемами управления и выбора нужного регистра (схема адресации), то такое устройство называют запоминающим (рис.4.3.).

Рис. 4.3. Условное обозначение оперативного запоминающего устройства.

 

Чтобы выбрать одну ячейку памяти (эквивалент регистра) на адресные входы запоминающего устройства необходимо подать двоичный код адреса (например код 0000 на входах А0,..., А3 выбирает первую четырехразрядную ячейку памяти, код 0010 выбирает третью ячейку памяти и т.д.).

Чтобы в выбранную ячейку памяти записать число необходимо на входы адреса А0,..., А3 подать код адреса, на входах D0,..., D3 установить четырехразрядный код записываемого числа, а на вход V2 установить импульс записи. Чтобы из выбранной ячейки памяти передать соответствующие данные на выходы Q0,..., Q3 необходимо на входы А0,..., А3 подать код адреса ячейки и на вход V1 подать импульс или потенциал чтения.

Одним из центральных узлов микропроцессоров и микроконтроллеров является арифметико-логическое устройство (АЛУ), которое преобразует двоичные коды данных, поданных на его входы в соответствии с командами, хранимыми в различных типах запоминающих устройств. Каждой команде соответствует свой двоичный код, получив который устройство управления (УУ) организует систему управляющих сигналов реализующих требуемую операцию. Например, при реализации операции сложения устройство управления должно организовать по адресу первого числа его выбор и запись в один из регистров подключаемый к АЛУ, выбрать второе число из памяти и передать его в АЛУ, организовать выполнение операции сложения и затем запись результата либо во внутренние регистры «привязанные» к АЛУ, либо в заданную ячейку внешней памяти. Из приведенного описания видно, что АЛУ, которое кроме операции сложения реализует достаточно много (сотни) операций и УУ представляют собой достаточно сложные электронные устройства. Обобщенная структурная схема АЛУ приведена на рис.4.4.

Рис. 4.4. Структурная схема АЛУ

 

В вычислительной технике обрабатываемые данные принято называть операндами. В ходе обработки операндов х и у, в соответствии с законами определяемыми кодами команд, на выходах АЛУ формируется результат и коды признаков операций. Коды признаков операций позволяют значительно расширить возможности вычислительных устройств.

Рассмотрим простой пример преобразования данных в АЛУ при выполнении операции сложения.

Для одного разряда в двоичном сложении, как и в десятичной системе счисления, используются разряды двух операндов хi, уi и перенос из предыдущего разряда Рi-1 (i – номер разряда).

В ходе выполнения операций образуется результат Zi и перенос в последующие разряды Рi+1. Удобно результат выполнения операции сложения представлять в виде следующей таблицы.

Таблица 4.1

Таблица выполнения операции сложения

хi yi Pi-1 Zi Pi+1

 

Для того, чтобы учесть все возможные входные комбинации в левой части таблицы выписываются все возможные сочетания входных переменных. Понять закон получения значений Zi и Pi+1 легко, проведя аналогию с законами сложения десятичных чисел. Зная закон сложения для одного разряда можно организовать сложение много разрядных чисел.

Пример сложения двух 4х разрядных чисел

Работу над четырехразрядными числами осуществляет четырехразрядное арифметическое устройство. При этом, как видно из примера, в старшем (четвертом) разряде АЛУ будет сформирован результат 0, что будет практически неверный результат, если не учесть перенос из четвертого разряда дальше. В рамках специальных курсов будут изучаться вопросы выполнения арифметических и логических операций с двоичными числами и их перевод в другие системы счисления. Здесь, чтобы понять масштабы получаемой погрешности, приведем десятичный эквивалент получаемого четырехразрядного результата:

10+11=5

 

Результат абсурдный, тогда как с учетом переноса образуется пятиразрядный двоичный код 10101 соответствующий верному результату – десятичному числу 21.

 

.

 

Сохранить точность вычислений можно увеличив разрядность АЛУ, но если это невозможно, то можно использовать последовательное соединение 4-х разрядных АЛУ или последовательное вычисление операций сначала с младшими разрядами четырехразрядных чисел, а потом с более старшими.

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

Кроме этого выделяются провода, на которых формируются коды единицы, если:

- результат выполнения операции равен нулю;

- результат операции отрицательный;

-результат операции положительный и тд.

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

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

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

 

 

Такая операция несколько напоминает операцию округления чисел. Точность вычисления несколько снижается, но часто с этим можно мириться.

 

Простой пример использования кодов признаков операций.

 

В ходе мониторинга за состоянием частоты сердечных сокращений (ЧСС) необходимо, чтобы микроконтроллер зажег красную лампочку тревоги, если ЧСС превысит 140 уд/мин.

Для решения такой задачи человек пишущий программу для микроконтроллера выбирает ячейку памяти, в которую периодически будет записываться текущее значение ЧСС. Обозначим условно адрес этой ячейки памяти через а1. В ячейку памяти а2 следует записать константу 140. Программист располагает программу включения красной лампочки в памяти так, что начало этой программы (первая команда программы) располагается в строго определенном месте, например в ячейке с адресом а400.

В наборе команд микроконтроллера обязательно есть команды вычитания (ВЫЧ) и команда перехода по адресу аi (ПО аi), если результат вычисления команды АЛУ отрицательный.

При такой системе команд программа включения красной лампочки может иметь следующий вид:

................................

а100 ВЫЧ а2, а1 (Вычитание числа записанного в ячейке
памятиа1 из числа, записанного в ячейке
памяти а2)

а101 ПО а400 (Переход к фрагменту программы,

начинающемуся с ячейки а400, если

результат отрицательный)

а102 ... (Адрес команды, которая будет

выполняться, если результат вычитания

положителен (а102101+1))

.................................

а400 (Программа включения красной лампочки)

 

В этом фрагменте а100 и а101 адреса ячеек памяти, где записаны команды ВЫЧ и ПО. Следует помнить, что приведенная запись весьма условна, поскольку в реальных микропроцессорах и микроконтроллерах даже такая простая команда как вычитание имеет различные модификации с различными способами выбора операндов для вычитания.

Для более точного представления о том, как пишутся программы для микропроцессоров и микроконтроллеров на языках низкого уровня, рассмотрим более подробно структуру одного из самых простых микроконтроллеров типа КР580 [4].

Обобщенная структура (достаточная для понимания принципов его программирования) приведена на рис 4.5.

 

Рис. 4.5. Структурная схема микропроцессора КР580

 

Микропроцессор обрабатывает 8-разрядные данные, которыми он обменивается с «внешним миром» по 8-ми разрядным магистралям данных (МД). Магистраль данных, контакты, которой располагаются на корпусе микросхемы, соединена с внутренней магистралью данных через буфер данных (БФД). Важной функцией буфера данных является его способность, передав данные отключать МД от внутренней магистрали, что в свою очередь позволяет не мешать автономной работе внешних устройств, подключенных к микропроцессору и самого микропроцессора, в то время, когда по программам вычислений обмена данными не требуется. По шине данных последовательно подаются команды операций, которые поступают в регистр команд (РгК), и собственно данные, которые поступают на входы АЛУ или в систему внутренних регистров. Внутренние регистры обозначены буквами латинского алфавита от А до L. Иногда отдельно стоящий регистр А называют аккумулятором. Остальные регистры (W, Z, D, C, D, E, H, L) имеют по 8 разрядов. Каждый из них (но одномоментно только один) в соответствии с выполняемой командой может быть подключен к внутренней магистрали специальным устройством называемым мультиплексором. Какой из регистров и как подключать определяет УУ после того, как получит команду, подлежащую исполнению. По специальным командам восьмиразрядные регистры W, …, L могут обрабатывать 16-ти разрядные операнды в регистрах B, D, H, которые образуются объединением пар B-C; D-E; H-L.

Кроме того в секции регистров есть еще три 16-ти разрядных регистра специального назначения. Например, выделяется регистр адреса РА. Регистр РС называется программным счетчиком. РС используется для хранения адреса команды. Содержимое РС автоматически изменяется после выполнения команды, указывая адрес следующей команды. Назначение остальных регистров определено технической документацией на микропроцессор. Результат выполнения операции через АЛУ выдается либо на внешнюю магистраль данных, либо записывает в один из внутренних регистров. Сформированный микропроцессором адрес через буфер адреса (БФА) передается на внешнюю 16-ти разрядную шину адреса. Блок «Флаги АЛУ» позволяет подключать к магистрали данных коды признаков операций и обрабатывать их.

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

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

Таблица 4.2

Шестнадцетиричное кодирование информации

Десятичный код Двоичный код Шестнадцетиричный код
 
 
 
 
 
 
 
 
 
 
  A
  B
  C
  D
  E
  F

 

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

Различные микропроцессоры характеризуются своей системой команд, способом и скоростью их выполнения. В системе команд КР580 выделяют три группы команд. Команды пересылок, команды арифметико-логических операций и команды управления.

 

Команды пересылок передают данные с одного устройства на другое. Команды с мнемокодом MOV организуют пересылки данных между внутренними регистрами A, B, C, D, E, Н и L, и так же между внешней памятью, обозначаемой буквой М и этими же регистрами. Следует обратить внимание на то, что обмен данными между внутренними регистрами микропроцессора отличается от способов обмена данными между внешнейпамятью и внутренними регистрами.

Общая структура команды MOV

MOV [приемник], [источник],

где [приемник] – имя регистра (памяти), куда передаются данные; [источник] – имя регистра, откуда данные берутся.

При обмене между внутренними регистрами двоичный код регистра источника переписывается в регистр с именем приемника. Например команда MOV А, В переписывает содержимое регистра В в регистр А (в аккумулятор). Этой команде разработчики присвоили двоичный код 0111 1000, что в соответствии с таблицей 2 имеет шестнадцетиричное обозначение 78. При выполнении команды MOV A, B её восьмиразрядный код выбранный из внешней памяти по шине данных передается через БФД и внутреннюю шину в регистр команд (РгК) (рис 5). Далее он расшифровывается в устройстве управления, которое организует следующую последовательность действий. С помощью мультиплексора УУ подсоединяет регистр В к внутренней магистрали (МД) и подает на вход записи регистра А импульсный сигнал открывающий регистр А для записи в него содержимого регистра В.

После выполнения команды MOV А, В содержимое регистров А и В становятся одинаковыми. Далее если не будет специальных команд, адрес команды увеличивается на единицу, выбирая из внешнего (по отношению к микропроцессору) устройства следующую команду. То есть команду, адрес которой во внешнем устройстве является следующим (на единицу больше) после команды MOV A, B.

При обмене внешней памяти М с внутренними регистрами адрес ячейки памяти (не данные) для взаимодействия с М определяются содержимым регистров Н и L, причем в регистре Н находится старший байт адреса, а в регистре L – младший. Например по команде MOV В, М будет выполняться следующая последовательность действий. Устройство управления к магистрали адреса через БФА подключит регистры H и L. А затем сформирует сигнал чтения на внешней шине управления. В результате из внешней памяти будет выбрана ячейка с адресом, записанным в регистрах H, L. Далее выходные шины внешней памяти через БФД будут подключены к внутренней МД, а мультиплексор подключит к этой шине регистр В после чего для этого регистра УУ сформирует сигнал записи. Таким образом, содержимое внешней памяти из ячейки с номером, извлеченным из H, L будет переписано в регистр В. Другой пример, по команде MOV M, E число из внутреннего регистра Е переписывается из регистра Е по адресу М, который хранится в регистрах H и L. Таким образом, если производится обмен микропроцессора с внешней памятью, необходимо до команды обмена в регистры Н и L обязательно записать адрес обращения к внешней памяти. Команда MOV с указанием источников и приемников занимает один байт памяти, в котором записывается соответствующий ей код, например команда MOV D, E кодируется шестнадцетиричным кодом 53 (двоичный эквивалент 0101 0011), команда MOV М, L – шестнадцетиричным кодом 75 (двоичный байт 01110101 и т.д.).

Кроме команд пересылка типа MOV оперирующих типами источников и приемников в системе команд КР580 имеются команды пересылок, оперирующих кодами данных или адресов источников и приемников.

Команда типа MVI посылает во внутренние регистры и память, данные записываемые в шестнадцетиричном коде во втором байте команды. Например, команда MVIА, 1Е запишет в регистр А (аккумулятор) число 1Е (0001 1110). Нетрудно видеть, что эта команда двухбайтовая. Один байт – код команды MVIА (шестнадцетиричный код 3Е), второй байт – константа (число) 1Е. Второй пример MVIМ, А0. По этой команде (код 36) константа А0 (двоичный код 1010000) переписывается в ячейку внешней памяти, адрес которой задан в регистрах Н и L.

Команда LXI трёхбайтовая (один байт код команды плюс два байта 16-ти разрядное число). Она обеспечивает запись кодов второго и третьего байтов, указанного после мнемокода команды в соответствующие пары регистров. Например, команда LXID, 12A2 записывает шестнадцати разрядное число 12А2 в спаренный регистр D состоящий из регистров D и Е. Команда LXI PС, 1011 записывает двоичный код 0001 0000 0001 0001 в регистр PС и тд.

Команды группы Load загружают данные в соответствующие группы регистров.

В команде LHLD (код команды 2 А) после мнемокода команды записывается двухбайтовый адрес внешней памяти, из которой будут переданы данные в регистры L и Н. Таким образом, команда LHLD трехбайтовая с адресацией к внешней памяти. Например, команда LHLD21А0 выполняется следующим образом. Вначале из ячейки памяти с адресом 21А0 будут записаны данные в регистр L. Затем из следующей ячейки памяти (21А1 = 21А0+1) будут записаны данные в регистр Н.

Таким образом эта команда может подготовить к выполнению команд MOV с внешней памятью.

Команда типа LDA (код 3А) записывает в аккумулятор (регистр А), данные из внешней памяти, адрес которых указан после мнемокода команды. Например, по команде LDA F100 данные выбранные из внешней памяти по адресу F100 будут переписаны в регистр А.

Команды группы Story данные из регистров переписывают во внешнюю память.

Например, по команде STA 2205 содержимое аккумулятора переписывается в ячейку памяти с адресом 2205 (0010 0010 0000 0101).

С другими типами команд пересылки микропроцессора КР580 можно ознакомиться в справочной литературе и в приложении 1.

Рассмотрим особенности выполнения команд арифметических операций.

В командах арифметического типа один операнд находится в аккумуляторе, а откуда взять второй операнд указывается в конце команды (обычно это внутренние регистры A, B, C, D, E, H, L) и внешняя память М. Причем, как и в операциях с пересылками при работе с внешней памятью её адрес берется из регистров Н и L. Результат выполнения операции отправляется в аккумулятор, стирая то, что там было раньше. Например, команда сложения имеет код ADD. Сложение аккумулятора с регистром В записывается командой ADDВ (шестнадцетиричный код команды 80), сложение аккумулятора с регистром Е записывается командой ADDЕ (код команды 83), сложение аккумулятора с ячейкой внешней памяти, адрес которой хранится в регистрах Н и L обеспечивается командой ADDM.

Послать данные в аккумулятор можно командой LDA, а сохранить содержимое аккумулятора во внешней памяти командой STA.

Вычитание из содержимого аккумулятора выполняется командой SUB, например SUBН, SUBМ и т.д. Команды INR и DCR соответственно увеличивают и уменьшают на единицу содержимое указанного в команде регистра или ячейки памяти (адрес в регистрах Н и L). Все арифметические команды однобайтовые.

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

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

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

По командам условного перехода передача управления выполняется только тогда, когда выполняется некоторое условие, сопровождающееся установкой в единицу соответствующего регистра признаков по флагам АЛУ. К этим условиям в микропроцессоре КР580 относятся: С – перенос из старшего разряда; Z- результат операции равен нулю; М – результат операции отрицателен, Р – результат положителен; F – результат операции – четное число.

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

Рассмотрим примеры организации переходов по командам условных переходов типа Jump. При записи мнемокода этой группы команд первая бука J, вторая и последующие буквы – условия перехода. Например, JZ – переход по нулевому результату; JM – переход по отрицательному результату и т.д.

Запись JZ 2EF0 означает, что если результат вычислений будет равен нулю, то следующей будет выполняться команда с адресом 2ЕF0 (в двоичном коде 0010 1010 1111 0000). Эта команда трехбайтовая. Один байт – код команды плюс два байта шестнадцатиразрядного адреса.

Команда HLT останавливает работу микропроцессора.

В командах этого и многих других микропроцессоров нет многих очень важных команд умножения, деления и т.д. Для организации этих операций необходимо написать соответствующие программы. Например, операция умножения выполняется многократным сложением, деление – многократным вычитанием и т.д. Очевидно, что каждый раз писать такие программы заново очень трудоемко, требует специальных навыков и совершенно не выгодно. Гораздо целесообразнее один раз написать программу и хранить её в составе стандартного программного обеспечения и затем, по мере необходимости, обращаться к нужным стандартным программам с автоматическим возвратом в основную программу. Организованные таким образом стандартные программы называют подпрограммами. Обращение к ним организуется по команде CALL, в которой указывается адрес первый выполняемой команды подпрограммы. Если таких подпрограмм много, то трудно запомнить все их начальные адреса. Поэтому, для наиболее распространенных подпрограмм адреса записывают в виде хорошо запоминающихся символов, которые автоматически переводятся в физический адрес. Например, для вызова подпрограммы умножения выполняют команду CALL MUL.

 

Рассмотрим примеры программирования микропроцессора КР580 в мнемокодах и машинных кодах.

 

Пример 1. К числу, расположенному в ячейке памяти с адресом 08А1 прибавить единицу и результат отправить в ячейку с адресом 03Е1.

Решение. С учетом того, что арифметическая операция выполняется с участием аккумулятора (регистра А) необходимо число из ячейки с номером 08А1 переслать в регистр А. Выбор чисел по заданному адресу осуществляется командой пересылки типа LDA. Далее необходимо к числу, находящемуся в аккумуляторе прибавить единицу (команда INR). Отправка результата из регистра А по заданному адресу осуществляется командой STA. После этого работа программы может быть остановлена командой HLT.

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

 

Программа 1

< Мнемокод> Комментарий

LDA 08A1 В регистр А переписывается число из ячейки 08А1

INR A К содержимому регистра А прибавляется1

STA 03E1 Содержимое регистра А записывается в ячейку 03Е1

HLT Остановка

 

Чтобы эта программа выполнялась микропроцессором, она размещается во внешней памяти по адресам, выбранным программистом. Память восьмиразрядная. Поэтому каждая из этих команд занимает больше чем один байт (двухбайтовые и трехбайтовые команды). Они должны размещаться в нескольких следующих друг за другом байтах. Например, команда LDA 08A1 занимает три байта (1 байт – код команды - 3А; второй байт – младший байт адреса А1; третий байт – старший разряд адреса 08).

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

 

Таблица 4.2

Размещение программы 1 в памяти

 

Шестнадцетиричный адрес Шестнадцетиричный код Комментарий
Код команды LDA
А1 Младший байт адреса
Старший байт адреса
Код команды INR
Код команды SТA
Е1 Младший байт адреса
Старший байт адреса
Код команды HLT

 

В таблице 4.2 размещение программы для наглядности выполнено в щестнадцетиричном коде. Физически в памяти расположены двоичные коды. Адрес выбираемой ячейки памяти так же также подается на входы памяти в двоичном коде. Таким образом, чтобы, например, обратиться к ячейке памяти 0800 необходимо на входы адреса памяти A15, …, A0 подать код 0000 1000 0000 0000 = 0800. В ответ из памяти на шину данных будет выдан код 0011 1010=3А.

Анализ таблицы 2 показывает, что даже очень простая программа занимает достаточный объем при её записи. Для того, чтобы сократить объем описания программы и сделать более простым их анализ, разработчики и программисты договорились для двух и трехбайтовых команд писать только начальные адреса их расположения. То есть, записывать только адреса команд имея в уме в виду, что реально в памяти они будут занимать от одной до трёх последовательных ячеек памяти.

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

 

Таблица 4.3

Общий вид записи программы

 

Адрес Мнемокод Машинный код Комментарий
LDA 08A1 3А А1 08 Число, выбранное по адресу 08А1 в РгА
INR A < РгА> =< РгА> +1*
STA 03E1 32 Е1 03 < РгА> → adr 03E1
HLT остановить

* для упрощения записи содержимое регистров обозначается скобками < >, а стрелкой → обозначают операции пересылки.

 

Пример 2. Вычислить х=(1+3)·2.

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


Поделиться:



Популярное:

Последнее изменение этой страницы: 2016-08-31; Просмотров: 1181; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.094 с.)
Главная | Случайная страница | Обратная связь