Подпрограмма умножения целых двоичных чисел без знака формата 8*8=16. Метод умножения

Страницы работы

Фрагмент текста работы

Подпрограмма умножения целых двоичных чисел без знака формата 8*8=16. Вариант А.

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

Входные параметры: (С) – множитель, (Е) – множимое.

Выходной параметр: (H, L) – произведение. Используются все регистры, сохраняется (С).

Оценка: длина – 30 байт, время – не более 679 такта.

Адрес

Машинный код

Метка

Команда

Комментарий

Обнуление текущей суммы ЧП

0510

AF

XRA   A

0511

67

MOV   H, A

0512

6F

MOV   L, A

Перемещение множимого

0513

53

MOV   D, E

(D) – множимое

0514

5F

MOV   E, A

(Е) – 0

Проверка сомножителей на 0

0515

81

ADD   C

0516

C8

RZ

если множитель = 0 

0517

AF

XRA   A

0518

82

ADD   D

0519

C8

RZ

если множимое = 0 

051А

0608

MVI   B, 8

счётчик циклов

Сдвиг множителя вправо

051C

79

LOOP:

MOV   A, C

051D

0F

RRC

051E

4F

MOV   C, A

051F

D22305

JNC   M

если разряд множителя = 0

Сложение множимого с текущей суммой ЧП

0522

19

DAD   D

Сдвиг теущей суммы ЧП вправо

0523

7C

M:

MOV   A, H

0524

1F

RAR

0525

67

MOV   H, A

0526

7D

MOV   A, L

0527

1F

RAR

0528

6F

MOV   L, A

Проверка конца цикла

0529

05

DCR   B

052A

C21C05

JNZ   LOOP

зацикливание

0000

END

Подпрограмма умножения целых двоичных чисел без знака формата 8*8=16. Вариант Б.

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

Входные параметры: (С) – множитель, (Е) – множимое.

Выходной параметр: (H, L) – произведение. Используются все регистры, сохраняется (С), (Е).

Оценка: длина – 22 байта, время – не более 423 тактов.

Адрес

Машинный код

Метка

Команда

Комментарий

Обнуление текущей суммы ЧП

0550

AF

XRA   A

0551

67

MOV   H, A

0552

6F

MOV   L, A

0553

57

MOV   D, A

(D) = 0

Проверка сомножителей на 0

0554

81

ADD   C

0555

C8

RZ

если множитель = 0 

0556

AF

XRA   A

0557

83

ADD   E

0558

C8

RZ

если множимое = 0 

0559

61

MOV   H, C

(H) – множитель

055А

0608

MVI   B, 8

счётчик циклов

Сдвиг множителя и текущей суммы ЧП влево

055C

29

LOOP:

DAD   H

055D

D26105

JNC   M

если разряд множителя = 0

Сложение множимого с текущей суммой ЧП

0560

19

DAD   D

Проверка конца цикла

0561

05

M:

DCR   B

0562

C25C05

JNZ   LOOP

зацикливание

0000

END

Подпрограмма умножения целых двоичных чисел без знака формата 8*8=16. Вариант B.

Метод умножения: 8 (или менее) циклов сдвигов множителя вправо (с контролем остатка на 0), а множимого влево.

Входные параметры: (С) – множитель, (Е) – множимое.

Выходной параметр: (H, L) – произведение. Используются все регистры, кроме В; сохраняется (С).

Оценка: длина – 22 байта, время – не более 499 тактов.

Адрес

Машинный код

Метка

Команда

Комментарий

Обнуление текущей суммы ЧП

0590

AF

XRA   A

0591

67

MOV   H, A

0592

6F

MOV   L, A

0593

57

MOV   D, A

(D) = 0

Проверка сомножителей на 0

0594

83

ADD   E

0595

C8

RZ

если множимое = 0 

0596

AF

XRA   A

0597

81

ADD   C

(А) - множитель

0598

C8

RZ

если множитель = 0 

Сдвиг множителя вправо

0599

1F

LOOP:

RAR

059A

D29E05

JNC   M

если разряд множителя = 0

Сложение множимого с текущей суммой ЧП

059D

19

DAD   D

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

059E

EB

M:

XCHG

059F

29

DAD   H

0590

EB

XCHG

Проверка конца цикла

05A1

B7

ORA   A

05A2

C29905

JNZ   LOOP

зацикливание

0000

END

Подпрограмма умножения целых двоичных чисел без знака формата 16*16=32.

Метод умножения: 16 циклов сдвигов множителя и суммы частичных произведений влево.

Входные параметры: (В, С) – множимое, (D, Е) – множитель.

Выходные параметры: (D, E, H, L) – произведение. Используются все регистры, сохраняется (B, С).

Оценка: длина – 40 байт, время – не более 1711 тактов.

Адрес

Машинный код

Метка

Команда

Комментарий

Обнуление текущей суммы ЧП

0600

AF

XRA   A

0601

67

MOV   H, A

0602

6F

MOV   L, A

Проверка сомножителей на 0

0603

B2

ORA   D

0604

B3

ORA   E

0605

C8

RZ

если множитель = 0 

0606

AF

XRA   A

0607

B0

ORA   B

0608

B1

ORA   C

0609

C20F06

JNZ   M

если множимое не 0 

060C

57

MOV   D, A

обнуление множителя

060D

5F

MOV   E, A

060E

C9

RET

060F

AF

M:

XRA   A

счётчик циклов = 0

Сдвиг множителя влево

0610

EB

LOOP:

XCHG

0611

29

DAD   H

0612

EB

XCHG

0613

1F

RAR

сохранение переноса в (А)

Сдвиг суммы ЧП влево

0614

29

DAD   H

0615

D21906

JNC   M1

0618

13

INX   D

учёт переноса от сдвига

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

0619

17

M1:

RAL

восстановление переноса

061А

D22206

JNC   M2

если разряд множителя = 0

Сложение множимого с текущей суммой ЧП

061D

09

DAD   B

061E

D22206

JNC   M2

0621

13

INX   D

учёт переноса от сложения

Проверка конца цикла по переполнению (А)

0622

C610

М2:

ADI   16

0624

D21006

JNC   LOOP

зацикливание

0000

END

Подпрограмма деления целых двоичных чисел без знака формата 16:8=(8,8).

Метод деления без восстановления остатка.

Входные параметры: (H, L) – делимое, (С) – делитель.

Выходные параметры: (H) – остаток, (L) – частное, СY=0 – признак переполнения частного. Используются все регистры, кроме (D, E); сохраняется (С).

Оценка: длина – 58 байт, время – не более 850 тактов.

 

Адрес

Машинный код

Метка

Команда

Комментарий

 

Проверка частного на переполнение: частное > 8 бит?

 

0А20

7C

MOVA, H

 

0А21

91

SUB   C

 

0А22

D0

RNC

если переполнение, CY=0

 

0А23

0608

MVI   B, 8

счётчик циклов

 

0А25

37

STC

CY=1 – признак остатка = или > 0

 

Проверка знака остатка: «+», если CY=1; «-», если CY=0

 

0А26

D23B0A

LOOP:

JNC   M1

если остаток < 0

 

0А29

29

DAD   H

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

 

0А2А

7C

MOV   A, H

 

0А2В

DA36OA

JC   M2

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

 

Вычитание делителя из остатка

 

0А2E

91

SUB   C

 

0А2F

67

MOV   H, A

 

30

D24A0A

M6:

JNC   M3

если результат = или  > 0

 

33

C34F0A

JMP   M4

результат < 0

 

Вычитание делителя из остатка

 

36

91

M2:

SUB   C

 

37

67

MOV   H, A

 

38

C34A0A

JMP   M3

результат = или > 0

 

Сдвиг влево остатка и частного в (H, L) при остатке < 0

 

3B

29

M1:

DAD   H

 

3C

7C

MOV   A, H

 

3D

DA450A

JC   M5

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

 

Сложение делителя с отрицательным остатком

 

0А40

81

ADD   C

 

0А41

67

MOV   H, A

 

0А42

C3300A

JMP   M6

 

Сложение делителя с отрицательным остатком

 

0А45

81

M5:

ADD   C

 

0А46

67

MOV   H, A

 

0А47

D24F0A

JNC   M4

если сумма < 0

 

Установка разряда частного в «1»

 

0А4A

23

M3:

INX   H

 

0А4B

37

STC

CY=1 – положительный остаток

 

0А4C

C3500A

JMP   M7

 

0А4F

AF

M4:

XRA   A

CY=0 – отрицательный остаток

 

Проверка конца цикла

 

0А50

05

M7:

DCR   B

 

0А51

C2260A

JNZ   LOOP

зацикливание

 

0А54

D8

RC

если положительный остаток

 

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

 

0А55

7C

MOV   A, H

 

0А56

81

ADD   C

 

0А57

67

MOV   H, A

 

0А58

37

STC

CY=1

 

0000

END

 

Подпрограмма деления целых двоичных чисел без знака формата 16:8=(16,8).

Входные параметры: (H, L) – делимое, (С) – делитель.

Выходные параметры: (D, E) – частное, (H) – остаток,  СY=1 – признак нулевого делителя или превышения величины делителя над делимым. Используются все регистры, глубина стека - 2.

Оценка: длина – 88 байт, время – не более 1831 тактов.

Адрес

Машинный код

Метка

Команда

Комментарий

Проверка: делимое > делителя?

0BC0

AF

XRA   A

0BC1

84

ADD   H

(А) – СТБ делимого

0BC2

C2C80B

JNZ   M1

если СТБ > 0

0BC5

85

ADD   L

(А) – МЛБ делимого

0BC6

B9

CMP   C

0BC7

D8

RC

если делимое < делителя

Проверка делителя на 0

0BC8

AF

M1:

XRA   A

0BC9

81

ADD   C

(А) - делитель

0BCA

37

STC

СY=1

0BCB

C8

RZ

если делитель = 0

0BCC

0608

MVI   B, 8

счётчик циклов

Нормализация делителя: устранение левых нулей

0BCE

3F

CMC

СY=0

0BCF

17

LOOP1:

RAL

0BD0

04

INR   B

увеличение счётчика

0BD1

D2CF0B

JNC   M1

если выдвинутый разряд = 0

0BD4

1F

RAR

0BD5

4F

MOV   C, A

(С) – нормализованный делитель

0BD6

05

DCR   B

уменьшение счётчика

Сохранение величины сдвигов делителя

0BD7

78

MOV   A, B

0BD8

DE08

SBI   8

0BDA

F5

PUSH   PSW

Нормализация делимого: устранение левых нулей

0BDB

AF

LOOP2:

XRA   A

0BDC

84

ADD   H

(А) – СТБ делимого

0BDD

FAE50B

JM   M2

если старший разряд = 1

0BE0

29

DAD   H

сдвиг делимого влево

0BE1

05

DCR   B

уменьшение счётчика

0BE2

C3DB0B

JMP   LOOP2

зацикливание

0BE5

110000

M2:

LXI   D, 0

обнуление частного

Вычитание делителя из делимого ((А) – СТБ делимого)

0BE8

91

SUB   C

0BE9

13

INX   D

установка разряда частного = 1

0BEA

D2EF0B

JNC   M3

если разность > 0

0BED

1B

DCX   D

сброс разряда частного = 0

0BEE

81

ADD   C

восстановление делимого

0BEF

67

M3:

MOV   H, A

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

0BF0

AF

XRA   A

0BF1

80

ADD   B

0BF2

CA0D0C

JZ   M7

если счётчик = 0

Сдвиг влево частного (D, E) и остатка (H, L)

0BF5

EB

LOOP:

XCHG

0BF6

29

DAD   H

0BF7

EB

XCHG

0BF8

29

DAD   H

0BF9

7C

MOV   A, H

(А) – СТБ остатка

0BFА

DA060C

JC   M4

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

Вычитание делителя из остатка

0BFD

91

SUB   C

0BFE

D2070C

JNC   M5

если разность > 0

Разность < 0, восстановление остатка

0C01

81

ADD   C

0C02

67

MOV   H, A

0C03

C3090C

JMP   M6

Переполнение остатка, установка разряда частного = 1

0C06

91

M4:

SUB   C

вычитание делителя

0C07

67

M5:

MOV   H, A

0C08

13

INX   D

разряд частного = 1

Проверка конца цикла

0C09

05

M6:

DCR   B

0C0A

C2F50B

JNZ   LOOP

зацикливание

Коррекция остатка: сдвиг вправо

0C0D

F1

M7:

POP   PSW

(А) – счётчик сдвигов

0C0E

C8

RZ

если счётчик = 0 (CY=0)

0C0F

4F

MOV   C, A

0C10

AF

XRA   A

0C11

84

ADD   H

(А) - остаток

0C12

1F

LOOP3:

RAR

0C13

0D

DCR   C

0C14

C2120C

JNZ   LOOP3

зацикливание

0C17

67

MOV   H, A

0000

END

Подпрограмма деления целых двоичных чисел без знака формата 16:16=(16,16) с целым частным.

Метод деления с восстановлением остатка.

Входные параметры: (H, L) – делимое, (В, С) – делитель.

Выходные параметры: (D, E) – частное, (H, L) – остаток,  СY=0 – признак

Похожие материалы

Информация о работе