02_Написание_ассемблерных_программ_Информ_материал_СПО_ч2 (1268618), страница 7
Текст из файла (страница 7)
Директива PUBLIC имеет следующий формат:PUBLICsymbol, symbol ...где symbol — символическое имя, определенное где-либо в исходном файле, исключаяимена регистров и сегментов. Допускаются ссылки вперед.29EXTRNЭта директива указывает список символов, которые объявлены в других модулях. Директива EXTRN имеет следующий формат:EXTRN class (symbol, symbol ...), class (symbol, symbol ...),...гдеclass — класс памяти, где был определен символ; класс может принимать одно из значений: BIT, CODE, DATA, IDATA, XDATA или NUMBER (специфицирует символ безкласса);symbol — внешнее символическое имя.Редактор связей во время компоновки определяет значения всех внешних символов и проверяет соответствие их классов (заданных директивой EXTRN и PUBLIC).
Символы склассом NUMBER соответствуют любому классу памяти.NAMEДиректива NAME задает имя объектного модуля. Имя объектного файла может не совпадать с именем объектного модуля, имя которого встраивается в объектный файл. Поумолчанию, когда директива NAME не присутствует в исходном файле, имя модуля будетсовпадать с именем исходного файла без расширения. В исходном файле директиваNAME может быть указана только один раз. Формат директивы следующий:NAMEmodulenameгде modulename — имя объектного модуля, которое может содержать до 40 символов.2.6.7.
Директивы управления адресомСледующие директивы предоставляют управление счетчиком адреса или абсолютнымиименами регистров банка.ORGДиректива ORG используется для изменения значения счетчика адреса активного сегмента (устанавливает новый начальный адрес для последующих операторов). Формат директивы следующий:ORG expressionгде expression – абсолютное или простое перемещаемое выражение без ссылок вперед.Допускается использовать только абсолютные адреса или символические значения текущего сегмента.Когда встретится эта директива, ассемблер вычислит значение выражения и изменитсчетчик адреса (СА) текущего сегмента. Если директива ORG находится в абсолютномсегменте, СА присваивается значение абсолютного адреса.
Если директива ORG находится в перемещаемом сегменте, СА присваивается смещение, заданное выражением.Замечание. Рассматриваемый ассемблер является многопроходным. При первом проходе собираются символы, и определяется длина каждой инструкции. Во втором проходе определяются значения ссылок вперед,и производится объектный код. Поэтому выражение, используемое в директиве ORG, не может содержатьссылок вперед.USINGДиректива USING указывает регистровый банк, который будет использован при кодировании регистров AR0AR7, но не переключает его. Формат директивы следующий:30USINGexpressionгде expression — номер регистрового банка в диапазоне 03.Эта директива не генерирует какой-либо код, изменяющий номер регистрового банка. Регистровый банк, выбранный директивой USING, отмечается в объектном файле. В результате компоновщиком (редактором связей) резервируется память, требуемая этим регистровым банком.Значение AR0AR7 вычисляется как абсолютный адрес R0R7 в регистровом банке, указанном директивой USING.
Некоторые инструкции 8051 (например, PUSH/POP) допускают использование только абсолютных адресов регистров. По умолчанию регистровыйбанк 0 назначен символам AR0AR7.Примеры:USING 1PUSH AR0 ; для этих имен банк №12.6.8. Прочие директивыENDДиректива END оповещает о конце ассемблерного модуля. Любой текст в ассемблерномфайле, оказавшийся после директивы END, игнорируется. Эта директива требуется в каждом ассемблерном файле; в противном случае будет генерироваться предупреждение.__ERROR__Директива __ERROR__ генерирует стандартные сообщения об ошибках, которые составляются в том же стиле, что и обычные ошибки ассемблера.
Директива имеет следующийформат:__ERROR__textгде text — сообщение об ошибке (в двойных кавычках), которое должно отражаться влистинговом файле. Этот же текст выводится на дисплей, если использована управляющая директива ERRORPRINT.2.7. МАКРОКОМАНДЫ АССЕМБЛЕРАМакрокоманда (макрос) — имя, назначаемое вами одному или нескольким ассемблернымоператорам. Для наибольшей гибкости макроассемблер предоставляет три различныхмакроязыка: Стандартные ассемблерные макросы. Си-макросы. MPL-макросы.При определении макроса вы составляете текст, который хотите ассоциировать с именеммакроса. Затем, когда вы хотите включить макротекст в свою ассемблерную программу,вы подставляете имя макроса. Ассемблер заместит имя макроса текстом, заданном в макроопределении.При записи ассемблерных программ макросы дают несколько преимуществ: возможность ввести удобное обозначение для группы команд, что уменьшает тексти улучшает читабельность;31 частое использование макросов может уменьшить количество ошибок, сделанныхпрограммистом; область видимости имен, используемых в макросе, ограничена этим макросом; макросы хорошо подходят для создания простых кодовых таблиц.Недостатком использования макросов при написании программы является то, что в лучшем случае они увеличивают память программ.2.7.1.
Директивы определения стандартных макросовНиже в таблице представлены директивы, предназначенные для определения макросов.ДирективаENDMEXITMIRPIRPCREPTLOCALMACROОписаниеЗавершает макроопределениеВызывает немедленное завершение макрорасширенияПовторяет блок операторов для каждого аргумента заданного спискаПовторяет блок операторов для каждого символа заданного аргументаПовторяет блок операторов заданное число разСпецифицирует до 16 локальных символов макросаНачинает макроопределение2.7.2. Определение макросаЧтобы можно было использовать макрос в программе, он предварительно должен бытьопределен. Макроопределение начинается с директивы MACRO, которая объявляет имямакроса и, возможно, до 16 формальных (необязательных) параметров.
При определениии вызове макроса параметры должны разделяться запятой. Если при вызове макроса необходимо пропустить какой-либо параметр, то разделительная запятая ставится без пробела;пропущенному параметру присваивается значение NULL. Завершается макроопределениедирективой ENDM. Текст между директивами MACRO и ENDM называется макротелом.Директива EXITM может использоваться для немедленного завершения макрорасширения. Обычно эта директива используется совместно с операторами условного ассемблирования. Ниже приведен общий пример обозначения макроса и последующего его вызова:Имя_макрокоманды MACRO [список формальных параметров]ТЕЛО МАКРОСАсодержание, текст макроса (чтоконкретно надо будет замещать)ENDM — завершение макроопределенияИмя_макрокоманды [список реальных параметров]; вызов макросаПример:Обозначение макросаSUB_8 MACRO X, YCLR CВызов макроса; R7 := R7 – R6SUB_8 R7,R6MOV A, XSUBB A, YMOV X, AENDMМетки, используемые в макросе, должны быть локальными.
Эти метки видны тольковнутри макроса. Вы можете определить до 16 локальных меток (или любых символов) спомощью директивы LOCAL. Ассемблер генерирует внутреннее символическое имя для32локальных символов, определенных в макросе. Внутренний символ имеет форму ??0000 иинкрементируется каждый раз при вызове макроса. Поэтому при повторных вызовах макроса ошибки не будут генерироваться, т.к.
локальные метки макроса являются уникальными.2.7.3. Повторение блоковАссемблер предоставляет возможность повторять определенный блок текста внутри макроса. Директивы: REPT, IRP, IRPC — используются для указания текста, повторяемоговнутри макроса. Каждая из этих директив должна завершаться директивой ENDM.REPTЭта директива повторяет блок текста заданное число раз.
Далее представлен обобщенныйплан формирования повторяющегося участка кода:REPT число_повторенийТЕКСТ— повторяющийся текстENDMПример. Следующий макрос после вызова вставляет 5 инструкций NOP:DELAY MACROREPT 5NOPENDMENDMIRPПовторяет блок один раз для каждого аргумента заданного списка. Специфицируемыйпараметр в теле макроса замещается каждым аргументом.Пример. Следующий макрос замещает аргумент RNUM регистрами R0, R1, ... :CLRREGSMACROIRP RNUM, <R0, R1, R2, R3, R4, R5, R6, R7>MOV RNUM, #0ENDMENDMIRPCЭта директива повторяет блок один раз для каждого символа заданного аргумента.