Tooprogram.ru

Компьютерный справочник
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Что определяет директива define ассемблера mpasm

Что определяет директива define ассемблера mpasm

Поле комментария может использоваться программистом для текстового или символьного пояснения логической организации программы. Поле комментария полностью игнорируется ассемблером, поэтому в нем можно применять любые символы. Комментарии, которые используются в строке сами по себе, должны начинаться с символа комментария (* или ;). Комментарии в конце строки должны быть отделены от остатка строки одним или более пробелами или табуляцией.

Расширения файлов, используемые MPASM и утилитами

Существует ряд расширений файлов, применяемых по умолчанию MPASM и связанными утилитами. Назначения таких расширений приведены в табл. 6.4.

Табл. 6.4. Используемые по умолчанию назначения расширений файлов.

РасширениеНазначение
.ASMВходной файл ассемблера для MPASM .ASM
.OBJВыходной файл перемещаемого объектного кода из MPASM .OBJ
.LSTВыходной файл листинга, генерируемый ассемблером MPASM или MPLINK: .LST
.ERRВыходной файл ошибок из MPASM: .ERR
.MAPВыходной файл распределения памяти из MPASM: .MAP
.HEXВыходной файл объектного кода в шестнадцатиричном представлении из MPASM: .HXL, .HXH
.LIBБиблиотечный файл, созданный MPLIB и привязанный компоновщиком MPLINK: .LIB
.LNKВыходной файл компоновщика:
.LNK
.CODВыходной символьный файл или файл отладчика. Формируются MPASM или MPLINK:
.COD

Листинг представляет собой текстовый файл в формате ASCII, который содержит машинные коды, сгенерированные в соответствии с каждой ассемблерной командой, директивой ассемблера или макрокомандой исходного файла. Файл листинга содержит: имя продукта и версии, дату и время, номер страницы вверху каждой страницы.

В состав листинга входят также таблица символов и карта использования памяти. В таблице символов перечисляются все символы, которые есть в программе, и где они определены. Карта использования памяти дает графическое представление о расходовании памяти МК.

Директивы языка – это ассемблерные команды, которые встречаются в исходном коде, но не транслируются прямо в исполняемые коды. Они используются ассемблером при трактовке мнемоники входного файла, размещении данных и формировании файла листинга.

Существует четыре основных типа директив в MPASM:

  • директивы данных;
  • директивы листинга;
  • управляющие директивы;
  • макро-директивы.

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

Директивы листинга управляют листингом файла MPASM и форматом. Они определяют спецификацию заголовков, генерацию страниц и другие функции управления листингом.

Директивы управления позволяют произвести секционирование обычного ассемблерного кода.

Макро-директивы управляют исполнением и распределением данных в пределах определений макротела.

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

CODE – начало секции объектного кода

Используется при генерации объектных модулей. Объявляет начало секции программного кода. Если не указана, секция будет названа .code Стартовый адрес устанавливается равным указанному значению или нулю, если адрес не был указан.

#DEFINE – определить метку замены текста

Директива задает строку , замещающую метку всякий раз, когда та будет встречаться в исходном тексте.

Символы, которые определены директивой #DEFINE, не могут быть просмотрены симулятором. Используйте вместо этой директивы EQU.

END – конец программного блока

Определяет конец программы. После остановки программы таблица символов сбрасывается в файл листинга.

EQU – определить ассемблерную константу

Здесь – это правильное MPASM выражение. Значение выражения присваивается метке .

INCLUDE – включить дополнительный файл источника

Определяемый файл считывается как источник кода. По окончании включаемого файла будет продолжаться ассемблирование исходника. Допускается до шести уровней вложенности. может быть заключен в кавычки или угловые скобки. Если указан полный путь к файлу, то поиск будет происходить только по этому пути. В противном случае порядок поиска следующий: текущий рабочий каталог, каталог, в котором находится исходник, каталог MPASM.

LIST – установить параметры листинга

Директива
разрешает вывод листинга, если он до этого был запрещен. Кроме того, один из параметров листинга может быть изменен для управления процессом ассемблирования в соответствии с табл. 6.5.

Табл. 6.5. Параметры, используемые директивой list.

ПараметрЗначение по умолчаниюОписание
C=nnn80Количество символов в строке
n=nnn59Количество строк на странице
t=ON|OFFOFFУкорачивать строки листинга
p=NoneУстановить тип процессора:
PIC16C54, PIC16C84, PIC16F84, PIC17C42 и др.
r=HEXУстановить систему счисления по умолчанию: hex, dec, oct.
w=Установить уровень сообщений диагностики в файле листинга:
0 – выводить все сообщения;
1 – выводить предупреждения и ошибки;
2 – выводить только ошибки.
x=ON|OFFOFFВключить или выключить макрорасширения.

NOLIST – выключить выход листинга

ORG – установить начальный адрес программы

Устанавливает начальный адрес программы для последующего кода в соответствии с адресом в . MPASM выводит перемещаемый объектный код, а MPLINK разместит код по определенному адресу. Если метка определена, то ей будет присвоена величина . По умолчанию начальный адрес имеет нулевое значение. Директива может не использоваться, если создается объектный модуль.

Читать еще:  Operand types do not match ассемблер

PROCESSOR – установить тип процессора

Устанавливает тип используемого процессора

:
[16C54 | 16C55 | 16C56 | 16C57 | 16C71 | 16C84 | 16F84 | 17C42]. Общие процессорные семейства могут быть выбраны как:[16C5X | 16CXX | 17CXX]

Для поддержания совместимости с новыми изделиями выбирается максимум доступной памяти.

SET – определить ассемблерную переменную

Директива SET функционально эквивалентна директиве EQU, за исключением того, что величина, определяемая SET, может быть изменена директивой SET.

TITLE – Определить программный заголовок

Эта директива устанавливает текст, который используется в верхней линии страницы листинга. — это печатная ASCII последовательность, заключенная в двойные скобки. Она может быть до 60 символов длиной.

Расширенный ассемблер: NASM

Глава 5: Директивы ассемблера

Хотя NASM и пытается избежать бюрократизм ассемблеров наподобие MASM и TASM, он вынужден поддерживать несколько директив. Все они описаны в этой главе.

Существует два типа директив NASM: пользовательские и примитивные. Обычно каждая директива имеет как пользовательскую, так и примитивную форму. В большинстве случаев рекомендуется использовать пользовательскую форму директив, которая реализована как макрос, вызывающий примитивные формы. Примитивные директивы заключаются в квадратные скобки; для пользовательских директив этого не требуется.

В дополнение к описанным в этой главе универсальным директивам каждый объектный формат может опционально предоставлять дополнительные директивы, служащие для управления особенностями этого формата. Такие дополнительные директивы описываются далее в главе, посвященной выходным форматам файлов (глава 6).

5.1 BITS : Указание разрядности выполняемого кода

Директива BITS указывает, код какой разрядности должен генерировать NASM: для процессора, работающего в 16-битном режиме, или для процессора в 32-битном режиме. Соответствующим синтаксисом будет BITS 16 или BITS 32 .

В большинстве случаев вам не потребуется использовать BITS явно. Объектные форматы aout, coff, elf и win32 , разработанные для 32-битных операционных систем, вынуждают NASM выбирать 32-битный режим по умолчанию. Объектный формат obj позволяет вам описывать каждый сегмент как USE16 или USE32 , поэтому NASM будет соответственно настраивать режим работы и здесь использование директивы BITS также не требуется.

Наиболее вероятным использование директивы BITS представляется при написании 32-битного плоского бинарного файла. (Выходной формат bin по умолчанию предназначен для 16-битного режима, т.к. он наиболее часто используется для написания DOS .COM программ, DOS .SYS драйверов устройств, а также загрузчиков).

Не нужно задавать BITS 32 для использования 32-битных инструкций в 16-битных DOS-программах; если вы это сделаете, ассемблер сгенерирует некорректный код, так как он получится 32-битным и на 16-битных платформах будет не работоспособен.

Когда NASM находится в состоянии BITS 16 , инструкции, использующие 32-битные данные, префиксируются байтом 0х66, а 32-битные адреса √ байтом 0х67. В состоянии BITS 32 справедливо обратное: 32-битные инструкции не нуждаются в префиксе, инструкции, использующие 16-битные данные, префиксируются байтом 0х66, а 16-битные адреса √ байтом 0х67.

Директива BITS имеет абсолютно эквивалентные примитивные формы: [BITS 16] и [BITS 32] . Пользовательская форма инструкции является макросом, который не делает ничего, кроме как вызывает соответствующую примитивную форму.

5.2 SECTION или SEGMENT : Описание и изменение секций

Директива SECTION ( SEGMENT — это абсолютно эквивалентный синоним) указывает, в какую секцию выходного файла будет ассемблирован код, который вы пишете. В некоторых объектных форматах количество и имена секций фиксированы; в других пользователь может сделать их столько, сколько захочет. Поэтому если вы захотите переключиться на секцию, которая в данный момент не существует, директива SECTION может либо вызвать сообщение об ошибке, либо создать новую секцию.

Объектные форматы Unix и bin поддерживают стандартизованные имена секций: .text — для кода, .data — для данных и .bss — для неинициализированных данных. Формат obj наоборот, не признает эти имена секций специальными и более того, удаляет ведущую точку в имени любой секции.

5.2.1 Макрос __SECT__

Директива SECTION необычна тем, что ее пользовательская форма функционально отличается от примитивной. Примитивная форма [SECTION xyz] просто переключает текущую секцию на указанную. Пользовательская форма SECTION xyz сначала определяет однострочный макрос __SECT__ для примитивной директивы [SECTION] , которую собирается выдать, и затем выдает ее. Таким образом, пользовательская директива

развернется в две строки:

Пользователи могут использовать это в своих собственных макросах. Например, макрос writefile , описанный в параграфе 4.2.3, может быть с успехом переписан в следующей, более изощренной форме:

Данная форма макроса, записывающего строку в файл, сначала временно переключается на секцию данных, используя при этом примитивную форму директивы SECTION , не модифицирующую __SECT__ . Далее в секции данных объявляется строка и затем вызывается __SECT__ , переключающий контекст на любую секцию, в которой пользователь работал до этого. Это исключает необходимость использования инструкции JMP (как в предыдущей версии макроса) для «перескакивания» данных, а также предотвращает возникновение ошибок в модуле OBJ формата, где пользователь потенциально может использовать различные секции кода.

Читать еще:  Основные единицы си таблица

5.3 ABSOLUTE : Определение абсолютных меток

О директиве ABSOLUTE можно думать как об альтернативной форме SECTION : она направляет последующий код не в физическую секцию, а в гипотетическую, начинающуюся с указанного абсолютного адреса. В данном режиме вы можете использовать только инструкции семейства RESB .

ABSOLUTE используется следующим образом:

В данном примере область данных PC BIOS описана как сегмент, начинающийся с адреса 0х1А: приведенный выше код определяет kbuf_chr по адресу 0x1A , kbuf_free по адресу 0x1C и kbuf по адресу 0x1E .

Пользовательская форма ABSOLUTE , так же, как и SECTION , переопределяет макрос __SECT__ в месте своего вызова. Директивы STRUC и ENDSTRUC определены как макросы, использующие директиву ABSOLUTE (и соответственно, __SECT__ ).

ABSOLUTE в качестве аргумента принимает не только абсолютные константы: это может быть выражение (на самом деле критическое выражение: см. параграф 3.7), а также какое-то значение в сегменте. Например, TSR может реутилизировать свой настроечный код в качестве run-time BSS следующим образом:

Здесь определяется несколько переменных «на верхушке» setup-кода, так что после завершения его работы это пространство может быть реутилизировано как хранилище данных для работающей TSR. Символ ‘ tsr_end ‘ может быть использован для расчета общего размера резидентной части TSR.

5.4 EXTERN : Импорт символов из других модулей

Директива EXTERN подобна директиве MASM EXTRN и ключевому слову extern в С: она используется для объявления символа, который определен в некотором другом модуле. Не все объектные форматы поддерживают внешние переменные: формат bin этого не может.

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

Некоторые объектные форматы обеспечивают дополнительные возможности директивы EXTERN . В любом случае, дополнительный синтаксис отделяется от имени символа двоеточием. Например, формат obj при помощи следующей директивы позволяет вам объявить, что базой сегмента внешних символов по умолчанию должна быть группа dgroup :

Примитивная форма EXTERN отличается от пользовательской тем, что одновременно может принять только один аргумент: поддержка списка аргументов реализуется на уровне препроцессора.

Вы можете объявить одну и ту же переменную как EXTERN более одного раза: NASM спокойно проигнорирует второе и последующие переопределения.

5.5 GLOBAL : Экспорт символов в другие модули

Директива GLOBAL — это обратная сторона EXTERN : если один модуль объявляет символ как EXTERN и ссылается на него, то для предотвращения ошибок компоновщика необходимо, чтобы некоторый другой модуль определил этот символ и объявил его как GLOBAL . Некоторые ассемблеры для этой цели используют директиву PUBLIC .

Директива GLOBAL , применяемая к символу, должна появляться перед определением этого символа. Она использует тот же самый синтаксис, что и EXTERN , за исключением того, что ссылается на символ, определяемый в этом же модуле. Например:

GLOBAL , как и EXTERN , позволяет вводить после двоеточия специфичный синтаксис объектных форматов. К примеру объектный формат elf позволяет вам указать, чем являются глобальные символы: функциями или данными:

Как и в случае EXTERN , примитивная форма GLOBAL отличается от пользовательской восприятием одновременно только одного аргумента.

5.6 COMMON : Определение общих данных

Директива COMMON используется для объявления общих переменных. Общая переменная — это глобальная переменная, объявленная в секции неинициализированных данных, поэтому

работает так же, как и

Отличие состоит в том, что если одна и та же переменная определена в разных модулях, во время связывания (сборки) эти переменные будут объединены и ссылки на intvar во всех модулях будут указывать на одно и то же место в памяти.

Директива COMMON , так же как GLOBAL и EXTERN , поддерживает специфичный синтаксис объектных форматов. Например, формат obj позволяет общим переменным быть близкими (near) или дальними (far), а формат elf — задать их выравнивание:

И наконец, примитивная форма COMMON , как и в случае EXTERN и GLOBAL , отличается от пользовательской тем, что одновременно принимает только один аргумент.

Ассемблер. Переменные и Константы

Обновл. 12 Окт 2019 |

NASM предоставляет различные директивы определения для резервирования места для хранения переменных. В ассемблере директива определения используется для выделения дискового пространства. Она может использоваться для резервирования или инициализации одного/нескольких байт.

Хранения инициализированных данных

Синтаксис стейтмента выделения памяти для инициализированных данных следующий:

Где имя_переменной является идентификатором для каждого пространства для хранения. Ассемблер связывает значение смещения для каждого имени переменной, определённого в сегменте данных.

Есть 5 основных форм директивы определения:

Директива Цель Пространство для хранения
DBОпределяет ByteВыделяет 1 байт
DWОпределяет WordВыделяет 2 байта
DDОпределяет DoublewordВыделяет 4 байта
DQОпределяет QuadwordВыделяет 8 байт
DTОпределяет 10 Byte-овВыделяет 10 байт
Читать еще:  Что такое дизассемблер

Ниже приведены примеры использования директив определения:

Обратите внимание, что:

каждый байт символа хранится как его ASCII-значение в шестнадцатеричном формате;

каждое десятичное значение автоматически конвертируется в 16-битный двоичный эквивалент и сохраняется в виде шестнадцатеричного числа;

процессор использует прямой порядок байтов;

отрицательные числа конвертируются в форму «two’s complement»;

короткие и длинные числа типа с плавающей запятой представлены с использованием 32 или 64 бит, соответственно.

Следующая программа показывает использование директивы определения:

Результат выполнения программы выше:

Хранение неинициализированных данных

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

Есть 5 основных форм директив резервирования:

Директива Цель
RESBРезервирует Byte
RESWРезервирует Word
RESDРезервирует Doubleword
RESQРезервирует Quadword
RESTРезервирует 10 Byte-ов

Несколько определений

Вы можете иметь несколько стейтментов определения данных в программе. Например:

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

Несколько инициализаций

Директива TIMES позволяет выполнить несколько инициализаций одного значения. Например, массив с именем marks длиной 9 может быть определён и инициализирован нулём следующим образом:

Директива TIMES полезна при определении массивов и таблиц. Следующая программа выводит на экран 9 звездочек:

АССЕМБЛЕР MPASM

Ассемблер MPASM представляет собой интегрированную программ­ную среду для разработки программных кодов PIC микроконтроллеров всех семейств. Выпускается фирмой Microchip в двух вариантах: для работы под DOS и для работы под Windows 95/98/NT. Ассемблер MPASM может использоваться как самостоятельно, так и в составе интегрированной среды разработки MPLAB. Он включает несколько программ: собственно MPASM, MPLINK и MPLIB, причем каждая из них обладает собствен­ным интерфейсом.

Программа MPASM может использоваться для двух целей:

— генерации исполняемого (абсолютного) кода, предназначенного для записи в МК с помощью программатора;

— генерации перемещаемого объектного кода, который затем будет свя­зан с другими ассемблированными или компилированными моду­лями.

Исполняемый код является для MPASM выходным кодом по умолча­нию. При этом все переменные источника должны быть явно описаны в тексте программы или в файле, подключаемом с помощью директивы INCLUDE . Если при ассемблировании не выявляется оши­бок, то генерируется выходной .hex-файл, который может быть загружен в МК с помощью программатора.

При использовании ассемблера MPASM в режиме генерации переме­щаемого объектного кода формируются объектные модули, которые мо­гут быть впоследствии объединены с другими модулями при помощи ком­поновщика MPLINK. Программа-компоновщик MPLINK преобразует перемещаемые объектные коды в исполняемый бинарный код, привязан­ный к абсолютным адресам МК. Библиотечная утилита MPLIB позволяет для удобства работы сгруппировать перемещаемые объекты в один файл или библиотеку. Эти библиотеки могут быть связаны компоновщиком MPLINK в файл выходного объектного кода ассемблера MPASM.

Программы MPASM и MPLINK доступны через оболочку MPASM, тог­да как MPLIB доступна только со своей командной строки.

Исходным файлом для ассемблера MPASM по умолчанию является файл с расширением .ASM. Текст исходного файла должен соответствовать требованиям синтаксиса, приведенным далее.

Исходный ассемблерный файл создается с использованием любого ASCII текстового редактора. Каждая линия исходного файла может со­держать до четырех типов информации:

Порядок и положение каждого типа имеет значение. Метка должна начинаться в колонке номер один. Мнемоника может начинаться в ко­лонке два или далее. Операнды идут за мнемоникой. Комментарий мо­жет следовать за операндом, мнемоникой или меткой или может начи­наться в любом столбце, если в качестве первого не пустого символа используется * или ;.

Максимальная длина строки 255 символов.

Один или несколько пробелов должны отделять метку и мнемонику или мнемонику и операнд(ы). Операнды могут отделяться запятой. Например:

List p=16C54, r=НЕХ

ORG 0x1FF ;Вектор сброса

GOTO START ;Возврат на начало

ORG 0x000 ;Адрес начала исполнения программы

MOVLW 0x0A ;выполнение программы PIC MK

GOTO START ;Выполнять всегда

МЕТКИ

В поле метки размещается символическое имя ячейки памяти, в кото­рой хранится отмеченный операнд. Все метки должны начинаться в ко­лонке 1. За ними может следовать двоеточие (:), пробел, табуляция или конец строки. Комментарий может также начинаться в колонке 1, если используется одно из обозначений комментария.

Метка может начинаться с символа или нижнего тире (_) и содержать буквенные символы, числа, нижние тире и знак вопроса. Длина метки мо­жет быть до 32 символов.

Дата добавления: 2014-12-19 ; просмотров: 12 | Нарушение авторских прав

Ссылка на основную публикацию
Adblock
detector
Читайте также:

  1. Ассемблер Использование подпрограмм. Стек/стэк. Работа с файлами.
  2. Ассемблер тілі
  3. Ассемблер. Лабораторная работа № 5
  4. Ассемблер. Регистры микропроцессоров 8086-80186. Сегментация памяти в DOS. Создание циклов.
  5. АССЕМБЛЕР. ЭТАПЫ РАЗРАБОТКИ ПРОГРАММЫ.
  6. Ассемблер: памятка программиста
  7. Двухпроходный Ассемблер — второй проход
  8. Директивы ассемблера
  9. Зачем нужен язык ассемблера?