В этом разделе мы рассмотрим алгоритмы обратного
преобразования чисел — из внутреннего двоичного представления в число в
символьном виде, формат записи которого соответствует правилам требуемой
системы счисления. Необходимо предупредить читателя, что рассмотрение
обратного преобразования не будет симметричным рассмотренному выше
прямому преобразованию. И в подтверждение этому начнем обсуждение
проблемы вывода чисел на консоль с алгоритма преобразования
шестнадцатеричных чисел в символьное представление.
Вывод шестнадцатеричных чисел
Умение работать с шестнадцатеричными числами — необходимое
условие успешного программирования на низком уровне. Шестнадцатеричные
числа по сравнению с двоичными являются более естественными для анализа
внутреннего представления информации в компьютере. Вспомним, что каждый
байт — это совокупность двух тетрад, а диапазон значений, представимых
одной тетрадой, как раз совпадает с диапазоном значений, которые может
принимать однозначное шестнадцатеричное число. Поэтому сам процесс
преобразование шестнадцатеричных чисел в символьное представление
особого труда не представляет. Например, алгоритм вывода на консоль
содержимого одного байта состоит в выделении некоторым способом значений
его младшей и старшей тетрад и дальнейшее их преобразование в
символьное представление. Если нужно вывести на консоль символьное
представление более чем одного байта, то процесс выделения тетрад и их
преобразования выполняется последовательно необходимое количество раз.
В качестве полезной иллюстрации алгоритма преобразования
шестнадцате-ричной информации в символьное представление рассмотрим
макрокоманду 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
mov ah.al ENDIF
;передан не al или AL
IFIDNI
?reg8bit=TRUE -.установка флага 8-битового регистра
ENDIF
;передан не АН или ah
IFIDNI
?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