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