К а к п р е д с т а в л я е т с я и н ф о р м а ц и я
В представлении информации человеком и ЭВМ имеется
существенная разница. У человека информация в основном
состоит из чисел и литер (алфавитно-цифровая информация),
тогда как вся информация в ЭВМ хранится в виде групп битов.
Бит означает двоичный разряд (BINARI DIG JT. "0" или
"1"); в микропроцессоре Z80A эти биты сгруппированы по 8.
Группа В из 8 битов называется байтом.
Такой способ представления информацци с помощью
двоичных разрядов называется двоичным форматом. Такова
структура языка, на котором разговаривает Z80 и большинство
ЦП микро-ЭВМ. В основном имеется два типа информации,
представляемой внутри "Спектрум". Первый - это программа.
Второй - данные, над которыми программа будет действовать и
которые могут включать числа или алфавитно-цифровой текст. Мы
так и будем рассматривать эти три представления: программа,
числа, алфавитно-цифровой текст.
П р е д с т а в л е н и е п р о г р а м м ы
Программа - последовательность команд ЦП выполнить
конкретное задание, которое можно разбить на некоторое число
"подразделений". В Z80 все команды имеют внутреннее
представление в виде одного или нескольких байтов. Команды ,
представленные одним байтом, называются короткими командами.
Более длинные команды представляются двумя или несколькими
байтами.
Поскольку Z80 - восьмиразрядный микропроцессор, он
может за один раз обрабатывать только один байт, и если ему
требуется более одного, он ведет последовательный поиск
байтов в памяти. Поэтому в общем случае однобайтовая команда
будет выполняться быстрее, чем двух- или трехбайтовая. Таким
образом, как правило выгодно писать программу на машинном
языке, применяя (где можно) однобайтовые команды. Вы можете
посмотреть короткие и длинные команды в таблице кодов команд
в приложении. Пусть вас не беспокоит, что они непонятны.
Позже мы рассмотрим каждую команду более глубоко.
Представление числовой информации
---------------------------------
П р е д с т а в л е н и е ц е л ы х ч и с е л
Выше мы отмечали, что из-зи способа конструирования
Z80 мы не можем представлять такие числа, как 11,53. ЦП может
работать только с целыми числами. Кроме того, используя
только 8 пальцев (т.е. 8-разрядные числа), мы могли бы
представлять все числа из диапазона от 0 до 255. Например,
десятичное 255 представляется как FFH, или в двоичном виде
1 1 1 1 1 1 1 1 .
Ну а как с отрицательными числами?
П р е д с т а в л е н и е ц е л ы х ч и с е л
с о з н а к о м
Напомним, что байт - это рука с 8 пальцами и число
представляется с помощью отгибания различных пальцев.
Очевидно, чтобы представить целое число со знаком в двоичном
формате, нам необходим некоторый способ представления
положительных и отрицательных чисел. Давайте считать, что для
представления отрицательного числа мы принимаем следующую
систему обозначений: число, представленное на руке ЦП, будет
считаться отрицательным, если у ЦП отогнут большой палец. В
терминологии ЭВМ старший бит - бит 7 - установлен.
Итак, у нас остается всего 7 пальцев (битов) для
представления значения числа. Это значит, что наибольшим
числом, которое можно представить, уже не будет 255. На самом
деле половина чисел, которые могут содержаться на одной руке
(в одном байте), будут отрицательными, а другая половина -
положительными, в зависимости от того, загнут большой палец
или нет.
Полный диапазон чисел, представленных на одной руке,
если допускаются отрицательные числа, будет тогда от -128 до
+127. Обратите внимание, что весь диапазон чисел, которые
можно представить, по прежнему будет состоять из 256 чисел. И
вот здесь возникает трудность: когда число с поднятым большим
пальцем будет положительным числом, а когда - отрицательным?
Ответ: все зависит от вас. Вы сами должны сделать
выбор: числа могут лежать либо в диапазоне от 0 до 255, либо
от -128 до +127, но никак не в двух диапазонах сразу. Это вы,
программист, должны решить, какую систему обозначений
применять в конкретный момент. Все команды будут действовать
одинаково хорошо независимо от того, предпочтете ли вы, чтобы
все числа в регистрах памяти были положительны или чтобы они
были и положительными и отрицательными.
ВЫБОР ПРЕДСТАВЛЕНИЯ ОТРИЦАТЕЛЬНЫХ ЧИСЕЛ
Мы уже решили, что подъем большого пальца будет
обозначать отрицательное число, а его загибание -
положительное. Достаточно ли этого?
Нет. Мы должны решить, какая из 127 возможных
комбинаций остальных 7 пальцев будет обозначать -1, какая -2
и т.д. Нам необходимо представление отрицательных чисел
такое, что при сложении числа с противоположным ему будет
получаться 0. В качестве упражнения давайте подумаем, какое
число при сложении с 1 дает 0. Это, очевидно, будет -1 и мы
уже знаем, что большой палец - бит 7 - будет поднят:
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
1 ? ? ? ? ? ? ? ( COULD IT BE=)? 1 0 0 0 0 0 0 1
---------------- 1 -----------------
0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0
1 - можно ли так?
Давайте попробуем 1 0 0 0 0 0 0 1, иными словами, то
же самое, что и +1, но с поднятым большим пальцем. Чтобы
проверить будет ли это -1, попробуем сложить его с +1. Из
вышеизложенного следует, что сумма 1 0 0 0 0 0 1 0, очевидно,
не даст правильного ответа. Если бы это было нужное нам
число, то ответ равнялся бы 0 0 0 0 0 0 0 0. Очевидно, нам
нужно число, принимающее перенос из бита 0 и преобразующее
его в последовательность нулей. Вы можете сами попробовать
проделать это и вы увидите, что единственным числом, дающим
правильный ответ, будет 1 1 1 1 1 1 1 1 (шестнадцатеричное
FFH). Удостоверимся в этом:
0 0 0 0 0 0 0 1
1 1 1 1 1 1 1 1
1 - -----------------
(CARRY) 0 0 0 0 0 0 0 0
1 - перенос
Существует ли способ выработать на основании этого
примера общее правило для любого отрицательного числа?
Похоже, что нужно взять отрицание числа и добавить 1 в конце.
Испробуем это правило на другом числе, таком скажем, как 3:
3 = 0 0 0 0 0 0 1 1
1 OPPOSITE 1 1 1 1 1 1 0 0
2 ADD 1 => 1 1 1 1 1 1 0 1 (FDH)
1 - отрицание; 2 - добавлена единица
Давайте сложим это число с 3 и посмотрим, что
получится:
0 0 0 0 0 0 1 1
/ 1 1 1 1 1 1 0 1
1 / -----------------
(CARRY)-/ 0 0 0 0 0 0 0 0
1 - перенос
Получилось!
Мы нашли способ представления отрицательных чисел:
-01 => FF
-02 => FE
-03 => FD и т.д.
Наибольшее положительное число будет
0 1 1 1 1 1 1 1 = 7F => 127 десятичное
а противоположное ему будет
1 0 0 0 0 0 0 1 = 81 => -127 десятичное
Настоящей проверкой этого правила будет посмотреть,
вернемся ли мы к положительному числу, применив его к
отрицательному числу. Давайте попробуем это на числе -3, для
которого выше мы получили значение FDH.
1 NUMBER 1 1 1 1 1 1 1 1
2 OPPOSITE 0 0 0 0 0 0 1 0
3 ADD 1 => 0 0 0 0 0 0 1 1
1 - число; 2 - его отицание; 3 - добавлена 1
Итак, это представление срабатывает. Мы можем
применять его, чтобы получить для любого числа
противоположное ему.
16-разрядные отрицательные числа
В точности те же самые рассуждения приложим к числам
для двух рук (16-разрядным числам), но только нужно поднимать
большой палец одной руки, чтобы показать отрицательно ли
число (т.е. бит 7 старшего байта).
Условное обозначение
В терминологии ЭВМ это условное обозначение
называется "дополнением до двойки". Таблицы значений
дополнений до двойки для отрицательных десятичных чисел вы
можете найти в приложении к этой книге. Помните, что это
только условные обозначения. Вам все-таки придется все время
решать, должны ли используемые вами числа обозначать числа от
0 до 255 или от -128 до +127.
Упражнение
1. Если 127 (0 1 1 1 1 1 1 1) - наибольшее
положительное число, которое можно представить с помощью этих
условных обозначений, то как вы представите -128?
2. Найдите наибольшее положительное и наименьшее
отрицательное 16-разрядные числа (из двух рук /байтов/).
3. Найдите дополнение до двух наименьшего
16-разрядного отрицательного чмсла 8000H. Почему это будет
8000Н?
ПРЕДСТАВЛЕНИЕ АЛФАВИТНО-ЦИФРОВЫХ ДАННЫХ
Иногда мы не хотим, чтобы в машинном языке числа
представляли команды ЭВМ или были предназначены для
вычислений. Мы можем хотеть, чтобы они просто служили
символами литер и чисел. Например, заглавием вашей последней
программы, возможно названной "1-ая в мире программа". Наша
система обозначений алфавитно-цифровых данных,т.е. литер,
достаточно прямолинейна: все литеры и числа могут
представляться на одной руке (т.е. в 8-разрядном коде).
В мире ЭВМ есть два стандарта представления
алфавитно- цифровых литер: код ASCII и код ABCDIC.
ASCII - означает "Американский стандартный код
обмена информацией", широко применяется в промышленности
микро-ЭВМ.
ABCDIC - вариант ASCII, применяемый фирмой IBM.
В "ZX Спектрум" алфавитно-цифровые литеры
удовлетворяют стандарту ASCII, за исключением литер ФУНТ
(61Н) и авторское право (7Н). Таблицу преобразования ASCII вы
мохете найти в приложении. Сравните ее с таблицей набора
литер в приложении А руководства вашего "Спектрум",
стр.183-186.
Попробуйте задать предложение:
PRINT CHR& 33
и получите в результате (!), поскольку внутренним
представлением (!) будет 21Н.
Помощь: мы только что показали, что можно говорить,
что рука ЦП представляет самые разные вещи. Это может быть:
- команда ЦП из программы;
- число из диапазона от 0 до 255;
- число из диапазона от -128 до +127;
- часть числа для двух рук;
- алфавитно-цифровая литера.
Все это верно, и это вы, программист, должны
помнить, что именно должно храниться на руке ЦП.
В Ы В О Д Ы
Содержимиое памяти
В памяти "Спектрум" могут по желанию храниться
программы, числа или текст. Нет никакого способа сказать, что
есть что, просто анализируя содержимое отдельной ячейки
памяти.
Программы
Команды программ храняться в памяти в виде
последовательнос- тей байтов. Некоторым командам треюуется
всего один байт. А другим - до 4 байтов.
Числа
Каждая ячейка памяти может использоваться либо для
хранения положительных целых чисел, либо целых чисел со
знаком (чисел, которые могут быть и положительными и
отрицательными) по вашему выбору. Диапазон чисел может быть
либо от 0 до 255, либо от -128 до +127.
Отрицательные числа
Было принято соглашение, что когда мы решаем, что в
памяти будет храниться число со знаком (+ или -), применяется
следующее правило:
- если бит 7 установлен, то число отрицательно;
- если бит 7 не установлен, число положительно.
Чтобы получить число, противоположное любому
заданному числу, нужно взять "дополнение до двух" и прибавить
1.
Дополнение до двух
Дополнение любого числа до двух - это его отрицание
в двоичном формате. Любой установленный бит сбрасывается и
наоборот.