Для включения в очередь элемент массива записывается в ячейку, адресуемую указателем конца очереди, и затем этот указатель увеличивается на единицу.
Чтобы можно было просто обнаружить особые случаи в организации очереди — попытки включить элемент в очередь, в которой все выделенные для массива ячейки памяти уже заполнены, или исключить элемент из пустой очереди, часто область памяти, выделяемую для очереди, размещают на одной странице ЗУ, т. е. у всех элементов очереди адреса отличаются только младшим байтом, а старший байт адреса у всех элементов один и тот же; при этом, естественно, можно реализовать очередь всего на N < 28 = 256 элементов.
Рис. Р8.12. Алгоритм включения элементов в очередь и исключение из нее
Р8.43. Алгоритм решения задачи приведен на рис. Р8.12. В качестве указателя адреса конца очереди выберем регистровую пару (НL), а указателя адреса элемента очереди при сдвиге — пару (DЕ). Счетчик длины очереди реализуем на регистре С, а вспомогательный счетчик для сдвига очереди — на регистре В. Предполагается, что исключение из очереди производится только из ячейки с начальным адресом ВА5Е. поэтому после выполнения операции исключения элемента из очереди производится «подъем» всех элементов очереди вверх (в направлении уменьшающихся адресов) на одну ступень.
Программа:
1 MVI C,00H ;Загрузка счетчика длины очереди
2 LXI M,ADRK=BASE ;Инициализация указателя адреса пары
;(HL) текущего конца очереди RK=BASE
3 ADR1: LDA ADRPR1 ;Чтение признака включения нового
;элемента в очередь: (А)¬х1
4 CPI 01H ;Анализ признака х1 – сравнение (А) – 01H
;и проверка условия (флаг Z): если (А) =
;= х1=011H, то переход к метке ADR5
;(блок 20)
5 ADR2: LDA ADRPR2 ;Чтение признака исключения элемента из
;очереди (А)¬х2
6 CPI 01H ;Анализ признака х2 – сравнения (А) – 01H
;и переход по метке ADR1, если х2 ¹ 01H
7 LDA BASE ;Чтение из ячейки ОЗУ с начальным
;адресом (А)¬([BASE])
8 OUT PORT2 ;Исключение первого элемента очереди в
;порт
;вывода (PORT2)¬(A)
9 MOV B,C ;Подготовка к сдвигу элементов очереди:
;Загрузка вспомогательного счетчика
;(регистр В) значением длины очереди
;(С)
10 LXI D,BASE+1 ;Инициализация вспомогательного
;указателя текущих адресов элементов
;очереди
11 ADR3: LDAX D ;Чтение из ячейки ОЗУ по адресу в паре
;(DE) (А)¬([DE])
12 DCX D ;Модификация вспомогательного
;указателя (DE)¬(DE) – 1
13 STAX D ;Сдвиг элемента «вверх»: чтение из (А) в
;ячейку ОЗУ с адресом в (DE)
14 DCR B ;Счет во вспомогательном счетчике
15 JZ ADR4 ;Проверка конца (завершения) сдвига всех
;элементов очереди «вверх» - по (В) ¹ 0
16 INX D ;Если В¹0, то увеличение
17 JMP ADR3 ;текущего адреса в (DE) на 02H и
;безусловный переход к метке ADR3
18 ADR4: DCR C ;Если (В)=0, то восстана
19 JMP ADR1 ;вливается значение длины
;очереди в (С) и безусловный переход к
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.