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