Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
OMT&МП2.doc
Скачиваний:
10
Добавлен:
13.11.2019
Размер:
2.35 Mб
Скачать

Задание для домашней подготовки

1.Ознакомтесь с командами вызова и возврата из подпрограммы по условию.

2. Составьте подпрограммы 1,2,3 в машинных кодах согласно вашему варианту с учетом табл.4.1. Данные варианта сведены в табл.4.2.

Таблица 4.2

Варианты заданий

Номер варианта

Адрес

вершины стека

Номер варианта

Адрес

вершины стека

1

2

3

4

5

6

08С0

08В0

0910

0950

09А0

0А00

7

8

9

10

11

12

0А40

0АВ0

0В00

0В20

0В60

0ВА0

Задание для выполнения в лаборатории

1. Ввести в микроЭВМ разработанную. подпрограмму.

2. Осуществить пуск подпрограммы в автоматизированном режиме. Проверить правильность программы по результату.

3. Исследовать процесс выполнения программы по машинным циклам.

Содержание отчета

1) привести разработанную программу;

2) дать анализ выполнения программы.

Контрольные вопросы

  1. Организация и назначение стека.

  2. Как изменяется вершина стека при операциях с данными в стеке?

  3. Каков порядок записи в стек данных при выполнении команды PUSH H, если (SP) = 9000, (H) = 12, (L) = 34 ?

  4. Каков порядок извлечения из стека данных при выполнении команды POP H, если (SP) = 9000, (8FFE) = 12, (8FFF) = 34, (9000) = 56, (9001) = 78, (9002) = 9A ?

  5. Каков порядок записи в стек данных при выполнении команды 0800 CALL 0850, если (SP) = 9000 ?

Лабораторная работа № 5 выполнение арифметических операций

Цель работы: изучение способов организации и исследование программы выполнения арифметических операций.

Теоретическая часть

Из двух способов определения чисел с фиксированной и плавающей точкой (запятой) первый получил наибольшее распространение при программировании МП КР580. Это связано с отсутствием специальных команд, позволяющих МП работать с числами с плавающей запятой. Число с фиксированной точкой можно представлять двоичным числом без знака, имеющим значения от 0 до 255 или как двоичное число со знаком от –127 до +127 . Отрицательное число представляется в дополнительном коде.

Выполнение арифметических операций сложения, вычитания, умножения, деления рассмотрим на примере соответствующих подпрограмм.

Рассмотрим подпрограмму сложения массива однобайтных чисел с получением двухбайтного результата - подпрограмма 5.1.

Слагаемые должны быть в последовательных адресах памяти. Входными параметрами подпрограммы АDD В являются адрес первого слагаемого, записанный в НL,и число слагаемых, записанное в регистре В. Выходным параметром программ MAIN является сумма, старший байт которой записан в регистре С, а младший - в аккумуляторе А.

МП КР 580ВМ80А имеет 8-ми разрядное АЛУ, поэтому операция сложения чисел с длиной машинного слова большей 8 должна проводиться по байтам, начиная с последних байтов. При этом сложение последних байтов можно проводить командой АDD, а старших байтов - командой АDС, которая учитывает состояние разряда С регистра признаков F - разряда переноса.

Сложение двухбайтовых данных можно легко осуществить с помощью команд DAD, LHLD, SHLD.Рассмотрим подпрограмму сложения двух двухбайтовых переменных XI и Х2. (подпрограмма 5.2).

Для выполнения вычитания 8-ми разрядных двоичных кодов МП имеет команды SUB, SUI, SBB, SBI.

В процессе формирования разности старших разрядов может возникнуть сигнал заема. Этот сигнал устанавливает в состояние 1 разряд С регистра признаков F.

Подпрограмма 5.1

Адрес

Машин-ный код

Метки

Мнемокод

Комментарий

0800

0803

0605

0808

0809

080А

080В

080С

080D

0810

0811

0812

0813

0816

21 000В

06 05

СD 0908

76

AF

4F

86

FF

D2 1108

23

05

С2 0В08

09

MAIN

АDDB

CNT

TRM

LXI H.0B00

MVI B, 05

CALL АDDB

HLT

XRAA

MOV C,A

АDD M

RST 7

JNC TRM

INR С

INX Н

DCR B

JNZ CNT

RET

Запись в регистровую пару адрес первого слагаемого

Загрузка в регистр В

количества слагаемых

Вызов подпрограммы

сложения АDDB

Останов

Очистить аккумулятор

Очистить счетчик переносов

Прибавить к содержимому аккумулятора число из массива

Прервать выполнение

программы

Если переноса нет,

то перейти к TRM

Увеличить счетчик переносов нa 1

Указать адрес следующего слагаемого

Уменьшить счетчик слагаемых

Если не все слагаемые, то перейти к CNT

Подпрограмма 5.2

Метка

Код

Операнды

Комментарий

M1

LHLD

XGHG

LHDL

DAD

SHLD

HLT

XI

Х2

D

Z1

Загрузить в пару HL первую

переменную с адреса XI

Обмен пар HL и DЕ

Загрузить в пару HL вторую

переменную с адреса Х2

XI + Х2

Записать результат по адресу Z1

Останов

В подпрограмме 5.3 младшие байты чисел размещены в ячейках памяти, адресуемых содержимым регистровых пар D (уменьшаемое) и Н (вычитаемое). На место вычитаемого помещается результат. В регистр С предварительно заносится количество байтов в операндах.

Подпрограмма 5.3

Метка

Код

Операнды

Комментарий

М1

XRA

LDАХ

SВВ

MOV

INX

INX

DCR

JNZ

RET

А

S

М

М, А

H

D

С

Ml

Очистка разряда С

байт уменьшаемого в - А

(А) = (А) – М(HL) - С

байт результата - в память

(HL) = (HL) + 1

(переход к новой ячейке)

(DE) = (DЕ) + 1

(переход к новой ячейке)

Уменьшить счетчик байтов на 1

Переход к Ml, если не 0 в счетчике

Возврат к основной программе

МП К580 выполняет только простейшие арифметические операции - сложение и вычитание. Для выполнения умножения и деления нужны специальные подпрограммы.

Существует несколько алгоритмов умножения. Простейший из них - последовательность сложений. Например: 25х3 = 25+25+25. Существенный недостаток этого алгоритма - значительная длительность процесса-вычисления. Второй алгоритм - умножение в столбец, основанное на последовательных сдвигах и суммировании. Отметим, что сдвиг возможен как влево, так и вправо. Например:

43 х 53 = 2279

x

x

00101011 00101011

+

+

00110101 00110101

00101011 00101011

00101011 00101011

+

+

0011010111 010000001

+

+

00101011 00101011

001110000111 01000101111

00101011 00101011

0100011100111 0100011100111

Приведем алгоритм умножения при сдвиге влево.

1. Загружаем в счетчик числа циклов число N, соответствующее размерности операндов.

2. Обнуляем регистр-накопитель. Его разрядность 2N.

3. Анализируем младший (текущий) бит множителя. Если он равен нулю, то переходим к пункту 5.

4. Прибавляем множимое к регистру-накопителю.

5. Сдвигаем множимое влево на 1 разряд.

6. Сдвигаем множитель вправо на один разряд (младший бит теряется).

7.Уменьшаем счетчик числа циклов на единицу.

8. Переходим к пункту 3, если счетчик не равен нулю.

Алгоритм умножения при сдвиге вправо отличается от вышеприведенного тем, что в пункте 3 анализируется старший (текущий) бит множителя, в пункте 5 - множимое сдвигается вправо ( или результат влево), в пункте 6 множитель сдвигается влево (старший бит теряется).

Рассмотрим подпрограмму 5.4, реализующую умножение двух 8-ми разрядных чисел по первому алгоритму.

Подпрограмма 5.4

Адрес

Машинный код

Метка

Мнемокод

Комментарий

0800

0803

0805

0806

0807

0808

080В

080С

080D

080Е

080

0810

0811

0812

0813

0814

0815

0816

01 00 00

2E 08

1F

57

D2 0Е 08

78

83

47

78

1F

47

79

1F

4F

2D

С2 05 08

С9

M1

M2

LXI B,0000

MVI L, 08

MOV A,D

RAR

MOV D,A

JNC М2

MOV A,B

ADD E

MOV B,A

MOV A,B

RAR

МОV В,А

МOV А, С

RAR

МОV С, А

DСR L

JNZ M1

RET

Очистить содержание

регистра-накопителя

Счетчик циклов в регистре L

Множитель - в А

Сдвиг множителя вправо (младший бит в С)

Возврат множителя из А в D

Переход к М2, если

младший бит равен 0

Старший байт накопителя в А

Сложение множимого

с накопителем

Старший байт результата в В

Старший байт накопителя в А

Сдвиг (А) вправо

Сдвинутый старший байт в В

Младший байт накопителя –

в А

Сдвиг (А) вправо

Сдвинутый младший байт в С

Уменьшить счетчик на 1

Переход на MI, если

в счетчике не нуль

Возврат к основной

программе

В этой подпрограмме в регистр D предварительно загружается множитель, в регистр Е - множимое. Результат формируется в регистровой паре ВC. В регистре L организуется счетчик числа циклов. Команды MOV А,D ; RAR; МОV D,А сдвигают вправо множитель, тем самым его младший (текущий) бит попадает в разряд С. Если он равен 1, то к регистру-накопителю прибавляется множимое - команды: МOV А,В; АDD Е; МОV В,А. В противном случае эти три команды пропускаются. В подпрограмме 5.4 содержимое регистра-накопителя сдвигается на один разряд вправо в каждом цикле, поэтому множимое прибавляется к старшему регистру в паре ВС. Возникающий при этом сигнал переполнения запоминается в С и при сдвиге пары ВС вправо занимает свое место - старший бит. Для сдвига вправо регистра ВС необходимы шесть команд – MOV A,B; RAR; MOV В,А; МОV А.С; RAR; MOV С,А. Команда DCR L уменьшает счетчик циклов на 1 и, если он не равен 0, команда JNZ M1 передает управление в начало цикла.

В подпрограмме 5.5 реализуется алгоритм умножения при сдвиге вправо. Здесь анализ разрядов множителя начинается со старшего бита.

Подпрограмма 5.5

Метка

Код

Операнд

Комментарий

M1

M2

MVI

MVI

LXI

XCHG

DAD Н

XCHG

JNC

DAD

DCR

RZ

DAD

JMP

A, 08

B, 00

H, 0000

M2

B

A

H

M1

Счетчик циклов в регистре А

Очистка В

(старший байт множимого)

Очистка регистра-накопителя

Восстановление НL,

множитель в DЕ

Переход на М2, если

Старший бит равен нулю

Прибавление множимого к

накопителю

(Счетчик)=(счетчик) – I

Возврат, если счетчик "0

Сдвиг накопителя влево

Переход на MI

Предварительно множимое загружается в регистр С, множитель - в регистр D. Результат будет подучен в регистровой паре НL. Первая команда организует счетчик числа циклов в регистре А. Затем обнуляются регистры B,H,L . Очистив регистр В, мы как бы получаем 8-ми разрядное множимое в регистровой паре ВC. В этом случае для прибавления множимого к регистру-накопителю НL можно использовать команду DAD В. Команда XCHG меняет местами содержимое регистровых пар НL и DE. Теперь в старшем байте пары НL находится множитель. Что находится в младшем байте - неважно. Команда DAD Н эквивалентна сдвигу влево на один разряд содержимого регистровой пары НL, т.е. множителя. Тем самым старший (текущий) разряд множителя попадает в разряд С регистр признаков. Если он равен единице, то множимое прибавляется к регистру-накопителю. Вторая команда – XCHG - восстанавливает исходное назначение регистровых пар НL и DE. Команда JNC M2 обеспечивает пропуск операции прибавления множимого к накопителю, если старший (текущий) разряд множителя равен нулю. Команда DCR A уменьшает счетчик числа циклов на единицу и, если он станет равным нулю, то выполняется возврат на подпрограммы (команда RZ). В противном случае, прежде чем перейти к новому циклу (команда JMR M1 ), нужно сдвинуть множимое вправо, либо результат - влево. Здесь выбрано второе (команда DAD Н).

Результатом операции деления является частное и остаток, существует несколько алгоритмов деления. Простейший из них -последовательность операций вычитания. Вычитание производится до тех пор, пока остаток не станет меньше делителя. В этом случае при вычитании сигнал заема для старшего разряда установит регистр признака С в единицу. Алгоритм деления следующий:

1) обнулить регистр для частного;

2) загрузить в регистр для остатка делимое;

3) вычитаем из остатка делитель;

4) если полученный остаток меньше делителя (признак С = 1), то переход к пункту 7;

5) увеличиваем частное на единицу;

6) перейти к пункту 3;

7) восстанавливаем остаток - прибавляем к остатку делитель.

Программа, реализующая данный алгоритм, приведена в подпрограмме 5.6.

Подпрограмма 5.6

Метка

Код

Операнд

Комментарий

М1

М2

MVI

MOV

SUB

JC

INR

JMP

ADD

RET

D , 00

A, B

C

M2

D

M1

C

Очистка регистра для частного

Делимое в А

Вычитание делителя из делимого

Переход на М2. если признак С = 1

(частное) = (частное)+ 1

Переход на M1

Восстановление остатка

Возврат к основной программе

В подпрограмме 6 делимое находится в регистре В, делитель в С, частное - в D, остаток - в А.

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

Рассматриваемый алгоритм осуществляет деление N - разрядного числа за N циклов. В каждом цикле выполняется одна опера­ция вычитания. При этом, если вычитаемое больше уменьшаемого, то С = 1.

Алгоритм расчета следующий.

1. Загружаем в счетчик числа циклов число N , соответству­ющее разрядности операндов.

2. Вычитаем делитель из старшего бита (нескольких старших бит на последующих циклах) делимого (остатка).

3. Если С = 0, то старший (текущий) бит частного равен 1. Перейти к пункту 5.

4. Если С = 1, то старший (текущий) бит частного равен 0. Восстанавливаем делимое (остаток), прибавляя к остатку делитель.

5. Сдвигаем вправо на один разряд делитель (результат будет тот же, если сдвигать влево остаток).

6. Уменьшаем счетчик числа циклов на единицу.

7. Переходим к пункту 2, если счетчик не равен нулю.

В подпрограмме 5.7 приведена программа деления 8-ми разрядных двоичных кодов. Предварительно в регистр С загружается делимое, а в регистр D - делитель. Частное формируется в регистре Н, а остаток - в Е. Первая команда загружает в регистр Н число 00, а в регистр L - число 08. В регистре L организуем счетчик числа циклов. Вторая команда очищает регистр Е, в котором будет находиться остаток после каждой операции вычитания и окончательный остаток.

Подпрограмма 5.7

Метка

Код

Операнд

Комментарий

М1

М2

LXI

MVI

MOV

RAL

MOV

MOV

RAL

SUB

JNZ

ADD

MOV

CMC

MOV

RAL

MOV

DCR

JNZ

RET

H, 0008

E, 00

A, C

C, A

A,E

D

M2

D

E, A

A, H

H, A

M1

Очистка Н, счетчик циклов в регистре L

Очистка регистра для остатка

Сдвиг делимого влево,

старший бит делимого - в разряд С регистра признаков

Сдвиг остатка влево

В младший бит остатка (С)

(остаток) = (остаток) -- (делитель)

Переход на М2, если разряд

признака С = 0

Восстановление остатка

Остаток - в регистр Е

Инверсия признака (С) – формирование

бита частного

Бит

частного

в регистр Н

(счетчик)=(счетчик) – 1

Переход на Ml,если в счетчике на нуль

Возврат к основной пpoгpaмме

Теперь нужно из старшего бита (нескольких бит) делимого вычесть делитель. Для этого из регистра С (делимое) старший бит перемещаем в разряд признака С. Это делают команды MOV А,С; RAL; MOV С,А. На последующих циклах в разряд признака С будут попадать следующие по старшинству биты делимого. Далее посылаем в аккумулятор остаток из регистра Е (команда MOV A,E). Командой RAL сдвигаем остаток влево и помещаем на место младшего разряда содержимое разряда С. Команда SUB D вычитает из аккумулятора делитель. Новый остаток пока в аккумуляторе. Теперь проверяем новое значение разряда С. Если содержимое разряда С = 1, то прежде всего необходимо восстановить остаток - команда ADD D . Если С = 0, то команда АDD D пропускается. Команда MOV Е,А возвращает остаток в регистр Е. Следует обратить внимание, что после выполнения команды SUB D значение разряда признака С есть инверсия текущего бита результата (команда ADD в данном случае не меняет С = 1). Команда СMC инвертирует содержимое разряда признака С - получаем бит результата. Он "вдвигается" в регистр Н со стороны младшего разряда (команды МОV А,Н; RAL, MOV H,A). Команда DCR L и JNZ M1 завершают цикл.

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