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

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

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

60

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

Директива ORG используется внутри сегментов для задания адреса следующих за нею данных (вводит пустые промежутки в непрерывном массиве данных). В один и тот же сегмент директива может входить любое число раз. Директива ORG (origin — начало) имеет формат:

[Label:] ORG address

(адрес address должен быть не меньше, чем адрес первого элемента смещаемого массива дан­ ных). Например, если вторую часть сегмента D2_seg в задаче 1 оформить в виде:

 

seg

D2_seg

; Открытие сегмента D2_seg внутри сегмента кода

 

org

720h + 20h

; 20h — смещение данных относительно начала сегмента 0720/г

String

db

‘Novoselzeva’ ,0

; В память записывается 11 символов в кодах ASCII и 0

 

seg

Main_seg

; Открытие сегмента Main_seg и закрытие сегмента D2__seg,

 

 

 

то эта часть сегмента D2__seg будет смещена на пять байт в

0720 0740 0760 0800

сторону старших разрядов (рис. 1.22), так как размер первой

1

2

 

части сегмента D2_seg равен 27 байтам. Эти пять байт будут

 

принадлежать сегменту D2_seg, но их значения не будут

 

 

 

D2_seg

D3__seg D \_ seg

определены (зарезервированные байты). Если смещение за­

Рис. 1.22. Сегменты данных

дать меньше 27 байт, то произойдет перекрытие первой час­

ти сегмента D2_seg ее второй частью с замещением элемен­

 

 

 

тов первой части элементами второй части сегмента D2_seg.

Директиву ORG можно не использовать, заменив ее директивой DEFSEG определения

нового сегмента D4_seg:

 

 

 

defseg D4_seg, start = 740/г, class = Data

; Определение сегмента D4_seg

 

seg

D4_seg

; Открытие сегмента D4_seg внутри сегмента кода

String

db

‘Novoselzeva’, 0 ; В память записывается 11 символов в кодах ASCII и 0

 

seg

Main_seg

; Открытие сегмента Main_seg и закрытие сегмента D4__seg

В постоянных сегментах Code, Data и IOspace директиву ORG использовать нельзя. Задача 3 (файл l#08_03.asm). Реализовать программным способом синхронный цифровой

автомат, изображенный на рис. 1.23 и представляющий собой генератор псевдослучайной по­ следовательности (ПСП) длиною 255 символов (см. стр. 247 в книге [5]). Цифровой автомат представляет собой счетчик по mod 255, выполненный на 8-разрядном сдвигающем регистре с обратной связью, функция возбуждения триггера Q0 которого D0 = £)7 Ф © Q2 © Qi — ли­ нейная функция. Вывод ПСП выполнить на последовательный выход SOD МП 8085А по пре­ рыванию с использованием входа запроса прерывания RST 6.5.

Программу написать для микроконтроллера, содержащего EPROM 6К х 8 бит по адресам

0000/г -г 17FFA и RAM 2К х 8 бит по адресам 1800/г + lFFF/г. Решение:

Рис. 1.23. Схема формирования псевдослучайной последовательности

Адрес МК

В файле l#08_03.obj

адреса

рассчитаны без учета смещений

0034Л и 0100h

0000

F5

0001

ЗА ОООО

0004

Е6 80

0006

F6 40

0008

30

0009

ЗА 0000

ОООС Е6 8Е

ОООЕ

ЗА 0000

0011

37

0012

17

0013

Е2 0018

0016

E6 FE

0018

32 0000

001В F1

001С FB

001D С9

=0800

=0800

=0020

0000 5F

0000 (0020)

0000 31 1000

0003 ЗЕ ОВ

0005 30

0006 FB

0007 СЗ 0007

 

 

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

61

Метка

КОП

Операнд

Комментарий

Имя

Директива Выражение

Комментарий

SAllpubiic ; Объявление символических имен доступными из других модулей $title(l#08_03.asm) ; На каждой странице листинга

$subtitle(Generator PSP length 255 symbol) ; печатается две строки заголовка

$paginate

 

 

; Разбиение листинга на страницы по 60 строк

$pagewidth=78

 

; Задание в строке листинга 78 символов

 

defseg

S_rst65, start = 34h

; 6,5 x 8 = 52d = 34h

 

 

seg

S_rst65

 

; Открытие сегмента S__rst65

 

Подпрограмма обработки прерывания RST 6.5

 

 

PUSH PSW

12

 

 

 

 

LDA

Ram

13

A <— M( 1800)

 

 

ANI

80h

07

A <- A7000 0000, SOD = A7

 

 

ORI

40h

07

A <- A7100 0000, SOD = A7, SOE = 1

 

SIM

Ram

04

Вывод разряда A7 на выход SOD МП 8085A

 

LDA

13

A <— M( 1800)

 

 

ANI

8Eh

07

A f - A7000 A3A2A|0, флаг P = A7 ® A3 0 A2 © A,

 

LDA

Ram

13

A

Af(1800)

 

 

STC

 

04

CY <— 1, флаг P не изменяется

 

 

RAL

 

04

A <—A5A5A4A3 A2A|A 01, флаг P не изменяется

 

JPO

LR

10

LR — Label в подпрограмме RST

 

LR:

ANI

OFEh

07

A ^— A^A^A4A3 AoAjAqO

 

STA

Ram

13

A/(1800) <— A

 

 

POP

PSW

10

 

 

 

 

EI

 

04

Флаг IE <— 1 (прерывания разрешены)

 

RET

 

10

Возврат в основную программу

; Data Segment

 

 

; Всего:

138 тактов

Ram

equ

1800/г

 

Ram = 1800/г — начальный адрес RAM

Rsz

equ

800h

 

Rsz = 800/г — объем RAM (RAM Size)

Ssz

equ

20h

 

Ssz = 20h — размер стека (Stack Size)

 

defseg Psp_seg, start = Ram, class = Data

 

 

seg

Psp_seg

 

Открытие сегмента Psp_seg

 

 

db

5Fh

 

M(Ram) = Л/(1800) — байт оперативных данных

 

defseg Stack_seg, start = Ram + Rsz - Ssz, class = Data

; Stack Segment

 

seg

Stack_seg

 

 

 

 

ds

Ssz

 

 

 

 

 

defseg

Main_seg, start = 100/?, class = Code

; Code Segment

 

seg

Main__seg

; Открытие сегмента Main_seg

 

 

LXI

SP, Ram + Rsz ; SP = 2000h — начальное значение указателя стека

 

MVI

А, OD/г

 

; А

0D/i = 0000 1101 (А3 = MCE = 1, Ai = Мб.5 = 0)

 

SIM

 

 

Разрешение прерывания по входу RST 6.5

 

EI

 

 

Общее разрешение прерывания

 

LM: JMP

LM

 

МП из этого цикла выходит только по запросу

 

end

 

 

 

прерывания по входу RST 6.5

Столбцы Адрес (относительные адреса) и МК (машинные коды) взяты из листинга 1#08_03.ргп, полученного при трансляции программы в машинные коды для получения объ­ ектного модуля l#08_03.obj. Подчеркнутые операнды в столбце МК, как и относительные ад-

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

реса, рассчитаны без учета смещения ООЗС/i. Вся программа занимает в памяти 40 байт, причем 10 из них заняты программой инициализации микроконтроллера после включения питания. Программный цикл JMP LM в общем случае отсутствует (здесь же введен с целью прогона программы в отладчике, как независимой программы), так как микроконтроллер может парал­ лельно с выводом ПСП решать и другие задачи, кроме генерации ПСП. Если же этот цикл ис­ пользуется, то команды PUSH PSW и POP PSW из подпрограммы обработки запроса преры­ вания по входу RST 7.5 можно исключить.

На рис. 1.24 показана генерируемая (строка за строкой) программным способом ПСП, пе­ риод которой состоит из 255 символов 0 и 1. Мдассимальное значение частоты вывода символов 0 и 1 определяется только временем выполнения подпрограммы обработки запроса прерывания по входу RST 7.5 — затрачивается 138 тактов.

Выход МП 5Fh — начальное значение байта данных

SOD < - 01011111 10111100 11011101 11001010 10010100 01001011 01000110 01110011

11000110 11000010 00101110 10111101 10111110 00011010 01101011 01101010

00001001

11011001

00100110

00000111

01001000

11100010

00000010

11000111

10100001

11111110

01000010

10011111

01010101

11000001

10001010

1100110

 

Рис. 1.24. Псевдослучайная последовательность

 

 

Директивы управления листингом. Эти директивы должны начинаться с символа “$” и располагаться в самом начале программы. Описание этих директив дано в поле комментария предыдущей программы. Пробелы перед символами “(“ и “=”, а также после символа “=” не допускаются.

Директивы $TITLE и SSUBTITLE выводят в начале каждой страницы листинга две стро­ ки, заключенные в скобки в тексте исходного модуля (см. предыдущую программу). Началь­

ные строки листинга 1#08_03.ргп после трансляции исходного модуля l#08_03.asm

будут со­

держать информацию:

 

 

 

Avocet 8085/Z80 Assembler v2.02, #01235 Chip=8085

3/24/100

11:07:06

l#08_03.asm

 

 

.

Page 1

Generator PSP length 255 symbol

 

I

 

1

$allpublic

 

Месяц/Число/Год Часы/Минуты/Секунды

2

$title(l#08_03.asm)

(год 100 вместо 2000)

 

3

$subtitle(Generator PSP length 255 symbol)

 

4

Spaginate

 

 

 

5

$pagewidth=78

 

 

 

6

defseg

S_rst65, start = 34h

; 6,5 x 8 = 52d = 34h

 

7

seg

S_rst65

; Открытие сегмента S_rst65

 

0000& F5 8

PUSH

PSW

 

 

Директивы $PAGINATE и $PAGEWIDTH задают число строк в странице и число симво­ лов в строке листинга.

Указание: Программный пакет AVSIM85 фирмы Avocet Systems, Inc. предназначен для ис­ пользования нерусскоязычными пользователями, поэтому текст в директивах $TITLE и $SUBTITLE и комментарии на русском языке в листинге будут искажены из-за использования транслятором 7-разрядных А^СЯ-кодов (см. табл. 1.9). Прописные буквы русского алфавита А, К и Н вообще нельзя использовать, так как они преобразуются в такие управляющие символы, которые нарушают работу внутреннего текстового редактора программного пакета (русские буквы А, К и Н при необходимости можно заменить латинскими А, К и Н). В России про­ граммный пакет AVSIM85 фирмы Avocet Systems, Inc. был выпущен на CD-ROM (Compact Disk

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

63

read-only Memory — нестираемая память, или память только для чтения, на компакт-дисках). Этот пакет содержит мощный отладчик, настраиваемый на конфигурации микроконтроллеров, содержащих специально разработанные для МП 8085 интегральные схемы 8155 и 8355.

Директивы определения типа МП. Эти директивы должны начинаться с символа “$” и располагаться в самом начале программы.

Директивы $СН1Р(8085) и $CHIP(Z80) указывают, для какого типа МП написан исходный модуль. По умолчанию считается, что исходный модуль подготовлен для МП 8080/8085 — директиву Chip(8085) можно не использовать. Если в программе задачи 3 указать директиву Chip(Z80), то транслятор выдаст сообщение:

ERROR 31: Instruction not implemented in Z80

(мнемоника команд программы не соответствует мнемонике команд МП Z80). Если перед скобкой дать пробел, то транслятор выдаст сообщение:

ERROR 38: Syntax error

(нарушены правила написания директивы).

Директивы определения данных. Эти директивы используются для определения данных в памяти: байт и слов. Символическим именам данных ставятся в соответствие адреса памяти этих данных.

Директивы DB (Define Byte — определить байт) и DW (Define Word — определить слово) имеют формат (в отличие от других директив эти директивы генерируют объектный код):

[Name 1[:]]

DB

43, ODCh. 39, 101106, ‘IBM

PC’, 0A/i, OD/г ; 12 байт

[Name2[:}\

DW

1998Л, 0D4C1/?, 43

; 3 слова (6 байт)

Для определения относительного адреса программных элементов в сегментах данных и кода ассемблер использует счетчик адресов. Текущее значение адреса обозначается символом $ (слово) и его можно использовать в директивах. Имени Name, если оно имеется, присваивает­ ся адрес первого байта массива данных. С этого адреса в смежные ячейки памяти записывают­ ся байты или слова. Для слов в первую ячейку памяти помещается младший байт слова, а в следующую (с большим адресом) — старший байт слова. Введенные имена можно использо­ вать в качестве непосредственных операндов в командах МП. Символ и последовательность

символов (символьная строка),

заключенная в апострофы (например, ‘j ’ и ‘8085/Z80’), трансли­

руются в их А5С//-КОДЫ (6 А h и 38 30 38 35 2F 5А 38 30) в соответствии с табл. 1.9.

 

Пример 1 (наиболее полезное применение значений $ см. в файле 2&04_02.asm):

 

Alpha

db

95/г, 93/г, ‘IBM

PC’, 10110/?, 36 ; Начало сегмента данных

; 10 байт

 

db

0, 1,2, 3, 4, 5, 6, 7, 8, 9, ОА/г, 0BA, ОС/г, 0D/i, ОЕй, 0F/i

; 16 байт

Beta:

dw

$, 1998/;, 0D4C1 /г ; $ = 001 Ah = 26d — относительный адрес Beta

; 6 байт

Gamma: ds

18h

Зарезервировать, не инициализируя, 24 байта в памяти

 

LDA

Alpha + 3

А <—M(Alpha + 3) = 42А = ASCH-кол В (Gamma - Alpha + 32)

 

STA

Gamma + 1

M(Gamma + 1) <—42/г

 

 

LXI

D, Alpha

DE <— адрес байта 95/г

 

 

LDAX D

А <— M(Alpha) = 95h (в круглых скобках указан адрес памяти)

 

LXI

H, Alpha + 5 HL <—адрес пробела между словами IBM и PC

 

 

ADD

M

А <- 95/г + 20/г = В5/г

 

 

LXI

B, Bela + 2

ВС <—адрес слова 1998/г

 

 

LXI

H, Gamma + 7

 

 

 

MOV

M, A

; M(Gamma + 7) <— B5h

 

 

MVI

H, Beta

; Ошибка (то же самое и для имени Gamma)

 

64

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

При обнаружении ошибок в использовании типов данных компоновщик выдает сообще­ ние (считаем, что START = 100ft — начальный адрес сегмента кода):

WARNING: (Abs Addr = 0116Н) Singles byte values out of range.

Директива DS (Define Space — определить область памяти) используется для резервиро­ вания ячеек памяти под оперативные данные и стек (синонимы DEFS и RMB). Эта директива имеет формат:

[Name[:]\ DS value

(value — число или символическое имя, определяющее число). Этой директивой резервируется в памяти число ячеек памяти, заданное параметром value, без задания их начальных значений.

Пример 2:

Gamma:

ds

10ft

; Зарезервировать, не инициализируя, 16 байт в памяти

Delta

equ

10

; Delta = 1 Od

Addr$

ds

Delta

; Зарезервировать, не инициализируя, 10 байт в памяти

equ

$

; $ — текущее значение счетчика адресов

Директивы EQU (equate — приравнять) и TEQ (temporary equate) не определяют элемент данных в памяти, а лишь вводят символические имена для чисел (констант), с которыми удоб­ нее оперировать, чем с числами, так как в имена всегда можно вложить содержательный смысл. Директива EQU имеет формат:

Name[:] EQU value

(value — число или символическое имя, определяющее число).

Пример 3

Beta:

equ

10101b

Beta = 15ft ; Начало сегмента кода Если использовать директиву

Gamma: equ

5AF2ft

Gamma = 5AF2ft

Delta equ Beta,

 

MVI

A, Beta

A < -

15ft

t o Delta = 15ft.

 

LXI

D, Beta

DE <— 0015ft

 

Addrl

equ

$

Addrl - $ = 0005ft —

текущее значение счетчика адресов

 

LXI

H, Gamma

HL

5AF2ft

 

Addrl

teq

$

Addrl = $ - 0008ft —

текущее значение счетчика адресов

 

MVI

C, Gamma

ERROR 30: Operand out of range

 

 

 

; ERROR 22: Byte value not in the range -128 ... +255

Если какая-либо константа используется в программе большое число раз, а затем потребу­ ется изменить ее значение, то это значительно проще сделать одной директивой EQU, чем из­ менять числа по всей программе. В последнем случае велика также вероятность ошибки при внесении в программу изменений (в больших программах некоторые константы могут исполь­ зоваться десятки раз).

На рис. 1.25 представлена принципиальная схема памяти объемом 16К х 8 бит, содержа­ щая 8 БИС объемом по 2К х 8 бит: 14К х 8 бит EPROM 573РФ2 (EPROM 2716 фирмы Intel) и 2К х 8 бит RAM (БИС адресуются разрядами шины адреса А10_0, а значит, каждая БИС содер­ жит 2 11 = 2048 ячеек памяти). При выполнении команд программы селекция одной из восьми БИС производится разрядами адреса А15-11 с помощью дешифратора, выполненного на микро­ схеме 1533ИД7 (SN14ALS13& фирмы Texas Instruments). В табл. 1.12 представлены диапазоны адресов всех БИС, адресуемых сигналами МП А^о-

Если в микроконтроллере использовать такую память, то в программе задачи 3 достаточ­ но изменить значение символического имени Ram только в одной строке

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

65

Ram equ 3800h,

вместо того чтобы изменять значение операнда Ram = 800/з в семи строках. Размер стека Ssz также легко изменяется с помощью директивы EQU.

 

 

Л

ЕР

$

 

 

 

 

 

 

ЯР

 

 

 

 

 

 

ЯР

 

 

 

11 АО

8

 

Г

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

^1 5 -0 А1

7

1 ROM

п

3

 

ДО

 

 

 

ЛОМ

 

10

о\

 

 

 

РОМ

 

9

DO

А2

6

2

 

1

 

 

Д1

 

 

 

 

 

 

 

 

 

 

10

Dl

АЗ

5

 

4 1

Д2

 

 

 

 

 

11

D2

 

 

 

 

 

1 1 D2

3

 

2

 

 

 

 

 

 

 

 

 

 

А4

4

 

13 дз

 

 

 

 

 

13

х?3

 

 

 

 

 

1 3 D3

4

 

3

 

 

 

 

 

 

 

 

 

 

AS

3

 

14 Д4

 

 

 

 

 

14 £)4

 

 

 

 

 

1 4 D4

5

 

4

 

 

 

 

 

 

 

 

 

 

Аб

2

 

4 5

DS

 

 

 

 

 

15

£35

 

 

 

 

 

1 5

DS

6

 

5

 

 

 

 

 

 

 

 

 

 

А1

1

 

 

'■D6

 

 

 

 

 

16 D6

 

 

 

 

 

1 6 D6

7

 

б

 

 

 

 

 

 

 

 

 

 

 

AS

23

 

17 Д7

 

 

 

 

 

17 £7

 

 

 

 

 

1 7 Dl

S

 

7

 

 

 

 

 

А9

 

 

 

 

А9

22

9

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

А10

1 9

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

10

•ft

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

MEMR MEMR 2 0.

 

Ни

 

 

 

 

 

 

 

 

 

 

 

MEMR 20

 

 

 

 

 

ОЕ

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

СШ181

 

 

 

 

 

СГ08

19,

 

 

 

 

 

СУ10

-Ig

 

 

 

 

 

 

 

СЕ

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

VP 2716

 

 

 

 

 

 

 

2716

 

 

 

 

 

ГР 2716

 

 

 

 

Адреса

0000 ...07FF

 

 

Адреса 0800 ...0FFF

 

 

Адреса

1000 ... 17FF

 

 

 

 

яр

 

 

 

 

 

 

 

ЯР

$

 

 

 

 

 

ЕР

 

 

 

 

 

 

 

 

 

 

AO

s

 

r>

 

 

AO

8

 

 

 

 

А1

7

 

лом

 

9

 

ДО Al

7

 

POM

0

9

DO Al

7

 

ROM

 

9

-DO

А2

6

 

 

 

10

Д1

A2

6

 

 

10

Dl

A2

6

 

 

 

10

Dl

 

 

 

 

 

1

 

 

 

 

 

 

 

 

1 1

Д2

A3

5

 

 

 

D2 A3

 

 

 

 

1 D2

АЗ

5

 

 

 

 

 

? 11

5

 

 

 

А4

4

 

 

 

13 дз

A4

4

 

 

 

13 D3 A4

4

 

 

 

3 D3

AS

3

 

 

 

14 B4

AS

3

 

 

4

1 4

D4

AS

3

 

 

 

1 4 P4

А6

2

 

 

 

15 Д5 A6

2

 

 

1 5

DS A6

2

 

 

 

1 5 DS

 

 

 

 

 

5

 

 

 

Al

1

 

 

 

IS Д6 A7

1

 

 

1 6

D6 Al

1

 

 

 

1 6 DS

 

 

 

 

 

6

 

 

 

AS

23

 

 

 

17 Д7

AS

2 3

 

 

1 7

Dl

AS

23

 

 

 

7 Dl

 

 

 

 

 

7

 

 

 

А9

22

 

 

 

 

 

 

A9

22

 

 

 

 

A9

22

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

AIO

1 9

 

 

 

 

 

 

AIO

19

 

•ft

 

 

 

AIO

19

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2 0.

 

 

 

 

 

 

MEMR 20.

 

On

 

 

 

MEMR 2 0.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

CSIS

 

 

 

 

 

 

 

СУ20

 

 

 

 

 

 

CS28

18,

 

 

 

 

 

 

 

VP 2716

 

 

 

 

vcc

 

 

2716

 

 

 

 

 

 

2716

 

 

 

 

Адреса. 1S00 ... 1FFF

 

 

Адреса

2000... 27FF

 

 

Адреса

2800 ... 2FFF

 

АП

 

1533НД7

115 СТО

 

 

A

EP

*

 

 

 

8

A

RAM

e

 

 

2

 

 

 

7 0

D

 

 

AO

0

DB

9

ДО

А12

DMX

1 4

СУ08

Al

ROM

0

9

DO

Al

7

 

А13

3

 

 

1 3

 

 

 

 

 

 

 

I?1

 

 

1

 

0

 

 

 

 

C$10

A2

6

 

 

 

10

A2

6

->

 

 

10

Д1

 

 

 

 

1 2 C$18 A3

5

 

 

 

1 1 £2 A3

5

 

 

-> 11 £■2

 

 

 

 

1 1

СУ20

A4

4

 

 

 

1 3

D3

A4

4

4

 

3

13 D3

 

 

 

 

1 0

CS2S A5

3

5

 

 

14

£/4

AS

3

5

 

4

1 4

DA

 

 

 

 

9

 

CS30

A6

2

 

 

1 5

DS A6

2

 

1 5

DS

 

 

 

 

 

6

 

 

6

 

5

 

 

 

 

7

 

С П З Al

1

 

 

16 D6 Al

1

 

16

D6

 

 

 

 

 

 

 

 

7

 

6

 

 

 

 

 

 

 

 

AS

23

 

 

 

1 7

Dl

AS

23

 

17

Dl

 

 

 

 

 

 

 

 

8

 

7

8

 

7

 

 

 

 

 

 

 

 

A9

22

 

 

 

A9

22

©

 

 

от DMAC

 

 

 

 

 

 

9

 

 

 

 

9

 

 

 

 

 

 

 

 

 

AIO

19

<N

 

 

 

AIO

1 9

 

 

 

 

 

 

 

 

 

 

 

10

 

 

 

in

 

 

 

 

 

 

 

 

 

 

 

 

 

 

*

 

 

 

 

 

cu

 

 

 

 

 

 

 

 

 

 

 

MEMR 2 0,

 

CU

 

 

 

MEMW21(

 

 

 

 

 

 

 

 

 

 

 

 

>оя

r-

 

 

 

 

trt

 

 

 

 

 

 

 

 

 

 

 

С^ЗО

 

V)

 

 

 

AfZfttfX 20]>OE

V)

 

 

 

MEMW

 

 

 

 

 

 

 

18Т>ся

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

VP

2716

 

 

 

CS3S

18

>CE

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Адреса

3000 ... 37FF

 

 

Адреса3800 ... 3FFF

 

Рис. 1.25. Принципиальная схема памяти объемом 16К х 8 бит

5 Г. И. Пухальский

66

 

 

 

 

 

 

 

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

 

 

 

Таблица 1.12. Адреса памяти БИС по 2К х 8 бит с общим объемом 16К х 8 бит

А 15А 14 ■А|3 А\ 2 Ац Ащ а 9

А-8 Ап А6 А5 А4 Аз

А2

Ai

Ао

Адреса памяти

Объем памяти

0

0

0

0

0

X

X

X

X

X

X

X

X

X

X

X

0000ft + 07FFft

EPROM 2K x 8 бит

0

0

0

0

1

X

X

X

X

X

X

X

X

X

X

X

0800Л+ OFFFft

EPROM 2K x 8 бит

0

0

0

1

0

X

X

X

X

X

X

X

X

X

X

X

1000ft т 17FFft

EPROM 2K x 8 бит

0

0

0

1

1

X

X

X

X

X

X

X

X

X

X

X

1800ft + 1FFFA

EPROM 2K x 8 бит

0

0

1

0

0

X

X

X

X

X

X

X

X

X

X

X

2000ft + 27FFft

EPROM 2K x 8 бит

0

0

1

0

1

X

X

X

X

X

X

X

X

X

X

X

2800ft + 2FFFft

EPROM 2K x 8 бит

0

0

1

1

0

X

X

X

X

X

X

X

X

X

X

X

3000ft + 3FFFft

EPROM 2K x 8 бит

0

0

1

1

1

X

X

X X X X X X

X

X

X

3800ft + 3FFFft

RAM 2K x 8 бит

Примем а н и е:

ххх хххх хххх — значения от 000 0000 0000 ДО

i l l n i l 1111.

 

Директивой EQU символическому имени в разных местах программы нельзя присваивать различные численные значения. Это можно делать с помощью директивы TEQ. Формат дирек­ тивы TEQ такой же, что и директивы EQU:

Name[:\ TEQ value

(value — число или символическое имя, определяющее число).

Операторы ассемблера. В командах в качестве непосредственных операндов с/8 и d 16 можно использовать не только числа и символические имена, но и выражения, составленные из чисел и символических имен с помощью специальных операторов.

Арифметические операторы. Для обозначения этих операторов используются символы: +, - , *, / и MOD. Арифметические операторы имеют форматы:

+Expression (унарный плюс — сохраняет знак и значение выражения Expression), Expression1 + Expression2 (сложение — вычисляет сумму двух выражений), -Expression (унарный минус — изменяет знак выражения, т. е. вычисляет дополни­

тельный код),

Expression1 - Expression2 (вычитание — вычисляет разность двух выражений), Expression1 * Expression2 (умножение — вычисляет произведение двух выражений), Expression1 / Expression2 (деление — вычисляет частное от деления двух выражений), Expression1 MOD Expression2 (вычисляет остаток от деления двух выражений).

Пример 4 (использование арифметических операторов):

SUI

+0D4ft

A <— A - D4ft

MVI

Е, 180 + 90

Ошибка: 180 + 90 = 270с/ = lOEft > 255d

MVI

А ,-2

A <— FEft (дополнительный код числа -2)

Alpha: equ

9

Директива ассемблера: имени alpha присвоить значение 9

MVI

E, -Alpha

Е <— F7ft (дополнительный код числа -9)

MVI

L, -0А7Л

Ошибка: -0А7А < -128с/

MVI

B, 5 - 7

В <—FEft (дополнительный код числа -2)

LXI

H, 5555ft - 7777ft

HL

DDDEft (дополнительный код числа -2222ft)

MVI

C, 70*5

Ошибка: 70*5 = 350с/ = 15Eft > 255с/

CPI

30*5

А - 96ft, так как 30*5 = 150d = 96ft

ORI

303/5 ; А <— A v ЗСft, так как 303/5 = 60d = ЗСй (частное от деления чисел)

ANI

17 mod 5

; А <— А & 02, так как 17 mod 5 = 2

MVI

Е, 177 mod (Alpha/2)

; Е <— 1, так как 177 mod 4 = 1

ERROR 30: Operand out of range
ERROR 22: Byte value not in the range -128 ... +255

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

67

При обнаружении ошибок транслятор выдает сообщение:

ERROR 30: Operand out of range

ERROR 22: Byte value not in the range -128 ... +255

Операторы сдвига. Для этих операторов используются обозначения: SHL и SHR. Опера­ торы сдвига имеют форматы:

Expression SHL count (сдвиг влево операнда Expression на число разрядов, равное count, с вводом значения 0 в младший разряд при каждом сдвиге);

Expression SHR count (сдвиг вправо операнда Expression на число разрядов, равное count, с вводом значения 0 в старший разряд при каждом сдвиге, причем младшие разряды те­ ряются).

Операторы сдвига SHL и SHR производят умножение и деление операнда Expression на число 2С0Ш" соответственно. Значение Expression х 2""' при сдвиге влево байта не должно вы­ ходить за пределы значений -128 ... +255.

Пример 5 (использование операторов сдвига):

 

MVI

C, 16h shl 3

С ^-В 0/г=1011 0000(16/г = 0001 0110)

ADI

0D5A shr 2

A <

Л +35/г = A + 0011 0101 (05/г = 1101 0101)

LXI

D, 5В74/г shl 4

DE

05B7A

ERROR 30: Operand out of range

MVI

A, 36/x shl 3

Ошибка

ERROR 22: Byte value not in the range -128 ... +255

Логические операторы. Для этих операторов используются обозначения: NOT, AND, OR и XOR. Логические операторы имеют форматы:

NOT Expression (инвертирование разрядов выражения Expression), Expression 1 AND Expression2 (поразрядная конъюнкция двух выражений), Expression1 OR Expression2 (поразрядная дизъюнкция двух выражений),

Expression1 XOR Expression2 (поразрядная сумма по модулю два двух выражений).

Данные операторы выполняют такие же операции, что и соответствующие команды МП. Значение NOT Expression для байтов не должно выходить за пределы значений -128 ... +255.

Пример 6 (использование логических операторов):

Alpha

equ

7Ah

Beta

equ

5E/z

 

CPI

not Alpha

 

MVI

C, not - Alpha

 

ADI

Beta and Alpha

 

ANI Beta or 0C2h

 

LXI

H, 5E63/z xor 7B84h

 

MVI

E, not 8Ah

A- 85h (7Ah = 0111 1010)

С<e- 79/г (0 - 7Ah = 86h = 1000 0110)

A<- A + 5Ah (5Ah = 0101 1110 & 0111 1010)

A<— A & DEh (DEh = 0101 1110 v 1100 0010)

HL <- 25E7A

Ошибка

Операторы типа переменной. Для этих операторов используются обозначения: LOW и HIGH. Операторы типа переменной имеют форматы:

LOW Expression (выделение младшего байта слова Expression),

HIGH Expression (выделение старшего байта слова Expression).

Пример 7 (использование операторов типа переменной):

Gamma equ

0С95Е/г

 

MVI

Е, low Gamma

; Е 5Еh

XRI

high Gamma

 

5*