Команды арифметических операций

В ранее рассмотренных командах обработки информации кодирова­ние содержимого отдельных битов байта не имело значения. В арифме­тических операциях нужно придерживаться строго определенных правил записи данных в соответствии с порядковыми номерами разрядов двоичного кода. В связи с ограниченными ресурсами микроконтроллера в нем используются только четыре арифметических операции с целыми числами. Отступления от правил кодирования приводят к неправильному выполнению арифметических операций.

В одном байте может быть закодировано 256 значений целого числа. При работе с положительными числами это соответствует значениям от 0 до 255, Все команды арифметических операций предназначены для работы с положительными целыми числами байтового формата, хотя команды сложения и вычитания в случае отсутствия переполнения обес­печивают получение корректного результата при специальном способе кодирования отрицательных чисел. Кодирование чисел более подробно рассмотрено в главе о программировании арифметических операций. При необходимости работы с числами, которые не могут быть представ­лены в байтовом формате, необходимо разрабатывать соответствующие подпрограммы. Выполнение операций умножения и деления с числами, имеющими произвольный знак, возможно при их представлении через знак и модуль и использовании соответствующих подпрограмм, Это могут быть собственные разработки или заимствования из хорошо прове­ренных библиотек других разработчиков.

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

ADD A, #src

ADD A, Rn

ADD A, @Ri

ADD A, src

Мнемоника этой команды соответствует слову ADD ition (сложение).

Для работы с числами, которые не могут быть представлены одним байтом, используется команда сложения, учитывающая перенос, полу­ченный при сложении предыдущей пары байтов:

ADDC A, #src

ADDC A, Ri

ADDC A, @Ri

ADDC А, src

Добавление буквы С к обозначению команды указывает на использование бита переноса (ADD ition with C arrier).

Существует также команда сложения, при помощи которой произво­дится увеличение заданного операнда на единицу (INC rement):

INC А

INC Rn

INC @Ri
INC src

Такая же команда есть и для работы с двумя байтами содержимого реги­стра указателя данных:

INC DPTR

При помощи этой команды можно изменять содержимое указателя для чтения последовательности байтов из ПЗУ.

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

DA A

Двоично-десятичное кодирование имеет весьма ограниченное примене­ние и потому далее не рассматривается.

Набор команд для вычитания гораздо уже. Команда вычисления раз­ности существует только в варианте с вычитанием содержимого бита переноса (не хватило кодов команд!):

SUBB A, #src

SUBB А, Rn

SUBB A, @Ri

SUBB A, src

Мнемоника этой команды соответствует словам SUB tracuon with B orrow (т. е. вычитание с учетом займа, так как при вычитании образуется заём, а не перенос). По этой причине перед вычислением разности младших байтов нужно обязательно очищать бит переноса, если нет уверенности в его содержимом. При вычислении разности старших байтов этого делать не нужно.

Существует также команда вычитания, при помощи которой произ­водится уменьшение заданного операнда на единицу (DEC rement):

DEC A

DEC Rn

DEC src

DEC @Ri

Команды уменьшения для работы с двухбайтовым форматом данных нет.

Результаты выполнения команд сложения и вычитания влияют на содержимое битов переноса, дополнительного переноса и переполнения в слове состояния программы. Результаты выполнения команд увеличе­ния и уменьшения не влияют на содержимое слова состояния программы.

Команда умножения (MUL tiplication) и деления (DIV ision) работают при записи операндов в накопитель и регистр В. Для команды умножения порядок записи сомножителей в эти регистры не важен,

MUL AB

Произведение имеет двухбайтовый формат. Младший байт произведения записывается в накопитель, а старший — в регистр В.

Для команды деления делимое должно быть записано в накопитель, а делитель — в регистр В:

DIV AB

После выполнения команды в накопителе находится частное, а в регистре В — остаток. После выполнения команд умножения и деления в бит переноса заносится 0. Если старший байт произведения неравен нулю, то в байт переполнения заносится «1». При делении на 0 в байт переполнения также заносится «1».


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



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