В этом разделе мы рассмотрим алгоритмы обратного преобразования чисел — из внутреннего двоичного представления в число в символьном виде, формат записи которого соответствует правилам требуемой системы счисления. Необходимо предупредить читателя, что рассмотрение обратного преобразования не будет симметричным рассмотренному выше прямому преобразованию. И в подтверждение этому начнем обсуждение проблемы вывода чисел на консоль с алгоритма преобразования шестнадцатеричных чисел в символьное представление.
Вывод шестнадцатеричных чисел
Умение работать с шестнадцатеричными числами — необходимое условие успешного программирования на низком уровне. Шестнадцатеричные числа по сравнению с двоичными являются более естественными для анализа внутреннего представления информации в компьютере. Вспомним, что каждый байт — это совокупность двух тетрад, а диапазон значений, представимых одной тетрадой, как раз совпадает с диапазоном значений, которые может принимать однозначное шестнадцатеричное число. Поэтому сам процесс преобразование шестнадцатеричных чисел в символьное представление особого труда не представляет. Например, алгоритм вывода на консоль содержимого одного байта состоит в выделении некоторым способом значений его младшей и старшей тетрад и дальнейшее их преобразование в символьное представление. Если нужно вывести на консоль символьное представление более чем одного байта, то процесс выделения тетрад и их преобразования выполняется последовательно необходимое количество раз.
В качестве полезной иллюстрации алгоритма преобразования шестнадцате-ричной информации в символьное представление рассмотрим макрокоманду SHOW, которая преобразует содержимое одного из четырех регистров — AL, АН, АХ, ЕАХ в символьное шестнадцатеричное представление. Этот макрос является универсальном средством, которое позволяет осуществить «подглядывание» за содержимым регистра или области памяти динамически, во время выполнения программы. С помощью этого макроса можно визуализировать содержимое любого
из доступных регистров или области памяти длиной до 32 бит. Для этого доста точно лишь переслать содержимое нужного объекта (регистра или ячейки памяти} с учетом его размера в один из регистров AL, АН, АХ, ЕАХ. Имя одного из этих регистров указывается затем в качестве фактического аргумента макрокоманды SHOW Второй аргумент этого макроса — позиция на экране. Задавая определенные значения, мы можем судить о том, какая именно макрокоманда SHOW сработала. Еще одна немаловажная особенность данного макроса состоит в его возможности работать как в реальном, так и защищенном режимах. Распознавание текущего режима работы микропроцессора выполняется автоматически. Проверить работу данного макроопределения вы можете с помощью следующей программы.
Ниже приведены фрагменты текста макрокоманды SHOW. Полный текст этой макрокоманды имеется в ПРИМЕРе.

:show.inс
макроопределение для визуализации регистров AL. АН. АХ. ЕАХ
;:на входе:
:;агд_п - имя одного из регистров AL. АН, АХ. ЕАХ
;;п_ро2 - номер позиции на экране, по умолчанию - 1000
Show MACRO a rg_n.n_poz:=<1000>
LOCAL mai n_part.di sp.pause.tempi ate,VideoBuffer.pjnode.ml.m2
:;переход на начало блока команд, чтобы избежать выполнения данных
jmpmain_part ;:некоторые константы и переменные
main_part: :начало блока команд
сохранение в стеке используемых регистров: ЕАХ. ЕВХ. ЕСХ. EDX. EDI. DS. ES
push cs
pop ds :в bx - адрес таблицы-шаблона (для xlat)
lea bx.cs:tempi ate
xor ex.ex :очистка сх
:начало блока определения того, какой регистр был передан макросу IFIDNI .<&arg_n> :если аргумент=а1 или AL. ?reg8bit=TRUE установка флага 8-битового регистра
mov ah.al ENDIF
;передан не al или AL
IFIDNI .<&arg_n> :если аргумент-ah или АН.
?reg8bit=TRUE -.установка флага 8-битового регистра
ENDIF
;передан не АН или ah
IFIDNI .<&arg_n> ;если аргумент равен ах или АХ,
?regl6bit=TRUE -.установка флага 16-битового регистра
ENDIF
;передан не ah. АН ,ах или АХ .¦ _ ,;.
обработка содержимого регистров AL. АН, АХ. ЕАХ IF (?reg8bit) -.если передан а! или ah -:"'"" "' push eax -.-'- ¦
and ah. Of Oh; обращение к старшей четверке битоВ'.-ah' shr ax. 12 -.сдвиг битов в начало (16-4=12) xlat трансляция таблицы-шаблона помещение символа из al в edi ¦¦j:\--.i ¦.;¦,.> -«-.iY ¦ ';¦' mov di.ax ¦ ¦ ,k ,-,,
shl di .8 inc ex pop eax and ax.OfOOh shr ax.8 xlat
or di.ax
shl edi. 16 . , ...
inc ex ENDIF ¦ IF (?regl6bit) ;если передан ах или ах
-.начало обработки значения регистра АХ push eax
-.обращение к старшей четверке битов ах .
and ax.OfOOOh .',.
shr ax.12 ;сдвиг битов в начало (16-4=12) xlat трансляция таблицы-шаблона ......
помещение символа из а! в старшую тетраду старшей половины ЕЩ . ",, mov di ,ax *i
shl edi.8
inc ex
pop eax push eax обращение ко второй четверке битов ах
and ax.OfOOh
' shr ax,8 ;сдвиг битов в начало (16-(4+4)=8)
xlat -.трансляция таблицы-шаблона
.помещение очередного символа в младшую тетраду старшей половины EDI
or di.ax
shl edi.8
inc ex ' ' . '' '".¦;;1
pop eax .
push eax
and ax.OfOh;обращение к третьей четверке битов в АХ -. v.'v
shr ax.4 ;сдвиг битов в начало (16-(4+4+4)=4) ¦xlat трансляция таблицы-шаблона
or di.ax -.помещение очередного символа в EDI
! shl edi.8
i nc ex
pop eax
and ax.Ofh обращение к младшей четверке битов АХ
xlat трансляция таблицы-шаблона
or di.ax помещение очередного символа в EDI
inc ex ENDIF
IF (?reg32bit) ;если передан ЕАХ или ЕАХ ;начало обработки значения регистра ЕАХ аналогично АХ
ENDIF
;вывод на экран результата с учетом режима работы микропроцессора результат - в паре EDX:ЕВХ. количество цифр - в СХ
:.........
ENDM