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




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


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, начиная с ее конца

хог ах.ах

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

Приведенная программа преобразует любое значение из диапазона 0..1018-!. Интересно отметить количественное значение максимальной двоичной величины, соответствующее верхней границе диапазона, — это +0de0b6b3a763ffffl6. Запомните его, оно пригодится нам при рассмотрении обратного преобразования Для вывода на консоль — из двоичного в десятичное представление. Извлечь значение нужной разрядности можно, если ввести директивой label соответствующие идентификаторы в исходный текст программы (что и сделано в нашем сегменте кода):

string_bin_byte label byte

string_bin_word label word

string_bin_word label word

string_bin_dword label dword




Содержание  Назад  Вперед