Организация вычислений с многократной точностью
Будем называть число с многократной точностью, если для его задания требуется более одного машинного слова. Такие числа широко используются при решении различных практических задач. Так, криптография на открытых ключах построена на числах с многократной точностью, длина которых 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
+ x0) * (y1* 232 + y0) = x0 * y0 + (x1 * y0 + x0 *y1) 232 + x1 * y1.¦ЁюуЁрььр, яЁштхфхээр эшцх, тvўшёы хЄ чэрўхэшх лЎшЇЁ¬ яЁюшчтхфхэш ё єўхЄюь яхЁхяюыэхэш эр ърцфюь °рух.
dataseg
xааааааааа ddааааааа 12345678h, 9abcdefah
yааааааааа ddааааааа 0ffffffffh, 0ffffffffh
zаааааааааа ddааааааа 4 dup (?)
...
Codeseg
...
subаааааа eax, eax
movаааа [z+8], eax
movаааа [z+12], eax
; ¦ырф°р ЎшЇЁр Ёхчєы№ЄрЄр z0
movаааа eax, [x]
mulааааа [y]
movаааа [z], eax
movаааа z[4], edx
; ¦эрўхэшх z1
movаааа eax, [x+4]
mulааааа [y]
addааааа [z+4], eax
adcааааа [z+8], edx
movаааа eax, [x]
mulааааа [y+4]
addааааа [z+4], eax
adcааааа [z+8], edx
adcааааа [z+12], 0
; ¦эрўхэш z2 ш z3
movаааа eax, [x+4]
mulааааа [y+4]
addааааа [z+8], eax
adcааааа [z+12], edx
¦ЁшьхЁ 3. TюёЄртшЄ№ яЁюуЁрььє фы фхыхэш 64 сшЄэюую ўшёыр эр 32-сшЄэюх.
xааааааааа ddааааааа ..., Е
yааааааааа ddааааааа Е
zаааааааааа ddааааааа ?, ?
movаааа edx, 0
movаааа eax, [x+4]
divаааааа [y]
movаааа [z+4], eax
movаааа eax, [x]
divаааааа [y]
movаааа [z], eax
¦ЁхфюёЄхЁхурхь Tрё юЄ эхтхЁэюую Ёх°хэш :
movаааа edx, 0
movаааа edx, [x+4]
movаааа eax, [x]
divаааааа [y]
movаааа [z], eax
¦Єю Ёх°хэшх ьюцхЄ яЁштхёЄш ъ ю°шсъх л-хыхэшх эр 0¬, хёыш ўрёЄэюх эх яюьх•рхЄё т ЁхушёЄЁ EAX, эряЁшьхЁ, хёыш x>232, р y = 1!