Программы преобразования данных для вывода на экран

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

Рассмотрим процедуру преобразования одного четырехразрядного шестнадцатиричного числа в символьную форму.

Обозначим: Hex_ ascii – имя процедуры получения символьного представления шестнадцатиричной цифры (четырехбитового двоичного числа).

Некоторые условия при входе в процедуру:

· исходное число должно находиться в младшей половине регистра AL;

· адрес строки, куда надо поместить результат, должно находиться в регистрах DS:SI.

При выходе из процедуры:

· символьное представление полученного числа расположено в памяти по адресу находящемуся в регистрах DS:SI;

· исходное содержимое регистра AL разрушается.

 

Программа на языке Ассемблера

.model small; задаём малую модель структуры программы.

.stack 300h; определяем размер сегмента стека в 300Н (768 байт).

.data; задаём начало и описываем сегмент данных.

tblhex db ‘0123456789ABCDEF’; строка шестнадцатиричных символов.

result db ‘*h’, ‘$’; строка результата перевода, знак ‘$’ означает конец

строки.

Hex dw 586Eh; исходное шестнадцатиричное число.

.code; задаём начало и описываем сегмент команд.

start: Mov ax,@data; загрузим адрес сегмента данных в АХ.

Mov ds,ax; перешлём его в регистр DS (инициализируем DS).

Lea SI,result; адрес результата перешлем в регистр SI.

Mov ax,Hex; исходное число перешлем в АХ.

And ax,0F000h; выделим из него старшую цифру.

Mov Cl,12; запишем в Cl количество сдвигов этой цифры.

Shr Ax,Cl; сдвинем содержимое АХ вправо на 12 разрядов.

Call Hex_ascii; передадим управление процедуре преобразования.

Mov ax,Hex; запишем в АХ исходное шестнадцатиричное число.

and ax,0F00h; выделим из него третью цифру.

Mov cl,8; запишем в Cl количество сдвигов этой цифры.

shr ax,cl; сдвинем содержимое АХ вправо на 8 разрядов.

inc si; увеличим si на единицу.

Call Hex_ascii; передадим управление процедуре преобразования.

Mov ax,Hex; исходное число перешлем в АХ.

and ax,00F0h; выделим из него вторую цифру.

mov cl,4; запишем в Cl количество сдвигов этой цифры.

shr ax,cl; сдвинем содержимое АХ вправо на 4 разряда.

inc si; увеличим si на единицу.

Call Hex_ascii; передадим управление процедуре преобразования.

Mov ax,Hex; запишем в АХ исходное шестнадцатиричное число.

and ax,000Fh; выделим из него первую цифру.

inc si; увеличим si на единицу.

Hex_ascii; передадим управление процедуре преобразования.

Mov Ah,09h; занесем в Ah номер функции OS вывода на экран.

Lea Dx,result; занесем Dx в адрес выводимой строки.

Int 21h; вызов DOS для обработки прерывания номер 21.

Jmp M2; передать управление в метку М2;

Hex_ascii proc; процедура преобразования шестнадцатиричной

цифры в символ для вывода на экран.

Push BX; сохраним в стеке содержимое регистра ВХ.

Lea BX,tblhex; занесем в ВХ адрес строки шестнадцатиричных

символов (адрес строки трансляции).

Xlat; команда перекодировки шестнадцатиричной цифры в

символ.

Mov [Si],al; запишем символ в строку результата перекодировки.

Pop BX; восстановим из стека содержимое регистра ВХ.

Ret; команда выхода из процедуры.

Hex_ascii endp; конец процедуры.

M2: Mov Ax,4С00h; запись в АХ кода выхода из программы (4С) и

кода удачного завершения программы.

int 21h; вызов DOS для обработки прерывания номер 21.

end start; конец программы с указанием точки входа.

 

Комментарии к процедуре

Исходное число предварительно пересылаем в регистр AL.

Для преобразования этого числа в символьный код используем команду табличной трансляции XLAT, которая выбирает необходимый код числа из строки tblhex по его номеру (индексу). Перед исполнением этой команды помещаем адрес строки трансляции в регистр BX.

Процедура Hex ascii вызвается из любого места в программе. Поэтому для того чтобы она не нарушала основную программу, первая команда процедуры сохраняет в стеке регистр BX, который затем настраивается на смещение в строке трансляции. После занесения в регистр AL преобразуемого числа, которое, согласно построению строки tblhex, является индексом требуемого символа можно выполнять команду xlat. Результат преобразования отправляется в ячейку памяти, по адресу находящемуся в регистре SI.

 

Преобразования десятичного числа в ASCII формат

Для отображения на экране арифметического результата в десятичной системе счисления его преобразуют в специальные коды представления данных – ASCII-формат.

Для представления результата вычисления в ASCII формате (американском стандартном коде обмена информацией) необходимо результат перевести в десятичную систему счисления и перед каждой цифрой результата дописать цифру 3.

Операция перевода в десятичную систему представляет собой процесс последовательного деление двоичного числа на 10 (ОАh), пока частное не станет меньше 10.

Остатки, которые лежат в границах от 0 до 9, образуют число в ASCII формате. В качестве примера рассмотрим преобразование шестнадцатиричного числа 4D2h в десятичный формат:

Частное Остаток

4D2 / А = 7В 4

7В / А = С 3

С / А = 1 2

Так как последнее частное равно 1, то есть меньше, чем 0Аh (10), то операция завершена. Остатки вместе с последним частным образуют десятичный результат преобразования, записываемый справа налево – 1234.

Таким образом, все остатки и последнее частное отделения должны записываться в память с тройками, то есть иметь следующий вид: 31323334.

Преобразование десятичного числа обычно выполняется специальной процедурой, которая добавляет к каждой десятичной цифре слева цифру 3, получая, таким образом, число в ASCII формате.

Пример процедуры преобразования десятичного числа в ASCII формат представлен ниже. Необходимо отметить, что в программе по адресу ASCVAL находится результат преобразования, а по адресу BINVAL- преобразуемое число.

 

Процедура преобразования десятичного числа в ASCII формат

BIASC PROC; имя процедуры.

Mov СХ,0010; занесем делитель в СХ.

Lea SI,ASCVAL+3; занесем адрес младшей цифры результата в

регистр SI.

Mov AX,BINVAL; загрузим в АХ преобразуемое двоичное число.
С20: Смр АХ,0010; проверим значение АХ, если меньше 10, то

Jb СЗ0; выйти из процедуры.

Xor DX,DX; обнулим частное.

Div СL; разделим содержимое АХ на 10.

Or DL,30h; преобразуем остаток в ASCII символ.

Mov [SI],DL; записать ASCII-символ в строку результата.

Dec SI; уменьшим адрес на единицу.

Jmp C20; перейдем безусловно в С20.

С30: Or AL,30H; запишем последнее частное

Mov [SI],AL; как ASCII-символ и

Ret; вернемся в основную программу.

BIAS ENDP; конец процедуры.

End BEGIN; конец программы.