Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Assembler (Уч_пос_Лаб_Ч1).doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
1.43 Mб
Скачать

9.2.3. Преобразование двоичного числа в ascii-строку числа по произвольному основанию

Данное преобразование представляет собой процесс обратный предыдущему. На первом этапе происходит формирование младших двоичных тетрад для соответствующих ASCII-цифр (символов), на втором – получение собственно ASCII-кодов.

Первый этап реализуется путём последовательного использования операции деления исходного двоичного числа и его частных на основание соответствующей системы счисления P. Полученные остатки и представляют собой двоичные тетрады соответствующих байтов ASCII-кодов (первый остаток определяет младшую цифру преобразуемого числа, последний – старшую). Цикл деления, в котором формируется нулевое значение частного, означает конец преобразования.

Второй этап преобразования сводится к выполнению операции сложения полученных остатков с числом 30h (Р = 2, 8, 10 и, выборочно, для формирования ASCII-кодов младших цифр 16-теричного числа). Для формирования ASCII-символов A,B,...,F используется число 37h. Чтобы не заниматься хранением промежуточных результатов первых этапов, рекомендуется в каждом цикле преобразования объединять оба этапа (прямого или обратного).

П

Номер шага деления

числа и его частных Частное Остаток ASCII- код

на основание 10

1 (((0*10)+02)*10 + 03 07 37h (Мл. байт)

2 ((0*10) + 02) 03 33h

3 0 02 32h (Ст. байт)

Десятичное число в ASCII-формате: 32 33 37.

ример преобразования двоичного числа в десятичное: 11101101(2)=237(10).

Рассмотренный алгоритм преобразования двоичного числа в десятичное ASCII-число реализован в программе, представленной в листинге 4.2.

Листинг 4.2. Подпрограмма преобразования 16-битового двоичного дополнительного кода из регистра ах в десятичное ASCII-число со знаком в буфере dec_buf (знак+5цифр). Адрес буфера находится в регистре bx.

Comment /*

Вход: ax – 16-битовый двоичный дополнительный код,

bx – адрес буфера dec_buf десятичного ASCII- числа размером 6 байт.

Выход: десятичное ASCII- число в буфере dec_buf (знак+5цифр),

ax – сохраненный двоичный дополнительный код.

Дополнительные условия: младший разряд десятичного ASCII -числа должен располагаться в последнем, старшем по адресу, байте буфера.*/

Proc Bin_#dec

push dx di cx

push ax ;Сохраним знак преобразуемого числа

mov cx,6 ;Размер буфера в байтах

Blank: mov [byte bx],' ' ;Очистим буфер, т.е. заполним его пробелами

inc bx

loop Blank

dec bx ;Установим адрес последнего элемента буфера

mov di,10 ;Введём основание десятичной системы счисления

or ax,ax ;Установим флаг знака SF

jns trans ;Перейдём к преобразованию, если SF=0

neg ax ;Изменим знак

trans: sub dx,dx ;Сделаем dx=0

div di ;ax=quot(dx:ax/10), dx=rem(dx:ax/10)

add dl,'0' ;Сформируем десятичную ASCII-цифру

mov [byte bx],dl ;Занесём в буфер

dec bx ;Движение назад

or ax,ax ;Преобразование закончено?

jnz trans ;Повторить, если АХ>0

pop ax ;Восстановить исходное число,

or ax,ax ;с целью определения его знака

jns out_ trans ;Выходим из подпрограммы, если SF=0

mov [byte bx],'-' ;Запишем знак '-' для отрицательного числа

pop cx di dx

out_trans: ret

Endp Bin_#dec

End

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]