Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Пояснительная записка ТГТУ.210303.010.docx
Скачиваний:
1
Добавлен:
01.05.2025
Размер:
338.62 Кб
Скачать

4 Разработка программы на языке ассемблера и в машинных кодах

В таблице 2 приведен текст программы на ассемблере и машинных кодах с подробными комментариями, составлены по алгоритму, разработанному нами ранее.

Таблица 2

Адрес

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

Метка

Мнемо-ника

Операнд

Комментарии

Блок начальных директив

ORG

0000H

Директива начального адреса

PORTX

EQU

01H

Инициализация портов ввода переменных x(t), y(t), z(t) и вывода V(t)

PORTY

EQU

02H

PORTZ

EQU

04H

PORTV

EQU

08H

SAVEH

EQU

1000H

Инициализация вспомогательных констант

SAVEB

EQU

1002H

OST

EQU

1003H

0000

C3 00 01

JMP

START

ORG

0100H

Директива начального адреса программы

0100

3E 00

START:

MVI

A

Обнуление флага наличия в результате остатка 0,5

(Флаг по адресу 1003H)

0102

32 03 10

STA

OST

0105

OE 02

MVI

C,02H

0107

DB 02

REP:

IN

PORTY

Организация очереди на стеке. И заполнение ее опережающим сигналом.

0109

00

NOP

010A

00

NOP

010B

00

NOP

010C

00

NOP

010D

FE 42

CPI

4DH

010F

DA 07 01

JC

REP

0112

67

MOV

H,A

0113

E5

PUSH

H

0114

0D

DCR

C

0115

C2 07 01

JNZ

REP

0118

0E 01

MVI

C,01H

Ввод переменной y(t)

011A

DB 02

REPP:

IN

PORTY

Ввод y(t); параметр в аккумуляторе

011C

00

NOP

Пустые операции для увеличения длительности такта ввода

011D

00

NOP

011E

00

NOP

011F

00

NOP

0120

FE 42

CPI

4DH

Проверка на не превышение допустимого входного сигнала

0122

F2 1A 01

JM

REPP

0125

67

MOV

H,A

Запись y(t) в очередь.

0126

E5

PUSH

H

0127

0D

DCR

C

0128

C2 30 01

JNZ

SHAG

012B

31 FD FF

LXI

SP,FFFD

012E

0E 03

MVI

C,03H

Ввод переменной x(t)

0130

DB 01

SHAG:

IN

PORTX

Ввод x(t); параметр в аккумуляторе

0132

00

NOP

Пустые операции для увеличения длительности такта ввода

0133

00

NOP

0134

00

NOP

0135

00

NOP

0136

FE 42

CPI

4DH

Проверка на не превышение допустимого входного сигнала

0138

F2 1A 01

JM

REPP

013B

5F

MOV

E,A

Сохранение x(t) в регистровой паре DE

013C

16 00

MVI

D,00H

Ввод переменной z(t)

013E

DB 04

IN

PORTZ

Ввод z(t); параметр в аккумуляторе

0140

00

NOP

Пустые операции для увеличения длительности такта ввода

0141

00

NOP

0142

00

NOP

0143

00

NOP

0144

FE 42

CPI

4DH

Проверка на не превышение допустимого входного сигнала

0146

F2 1A 01

JM

REPP

Вычисление значения

0149

EB

XCHG

Помещение множимого в HL

014A

CD 87 01

CALL

MUL

Вызов подпрограммы умножения

014D

62

MOV

D,H

Помещение результата в регистровую пару DE

014E

6B

MOV

E,L

Вычисление значения

014F

3E 07

MVI

A,05H

Помещение множителя 05H в аккумулятор

0151

CD 87 01

CALL

MULL

Вызов подпрограммы умножения

0154

A7

ANA

A

Сброс флага перенос

0155

7A

MOV

A,D

Старший байт в аккумуляторе

0156

1F

RAR

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

0157

57

MOV

D,A

Аккумулятор в регистр H

0158

7B

MOV

A,E

Младший байт в аккумуляторе

0159

1F

RAR

Сдвиг аккумулятора без переноса, младший бит старшего байта становится старшим битом младшего байта, младший бит младшего байта в аккумуляторе(Остаток)

015A

5F

MOV

E,A

Аккумулятор в регистр L

В регистровой паре HL

015B

D2 47 01

JNC

STEP

Проверка на наличие остатка, если есть остаток то в ОЗУ по адресу 1003H заносится 01H

015E

3E 01

MVI

A,01H

0160

32 03 10

STA

OST

0163

19

STEP:

DAD

D

Вычисление

0164

EB

XCHG

в регистровую пару DE

Вычисление значения

0165

E1

POP

H

y(t) из очереди в регистровую пару HL

0166

6C

MOV

L,H

0167

26 00

MVI

H,00H

0169

3B

DCX

SP

016A

3B

DCX

SP

016B

3B

DCX

SP

016C

3B

DCX

SP

016D

0D

DCR

C

016E

19

DAD

D

в регистровой паре HL

Вывод результата V(t)

0170

3A 03 10

LDA

OST

Загрузка значения флага остатка из ОЗУ в аккумулятор

0173

FE 01

CPI

01H

Проверка на наличие остатка

0175

C2 7D 01

JNZ

ASTEP

В случае наличия остатка выполняется присвоение старшему биту результата 1

0178

1F

RAR

0179

7C

MOV

A,H

017A

17

RAL

017B

0F

RRS

017C

67

MOV

H,A

017D

7D

ASTEP:

MOV

A,L

Вывод младшего байта результата

017E

D3 08

OUT

PORTV

0180

7C

MOV

A,H

Вывод старшего байта результата

0181

D3 08

OUT

PORTW

0183

C3 1A 01

JMP

REPP

Безусловный переход к новому циклу

0186

76

HLT

Остановка программы

Подпрограмма умножения

0187

EB

MUL:

XCHG

Начало подпрограммы умножения. Сохранение регистровой пары HL в ОЗУ

0188

22 00 10

SHLD

SAVEH

018B

EB

XCHG

018C

16 00

MVI

D,00H

Обнуление частичной суммы

018E

1E 00

MVI

E,00H

0190

06 08

MVI

B,08H

Установка счетчика циклов

0192

0F

REPT:

RRC

Сдвиг следующего разряда множителя в флаг переноса

0193

D2 99 01

JNC

ZERO

Если следующий разряд не ноль то прибавляем к частичной сумме множимое

0196

EB

XCHG

0197

19

DAD

D

0198

EB

XCHG

0199

29

ZERO:

DAD

H

Удвоение регистровой пары HL

019A

05

DCR

B

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

019B

C2 92 01

JNZ

REPT

Переход если вычисления не закончены

019E

2A 00 10

LHLD

SAVEH

Загрузка значений регистровой пары HL из ОЗУ

0201

EB

XCHG

0202

3A 02 10

LDA

SAVEB

Загрузка значения регистра B из ОЗУ

0205

47

MOV

B,A

0206

C9

RET

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

END

Директива достижения конца программы