Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛАБОРАТОРНЫЙ ПРАКТИКУМ 2012.docx
Скачиваний:
24
Добавлен:
16.08.2019
Размер:
1.27 Mб
Скачать

Б) относительная адресация

адрес

код

мнемокод

комментарий

; ##### Y:=(A/B - C*F)*E #####

00

00

.base b

; rB - базовый

00

31 00

start: mvi b,start

; Относительный адрес - в rB: rB - базовый

02

40

in 0

; ввод A

03

1c 74

stor a,A

;операнд А запомнить по относительному адpесу ;((rb)+34h)

05

41

in 1

; ввод В

06

1c 75

stor a,B

; запомнить В по относительному адpесу ((rb)+35h)

08

42

in 2

; ввод C

09

1c 76

stor a,C

; запомнить C по относительному адpесу ((rb)+36h)

0b

43

in 3

; ввод F

0c

1c 77

stor a,F

; запомнить F по относительному адpесу ((rb)+37h)

0e

44

in 4

; ввод E

0f

1c 78

stor a,E

; запомнить E по относительному адpесу ((rb)+38h)

11

21

push b

; (rB) (sp) сохранить базовый адpес в стеке ;(сохраняется для того, чтобы можно было ;использовать регистр rb, операнд базового адреса в ;регистре rb пока остается неизменным)

12

14 75

load a,B

; загpузить в ra B, используя относительный адpес

14

20

push a

; (rA)(sp)- сохранить содержимое ra в стеке (операнд ;помещается в верхушку стека, находящийся в стеке ;операнд базового адреса опускается ниже см.рис.1)

15

15 74

load b,A

; загpузить в rB A, используя относительный адpес (при ;этом базовый адрес из регистра rB стирается)

17

90 01

mui a,1

; pаспpостpанить знак (переход от слова к двойному ;слову)

19

9c 81

dvm a,1(sp)

; pазделить (rA,rB) на содежимое веpхушки стека ;(результат помещается в rB Y=A/B)

1b

09

mov a,b

; пеpеслать частное в rA

1c

29

pop b

; (sp)(rB) : вытолкнуть из стека в rB A

1d

29

pop b

; (sp)(rB) : восстановить из стека базовый адрес ;(базовый адрес восстанавливается для того, чтобы ;можно было обратиться к относительным ячейкам ;памяти)

1e

1c 79

stor a,tmp

; запомнить по относительному адресу tmp результат ;A/B

20

14 76

load a,C

; загрузить в rA C

22

21

push b

; (rB)(sp) : сохранить содержимое базового регистра ;(сохраняется для того, чтобы можно было ;использовать регистр rB, операнд базового адреса в ;регистре rB пока остается неизменным)

23

15 77

load b,F

; загрузить в rB F ,используя относительный адрес (в регистре rB базовый адрес переписался на операндF !)

25

80

mur a,a

; (rB)*(rA)->(rA,rB),т.е. C*F (результат помещается в ;rB)

26

09

mov a,b

; результат C*F перемещается в rA

27

29

pop b

; (sp)(rB) : восстановить содержимое базового рег-ра

28

21

push b

; (rB)(sp) : сохранить содержимое базового регистра

29

15 79

load b,tmp

; загрузить A/B в rB,используя относит. адрес

2b

6a

sbr b,a

; (rB)-(rA) -> (rB) (Y=A/B - C*F из содержимого ;регистра rB вычитается содержимое регистра rA и ;помещается в регистр rB)

2c

38

xchg

; обменять содержимое регистров rA и rB

2d

29

pop b

; (sp)(rB) : восстановить содержимое базового рег-ра

2e

15 78

load b,E

; загрузить в rB E, используя относительный адрес

30

80

mur a,a

; (rB)*(rA)->(rA,rB) (A/B - C*F)*E результат в rB

31

38

xchg

; обменять содержимое регистров rA и rB.рез-т в rA

32

4d

out 5

; вывести результат в порт 5

33

f8

stop

; стоп

34

00

A: .ds 1

; ячейки

35

00

B: .ds 1

; для

36

00

C: .ds 1

; хранения

37

00

F: .ds 1

; исходных

38

00

E: .ds 1

; данных

39

00

tmp: .ds 1

; и промежуточного результата

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

(В примере использованы предыдущие данные). Рассмотрим еще один вариант данной программы. В этом варианте будем использовать только регистры и стековую память.