p align="left">3 Составление схем алгоритмов Реализация любой функции с помощью микрокомпьютера всегда требует проектирования необходимой последовательности действий, получившей название алгоритма. Наиболее удобная и наглядная форма представления алгоритма решения задачи - графическая, в виде схемы. Она состоит из упорядоченной совокупности условных геометрических фигур, несущих информацию об определенном характере операций, накладываемом условии, принятых обозначениях. Основные формы, которые согласно действующим стандартам представлены в приложении А. Рассмотрим в качестве примера задачу формирования двух наборов целых чисел, лежащих в диапазоне от -5 до +5. Путем сортировки организуется два набора, один из которых включает в себя положительные числа, а другой - отрицательные. Схема алгоритма решения этой задачи показана на рис. 1.5. Рисунок 1.5 - Схема алгоритма с ветвлением 4 Подпрограммы Подпрограмма - это часть программы, используемая обычно несколько раз в процессе выполнения программы. Однако текст подпрограммы записывается программистом только один раз. Когда же программисту необходимо воспользоваться подпрограммой, достаточно указать в программе соответствующую команду вызова (обращения к подпрограмме), адресующуюся к области памяти, в которой расположена подпрограмма. С этой целью в языке программирования для большинства МП существует команда CALL (вызвать). В этой команде после кода операции (CALL) указывается имя подпрограммы, которое присвоено физическому адресу в области памяти, где расположена данная подпрограмма. Кроме того, по команде выполняются действия, необходимые для возвращения к основной программе после выполнения подпрограммы: а) в счетчике команд фиксируется адрес команды в основной программе, которая следует за командой вызова; б) содержимое счетчика команд (адрес возврата) загружается в стек, содержимое указателя стека модифицируется; в) в счетчик команд загружается адрес, задаваемый командой вызова. После этого может начаться исполнение подпрограммы. Последней выполняемой командой подпрограммы является команда RET (return - возврат). По этой команде выполняется возврат к основной программе, прерванной командой вызова. Команда возврата содержит только код операции. По этой команде происходит следующее: а) счетчик команд получает из стека адрес команды в основной программе, следующей за командой вызова; б) содержимое указателя стека соответственно модифицируется. Основное достоинство подпрограмм заключается в том, что благодаря возможности их многократного использования, сокращается текст программы в целом. Вместо того, чтобы по мере необходимости повторять запись одного и того же фрагмента программы, достаточно оформить запись фрагмента как подпрограмму и обращаться к ней столько раз, сколько требуется в соответствии с алгоритмом решения задачи. Из одной программы можно производить обращение к нескольким подпрограммам. Одна подпрограмма может обращаться к другой. Такое построение подпрограмм называется ВЛОЖЕНИЕМ. Глубина допустимого уровня вложения подпрограмм зависит от типа вычислительной машины и используемого языка программирования. Большинство современных МП и языков программирования допускает многоуровневое вложение. Как следует из вышеизложенного, использование подпрограмм - не слишком обременительная работа для программиста. 5 Программирование в машинных кодах Реализация требуемого алгоритма вычисления достигается путем подготовки, отладки и записи в ПЗУ соответствующей программы. МП способен воспринимать лишь программы, состоящие из последовательности команд, представленных двоичными кодами. Программирование непосредственно в машинных кодах требует постоянного оперирования многоразрядными двоичными числами, представляющими как коды команд, так и коды операндов. В качестве примера линейной программы в машинных двоичных кодах рассмотрим программу сложения двух чисел, одно из которых 01100100 находится в регистре общего назначения (РОН) В, а второе - 00010111 расположено в ячейке памяти с адресом 0000 0000 1000 1111. Напомним, что рассматриваемый МП имеет шестнадцатиразрядную шину адреса. Фрагмент программы приведен в табл. 1.1. Таблица 1.1 - Программа сложения в машинных кодах |
Адрес памяти | Мнемокод | | 0000 0000 0000 0100 | 01111000 | | 0000 0000 0000 0101 | 00100001 | | 0000 0000 0000 0110 | 10001111 | | 0000 0000 0000 0111 | 00000000 | | 0000 0000 0000 1000 | 10000110 | | 0000 0000 0000 1001 | 01110110 | | . . . . . . . . . . . . . . . . . | . . . . . . . . . | | 0000 0000 0000 0100 | 00010111 | | |
Таблица 1.2 - Программа сложения в шестнадцатеричных кодах |
Мнемокод | Адрес | Н - код | Vt | | MOV A,B | 0004 | 78 | 5 | | LXI H | 0005 | 21 | 16 | | | 0006 | 8F | | | | 0007 | 00 | | | ADD M | 0008 | 86 | 7 | | HLT | 0009 | 76 | 7 | | . . . . . . . . . | . . . . . . | . . . . . . | . . . . | | | 008F | 17 | | | |
Первая команда - пересылка содержимого регистра В в аккумулятор - является однобайтовой, имеет код операции. Код операции расположен в ПЗУ по адресу 0000 0000 0000 0100, который для данной программы является начальным. Следующая команда - трехбайтовая, имеет код операции 00100001, представляющий первый байт команды. Второй и третий байты, расположенные в очередных ячейках ПЗУ, содержат соответственно младшую и старшую части адреса 1000 1111 0000 0000, передаваемые по этой команде в регистровую пару H и L. Микропроцессор при выполнении программы последовательно обращается к ячейкам памяти и выполняет поочередно все команды. Напомним, что коды операций и операнды хранятся в памяти в одинаковом виде и их различение осуществляется микропрограммами выполнения команд, заложенными в МП. Последняя команда имеет код 01110110 и является командой останова (HLT). В результате выполнения программы в аккумуляторе окажется записанным число 01111011. Даже рассмотрение такой простейшей программы показывает, насколько неудобным и недостаточно наглядным является представление чисел в машинных двоичных кодах. Поэтому принято запись машинных кодов производить в шестнадцатеричной системе. В табл. 1.2 приведен фрагмент той же самой программы, записанной в шестнадцатеричных кодах. Рядом с кодом операции показаны его мнемоническое изображение и наименования операндов, принятые в системе команд данного МП. Например, шестнадцатеричный код команды 78, имеющей мнемоническое обозначение MOV A,B, соответствует операции пересылки содержимого регистра В в аккумулятор А. В табл. 1.2 также указано число тактов Vt, необходимое для выполнения каждой команды. Для выполнения всей программы требуется 35 машинных тактов. Практически удобнее программировать непосредственно в мнемокодах, а затем представлять шестнадцатеричные коды адресов и операндов, получающиеся после распределения памяти. 6 Программирование в мнемокодах Наиболее удобным методом написания программ является использование мнемонических кодов, состоящих из аббревиатуры полного названия инструкции. В этом случае мнемокод отражает содержательный смысл выполняемой операции. Пример 1.1. Организация счетчиков циклов. Схема алгоритма счета показана на рис. 1.6, а фрагмент программы приведен в табл. 1.3. Рисунок 1.6 - Схема алгоритма счета циклов Счетчиком служит один из РОН - регистр В. По команде MVI B, N в него заносится число N, определяющее количество повторяемых циклов. В данной программе N=16. Для определенности принято, что участок программы, который необходимо повторить 16 раз, начинается командой логической операции «ИСКЛЮЧАЮЩЕЕ ИЛИ» XRA A, расположенной по адресу 1002, и заканчивается командой пересылки из аккумулятора в регистр D: MOV D, A, расположенный по адресу 10А1. После каждого выполнения этого участка программы содержимое счетчика (регистра В) уменьшается на единицу посредством команды DCR B (адрес 10А2). До тех пор, пока содержимое регистра В отлично от нуля, признак Z имеет нулевое значение и программа переходит к выполнению команды, адрес 1002 который содержится во втором и третьем байтах команды JNZ (переход по отсутствию нуля). Указанный адрес отмечен в программе меткой М1, т.е. метка М1 является мнемоническим обозначением адреса 1002. Таблица 1.3 - Программа счета циклов |
Метка | Мнемокод | Операнд | Адрес | Н - код | Комментарий | Vt | | | . . . . . . . | . . . . . . . | . . . . . . | . . . . . . | . . . . . . . . . . | . . | | | MVI | B, 16 | 1000 | 06 | Установка счётчика | 7 | | | | | 1001 | 10 | N=16 в (B) | | | M1: | XRA | A | 1002 | AF | Обнуление признака переноса | 4 | | | . . . . . . . | . . . . . . . | . . . . . . | . . . . . . | . . . . . . . . . . | . . | | | MOV | D, A | 10A1 | 57 | Пересылка содержимого А в регистр D (D:=A) | 5 | | | DCR | B | 10A2 | 05 | Уменьшение содержимого счётчика на 1 | 5 | | | JNZ | M1 | 10A3 | C2 | Переход по условию (N) 0 к ячейке памяти с адресом 1002 | 10 | | | | | 10A4 | 02 | | | | | | | 10A5 | 10 | | | | | . . . . . . . | . . . . . . . | . . . . . . | . . . . . . | . . . . . . . . . . | . . | | |
Если в результате очередного вычитания единицы содержимое регистра В окажется равным нулю (Z=1), то программа перейдет к выполнению команды, расположенной за JNZ. Происходит выход из циклического участка программы. Поскольку регистр В имеет восемь двоичных разрядов, рассмотренная структура программы позволяет организовать счетчик от 1 до 255 циклов. При необходимости получения большого числа циклов для организации счетчика следует использовать регистровые пары (например, В и С). Загрузка такой пары осуществляется с помощью команды LXI B, а вместо команды DCR В необходимо использовать команду DCX B (декремент регистровой пары).
Страницы: 1, 2, 3
|