02_Написание_ассемблерных_программ_Информ_материал_СПО_ч2 (1268618), страница 4
Текст из файла (страница 4)
В этом случае параметры должны быть сформированыв памяти вызывающей подпрограммой, базовый адрес должен быть определен вызывающей подпрограммой. Если используется общая область памяти, то теряется возможностьповторного входа в подпрограмму. Недостатком данного способа является большой расход памяти и низкое быстродействие.BaseAddr:заданная здесь предварительноформиру тсяобластьпамяти вызыва ие параметрыMOV DPTR, #BaseAddr ; передать базовый адресLCALL Subr ; вызов3) через программную память непосредственно. Для данного случая все параметры должны быть неизменяемыми, т.к. все программы располагаются в ПЗУ. Базовый адрес параметров находится на вершине стека после вызова подпрограммы стандартным способом.LCALL SubrDB Param1, Param2, ………………………….; далее выход из подпрограммыSubr:загрузка в14CLR AMOVC A, @A+DPTR ; считан Param1……………………………………….CLR AINC A ; не забывать увеличивать DPTR на 1MOVC A, @A+DPTR……………………………………………выход изподпрограммы4) через стек.загрузкав стек……………………….LCALL SubrSubr:MOV R0, SP ;DEC R0DEC R0MOV A, @R0 ; A := Param2……………………………..MOV R1, SPDEC R1MOV A, @R1MOV @R0, A ; в стек поместился по требуемому адресу младшийбайт возвратаINC R0INC R1MOV A, @R1MOV @R0, AMOV SP, R0 ; очистка стека — правильно провести указательстека в исходное состояниеRET ; выход из подпрограммыГлавными недостатками данного способа являются его неэффективность и длительностьвыполнения процедур входа в подпрограмму и выхода из нее.
Наиболее приемлемыми длямикроконтроллеров 51-ого семейства являются два первых способа передачи параметровподпрограмм.15Безусловные переходы: LJMP/AJMP/SJMPВ команде LJMP Addr16 содержится полный 16-разрядный адрес перехода. При выполнении этой команды PC := Addr16, что приводит к переходу по указанному адресу, приэтом возможен переход на внешние адреса. В команде AJMP адрес 11-разрядный, как вкоманде ACALL. Поэтому сама команда AJMP и адрес (метка), на который она ссылается, должны находиться в одной странице памяти размером 2048 байтов (одном модуле).В коротком переходе SJMP rel (2 байта) адрес перехода указывается смещением относительно адреса команды, следующей за команSJMP M1 -128дой SJMP, при этом подпрограмма может на- PCходиться в разных модулях.
Смещение пред- PC+2 Следующая команда +127ставляется вторым байтом команды в дополнительном коде (знаковое целое). Этот переход позволяет передать управление в пределах 128 +127 байт относительно адреса следующей команды. На языке ассемблера Вы пишете обычную символическую метку, а программа-ассемблер вычислит необходимоесмещение при переводе этой команды в двоичный код. Можно поручить ассемблеру выбирать оптимальную (наиболее короткую) команду безусловного перехода, если воспользоваться обобщенной мнемоникой JMP.↓SJMP M1Косвенный переход: JMP @A+DPTRПосле выполнения этой команды ни аккумулятор, ни DPTR, ни флаги не изменяют своегозначения.
Эта команда позволяет организовать переход по адресу, вычисляемому в процессе выполнения программы (т.е. который указывает сумма). Обычно она применяетсядля реализации ветвления программы из одной точки по нескольким направлениям.Пример. Реализация оператора выбора:TBL_JMP:MOVADDJMPDPTR,#TBL_JMPA,ACC@A+DPTRAJMPAJMPAJMP..AJMPLB0LB1LB2; ACC содержит целочисленну; в диапазоне от 0 до -127переменнуLBnУсловные переходы: JZ/JNZ/CJNE/DJNZВо всех этих командах используется только короткий относительный переход.
КомандыJZ и JNZ тестируют текущее содержимое аккумулятора соответственно на равенство инеравенство нулю. Если тестируемое условие истинно, управление передается на метку,указанную в команде; иначе – на следующую команду.Команды сравнения имеют следующую обобщенную запись: CJNE Op1, Op2, rel. Привыполнении этой команды сравниваются два операнда Op1 и Op2. Если они не равны,управление передается по адресу, которому соответствует смещение rel; иначе – на следующую команду.
Эта команда воздействует на бит переноса CY: если Op1 < Op2,CY = 1; иначе (Op1 >= Op2) CY = 0. Это позволяет использовать данные команды длясравнения чисел (как однобайтовых, так и многобайтовых), т.е. можно реализовать операции: «=», «», «>», «<», «>=», «<=».16Пример. Сравнение A < B:CJNEJCA, B, $+3; $ - теку ее значение PC, $+3 – адресA_LT_B; следу ей команды; A < B, то переход по ссылке; A >= BКоманда вида DJNZ Cnt_Byte, rel уменьшает на 1 операнд Cnt_Byte, а затем проверяетего на 0: если значение Cnt_Byte не равно нулю, управление передается на метку; иначе –на следующую команду (как выход из цикла, см. далее).
Команды этого вида удобны дляреализации циклов по следующей схеме:Cnt_Byte := C0; Инициализация счетчика циклаLoop: Тело циклаDJNZ Cnt_Byte,Loop; Модификация счетчика цикла и проверка его на ноль; Если требуется организовать 256 циклов, то загружать в счетчик надо 0Пустая операция: NOPЭта команда ни на что не влияет. Применяется обычно для организации небольших задержек.2.4.5. Команды битового процессораВ рассматриваемой группе команд операнды однобитовые, допускающие только прямуюадресацию. В качестве таких операндов могут выступать битовые переменные (определенные в сегменте типа BIT) и биты битадресуемых РСФ.
Бит переноса CY играет рольаккумулятора для бинарных битовых операций. Поскольку CY занимает центральное место, то для него предусмотрены отдельные эффективные команды, выполняющие частовстречающиеся операции с его значением.Сброс, установка и инверсия битов: CLR/SETB/CPLПредусмотрены отдельные команды для сброса (CLR C), установки (SETB C) и инверсии(CPL C) бита переноса.
Отличительная их особенность – размер один байт и время выполнения один машинный цикл. Такие же действия можно выполнить с любым адресуемым битом: CLR bit (сброс бита), SETB bit (установка бита), CPL bit (инверсия бита).Эти команды выполняются за один машинный цикл, но занимают в памяти 2 байта; второй байт требуется для указания адреса бита. Бит EA — разрешает/запрещает прерывания.Способы записи битов на ассемблере:CLR bitимя переменной (битовой) в сегменте класса BITимя бита битадресуемого РСФACC.имя_битаимя_РСФ.имя_битаБитовые операции «И», «ИЛИ»: ANL/ORLимя_бита_РСФЗдесь одним из операндов и операндом назначения по умолчанию является бит переносаCY. Имеется две формы записи этих команд, отличающиеся наличием правой косой чер17ты перед вторым битовым операндом. Эта черта означает, что в операции будет участвовать инверсное значение бита.
Команды этого типа занимают в памяти 2 байта и выполняются за 2 машинных цикла.Пример:SETB C; установка переноса в «1»SETB bitCPL C; C :=CPL bit; bit :=ANL C, bit; C := C ^ bitANL C, /bit; C := C ^ORL; - «ИЛИ»-//-- «И»- «И»Пересылка битов : MOVПересылки выполняются только через бит переноса CY. Команда MOV C, bit копируетзначение bit в бит переноса, команда MOV bit, C выполняет обратное копирование. Дляреализации пересылки между двумя произвольными битами (bit1 := bit2) требуется последовательное выполнение этих двух команд:MOVMOVC, bit1bit2, CУсловные переходы (тестирование битов): JC/JNC/JB/JNB/JBCЭти команды позволяют осуществлять ветвление по следующим условиям: перенос равен«1» (JC), тогда переход на метку; перенос равен нулю (JNC), то переход на метку; адресуемый бит равен «1» (JB/JBC), то переход на метку; адресуемый бит равен нулю (JNB),то переход на метку.
Здесь тоже используется только короткий относительный способ адресации перехода при выполнении условия, тестируемого в команде. Если условие не выполняется, управление, как всегда, передается следующей команде.Особый интерес представляет команда JBC, которая проверяет указанный бит на «1». Если бит равен «1»,он сбрасывается, а управление передается на метку, указанную в команде.
Эта команда может быть полезна,когда требуется не разрывать тестирование бита и его сброс в случае равенства бита «1». Такая ситуациявстречается в коммуникационных процедурах.2.5. Выражения и операторы (вычисления во время трансляции)Операнд может быть:числовой константой,символическим именем,строкой,выражением.Операторы (операции) используются для комбинирования (сочетания, объединения, соединения) и сравнения операндов.
Операторы не являются инструкциями (командами)языка ассемблера и не генерируют код. Операторы представляют действия (числовыеоперации), которые выполняются во время ассемблирования.Выражение — это комбинация чисел, строк, имен и операторов, которое, в конце концов, выражается (приводится) для A51 как 16-битовое число (может быть знаковое). Т.к.18выражения вычисляются во время ассемблирования, то они могут использоваться длявычисления значений, которые иначе заранее трудно определить.Пример: MOV A, #3+5 ; простейшее выражение – число2.5.1. Целые числаЧисла могут быть представлены в шестнадцатиричной, десятичной, восьмеричной и двоичной системах счисления. Основание системы счисления указывает последний символ(суффикс) числа. По умолчанию предполагается десятичная система счисления.
Следующая таблица содержит базовые типы, их суффиксы и некоторые примеры.Основание системысчисленияШестнадцатеричнаяДесятичнаяВосьмиричнаяДвоичнаяСуффиксДопустимые символыПримерыH, hD, dO, o, Q, qB, b0 – 9, A – F, a – f0–90–70, 112H, 0FFH, 0Fh12, 12D, 99, 10017Q, 123Q10011100BПервым символом числа должна быть цифра 0–9. Когда шестнадцатеричное число начинается с буквы, то оно должно иметь приставку 0. Ассемблер Ax51 поддерживает такжезапись HEX-чисел в стиле языка Си, например 0х123.Знак «$» может быть использован в числах для улучшения читаемости. Но этот знак неможет быть первым или последним символом в записи числа. Этот знак игнорируется ассемблером и не влияет на значение числа. Например:2.5.2.
СимволыАссемблер Ax51 дает вам возможность использовать ASCII-символы в выражениях, чтобы генерировать числовое значение. До 2-х символов, заключенных в апострофы (одиночные кавычки), можно использовать в выражениях. Например:Символ Числовое соответствие (представление)Использование в программеMOV a, ’A’ ; ACC := 41h‘A’0041hMOV a, ’9’ ; ACC := 39h‘AB’4142hCLR C‘a’0061hSUBB A, ’0’ ; ACC := 9‘’0‘abcd’ОшибкаСимволы могут использоваться в программе как операнд непосредственных данных.2.5.3.
Символьные строкиСимвольные строки обычно используются в комбинации (вместе) с директивой DB дляопределения сообщений (константных), используемых в программе. Символьная строка— это последовательность символов, заключенная в апострофы. В директиве DB строкимогут смешиваться с числами.Например:Mes:Mes:DB ‘Error’DB ‘Error’, 0; Error: 45h,72h,72h,6fh,72h; Строка в стиле СиЕсли требуется записать в строке символ апострофа, то последний удваивается.192.5.4. Счетчик адресов (Location Counter)Ассемблер обслуживает свою внутреннюю переменную СА (счетчик адреса) для каждогосегмента. СА содержит смещение (адрес) инструкции или данных и увеличивается послекаждой строки на число байтов данных или кода в этой строке. СА инициализируется 0для каждого сегмента.