Сборник по задачам и примерам Assembler

     

Ввод целых десятичных чисел из



Ввод целых десятичных чисел из диапазона 0..99

Для значений из диапазона 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 на экран

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


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