Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Ассемблер.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
724.99 Кб
Скачать

4. Программирование циклических вычислительных процессов

4.1. Программирование участков алгоритма, содержащих циклы

Пример 4.1. Сложить два трехбайтных числа, каждое из которых занимает в ОЗУ три ячейки памяти с последовательно нарастающими адресами. Адреса младших байтов первого и второго чисел хранятся соответственно в регистровых парах ВС и НL. Результат поместить на место второго слагаемого.

Принцип сложения многобайтных чисел состоит в том, что сначала в МП вызываются младшие байты слагаемых. Байты суммируются, результат суммирования помещается в память на место младшего байта второго слагаемого, возникающий в процессе суммирования перенос из старшего разряда D7 запоминается в триггере Тс регистра признаков. Затем в парах регистров ВС и НL формируется адрес вторых байтов слагаемых, которые затем вызываются в МП и суммируются вместе с хранящимся в триггере Тс переносом, возникшим при сложении первых байтов и т. д. Выполнение процесса завершится после трехкратного повторения указанных действий. Таким образом, этот процесс носит циклический характер: цикл, содержащий операции пересылки, сложения, формирования очередного адреса, должен быть повторен три раза.

Для счета числа повторений цикла организуем счетчик на регистре D. В этот регистр предварительно занесем число 3 и после каждого повторения цикла будем вычитать единицу из содержимого регистра D, проверяя затем, равно ли нулю его содержимое. При достижении нулевого значения производится выход из цикла.

На рис. 4.1 приведена блок-схема алгоритма решения данной задачи. Рассмотрим операции, выполняемые в каждом из блоков.

Блок 1 обнуляет триггер переноса Тс, т.к. он мог находится в состоянии '''1' после выполнения предыдущих операций. Для этой цели можно использовать любую команду логических операций, например, логическое умножение аккумулятора самого на себя; мнемоника команды АNA A.

Блок 2 производит загрузку числа 3 в регистр D (в счетчик циклов); мнемоника команды MVI D, 0ЗН.

Блок 3 производит пересылку младшего байта (при первом проходе цикла) первого числа из ячейки ОЗУ в аккумулятор. Эта операция выполняется командой, использующей косвенную адресацию; мнемоника команды LDAX В.

Блок 4 производит суммирование младших байтов двух чисел с учетом триггера переноса Тс при первом проходе цикла, вторых байтов при втором проходе и третьих байтов при третьем; мнемоника команды ADC M.

Блок 5 производит пересылку результата суммирования двух байтов на место второго слагаемого; мнемоника команды MOV M, А.

Блок 6 производит вычитание единицы из содержимого счетчика (регистра D).

Блок 7 реализует разветвление по содержимому триггера ТZ; в зависимости от значения содержимого этого триггера выполняется либо блок 8, либо осуществляется выход из цикла; мнемоника команды JZ M1.

Блок 8 формирует в паре регистров ВС адрес следующего байта первого числа; эта операция выполняется командой приращения пары регистров INX B.

Блок 9 формирует в паре регистров HL адрес следующего байта второго числа; эта операция выполняется командой приращения пары регистров INX H.

В табл. 4.1 приведена программа рассматриваемой задачи на языке Ассемблер и в машинных кодах. Размещение команд производилось с ячейки ОЗУ, имеющей адрес 0800Н.

Рис. 4.1. Блок-схема алгоритма сложения двух трехбайтных чисел

Таблица 4.1

Программа сложения двух трехбайтных чисел

Адрес Н-код

Метка

Мнемоника

Операнд

Машинный код

Комментарий

0800

ANA

A

A7

Установ. Тс в "0"

0801

MVI

D, 03Н

16 03

Блок 2

0803

МЕТ 1

LDAX

B

0A

Блок 3

0804

ADC

M

8E

Блок 4

0805

MOV

M,А

77

Блок 5

0806

DCR

D

15

Блок 6

0807

JZ

МЕТ 2

СА 0F 08

Блок 7

080А

INX

B

03

Блок 8

080В

INX

Н

23

Блок 9

080С

JMP

МЕТ 1

C30308

Безусловный переход

080F

МЕТ 2

RST

7

FF

Переход к программе монитор