Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
prn_ 51_pr1.doc
Скачиваний:
17
Добавлен:
19.02.2016
Размер:
370.18 Кб
Скачать

5. Множественное ветвление программы:

Допустим, что результатом работы некоторой программы является число Х ( в пределах от 0 до 15). Необходимо организовать передачу управления 16 различным программам с именами ROUT0 – ROUTF в зависимости от вычисления значения Х:

ORG 0C100H ; Задание начального адреса программы

MOV DPTR,#TABLE

ANL A,#0FH ; Сброс старшей тетрады А во избежание ошибки перехода

JMP @A+DPTR ; Обращение к таблице векторов переходов

;Таблица векторов переходов

TABLE: DB ROUT0 ; Начальный адрес программы ROUT0

DB ROUT1

DB ROUT2

DB ROUTF ; Начальный адрес программы ROUTF

6. Последовательная передача параметров

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

Например, подпрограмма LINE выполняет сложение 16-разрядной упакованной двоично-десятичной константы с двухбайтной двоично-десятичной переменной, хранящейся во внутренней памяти ЗУ, и запоминает сумму в другом двухбайтном буфере. В подпрограмму должны передаваться константа и оба адреса буферов. Вместо использования для этих целей четырех рабочих регистров используются 4 байта в памяти программ, следующих за командой вызова подпрограммы.

В приведенном ниже примере подпрограмма осуществляет сложение десятичной константы 1234 с содержимым адреса внутренней памяти 56Н и записывает результат в буфер по адресу 78Н. Подпрограмма LINE определяет, из какой точки был осуществлен ее вызов путем извлечения из стека адреса возврата в старший и младший байты указателя данных.

Инструкция MOVC затем считывает параметры из памяти программы по мере необходимости.

CALL LINE

DW 1234H ; BCD-константа

DB 56Н ; Адрес строки операнда

DB 78Н ; Адрес строки результата

; .......... Продолжение программы

LINE: POP DPH ; Извлечение адреса возврата в DPTR

POP DPL

MOV А, #2 ; Индекс строк источника параметров

MOVC A,@A+DPTR ; Извлечение адреса строки источника

MOV R0,A

MOV A,#3 ; Индекс строк приемника параметров

MOVC A,@A+DPTR ; Извлечение адреса строки приемника

MOV R1, А

MOV А,#1 ; Индекс мл.байта 16-разр. константы

MOVC A,@A+DPTR ; Извлечение мл. байта константы

ADD A,@R0 ; Вычисление мл. байта суммы

DA А ; Десятичная коррекция

MOV @R1,A ; Запись в буфер

INC R0

INC R1

CLR A ; Индекс ст. байта равен нулю

MOVC A,@A+DPTR ; Извлечение ст. байта константы

ADDC A,@R0

DA A ; Десятичная коррекция

MOV @R1,A ; Запись в буфер

MOV А,#4 ; Индекс для продолжения программы

JMP @A+DPTR ; Переход к инструкции, следующей за списком параметров.

Следует учесть, что инструкции ACALL и LCALL не используются в программе, поскольку каждая из них заносит адрес в стек. В то же время инструкция MOVC имеет доступ ко всем 64 К байтам адресного пространства памяти программ микроЭВМ.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]