Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Kharakhnin / ПОСОБИЕ_Харахнин.doc
Скачиваний:
277
Добавлен:
08.03.2016
Размер:
17.89 Mб
Скачать

3.2. Арифметические операции

При обработке получаемой от объекта информации часто требуется провести различные вычисления. В этом разделе рассмотрим примеры выполнения арифметических операций. Пусть требуется сложить два многобайтных двоичных числа. В регистрах R0 и R1 указаны начальные адреса ячеек ОЗУ, начиная с которых расположены многобайтные числа. В регистре R2 указывается число байт в складываемом числе. Алгоритм сложения основан на последовательном сложении байтов, начиная с младшего. При этом сумма может оказаться большей, чем 255, поэтому при сложении старших байтов необходимо применять команду ADDC. Пусть складываются трехбайтные числа.

<1>ADD_BIN: CLR C ; Сброс флага переноса

<2> MOV R0,#20H ; Адрес расположения мл. байта 1числа

<3> MOV R1,#30H ; Адрес расположения мл. байта 2 числа

<4> MOV R2,#3 ; Количество байт в числе

<5>ADDITION:MOV A,@R0 ; Загрузка текущего байта

<6> ADDC A,@R1 ; Сложение

<7> MOV @R0,A ; Размещение текущего байта результата

<8> INC R0 ; Указание на следующий байт 1 числа

<9> INC R1 ; Указание на следующий байт 2 числа

<10> DJNZ R2,ADDITION; Продолжить сложение, если R20

Для того чтобы произвести многобайтное вычитание двоичных чисел, необходимо в рассмотренном фрагменте заменить команду сложения на команду вычитания с учетом переноса. Пусть требуется выполнить вычитание трехбайтных чисел, тогда программа имеет вид:

<1>SUB_BIN:CLR C ; Сброс флага переноса

<2> MOV R0,#20H ; Адрес расположения мл. байта 1числа

<3> MOV R1,#30H ; Адрес расположения мл. байта 2 числа

<4> MOV R2,#3 ; Количество байт в числе

<5>SUBTRACT:MOV A,@R0 ; Загрузка текущего байта

<6> SUBB A,@R1 ; Вычитание

<7> MOV @R0,A ; Размещение текущего байта результата

<8> INC R0 ; Указание на следующий байт 1 числа

<9> INC R1 ; Указание на следующий байт 2 числа

<10> DJNZ R2,SUBTRACT; Продолжить вычитание, если R20

Результат выполнения операции будет размещаться в трех ячейках, начиная с 20Н.

При выводе информации на дисплей удобнее работать с числами, представленными в BCD формате. Рассмотрим фрагмент, позволяющий складывать многобайтные числа в BCD формате.

<1>ADD_BCD: CLR C ; Сброс флага переноса

<2> MOV R0,#20H ; Адрес расположения мл. байта 1числа

<3> MOV R1,#30H ; Адрес расположения мл. байта 2 числа

<4> MOV R2,#3 ; Число байт в числе

<5>ADDITION:MOV A,@R0 ; Загрузка текущего байта

<6> ADDC A,@R1 ; Сложение

<7> DA A ; Десятичная коррекция результата

<8> MOV @R0,A ; Размещение текущего байта результата

<9> INC R0 ; Указание на следующий байт 1 числа

<10> INC R1 ; Указание на следующий байт 2 числа

<11> DJNZ R2,ADDITION; Продолжить сложение, если R20

Отличительной особенностью фрагмента от рассмотренного выше является то, что после команды сложения необходимо выполнить десятичную коррекцию результата с помощью команды DA A. Это требуется сделать потому, что при сложении BCD чисел результат в тетрадах может превышать число 9.

При обработке данных требуется выполнять операции перемножения двоичных чисел. В системе команд имеется команда MUL AB, позволяющая выполнить эту операцию / 5 /. Рассмотрим пример использования команды. Множимое располагается в ОЗУ в ячейке 20Н, а множитель в 30Н. Результат перемножения помещается в ячейки 21Н и 20Н.

<1>MULT:MOV R0,#20H ; Загрузка указателя множимого

<2> MOV A,@R0 ; Множимое в А

<3> MOV R1,#30H ; Загрузка указателя расположения множителя

<4> MOV B,@R1 ; Пересылка множителя в В

<5> MUL AB ; Перемножить А и В

<6> MOV @R0,A ; Сохранить младший байт результата в 20Н

<7> INC R0 ;

<8> MOV @R0,B ; Сохранить старший байт результата в 21Н

<9> RET ;

В качестве примера использования команды деления рассмотрим подпрограмму преобразования бинарного кода числа в BCD формат. Преобразуемое число находится в аккумуляторе, результат преобразования будет находиться в ОЗУ в ячейках 20Н и 21Н.

<1>BIN_BCD:MOV B,#100 ; Определение количества сотен в

<2> DIV AB ; числе

<3> MOV 20H,A ; Сохранение в ОЗУ старшей цифры

<4> MOV A,#10 ; Определение числа десятков

<5> XCH A,B ; в остатке числа

<6> DIV AB ;

<7> SWAP A ; Число десятков в старшей тетраде

<8> ADD A,B ; Сложение числа десятков с единицами

<9> MOV 21H,A ;Сохранить число десятков и единиц в 21Н

<10> RET ; Возврат в основную программу

З а д а н и я д л я с а м о с т о я т е л ь н о й р а б о т ы

Разработайте фрагменты, реализующие последовательность действий:

(A) 0Fh [20h] 08h

(B) 05h [21h] 14h

[30h] (A) + (B) (A) 05h

[31h] (A) – (B) (B) [21h]

[32h] (A) / (B) [25h] (A) + [20h]

[33h] (A) * (B) [26h] (B) – [25h]

[34h] [33h] – [32h] [27h] (A) * [20h]

[35h] [31h] + [30h] [28h] (A) / 2

Примечание: В квадратных скобках показаны адреса ячеек внутреннего ОЗУ однокристального МК.