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


         

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


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




Содержание  Назад  Вперед