Символьные данные

{toc_noshowall}Символьная информация перфорируется на перфокартах в так называемом коде Холлерита, который будет подробно рассмотрен в гл. 15. Вывод на печать позволяет в явном виде распечатывать выходные последовательности символов. Существуют и иные способы представления символьных данных, использующиеся в разных периферийных устройствах. Мы знаем, что одним из способов выполнения операций ввода-вывода является преобразование информации из внешней формы представления во внутреннюю или наоборот.

Информация, принявшая форму внутреннего представления, готова к обработке. Например, ассемблер может оттранслировать представленную таким образом символьную информацию на машинный язык. Числовые данные в символьной форме могут быть также преобразованы в форму, позволяющую выполнять над ними арифметические операции. В форме символьных данных могут быть представлены, например, номера карточек социального обеспечения, хранящихся во внешней памяти ЭВМ. Обычно любая обрабатываемая машиной информация первоначально имеет символьный вид. Способы конкретного использования символьной информации определяются программами и ЭВМ.

 

В машинах IBM 360 и 370 формой внутреннего представления символьных данных является код EBCDIC. В коде EBCDIC каждому символу алфавита соответствует 8-разрядное двоичное число, т. е. для представления элементарного символа требуется байт.

В таком виде можно представить 256 различных символов, поскольку возможны 256 различных комбинаций нулей и единиц в восьми двоичных разрядах. Однако на ассемблере не каждому 8-разрядному числу соответствует символ. В табл. 10.1 приведены коды наиболее часто используемых символов. 8-битовый код обычно записывается в виде двух шестнадцатеричных чисел. Букве А в EBCDIC соответствует код С1, а знаку плюс (+) — код 4Е.

Коды, соответствующие буквам латинского алфавита от А до Z и цифрам от 0 до 9, легко запомнить. Первой шестнадцатеричной цифрой (зонной цифрой) кодов символов от А до I является С. Вторая цифра изменяется от 1 до 9 с возрастанием порядкового номера буквы. Первой цифрой кодов букв, расположенных между J и R, является D. Таким образом, этим буквам соответствуют коды от D1 до D9. Оставшимся буквам от S до Z соответствует первая цифра Е, однако вторая цифра изменяется на сей раз, начиная с двух. Итак, числа Е2 — Е9 кодируют буквы S — Z. Первой (зонной) цифрой кодов EBCDIC десятичных цифр является F, вторая совпадает с самим числом. Итак, десятичные цифры от 0 до 9 кодируются шестнадцатеричными значениями от F0 до F9.

Таблица 10.1 Шестнадцатеричное представление кодов EBCDIC для широко используемых символов

Символ

EBCDIC-код

Двоичн.

Символ

EBCDIC-код

Двоичн.

А

С1

1100 0001

0

F0

1111 0000

В

С2

1100 0010

1

F1

1111 0001

С

С3

1100 0011

2

F2

1111 0010

D

С4

1100 0100

3

F3

1111 0011

Е

С5

1100 0101

4

F4

1111 0100

F

С6

1100 0110

5

F5

1111 0101

G

С7

1100 0111

б

F6

1111 0110

Н

С8

1100 1000

7

F7

1111 0110

I

С9

1100 1001

8

F8

1111 1000

J

D1

1101 0001

9

F9

1111 1001

К

D2

1101 0010

Пробел

40

0100 0000

L

D3

1101 0011

+

0100 1110

М

D4

1101 0100

-

60

0110 0000

N

D5

1101 0101

.

0100 1011

О

D6

1101 0110

,

0110 1011

Р

D7

1101 0111

<

4D

0100 1101

Q

D8

1101 1000

)

5D

0101 1101

R

D9

1101 1001

$

SB

0101 1011

S

Е2

1110 0010

=

0111 1110

T

Е3

1110 0011

;

0101 1110

U

Е4

1110 0100

:

0111 1010

V

E5

1110 0101

 

 

 

W

Е6

1110 0110

 

 

 

X

Е7

1110 0111

 

 

 

Y

Е8

1110 1000

 

 

 

Z

Е9

1110 1001

 

 

 

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

Последовательность смежных символов называется символьной строкой. Примером такой строки может служить последовательность, набитая на 80-колонной перфокарте (включая пробелы). Информация, закодированная на карте, после считывания заносится в память в виде образа этой карты. Образ карты представляет собой 80-байтовую последовательную запись, каждый байт которой содержит код соответствующего символа.

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

NEXTNUMbbR WDbbb2bbb...

где символы b обозначают пробелы.

По окончании выполнения операции чтения в памяти, начиная с ячейки CARDIN, будет расположен образ только что считанной перфокарты:

CARDIN:+0 + 1 +2+3 +4+5 +6...+18 + 19

D5

С5

Е7

ЕЗ

D5

Е4

D4

40

40

D9

Е6

С4

40

40

40

F2

40

40

40

Вертикальными линиями обозначены границы байтов, все остальные 60 байтов содержат код 4016. Итак, каждому отперфорированному на карте символу было поставлено в соответствие двухзначное шестнадцатеричное число, определяемое кодом EBCDIC; полученные числа в виде 8-разрядных двоичных кодов были записаны в память последовательно, начиная с байта CARDIN.

В качестве еще одного примера рассмотрим форму внутреннего представления строки символов, определяющей число

—100

В коде EBCDIC ей соответствует 4-байтовое поле

60F1F0F0

Заметим, что оно не имеет ничего общего с двоичной формой представления числа

—100

которая выглядит так:

FFFFFF9C

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

 

В гл. 6 мы познакомились с командами ассемблера DS и DC, предоставляющими возможность резервирования области памяти и присвоения ей символического имени. По команде DC, кроме того, в зарезервированную область можно записать какое-либо исходное значение. Память резервировалась полусловами, словами и двойными словами, чему соответствуют типы Н, F и D. Теперь рассмотрим возможность резервирования памяти байтами.

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

BYTES DS ЗЗС

является командой, указывающей на необходимость зарезервировать 33 байта для использования транслируемой программой. Первому из этих байтов будет присвоено имя BYTES. Как всегда при работе с DS-предложением, к моменту начала выполнения транслируемой программы содержимое зарезервированной области будет тем же, каким оно было ранее до загрузки программы.

DC-предложение используется для начальной загрузки зарезервированной области. Предложение

NONSENSE DC C'THE MOON IS PURPLE'

обеспечит резервирование 18 байтов, присвоение первому из них имени NONSENSE и запись в отведенное место следующей последовательности:

E3C8C540D4D6D6D540C9E240D7E4D9D7D3C5 Наиболее общей формой записи символьной константы является

DupCLn'cтpoкa'

где «Dup» — коэффициент кратности. Он обозначает количество требуемых областей типа CLn'стpoкa'. «Строка» представляет символьную строку. Ln означает «Длина в п байтов», где п — целое без знака. Если Ln не будет указано, ассемблером будет отведено минимальное поле, необходимое для записи указанной строки. В предыдущем примере параметр Ln был опущен, и для записи строки

THE MOON IS PURPLE

было отведено 18 байтов.

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

Например, предложение

EMPNO DC CL15'EMPLOYEE NO.'

вызовет резервирование 15-байтовой области, начинающейся байтом EMPNO. Эти 15 байтов будут содержать коды, соответствующие следующей строке:

EMPLOYEEbNO.bbb

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

EMPNO DC CL8'EMPLOYEE NO.'

в память, начиная с ячейки EMPNO, будет записана строка

EMPLOYEE

Последние 4 символа указанной строки были отброшены для того, чтобы оставшаяся часть уместилась в 8-байтовой области.

Коэффициент кратности используется тогда, когда нам нужно иметь несколько экземпляров исходной строки.

Например, по команде

REF DC 3CL8'REFUND'

в зарезервированную область памяти будет записана следующая информация:

REFUNDbbREFUNDbbREFUNDbb

Первый байт области получит имя REF.

Строки, предназначенные для вывода на печать, удобно засылать в зарезервированные ассемблером области, каждый байт которых содержит код пробела. Если строка имеет длину 133 символа, то предложение

LINE DC CL 133''

резервирует место, на которое впоследствии может быть помещена выводимая строка. Мы указываем строку, состоящую лишь из одного символа. Но поскольку запрашиваемая длина равна 133, в остальные 132 байта ассемблером будут занесены коды пробела.

Итак, команда DC используется для определения символьных (текстовых) констант. Ассемблер резервирует запрашиваемую область памяти и производит запись в нее кодов EBCDIC, составляющих указанную в команде строку. Если длина резервируемой области не задана, то она принимается равной числу символов в строке.