Иллюстрированный самоучитель по задачам и примерам Assembler

Вывод чисел на консоль. Вывод шестнадцатеричных чисел.

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


Умение работать с шестнадцатеричными числами – необходимое условие успешного программирования на низком уровне. Шестнадцатеричные числа по сравнению с двоичными являются более естественными для анализа внутреннего представления информации в компьютере. Вспомним, что каждый байт – это совокупность двух тетрад, а диапазон значений, представимых одной тетрадой, как раз совпадает с диапазоном значений, которые может принимать однозначное шестнадцатеричное число. Поэтому сам процесс преобразование шестнадцатеричных чисел в символьное представление особого труда не представляет. Например, алгоритм вывода на консоль содержимого одного байта состоит в выделении некоторым способом значений его младшей и старшей тетрад и дальнейшее их преобразование в символьное представление. Если нужно вывести на консоль символьное представление более чем одного байта, то процесс выделения тетрад и их преобразования выполняется последовательно необходимое количество раз.

В качестве полезной иллюстрации алгоритма преобразования шестнадцатеричной информации в символьное представление рассмотрим макрокоманду 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 <al>.<&arg_n>
:если аргумент=а1 или AL.?reg8bit=TRUE установка флага 8-битового регистра
mov ah.al ENDIF
;передан не al или AL
IFIDNI <ah>.<&arg_n>:если аргумент-ah или АН.
?reg8bit=TRUE – . установка флага 8-битового регистра
ENDIF
;передан не АН или ah
IFIDNI <ax>.<&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
Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.