Иллюстрированный самоучитель по задачам и примерам Assembler

Ввод чисел с консоли. Преобразование целых десятичных чисел.

В основе способа с использованием десятичного полинома лежит возможность представления десятичного числа суммой произведений на степени числа 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
Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.