Добавил:
kostikboritski@gmail.com Выполнение курсовых, РГР технических предметов Механического факультета. Так же чертежи по инженерной графике для МФ, УПП. Писать на почту. Дипломы по кафедре Вагоны Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

литература / Пухальский Проектирование микропроцессорных систем 2001

.pdf
Скачиваний:
388
Добавлен:
12.11.2017
Размер:
21.12 Mб
Скачать

70

Глава I. Микропроцессоры 8080 и 8085

 

 

Рис. 1.26. Схема формирования 8-разрядного кода Грея

 

; Табличное преобразование 8 -разрядного двоичного кода в код Грея

 

Ram

equ

2000h

Ram = 2000h — начальный адрес RAM

Data Segment

 

defseg

Gray_seg, start = Ram, class = Data

 

 

seg

Gray_seg

 

 

 

 

Conv

db

4, 5, 6, 7, 2Ch, OEAh, 2Dh, OFB/z; Эти двоичные числа преобразовать в код Грея

ds

8

Резервирование 8 байт для преобразований

 

Gray

ds

100/z

Резервирование 256 байт для таблицы кода Грея

 

 

defseg

Main_seg, start = 100h, class = Code

Code Segment

 

seg

Main__seg

 

 

 

 

; Копирование преобразуемых двоичных чисел

 

 

LXI

H, Ram

HL

 

2000h — начальный адрес двоичных чисел

 

 

LXI

D, Conv

DE <— 2008h — начальный адрес области копирования

 

MVI

B, 8

В <— 8 — количество преобразуемых чисел

 

LMO: MOV

A, M

А

M(HL)

 

 

STAX

D

M(DE) <- А

 

 

INX

H

 

 

 

 

 

INX

D

 

 

 

 

 

DCR

В

 

 

 

 

 

JNZ

LMO

 

 

 

 

; Генерация таблицы 8 -разрядных двоичных чисел

 

 

LXI

H, Gray

HL

 

2010h — начальный адрес таблицы двоичных чисел

 

SUB

A

А < - 0

 

 

 

MOV

B, A

В

0

 

 

LM1: MOV

M, A

A/(HL)

А

 

 

INX

H

 

 

 

 

 

INR

A

 

 

 

 

 

DCR

В

 

 

 

 

 

JNZ

LM1

 

 

 

 

; Генерация таблицы 8 -разрядного кода Грея

 

 

LXI

H, Gray

HL <— 2010h — начальный адрес таблицы кода Грея

 

 

MVI

B ,0

 

 

 

 

LM2: SUB

A

CY

 

0

 

 

MOV

A, M

А <— A/(HL) — двоичное число из таблицы

 

 

MOV

C, A

 

 

 

 

 

RAR

 

А7А6А5А4А3А2А 1Ay i— 0А7А^А^А4A3АтА |

 

 

XRA

С

А7АбА5 ... А0 <— 7 © 0)(А6 © А7ХА5 © Аб)... (Ао © А|)

 

MOV

M, A

M(HL)

А — запись кода Грея в таблицу

 

 

INX

H

 

 

 

 

 

DCR

В

 

 

 

 

 

JNZ

LM2

 

 

 

 

 

 

 

 

 

 

1.8. Директивы ассемблера

 

 

 

 

71

; Преобразование восьми двоичных чисел в код Грея

 

 

 

 

 

 

 

 

LXI

D, Conv

DE <—2008/г — начальный адрес преобразуемых чисел

 

 

MV1

B, 8

В

8 — количество преобразуемых чисел

 

 

 

 

LM3: LXI

H, Gray

HL <—2010/? — начальный адрес таблицы кода Грея

 

 

 

LDAX D

 

А <— М(DE) — преобразуемое двоичное число

 

 

 

 

ADD

L

 

 

 

 

 

 

 

 

 

 

 

 

 

 

MOV

L, A

 

 

 

 

 

 

 

 

 

 

 

 

 

MVI

A,

0

 

 

 

 

 

 

 

 

 

 

 

 

 

ADC

H

 

 

 

 

 

 

 

 

 

 

 

 

 

 

MOV

H, A

HL <— HL + M(DE) — адрес кода Грея в таблице

 

 

 

 

MOV

A, M

А <— M(HL) — код Грея из таблицы

 

 

 

 

 

 

STAX

D

 

М(DE) <— А — преобразованное в код Грея двоичное число

 

 

INX

D

 

 

 

 

 

 

 

 

 

 

 

 

 

 

DCR

В

 

 

 

 

Результат преобразования:

 

 

 

 

 

JNZ

LM3

 

4 —» 6, 5 —> 7, 6 —> 5, 7 —» 4,

 

 

 

 

 

 

end

 

 

 

h -> ЗА/г, ЕА/г -н> 9Fh, 2Dh

ЗВ/г, FB h -> 86/г

 

 

Таблица 1.14. Взаимное преобразование 8-разрядных двоичных чисел и кода Грея

В

Код Грея

в

 

Код Грея

в

 

Код Грея

в

 

Код Грея

00

00

0000 0000

40

60

0110 0000

80

СО

1100 0000

со

АО

1010 0000

01

01

0000 0001

41

61

0110 0001

81

С1

1100 0001

С1

Al

1010 0001

02

03

0000 0011

42

63

01100011

82

СЗ

1100 ООП

С2

АЗ

1010 0011

03

02

0000 0010

43

62

01100010

83

С2

1100 0010

сз

А2

1010 0010

04

06

0000 0110

44

66

01100110

84

С6

11000110

С4

А6

10100110

05

07

0000 0111

45

67

0110 0111

85

С7

1100 0111

С5

A l

10100111

06

05

0000 0101

46

65

01100101

86

С5

1100 0101

С6

А5

1010 0101

07

04

0000 0100

47

64

01100100

87

С4

1100 0100

С7

А4

1010 0100

08

ОС

0000 1100

48

0110 1100

88

с с

1100 1100

С8

AC

1010 1100

09

0D

0000 1101

49

6D

01101101

89

CD

1100 1101

С9

AD

1010 1101

0F

0000 1111

6F

0110 1111

CF

1100 1111

СА

AF

1010 1111

ОВ

0000 1110

0110 1110

СЕ

1100 1110

СВ

AE

1010 1110

-ос

0000 1010

0110 1010

СА

1100 1010

с с

AA

1010 1010

0D

ОВ

0000 1011

4D

0110 1011

8D

СВ

1100 1011

CD

AB

1010 1011

09

0000 1001

69

0110 1001

С9

1100 1001

СЕ

A9

1010 1001

0F

08

0000 1000

4F

68

ОНО 1000

8F

С8

1100 1000

CF

A8

1010 1000

10

18

0001

1000

50

78

0111

1000

90

D8

1101

1000

D0

B8

1011

1000

11

19

0001

1001

51

79

0111

1001

91

D9

1101 1001

D l

B9

1011 1001

12

0001 1011

52

0111 1011

92

DB

1101 1011

D2

BB

1011 1011

13

0001 1010

53

1 А

0111 1010

93

DA

1101 1010

D3

BA

1011 1010

14

0001 1110

54

0111

1110

94

DE

1101 1110

D4

BE

1011 1110

15

1F

0001 1111

55

7F

0111 1111

95

DF

1101 1111

D5

BF

1011 1111

16

1D

0001 1101

56

7D

0111 1101

96

DD

1101 1101

D6

BD

1011 1101

17

1C

0001 1100

57

0111 1100

97

DC

1101 1100

D7

BC

1011 1100

18

14

0001 0100

58

74

0111 0100

98

D4

1101 0100

D8

B4

1011 0100

19

15

0001 0101

59

75

0111 0101

99

D5

1101 0101

D9

B5

1011 0101

17

0001 0111

77

0111 0111

D7

1101 0111

DA

B7

1011 0111

16

0001 0110

76

0111 0110

D6

1101 0110

DB

B6

1011 0110

1C

12

0001 0010

72

0111 0010

D2

1101 0010

DC

B2

1011 0010

72

 

 

 

Глава 1. Микропроцессоры 8080 и 8085

 

 

 

 

 

 

 

 

 

 

 

 

 

Продолжение табл. 1.14

В

 

Код Грея

В

 

Код Грея

В

 

Код Грея

В

 

Код Грея

1D

13

0001 0011

5D

73

0111 0011

9D

D3

1101 0011

DD

ВЗ

1011 0011

11

0001 0001

71

0111 0001

D1

1101 0001

DE

B l

1011 0001

1F

10

0001 0000

5F

70

0111

0000

9F

D0

1101 0000

DF

во

1011 0000

20

30

0011 0000

60

50

0101 оооо

АО

F0

1111 0000

EO

90

1001 0000

21

31

ООН 0001

61

51

0101

0001

А1

F1

1111 0001

E l

91

1001 0001

22

33

0011 0011

62

53

0101 0011

А2

F3

1111 0011

E2

93

1001 0011

23

32

0011 0010

63

52

0101

0010

АЗ

F2

1111 0010

E3

92

1001 0010

24

36

ООП 0110

64

56

0101 оно

А4

F6

1111 0110

E4

96

1001 оно

25

37

0011 0111

65

57

0101 0111

А5

F7

1111 0111

E5

97

1001 0111

26

35

ООП 0101

66

55

0101 0101

А6

F5

1111 0101

E6

95

1001 0101

27

34

0011 0100

67

54

0101 0100

А7

F4

1111 0100

E7

94

1001 0100

28

ЗС

0011 1100

68

0101 1100

А8

FC

1111 1100

E8

9C

1001 1100

29

3D

0011 1101

69

5D

0101

1101

А9

FD

1111 1101

E9

9D

1001 1101

3F

0011 1111

5F

0101

1111

АА

FF

11111111

EA

9F

1001 1111

ЗЕ

0011 1110

0101

1110

АВ

FE

1111 1110

EB

9E

1001 1110

1C

ЗА

0011 1010

0101

1010

АС

FA

1111 1010

EC

9A

1001 1010

2D

ЗВ

0011 1011

6D

0101

1011

AD

FB

1111 1011

ED

9B

1001 1011

39

0011 1001

59

0101

1001

АЕ

F9

1111 1001

EE

99

1001 1001

2F

38

0011 1000

6F

58

0101

1000

AF

F8

1111 1000

EF

98

1001 1000

30

28

0010 1000

70

48

0100 1000

ВО

E8

1110 1000

FO

88

1000 1000

31

29

0010 1001

71

49

0100 1001

В1

E9

1110 1001

FI

89

1000 1001

32

0010 1011

72

0100 ю н

В2

EB

1110 1011

F2

8B

1000 1011

33

0010 1010

73

0100 1010

ВЗ

EA

1110 1010

F3

1000 1010

34

0010 1110

74

0100 1110

В4

EE

1110 1110

F4

1000 1110

35

2F

0010 1111

75

4F

0100 1111

В5

EF

1110 1111

F5

8F

1000 1111

36

2D

0010 1101

76

4D

0100 1101

В6

ED

1110 1101

F6

8D

1000 1101

37

0010 1100

77

0100 1100

В7

EC

1110 1100

F7

1000 1100

38

24

0010 0100

78

44

0100 0Ю0

В8

E4

1110 0100

F8

84

1000 0100

39

25

0010 0101

79

45

01000Ю 1

В9

E5

11100101

F9

85

1000 0101

ЗА

27

00100111

47

01000111

ВА

E7

11100111

FA

87

1000 0111

ЗВ

26

0010 0110

46

0100 0110

ВВ

E6

11100110

FB

86

1000 0110

зс

22

0010 0010

42

0100 оою

ВС

E2

1110 0010

FC

82

1000 0010

3D

23

0010 0011

7D

43

0100 0011

BD

E3

1110 0011

FD

83

1000 0011

ЗЕ

21

0010 0001

41

0100 0001

BE

El

1110 0001

FE

81

1000 0001

3F

20

0010 0000

7F

40

0100 оооо

BF

EO

1110 0000

FF

80

1000 оооо

Двоичным числам В и В + 1 всегда соответствуют коды Грея (зеркальные, или рефлекс­ ные, коды), характеризующиеся изменением только одного разряда. Коды Грея находят приме­ нение в электронно-механических датчиках физических величин, например, в датчиках пере­ мещения стрелки весов, что позволяет исключить большие ошибки при одновременном пере­ ключении нескольких двоичных разрядов, которые возникают в датчиках с двоичной шкалой

и з м е р е н и я .

Задача 5 (файл l#08_05.asm). Вычислить произведение двух 4-разрядных десятичных чи­ сел, переведенных в двоичный код, с использованием алгоритма

Operl х O perl = Operl х (В#-28 + BL) = Operl х Вн-18 + Operl х BL,

 

 

 

1.8. Директивы ассемблера

75

 

ds

Ssz!2

; Ssz/2 = 16 байт

 

 

defseg

Main_seg, start = ЮО/i, class = Code

Code Segment

 

seg

Main_seg

 

 

 

 

LXI

SP, Ram + Rsz

; SP

1000/г — инициализация стека

 

; Копирование сортируемых чисел

 

 

 

LXI

H, Ram

; HL <— 0800/г — начальный адрес сортируемых чисел

 

LXI

D, Sort

; DE <— 080Сh — начальный адрес области копирования

 

MVI

B, 12

; В <— ОСЬ — количество сортируемых чисел

 

LM:

MOV

A, M

; А <- М{HL)

 

 

STAX

D

; M(DE) <- А

 

 

INX

H

 

 

 

 

INX

D

 

 

 

 

DCR

В

 

 

 

 

JNZ

LM

 

 

 

; Программа сортировки

 

 

 

 

LXI

H, Sort

; HL

Sort = 080Сh

 

 

LXI

B, Sort - Ram

; ВС <— Sort - Ram = АА — размер массива

 

LO:

PUSH

В

 

 

 

 

PUSH

H

 

 

 

 

MVI

E, 0 ; Сброс флага перестановок чисел: Е = 0 — не было перестановок чисел

; при сравнении всех соседних пар чисел х и у массива АД, Е = 1 — были перестановки чисел

LI:

MOV

А, М

; А <— х

 

INX

Н

 

 

СМР

м

; Сравнение двух соседних чисел в памяти х и у

 

JC

L2

 

 

JZ

L2

 

 

MOV

D, M

;D < - y

 

MOV

М, А

; Перестановка двух соседних чисел

 

DCX

Н

 

 

MOV

М, D

; Установка значения флага Е = 1

 

MVI

Е, 1

 

INX

Н

 

L2:

DCX

В

 

 

MOV

А, С

 

 

ORA

В

 

 

JNZ

L1

 

 

POP

Н

 

 

POP

В

 

 

ORA

Е

 

 

JNZ

L0

 

 

end

 

 

Вычисление объема массива чисел АЛ, подлежащих сортировке, можно сделать и в про­ грамме, чтобы не использовать команды PUSH и POP:

LO: LXI

Н, Ram

LX1

В, Sort

MOV

А, С

SUB

L

;Начало вычисления объема массива чисел АА, подлежащих

;сортировке, в предположении, что объем массива может

;потребовать и двухбайтового представления

76

 

Глава 1. Микропроцессоры 8080 и 8085

MOV

С, А

 

MOV

А, В

 

SBB

н

; ВС <— АЛ = Sort - Ram (вычисление закончено)

MOV

В, А

Д ирективы макрокоманд. Эти директивы позволяют повторяющимся блокам програм­ мы, различающимися только некоторыми параметрами, присвоить имя с перечнем формальных параметров (dummy or form al parameter), а затем любое число раз использовать только имя с указанием фактических параметров (actual parameter) вместо повторения текста всего блока в разных местах программы. Транслятор же вместо имен блоков подставит все команды МП, входящие в этот блок, и введет фактические параметры — транслятор по имени блока создаст его макрорасширения (Macro Expansion). Определенные директивами макрокоманд блоки про­ граммы называются макрокомандами (Macro Command, Macro Instruction), или макросами

{Macros). Оформление программ, содержащих макрокоманды, имеет вид:

Name_M %MACRO Pari, Раг2, РагЪ, Раг4, ... ; Директива %MACRO (Macro Definition) %LOCAL NameX, Name2, Name3, ... ; Директива %LOCAL (Definition Local Name)

ф; © — операторы ассемблера (инструкции и директивы)

[%ЕХГГМ]

; Директива прекращения макрогенерации (Exit Macro Generation)

;.©

; © — операторы ассемблера (инструкции и директивы)

%ENDM

; Директива конца макроопределения (End Macro Definition)

 

; Основная программа

Ш 'р iiqi,

Name_M

^ к

M g \\, M g\2, M g\3, ... ; Макрорасширение 1

{Macro Generation)

 

; Основная программа

 

Name_M

Mg2X, Mg22, Mg23, ... ; Макрорасширение 2 {Macro Expansion 2)

 

; Основная программа

 

Директива %MACRO связывает с именем макрокоманды Name_M некоторое число фор­ мальных параметров Раг\, Раг2, РагЗ, .... Вызов макрокоманды производится строкой, содер­ жащей имя макрокоманды Name_M и такое же число фактических параметров (допустимое число параметров ограничено только длиной строки операторов ассемблера, равной 120 сим­ волам). Транслятор имеет генератор макрорасширений, который формальные параметры Par# (# = 1, 2, ...) заменяет фактическими параметрами Mg 1# для макрорасширения 1 и Mg2# для макрорасширения 2. Соответствие формальных и фактических параметров определяется по­ следовательностью их задания в макроопределении и макрорасширении.

Директива %LOCAL объявляет перечисленные в ней имена переменных и констант дей­ ствительными только внутри макроопределения, а генератор макрорасширений заменяет их уникальными именами ??хххх, где хххх = 0000 9999 — 4-разрядные десятичные числа. Это исключает появление в программе одинаковых имен, имеющих разные численные значения.

Директива %ЕХГГМ (необязательная) прекращает генерацию транслятором макрорасши­ рения, если требуется получить только его часть. При этом в первой части макрокоманды не должно быть ссылок на имена, определенные во второй ее части. Эта директива обычно ис­ пользуется совместно с условными директивами.

Директива %ENDM указывает транслятору конец макрокоманды и конец действия ло­ кальных имен.

Предупреждение'.

1.Символические имена меток, переменных и констант должны быть расположены с пер­ вой позиции строки (перед именем не должно быть пробела).

2.Перед именем, вызывающим макрорасширение, должен быть хотя бы один пробел.

Пример 10:

 

 

 

1.8. Директивы ассемблера

77

Alpha

equ

39h

Alpha = 39h

 

Beta

db

2Ch, ‘IBM PC’

M(Beta) = 2Ch, M(Beta+3) -

4Dh ASCII-кол букЕ

Add3

 

 

Основная программа

 

%macro Par 1, Par2, РагЗ

Macro Definition Add.3

 

 

%local

LJ1, LJ2, Beta

Definition Local Name LJ1, LJ2, Beta

; Register Pair BC = [Par1 - Par2 -

Beta + М(РагЗ)]я — дополнительный код результата

 

MVI

В ,0

В <— 0

 

 

MVI

A, Pari

A <—Pari

 

 

SUI

Par2 + Beta

A <r- Pari - P ari - Beta

 

 

JNC

LJ1

 

 

LJ1:

DCR

В

В <e—В - 1, ifC Y = 1

 

LXI

Н, РагЗ

 

 

 

ADD

М

A <— Pari - Par2 - Beta + M(Par3)

 

JNC

LJ2

 

 

LJ2:

INR

В

B < - B + 1, if СY = 1

 

MOV

С, А

С <— Pari - P ari - Beta + M(Par3)

Beta

equ

5

Beta = 5

 

Gamma

%endm

 

End Macros

 

equ

h

Gamma = 9Eh

 

; Macro Expansion 1 (Macros Add3): Pari = Alpha + Ah, Par2 = Gamma, РагЗ = Beta

 

Add.3

Alpha + Ah, Gamma, Beta

 

;Основная программа

;Macro Expansion 2 (Macros Add3): Pari = 55h, Par2 = Alpha, РагЗ = Beta +3

Add3

55h, Alpha, Beta + 3

 

; Основная программа

end

; End Program

Имя Beta используется в программе два раза: в основной программе оно определено как адрес числа 2Сh, а в макрокоманде — как байт-константа, но конфликта между ними не возни­ кает, так как имя Beta в макрокоманде объявлено локальным — ее действие не выходит за пре­ делы макрокоманды.

После трансляции листинг с исключенными столбцами адресов и машинных кодов будет иметь вид:

Alpha

equ

39/i

 

 

 

Beta

db

2Ch, ‘IBM PC’

; Основная программа

 

 

 

 

 

Add3

%macro Par 1, Par2, РагЗ

; Macro Definition Add.3

 

 

%local

LJ1,LJ2, Beta

; Definition Local Name LJ 1, LJ2, Beta

Register Pair BC = Two's Complement [Pari - Par2 + M(Par3)\

 

MVI

B ,0

; В

0

 

 

MVI

A, Pari

I A

Pari

 

 

SUI

Par2 + Beta

; A <— Pari Par2 - Beta

 

 

JNC

LJ1

 

 

.(<

 

DCR

В

В

В - 1, if СY =

 

 

; LJ1:

LXI

H, РагЗ

 

 

 

 

ADD

M

; A <— Pari - P ari - Beta + M(Par3)

 

JNC

LJ2

 

 

 

 

INR

В

;B <—В + 1, ifC Y = 1

 

end
Комментарии на русском языке добавлены в листинг уже после трансляции. Для вывода в листинг пате.ргп макрорасширений транслятор из командной строки компьютера следует запускать командой
JNC
INR
MOV equ %endm
SUI
JNC
DCR
LXI
ADD

78

 

 

Глава 1. Микропроцессоры 8080 и 8085

; LJ2:

MOV

C, A

 

; С <r- Pari - Pari - Beta + M(Par3)

; Beta

equ

5

 

; End Macros

 

%endm

 

 

Gamma

equ

9Е/г

 

; Gamma = 9Eh

; Macro Expansion 1 (Macros Add3): Pari = Alpha + 0Ah, Pari = Gamma, Par3 - Beta

 

; Add3

Alpha + Ah, Gamma, Beta

; Register Pair BC - Two’s Complement [Pari - Pari —Beta + M(Par3)]

 

MVI

B ,0

 

; B e 0

 

MVI

A, Alpha + 0Ah

; A <— Pari

 

SUI

Gamma + ??0002

; A <— Pari - Pari - Beta

 

JNC

??0000

 

 

 

DCR

В

 

; В <— В - 1, г/ СY = 1

?70000:

LXI

H, Beta

 

 

 

ADD

M

 

; А Pari - P ari - Beta + M(Par3)

 

JNC

??0001

 

 

 

INR

В

; В <— В + 1, if C Y - 1

?70001:

MOV

С, A

; С Pari - P ari - Beta + M(Par3) = 43h - 9Eh - 5 + ICh = FFCC/г

?70002

equ

5

; End Macros (строка не выводится, если не задан параметр SC)

;

%endm

 

 

 

 

; Основная программа

; Macro Expansion 2 (Macros Add3): Pari = 55h, Pari = Alpha, РагЪ = Beta +3

;Add3 55h, Alpha, Beta + 3

;Register Pair BC = Two's Complement [Pari - P ari - Beta + M(Par3)]

MVI

B, 0

; В <— 0

MVI

A, 55h

; А <г—Pari

 

Alpha + ?70005

; А <— Pari - P ari - Beta

??0003:

??0004:

??0005:

??0003

 

В

; В <—В - 1, г/ СY = 1

H, Beta + 3

M

; А <— Pari - P ari - Beta + М(РагЗ)

??0004

 

В

; В <— В + 1, if C Y = 1

С, A

; С <— Pari - P ari - Beta + M(Par3) = 55h - 39h - 5 + 4Dh = 0064/г

5

; End Macros (строка не выводится, если не задан параметр SC)

 

 

; Основная программа

avwac85f.exe] пате[.asm] [.xr] SM [SC]

(параметр SC можно не задавать). Параметры SM (ShowMacs) и SC (ShowComments) управляют выводом в листинг макрорасширений, причем параметр SC управляет выводом в каждом мак­ рорасширении только одной строки, содержащей закомментированную директиву %ENDM, идентифицирующую конец макрорасширения.

Исходный текст макрокоманды выводится в листинг в виде комментария — начинается с точки с запятой. Если параметр SM транслятору не задан, то текст макрорасширений 1 и 2