02_Написание_ассемблерных_программ_Информ_материал_СПО_ч2 (1268618), страница 5
Текст из файла (страница 5)
Однако его значение можно изменить с помощью директивы ORG.Знак «$» возвращает текущее значение счетчика. Этот оператор позволяет использоватьСА в выражениях.Примеры:/* Пусть адрес метки Str равен 100, тогда длина строки составляет 10 символов, а адрес конца строки будет иметь значение 109.Символ конца строки (ограничитель) тогда будет иметь адрес 110.*/Str:StrLendbequ‘Это пример’, 0$ - Str – 1 ; длина строки = 111 - 100 - 1Можно также использовать символ «$» в инструкциях (везде, где допустимо выражение).sjmp & ; Программная «ловушка» (бесконечный цикл)cjnejca, #3, $+3LT→; ACC < 3↓; ACC >= 32.5.5.
Операторы (операции)Ассемблер A51 предоставляет несколько классов операторов, которые позволяют вамсравнивать и комбинировать (сочетать) операнды и выражения. Эти операторы представлены ниже в следующей таблице.Арифметические операторыАрифметические операторы выполняют такие функции как сложение, вычитание, умножение и деление. Эти операторы требуют один или два операнда в зависимости от операции (выполняемой функции). Результат всегда 16-битовое значение. Переполнение илизаем не обнаруживаются.
Деление на 0 обнаруживается и приводит к ассемблерной ошибке. В следующей таблице представлен список арифметических операторов и их краткоеописание.Пример:?DT?filesegment dataRSEG ?DT?fileX:DS 4 ; - размер 4-х байт…………………; программный сегментCLR AMOV X, A; по адресу АMOV X+1, A ; А – адрес следуей ячейкиMOV X+2, AMOV X+3, A20ОператорыОператор++*/MOD( )NOTSHRSHLANDORXORGTE>=LTE<=NE<>EQ=LT<GT>LOWHIGHСинтаксисОписаниеАрифметические операторы+ выражениеУнарный плюс- выражениеУнарный минусвыражение + выражениеСложениевыражение - выражениеВычитаниевыражение* выражениеУмножениевыражение / выражениеЦелочисленное делениевыражение MOD выражение Остаток(выражение)Устанавливают порядок выполнения операцийДвоичные операторыNOT выражениеПобитовая инверсиявыражение SHR число сдви- Логический сдвиг вправоговвыражение SHL число сдви- Логический сдвиг влевоговвыражение AND выражениеПобитовая операция «И»выражение OR выражениеПобитовая операция «ИЛИ»XOR выражениеПобитовая операция «ИСКЛЮЧАЮЩЕЕИЛИ»Операторы отношения (сравнения)выражение1 >= выражение2Истина, если выражение1 больше или равновыражение2; иначе – ложьвыражение1 <= выражение2Истина, если выражение1 меньше или равновыражение2; иначе – ложьвыражение1 <> выражение2Истина, если выражение1 не равно выражение2; иначе – ложьвыражение1 = выражение2Истина, если выражение1 равно выражение2; иначе – ложьвыражение1 < выражение2Истина, если выражение1 меньше выражение2; иначе – ложьвыражение1 > выражение2Истина, если выражение1 больше выражение2; иначе – ложьПрочие операторыLOW выражениеМладший байт выраженияHIGH выражениеСтарший байт выраженияДвоичные операции (операторы)Двоичные операторы используются для инверсии, сдвига и выполнения побитовых операций над двоичными значениями их операндов.
Следующая таблица содержит список двоичных операторов и их краткое описание.Операторы отношенияЭти операторы сравнивают два операнда. Результат сравнения – TRUE или FALSE. Результат FALSE имеет значение 0000h. TRUE-результат имеет ненулевое значение. Следующая таблица содержит список операторов сравнения и их краткое описание.21Прочие операторыЗдесь представлены операторы, не вошедшие в предшествующие категории.
Это операторы LOW и HIGH, возвращающие соответственно младший и старший байт выражения.Пример:X:DS 2X_0 EQU 1000; программный сегментMOV X, #HIGH X_0MOV X+1, #LOW X_0Приоритет операторовВсе операторы выполняются в точном, строго определенном порядке. Порядок вычислений (evaluation) имеет отношение к приоритету операторов. Последний требуется для того, чтобы определить какие операторы выполняются первыми в выражении. Ниже следующая таблица содержит список операторов в порядке их выполнения. Операторы первого уровня выполняются первыми.
Операторы с одинаковым приоритетом выполняютсяслева направо.Приоритет операторовУровень приоритета12345678Операторы()NOT, HIGH, LOW+ (унарный), - (унарный)*, /, MOD+, SHR, SHLAND, OR, XOR>=, GTE, <=, LTE, =, EQ, <>, NE, <, LT, >, GT2.5.6. ВыраженияВыражения — это комбинация операндов и операторов, которая может быть вычисленаассемблером. Операнд без операторов – простейшая форма выражения. Выражение можетбыть использовано во многих местах, где требуется операнд. Выражения имеют ряд атрибутов, описанных ниже.Классы выраженийКласс выражения назначается на основе используемых в них операндов.
Следующиеклассы применимы к выражениям:N NUMBER — класс выражения типа число number (безклассвое число);C ADDR — адрес имени в памяти типа CODE;D ADDR — адрес имени в памяти класса DATA;I ADDR — -//- IDATAX ADDR — -//- XDATAB ADDR — адрес имени в памяти типа BIT.Часто выражениям назначается класс NUMBER, т.к. они состоят только из числовых операндов, например MOV A, #3*2. При этом, значению символического адреса автоматически присваивается класс сегмента, где определен адрес.
Когда значение имеет класс используются следующие правила:1) результат унарный операции имеет тот же класс, что и операнд;222) результат всех бинарных операций за исключением сложения и вычитания будетиметь класс NUMBER;3) если только один из операндов операции сложения или вычитания имеет класс,то результат будет иметь тот же класс;4) если оба операнда имеют класс, то результат будет иметь класс NUMBER.Это означает, что значение с классом ± число дает значение с классом.Абсолютные выражения (константы) — всегда завершают свои вычисления до конца.Перемещаемые выраженияПеремещаемые выражения так называются потому, что они содержат ссылку на перемещаемое или внешнее символическое имя.
Выражения этих типов могут быть вычисленыассемблером только частично, т.к. ассемблер не знает конечного адреса перемещаемыхсегментов. Завершает вычисления линкер – редактор связей.Перемещаемое выражение обычно содержит только перемещаемое символическое имя,однако оно может также содержать и другие операнды и операторы. Перемещаемое символическое имя может быть модифицировано прибавлением или вычитанием константы.Имеется два базовых типа перемещаемых выражений: простые перемещаемые выражения и расширенные перемещаемые выражения.Простые перемещаемые выраженияПростые перемещаемые выражения содержат имена, которые определены в перемещаемом сегменте.
Это имена меток, подпрограмм, внешних ссылок. Но имена сегментов ивнешние имена не допустимы в простых перемещаемых выражениях.Простое перемещаемое выражение может быть использовано в 4-х контекстах (ситуациях):1) как операнд директивы ORG;2) как операнд в директивах назначения именам числовых значений (т.е. EQU, SET);3) как операнд в директиве инициализации кодовой памяти (DB, DW);4) как операнд машинной инструкции (команды).Примеры:REL1 + ABS1 * 10 ; здесь REL1 – переме аемое имя (метка), ABS1 –;REL2 ± ABS1константа, а «ABS1*10» – сложное выражение; здесь ABS1 – абсол тное выражениеREL1 + (REL2 – REL3) ; REL2 и REL3 – переме аемые имена в одном;сегменте; далее показаны неверные (недопустимые) приемы(REL1 + ABS1) * 10EXT1 - ABS1; здесь EXT1 – внешнее имяREL1 + REL2; REL1 и REL2 – два переме аемых выражения23Расширенные перемещаемые выраженияК этим выражениям в основном применимы те же правила, что и к простым перемещаемым выражениям.
Имена сегментов и внешние имена допустимы в расширенных перемещаемых выражениях. Расширенные перемещаемые выражения могут быть использованытолько в качестве операндов операторов, генерирующих код (как операнд машинной инструкции, и как операнд в директиве инициализации кодовой памяти DB и DW).Примеры:допустимыеREL1 + ABS*10EXT1 ± ABS1LOW(REL1+ABS1)WORD2 (SEG1)недопустимые(SEG1+ABS1)*10EXT1 - REL1LOW(REL1) + ABS1/* Вход в подпрограмму Subr и начало выполнения команды, име ейадреснатрипунктабольше,чемадресточкивходавподпрограмму, т.е.
по сути происходит «обход» или пропуск двухкоманд в начале подпрограммы */MOV SP, #STACK-1 ; здесь STACK – имя сегментаLCALL Subr + 3 ; здесь Subr – имя внешней подпрограммы2.6. Директивы ассемблера A51 фирмы KEIL2.6.1. Управление сегментированием памятиСегмент — блок программной памяти или памяти данных, которую создает ассемблер изкода или данных исходного (ассемблерного) файла. Семейство микроконтроллеров семейства 8051 имеет несколько специфических областей (пространств) памяти. Выиспользуете сегменты для размещения программного кода, констант и переменных в этихобластях.Счетчик адресаA51 для каждого сегмента обслуживает счетчик адреса (СА). Последний есть указатель вадресном пространстве активного сегмента.
Он представляет смещение дляперемещаемых сегментов или действительный адрес для абсолютных сегментов. Припервой активизации сегмента счетчик адреса устанавливается в 0. После каждойинструкции (команды) СА изменяется на число байтов, соответствующее инструкции.Директивы инициализации и резервирования памяти также изменяют значение СА.Директива ORG устанавливает новое значение СА. Если вы изменили активный сегменти позже вернулись к этому сегменту, СА восстановит свое предыдущее значение. Каждыйраз, когда ассемблер встречает метку, он назначает метке текущее значение СА и типтекущего сегмента. Знак $ указывает значение СА в активном сегменте.
Нижеописываются различные типы сегментов.Перемещаемые сегментыПеремещаемые сегменты имеют имя, класс и другие атрибуты. Перемещаемые сегменты содинаковым именем, но из разных объектных модулей, рассматриваются как части одногои того же сегмента и называются частичными (неполными) сегментами. Эти сегментыобъединяются во время компоновки редактором связей. Перемещаемые сегментысоздаются директивой SEGMENT. После определения имени перемещаемого сегмента,вы можете выбрать сегмент, используя директиву RSEG. Выбранный сегмент становится24активным и остается таковым, пока сегмент не будет изменен очередной директивойRSEG или директивой определения абсолютного сегмента.Обычно ассемблерные подпрограммы помещают в перемещаемые сегменты.