Будем называть число с многократной точностью, если для его задания требуется более одного машинного слова. Такие числа широко используются при решении различных практических задач. Так, криптография на открытых ключах построена на числах с многократной точностью, длина которых 1024 и более бит. Для 32- битных процессоров число с многократной точностью содержит более 32 бит.
В основе вычислений с многократной точностью лежат вычисления «в столбик». В этом случае на каждом шаге требуется выполнять операции с однократной точностью. Для учета возможных переносов при сложении и заемов при вычитании используются специальные команды, представленные в табл. 5.3
Таблица 5.3 Команды для вычислений с многократной точностью
Назначение |
Общий вид |
Комментарий |
Сложение |
adc <Оп1>, <Оп2> |
Оп1 = Оп1 + Оп2 + бит переноса |
Вычитание |
sbb <Оп1>, <Оп2> |
Оп1 = Оп1 - Оп2- бит переноса |
При переполнении (заеме) формируется бит переноса, который учитывается при выполнении операций сложения и вычитания для очередной порции числа (цифры).
Рассмотрим примеры вычислений с многократной точностью.
Пример1. Составить программу для сложения двух 64 - разрядных чисел[8]
dataseg
x dd 12345678h, 9abcdefah
y dd 0ffffffffh, 0ffffffffh
z dd 3 dup (?)
...
Codeseg
..
; Сложение младших «цифр» числа.
mov eax, [x]
add eax, [y]
mov [z], eax
; Сложение старших «цифр» числа.
mov eax, [x+4]
adc eax, [y+4]
mov [z+4], eax
;Учет переноса
mov [z+8], 0
adc [z+8], 0
Очевидно, что для вычитания таких чисел необходимо команы ADD, ADC заменить командами SUB, SBB.
Пример 2. Составить программу для умножения двух 64-разрядный чисел x, y.
Очевидно, что
x = x1* 232 + x0;
y = y1* 232 + y0;
где (x1, x0) – старшая и младшая цифры числа x;
где (y1, y0) – старшая и младшая цифры числа y;
В результате умножения x * y получим:
x * y = (x1* 232