Преобразование данных - EBCDIC - Зонный десятичный формат

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

rfcdddd

где d означает любую цифру от 0 до 9. Пусть это число записано по адресу EBCDICNO. На рис. 15.3 приведены команды, обеспечивающие определение знака и запись соответствующего кода в знаковую зону. Последняя команда заменяет код знака на 0.

Проследим выполнение этих команд на примере. Пусть ячейка EBCDICNO содержит коды символов числа — 1234. Команды 1 и 2 определяют, что это число отрицательное. Команда 5 выполняет логическое умножение последнего байта числа на DFle. Последний байт содержит F4ie, поэтому в результате получается D4]e. Теперь в EBCDICNO мы имеем

60F1F2F3D4

И наконец, команда 6 производит замену знакового кода 6010 на F016. Таким образом, окончательно получается

F0F1F2F3D4

Это и есть исходное число в зонном формате.

В рассмотренном примере предполагалось выполнение значительно более сильных ограничений на формат обрабатываемого числа, чем это на самом деле требуется. В качестве примера преобразования EBCDIC — зонный формат, не требующего выполнения столь сильных условий, рассмотрим преобразование кодов чисел, состоящих из десяти знаков. В качестве первого знака может выступать один из алгебраических знаков, + или —. Число с отсутствующим алгебраическим знаком считается положительным. Пробелы рассматриваются как нули. Последними знаками чисел должны быть цифры. (Описанный формат напоминает формат ПО ФОРТРАНа.)

Рис. 15.3. Преобразование 5-значного числа из кода EBCDIC в зонный формат.

Ниже приведены примеры удовлетворяющих сформулированным условиям последовательностей символов:

,

На рис. 15.4 изображена программа, преобразующая коды EBCDIC чисел, удовлетворяющих сформулированным условиям, в зонный формат. При этом предполагается, что исходные коды хранятся по адресу EBNO. Этот пример отличается от предыдущего, прежде всего тем, что в нем производится проверка на наличие знакового кода. В предыдущем примере предполагалось, что первый байт числа всегда содержит знаковый символ. Теперь же нужно искать первый значащий символ. В программе на рис. 15.4 предполагается, что этим символом могут быть знаки + или — или цифра от 0 до 9. Если знаковый символ присутствует, то в знаковую зону записывается соответствующий код, а сам знак заменяется нулем. Если же первым отличным от пробела символом является цифра, то число считается положительным и в знаковую зону записывается код плюса.

Рис. 15.4. Преобразование 10-значного числа из кода EBCDIC в зонный формат.

В программе, изображенной на рис. 15.4, первые три команды производят начальную установку регистров 2, 4 и 5, использующихся в процессе поиска первого отличного от пробела символа в области EBNO. Если такой символ найден, осуществляется переход на FOUND. Заметим, что в регистре 2 в этот момент находится адрес байта, содержащего код найденного символа. Затем производится проверка символа и выполняются действия, аналогичные рассмотренным в программе рис. 15.3.