Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курсовой.docx
Скачиваний:
21
Добавлен:
11.02.2015
Размер:
66.37 Кб
Скачать

2.2 Блок схема алгоритма решения задачи.

Начало

(HL)Addr1 1

M(Addr1)количе- 2

ство чисел

M(Addr2)3

M(Addr3)4

(HL)0000 5

(BC)начальный ад- 6

рес массива чисел

(A)младший байт 7

слагаемого

Сдвиг аккумулятора 8

вправо без переноса

(A)A^80 9

(E)A 10 10

1

4

2

(BC)BC+1 11

(A)старший байт 12

слагаемого

Сдвиг аккумулятора 13

право с переносом

(A)(A)˅(E)

(D)A 14 10

S=0

1

(BC)BC+1 11

(A)старший байт 12

слагаемого

Сдвиг аккумулятора 13

право с переносом

(A)(A)˅(E)

(D)A 14 10

S=0

4

Да

Нет

(A)M(Addr3) 15 15 10

(A)A+FF 16 10

M(Addr3)A 17 10

(BC)BC-1 18

2

4

(A)младший байт 19

слагаемого

2

Сдвиг аккумулятора 20

право с переносом

(E)(A)

(HL)HL+DE 21

C=0

(A)M(Addr2) 22 15 10

(A)A+1 23 10

4

Да

Нет

M(Addr2)A 24 10

(A)M(Addr1) 25 10

(A)A-1 26 10

3

4

3

4

Z=1

M(Addr1)27 10

(BC)BC+2 28

(A)M(Addr2) 29 10

(D)A30 10

(A)M(Addr3)31 10

(A)A+D 32 10

M(Addr4)L 33

M(Addr5)H

Конец

M(Addr1) – ячейка памяти 0810h, M(Addr2) – ячейка памяти 0811h, M(Addr3) – ячейка памяти 0812h, M(Addr4) – ячейка памяти 0900h, M(Addr5) – ячейка памяти 0901h. Программа будет храниться в адресном пространстве, начиная с ячейки 0813h.

2.3 Описание программы на языке Ассемблера и в машинных кодах.

Описание программы представлено в таблице 1:

Метка

Адрес

Данные

Ассемблер

Мнемоника

Комментарий

M1

M2

0813

21

LXI H, 0810

(HL)0810

Загрузить в регистровую пару HL адрес ячейки памяти 0810

0814

10

0815

08

0816

36

MVI M, 05

M(HL)05

Записать количество слагаемых в ячейку памяти, адрес которой хранится в регистровой паре HL

0817

05

0818

23

INX H

(HL)HL+1

Инкрементирование регистровой пары HL

0819

36

MVI M, 00

M(HL)00

Обнулить ячейку памяти

081A

00

081B

23

INX H

(HL)HL+1

Инкрементирование регистровой пары HL

081C

36

MVI M, 00

M(HL)00

Обнулить ячейку памяти

081D

00

081E

21

LXI H, 0000

(HL)0000

Обнулить промежуточную сумму в регистровой паре HL

081F

00

0820

00

0821

01

LXI B,0800

(BC)0800

Загрузить в регистровую пару BC начальный адрес массива данных

0822

00

0823

08

0824

0A

LDAX B

(A)

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

0825

0F

RRC

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

0826

E6

ANI 80

(A)(A)^10000000

Операция логическое И аккумулятора с данными 80h

0827

80

0828

5F

MOV E,A

(E)(A)

Переслать маску из регистра А в регистр E

0829

37

STC

C=1

Установить бит переноса в значение 1

082A

3F

CMC

C=

Инвертировать значение бита переноса

082B

03

INX B

(BC)BC+1

Инкрементирование регистровой пары BC

082C

0A

LDAX B

(A)

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

082D

1F

RAR

Cдвиг аккумулятора вправо с переносом

082E

B3

ORA E

(A)(A)˅(E)

Операция логическое ИЛИ аккумулятора и регистра E

082F

57

MOV D,A

(D)(A)

Переслать старший байт из регистра А в регистр D

0830

C6

ADI 00

(A)(A)+00

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

0831

00

0832

F2

JP M2

JMP if S=0

Переход на метку M2, если бит знака S равен нулю

0833

3D

0834

08

0835

3A

LDA 0812

(A)

Загрузить в аккумулятор содержимое ячейки памяти 0812

0836

12

0837

08

0838

C6

ADI FF

(A)(A)+FF

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

0839

FF

083A

32

STA 0812

M(0812)(A)

Записать содержимое аккумулятора в ячейку памяти 0812

083B

12

083C

08

083D

0B

DCX B

(BC)(BC)-1

Декрементирование регистровой пары BC

083E

0A

LDAX B

(A)

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

083F

1F

RAR

Cдвиг аккумулятора вправо с переносом

0840

5F

MOV E,A

(E)(A)

Переслать содержимое регистра А в регистр E

0841

19

DAD D

(HL)(HL)+(DE)

Сложить регистровые пары HL и DE

0842

D2

JNC M3

JMP if C=0

Переход на метку M3, если бит переноса С равен нулю

0843

4C

0844

08

0845

3A

LDA 0811

(A)

Загрузить в аккумулятор содержимое ячейки памяти 0811

0846

11

0847

08

0848

3C

INR A

(A)(A)+1

0849

32

STA 0811

M(0811)(A)

Записать содержимое аккумулятора в ячейку памяти 0811

084A

11

084B

08

M3

084C

3A

LDA 0810

(A)

Загрузить в аккумулятор количество слагаемых

084D

10

084E

08

084F

3D

DCR A

(A)(A)-1

Декрементирование содержимого аккумулятора

0850

CA

JZ M4

JMP if Z=1

Переход на метку M4, если бит ноля Z равен единице

0851

5B

0852

08

0853

32

STA 0810

M(0810)(A)

Записать содержимое аккумулятора в ячейку памяти 0810

0854

10

0855

08

0856

03

INX B

(BC)(BC)+1

Инкрементирование регистровой пары BC

0857

03

INX B

(BC)(BC)+1

Инкрементирование регистровой пары BC

0858

C3

JMP M1

Безусловный переход на метку M1

0859

24

085A

08

M4

085B

3A

LDA 0811

(A)

Загрузить в аккумулятор переносы

085C

11

085D

08

085E

57

MOV D,A

(D)(A)

Переслать содержимое регистра А в регистр D

085F

3A

LDA 0812

(A)

Загрузить в аккумулятор знак

0860

12

0861

08

0862

82

ADD D

(A)

Сложить содержимое регистров A и D

0863

22

SHLD 0900

M(0900)(L)

M(0901)(H)

Записать содержимое регистровой пары HL в ячейки памяти 0900h и 0901h

0864

00

0865

09

0866

FF

RST 7

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

Вывод

Основной сложностью, при составлении программы, было составление цикла представления чисел к обычному виду, то есть когда знак находится в седьмом бите старшего байта. В связи с этим были задействованы все регистры, и для учета знака и переноса из старшего бита суммы пришлось использовать ячейки памяти: в одной учитывались переносы, в другой – знак.

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

Ответ выводится в ячейки памяти 0900h – 0901h, причем младший байт записывается в ячейку 0900h, а старший в ячейку 0901h. Третий байт суммы хранится в аккумуляторе.