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

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

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

50

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

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

Текст исходной программы состоит из операторов ассемблера, каждый из которых зани­ мает отдельную строку этого текста. Различают два типа операторов: инструкции и директивы. Инструкции при трансляции преобразуются в машинные коды МП. Директивы ассемблера, или псевдокоманды языка ассемблера, не транслируются в машинные коды, а только управляют процессом ассемблирования (трансляции). Программа-ассемблер интерпретирует и обрабаты­ вает операторы один за другим, генерируя последовательность из машинных кодов команд МГ1 и байтов данных. Запись инструкции на языке ассемблера состоит из четырех полей в свобод­ ном формате: поля метки, поля кода операции (КОП), поля операндов и поля комментария:

[Метка:] КОП [Операнд1 [, Операнд2]] [; Комментарий]

(элементы, указанные в квадратных скобках, могут отсутствовать). Метка — это идентифика­ тор, присваиваемый первому байту того оператора, в котором она появляется, а КОП — это мнемоническое обозначение команд МП. Для директив ассемблера эти поля называются полем имени, полем директивы, полем выражения и полем комментария соответственно. Операнды могут описываться выражениями, составленными из чисел и символических имен с помощью специальных операторов языка ассемблера.

Пробелы вводятся произвольно (свободный формат), но минимум один пробел должен быть после кода операции. В двухоперандных командах операнды должны быть разделены запятой, а поле комментария должно начинаться с точки с запятой.

Операнды, представляющие собой числа, должны обязательно начинаться с цифры (на­ пример, 0А800Л), а символические имена операндов — с буквы. Для символических имен нельзя использовать зарезервированные имена, например, имена РОНов, мнемонику команд и директив. Для обозначения систем счисления служат буквы:

Били b — двоичная система счисления,

Оили Q (о или q) — восьмеричная система счисления, D или d — десятичная система счисления,

Нили h — 16-ричная система счисления

(по умолчанию принимается десятичная система счисления, т. е. указатель d можно опускать). В тексте программы на языке ассемблера можно использовать как прописные, так и строчные буквы — ассемблер их не различает.

ASC/7-коды. Текст исходной программы на языке ассемблера подготавливается с помо­ щью обычного текстового редактора, имеющегося в дисковой операционной системе MS-DOS (.Microsoft Disk Operating System) для PC IBM. Все символы такого текста представлены-

в ASCII-кодах (American Standard Code for Information Interchange — американский стандарт­ ный код для информационного обмена), используемых для семиразрядного кодирования сим­ волов (табл. 1.9). Стандарт ASCII утвержден ISO (International Standards Organization) — меж­ дународной организацией по стандартизации, основанной в 1946 г и включающей более 70 национальных организаций по стандартизации в области телекоммуникаций. Восьмой бит символа предназначен для контроля четности. В компьютерах используется расширенный (8-разрядный) коп, ASCII, в котором первые 128 кодов совпадают со стандартным кодом ASCII, а следующие 128 комбинаций используются для кодирования национальных алфавитов, спец­ символов и псевдографики.

Пробел имеет ASCII-коя 20/?, а управляющим символам, невидимым в текстовом редакто­ ре, приписаны Д5С//-коды 00h + lF /г. Например, в текстах постоянно используются Л5С//-коды

0Dh = 13flf — возврат каретки (Carriage Return) и 0А/? = I 0 d — перевод строки (Line Feed). При выводе текста на дисплей эти А5С7/-коды используются в подпрограммах, выполняющих сдви­ ги курсора в левую позицию экрана и вниз на одну позицию соответственно.

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

51

D И

ООО00 001 01 002 02 003 03 004 04 005 05 006 06 007 07

Оосо 08

009 09

010 0А

011 ОВ

012 ОС

013 0D

014 0Е

015 0F

5 D Н

016 10

017 11

018 12

019 13

020 14

Л

§ 021 15

1 022 16

023 17

S'

9 024 18

о?

е- 025 19 026 1 А

027 1В

028 1C

029 1D

030 1Е

031 1F

S

с—

О

S'

с

«5 si

S'

£

Таблица 1.9. Таблица символов A SC II

 

 

 

 

 

D Н S D И S D II S D II 5

D Н S D H S

032 20

 

048 30

0

064 40

@

080 50

Р

096 60

 

112 70

P

033 21

1

049

31

1

065 41

А

081 51

Q

097 61

а

113 71

q

034 22

"

050

32

2

066 42

В

082 52

R

098 62

b

114 72

r

035 23

#

051 33

3

067 43

С

083 53

S

099 63

с

115 73

s

036 24

$

052

34

4

068 44

D

084 54

Т

100 64

d

116 74

t

037 25

%

053 35

5

069 45

Е

085 55

и

101 65

е

117 75

u

038 26

&

054 36

6

070 46

F

086 56

V

102 66

f

118 76

V

039 27

055 37

7

071 47

G

087 57

W

103 67

g

119 77

w

040 28

(

056 38

8

072 48

Н

088 58

X

104 68

h

120 78

X

041 29

)

057 39

9

073 49

I

089 59

Y

105 69

i

1 2 1 79

У

042 2А

*

058 ЗА

 

074 4А

J

090 5А

Z

106 6А

j

122 7A

z

043 2В

+

059

зв

 

075 4B

К

091 5В

[

107 6В

k

123 7B

{

044

,

060

з с

<

076

L

092

\

108 6С

1

124 1C

I

045 2D

-

061 3D

=

077 4D

М 093 5D

J

109 6D

m

125 7D

}

046 2Е

 

062

ЗЕ

>

078 4Е

N

094 5Е

Л

110 6Е

n

126 7E

~

047 2F

/

063 3F

7

079 4F

О

095 5F

_

111 6F

о

127 7F

 

П р и м е ч а н и е : D •— Decimal (десятичное число), Н Hexadecimal ( 16-ричное число), S Symbol (символ).

Управляющим символам также приписаны стандартные образы, используемые при необ­ ходимости для их визуализации. Например, Л6’С7/-кодам OD/г и ОАh соответствуют образы X и г соответственно. Цифры # = 0 ... 9 имеют ASCII-коды 30/г... 39h, т. е. их ASCII-код = # + 30/г, что и используется для их взаимного преобразования программным способом.

В компьютерах Л5С//-коды используются для передачи данных по каналам связи, при вводе данных с клавиатуры и выводе текста на дисплей, т. е. для информационного обмена ме­ жду МП и внешними устройствами. Следует четко представлять себе различие между двоич­ ными кодами, которыми должна быть представлена разрабатываемая программа, чтобы она могла быть выполнена МП-системой (микроконтроллером, персональным компьютером), и соответствующими им А5С//-кодами (табл. 1.10).

 

Таблица 1.10. Коды команд

Мнемоника

Двоичный код

Л5С//-коды команд

команд

команд

 

RAL

00010111= 17Л

31/г 37/г = 00110001 00110111

HLT

01110110 = 76/г

37/г 36Л = 00110111 00110110

RET

11000001 = C l/г

43/г 31/г = 01000011 00110001

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

Представление информации в Л5С//-кодах используется в текстовых документах, при пе­ редаче ее по каналам связи и др. 16-ричное представление двоичных кодов их не изменяет и используется исключительно для удобства восприятия двоичных кодов человеком.

Ассемблирование, компоновка и отладка программ. Разработчиками программного обеспечения на языке ассемблера введена следующая терминология:

ассемблер (assembler) — а) программа или техническое средство, выполняющее ассемб­ лирование; б) система программирования, включающая язык ассемблера и транслятор с этого языка;

двухпроходной ассемблер (two-pass assembler) — ассемблер, выполняющий трансляцию исходной программы, написанной на языке ассемблера и называемой исходным модулем, за два прохода: при первом проходе формируется таблица соответствия символов, при втором — выполняется собственно трансляция с языка ассемблера в машинные коды МП;

ассемблирование (assemblage) компиляция программы с языка ассемблера; подготовка программы на машинном языке путем замены символических имен операций на машинные коды, а символических адресов — на абсолютные или относительные адреса, а также включе­ ние библиотечных программ и генерация последовательностей команд путем указания кон­ кретных параметров в макрокомандах;

компиляция (compilation) трансляция программы на язык, близкий к машинному;

трансляция программы, составленной на исходном языке, в объектный модуль',

компоновка (linking) — процесс построения загрузочного модуля из объектных модулей, полученных в результате раздельной трансляции соответствующих исходных модулей;

компоновщик (linker) — программа, выполняющая компоновку единой программы из не­ зависимо транслированных программ;

макроассемблер (macro assembler) — транслятор с языка ассемблера, включающий сред­ ства определения и использования макрокоманд;

отладчик (debugger) — программа, предназначенная для анализа поведения другой про­ граммы, обеспечивающая ее трассировку, останов в указанных точках или при выполнении указанных условий, просмотр и изменение ячеек памяти, регистров МП и команд программы;

моделирующий отладчик (simulation debugger) — программа, предназначенная для отлад­ ки программ некоторой ЭВМ на другой ЭВМ с использованием модели последней.

Файлу исходного модуля присваивается имя name.asm (пате — имя, составленное не бо­ лее чем из восьми допустимых символов). Для разработки программного обеспечения микро­ контроллеров, построенных на основе МП 8080/8085 фирмы Intel и Z80 фирмы Zilog, можно использовать, например, программный пакет AVSIM85 фирмы Avocet Systems, Inc. В этот пакет входят, в частности, программы:

avmac85.exe (Macro Assembler) — ассемблер, транслирующий исходный модуль name.asm в машинные коды и генерирующий файлы name.obj, пате.ргп и name.xrf. Файл name.obj (объ­ ектный модуль) используется компоновщиком avlink.exe для создания загрузочного модуля name.hex для моделирующего отладчика. Файл пате.ргп — листинг результата трансляции с указанием всех обнаруженных ошибок, помогающий исправить текст исходного модуля (листинг содержит и текст исходной программы). Файл name.xvf содержит карту перекрест­ ных ссылок;

avlink.exe (Linker) — компоновщик, создающий из одного или нескольких объектных мо­ дулей загрузочный модуль пате.hex и генерирующий файлы пате.т а р и пате.sym. Модуль name.hex используется моделирующим отладчиком avsim.85.exe для его выполнения на персо­ нальном компьютере IBM PC. Файл пате.тар содержит карту распределения памяти, исполь­ зуемой создаваемой программой. Файл name.sym содержит описание используемых в про­ грамме сегментов (начальных и конечных адресов сегмента программного кода, сегмента дан­ ных, сегмента стека и сегмента внешних устройств). Модуль пате.hex, кроме того, необходим

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

53

для генерации командой load.com исполняемого модуля пате.сот при использовании диско­ вой операционной системы СР/М (Control Program for Microcomputers — управляющая про­ грамма для микрокомпьютеров, построенных на основе МП 8080/8085/Z80) фирмы Digital Re­ search, созданной Г. Килдэлом в 1976 г.;

avsimH5.exe (Simulation Debugger) — моделирующий отладчик, позволяющий выполнять программу на персональных компьютерах типа IBM PC частями и в пошаговом режиме для обнаружения неуловимых другими средствами ошибок в разрабатываемой программе (доступ­ но для анализа — выводится на экран — содержимое всех регистров, флагов и используемой памяти);

hexform.exe — преобразователь загрузочного модуля name.hex, выполнимого на персо­

нальном компьютере IBM PC

только с помощью моделирующего

отладчика avsim85.exe,

в двоичный модуль name.bin,

непосредственно используемый для

программирования ROM

микроконтроллеров, построенных на основе МП 8080/8085 фирмы Intel.

Объектный модуль name.obj генерируется при запуске из командной строки компьютера команды

avw/ac85[.exe] пате[.asm] [a t ] [SM [SC] [5/]]

(квадратными скобками отмечены необязательные элементы). При этом создаются также фай­ лы пате.ргп и name.xrf, но при отсутствии параметра хг файл name.xrf не создается. Назначе­ ние параметров SM (ShowMacs), SC (ShowComments) и SI (ShowIncs) будет рассмотрено ниже.

Загрузочный модуль name.hex генерируется при запуске из командной строки компьютера команды

avlink[.exe] name[.hexj = пате[.оЪ}] [-зт]

(создаются также файлы пате.тар и name.sym, но при отсутствии параметра sy файл пате.sym не генерируется, и отладчик будет работать неправильно). В файле name.hex информация пред­ ставлена в ASCII-коаах. Компоновщик может объединять несколько объектных файлов, на­ пример:

avlink.exe name.hex = nameLoty name2.obj name3.obj -sy

(загрузочный модуль name.hex генерируется из трех объектных файлов).

Указание: для генерируемого файла (здесь файл name.hex) и файла-источника (здесь файл name.obj) всегда можно использовать разные имена пате, но в дальнейшем, если это возможно, для упрощения конструкций команд будут использоваться одинаковые имена. При использо­ вании разных имен со временем можно также забыть, каким файлом name.asm они порождены. В последней команде в качестве имени пате предпочтительнее взять имя одного из трех фай­ лов, являющегося главным файлом.

На рис. 1.18 показано содержимое загрузочного модуля l#08_03.hex (1 — номер главы, 08 — номер параграфа, 03 — номер задачи; все файлы с именами x#xx_xx.asm находятся на прилагаемой к учебному пособию дискете). Этот файл получен как результат решения задачи 3 (см. ниже). Подчеркнутым шрифтом выделен программный код (два сегмента, занимающих 30 и 10 байт памяти), полужирным шрифтом — адреса сегментов, полужирным подчеркнутым шрифтом — адрес старта, указываемый в строке директивы END (см. табл. 1.11).

1E003COOF53A0008E680F640303A0008E68E3A00083717E25400E6FE320008F1FBC914

01180000Ц88

i

1. Рамкой обведены данные, используемые программой.

ОАОЮОООЗ 100103Е0В30FBС3070165

j

2. Адрес старта необходим только для генерации

00010001FE

; исполняемого модуля в операционной системе СР/М.

Рис. 1.18. Загрузочный модуль l#08_03.hex для моделирующего отладчика

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

Для запуска отладчика из командной строки компьютера необходимо выполнить команду avj/«/85[.exe] parlFLname.cmd [-раг2]

(но перед этим должен быть создан файл name.hex, который, собственно и использует отладчик для прогона программы). Параметр par 1 = а, b, с или d задает конфигурацию МП-системы:

а — МП 8085 или 8080, b — 8085 + 8J55, с — 8085 + 8355, d — 8085 + 8155 + 8355 (БИС 8155

и 8355 описаны в § 3.9), а параметр FL (File Load) — загрузку командного файла name.cmd ав­ томатической настройки экрана отладчика. Командный файл пате.стй — текстовый файл па­ раметров отладчика, подготавливаемый пользователем. Параметр p a ri = d0, d l, с0 или cl на­ страивает отладчик на используемый тип дисплея (если этот параметр не задан, то устанавли­ вается черно-белый режим работы дисплея).

Например, если name.cmd = ivanov.cmd, par\ = а и pari = cl, то следует выполнить коман­

ду

(ivsim85.exe aflivanov.cmd - c l

(словосочетание par] FLname пишется слитно). Пример простейшего командного файла ivanov.cmd для автоматической настройки отладчика:

LAivanov D1A800/; ^ 0 1 0 0

(назначение подобных команд будет рассмотрено в подразделе О тладчик фирмы Avocet Sys­ tems, Inc. — стр. 92).

Для преобразования загрузочного модуля name.hex в двоичный модуль пате.Ъ'т, который можно использовать для программирования ROM микроконтроллеров, необходимо выполнить команду

hexform[.exe] пате[.Ъ'т\ = пате[.hex] [~range(addr 1, addrl)] [~fill(value)\

(по умолчанию генерируется файл пате.Ъ'т). Начальный и конечный адреса программы или ее некоторой части, для которой создается файл пате.Ъ'т, задает параметр range(addrl, addrl) — диапазон, область. Параметр fill(value) указывает, каким числом value = OOh... FF/г (или 0 ... 255) нужно заполнить неиспользованные программой участки памяти в диапазоне адресов addr 1 ...a dd rl. По умолчанию (если параметры не заданы) заполнение производится числом 00h, а диапазон равен 0000/г... addr, где addr — максимальный адрес ячейки памяти, исполь­ зуемой программой под программный код или данные.

При проектировании микроконтроллеров широко применяются EPROM (Erasable Pro­ grammable ROM), или UV-EPROM (Ultra-Violet EPROM), фирмы Intel — стираемые ультрафио­ летовыми лучами многократно программируемые ПЗУ. В исходном состоянии сигналы на всех выходах EPROM равны 1 и должны программироваться только нулевые значения разрядов данных. Поэтому заполнение неиспользуемых частей памяти следует производить числами FF/г = 1111 1111. Это позволяет, если потребуется в дальнейшем, запрограммировать в сво­ бодные ячейки памяти добавочное программное обеспечение.

Если задать значения addrl = 003С/г, addrl = 010В/г и value = FF/г, то при запуске из ко­ мандной строки команды

hexform.exe. l#08_03.bin = l#08_03.hex -range(3Ch, 1 ОВ/г) -fill(FFh)

будет получен файл l#08_03.bin. содержимое которого показано на рис. 1.19. Если же парамет­ ры не задать, то файл l#08_03.bin будет содержать 2049'байт по адресам 0000h ...0800/г с за­ полненными числом 00/; неиспользуемыми участками памяти (по адресу 0800/7 в программе расположен байт данных).

 

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

 

55

<—ООЗС/7 addr 1

Файл

о

03.

)in

0059/7

 

00

F5 ЗА 00 08 E6 80 F6 40

 

1

17 E2 54 00 E6 FE 32

 

30 ЗА 00 08 E6 8E ЗА 00 08

37

00 08 FI FB C9 FF FF

FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF

FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF

FF FF FF FF FF FF FF FF FF FF FF FF FF FF 31

FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 00 10 3E 0B 30 FB C3 07 01 FF FF

0 100/г

0109/г

ОЮС/г = addrl

Рис. 1.19. Модуль l#08_03.bin для программирования EPROM фирмы Intel

Так как файл l#08_03.bin двоичный, то в текстовом редакторе его содержимое имеет вид:

j : ® ц А + @ 0 : ® ц О : ® 7 j t T Цщ2 HeV[j=

1 ►>°"0Vf-.©

(большинство кодов невидимы, например, 1111 1111 = FF/г). Содержимое файла l#08_03.bin, представленное на рис. 1.19, получено переводом его содержимого в Л5С7/-коды специальной программой.

Д ирективы ассемблера. Ассемблеры разных фирм имеют много общего — их можно считать диалектами одного языка ассемблера. Поэтому, однажды изучив ассемблер одной фирмы, легко перейти к использованию ассемблера другой фирмы и даже ассемблера для дру­ гого типа МП. В табл. 1.11 приведены основные директивы ассемблера фирмы Avocet Systems, Inc. Освоения этих директив уже достаточно для разработки простых программ.

В ассемблере фирмы Avocet Systems, Inc. можно использовать и не стандартные указатели систем счисления: S — 16-ричная, @ — восьмеричная и % — двоичная системы счисления. Эти символы указываются перед числами, например,

$0D7 = 0D7/i, @47 = Alq, %1011 = 10 Ш .

Таблица 1.11. Основные директивы ассемблера версии 2.02 фирмы Avocet Systems, Inc.

Метка

КОП

 

Операнды

 

Комментарий <— Формат инструкций

Имя Директива

Выражение

 

Комментарий <г- Формат псевдокоманд__________________

[Label1[:]] 1org

100/г

; Origin — начало (Label 1 = \00h)

Name 1[:]

equ

ОА8 ОО/7

; Equate — приравнять (Namei A8 OO/7)

Name2[:]

equ

(40Л*3 - 40/i)/2

; Name2 = 40A (в выражении использованы операторы: *, -, /)

[Label2[:]]

db

58, .0Е2h, 99

; Define Byte — определить байт (запись в память трех байт)

ILabeBl:)]

db

‘NovoseJzeva’

; В память записывается J 1 символов в кодах ASCII: 4 Е ... 61

[LabelA[:]]

dw

1998/г, OD4 C 1/7

; Define Word — определить слово. В четыре ячейки памяти

[Label5[:]\

 

 

 

;

байты записываются в последовательности: 98 19 Cl D4

ds

k

 

; Define Space — определить (зарезервировать) к байт памяти

 

defseg

N_seg[, Attribute] ~ ; Define Segment — определить сегмент

 

seg

 

N_seg

; Открытие сегмента N_seg после директивы defseg. Сегмент

 

 

 

[AddrStart]

;

закрывается автоматически при открытии другого сегмента

_________ end

 

; Конец программы_________________________________________

П р и м е ч а н и е : 1 квадратными скобками помечены необязательные элементы (если метка Label имеется, то ей присваивается указанный в директиве или вычисленный транслятором адрес, а не значение первого операн­ да, определенного в этой директиве); 2 наиболее часто используются атрибуты (Attribute) START = Address, CLASS —Code, Data или lOspace.

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

В дальнейшем для улучшения читаемости программ при написании их текхтов будем придерживаться следующих правил:

команды МП и метки для команд переходов записываются только прямыми прописными буквами,

директивы ассемблера — только прямыми строчными буквами, символические имена констант, переменных и сегментов — с использованием курсивных

и прописных, и строчных букв, причем первая буква должна быть прописной.

Далее будут описаны не все, о только наиболее часто используемые директивы, которых достаточно для разработки программ с приемлемой эффективностью. Все описанные здесь ди­ рективы и операторы поясняются примерами их использования. Порядок описания директив будет определяться как методическими соображениями, так и последовательностью появления директив в примерах программ (указатель директив см. в табл. 4.22, с. 441).

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

Директивы определения DEFSEG (Define Segment) и открытия SEG (Segment) сегментов

предназначены для размещения данных, стека и программного кода по определенным адресам памяти. Эти директивы имеют форматы:

DEFSEG Name_seg [, Attribute]

SEG Name_seg

(атрибуты могут отсутствовать). При определении сегмента директивой DEFSEG и его откры­ тии директивой SEG должно использоваться одно и то же имя сегмента Name_seg. Закрытие сегмента происходит автоматически при открытии другого сегмента. Определяется сегмент директивой DEFSEG только один раз, а открываться директивой SEG может любое число раз в разных местах программы (внутри других сегментов). При трансляции все части сегмента (сегменты, имеющие одно и то же имя) объединяются в непрерывную область данных в после­ довательности их появления в программе.

Наиболее важными и часто используемыми являются два атрибута START и CLASS, за­ дающие начальный адрес сегмента (START = address, где address — число или символическое имя числа) и принадлежность к определенной группе сегментов (CLASS = Code — программ­ ный код, CLASS = Data — данные. CLASS = IOspace — внешние устройства). Пример:

DEFSEG Ivanov, START = 200h, CLASS = Code

(первый байт программного кода будет расположен по адресу 200И).

Имена сегментов Name_seg = Code, Data и IOspace в ассемблере зарезервированы для от­ крытия сегментов директивой SEG с нулевого адреса (постоянных сегментов) без предвари­ тельного их определения директивой DEFSEG. Начальные адреса этих сегментов (0000/г — для памяти и 00/г — для внешних устройств) не могут быть изменены, так как сегменты не опреде­ ляются директивой DEFSEG. Например, директивой SEG IOspace открывается сегмент, пер­ вому порту ввода-вывода которого будет присвоен адрес 00/г. Хотя и используются одинако­ вые имена Code, Data и IOspace для сегментов и классов, ассемблер различает их по контексту.

Компоновщик объединяет сегменты Code и Data в непрерывную область, располагая сег­ мент Data после сегмента Code независимо от их взаимного расположения в тексте исходной программы, причем сегмент Code будет начинаться с адреса 0000/г.

Директива END задает конец программы — все, что написано после директивы END, транслятором игнорируется. Эта директива имеет формат

END [AddrStarl]

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

57

(параметр AddrStari может быть меткой или числом, задающим абсолютный адрес — записы­ вается в файл name.hex).

Адрес старта необходим только для генерации исполняемого модуля пате.со т в операци­ онной системе СР/М, причем требуется выполнять условие AddrStari > 100/?. Для микрокон­ троллеров специального назначения, построенных на основе МП 8080/8085, модули name.com не нужны — в них операционная система СР/М не используется, а требуется только генериро­ вать модули name.bin для последующего программирования ROM.

0000/1 <

ROM

------- >

07FF/J

0800/г <-

RAM

-> 0FFF/7

0000 00)24 003С

0100

0720

0760

0800

 

0FE0

L Q

 

 

п

 

 

 

Sr S_trap S_rstl5

Main_seg

D2_seg

D3_seg

Dl_seg

 

Stack_seg

Рис. 1.20. Размещение сегментов в памяти

Задача 1. Для простейшего микроконтроллера, построенного на основе МП 8085Л, с объ­ емом памяти 4 Кбайта (ROM — 2 Кбайта по адресам 0000И ... OlFFh и RAM — 2 Кбайта по ад­ ресам 0800/1... 0FFF/j) произвести ее распределение по сегментам

Sr — для одной команды JMP 100/г, обеспечивающей переход в начало сегмента Main_seg после включения питания (ROM),

S jra p — для подпрограммы обработки запроса немаскируемого прерывания TRAP, вызы­ ваемой по адресу addr = 8 х 4,5 = 36d = 0024h (ROM),

S_rstl5 — для подпрограммы обработки запроса маскируемого прерывания RST 7.5, вы­ зываемой по адресу addr = 8 х 7,5 = 60d = 003Ch (ROM),

Main_seg — для основной программы, начинающейся с адреса 100/г (ROM),

Dl_seg — для оперативных данных, начиная с адреса 0800ft (резервирование 48 байт в RAM),

D2_seg — для таблицы преобразования кодов, начиная с адреса 0720/г (ROM), D3_seg — для таблицы констант, начиная с адреса 0740/7 (ROM),

Stack__seg — для стека размером 32 байта (RAM)

в соответствии с рис. 1.20. Для внешних устройств задать сегмент по имени 10_seg с адреса

30h. Решение:

; Метка КОП

Операнд

Комментарий

; Имя Директива Выражение

Комментарий

seg

Code

; Открытие сегмента Code, используемого в качестве сегмента Sr

JMP

MAIN

; Переход на начало основной программы

defseg

Sjtrap, start = 24Л ; Определение сегмента S_trap (4,5 х 8 = 36d = 24h)

seg

S jr a p

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

PUSH

PSW

; Начало подпрограммы обработки прерывания по входу TRAP

JMP

TRAP

; Переход для продолжения подпрограммы

defseg

S jrstlS , start = 3Ch ; Определение сегмента S_rstl5 (7,5 х 8 = 60d = 3Ch)

seg

S_rstl5

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

PUSH

PSW

; Начало подпрограммы обработки прерывания RST 7.5

 

 

; Основная часть подпрограммы обработки прерывания RST 7.5

POP

PSW

 

EI

 

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

RET

 

; Конец подпрограммы обработки прерывания RST 7.5

58

 

 

 

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

 

 

 

 

; Data Segment

 

Ram

equ

800Й

 

; Ram = 0800/j — начальный адрес RAM

Rsz

equ

800/i

 

; Rsz = 0800h — объем памяти RAM (RAM Size) 2K x 8 бит

Ssz

equ

20h

 

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

 

defseg

D\_seg, start = Ram. class = Data

; Определение сегмента D\_seg

 

seg

Dl_seg

 

 

; Открытие сегмента D\_seg

Тп

ds

30/i

 

; С адреса Тп = 0800/г резервируется место для 48 байт данных

 

defseg

D2_seg, start = 720/г, class = Data

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

 

seg

D2_seg

 

 

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

Tls

db

40Л, 79Л, 24/i, 30/г, 19h, 12h, 2, 78h, 0,

10Л, 8, 3, 46/?, 21 h, 6, 0Eh

 

db

7F/i, 3F/i, 4E/i, 9, 48h, ОСh, 11h, 47/г, 41/г, 1В/?, 71/г

; С адреса 77s = 0720h в память будет записано 27 байт: 40 79 24 30 и т. д.

 

defseg

D3_seg, start = 760/г, class = Data

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

 

seg

D3_seg

 

 

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

Tct

db

28, 2, 11101b,

10/i ; Запись в память с адреса Tct = 0760/z байтов: 1C 02 ID 10

 

 

 

 

; Stack Segment

 

 

defseg

Stack_seg, star

= Ram + Rsz - Ssz, class = Data ; Определение Stack_seg

 

seg

Stack_seg

 

 

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

 

ds

Ssz

 

; Резервирование 32 байт под стек

 

 

 

 

; I/O Segment

 

 

defseg

IO_seg, start = 30h, class = lOspace

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

 

seg

IO_seg

 

 

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

CSled

ds

1

 

; CSled = 30h — адрес порта внешнего устройства 1

CShs

ds

1

 

; CShs = 31 h — адрес порта внешнего устройства 2

CSct

ds

1

 

; CSct = 32h — адрес порта внешнего устройства 3

 

 

 

 

; Code Segment

 

 

defseg

Main_seg, start = 100/г, class = Code

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

 

seg

Main_seg

 

 

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

TRAP: PUSH

H

 

: Продолжение подпрограммы обработки прерывания TRAP

 

 

 

 

; Основная часть подпрограммы обработки прерывания TRAP

 

POP

H

 

 

 

 

POP

PSW

 

 

 

 

EI

 

 

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

 

RET

H, Ram

 

; Конец подпрограммы обработки прерывания TRAP

MAIN: LXI

 

; HL <— 800/г — начальный адрес RAM

 

 

 

 

; Программа тестирования RAM

 

LXI

SP, Ram + Rsz

; SP <— 1000/г — инициализация указателя стека

 

MVI

A, OBh

; A <— OB/z = 0000 1011 (.A3 = MCE = 1, A2 = M 7.5 = 0 — см. рис. 1.15)

 

SIM

 

 

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

 

EI

 

 

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

 

 

 

 

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

 

seg

D2_seg

 

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

String

db

‘Novoselzeva’, 0 ; В память записывается 12 символов в кодах ASCII. 4Е 6 F ... 00

 

seg

Main_seg

 

; Открытие сегмента M ainjseg и.закрытие сегмента D2_seg

 

 

 

 

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

 

end

 

 

; Конец программы

 

Вэтой программе имеется восемь сегментов, шесть из которых расположены в ПЗУ, а два

вОЗУ (рис. 1.20). Сегмент данных D2_seg открывается два раза. Символическим именам Tls и

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

59

String, расположенным в сегменте D2_seg, транслятор присвоит адреса 0720/г и 073В/г, так как первая часть сегмента D2_seg займет область памяти с адресами 0720/?... 073Аh (T ls = 0720/г, 5Vn'ng = 073В/г). Символические имена переменных можно использовать в программе в качест­ ве операндов. Например, команда LXI Н, String + 5 загрузит в регистровую пару rp Н число 0740/г = 073В/г + 5 (здесь использован арифметический оператор языка ассемблера “+” для вы­ числения суммы).

Любой из сегментов, в том числе и сегмент кода (Code Segment), может отсутствовать. При необходимости сегменты могут быть добавлены, например, сегменты для обработки за­ просов прерываний по входам RST 5.5 и RST 6.5, а также сегменты данных.

Если начало сегмента D3_seg задать равным 0740/г, то он будет перекрыт сегментом D2_seg, так как его размер равен 39d байтам. Перекрытие сегментов обнаруживает компонов­ щик, который выдает при этом сообщение:

WARNING: Segment D2_SEG overwrites Memory.

Любое предупреждение (Warning) программист может игнорировать, считая, что для ре­ шения задачи он поступает правильно. Сообщения же ERROR, выдаваемые транслятором при обнаружении ошибок в программе, программист должен непременно исправить для продолже­ ния дальнейшей работы. Решение большого числа задач на языке ассемблера для МП

8080/8085 можно найти в [6, 7].

Задача 2 (файл l#08_02.asm). По условиям задачи 9 из § 1.6 (с. 41), используя постоянные сегменты Code и Data, написать программу для прогона ее в отладчике. Определить сегмент стека размером 32 байта, хотя он и не будет использован. Решение:

 

seg

Data

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

Лг?г1

db

95h, 93h

Am i = 001Dh, M(001D) = 95h

Ат2

dw

8595 h

A m i = OOlF/г, M(001F) = 95h

Ams

ds

3

Ams = 0021 h

Stack:

ds

20h

Резервирование 32 байт для стека

seg

; Транслятор метке Stack присваивает адрес по ее положению в программе

 

Code

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

 

LXI

SP, Stack

SP <- Stack = 0044h

 

L.HLD

Ат2

H <— M(Am2+l), L <—M (Aml) — два байта второго слагаемого

 

XCHG

 

D M {Aml+l), E M (Aml)

 

 

 

Как и в задаче 9 из § 1.6

 

INX

Н

HL <— Ams + 2

 

MOV

М, А

M(Ams+l) <- CY

 

HLT

 

Команда HLT (останов МП) использована

 

end

 

для визуализации конца сегмента Code в отладчике

На рис. 1.21 показано размещение сегментов в памяти после обработки объектного моду­ ля компоновщиком — постоянные сегменты объединяются в непрерывную область.

0000/!

 

001 Ch Данные

0024/j <-----------

СТЕК

-> 0043Л 0044Л

 

 

 

 

 

<—

V

Vw'VI 1V^ I1 1 V't/viL

'

V/

1 Ivl 111 Zyu ILL

/

Рис. 1.21. Размещение сегментов в памяти