3.2.Арифметические команды Микропроцессор может выполнять целочисленные операции и операции с плавающей точкой. Для этого в его архитектуре есть два отдельных блока:
устройство для выполнения целочисленных операций;
устройство с плавающей точкой.
Каждое из этих устройств имеет свою систему команд. В принципе, целочисленное устройство может взять на себя многие функции устройства с плавающей точкой, но это потребует больших вычислительных затрат. Для большинства задач, использующих язык ассемблера, достаточно целочисленной арифметики.
Целочисленное вычислительное устройство поддерживает чуть больше десятка арифметических команд.
На рис. 1 приведена классификация команд этой группы.
Рис. 1. Классификация арифметических команд
Группа арифметических целочисленных команд работает с двумя типами чисел:
целыми двоичными числами. Числа могут иметь знаковый разряд или не иметь такового, то есть быть числами со знаком или без знака;
целыми десятичными числами.
Рассмотрим машинные форматы, в которых хранятся эти типы данных.
3.2.1.Целые двоичные числа Целое двоичное число с фиксированной точкой — это число, закодированное в двоичной системе счисления.
Размерность целого двоичного числа может составлять 8, 16 или 32 бит. Знак двоичного числа определяется тем, как интерпретируется старший бит в представлении числа. Это 7-й, 15-й или 31-й биты для чисел соответствующей размерности (см. Типы данных ). При этом интересно то, что среди арифметических команд есть всего две команды, которые действительно учитывают этот старший разряд как знаковый, — это команды целочисленного умножения и деления imul и idiv. В остальных случаях ответственность за действия со знаковыми числами и, соответственно, со знаковым разрядом ложится на программиста. К этому вопросу мы вернемся чуть позже. Диапазон значений двоичного числа зависит от его размера и трактовки старшего бита либо как старшего значащего бита числа, либо как бита знака числа (табл. 1).
Таблица 1. Диапазон значений двоичных чисел Размерность поля
| Целое без знака
| Целое со знаком
| Байт
| 0...255
| –128...+127
| Слово
| 0...65 535
| –32 768...+32 767
| двойное слово
| 0...4 294 967 295
| –2 147 483 648...+2 147 483 647
| Как описать числа с фиксированной точкой в программе?
Это делается с использованием директив описания данных. К примеру, последовательность описаний двоичных чисел из сегмента данных листинга 1 (помните о принципе “младший байт по младшему адресу”) будет выглядеть в памяти так, как показано на рис. 2.
-
Листинг 1. Числа с фиксированной точкой
;prg_8_1.asm
masm
model small
stack 256
.data ;сегмент данных
per_1 db 23
per_2 dw 9856
per_3 dd 9875645
per_4 dw 29857
.code ;сегмент кода
main: ;точка входа в программу
mov ax,@data ;связываем регистр dx с сегментом
mov ds,ax ;данных через регистр ax
exit: ;посмотрите в отладчике дамп сегмента данных
mov ax,4c00h ;стандартный выход
int 21h
end main ;конец программы
|
Рис. 2. Дамп памяти для сегмента данных листинга 1
3.2.2.Десятичные числа Десятичные числа — специальный вид представления числовой информации, в основу которого положен принцип кодирования каждой десятичной цифры числа группой из четырех бит. При этом каждый байт числа содержит одну или две десятичные цифры в так называемом двоично-десятичном коде (BCD — Binary-Coded Decimal). Микропроцессор хранит BCD-числа в двух форматах (рис. 3):
упакованном формате — в этом формате каждый байт содержит две десятичные цифры. Десятичная цифра представляет собой двоичное значение в диапазоне от 0 до 9 размером 4 бита. При этом код старшей цифры числа занимает старшие 4 бита. Следовательно, диапазон представления десятичного упакованного числа в одном байте составляет от 00 до 99;
неупакованном формате — в этом формате каждый байт содержит одну десятичную цифру в четырех младших битах. Старшие четыре бита имеют нулевое значение. Это так называемая зона. Следовательно, диапазон представления десятичного неупакованного числа в одном байте составляет от 0 до 9.
Рис. 3. Представление BCD-чисел
Как описать двоично-десятичные числа в программе?
Для этого можно использовать только две директивы описания и инициализации данных — db и dt. Возможность применения только этих директив для описания BCD-чисел обусловлена тем, что к таким числам также применим принцип “младший байт по младшему адресу”, что, как мы увидим далее, очень удобно для их обработки. И вообще, при использовании такого типа данных как BCD-числа, порядок описания этих чисел в программе и алгоритм их обработки — это дело вкуса и личных пристрастий программиста. Это станет ясно после того, как мы ниже рассмотрим основы работы с BCD-числами. К примеру, приведенная в сегменте данных листинга 2 последовательность описаний BCD-чисел будет выглядеть в памяти так, как показано на рис. 4.
-
Листинг 2. BCD-числа
;prg_8_2.asm
masm
model small
stack 256
.data ;сегмент данных
per_1 db 2,3,4,6,8,2
;неупакованное BCD-число 286432
per_3 dt 9875645 ;упакованное BCD-число 9875645
.code ;сегмент кода
main: ;точка входа в программу
mov ax,@data ;связываем регистр dx с сегментом
mov ds,ax ;данных через регистр ax
exit: ;посмотрите в отладчике дамп сегмента данных
mov ax,4c00h ;стандартный выход
int 21h
end main ;конец программы
|
Рис. 4. Дамп памяти для сегмента данных листинга 2
После столь подробного обсуждения объектов, с которыми работают арифметические операции, можно приступить к рассмотрению средств их обработки на уровне системы команд микропроцессора.
|