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

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

Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.