Сборник по задачам и примерам 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

Содержание раздела