Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Микропроцессорные системы (книга Комаров) / Проектирование МП систем (ч 3).doc
Скачиваний:
106
Добавлен:
08.03.2015
Размер:
772.1 Кб
Скачать

67

6.5.4. Кодирование программы

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

Для кодирования могут применяться различные языки программирования в зависимости от требований, предъявляемых к программе. В МПС для достижения высокой эффективности создаваемых программ, как правило, используется язык ассемблера, и лишь для кодирования математически сложных задач применяются языки программирования высокого уровня: Паскаль, Си и т.п.

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

Реализация логических конструкций структурного программирования

Логическими конструкциями структурного программирования являются конструкции СЛЕДОВАНИЕ, ВЕТВЛЕНИЕ, ЦИКЛ, ВЫБОР и ВЫБОР-ПОВТОРЕНИЕ. Рассмотрим их реализацию.

Логическая конструкция СЛЕДОВАНИЕ представляет собой простую последовательность некоторых действий (см. рис.6.32,а). Реализацию этой конструкции рассмотрим на примере.

Пример 6.8:

Рис. 6.51. ГСА примера 6.8

Написать программу для вычисленияS=A+B,гдеAиBслова в памяти.

Из анализа системы команд МП (см. приложение) следует, что в основу этой программы может быть положена команда 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+INDn,

где ADDR(IND) начальный адрес элемента командного массива;

Base начальный адрес командного массива;

IND индекс элемента командного массива;

n длина элемента командного массива в байтах.

Очевидно, что индексом элемента массива является вводимое число, определяющее характер выполняемых действий. Длина элемента массива определяется командами, входящими в его состав. Для решения поставленной задачи элементы массива должны включать в себя две команды: соответствующую операционную команду и команду JMP Labl. Первая из них выполняет требуемые действия, а вторая обеспечивает выход из конструкции ВЫБОР.

Эти команды имеют следующую длину в байтах: INC DX1, ADD DX, 34, DEC DX1, SUB DX, 54, JMP Labl3. Таким образом, длина элементов массива будет соответственно равна 4,7,4,7 байтов. Для ускорения операции умножения при вычислении смещения адреса целесообразно приводить длину элемента массива к ближайшему большему числу равному степени 2. Следовательно, в данном случае необходимо выбрать длину элемента равной 8 байтам. При этом смещение адреса INDn может быть вычислено путем трехкратного сдвига влево индекса, которым является введенное число. ГСА для решения этой задачи приведена на рис. 6.56, и текст программы имеет вид:

; Реализация конструкции ВЫБОР

IN AX, Port ; Ввод числа D

LEA BX, Base ; Вычисление

MOV CL, 3 ; исполнительного

SHL AX, CL ; адреса

ADD AX, BX

JMP AX ; Выбор

BaseINC 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.