Программирование на Ассемблере


Организация вычислений с многократной точностью


Будем называть число с многократной точностью, если для его задания требуется более одного машинного слова. Такие числа широко используются при решении различных практических задач. Так, криптография на открытых ключах построена на числах с многократной точностью, длина которых 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!

Содержание раздела