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

3.Программирование разветвлений

3.1. Краткие сведения из теории

Разветвления в программе могут осуществляться по состоянию триггеров (флажков) регистра признаков F. Регистр состоит из 5 триггеров:

Тс – триггер переноса, устанавливается в состояние "1", когда в результате выполнения операции произошел перенос из старшего разряда D7. В противном случае триггер устанавливается в состояние "0";

Тас – триггер дополнительного переноса, устанавливается в состояние "1", когда произошел перенос из четвертого разряда D3;

Тz – триггер нуля, устанавливается в состояние "1", если результат операции равен нулю;

Тs – триггер знака, устанавливается в состояние "1", если в результате операции в старшем разряде D7 будет "1";

Тр – триггер паритета, устанавливается в состояние "1", если в результате операции количество единиц четное.

Отметим основные особенности формирования триггеров признаков:

  • команды пересылки и переходов не изменяют состояния триггеров признаков;

  • команды увеличения или уменьшения содержимого одиночного регистра используют все признаки, за исключением признака переноса Тс;

  • команды увеличения или уменьшения содержимого пар регистров не изменяют состояния триггеров признаков;

  • команды арифметических операций используют все признаки;

  • при выполнении логических операций триггеры переноса Тс и Тас сбрасываются в состояние "0";

  • команды сложения содержимого пар регистров используют только признак переноса Тс.

Для организации разветвлений существует 8 команд условного перехода:

JZ ADR – после выполнения этой команды управление будет передано команде, находящейся по адресу АDR, если Тz = 1, в противном случае будет выполнена команда, следующая за JZ ADR:

JNZ ADR - то же, если Тz = 0;

JC ADR – то же, если Тс = 1;

JNC ADR – то же, если Тс = 0;

JM ADR – то же, если Тs = 1;

JP ADR – то же, если Тs = 0;

JPE ADR – то же, если Тp = 1;

JPO ADR – то же, если Тp = 0.

3.2. Разветвляющиеся программы

Пример 3.1. Число хранится в ОЗУ по адресу 0900Н. Определить число единиц в младшем полубайте этого числа. Результат поместить в ОЗУ по адресу 0901Н.

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

Блок 1 обнуляет регистр В (для счета количества единиц будем использовать регистр В); эта операция выполняется командой загрузки MVI B, 00Н.

Блок 2 производит запись в регистровую пару HL адреса (0900Н) числа, хранящегося в ОЗУ; выполняющая эту операцию команда имеет мнемонику LXI H, 0900Н.

Блок 3 производит прием в аккумулятор содержимого ячейки ОЗУ (М), адресом, которой служит содержимое пары регистров HL; выполняющая эту операцию команда имеет мнемонику МОV А, М.

0  B

0900H  HL

(B) +1  B

(M)  A

ЦСП(A)  A

(B) +1  B

(TC)

ЦСП(A)  A

(B) +1  B

(TC)

ЦСП(A)  A

ЦСП(A)  A

(TC)

(TC)

(HL) +1  HL

(B)  M

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

Блок 4 осуществляет циклический сдвиг вправо содержимого аккумулятора. При этом младший разряд D0 числа записывается в триггер переноса Тс, а на его место сдвигается разряд D1; мнемоника команды RRC.

Блок 5 реализует разветвление по содержимому триггера Тс: в зависимости от значения содержимого этого триггера выполняется либо блок 6, либо блок 7; мнемоника команды JNC MET1.

Блок 6 осуществляет увеличение содержимого регистра В, в котором подсчитывается количество единиц младшего полубайта числа; мнемоника команды INR B.

Блок 7 идентичен блоку 4. Теперь в триггер переноса Тс запишется разряд D1, а на его место в аккумуляторе сдвигается разряд D2; мнемоника команды RRC.

Блок 8 реализует разветвление по содержимому триггера Тс: в зависимости от значения содержимого этого триггера выполняется либо блок 9, либо блок 10; мнемоника команды JNC МЕТ2.

Далее блоки с 9 по 15 выполняют те же самые операции, что и предыдущие, только анализируются соответственно разряды D2 и D3 заданного числа.

Блок 16 формирует в паре регистров HL адрес ОЗУ (0901Н), куда необходимо переслать результат; мнемоника команды INX H.

Блок 17 пересылает в память (по адресу 0901Н) полученный результат в регистре В, соответствующий количеству единиц в младшем полубайте заданного числа; мнемоника команды MOV M, В.

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

Таблица 3.1

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

Адрес Н-код

Метка

Мнемоника

Операнд

Машинный код

Комментарий

0800

MVI

В, 00Н

06 00

Блок 1

0802

LXI

Н, 0900Н

21 00 09

Блок 2

0805

MOV

А, М

Блок 3

0806

RRC

0F

Блок 4

0807

JNC

МЕТ 1

D2 0В 08

Блок 5

080А

INR

B

04

Блок 6

080В

МЕТ 1

RRC

0F

Блок 7

080С

JNC

МЕТ 2

D2 10 08

Блок 8

080F

INR

В

04

Блок 9

0810

МЕТ 2

RRC

0F

Блок 10

0811

JNC

МЕТ 3

D2 15 08

Блок 11

0814

INR

В

04

Блок 12

0815

МЕТ 3

RRC

0F

Блок 13

0816

JNC

МЕТ 4

D2 1А 08

Блок 14

0819

INR

В

04

Блок 15

081А

МЕТ 4

INX

H

23

Блок 16

081В

MOV

М,В

70

Блок 17

081С

RST

7

FF

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