В ранее рассмотренных командах обработки информации кодирование содержимого отдельных битов байта не имело значения. В арифметических операциях нужно придерживаться строго определенных правил записи данных в соответствии с порядковыми номерами разрядов двоичного кода. В связи с ограниченными ресурсами микроконтроллера в нем используются только четыре арифметических операции с целыми числами. Отступления от правил кодирования приводят к неправильному выполнению арифметических операций.
В одном байте может быть закодировано 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».