
литература / Пухальский Проектирование микропроцессорных систем 2001
.pdf60 |
Глава 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 |
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*