Для значений из диапазона 0..99 взаимное преобразование между символьной десятичной и двоичной формами может производиться командами умножения и деления двоично-десятичных (BCD-чисел) — ММ и AAD.


:prg06_01.asm - программа ввода с консоли двоичного числа из диапазона 0..99
:в десятичном символьном представлении
;Вход: число в десятичной системе счисления, вводимое в символьном виде с клавиатуры.
;Выход: двоичное число в регистре А1.
buf_Oahstruc
len_bufdb 3 :длина buf_0ah
len_in db 0 действительная длина введенного слова (без учета Odh)
bufjn db 3 dup (20h) :буфер для ввода (с учетом Odh)
ends
.data
bufbuf_0ah<>
adr bufdd buf
.code
;.........
;вводим 2 символа с клавиатуры, контроль на допустимые значения не делаем
Ids dx.adr__buf
nrav ah.Oah
int 21h
xor ax.ax
cmp buf .lenjn.2 ;сколько чисел введено реально?
jneml
mov ah.buf.buf_in ml: mov al,buf.buf_in+l
andax.0f0fh преобразование в неупакованное десятичное представление
aad :в al двоичный эквивалент исходного двузначного десятичного значения


fbld string_pack :помещаем в стек сопроцессора 'fistp string_bin ;и извлекаем эквивалентное двоичное представление в поле string_bin '¦.........
Приведенная программа преобразует любое значение из диапазона 0..1018-!. Интересно отметить количественное значение максимальной двоичной величины, соответствующее верхней границе диапазона, — это +0de0b6b3a763ffffl6. Запомните его, оно пригодится нам при рассмотрении обратного преобразования Для вывода на консоль — из двоичного в десятичное представление. Извлечь значение нужной разрядности можно, если ввести директивой label соответствующие идентификаторы в исходный текст программы (что и сделано в нашем сегменте кода):
Ввод целых десятичных чисел из диапазона 0..4 294 967 295
Если исходное значение выходит за диапазон 0..99, то здесь следует иметь в виду возможность возникновения ситуации, при которой значение вводимого десятичного числа превышает диапазон, допустимый форматами типов целочисленных данных, поддерживаемых, в частности, арифметическими командами микропроцессора. Для Pentium III это 8, 16 и 32 бита. Допустимые диапазоны значений для этих форматов (числа без знака):

  • для операнда размером 8 бит — 0..255;
  • для операнда размером 16 бит — 0..65 535;
  • для операнда размером 32 бита — 0..4 294 967 295.

Как видите, максимальное число не такое уж и большое. Поэтому мы столько внимания уделили работе с числами большой размерности в главе 1, посвященной программированию арифметических операций. В ней данные большой размерности просто описывались в сегменте данных без какого-либо намека на возможность их ввода с консоли или отображения на ней. В этом разделе мы постараемся ликвидировать этот недостаток, что несомненно поднимет привлекательность для читателя того и другого материала. Но вначале мы рассмотрим способы преобразования значений, которые укладываются в указанные выше диапазоны. Для этого можно предложить два способа преобразования в символьном представлении десятичных чисел, вводимых с консоли: с использованием деся-
точного полинома и с использованием возможностей сопроцессора по обработке
данных.
В основе способа с использованием десятичного полинома лежит возможность представления десятичного числа суммой произведений на степени числа 10 составляющих его десятичных цифр, которые соответствуют позициям этих цифр в исходном числе:

А10 = an.,x10nl + an.2x10"-2 + ... + а,х10 + а0х10°.

Вычисление данного полинома лучше производить по схеме Горнера:

А10 - (...(0+an.,)x10+an.2)x10+ ... + а,)х10+а0.

Например, число 3405 по этим формулам может быть представлено так:

3405=Зх103+4х102+Ох101+5х100=(((0+3)х10+4)х10+0)х10+5.

Ниже приведена программа преобразования целого десятичного числа в символьном виде из диапазона 0..4 294 967 295 в эквивалентное двоичное представление. Для ввода числа с клавиатуры используем функцию 3fh MS D0S. Она удобна тем, что возвращает количество действительно введенных символов в регистре AL.

:prg06_02.asm - программа преобразования целого десятичного числа в символьном виде :из диапазона 0..4294967295 в эквивалентное двоичное представление.
:Вход: ввод с клавиатуры числа в десятичной системе счисления (не более 10 цифр).
:Выход: двоичное число-результат преобразования в регистре ЕАХ.
add eax.edx
mul ten
jc exit_e
inc si
loop ml m2: mov dl .[si]
anddl.Ofh преобразуем ASCI I->BCD
add еах^х;результат преобразования в регистре ЕАХ
jncexit результат вышел за границы операнда exit_e: .выводим строку string_e на экран

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