Подготовка исходного текста программы
3.2.1. Для того, чтобы создать исходный текст программы (модуля программы), необходимо предварительно разработать алгоритм функционирования микропроцес-сорной системы, а также изучить систему команд МК и способы адресации операндов. Из программно-аппаратных средств нужны только компьютер и любой текстовый редактор, работающий в среде MS DOS и создающий ASCII-файл, например, встроенный редактор Norton Commander, Multi-Edit, Лексикон и др.
Правила исходного языка (source language), который используется для первичного представления программы, определяются типом транслятора, который будет использоваться для перевода исходного текста в машинные коды МК. В данном учебном пособии рассматривается программирование на языке ассемблера Micro Series 8051 Assembler (в дальнейшем ассемблер А8051) фирмы IAR Systems (версия 1.80/MD2).
3.2.2. В тексте программы, написанном на языке ассемблера, каждая строка представляет собой одну команду МК или псевдокоманду (pseudoinstruction) ассемблера и состоит, в общем случае, из следующих четырех полей:
МЕТКА: ОПЕРАЦИЯ ОПЕРАНД(Ы) ;КОММЕНТАРИЙ.
Поля отделяются друг от друга любым количеством пробелов, но не меньше, чем одним.
В отличие от мнемокодов команд МК, которые должны быть переведены программой-транслятором в машинные коды, псевдокоманды ассемблера не преобразуются в машинные коды, а являются инструкциями самого транслятора и служат для управления процессом трансляции (см. пп. 3.2.7 ¸ 3.2.10).
3.2.3. В поле “МЕТКА” записывается символическое имя адреса ячейки памяти, в которой хранится первый байт (код операции) следующей за меткой команды. Метка должна состоять из букв латинского алфавита и цифр. Допускается также использование символа “_”. Максимальная длина метки – 31 символ. Метка должна начинаться с буквы и заканчиваться двоеточием. В качестве меток нельзя использовать мнемокоды команд МК, псевдокоманд ассемблера и мнемонические обозначения регистров специальных функций.
3.2.4. В поле “ОПЕРАЦИЯ” записывается мнемокод команды МК или мнемокод псевдокоманды ассемблера, причем, в последнем случае метка отсутствует, поскольку псевдокоманды не транслируются в двоичные коды и не записываются в программную память МК. Исключениями являются псевдокоманда резервирования памяти и определения байта данных DB, которая может иметь метку (см. п. 3.2.9), и псевдокоманда определения символического имени EQU, в поле метки которой записывается определяемое имя без двоеточия в конце (см. п. 3.2.7).
3.2.5. В поле “ОПЕРАНД(Ы)” указываются операнды, участвующие в операции. Команды МК могут быть безоперандными (NOP, RET, RETI), однооперандными или двухоперандными. Операнды разделяются запятой. На первом месте всегда находится операнд-приемник, на втором – операнд-источник. По адресу операнда-приемника после выполнения операции помещается результат.
При программировании МК семейства MCS-51 используются 6 способов адресации операндов: прямая, косвенная, регистровая, неявная, непосредственная и индексная адресация (см. подраздел 2.8).
В качестве прямого адреса операнда может использоваться число или символическое имя.
Для обозначения косвенной адресации применяется префикс “ @ “.
При непосредственной адресации операнд задается числом или символическим именем с обязательным указанием префикса непосредственного операнда “ # ”. Допускается в качестве непосредственного операнда использовать вместо числа арифметическое выражение, например #2+3, или символ, заключенный в апосторофы, например ’L’. В первом случае на этапе трансляции вместо арифметического выражения будет подставлено значение этого выражения, a втором случае – код ASCII соответствующего символа.
В командах передачи управления операндом может быть число, метка или косвенный адрес.
Числа в тексте программы могут быть представлены в десятичной, двоичной, восьмеричной или шестнадцатеричной форме. Для обозначения систем счисления применяются следующие суффиксы: D – для десятичной, B – для двоичной, Q – для восьмеричной, Н – для шестнадцатеричной системы счисления. Число без суффикса считается десятичным.
Символические имена и метки, используемые в качестве операндов, должны быть определены (см. п. 3.2.7). Исключение составляют символические имена регистров специальных функций, которые являются зарезервированными словами языка ассемблера А8051 (кроме имени PCON) и не требуют определения.
3.2.6. Поле “КОММЕНТАРИЙ” используется программистом для пояснений. Оно начинается с символа “ ; ” и может содержать любые символы, поскольку полностью игнорируется ассемблером. Ассемблер А8051 позволяет использовать в комментариях буквы русского алфавита.
3.2.7. Для определения символических имен используется псевдокоманда ассемблера EQU, например:
CONST EQU number,
где CONST – определяемое имя, а number – числовое значение.
Символические имена и метки, используемые в одном модуле программы, а определяемые в другом модуле, должны быть в первом модуле объявлены внешними (external) , например:
EXTERN LABEL1,
а во втором модуле – общими (public), например:
PUBLIC LABEL1.
3.2.8. Для того, чтобы иметь возможность управлять размещением машинных кодов программы в программной памяти МК, программа разбивается на сегменты. Адреса сегментов определяются на этапе компоновки программы (см. подраздел 3.4).
Сегмент (segment) программы может быть объявлен абсолютным (неперемещаемым) с помощью псевдокоманды ассемблера
ORG addr,
где addr – абсолютный адрес сегмента в программной памяти,
или относительным (перемещаемым) с помощью псевдокоманды ассемблера
RSEG name,
где name – символическое имя сегмента.
3.2.9. Для размещения констант в программной памяти МК используется псевдокоманда ассемблера DB(define byte), в поле операндов которой записываются значения байтов данных, разделяемые запятыми, например:.
DB 1FH,2FH,3FH.
3.2.10. Исходный текст программы обязательно должен заканчиваться псевдокомандой END, которая сообщает транслятору о завершении процесса трансляции.
3.2.11. По окончании работы исходный текст программы (модуля программы) нужно сохранить на магнитном диске компьютера в файле с расширением msaили s03, которые являются стандартными расширениями ассемблера А8051. В дальнейшем будем называть этот файл исходным модулем программы (source module).
Трансляция программы
3.3.1. Трансляция (translation) – это преобразование исходного модуля программы в объектный модуль (object module), которое заключается в замене мнемокодов ассемблера двоичными кодами команд МК. Трансляция выполняется автоматически с помощью компьютерной программы-транслятора. Каждый модуль программы транслируется независимо от других. По желанию пользователя на этапе трансляции кроме объектного файла также может быть создан файл листинга программы (отчета о трансляции), в котором приведено соответствие между мнемокодами команд на языке ассемблера и машинными кодами команд (в шестнадцатеричной форме).
3.3.2. Для .того, чтобы выполнить трансляцию какого-либо модуля программы, достаточно в командной строке MS-DOS набрать с помощью клавиатуры следующий текст:
a8051.exe *.msa [*.lst] [*.r03],
где a8051.exe – имя исполняемого файла транслятора,
*.msa – имя исходного файла,
*.lst – имя файла листинга программы,
*.r03 – имя объектного файла.
Вместо символа “*” следует подставить имя конкретного файла.
Поля должны быть разделены пробелом.
Поля в квадратных скобках являются необязательными. Если никаких необязательных параметров не задавать, то результатом трансляции будет объектный файл, который будет иметь такое же имя, как и исходный файл, а расширение r03. Например, в том случае, когда командная строка имеет вид
A8051.exe program.msa,
в результате трансляции будет создан объектный файл с полным именем program.r03.
Примечание.При запуске транслятора стандартные расширения имен файлов разрешается не указывать.
3.3.3. При успешном завершении трансляции на экран монитора выводится сообщение (рис. 3.2), в котором указывается, что исходный текст программы не содержит синтаксических ошибок (errors), а также приводятся размер объектного модуля программы (bytes) и контрольный код объектного файла (CRC).
В том случае, когда в исходном тексте программы есть ошибки, сообщение транслятора, выводимое на экран монитора, дополнительно содержит номер строки, в которой обнаружена ошибка, характер ошибки, а также полный текст строки, в которой допущена ошибка (рис. 3.3).
Micro Series 8051 Assembler V1.80/MD2
© Copyright IAR Systems 1985
Errors: None #########
Bytes: 36 #program#
CRC: 1C97 #########
Рис 3.2. Сообщение ассемблера в случае успешной
Трансляции программы
Micro Series 8051 Assembler V1.80/MD2
© Copyright IAR Systems 1985
Error in 8: Invalid instruction
MOVB A,R3
End of pass 1
Errors: 1 #########
Bytes: 36 #program#
CRC: 32EE #########
Рис 3.3. Сообщение ассемблера при обнаружении
Ошибки в программе
3.4. Компоновка программы
3.4.1. Компоновкой (linking) – называется объединение нескольких объектных модулей, полученных в результате раздельной трансляции соответствующих исходных модулей, в единый загрузочный модуль и настройка перемещаемых сегментов на конкретные адреса. Компоновка программы выполняется автоматически с помощью компьютерной программы-компоновщика. На этапе компоновки объектные модули прикладной программы, объединяются с библиотечными модулями, причем,. общем случае объединяемые объектные модули могут быть получены в результате трансляции с разных исходных языков программирования.
Рассмотрим компоновку программы с помощью компоновщика Micro Series Linking Loader фирмы IAR Systems, входными файлами которого являются файлы объединяемых объектных модулей, а выходным файлом –hex-файл разрабатываемой программы (см. п. 3.4.2). Кроме hex-файла по желанию пользователя могут быть также созданы и выведены на экран монитора или записаны на магнитный диск карта перекрестных ссылок, стандартная карта загрузки или карта сегментов программы.
3.4.2. Формат hex-файла (Intel standard format) приведен на рис. 3.4. Каждая строка этого текстового файла начинается двоеточием, вслед за которым расположены без пробелов от 5 до 37 двухразрядных шестнадцатеричных чисел, несущих следующую информацию: 1-е число – количество информационных байтов в строке,
2-е число – старший байт адреса (в адресном пространстве программной памяти МК), 3-е число – младший байт адреса, 4-е число – разделитель (00 во всех строках, кроме последней, 01 в последней строке), последнее число – контрольный код, между 4-ым и последним числами – машинные коды команд МК.
3.4.3. Для запуска компоновщика используется следующая командная строка:
xlink.exe <CPU> <Input file(s)> [<Segment definition(s)>] [/<Options>],
В скобках < > указаны названия полей, которые разделяются пробелами и предназначены для задания различных параметров. Внутри полей <Input file(s)>и <Options>,перечисление выполняется через пробел, внутри поля<Segmentdefinition(s)> –через запятую. В квадратных скобках указаны поля, которые не являются обязательными.
Рис. 3.4. Формат hex-файла (Intel Standard Format)
В поле <CPU> указывается тип процессора (8051).
Поле <Input file(s)> содержит имена входных объектных файлов.
Поле <Segment definition(s)>предназначено для задания абсолютных адресов перемещаемых сегментов программы. Данное поле может иметь одну из трех конструкций:
(SEGA,SEGB...) – указывается порядок размещения сегментов,
(SEGA,SEGB...)=2000 – указывается порядок размещения сегментов и
абсолютный адрес (hex) первого сегмента.
(SEGA)=+100 – предписывается увеличить размер сегмента
с именем SEGA на 100 (hex).
В поле <Options>, которое следует после символа “ / “, указываются выходные параметры, которые разделяются пробелами:
O=absfile – определяется имя выходного hex-файла,
например, O=program.hex,
X=listfile – определяется имя файла карты перекрестных ссылок,
например, X=cros_ref.lst,
M=listfile – определяется имя файла стандартной карты загрузки,
например, М=load_map.lst,
S=listfile– определяется имя файла карты сегментов,
например, S=segm_map.lst,
V,symbol=value – определяется символ, например, V,EXTDAT=22 означает,
что внешней переменной с именем EXTDAT присваивается
значение 22 (hex).
Например, командная строка запуска компоновщика для компоновки программы из двух объектных модулей с именами program.r03 и mylib.r03, соответственно, причем в первом модуле объявлен перемещаемый сегмент MAIN, который требуется разместить в программной памяти МК, начиная с адреса 100Н, а во втором модуле объявлен перемещаемый сегмент DELAY, который требуется разместить в программной памяти МК вслед за сегментом MAIN, и в результате компоновки должен быть получен hex-файл с именем program.hex, а также файл стандартной карты загрузки с именем program.lst, будет иметь следующий вид:
xlink 8051 program mylib (MAIN,DELAY)=100 /O=program.hex M=program.lst
3.4.4. Если в командной строке после опции М не указано имя файла, то карта загрузки выводится на экран монитора, если же имя файла указано, то создается текстовый файл на магнитном диске.
3.4.5. При успешном завершении компоновки на экран монитора выводится сообщение