Микро ЭВМ "ZX Spectrum" 1969 г.

Математические основы программирования на машинном языке. - введение. Шестнадцатиричное кодирование. Абсолютная арифметика. Дополнительная арифметика. Интегральное представление. Представление с плавающей запятой.


ГЛАВА 4. Математические основы программирования на машинном языке.

4.1. Введение.

В микропроцессорных системах, основанных на Z8 0, какой является СПЕКТРУМ, все данные передаются восьмибитовыми комбинациями . наиболее правильно описывать представление этих битов 8-ми битовыми двоичными числами. Но такое представление трудно для работы, и поэтому программисты, пишущие программы на уровне машинных кодов, обычно используют шестнадцатиричное представление.

В этой главе по очереди будут рассмотрены шестнадцатиричное представление, абсолютная двоичная арифметика, интегральное представление и представление чисел с плавающей запятой. Первые три раздела применимы к любым 8-ми битовым микропроцессорным системам, в то время как последние два специфичны для "СПЕКТРУМа".

4.2. Шестнадцатиричное кодирование.

Принципы, лежащие в основе шестнадцатиричного кодирования, состоят в описании чисел от 0 до 9 и добавлении 6 знаков, обозначаемых буквами от А до F. Следующая таблица показывает соответствие двоичного, десятичного и шестнадцатиричного представления для чисел 0 - 15.

двоичные десятичные шестнадцатиричные

0000 0 0 0001 1 1 0010 2 2 0011 3 3

0100 4 4

0101 5 5 0110 6 6 0111 7 7 1000 8 8 1001 9 9

1010 10 A

1011 11 B

1100 12 C

1101 13 D

1110 14 E

1111 15 F

Как можно видеть из таблицы, одна шестнадцатиричная цифра записывается 4 битовыми двоичными. Поэтому восьмибитовое двоичное число записывается парой шестнадцатиричных знаков , а шестнадцатибитовое -- 4-мя шестнадцатиричными знаками .

Следующие примеры это иллюстрируют: 0000 0000 (двоичное) = 00 (шестнадцатиричное) 0100 1111 (двоичное) = 4F (шестнадцатиричное) 0000 0000 0000 0000 (двоичное) = 0000 (16-ричное) 0100 1100 1010 1111 (двоичное) = 4CAF (16-ричное). Преобразование чисел из одной системы в другую для большинства людей трудно даже после месяцев и лет тренировки, но это очень полезное искусство. Тем не менее, очень просто написать программу, выполняющую эту работу.

Следующая программа на БЕЙСИКЕ переводит числа из десятичной системы в шестнадцатиричную:

10 INPUT "Decimal number?", D 20 IF D > 65535 THEN GO TO 170 3 0 PRINT "Decimal", D 40 DIM H(4) 50 DIM H$ (4)

60 LET H(1)=INT (D/4096) 70 LET D = D - H(1)*4096 80 LET H(2) = INT (D/256) 90 LET D = D - H(2)*256 100 LET H(3) = INT (D/16) 110 LET D = D - H(3)*16 120 LET H(4) = D 13 0 FOR A = 1 TO 4

140 LET H$(A) = CHR* H(A) + 48 + 7*H(A) + 9)) 150 NEXT A

160 PRINT "Hexadecimal" H$ 170 PRINT 180 GO TO 10

В программе десятичное значение последовательно уменьшается для поиска шестнадцатиричного эквивалента. Строки 130-150 переводят эти значения в код ASCII.

Следующая программа показывает шестнадцати-десятиричное преобразование:

10 DIM H* (4)

20 INPUT "Hex characters", H$ 30 IF CODE H* = 32 THEN GO TO 20 40 LET D = 0 50 FOR A = 1 TO 4

60 IF H$(1) = CHR$32 THEN GO TO 100

70 IF H$(A)<"0" OR H$(A)>"9" AND H$(A)<"A" OR H$(A)>"F" THNEN GO TO 12 0

80 LET D=D+16**(4-A)*(CODE H$(A)-48-7*CODE H$(A) 57))

90 NEXT A 100 PRINT "Hexadecimal", H$ 110 PRINT "Decimal", D

12 0 PRINT

13 0 GO TO 2 0

В программе строка шестнадцатиричных знаков не всегда имеет 4 знака. Если значение не задано пользователем,требование всегда повторяется.

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

Например, шестнадцатиричное число: 78 9А

Десятичный эквивалент = 7 * 4096 = 28672

8 * 256 = 2048

9 * 16 = 144

А * 1 = 10

78 9А = 30874

Или попарно:

Десятичный эквивалент = 78 * 256 = 30720

9А * 1 = 154

78 9А = 30874

4.3. Абсолютная арифметика.

Одинарный регистр или адрес памяти содержит восьмибитовое двоичное число. Это число может быть в двоичном диапазоне 0000 0000 - 1111 1111, десятичном 0 - 256, или шестнадцатиричном 0 0 - FF. Ни в одном из этих случаев число не может быть ни отрицательным, ни дробным, и это образует основу абсолютной двоичной арифметики -- значение в памяти или регистре всегда положительное и целое.

Также важно представлять себе, что значение, содержащееся в памяти или регистре изменяется циклически в пределах 0 - 255. Это означает,что, если в операции сложения полученный результат превышает 255, окончательный результат записывается после вычитания 256; при вычитании к значению меньше нуля прибавляется 256.

Это показано на следующих примерах:

252 + 44 дает 40

или

FC + 2C дает 28

87 - 200 дает 143

или

57 - С3 дает 8F

Флаг переноса действует в большинстве операций, требующих переноса. Для дальнейшей детализации см. главу 5.

В системах, основанных на Z8 0, все числа представлены в абсолютной двоичной арифметике, но программист часто нуждается в различных интерпретациях чисел, таких, как положительное или отрицательное целое или дробное. Следующие три раздела главы рассматривают использование в системе "СПЕК-ТРУМа" различных видов интерпретации чисел.

4.4. Дополнительная арифметика.

Принцип дополнительной арифметики очень прост. Но при использовании ее в программах результат может быть очень неожиданным.

Метод позволяет программисту рассматривать двоичные значения в интервале 0000 0000 - 0111 1111 как эквивалент десятичных значений 0 - 127, а двоичные значения в интервале 1000 0000 - 1111 1111 как эквивалент десятичных значений -128 - -1

В результате такой интерпретации бит 7 ( левый крайний бит восьмибитового числа рассматривается как знаковый. Он будет нулевым для положительных чисел, и будет иметь значение 1 для отрицательных.

На диагр. 4.1. показывается принцип дополнительной арифметики для восьмибайтовых чисел.

Заметим, что возможно распространить принципы дополнительной арифметики и на шестнадцатибитовые числа. В этом случае интервал возможных значений чисел будет от -32768 до 32768 десятичных.

Преобразование отрицательных десятичных чисел в дополнительную двоичную или шестнадцатиричную форму просто, но часто легче сослаться на соответствующую таблицу.

1. Найдите двоичную форму для абсолютного двоичного значения, например -54 -- 0011 0110.

2. Получите обратный код - надо изменить нули на единицы и обратно: 0011 0110 -- 1100 1001.

3. Прибавьте единицу.

1100 1001 + 1 = 1100 1010.

4. Используйте двоичную форму или переведите его в шестнадцатиричную: -54 в дополнительном коде: 1100 1010 или CA.

Операции можно провести в обратном порядке для перевода числа в дополнительном коде в десятичный вид.

4.5. Интегральное представление.

Интерпретатор Бейсика в системе СПЕКТРУМа использует 5 байт для представления чисел. Целые числа, например, находящиеся в интервале -65536 -- +65536 включительно записывают в целой форме, в то время как дробные или целые вне этого диапазона записываются в 5 байтах числа с плавающей запятой.

В целой форме первый байт всегда нулевой. Второй байт содержит 0, если число положительное, и 255 (FFh), если оно отрицательное. Третий и четвертый байты содержат целое значение как шестнадцатибитовое беззнаковое число в дополнительном коде, но третий байт содержит всегда младшую часть, а четвертый -- старшую. Пятый байт не используется, но всегда содержит 0.

Следующая программа демонстрирует целую форму (в десятичном виде для любых целых чисел, вводимых пользователем. Строка 20 программы гарантирует получение целой формы).

10 INPUT N

20 IF N <> INT N OR N < -65535 OR N > 65535 THEN GO TO 10 3 0 PRINT "Number chosen=", N 40 LET V = PEEK 23627 + 256 * PEEK 23628 50 FOR A = 1 TO 5

60 PRINT A; "."; TAB 5; PEEK (A + V) 70 NEXT A 80 GO TO 10

Диаграмма 4.1.

двоичное десятичное 16-ричное

0111 1111 +127 7F

0111 1110 +126 7E

Положительные значения

0000 0010 +2 02 0000 0001 +1 01

0000 0000 0 00

1111 1111 -1 FF

1111 1110 -2 FE

Отрицательные значения

1000 0001 -127 81

1000 0000 -128 80

L знаковый бит

Диагр. 4.1

В приведенной выше программе указатель указывает на начало поля переменных и адреса с +1 до +5 будут содержать 5 байт введенного числа.

Программа дает результаты в виде:

Выбрано значение 0 1. 0 2 . 0

3 . 0

4 . 0

5 . 0

так как 0 положителен, представляется он как 0*1 + 0*256 .

Выбрано значение 1516 1. 0 2 . 0

3 . 236

4 . 5

5 . 0

так как 1516 --положительное, представляется оно как 236* 1 + 5*256 Выбрано значение -1 1. 0

2 . 255

3 . 255

4 . 255

5 . 0

так как -1 -- отрицательное и представляется оно FFFF. Замечание: ошибкой программирования будет перевод 0 как -65536. Это значение не соответствует целой форме 0,255,000 (см. приложение IY).

4.6. Представление с плавающей запятой.

Пять байтов, используемых в СПЕКТРУМе для предоставления числа с плавающей запятой, позволяют хранить числа в диапазоне 29E-38 - 1.7E38 (приблизительно).

Нулевое значение всегда хранится в памяти как пять нулевых байтов. Все остальные значения хранятся: экспонента в первом байте, мантисса -- в остальных четырех. Теория описания чисел в терминах экспоненты и мантиссы первоначально появилась в десятичной записи,поскольку в ней легче работать Нахождение экспоненты и мантиссы для десятичного числа это, в сущности, перевод числа в E-формат. Рассмотрим число 12345, которое в Е формате может быть представлено как .12345Е+5.Для получения мантиссы десятичная точка сдвигается влево до тех пор, пока она установится перед старшей значащей цифрой. Экспонента -- число необходимых сдвигов, мантисса -- дробное десятичное число. Экспонента равна +5; мантисса -- .12345.

Поскольку система СПЕКТРУМ имеет дело скорее с двоичными числами, чем с десятичными, подобные операции могут быть рассмотрены для двоичного числа.

Рассмотрим двоичное число 0001 1111, что эквивалентно

+ 31.

Двоичная точка лежит справа от 3 бита и требует 5 сдвигов, чтобы перевести ее перед старшим значащим битом. Поэтому экспонента = +5, мантисса = .1111 1000.

В СПЕКТРУМе после этого производится еще некоторые действия. Так, для экспоненты: правильная экспонента, как выше +5 увеличивается на десятичное значение +128 (16-ричное 80). В нашем примере +5 + 128 = 133.

Для мантиссы:

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

В десятичном виде для плавающей арифметики +31 записывается как 133,120,000

В шестнадцатиричном как 85,78,00,00,00.

И, если хотите, в двоичном 1000 0101 0111 1000 0000. Подобная операция позволяет переводить отрицательные и дробные числа, хотя и не так просто.

Следующая программа показывает десятичную форму плавающих чисел. Включение строки 3 0 гарантирует, что не всегда получится плавающая форма числа.

10 INPUT N

20 IF N = 0 THEN GO TO 40

30 LET N=N+.2E-38

40 PRINT "Number chosen =";N

50 PRINT

60 PRINT "Exp="; TAB 9; "Mantissa"

70 LET V=PEEK 23627 +256*PEEK 23628

80 PRINT PEEK (V+1); TAB 9;

9 0 FOR A=2 TO 5 100 PRINT PEEK (V+1); CHR$32 110 NEXT A 12 0 PRINT 130 GO TO 10

Приведенная выше программа даст следующие результаты:

1 = 129 0000

2 = 130 0000 35456 = 144 1012800 -1 = 129 128000 -35456= 144 13812800 0.333 = 131 74167239158

Интересно заметить, что .5 и 1/2 дадут различные значения (см. приложение IY для дальнейшей детализации).

.5 = 127 127255255255 1/2 = 128 000




СОДЕРЖАНИЕ:


  Оставте Ваш отзыв:

  НИК/ИМЯ
  ПОЧТА (шифруется)
  КОД



Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
Система - Обзор системных программ: ZX Tools DeLuxe v 2.0
Вступление - содержание номера.
Тосты - Одно время я увлекался собиранием различных тостов. И видимо пришло время их опубликовать - может кому-нибудь и пригодятся!

В этот день...   19 декабря