Ввод чисел с консоли. Преобразование целых десятичных чисел.
В основе способа с использованием десятичного полинома лежит возможность представления десятичного числа суммой произведений на степени числа 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 на экран
При необходимости вы можете изменить программу, так чтобы в ней использовались регистры меньшей разрядности.
Ввод целых десятичных чисел из диапазона 0..999 999 999 999 999 999
Второй способ преобразования десятичных чисел хотя и выглядит несколько экзотически, вполне работоспособен. Данный способ предполагает использование особенностей некоторых команд сопроцессора. В материале урока 19 "Архитектура и программирование сопроцессора" учебника мы перечисляли форматы данных, которые поддерживает сопроцессор. Перечислим их еще раз:
- двоичные целые числа в трех форматах – 16, 32 и 64 бита;
- упакованные целые десятичные (BCD) числа – максимальная длина – 18 упакованных десятичных цифр (9 байт);
- вещественные числа в трех форматах – коротком (32 бита), длинном (64 бита), расширенном (80 бит).
Для нас интерес представляют форматы целых двоичных и упакованных десятичных (BCD) чисел, а также команды обмена этими значениями с вершиной сопроцессора. Процесс преобразования десятичного целого числа, вводимого с клавиатуры, показан в программе ниже. Необходимо отметить, что этот способ преобразования позволяет расширить диапазон значений 0..999 999 999 999 999 999.
:prg06_03.asm – программа ввода целых десятичных чисел из диапазона :0..999 999 999 999 999 999 и преобразования их в эквивалентное двоичное представление. ;Вход: ввод с клавиатуры числа в десятичной системе счисления :в диапазоне значений 0..999 999 999 999 999 999. :Выход: двоичное число-результат преобразования в области памяти stnng_bin. .data db 0:барьер. если введенное количество цифр нечетно string db 20 dup (0) максимальное ;исходное число состоит из 18 цифр (20 – с учетом Od0ah) len_string=$-string adr_string dd string string_pack dt 0:сюда упаковывается исходное значение len_string_pack=$-string_pack adr_string_pack dd string_pack результат – двоичное значение ;различной разрядности: string_bin_byte label byte string_bin_word label word string_bin_word label word string_bin_dword label dword string_bindq 0;поле для результата – эквивалентного двоичного представления --------вводим с экрана----------------…………----- movbx.O стандартный дескриптор – клавиатура movcx .len_str"ing lea dx.string:формируем указатель на строку string movah.3fh:номер функции DOS int 21h jc exit;переход в случае ошибки ;в регистре AL – количество действительно введенных десятичных цифр :преобразуем строку с десятичными числами в ее двоичный эквивалент mov ex.ax subcx,2 корректируем счетчик цикла (чтобы не учитывать OdOah, вводимые 3fh) jeexz exit:число не было введено Ids si,adr_string add si,cx dec si указатель на последнюю введенную десятичную цифру les di.adr_string_pack ml: std:флаг df=l – работаем со строкой string, начиная с ее конца хоr ах.ах lodsb and al. Of h shl ax.8 lodsb shl al.4 add al.ah:в AL две очередные упакованные цифры eld:флаг df-1 – работаем со строкой string_pack. начиная с ее начала stosb sub ex.2 emp ex. 0 J9 ml;конец преобразования в упакованное представление fI nit инициализируем сопроцессор;теперь преобразуем в эквивалентное двоичное представление: fbld string_pack:помещаем в стек сопроцессора 'fistp string_bin ;и извлекаем эквивалентное двоичное представление в поле string_bin