Пример простой программы
В данном разделе рассмотрим пример простой, но полноценной программы на ас-
семблере. В главе 2 при обсуждении архитектуры было перечислено большое ко-
личество регистров. Как правило, большинство из них задействовано практически
в любой программе. Было бы интересно во время работы программы посмотреть
(получить) их содержимое. Это нетрудно, если использовать специальную про-
грамму — отладчик. Но как сделать это динамически и автономно (без помощи
других программ)? Или, к примеру, как решить обратную задачу — ввести некото-
рое значение с клавиатуры в регистр? Эта и подобная ей задачи являются задача-
ми преобразования данных. Они довольно часто возникают на практике. Причина
здесь в том, что компьютер воспринимает данные только тех типов, которые под-
держиваются его системой команд. Поэтому на практике часто возникает необхо-
димость преобразования данных из одного представления в другое. В этой главе
в качестве примера рассмотрим частный случай решения одной из таких задач —
задачи преобразования
числа из двух цифр, вводимого с кла-
виатуры (то есть в символьном виде), в двоичное число. После выполнения этой
операции полученное число можно использовать как операнд в двоичных ариф-
метических операциях.
Для начала нужно продумать алгоритм и изучить предметную область. Ввод
информации с клавиатуры и вывод ее на экран осуществляются в символьном виде.
Кодирование этой информации производится согласно таблице ASCII. В таблице
ASCII каждый символ кодируется одним байтом. Если работа происходит с чис-
лами, то при попытке их обработать сразу возникает проблема: команд для ариф-
метической обработки чисел в символьном виде нет. Что делать? Выход очевиден:
нужно преобразовать символьную информацию в формат, поддерживаемый ма-
шинными командами. После такого преобразования нужно выполнить необходи-
мые вычисления и преобразовать результат обратно в символьный вид. Затем сле-
дует отобразить информацию на мониторе.
Рассматриваемая в этом разделе программа является одним из вариантов ре-
шения задачи. В основу ее алгоритма положена особенность, связанная с ACSII-
кодами символов соответствующих
цифр. Шестнадцатерич-
цифры формируются из символов
9, А, В, С, D, E, F,
с, d, e, f, например:
12Af, 34ad. В таблице ASCII можно найти значения ASCII-кодов, соответствую-
щие этим символам. На первый взгляд, непонятна популярность способа представ-
ления информации в виде шестнадцатеричных чисел. Из предыдущих
извест-
но, что аппаратура компьютера построена на логических микросхемах и работает
только с двоичной информацией. Если нам требуется проанализировать, например,
состояние некоторой области памяти, то разобраться в нагромождении нулей и еди-
ниц будет очень непросто. Для примера рассмотрим двоичную последовательность
010100010101011110101101110101010101000101001010.
Глава 6. Первая программа
Это представление не очень наглядно. В главе 2 отмечалось, что оперативная
память состоит из ячеек — байтов — по 8 битов. Приведенная выше цепочка битов
при разбиении ее на байты будет выглядеть так:
01010001 01010111 10101101 11010101 01010001 01001010.
С наглядностью стало лучше, но если исследуемая область памяти окажется
больше, то разобраться будет все равно сложно. Проведем еще одну операцию: каж-
дый байт разобьем на две части по 4 бита —
0101 0001 0101 0111 1010 1101 1101 0101 0101 0001 0100 1010.
И вот тут проявляется замечательное свойство
чисел —
каждой тетраде можно поставить в соответствие одну
цифру
(табл. 6.1).
Таблица
Кодировка шестнадцатеричных цифр
Шестнадцатеричная
цифра
0
1
2
3
4
5
6
7
8
9
А, а
с
31h
(ООН 0001)
32h
33h
34h
35h
37h (ООН 0111)
38h
1001)
41h (0100 0001), 61h
0001)
42h (0100 0010), 62h (0110 0010)
43h (0100
63h
44h (0100 0100), 64h (0110 0100)
45h (0100
65h (0100 0101)
46h (0100 0110), 66h (0110 0110)
Двоичная
тетрада
0000
0001
0010
ООП
0100
0101
оно
0111
1000
1001
1010
1011
1100
1101
1110
1111
Если заменить в последней полученной строке тетрады соответствующими
цифрами, то получим последовательность 51 57 ad d5 51 8а.
Каждый байт теперь наглядно представлен двумя шестнадцатеричными циф-
рами, что оказывается очень удобным, в частности, при работе с отладчиком.
Вернемся к нашей задаче. Если посмотреть внимательно на представление
шестнадцатеричных цифр и их кодировку в
(табл.
то можно уви-
деть полезные закономерности. К примеру, ASCII-код нуля (код символа 0) в ше-
стнадцатеричном виде равен 30h. В двоичном представлении 30h записывается как
Пример простой программы
0000, а соответствующее двоичное число должно быть двоичным представле-
нием нуля 0000 0000. Отсюда следуют некоторые выводы.
Do'stlaringiz bilan baham: |