Пример 1. Сложить содержимое регистра R7 и ячейки памяти данных с адресом 30Н:
MOV R0, #30H ; ЗАГРУЗКА В R0 АДРЕСА ПАМЯТЬ
MOV A, R7 ; ЗАГРУЗКА ОПЕРАНДА В АККУМУЛЯТОР
ADD A, @R0 ; СЛ0ЖЕНИЕ
Результат операции сложения фиксируется в аккумуляторе, установка флага переноса будет свидетельствовать о переполнении.
Пример 2. Сложить десятичные двоично-кодированные числа (BCD-числа), расположенные в А и R7:
ADD A, R7 ; ДВОИЧНОЕ СЛОЖЕНИЕ
DА A ; КОРРЕКЦИЯ РЕЗУЛЬТАТА
Пример 3. Инкрементировать содержимое ячеек памяти данных по адресам 10-18:
INCR: MOV R0, #10; ЗАГРУЗКА В R0 НАЧАЛЬНОГО АДРЕСА
MOV R3, #09h; ЗАГРУЗКА В R3 ЧИСЛА ЯЧЕЕК
LOOP: INC @R0 ; ИНКРЕМЕНТ ЯЧЕЙКИ ПАМЯТИ ДАННЫХ
INC R0 ; ПР0ДВИжЕНИЕ УКАЗАТЕЛЯ АДРЕСА
DJNZ R3, LOOP; ИНКРЕМЕНТ R3 И ПОВТОР, ПОКА R3 НЕ РАВНО НУЛЮ
Пример 4. Сложить многобайтные BCD-числа, расположенные в памяти данных. Регистры R0 и R1 указывают начальные адреса слагаемых. Слагаемые расположены в памяти данных, начиная с младших байтов. Формат слагаемых одинаков и задается в R2 числом байтов. Результат сложения поместить на место первого слагаемого:
|
|
; СУММИРОВАНИЕ Z=W+Y
; (R0) - НАЧАЛЬНЫЙ АДРЕС W
; (R1) - НАЧАЛЬНЫЙ АДРЕС Y
; (R2) - ДЛИНА СЛАГАЕМЫХ W И Y
CLR C ; СБРОС ФЛАГА ПЕРЕНОСА
LOOP: MOV A, @R0; ЗАГРУЗКА ТЕКУЩЕГО БАЙТА И
ADDC A, @R1; СЛ0ЖЕНИЕ
DA A ; КОРРЕКЦИЯ
MOV @R0, A; РАЗМЕЩЕНИЕ ТЕКУЩЕГО БАЙТА РЕЗУЛЬТАТА
INC R0 ; ПР0ДВИЖЕНИЕ УКАЗАТЕЛЕЙ БАЙТ СЛАГАЕМЫХ
INC R1
DJNZ R2, LOOP; ИНКРЕМЕНТ R2 И ПОВТОР, ПОКА R2 НЕ РАВНО 0
Время суммирования составит (1 + 8N) х 2,5 мкс, где N — длина слагаемых в байтах.
Пример 5. Вычитание байтов. Операция вычитания может быть выполнена двумя способами: переводом вычитаемого как отрицательного числа в дополнительный код с последующим сложением; переводом уменьшаемого в обратный код с последующей инверсией суммы.
Пусть требуется вычесть из А содержимое регистра R6. Вычитание выполнить в соответствии с выражением .
CPL А ; ИНВЕРСИЯ АККУМУЛЯТОРА
ADD A, R6 ; СЛ0ЖЕНИЕ
CPL А ; ПОЛУЧЕНИЕ РАЗНОСТИ
Установка флага С после выполнения сложения будет свидетельствовать об отрицательном переполнении.
Пример 6. Получить разность 2-байтных чисел без знака. Операнды располагаются в памяти данных. Адрес уменьшаемого хранится в R1, а вычитаемого – в R0. Результат поместить на место уменьшаемого:
; ВЫЧИСЛЕНИЕ Z = X-Y
; R0 – АДРЕС X
; R1 – АДРЕС Y
; РЕЗУЛЬТАТ НА МЕСТО X
SUBSTR: MOV A, @R0; ЗАГРУЗКА МЛАДШЕГО БАЙТА Y
CPL A ; ПОЛУЧЕНИЕ ДОПОЛНИТЕЛЬНОГО КОДА Y
INC A
ADD A, @R1 ; ВЫЧИТАНИЕ МЛАДШИХ БАЙТ
|
|
MOV @R0, A; ЗАПОМИНАНИЕ МЛАДШЕГО БАЙТА РАЗНОСТИ
INC R0 ; ПЕРЕХОД К СТАРШИМ БАЙТАМ X И Y
INC R1
MOV A, @R0; ЗАГРУЗКА СТАРШЕГО БАЙТА
CPL A ; ОБРАТНЫЙ КОД Y
ADDC A, @R1; ВЫЧИТАНИЕ СТАРШИХ БАЙТ
MOV @R0, A; ЗАПОМИНАНИЕ РЕЗУЛЬТАТА
Пример 7. Умножить однобайтные целые числа без знака. В регистре R1 размещен множитель, в регистре R2 — множимое. Двухбайтный результат умножения будет размещен в аккумуляторе (старший байт) и в R1 (младший байт) вместо множителя. В регистр R3, выполняющий функции счетчика программных циклов, загружается число 8 (число бит множителя). Умножение выполняется младшими битами вперед со сдвигом вправо частичного произведения. Последовательность действий при этом методе умножения следующая:
1. Содержимое аккумулятора и регистра-расширителя R1 сдвигаются вправо на один бит так, что младший бит множителя, выдвигаемый из регистра R1, помещается в триггер флага С.
2. Если С = 1, то множимое добавляется к содержимому аккумулятора, в противном случае никаких операций не производится.
3. Декрементируется счетчик циклов R3, и если его содержимое не равно нулю, то все действия повторяются.
4. Перед выходом из подпрограммы формируется окончательный результат сдвигом частичного результата на один бит вправо:
MPL: MOV R3, #08; ЗАГРУЗКА СЧЕТЧИКА ЦИКЛОВ
CLR A ; ОЧИСТКА АККУМУЛЯТОРА
CLR C ; 0ЧИСТКА ПРИЗНАКА ПЕРЕНОСА
SHIFT: RRC A ; СДВИГ АККУМУЛЯТОРА ВПРАВО
XCH A ; 0БМЕН АККУМУЛЯТОРА И R1
RRC A ; СДВИГ МНОЖИТЕЛЯ С ЗАНЕСЕНИЕМ ВЫДВИГАЕМОГО БИТА В С
XCH A, R1 ; ОБМЕН АККУМУЛЯТОРА И R1
JNC RES ; ЕСЛИ С=1, ТО СУММИРОВАНИЕ
ADD A, R1 ; ПРИБАВЛЕНИЕ МН0ЖИМОГО
RES: DJNZ R3, SHIFT; ИНКРЕМЕНТ СЧЕТЧИКА И ПРОВЕРКА ОКОНЧАНИЯ ОПЕРАЦИИ
RRC A ; СДВИГ АККУМУЛЯТОРА
XCH A, R1 ; 0БМЕН
RRC A ; СДВИГ С0ДЕРЖИМОГО R1
XCH A, R1 ; ОБМЕН
Максимальное время выполнения программы составляет 200 мкс.