Партнерка на США и Канаду по недвижимости, выплаты в крипто

  • 30% recurring commission
  • Выплаты в USDT
  • Вывод каждую неделю
  • Комиссия до 5 лет за каждого referral

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

Существуют также команды условного вызова подпрограмм и возврата из них. Они позволяют вызвать подпрограмму и возвратиться из нее по определенному состоянию заданных разрядов регистра признаков.

Помимо команд вызова подпрограмм и возврата из них, со стеком можно обмениваться информацией. С помощью команды PUSH RP осуществляется запись в стек содержимого регистра RP МП, а с помощью команды POP RP – запись данных из стека в регистр RP процессора. Эти команды однобайтные. В них содержится номер пары регистров МП. Сущность команд можно показать следующим образом:

PUSH B: (SP – 1) f B, (SP – 2) f C; SP = SP – 2

POP D: E f (SP), D f (SP + 1); SP = SP + 2

При записи в стек содержимого пары регистров или программного счетчика по адресу SP – 1 записывается содержимое старшего регистра из указанной пары (в примере B) или старшего байта PCH (программного счетчика), а по адресу SP – 2 в стек записывается содержимое младшего регистра (в примере C) из указанной пары или младшего байта PCL (программного счетчика).

При записи из стека данных в пару регистров или в программный счетчик в младший регистр регистровой пары или в PCL записывается число из адреса, указанного в указателе стека SP, а в старший регистр регистровой пары или в PCH – число, записанное по адресу SP + 1. В результате выполнения команды содержимое SP увеличивается на 2. Таким образом, при записи данных адреса стека убывают от больших к меньшим, а указатель стека SP всегда содержит последний адрес стека, в котором записано число. При разработке программ необходимо назначать область стека, записывая в SP адрес с помощью команды LXI SP, <Адрес> или команды SPHL.

НЕ нашли? Не то? Что вы ищете?

Все операции со стеком должны быть сбалансированы, т. е. каждая подпрограмма должна содержать равное количество команд PUSH и POP, и оканчиваться командой RET, иначе выполнение команды RET приведет к записи в PC случайного числа из стека. Адрес возврата в основную программу будет потерян и нарушится последовательность ее выполнения.


Рис. 3.1. Алгоритм подпрограммы временной задержки.

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

На Рис. 3.1 приведен алгоритм простой подпрограммы временной задержки. Здесь общее время задержки вычисляется по формуле:

(3.1)

где – число, первоначально записанное в счетчик. В качестве счетчика использован регистр B, в котором записывается число из регистра C. Команда NOP нужна для увеличения времени выполнения цикла, а, следовательно, и общей задержки. Повтором необходимого числа команд NOP можно корректировать минимальную временную задержку. Величины и фиксированы и в цикл не входят. Минимальная задержка задается при , а максимальная при . Программа Прогр. 3.1 реализует алгоритм программной задержки, где занимает два байта: D и E. Для увеличения времени задержки организовано два цикла (цикл в цикле), поэтому величина может варьироваться от 0000h до FFFFh (т. е. от 0 до 65535), однако, для вычисления временной задержки здесь должна использоваться гораздо более сложная формула, нежели формула (3.1).

Прогр. 3.1. Программа временной задержки.

MVI B, 05h

;Загрузка числа в B.

LAB_1:

MVI C, FFh

;Загрузка числа в C.

LAB_2:

NOP

;Нет операции.

MOV A, C

;Занести C в Акк.

CPI 00h

;Сравнить Акк. с нулем.

JZ LAB_3

;Если Акк. = 0, идти на LAB_3, иначе

; след. команда.

DCR C

;Уменьшение числа в регистре C на 1.

JMP LAB_2

;Безусловный переход на LAB_2.

LAB_3:

MOV A, B

;Занести B в Акк.

CPI 00h

;Сравнить Акк. с нулем.

JZ LAB_4

;Если Акк. = 0, идти на LAB_4, иначе

; след. команда.

DCR B

;Уменьшение числа в регистре B на 1.

JMP LAB_1

;Безусловный переход на LAB_1.

LAB_4:

HLT

;Выход из программы.

Программа Прогр. 3.2 (ниже, на стр. 44) реализует последовательное высвечивание сегментов (точек) индикатора дисплея разрешением 7 Х 8, показанного на Рис. 3.2. Положение высвечиваемого сегмента индикатора определяется содержанием портов ввода/вывода процессора с адресами 01h (по горизонтали) и 02h (по вертикали). При этом для того, чтобы смена инициируемого сегмента была заметна, использована подпрограмма, которая представляет собой видоизмененную программу временной задержки Прогр. 3.1.


Рис. 3.2. Индикатор дисплея.

Прогр. 3.2. Программа последовательного высвечивания сегментов индикатора дисплея.

MVI B, 00h

;В рег. B байт внешнего цикла задержки.

MVI C, 0Fh

;В рег. C байт внутреннего цикла задержки.

LXI H, 0100h

;В HL адрес ячейки с байтом внешнего цикла

; задержки.

MOV M, B

;В память байт внешнего цикла задержки.

INX H

;В HL адрес ячейки с байтом внутр. цикла

; задержки (инкр. HL).

MOV M, C

;В память байт внутреннего цикла задержки.

DCX H

;Декрементация HL.

MVI B, 01h

;Начальная загрузка B (для Port 02h).

MVI C, 01h

;Начальная загрузка C (для Port 01h).

MOV A, B

;В Акк. содержимое регистра B.

JMP LAB_2

;Безусловный переход на LAB_2.

LAB_1:

RLC

;Сдвиг Акк. влево.

MOV B, A

;Сохранение Акк. в В.

LAB_2:

OUT 02h

;Выдача байта из Акк. в порт 02h.

MOV A, C

;В Акк. содержимое регистра C.

JMP LAB_4

;Безусловный переход на LAB_4.

LAB_3:

RLC

;Сдвиг Акк. влево.

LAB_4:

OUT 01h

;Выдача байта из Акк. в порт 01h.

CALL PROC_1

;Обращение к подпрограмме PROC_1.

CPI 40h

;Сравнение Акк. с 40h.

JNZ LAB_3

;Переход на LAB_3, если неравенство.

MOV A, B

;Запись В в Акк.

CPI 80h

;Сравнение Акк. с 80h.

JNZ LAB_1

;Переход на LAB_1, если неравенство.

HLT

;Выход из программы.

PROC_1:

PUSH PSW

;Начало подпрограммы. Сохранение в стеке

; рабочих регистров.

PUSH B

PUSH D

PUSH H

MOV B, M

;Загрузка в B из памяти байта внешнего цикла

; задержки.

INX H

;Инкрементация HL.

LAB_5:

MOV C, M

;Загрузка в C из памяти байта внутреннего

; цикла задержки.

LAB_6:

NOP

;Пустая операция.

MOV A, C

;Занести C в Акк.

CPI 00h

;Сравнить Акк. с нулем.

JZ LAB_7

;Если Акк. = 0, идти на LAB_7, иначе

; след. команда.

DCR C

;Уменьшение числа в регистре C на 1.

JMP LAB_6

;Безусловный переход на LAB_6.

LAB_7:

MOV A, B

;Занести B в Акк.

CPI 00h

;Сравнить Акк. с нулем.

JZ LAB_8

;Если Акк. = 0, идти на LAB_8, иначе

; след. команда.

DCR B

;Уменьшение числа в регистре B на 1.

JMP LAB_5

;Безусловный переход на LAB_5.

LAB_8:

POP H

;Восстановление из стека рабочих регистров.

POP D

POP B

POP PSW

RET

;Возврат из подпрограммы.

4.2.  Задания для самоподготовки

1.  Рассмотреть особенности выполнения команд операций со стеком (см. Табл. 0-5, Табл. 0-6).

Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10 11 12 13 14