Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скляров И. Изучаем Assembler за 7 дней (2010).pdf
Скачиваний:
1335
Добавлен:
23.02.2015
Размер:
2.11 Mб
Скачать

http://www.sklyaroff.ru

96

add ax,bx aaa

В результате в регистре AX окажется значение 0000 0001 0000 0001 или 101h (можно увидеть под отладчиком).

Пример корректировки вычитания: mov ax,5

mov bx,6 sub ax,bx aas

5.2.5.2. Умножение и деление неупакованных BCD-чисел

Для корректировки умножения и деления неупакованных BCD-чисел имеются две команды:

AAM (ASCII Adjust for Multiplication) — коррекция умножения для представления в символьном виде;

AAD (ASCII Adjust for Division) — коррекция деления для представления в символьном виде.

Команды AAM и AAD преобразуют содержимое регистра AX в правильную неупакованную десятичную цифру.

Обратите внимание: в отличие от других корректирующих команд (AAA, DAA и др.), которые выполняют действия над результатом операции, команда AAD должна выполняться непосредственно перед операцией деления!

Команды AAM и AAD устанавливают флаги SF, ZF и PF в соответствии с результатом, OF, AF и CF остаются неопределенными.

5.2.5.3. Сложение и вычитание упакованных BCD-чисел

Можно выполнять сложение и вычитание чисел в упакованном двоично-десятичном представлении (BCD-формате):

Для этих целей имеются две корректирующие команды:

DAA (Decimal Adjustment for Addition — десятичная коррекция для сложения);

DAS (Decimal Adjustment for Subtraction — десятичная коррекция для вычитания).

Команды DAA и DAS преобразуют содержимое регистра AL в правильную упакованную десятичную цифру. Если результат корректировки превышает предельное значение для упакованных BCD-чисел (99), то эти команды добавляют (вычитают — DAS) к содержимому регистра AH единицу и устанавливают флаги AF

и CF.

Обработка полей также осуществляется по одному байту за одно выполнение.

5.3. Команды выполнения операций с вещественными числами

Число, которое имеет запятую для разделения целой и дробной части, называют вещественным (или действительным) числом.

Существует две формы представления вещественных чисел:

с фиксированной запятой (естественная форма);

с плавающей запятой (экспоненциальная форма).

Вещественное число в естественной форме имеет фиксированное место запятой — если место запятой изменить, то изменится и само число.

Примеры чисел с фиксированной запятой: a = 0.3702

b = -324.8451 c = 2.7183

http://www.sklyaroff.ru

97

d = 572.0

Например, числа 45.13 и 4.513 — это совершенно разные числа, несмотря на одинаковый порядок цифр. Таким образом, положение запятой в вещественных числах с фиксированной запятой имеет принципиальное значение.

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

Примеры чисел с плавающей запятой:

a = -0.248451•102 b = 3.56•10-3

c = 0,1082•104 d = 58.054•1027

Например, числа 1.3•101, 0.13•102, 0.013•103 и 0.0013•104 — это одно и тоже число 13,

хотя запятая у всех этих чисел находится на разной позиции – именно поэтому такие вещественные числа называют "с плавающей запятой".

Вещественные числа с плавающей запятой используют в основном для компактной записи очень больших чисел наподобие числа Авогадро N=6.02214x1023 или очень малых чисел, как постоянная планка h=6.6261x10-27 эрг•с.

Именно для удобной записи и оперирования очень большими и очень малыми числами была изобретена форма записи чисел с плавающей запятой.

В компьютере можно работать как с вещественными числами с фиксированной запятой, так и с числами с плавающей запятой.

На ассемблере работа с числами с фиксированной запятой осуществляется почти точно также как с целыми числами. Для оперирования числами с плавающей запятой можно написать программную реализацию или воспользоваться встроенной поддержкой — сопроцессором.

Далее мы подробно рассмотрим работу с вещественными числами с фиксированной запятой и отдельно с плавающей запятой.

5.3.1. Вычисления с фиксированной запятой

Числа с фиксированной запятой, в отличие от чисел с плавающей запятой, имеют фиксированное количество разрядов, выделенных на целую (до запятой) и дробную (после запятой) части. Например, пусть в десятичной системе счисления выделено 5 разрядов для целой части числа (до запятой) и 5 разрядов для дробной части числа (после запятой); числа, записанные в такую разрядную сетку, имеют вид:

+00721,35500; +00000,00328; -10301,20260.

В компьютере наиболее распространенные форматы чисел с фиксированной запятой — 8:8 (всего 16 бит) и 16:16 (всего 32 бита). Разумеется, можно придумать и использовать иной формат, например 6:10, но это усложнит некоторые операции над такими числами.

Диапазон значащих чисел N в системе счисления с основанием Р при наличии m разрядов в целой части и s разрядов в дробной части числа (без учета знака числа) будет:

P-s ≤ N ≤ Pm-1.

Таким образом, для формата 8:8 (m=8, s=8) в двоичной системе счисления (P=2) диапазон будет:

0,00390625 ≤ N ≤ 255.

Для 16:16:

0,0000152587890625 ≤ N ≤ 65535.

При P=2, m=16 и s=0: 0 ≤ N ≤ 65535.

При P=2, m=32 и s=0: 0 ≤ N ≤ 4294967295.

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

http://www.sklyaroff.ru

98

Причем для вещественных чисел с фиксированной и плавающей запятой такой перевод осуществляется по-разному.

На первом дне я говорил, что для перевода целых чисел из одной системы счисления

вдругую вы можете воспользоваться обычным калькулятором. Однако в случае вещественных чисел калькулятор будет плохим помощником. Например, попробуйте с помощью стандартного калькулятора Windows перевести вещественное число 43,58

вдесятичной системе счисления в любую другую систему счисления – двоичную или шестнадцатеричную. Калькулятор переведет только целую часть, а дробную просто отбросит как ненужную. Обратный перевод, например из двоичного числа в вещественное число в десятичной системе счисления вообще с помощью калькулятора напрямую выполнить невозможно.

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

Целая часть (до запятой) вещественного числа с фиксированной запятой переводится в двоичный вид также как любые целые числа. А для перевода дробной части (после запятой) используют следующий алгоритм. Число в десятичной системе счисления необходимо последовательно умножать на основание системы счисления, в которую надо переводить. Причем умножать надо только очередную дробную часть, игнорируя возникающие целые части. В качестве цифр берутся целые части результатов умножения. Так происходит до тех пор, пока дробная часть не станет равной нулю или не достигается заданная точность.

Ниже приводится пример перевода вещественного числа с фиксированной запятой 213,625 в двоичную систему счисления.

Переводим целую часть с помощью калькулятора или по правилу, рассказанному на первом дне: 213d = 11010101b.

Теперь переводим дробную часть:

0,625 умножаем на 2. Дробная часть 0,250. Целая часть 1. 0,250 умножаем на 2. Дробная часть 0,500. Целая часть 0. 0,500 умножаем на 2. Дробная часть 0,000. Целая часть 1.

Итак, сверху вниз получаем число 101.

Результат: 213,625d = 11010101,101b.

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

00010000.10000000 = 0x27+0x26 + 0x25 + 1x24 + 0x23 + 0x22 + 0x21 + 0x20 +1x2-1 +0x2-2 +0x2-3 + 0x2-4 + 0x2-5 + 0x2-6 + 0x2-7 = 16 + 0,5 = 16,5d

Сложение и вычитание чисел с фиксированной запятой выполняется точно также как сложение и вычитание целых чисел:

mov ax,1080h mov bx,1240h add ax,bx sub ax,bx

При выполнении умножения чисел с фиксированной запятой умножение 16-битных чисел дает 32-битный результат, а умножение 32-битных чисел – 64-битный результат. Например, если в регистрах EAX и EBX содержатся числа с фиксированной запятой в формате 16:16, то после выполнения умножения:

xor edx,edx mul ebx

в регистр EDX будет помещена вся целая часть, а в регистр EAX — вся дробная.

Форма чисел с фиксированной запятой наиболее проста и естественна, но имеет небольшой диапазон представления чисел и поэтому не всегда приемлема при вычислениях.