- •6.5.4. Кодирование программы
- •Реализация логических конструкций структурного программирования
- •Кодирование программы для ввода данных в озу
- •6.5.5. Тестирование и отладка программы
- •6.5.6. Занесение программы на рабочий носитель
- •6.5.7. Оформление документации на программу
- •6.6. Комплексная отладка микропроцессорной системы
- •Заключение
- •Список рекомендуемых источников
6.5.4. Кодирование программы
Кодирование представляет собой процесс записи алгоритма решения некоторой задачи на используемом языке программирования.
Для кодирования могут применяться различные языки программирования в зависимости от требований, предъявляемых к программе. В МПС для достижения высокой эффективности создаваемых программ, как правило, используется язык ассемблера, и лишь для кодирования математически сложных задач применяются языки программирования высокого уровня: Паскаль, Си и т.п.
Основу любого алгоритма составляют логические конструкции структурного программирования. Поэтому кодирование программы сводится к реализации этих конструкций.
Реализация логических конструкций структурного программирования
Логическими конструкциями структурного программирования являются конструкции СЛЕДОВАНИЕ, ВЕТВЛЕНИЕ, ЦИКЛ, ВЫБОР и ВЫБОР-ПОВТОРЕНИЕ. Рассмотрим их реализацию.
Логическая конструкция СЛЕДОВАНИЕ представляет собой простую последовательность некоторых действий (см. рис.6.32,а). Реализацию этой конструкции рассмотрим на примере.
Пример 6.8:
Рис. 6.51. ГСА примера 6.8
Из анализа системы команд МП (см. приложение) следует, что в основу этой программы может быть положена команда ADD rm, rmd, реализующая операцию (rm)=(rm)+(rmd). Для корректного решения поставленной задачи следует обеспечить необходимое исходное размещение информации. ГСА для решения этой задачи приведена на рис. 6.51, и текст программы имеет вид:
; Реализация конструкции СЛЕДОВАНИЕ
MOV AX, A ; Чтение A
ADD AX, B ; Сложение с B
MOV S, AX ; Запись результата
Логическая конструкция ВЕТВЛЕНИЕ обеспечивает принятие альтернативного решения по выполнению тех или иных действий в зависимости от значения некоторого двоичного условия (см. рис. 6.32,б). Реализацию этой конструкции рассмотрим на примере.
Пример 6.9:
В зависимости от соотношения между беззнаковыми числамиМ1иМ2установить флаговую ячейку памятиFlag.ЕслиМ1 < М2,тоFlag = 00h,иначеFlag=FFh.
Из анализа системы команд МП следует, что основу этой программы может составлять команда CMP rm, rmd, реализующая операцию (F)=(rm)(rmd). При этом для беззнаковых чисел CF=1, если (rm)<(rmd), иначеCF=0.
Для корректного решения поставленной задачи следует обеспечить необходимое исходное размещение информации. ГСА для решения этой задачи приведена на рис. 6.52,а, и текст программы имеет вид:
; Реализация конструкции ВЕТВЛЕНИЕ (общий случай)
MOV AX, M1 ; Чтение М1
CMP AX, M2 ; M1<M2?
JC M1B ; Переход, если да
MOV Flag, 0FFh ; Установка Flag=FFh
JMP SHORT Fin ; Обход другой ветви
M1B:MOV Flag, 0 ; Установка Flag=00h
Fin: . . . . . . . . . . ; Продолжение программы
Рис. 6.52. ГСА примера 6.9:
а) общий случай; б) частный случай
При наличии действий в обеих ветвях конструкции ВЕТВЛЕНИЕ в тексте программы обязательно присутствует команда безусловного перехода JMP, позволяющая обойти действия, выполняемые в другой ветви. Для упрощения реализации конструкцию ВЕТВЛЕНИЕ целесообразно сводить к частному случаю с одной пустой ветвью.Для этого действия из одной ветви выполняются до проверки условия, а затем при необходимости корректируются.
ГСА для решения задачи из примера 6.9 с учетом этого приведена на рис. 6.52,б, и текст программы имеет вид:
; Реализация конструкции ВЕТВЛЕНИЕ (частный случай)
MOV AX, M1 ; Чтение M1
MOV Flag, 0 ; Установка Flag=00h
CMP AX, M2 ; M1<M2?
JC Fin ; Переход, если да
MOV Flag, 0FFh ; Установка Flag=FFh
Fin: . . . . . . . . . . ; Продолжение программы
Логическая конструкция ЦИКЛ обеспечивает многократное выполнение одних и тех же действий до тех пор, пока не будет выполнено условие выхода из цикла. Она имеет две разновидности: ЦИКЛ С ПРЕДУСЛОВИЕМ (см. рис. 6.32,в) и ЦИКЛ С ПОСТУСЛОВИЕМ (см. рис. 6.32,г).
Полные ГСА этих конструкций приведены на рис. 6.53. В операторе "Подготовка" выполняются действия, необходимые для корректного выполнения и выхода из конструкции ЦИКЛ. Как правило, в нем загружаются адреса, обеспечивающие обращение к начальным элементам обрабатываемых данных, а также начальное значение условия выхода из цикла.
Рис. 6.53. Полные ГСА логической конструкции ЦИКЛ:
а) ЦИКЛ С ПРЕДУСЛОВИЕМ; б) ЦИКЛ С ПОСТУСЛОВИЕМ
В операторе "Тело цикла" выполняются все необходимые действия по отношению к одному элементу данных, что соответствует его обработке.
В операторе "Модификация параметров цикла" изменяются параметры цикла, что обеспечивает подготовку к обработке следующего элемента данных. Как правило, в нем модифицируются адреса, что подготавливает обращение к очередным элементам данных.
После этого модифицируется и проверяется условие выхода из цикла. Если оно имеет ложное значение, то цикл продолжается, и обрабатываются очередные элементы данных. При истинности условия осуществляется выход из цикла, и обработка данных прекращается.
В конструкции ЦИКЛ С ПРЕДУСЛОВИЕМ условие выхода из цикла проверяется вначале, и поэтому возможен случай, когда тело цикла не будет выполнено ни разу.
Пример 6.10:
Преобразовать4-разрядный двоичный код из ячейкиInData в унитарный16-разрядный код.
Преобразование двоичного кода в унитарный код осуществляется в соответствии с табл. 6.6.
Таблица 6.6
Преобразование двоичного кода в унитарный код
-
Двоичный код
Унитарный код
D3 D2 D1 D0
D15 D14 . . . D4 D3 D2 D1 D0
0 0 0 0
0 0 0 1
0 0 1 0
0 0 1 1
0 1 0 0
. . . . . . . .
1 1 1 0
1 1 1 1
0 0 0 0 0 0 1
0 0 0 0 0 1 0
0 0 0 0 1 0 0
0 0 0 1 0 0 0
0 0 1 0 0 0 0
. . . . . . . . . . . . . . .
0 1 0 0 0 0 0
1 0 0 0 0 0 0
Из анализа таблицы преобразования следует, что в основу этой программы можно положить команду SHL, осуществляющую логический сдвиг влево, а условием выхода из цикла является нулевое значение преобразуемого кода. ГСА для решения этой задачи приведена на рис. 6.54, и текст программы имеет вид:
; Реализация конструкции ЦИКЛ С ПРЕДУСЛОВИЕМ
; Подготовка
MOV CX, InData ; Чтение входного кода
AND CX, 0Fh
MOV DX, 1 ; Загрузка накопителя результата
EndAn:JCXZ TrfEnd ; Переход, если конец преобразования
SHL DX, 1 ; Сдвиг накопителя результата
DEC CX ; Декремент входного кода
JMP SHORT EndAn ; Зацикливание
TrfEnd: . . . . . . . . . . . . ; Продолжение программы
Рис. 6.54. ГСА примера 6.10
В конструкции ЦИКЛ С ПОСТУСЛОВИЕМ условие выхода из цикла проверяется в конце, и поэтому тело цикла выполняется минимум один раз.
Пример 6.11:
Скопировать Nслов массиваSourceв массивDest.
Из анализа системы команд МП следует, что в основу этой программы необходимо положить команду MOV dst, src, осуществляющую пересылку данных из src в dst. ГСА для решения этой задачи приведена на рис. 6.55, и текст программы имеет вид:
; Реализация конструкции ЦИКЛ С ПОСТУСЛОВИЕМ
; Подготовка
LEA BX, Source ; Загрузка
LEA SI, Dest ; адресов и
MOV CX, N ; счетчика циклов
Next:MOV AX,[BX] ; Чтение элемента источника
MOV [SI], AX ; Запись элемента в приемник
ADD BX, 2 ; Модификация адресов
ADD SI, 2
LOOP Next ; Все элементы? Переход, если нет
Рис. 6.55. ГСА примера 6.11
Логическая конструкция ВЫБОР осуществляет многоальтернативный выбор выполняемых действий в соответствии с конкретным значением некоторого многозначного условия выбора I (см. рис. 6.33,а). Для выполнения тех или иных действий в зависимости от значения параметра I необходимо передать управление на начальный адрес соответствующего программного фрагмента. Это обеспечивается путем косвенного перехода с помощью команды JMP rm16.
Для реализации конструкции ВЫБОР необходимо сформировать в некотором 16-битном регистре в зависимости от значения многозначного условия I исполнительный адрес и выполнить команду передачи управления JMP по этому регистру. В результате будет осуществлен переход на начало соответствующего программного фрагмента, после выполнения которого необходимо выйти из конструкции командой безусловного перехода JMP Labl. Реализацию этой конструкции рассмотрим на примере.
Пример 6.12:
Из порта ввода считывается число с допустимыми значениями0,1,2,3.В зависимости от значения этого числа выполнить следующие действия: 0инкрементировать регистрDX, 1увеличитьDXна3, 2декрементироватьDX, 3уменьшить DXна5.
Из анализа системы команд следует, что в основу этой программы могут быть положены команды INC rm; ADD rm, rmd; DEC rm; SUB rm, rmd.
Для упрощения программы целесообразно считать, что эти команды организованы в таблицу, в каждой строке которой находится одна команда. Тогда для выбора команды необходимо обратиться к строке этой таблицы, соответствующей введенному числу.
Так как эта таблица представляет собой одномерный массив, то исполнительный адрес может быть вычислен как адрес элемента массива в соответствии с выражением
ADDR(IND)=Base+INDn,
где ADDR(IND) начальный адрес элемента командного массива;
Base начальный адрес командного массива;
IND индекс элемента командного массива;
n длина элемента командного массива в байтах.
Очевидно, что индексом элемента массива является вводимое число, определяющее характер выполняемых действий. Длина элемента массива определяется командами, входящими в его состав. Для решения поставленной задачи элементы массива должны включать в себя две команды: соответствующую операционную команду и команду JMP Labl. Первая из них выполняет требуемые действия, а вторая обеспечивает выход из конструкции ВЫБОР.
Эти команды имеют следующую длину в байтах: INC DX1, ADD DX, 34, DEC DX1, SUB DX, 54, JMP Labl3. Таким образом, длина элементов массива будет соответственно равна 4,7,4,7 байтов. Для ускорения операции умножения при вычислении смещения адреса целесообразно приводить длину элемента массива к ближайшему большему числу равному степени 2. Следовательно, в данном случае необходимо выбрать длину элемента равной 8 байтам. При этом смещение адреса INDn может быть вычислено путем трехкратного сдвига влево индекса, которым является введенное число. ГСА для решения этой задачи приведена на рис. 6.56, и текст программы имеет вид:
; Реализация конструкции ВЫБОР
IN AX, Port ; Ввод числа D
LEA BX, Base ; Вычисление
MOV CL, 3 ; исполнительного
SHL AX, CL ; адреса
ADD AX, BX
JMP AX ; Выбор
BaseINC DX ; Выполнение действий
JMP Exit ; при D=0
NOP ; Дополнение длины
NOP ; элемента массива
NOP ; до 8 байтов
NOP
ADD DX, 3 ; Выполнение действий
JMP Exit ; при D=1
NOP ; Дополнение до 8 байтов
DEC DX ; Выполнение действий
JMP Exit ; при D=2
REPT 4 ; Дополнение длины
NOP ; элемента до
ENDM; 8 байтов
SUB DX ; Выполнение действий при D=3
Exit: . . . . . . . ; Продолжение программы
Рис.6.56. ГСА примера 6.12
Логическая конструкция ВЫБОРПОВТОРЕНИЕ также осуществляет многоальтернативный выбор выполняемых действий в соответствии с конкретным значением многозначного условия выбора I (см. рис. 6.33,б). Однако, в отличие от конструкции ВЫБОР после реализации необходимых действий в каждой ветви этой структуры осуществляется модификация параметра выбора I, и управление вновь передается на его анализ. В результате обеспечивается необходимая последовательность выполняемых действий.
Конструкция ВЫБОРПОВТОРЕНИЕ реализуется совершенно аналогично конструкции ВЫБОР. Отличие состоит лишь в том, что каждый элемент командного массива, соответствующий I< >N, должен содержать команду, осуществляющую модификацию параметра выбора, и управление из него должно передаваться на начало вычисления исполнительного адреса (см. пример 6.12). Выход из конструкции ВЫБОРПОВТОРЕНИЕ осуществляется из элемента командного массива, соответствующего I=N.
При необходимости выполнения в ветвях логических конструкций ВЫБОР и ВЫБОРПОВТОРЕНИЕ сложных действий целесообразно оформлять реализующие их программные фрагменты в виде подпрограмм. Тогда обработка данных в каждом элементе командного массива будет осуществляться только командой CALL Name, и все элементы будут иметь одинаковую длину независимо от сложности фрагментов, что упрощает реализацию этих конструкций.
Необходимо помнить, что в МПС в связи с отсутствием операционной системы не осуществляется инициализация переменных на начальные значения, заданные директивами распределения памяти DB,DW,DDи т.д. Поэтому начальная инициализация всех переменных должна осуществляться путем программной загрузки требуемых значений в соответствующие ячейки памяти.
При кодировании программных модулей ввода/вывода данных необходимо прежде всего разработать архитектуру ввода/вывода, определяющую конкретный вариант подключения УВВ к портам ввода/вывода (адреса портов, используемые разряды и т.д. и т.п.).
Исходный текст программы записывается в соответствии с типовой структурой, рассмотренной в подразделе 3.4.