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

     

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



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

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

Исходными компонентами программы преобразования десятичного числа произвольной разрядности из символьного представления в двоичное будут являться макрокоманда умножения N-байтного числа на число размером М байт и программа сложения чисел размером N байт без учета знака. Алгоритм вычисления двоичного эквивалента будет таким же, как рассмотренный выше, — вычисление полинома по схеме Горнера. Ниже приведен вариант реализующей его программы. Расположение байтов результата — по схеме, естественной для микропроцессоров Intel, то есть младший байт располагается по младшему адресу.

:prg06_04.asm - программа ввода целых десятичных чисел из диапазона 0..». ;Вход: ввод с клавиатуры числа в десятичной системе счисления длиной до 20 цифр. ;Выход: двоичное число - результат преобразования в области памяти string_bin.

:см. описание макрокоманд add_unsign_N_l и mul_unsign_NM в главе 1 add_unsIgn_N_lmacro summand_l, summand_2, N

endm mul_unsign_NM macro u.i.v.j.w

endm .data

string db 22 dup (0) максимальное число состоит из 20 цифр (22 - с учетом OdOah) len_string-$-string tendd 10

string_bindb 10 dup (0) максимальная длина двоичного числа - 10 байт 1en_stri ng_bi n-$-stri ng_bi n

carry db 0 :перенос сложения последних байтов

adr_string_bindd string_bin string_bin_w db len_string_bin+l dup (0) результат умножения для макроса

;mul_unsign_NM = len_string_bin+l байт len_string_bin_w =$-string_bin_w adr_string_bin_w dd string_bin_w k db 0 :перенос 0 < k < 255

b dw lOOh ;размер машинного слова

.code



movbx.O стандартный дескриптор - клавиатура


mov cx.len_string

lea dx.string ;формируем указатель на строку string

movah,3fh :номер функции DOS

int 21h

jc exit :переход в случае ошибки :в регистре AL - количество действительно введенных десятичных цифр

mov ecx.eax

sub есх.2 корректируем счетчик цикла ( чтобы не учитывать OdOah. вводимые 3fh)

jcxz $+4 :число не было введено

jmp $+5

jmp exit cont_l:dec ecx ;не умножать на 10 последнюю цифру числа

jcxz $+4 юднозначное число

tjmp S+5 jmp m2 lea si.string ;формируем указатель на строку string хог еах.еах :еах:=0 ml: хог edx.edx

mov dl.[si]

and dl.Ofh преобразуем ASCI I->BCD add_unsign_N_lstring_bin.dl. len_string_bin ¦.умножаем на 10

mul_unsign_NM string_bin. len_string_bin.ten,l. string_bin_w :копируем string bin_w в string_bin

eld

push si push ex

Ids si .adr_sthng_bin_w

lesdi.adr_string_bin

mov cx.len_string_bin_w repmovsb pop ex pop si

inc si dec ex jcxm2 ' jmp ml m2: mov dl .[si] and dl.Ofh

¦ add_unsign_N_lstring_bin.dl, len_string_bin

¦ результат преобразования - в строке string_bin

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


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