02_Написание_ассемблерных_программ_Информ_материал_СПО_ч2 (1268618), страница 3
Текст из файла (страница 3)
Нельзя применить R0, R1, … . Но, используя директиву «USING Банк» и зарезервированные имена AR0 и т.д., можно записать:PUSH AR0…POP AR0Пример:USING 1 — использовать 1-ый банк;PUSH AR0 — взять 8-ую ячейку и поместить ее содержимое в стек.XCH — обмен даннымиXCH A, Rn — обмен содержимым регистра;XCH A, direct — -//- прямая адресацияXCH A, @Ri — -//- косвенная адресацияПример:XCHD A, @RiAA@RiR72.4.2.
Команды арифметических операцийКоманды сложения (вычитания): ADD A, SRC_BYTE ; A ≔ A + SRC_BYTEADDC A, SRC_BYTE ; A ≔ A + SRC_BYTE + C — сложение с переносом (если он есть,то добавится «1», если нет, то «0»)SUBB A, SRC_BYTE ; A ≔ A - SRC_BYTE - C, где С — заём (вычитание всегда с заёмом)Особенность этих команд – одним из операндов и операндом назначения является аккумулятор. При этом второй операнд допускает все виды адресации, используемые в семействе MCS-51 для внутренней памяти данных.9Чтобы зафиксировать переполнение в беззнаковых числах, после последнего сложениянадо тестировать бит CY. Для знаковых чисел требуется использовать бит OV. Если перенос из 7-го бита, CY = 1, иначе CY = 0.
Когда имеется только один перенос из 6-го или из7-го бита, флаг OV = 1; в других случаях OV = 0.Пример. Многобайтное сложение:R6R7R4R5MOV A, R7ADD A, R5 ; сложение младших байтовMOV R7, AMOV A, R6ADDC A, R4 ; сложение старших байт (с переносом)MOV R6, AЗаметим, что команда вычитания только с заемом. Как сделать вычитание без заема?Пример. Вычитание без заёма [C = 0]:CLR CSUBB A, R7Инкременты/декременты (простейшие арифметические операторы): INC/DECДопускаются прямая и неявная адресации.Регистр DPTR можно только инкрементировать.Пример:ADD A, #1 ; здесь бит переноса вырабатываетсяINC A ; а здесь нетINC DPTRУмножение/деление: MUL/DIVОперанды (целочисленные) должны располагаться в регистрах A и B, а результат окажется там же, причем в В – старший байт, в А – младший.
При этих командах бит переноса Свсегда сбрасывается в ноль. MUL – беззнаковое умножение. Если произведение > 255, тоOV = 1, иначе OV = 0, а CY = 0. DIV – беззнаковое деление. Изначально CY = OV = 0.Результат деления получается дробным — целая часть в А, остаток в В. Если B = 0, то получается неопределенный результат, т.е.
A и B не определены (OV = 1). Это самые длительные команды (4 машинных цикла).Десятичная коррекция аккумулятора: DA AКорректирует BCD-упакованный (двоично-десятичными) код после двоичного сложения.Если младшая тетрада аккумулятора больше 9 или AC = 1, то ACC := ACC + 6 – будетскорректирована младшая тетрада. Если после этого CY = 1 или старшая тетрада больше9, то прибавляется 6 к старшей тетраде. Это опять приводит к выработке значения CY10(если CY = 1, то сумма больше 100).
Таким образом, в зависимости от условий к ACCможет прибавляться 00H, 06H, 60H, 66H.Примечание: Команда DA A правильно работает только после команд сложения.2.4.3. Команды логических операцийЛогическое «И», «ИЛИ», «ИСКЛЮЧАЮЩЕЕ ИЛИ»: ANL/ORL/XRLОбобщенная мнемоника «И»: ANL dest_byte, src_byte ; dest_byte := dest_byte ^ src_byteВ большинстве вариантов команды одним из операндов и операндом назначения являетсяаккумулятор. Хотя такую же роль может исполнять прямоадресуемая ячейка памяти илиРСФ.
Эта команда эффективна, когда требуется выполнить операцию «И» над группойбитов байта. Часто она используется для избирательного сброса битов в байте. «Наложитьмаску» — логическая операция с константой.0 0 0 0сброс в нольПример: ANL A,#0FHANL P1,#03H0 0 0 0Обобщенная мнемоника «ИЛИ»:Х Х Х Хостанутся без измененийР1Х Х Х ХORL dest_byte, src_byte ; dest_byte := dest_byte src_byteВарианты операндов те же.
Эта команда эффективна, когда требуется выполнить операцию «ИЛИ» над группой битов байта. Часто она используется для избирательной установки битов в байте.Пример: ORL A,#0FH ; установка в «1»ORL P1,#0C0HОбобщенная мнемоника «ИСКЛЮЧАЮЩЕГО ИЛИ»:Х Х Х Х1 1 1 1Х Х Х ХХХ1 1XRL dest_byte, src_byte ; dest_byte := dest_byte src_byteВарианты операндов те же. Эта команда эффективна, когда требуется выполнить операцию «ИСКЛЮЧАЮЩЕЕ ИЛИ» над группой битов байта.
Часто она используется для избирательной инверсии битов в байте.АПример: XRL A,#0FHXRL P1,#0C1HХ Х Х ХХ Х Х ХинверсияХ Х Х ХХ Х Х ХОчистка и инверсия аккумулятора: CLR/CPLПример:XRL A, ACC ; A := 0MOV A, #0CLR A ; A := 0CPL ; A :=— инверсия аккумулятораТ.к. аккумулятор является центральным программным объектом, то для него зарезервированы две короткие команды, которые реализуют часто используемые с ним операции:очистка и инверсия. Выполняются только с аккумулятором.Циклические сдвиги: RL/RLC/RR/RRC11Рис.
2.2. Схемы циклических сдвиговRL — сдвиг влево (в сторону ст. разряда), RR — сдвиг вправо (в сторону мл. разряда),RLC и RRC — сдвиги с переносом. С помощью этих команд можно реализовывать разные типы сдвигов разных целочисленных переменных любой разрядности.Типы сдвигов: циклический, логический, арифметический.Логический сдвиг: влево — происходит сдвиг всех разрядов влево, но при этом старшийразряд теряется; вправо — аналогично, но сдвиг происходит вправо и теряется младшийразряд.Арифметический сдвиг: влево — совпадает с логическим сдвигом влево; вправо — аналогично, но сдвиг вправо, но переполнения не будет, а знак сохраняется.Пример:1 000 1001 →1 1 0 0 0 1 0 0 _ арифметический сдвиглогический сдвиг01000100Пример. Логический сдвиг на один разряд влево 16-разрядной величины (R6СТ-R7МЛ):XCHCLRRLCXCHA,R7 ; обмен содержимымC ; сброс бита переносаA ; сдвиг влево младшего байтаA,R7; сдвиг влевонельзя)XCH A,R6RLC AXCH A,R6старшегобайта(здесьбитпереносасбрасыватьКоманда SWAP A (обмен содержимого аккумулятора) используется при манипуляции сдвоично-десятичными числами, а также может рассматриваться как циклический сдвигбез переноса влево или вправо на четыре разряда.7430122.4.4.
Команды передачи управления. Подпрограммы и способы передачи параметровК этой группе команд относятся команды вызова подпрограмм и возврата из подпрограмм, команды условного и безусловного ветвления, а также команда пустой операцииNOP.Вызов подпрограмм и возврат из подпрограмм: LCALL/ACALL/RET/RETIПодпрограмма — это поименованная часть программы, которая вызывается, выполняетопределенные действия и возвращает управление в точку вызова.
Вызовы подпрограмммогут быть вложенными, т.е. одна подпрограмма может вызывать другую подпрограмму,а та, в свою очередь, еще другую. При этом, количество возможных вложенных подпрограмм определяется размером стека.NameSubr:(метка)телоподпрограммы………………RETВ команде вызова подпрограммы LCALL Subr (длинный вызов) содержится полный 16разрядный адрес подпрограммы. При выполнении этой команды PC := PC+3 – содержимое счетчика команд PC увеличивается на три и соответствует адресу следующей заLCALL команды (адресу возврата).
После сохранения PC в стеке ему присваивается значение Subr. Тем самым осуществляется переход на начало вызываемой подпрограммы.Выход из подпрограммы (завершение подпрограммы) должен выполняться с помощьюкоманды RET, которая извлекает из стека адрес возврата и загружает его в PC. В результате осуществляется переход к следующей за LCALL команде или, как говорят, в «точкувозврата». Представленный ниже рисунок иллюстрирует выполнение команды LCALL.Рис.
2.3. Схема выполнения подпрограммы Subr путем ее вызова командой LCALL и последующего возврата в основной цикл программы командой RETКоманда ACALL отличается от LCALL только разрядностью адреса и числом байтов, которых два. В команде ACALL адрес 11-разрядный; старшие три бита расположены в трехмладших битах первого байта (КОП) команды.
Поэтому есть ограничение на размещениекода подпрограммы и вызывающей ее команды ACALL: они должны находиться в однойстранице памяти размером 2048 байтов, что иллюстрирует рисунок, и внутри одного модуля файла.13Рис. 2.4. Схема выполнения подпрограммы Subr путем ее вызова командой ACALLДопустимо применять обобщенный вызов подпрограммы путем выполнения командыCALL. В этом случае происходит автоматический выбор команды ACALL или LCALL.Команда RETI должна завершать подпрограммы обработки прерываний. Дополнительнок действиям команды RET эта команда восстанавливает логику прерываний.
КомандаRETI разрешает прерывания того же уровня приоритета, что и приоритет обработанногопрерывания.Способы передачи параметров подпрограмм:1) через регистры общего назначения R0-R7, DPTR, A, B — это самый быстрый способпередачи параметров и наиболее распространенный, при этом через регистр можно передавать как значение, так и адрес.2) через заданную область памяти.