Примеры использования команд арифметических операций

 

Пример 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 мкс.

 


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: