Вычисление арифметического выражения (50*lg11/ln3), страница 2

Процедура вычисления натурального логарифма с использованием ряда Тейлора

PROC   logarithm

заголовок процедуры

0840

E5

PUSH    HL

запись в стек содержимого регистровой пары HL

0841

26 00

MVI     H,0h

сбрасываем счетчик степеней

0843

06 03

MVI     B,3h

в регистр B – основание логарифма (3)

0844

CD 80 08

CALL   power

вызов процедуры возведения в степень

0845

16 00

M1:

MVI     D,0h

в старший байт запишем 0 (1-байтное число)

0847

59

MOV    E,C

в младший байт – число из регистра С

0844

CD 80 08

CALL   fact

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

084B

24

INR      H

увеличиваем счетчик степеней

084C

3E 00

MVI     A,0h

обнуляем регистр А

084E

B9

CMP    C

для сравнения с ним регистра С

0848

CD 80 08

CALL   divide

вызов процедуры деления

0852

25

DCR     H

коррекция счетчика

0848

CD 80 08

CALL   summ

вызов процедуры cуммирования

0853

54

MOV    D,H

передача результата через регистр D

0854

E1

POP       HL

чтение из стека в регистровую пару HL

0855

C9

RET

возврат из процедуры

Процедура умножения двух слов

PROC    multiplic

заголовок процедуры

0860

E5

PUSH    HL

запись в стек содержимого регистровой пары HL

0861

6B

MOV     L,E

в регистр L – младший байт множителя 1

0842

62

MOV     H,D

в регистр H – старший байт множителя 1

0863

05

DCR      B

начало отсчета суммирований

0864

7D

M2:

MOV     A,L

в регистр А – младший байт множителя 1

0865

83

ADD     E

прибавляем к нему регистр E (А=А+E)

0866

6F

MOV     L,A

запоминаем результат в регистре L

0867

7C

MOV     A,H

в регистр А – старший байт множителя 1

0868

CE

ACI        0h

прибавляем к нему перенос (А=А+0h+СY)

0869

82

ADD      D

и старший байт множителя 1 (А=А+D)

086A

05

DCR       B

уменьшаем счетчик суммирования

086B

CA 71 08

JZ           M3

переход на выход если счетчик в нуле

086E

C3 64 08

JMP        M2

безусловный переход для создания цикла

0871

EB

M3:

XCHG

обмен между парами регистров HL и DE

0872

E1

POP       HL

чтение из стека в регистровую пару HL

0873

C9

RET

возврат из процедуры

Процедура деления

PROC   divide

заголовок процедуры

0880

0E 00

MVI     C,0h

обнуляем регистр-счетчик результата

0882

7B

M4:

MOV    A,E

в регистр А младший байт делимого

0883

90

SUB      B

вычитаем из регистра А регистр B (A=A-B)

0884

5F

MOV    E,A

помещаем результат обратно в регистр E

0885

7A

MOV    A,D

в регистр А старший байт делимого

0886

DE 00

SBI       0h

вычитаем из регистра А заем (А=А-0h-CY)

0888

D6

RC        M4

выход если произошел заем из старшего байта

0889

57

MOV    D,A

помещаем результат обратно в регистр D

088A

0C

INR      C

увеличиваем счетчик результата

088B

C3 82

JMP     M4

безусловный переход для создания цикла

Процедура возведения в степень

PROC   power

заголовок процедуры

0910

7B

MOV     A,E

в регистр А – младший байт степени

0911

81

ADD     C

прибавляем к нему младший байт степени

0912

5F

MOV     E,A

сохраняем результат в регистре Е

0913

7A

MOV     A,D

в регистр А – старший байт основания

0917

CE 00

ACI       0h

прибавляем к нему перенос от умножения

0918

80

ADD     B

и прибавляем старший байт 2 множителя

0919

57

MOV    D,A

сохраняем результат в регистре D

091А

C9

RET

возврат из процедуры

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

PROC   fact

заголовок процедуры

0A80

0E 00

MVI     C,0h

обнуляем регистр-счетчик результата

0A82

7B

M4:

MOV    A,E

в регистр А младший байт множимого

0A83

90

SUB      B

вычитаем из регистра А регистр B (A=A-B)

0A84

5F

MOV    E,A

помещаем результат обратно в регистр E

0A85

7A

MOV    A,D

в регистр А старший байт множимого

0A86

21 05 0B

CALL   multiplic

вызов процедуры умножения

0A89

DE 00

SBI       0h

вычитаем из регистра А заем (А=А-0h-CY)

0A8A

D6

RC        M4

выход если произошел заем из старшего байта

0A8B

57

MOV    D,A

помещаем результат обратно в регистр D

0A8C

0C

INR      C

увеличиваем счетчик результата

088B

C3 82

JMP     M4

безусловный переход для создания цикла

Процедура сложения двух слов

PROC   summ

заголовок процедуры

0B10

7B

MOV     A,E

в регистр А – младший байт 1 слагаемого

0B11

81

ADD     C

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

0B12

5F

MOV     E,A

сохраняем результат в регистре Е

0B13

7A

MOV     A,D

в регистр А – старший байт 1 слагаемого

0B14

CE 00

ACI       0h

прибавляем к нему перенос от сложения

0B16

80

ADD     B

и прибавляем старший байт 2 слагаемого

0B17

57

MOV    D,A

сохраняем результат в регистре D

0B18

C9

RET

возврат из процедуры

После выполнения программы в регистровой паре ВС содержится мантисса результата, а в регистре D содержится порядок результата: 47,39ּ100.

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

Таблица 2

Адрес

Содержимое ячейки (НЕХ)

Комментарий

0B00

32

число 50

0B01

В

число 11

0B02

3

число 3