КОД ДЛЯ ПРЕДСТАВЛЕНИЯ СИМВОЛЬНОЙ ИНФОРМАЦИИ (ASCII)
Если числа в компьютере хранятся в двоичной форме, то как в нем хранятся буквы или другие символы? Тоже в двоичной форме, только в специальном коде, который был принят в качестве промышленного стандарта много лет назад, ASCII1 (стандартный американский код для обмена информацией). В табл. 7.1 приводятся все символы системы и их цифровые представления как в шестнадцатиричной, так и в десятичной форме.
Символы, помещенные в первом столбце (имеющие шестнадцатиричные коды 0 - 1F), называются управляющими, так как они указывают, что терминал или компьютер должен выполнить, например подать звуковой сигнал, вернуть каретку на одну позицию, начать новую строку и т. д. Остальные символы называются печатными, поскольку они выводят на печать видимые символы, включая буквы, цифры от 0 до 9, все доступные символы и даже пробел (шестнадцатиричный код 20). Единственным исключением является символ DEL (шестнадцатиричный код 7F), который предписывает компьютеру игнорировать последний переданный символ.
В первой главе мы ввели слово EMIT, которое берет из стека значение в коде ASCII и посылает его на терминал для распечатки этого значения в виде символа, например: 65 EMIT A ok 66 EMIT В ok
(Мы используем десятичное, а не шестнадцатиричное представние, потому что ваш современный компьютер больше всего приспособлен ко вводу именно в таком представлении2.)
Почему бы нам не проверить действие EMIT на каждом печатном символе «автоматически»? : ОТОБРАЖАЕМЫЕ 127 32 DO I EMIТ SPACE LOOP ;
1 Код ASCII совпадает с применяемым в СССР семиразрядным кодом КОИ-7. В реализациях Форта на отечественных ЭВМ используются восьмиразрядные коды (например, КОИ-8) с добавлением кодов русских букв, что и позволяет использовать русские слова. - Примеч ред.
2 Для специалистов Не тратьте время на раздел для начинающих.
Таблица 7.1. Символы в коде ASCII и их числовые эквиваленты
Символ | Шестн | Дес. | Символ | Шестн. | Дес. | Символ | Шестн. | Дес. | Символ | Шестн | Дес. |
NUL | 00 | 0 | SP | 20 | 32 | @ | 40 | 64 |
| 60 | 96 |
SOH | 01 | 1 | ! | 21 | 33 | A | 41 | 65 | а | 61 | 97 |
STX | 02 | 2 | " | 22 | 34 | В | 42 | 66 | b | 62 | 98 |
ETX | 03 | 3 | # | 23 | 35 | С | 43 | 67 | с | 63 | 99 |
EOT | 04 | 4 | $ | 24 | 36 | D | 44 | 68 | d | 64 | 100 |
ENQ | 05 | 5 | % | 25 | 37 | E | 45 | 69 | е | 65 | 101 |
ACK | 06 | 6 | & | 26 | 38 | F | 46 | 70 | f | 66 | 102 |
BEL | 07 | 7 | ' | 27 | 39 | G | 47 | 71 | 9 | 67 | 103 |
BS | 08 | 8 | ( | 28 | 40 | H | 48 | 72 | h | 68 | 104 |
HT | 09 | 9 | ) | 29 | 41 | I | 49 | 73 | i | 69 | 105 |
LF | 0A | 10 | * | 2A | 42 | J | 4A | 74 | j | 6A | 106 |
VT | 0B | 11 | + | 2B | 43 | К | 4В | 75 | k | 6B | 107 |
FF | 0С | 12 | , | 2C | 44 | L | 4C | 76 | l | 6C | 108 |
CR | 0D | 13 | - | 2D | 45 | M | 4D | 77 | m | 6D | 109 |
SM | 0E | 14 | . | 2E | 46 | N | 4E | 78 | n | 6E | 110 |
SI | 0F | 15 | / | 2P | 47 | O | 4F | 79 | o | 6F | 111 |
DLE | 10 | 16 | 0 | 30 | 48 | P | 50 | 80 | p | 70 | 112 |
DC1 | 11 | 17 | 1 | 31 | 49 | Q | 51 | 81 | q | 71 | 113 |
DC2 | 12 | 18 | 2 | 32 | 50 | R | 52 | 82 | r | 72 | 114 |
DC3 | 13 | 19 | 3 | 33 | 51 | S | 53 | 83 | s | 73 | 115 |
DC4 | 14 | 20 | 4 | 34 | 52 | Т | 54 | 84 | t | 74 | 116 |
NAK | 15 | 21 | 5 | 35 | 53 | U | 55 | 85 | u | 75 | 117 |
SYN | 16 | 22 | 6 | 36 | 54 | V | 56 | 86 | v | 76 | 118 |
ETB | 17 | 23 | 7 | 37 | 55 | W | 57 | 87 | w | 77 | 119 |
CAN | 18 | 24 | 8 | 38 | 56 | X | 58 | 88 | x | 78 | 120 |
EM | 19 | 25 | 9 | 39 | 57 | Y | 59 | 89 | y | 79 | 121 |
SUB | 1A | 26 | : | ЗА | 58 | Z | 5A | 90 | z | 7A | 122 |
ESC | 1B | 27 | ; | 3B | 59 | [ | 5В | 91 | { | 7B | 123 |
FS | 1C | 28 | < | 3C | 60 | \ | 5C | 92 | | | 7C | 124 |
GS | 1D | 29 | = | 3D | 61 | ] | 5D | 93 | } | 7D | 125 |
RS | 1E | 30 | > | 3E | 62 | ^ | 5E | 94 | ~ | 7E | 126 |
US | 1F | 31 | ? | 3F | 63 | _ | 5F | 95 | DEL (RB) | 7F | 127 |
В первом столбце перечислены символы в коде ASCII или, если это управляющие символы, в общепринятых обозначениях; в двух последующих столбцах даются их шестнадцатиричные и десятичные эквиваленты
Слово ОТОБРАЖАЕМЫЕ выведет на печать каждый требуемый символ из кода ASCII, т. е. символы с кодами от десятичного 32 до десятичного 126. (Мы используем коды ASCII в качестве индекса цикла DO.) ОТОБРАЖАЕМЫЕ ! " # $ & ' ( ) * + ... ok
Начинающие могут поинтересоваться, как поведет себя EMIT с управляющими символами; наберите на клавиатуре такой текст:
Вы услышите какой-то сигнал, который является вариантом звонка печатающей машинки для дисплея. (В некоторых системах слово EMIT вместо того чтобы выполнить команду, выводит специфические символы.)
Неплохо знать следующие управляющие символы: НАЗВАНИЕ ОПЕРАЦИЯ ДЕСЯТИЧНЫЙ ЭКВИВАЛЕНТ
BS Возврат назад на одну 8 позицию ("забой") LF Перевод строки 10 CR Возврат каретки 13
Поэкспериментируйте с этими управляющими символами и посмотрите, как они выполняются.
Код ASCII разработан таким образом, что каждый символ в нем может быть представлен одним байтом. В приводимых здесь таблицах буква «с» означает, что содержимое некоторого байта соответствует символу в коде ASCII.
В некоторых Форт-системах имеется слово ASCII, которое используется для улучшения читабельности определений, поскольку переводит отдельные символы в шестнадцатиричные значения. Вспомним, к примеру, следующее определение: : STAR 42 EMIT ;
Если в вашей системе есть это слово, то вы можете определить его так: : STAR ASCII * EMIT ;
В обоих случаях элементы словаря после трансляции определений будут абсолютно одинаковы, однако последнее определение легче воспринимается. ASCII ( -- c) перевод следующего символа из входного потока в его ASCII-эквивалент