Символ Бодо
Шестнадцатерич-
ный код
Символ Бодо
00 10 3
01 5
11
+
02
Возврат каретки
12
Кто это?
03 9
13
?
04
Пробел
14
‘
05
#
15 6
06
,
16
$
07 17
/
08
Перевод строки
18
—
09
)
19 2
0A
4 1A
Сигнал
0B
&
1B
Переключение
на цифры
0C
8 1C
7 0D
0 1D
1 0E
:
1E
(
0F
=
1F
Переключение
на буквы
В стандарте ITU коды 05h, 0Bh и 16h не определены: они зарезервированы
«для национального использования». В таблице показано, как эти коды применя- лись в Соединенных Штатах. Эти же коды обычно подходят для букв с диакрити- ческими знаками из некоторых европейских языков. Код «Сигнал» предназначен для подачи телетайпом слышимого звукового сигнала, «Кто это?» активирует ме- ханизм, посредством которого телетайп может идентифицировать себя.
Как и азбука Морзе, этот 5-битный код не предусматривает различий меж ду прописными и строчными буквами. Предложение I spent $25 today («Се- годня я потратил 25 долларов») шифруется следующей последовательнос тью шестнадцатеричных значений.
I SPENT $25 TODAY.
0C 04 14 0D 10 06 01 04 1B 16 19 01 1F 04 01 03 12 18 15 1B 07 02 08
Обратите внимание на три кода переключения: 1Bh прямо перед числом,
1Fh после числа и 1Bh перед точкой в конце предложения. Строка завершает- ся кодами возврата каретки и перевода строки.
Глава 20. Набор символов ASCII
331
К сожалению, если вы дважды отправите эту последовательность значе- ний на печатающее устройство телетайпа, получите следующий результат.
I SPENT $25 TODAY.8 ‘03,5 $25 TODAY.Что случилось? Дело в том, что последний код переключения, получен- ный печатным аппаратом перед второй строкой, представлял код переключе- ния на цифры, поэтому коды в начале второй строки были интерпретирова- ны как цифры.
Подобные проблемы типичны при использовании кодов переключе- ния. Несмотря на безусловную экономичность кода Бодо, предпочтительнее было бы остановиться на уникальных кодах для цифр и знаков препинания, а также отдельных кодах для строчных и прописных букв.
Если мы хотим выяснить, сколько бит нам необходимо для создания луч- шей по сравнению с кодом Бодо системы кодирования символов, нужно прос- то сложить их: 52 кодовых слова — для прописных и строчных букв, десять кодовых слов — для цифр от 0 до 9. Это уже 62 кодовых слова.
Если добавить несколько знаков препинания, получим 64 кодовых слова, а значит, нам нужно более шести бит. Однако мы еще не скоро превысим значение в 128 символов, при котором потребуются восемь бит.
Как видите, необходимы семь бит для представления символов англий- ского текста, если мы хотим обойтись без переключения между буквами ниж- него и верхнего регистра.
Что же это за коды? Фактически коды могут быть любыми. Если бы мы со- бирались создать собственный компьютер, собрать для этого все необходимые аппаратные средства, сами его запрограммировать и никогда не использовать для подключения к любой другой машине, мы могли бы придумать собствен- ные коды. Все, что нужно, — это назначить уникальный код каждому символу, который мы собираемся использовать.
Поскольку компьютеры редко создаются и работают отдельно друг от друга, разумнее было бы договориться о применении одних и тех же кодов. Таким об- разом сконструированные нами компьютеры могут быть более совместимыми друг с другом и, вероятно, смогут даже обмениваться текстовой информацией.
Кроме того, не следует присваивать коды случайным образом. Так, когда мы работаем с текстом на компьютере, назначение последовательных кодов буквам алфавита дает некоторые преимущества. Например, этот метод упо- рядочивания упрощает сортировку по алфавиту.
332
Код
К счастью, такой стандарт уже разработан:
Американский стандартный код для обмена информацией (American Standard Code for Information Interchange,
ASCII). Он был принят в 1967 году и остается одним из важнейших во всей компьютерной индустрии. Однако у него есть одно исключение (о котором расскажу позднее). Работая с текстом на компьютере, вы можете быть уверены, что стандарт ASCII каким-то образом задействован в этом процессе.
ASCII — это 7-битный код, использующий двоичные значения в диапазо- не от 0000000 до 1111111, которые соответствуют шестнадцатеричным кодам от 00h до 7Fh. Давайте разберем коды ASCII.
Начнем не с самого начала, по- скольку первые 32 кода концептуально немного сложнее остальных, а со второй группы, состоящей из 32 кодов, которая включает знаки препинания и десять цифр. В следующей таблице перечислены шестнадцатеричные коды и соответ- ствующие им символы.
Шестнадцатерич-ный кодСимвол ASCIIШестнадцатерич-ный кодСимвол ASCII20
Пробел30 0
21
!
31 1
22
«
32 2
23
#
33 3
24
$
34 4
25
%
35 5
26
&
36 6
27
‘
37 7
28
(
38 8
29
)
39 9
2A
*
3A
:
2B
+
3B
;
2C
,
3C
<
2D
-
3D
=
2E
3E
>
2F
/
3F
?
Обратите внимание: код 20h соответствует пробелу, отделяющему слова друг от друга.
Следующие 32 кода — прописные буквы и некоторые дополнительные знаки препинания. Кроме значка @ и символа подчеркивания, эти знаки обыч- но отсутствуют на пишущих машинках, однако являются стандартными для компьютерных клавиатур.
Глава 20. Набор символов ASCII
333
Шестнадцатерич-
ный код
Символ ASCII
Шестнадцатерич-
ный код
Символ ASCII
40
@
50
P
41
A
51
Q
42
B
52
R
45
C
55
S
44
D
54
T
45
E
55
U
46
F
56
V
47
G
57
W
48
H
58
X
49
I
59
Y
4A
J
5A
Z
4B
K
5B
[
4C
L
5C
\
4D
M
5D
]
4E
N
5E
^
4F
O
5F
_
Следующая группа из 32 символов: все строчные буквы и некоторые до- полнительные знаки препинания, которые, опять же, редко встречаются на пи- шущих машинах.
Шестнадцатерич-
ный код
Символ ASCII
Шестнадцатерич-
ный код
Символ ASCII
60
‘
70
p
61
a
71
q
62
b
72
r
63
c
73
s
64
d
74
t
65
e
75
u
66
f
76
v
67
g
77
w
68
h
78
x
69
i
79
y
6A
j
7A
z
6B
k
7B
{
6C
l
7C
|
6D
m
7D
}
6E
n
7E
6F
o
334
Код
В этой таблице отсутствует последний символ, соответствующий коду 7Fh.
Приведенные выше три таблицы содержат в общей сложности 95 символов.
Поскольку код ASCII является 7-битным, он допускает использование 128 ко- дов, поэтому нам должно быть доступно еще 33 кода, до которых мы скоро и доберемся.
Текстовая строка Hello, you! («Привет тебе!») может быть представ- лена в кодировке ASCII с использованием следующих шестнадцатеричных кодов.
Hello, you!48 65 6C 6C 6F 2C 20 79 6F 75 21
Обратите внимание на запятую (код 2C), пробел (код 20) и восклицатель- ный знак (код 21), а также на коды, соответствующие буквам. Представление короткого предложения I am 12 years old («Мне 12 лет») в кодировке ASCII следующее.
I am 12 years old.49 20 61 6D 20 31 32 20 79 65 61 72 73 20 6F 6C 64 2E
Число 12 в этом предложении отображено шестнадцатеричными числами
31h и 32h, то есть кодами ASCII для цифр 1 и 2. Когда число 12 — часть текс- та, его
нельзя представлять с помощью шестнадцатеричных кодов 01h и 02h,
BCD-кода 12h или шестнадцатеричного кода 0Ch. Все эти коды имеют в систе- ме ASCII совершенно другие значения.
Конкретная прописная буква в системе ASCII отличается от своей строч- ной версии на 20h. Этот факт позволяет легко написать код, который, например, переводит текстовую строку в верхний регистр. Предположим, что определен- ная область памяти содержит текстовую строку, по одному символу на байт.
Следующая подпрограмма для процессора 8080 предполагает, что адрес пер- вого символа в текстовой строке хранится в регистре HL. Регистр C включает длину этой текстовой строки, то есть количество символов.
Capitalize:
MOV A, C ; C = количество оставшихся символов
CPI A,00h ; Сравнить с 0
JZ AllDone ; Если С = 0,
завершить программу Глава 20. Набор символов ASCII
335
MOV A,[HL] ; Извлечь следующий символ
CPI A,61h ; Меньше, чем «a»?
JC SkipIt ; Если да, проигнорировать
CPI A,7Bh ; Больше, чем «z»?
JNC SkipIt ; Если да, проигнорировать
SBI A,20h ; Буква в нижнем регистре, поэтому
; вычитаем 20h
MOV [HL], A ; Сохранить символ
SkipIt: INX HL ; Перейти к следующему символу
DCR C
; Уменьшить счетчик на 1
JMP Capitalize; Вернуться к началу
AllDone:
RET
Оператор, который вычитает 20h из кода строчной буквы для ее преоб- разования в прописную, можно заменить следующим фрагментом.
ANI A
,
DFh
Инструкция ANI (AND Immediate) выполняет побитовую операцию
И меж ду значением в аккумуляторе и значением DFh, которое в двоичном формате равно 11011111. Под словом «побитовая» подразумеваю, что такая команда выполняет операцию И между каждой парой соответствующих би- тов, составляющих два числа. Эта операция И сохраняет все биты, содержа- щиеся в аккумуляторе (A), за исключением третьего слева, значение кото- рого задается равным 0, что, в свою очередь, преобразует строчную букву
ASCII в прописную.
Приведенные выше 95 кодов — это так называемые
печатные символы, поскольку они имеют графическое представление. Кроме них в кодировке
ASCII также предусмотрено 33
управляющих символа,
которые не имеют гра- фического представления, но выполняют определенные функции. Для полноты приведу эти 33 управляющих символа. Не беспокойтесь, если они покажутся вам непонятными. Кодировка ASCII изначально предназначалась для исполь- зования в телетайпах, поэтому многие из ее кодов в настоящее время потеря- ли свое значение.
336
Код
Шестнадцате-
ричный код
Аббревиа-
тура
Название управляю-
щего символа
Назначение
00
NUL
Null
Нет
01
SOH
Start of Heading
Начало заголовка
02
STX
Start of Text
Начало текста
03
ETX
End of Text
Конец текста
04
EOT
End of Transmission
Конец передачи
05
ENQ
Enquiry
Запрос
06
ACK
Acknowledge
Подтверждение
07
BEL
Bell
Звуковой сигнал
08
BS
Backspace
Возврат на символ назад
09
HT
Horizontal Tabulation
Горизонтальная табуляция
0A
LF
Line Feed
Перевод строки
0B
VT
Vertical Tabulation
Вертикальная табуляция
0C
FF
Form Feed
Новая страница
0D
CR
Carriage Return
Возврат каретки
0E
SO
Shift-Out
Переключиться на другую ко- дировку
0F
SI
Shift-In
Переключиться на исходную кодировку
10
DLE
Data Link Escape
Освобождение канала данных
11
DC1
Device Control 1
Первый символ управления устройством
12
DC2
Device Control 2
Второй символ управления устройством
13
DC3
Device Control 3
Третий символ управления устройством
14
DC4
Device Control 4
Четвертый символ управления устройством
15
NAK
Negative Acknowledge
Отсутствие подтверждения
Глава 20. Набор символов ASCII
337
Шестнадцате-ричный кодАббревиа-тураНазвание управляю-щего символаНазначение16
SYN
Synchronous Idle
Синхронизация
17
ETB
End of Transmission Block
Конец блока передачи
18
CAN
Cancel
Отмена
19
EM
End of Medium
Конец носителя
1A
SUB
Substitute Character
Замена
1B
ESC
Escape
Ключ
1C
FS
File Separator or
Information Separator 4
Разделитель файлов или информации 4 1D
GS
Group Separator or
Information Separator 3
Разделитель групп или информации 3 1E
RS
Record Separator or
Information Separator 2
Разделитель записей или информации 2 1F
US
Unit Separator or
Information Separator 1
Разделитель элементов или информации 1 7F
DEL
Delete
Удаление
Управляющие символы в данном случае могут использоваться наряду с печатными для элементарного форматирования текста. Это проще всего по- нять, если вы подумаете о таком устройстве, как телетайп или простой прин- тер, который отпечатывает на странице символы под воздействием потока кодов ASCII.
Получив код символа, печатающая головка устройства наносит символ и перемещается на одну позицию вправо. Наиболее важные управляю- щие символы изменяют это нормальное поведение.
Рассмотрим следующую строку шестнадцатеричных значений.
41 09 42 09 43 09
Символ 09 — это код горизонтальной табуляции, или табулятор. Если представить, что все горизонтальные позиции символа на странице принтера нумеруются начиная с 0, то код табуляции дает команду напечатать следую- щий символ на следующей горизонтальной позиции, номер которой кратен восьми, например так.
A B C
338
Код
Это удобный способ для расположения текста столбцами.
Даже сегодня многие компьютерные принтеры реагируют на код перехода к новой странице (12h), извлекая текущую страницу и начиная печатать на новой.
Код для возврата на один символ назад (backspace) может использовать- ся для печати составных символов на некоторых старых принтерах. Предпо- ложим, вам нужно, чтобы телетайпный аппарат отобразил строчную букву
e с обратным апострофом:
è. Эту задачу можно решить с помощью шестнадца- теричных кодов 65 08 60.
Сегодня наиболее важными являются управляющие коды для возврата каретки и перевода строки, которые имеют то же значение, что и аналогич- ные коды Бодо. В ответ на код возврата каретки печатающая головка прин- тера перемещается к левому краю страницы, а в ответ на код перевода стро- ки — на одну строку вниз. Обычно для перехода на новую строку требуются оба кода. Код возврата каретки может использоваться сам по себе для печати поверх существующей строки, а код перевода строки — для того, чтобы перей- ти к следующей, при этом не перемещаясь к левому краю страницы.
Несмотря на то что кодировка ASCII —
доминирующий стандарт в ком- пьютерном мире, она не используется во многих крупных компьютерных сис- темах IBM. Для мейнфреймов System/360 компания разработала собственный
8-битный код EBCDIC (Extended BCD Interchange Code — расширенный дво- ично-десятичный код обмена информацией) — расширенный вариант более раннего 6-битного кода BCDIC, полученного из кодов, используемых на перфо- картах IBM. Эти перфокарты, позволяющие хранить по 80 текстовых символов, были созданы IBM в 1928 году и использовались на протяжении более 50 лет.
ABCDEFGHIJKLMNOPQRSTUVWXYZ
0123456789 00000000000000000000000000000000000000000000000000000000000000000000000000000000 11111111111111111111111111111111111111111111111111111111111111111111111111111111 22222222222222222222222222222222222222222222222222222222222222222222222222222222 33333333333333333333333333333333333333333333333333333333333333333333333333333333 44444444444444444444444444444444444444444444444444444444444444444444444444444444 55555555555555555555555555555555555555555555555555555555555555555555555555555555 66666666666666666666666666666666666666666666666666666666666666666666666666666666 77777777777777777777777777777777777777777777777777777777777777777777777777777777 88888888888888888888888888888888888888888888888888888888888888888888888888888888 99999999999999999999999999999999999999999999999999999999999999999999999999999999 1 2 3 5
4 6 7 8 9 1011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980 1 2 3 5
4 6 7 8 9 1011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
IBM 8081
Рассматривая взаимосвязь между перфокартами и соответствующими им 8-битными кодами символов EBCDIC, имейте в виду, что эти коды раз- рабатывались на протяжении многих десятилетий под влиянием различных
Глава 20. Набор символов ASCII
339
технологий. По этой причине не стоит ожидать от них излишней логичности или согласованности.
На перфокарте символ кодируется комбинацией из одного или несколь- ких прямоугольных отверстий, пробитых в одном столбце. Сам символ часто печатается в верхней части карты. Нижние десять строк пронумерованы от 0 до 9. Ненумерованная строка над нулевой строкой считается одиннадцатой, а верхняя — двенадцатой; десятая строка отсутствует.
Вот еще несколько терминов из области применения перфокарт IBM: строки с нулевой по девятую называются цифровыми строками, или цифро-
вой пробивкой. Одиннадцатая и двенадцатая строки — зонные строки, или
зонная пробивка. Иногда нулевая и девятая строки считались не цифровыми, а зонными, что вызывало путаницу.
Восьмибитный код символа EBCDIC состоит из старшей и младшей тет- рад (четыре бита). Младшая тетрада — код BCD, соответствующий цифро- вой пробивке символа; старшая тетрада — код, который произвольно можно поставить в соответствие зонной пробивке символа. Из главы 19 вы помните, что BCD означает двоично-десятичный код — 4-битный код для цифр от 0 до 9.
Для цифр от 0 до 9 не существует никакой зонной пробивки. Отсутствие пробивки соответствует старшей тетраде 1111. Младшая тетрада — код BCD цифровой пробивки. В следующей таблице приведены коды EBCDIC для цифр от 0 до 9.
Шестнадцатеричный код
Символ EBCDIC
F0 0
F1 1
F2 2
F3 3
F4 4
F5 5
F6 6
F7 7
F8 8
F9 9
Для прописных букв тетрада 1100 соответствует зонной пробивке только двенадцатой строки, тетрада 1101 — зонной пробивке только одиннадцатой строки, тетрада 1110 — зонной пробивке только нулевой строки. Приведем коды EBCDIC для прописных букв.