/
Текст
КДжермейн Программирование на1ВМ/360
|1 1'1.1 .1111 I
PROGRAMMING THE IBM/360 Clarence B. Germain Senior Systems Analyst, West Publishing Company PRENTICE-HALL; INC. ENGLEWOOD CLIFFS, NEW JERSEY 1967
Jjij || lllllllll II I ill 111 III IHI III 11111llIII11111! llill 111 III 11,1 Illi II 11 ill I II I li I lilll II 11111111111111111Id Illill1 11 li lllillilllillillllIIIllillllllilllllhill, lllllllilll II111 it 111111111 li III I|I|||I||||||I| II llliil ill lllllllIIlll.lllhlllllllhllIII III) lllj К. ДЖЕРМЕЙН Программирование на IBM/360 Перевод с английского под редакцией В. С. ШТАРКМАНА Издание третье, стереотипное ИЗДАТЕЛЬСТВО «МИР» Москва 1978
УДК 681.142.2 Учебное пособие по обучению (и самообучению) програм- мированию для вычислительной системы IBM/360. Помимо описания общих принципов работы ЭБМ и программирования читатель здесь найдет — практически полное описание архитектуры IBM/360, т. е. описание ее структуры и функционирования с точки зрения про- граммиста; — описание типовых устройств ввода — вывода; — описание общих принципов работы с массивами данных (файлами); — описание основ организации математического обеспе- чения, в частности описание языков управления заданиями для различных используемых на IBM/360 операционных систем; — описание наиболее распространенных языков программи- рования (PL/1, Фортран, Кобол, язык Ассемблера). Книга представляет большой интерес для специалистов по вычислительной технике и программированию. Она будет полезна научным работникам, преподавателям, аспирантам и студентам многих специальностей. Редакция литературы по математическим наукам „ 20204-020 ,„_7Я 041 (01)—ТВ
'iiiiHllliHiiililiiiiiiiiiliiiiiiililhhiiliiiiiihliiiiiiLilililiilillhidl.liliiiilililiiiiiilililiiiJililiiiiliiiliiiilililiiliiiliiiiiiiililiiiililililiilililiiiiiiiiliiiiiillliiiiliiililillilililiiiiliiiiiHilihllhhililiHillliiniililllllliiihlllilinilllil ПРЕДИСЛОВИЕ РЕДАКТОРА ПЕРЕВОДА IBM/360 — самое многочисленное семейство ЭВМ третьего поколения. Период с 1965 года, когда начались первые поставки этих машин, можно без преувеличения назвать «эпохой 1ВМ/360». Интересно отметить, что новая разработка фирмы IBM — система IBM/370, которую ждали с нетерпением и интересом во всем мире, оказалась «всего-навсего» дальнейшим развитием системы IBM/360. Она сохраняет преемственность в отношении всего огромного программного хозяйства, накопленного своей предшественницей. Система математического, точнее программного, обеспечения для IBM/360 беспрецедентна по своим масштабам и возможностям. В этой книге автор ставит своей целью дать необходимые све- дения, которые позволили бы легко ориентироваться в фирменных материалах по программированию для IBM/360. Естественно, что эти сведения оказались весьма обширными и в определенном смысле разнородными. На одном полюсе — описание устройства для набивки перфокарт — клавишный перфоратор IBM 029, на другом —* описание языков программирования как проблем- но-, так и машинно-ориентированных (PL/1, Фортран, Кобол, язык Ассемблера). * Описанию языковых средств и возможностей операционных сис- тем автор предпосылает полное описание аппаратных возможно- стей IBM/360. В книге освещаются структура вычислительной системы в целом, структура центрального процессора, система его команд и форматы данных, с которыми он работает; логика рабо- ты каналов и устройств ввода — вывода; система прерываний, позволяющая координировать одновременную работу централь- ного процессора с многочисленными устройствами ввода — вывода и выполняющая много других функций. Наибольшую ценность для советского читателя, видимо, пред- ставляют сведения о различных операционных системах, употре- бляемых на IBM/360 и образующих среду, в которой работает программист с предоставленными ему языковыми средствами. Особенно полезным будет знакомство с организацией работы с входными и выходными массивами данных и их структурой. Таким образом, книгу характеризует комплексный подход к проблеме и большая широта охвата предмета. В отличие от фир-
6 Предисловие редактора перевода менных материалов по программированию для IBM/360, пред- ставляющих собой сложную систему множества документов, каж- дый из которых освещает определенный аспект программистской науки, здесь по существу освещена система программирования, так сказать, в целом. Не приходится сомневаться, что даже ветераны программиро- вания найдут в книге много полезного и интересного. Однако нужно помнить, что автор рассчитывает на новичка, не имеющего специальной подготовки по вычислительной технике, и это побуж- дает его вести изложение просто и доходчиво, с большим коли- чеством примеров, не забывая и о принципиальной стороне дела. * • ♦ Как всегда в подобных переводах, едва ли не главную труд- ность составляла терминологическая проблема. В данном случае положение усугублялось широтой излагаемого материала и необ- ходимостью хоть как-то согласовывать терминологию различных разделов. В некоторых вопросах пришлось пойти на известное новатор- ство, естественно, не имея гарантий, что оно будет оправдано последующей практикой. В частности, наряду с принятым термином «оператор» в каче- стве эквивалента английского термина statement употребляется термин «предложение». Причина — загруженность русского слова «оператор» массой других значений, отличных от statement. Вместо привычной плавающей и фиксированной запятой в кни- ге говорится о плавающей и фиксированной точке. Здесь перевод- чики пошли по дороге, проторенной переводом книги «Универ- сальный язык программирования PL/1» («Мир», М., 1968). В некоторых случаях, когда частота повторения какого-либо словосочетания превосходила определенный предел, оно заменя- лось более коротким словосочетанием или просто одним словом. Так возник, например, контроллер вместо «устройства управле- ния устройством ввода — вывода» и «спецификатор формата» вместо «элемента списка формата». Остается надеяться, что отдель- ные терминологические трудности не помешают читателю разо- браться в сути дела. В заключение заметим, что оригинал книги изобиловал опе- чатками и переводчики (в переводе книги участвовали В. П. Куз- нецов, В. Г. Лесюк, Т. В. Макарова, Н. Ф. Музылева, Ж. П. Сват- ков, Л. А. Какунин) взяли на себя смелость их исправить, не делая специальных оговорок. В то же время переводчики не имели возможности прорешать все предлагаемые автором упражнения и в основном сохранили ответы оригинала. В. С. Штаркман
ПРЕДИСЛОВИЕ Эта книга была задумана как учебник, адресованный тем, кто хочет изучить программирование для системы IBM/360 самостоя- тельно или на соответствующих курсах. Для ее понимания прак- тически не требуется никаких предварительных сведений по вычислительной технике (в частности, сведений о перфокартах). Требования к математической подготовке читателя также весьма скромны — за исключением нескольких задач, эти требования не выходят за пределы элементарного курса алгебры. Книга охватывает применения машин как для экономических задач, так и для научных исследований, что нашло отражение в подборе примеров и упражнений для самостоятельного решения. Материал расположен в порядке, который можно считать традиционным для подобного рода курсо’ по программированию. Описани языков программирования — PL/1, Фортрана, Кобола и языка Ассемблера (автокода) — ведется независимо в отдель- ных главах, так что читатель без всякого ущерба может пропу- стить те или иные разделы. Книга написана применительно к Моделям 25, 30, 40, 50, 65, 75 и 85. Ее можно использовать и для Моделей 44, 67, 91 и 95, хотя в ней не оговорено, какие команды из общего набора отсут- ствуют на Модели 44 или какими особенностями обладают пре- рывания на Моделях 91 и 95. Не рассматриваются каналы «па- мять — память» Моделей 91 и 95, дополнительные возможности Модели 44, а также специальные средства Модели 67 для работы в режиме разделения времени. Совершенно оставлена в стороне Модель 20. В основном сведения о Дисковой Операционной Системе (DOS) и Операционной Системе (OS) разнесены по разным гла- вам, и поэтому здесь читатель также может ограничиться лишь интересующими его разделами. Возможности Ленточной Опера-
8 Предисловие ционной Системы (TOS) и Базовой Операционной Системы (BOS) описаны практически исчерпывающе. В меньшей мере затронуто Базовое Программное Обеспечение (BPS), и совсем не освещены Система Программирования Модели 44 и Система Разделения Времени Модели 67, хотя они во многих отношениях аналогич- ны’ OS. Цель данной книги — сообщить читателям тот круг сведений, которые дадут ему возможность легко и быстро ориентироваться в множестве фирменных документов по IBM/360. Поэтому, в част- ности, автор и не пытался описать языки программирования во всех деталях. Читателю, приступающему к изучению этого курса, рекомен- дуется обзавестись линейкой для рисования логических схем программ и бланками для программирования на различных язы- ках. Желательно также — если это возможно, — чтобы он рас- полагал каким-либо комплектом фирменных руководств по Сис- теме IBM/360. Сент-Пол, Миннесота Кларенс Б. Джермейн
Глава 1 ПЕРФОКАРТА 1.1. Герман Холлерит В 1879 году в возрасте 19 лет Герман Холлерит окончил Гор- ную школу при Колумбийском университете и был принят на работу в статистическое управление при Министерстве внутрен- них дел США. Холлериту была поручена обработка информации о предпринимателях в промышленности по переписи 1880 года. Здесь он встретился с доктором Джоном Биллингсом, возглав- лявшим работы по составлению сводных данных, который навел Холлерита на мысль о возможности создания машин для выпол- нения чисто механической работы по статистической обработке различных данных. В 1882 году Холлерит согласился препода- вать машиностроение в Массачусетском технологическом инсти- туте, где и начал разрабатывать табулятор. Не получив удовлет- ворения от преподавания, он оставил институт, но продолжал работу по созданию своей машины. Однажды в поезде он обратил внимание на кондуктора, кото- рый с помощью ручного компостера заносил в какой-то бланк данные о пассажирах. У Холлерита возникла идея разработки перфокарты, которая содержала бы статистические данные для переписи населения Америки. В 1884 году он обратился за патентом на свою «машину для переписи населения». В после- дующие годы Холлериту было выдано более 30 патентов за работы в этой области. Система Холлерита включала перфокарту, клавишный перфо- ратор, позволявший оператору Перфорировать около 100 отвер- стий в минуту, специальный перфоратор, который позволял перфорировать одновременно на нескольких картах повторяю- щуюся информацию (например, штат, округ), сортировальную машину и табулятор. Сортировальная машина представляла собой несколько ящиков, каждый со своей крышкой. Карты продвигались между набором штырей, насаженных на пружины, и резервуаром, наполненным ртутью. Как только штырь попа- дал в отверстие, он касался ртути и замыкал электрическую Цепь. При этом приподнималась крышка на соответствующем ящике, куда и попадала карта. Табулятор работал аналогично сортировальной машине с той лишь разницей, что обнаруживав-
10 Гл. I. Перфокарта мое отверстие использовалось для увеличения показания имею- щегося при нем счетчика на единицу. Система Холлерита была использована для переписи населе- ния 1890 года. Результаты были более точны, и для их получения потребовалось почти в три раза меньше времени, чем при перепи- си 1880 года. В 1896 году Холлерит основал фирму по сбыту своих машин. В 1911 году он продал ее другой фирме, которая вскоре, слив- шись с другими, образовала Computing-Tabulating Recording Со., переименованную позднее в International Business Machines Corp. Хотя другими фирмами также разрабатывались различные виды перфокарт, карта Холлерита оказалась наиболее удачной. 1.2. Перфокарта IBM На рис. 1.1 приведена перфокарта (или карта) IBM. Она имеет 73/8 дюйма в длину и Зх/4 дюйма в ширину. На ней размещены 80 колонок, перенумерованных слева направо от 1 до 80, и 12 строк, которым присвоены номера сверху вниз: 12, 11 или X, О, 1, 2, . . ., 9. Прямоугольные отверстия могут быть отперфори- рованы в любой из 80 X 12 = 960 позиций на карте. Пробивки в каждой колонке карты представляют один символ. Символы делятся на цифры, буквы и специальные символы. На рис. 1.1 представлены комбинации пробивок (коды) для тех 64 символов, включая пробел, которые обычно используются при работе с перфокартами. Однако существуют коды для пред- ставления 256 различных символов. Эти коды приведены в При- ложении А. Пробивки в 12, 11 и 0 строках называются зонными пробив- ками; пробивки в других строках называются цифровыми про- бивками. На рис. 1.1 видно, что цифры представляются только одной пробивкой, буквы требуют две пробивки, а специальные символы требуют либо ни одной (пробел), либо одну (&, —), либо две (/,=, и т. д.), либо три ($, +, и т. д.) пробивки. Если перфори- руются все 256 кодов, некоторые символы требуют до 6 пробивок в колонке. Поле карты есть группа последовательных колонок на карте, содержащих единицу информации (например, дату, адрес и т. д.). Если на карте перфорируются числа, то для экономии места знак числа перфорируется обычно как зонная пробивка в колонке младшего разряда числа. Пробивка в строке 12 указывает, что число положительное; пробивка в строке 11, что оно отрицатель- ное; отсутствие пробивок в строках 11 и 12 означает, что число без знака. Числа без знака рассматриваются как положительные.
‘W9I пшйттофйщ у? п j 'v s*n ni oaiNiwd teos ’оз о н N II 11 ll л SI И tt U II It И M tl И H И И a II И К К « К й К К К 15 К I» И £> » Я Я О I» l> h it К К К 5! К tt It It It К К Н К Я >1 и II II II II II II II 51 И tl II II II | 1 I ! 5 I t I I titiiiiittittiiiiittiittttititiitlii|ttiiiii|tGtiitti|ttitittittii|titittifiiitt II11 IIIIIIIHIIIIIIIIIIIIIIIn 1111111|1Ш1"||1111П1|П1111Ш111|111111П1Ш £££i|£££ ££|£££££|£££U|£££££££££££££££|£££i£££|££££££££|££££££££££££|££££ll££l££ HI 99|99999|99999|99999|919999999999999|9999999|99999999|999999999999|9999999999 5 5 9999|9999i|99999|S999S|999S99SS SS $SS9S|SSSSSSS|SSSSSS9S|$SSSSS$S$S$S|S$$M$SSS tmmtlmttlmHltmilsttmmmmlmtmlHttmcImmtm ttlmmc lUllllllllllllllllllilllllilUlllllllllUllllUlllllllllUlllUlllllllllllUlU llllllll Illi tllllK llll llltl|llHlllllllllllllllllll|llllllll|llllllllllll|lllll м it ii it ii и n ti и it iz и а а и 5i и n n и и к к is к ss к t5 к is к и и а я я я я а и яit it it к srit tt a it it к u u к я к и и u n it iui n si и ti ti и n t i i i s > t t i 1111111111 nun 111111111111 ii 111111 iiiiiiii 111111111111111111111111 ii 1111 ii 1111 min i iiiiiiiii min i iiiiiiiii .=.e#si<-yj ।+»*:>/-? гАхмлпхзаоаамнтнэззаэау бз/эа^егю
12 Гл. 1. Перфокарта 1.3. Клавишный перфоратор IBM-029 На рис. 1.2 показан клавишный перфоратор IBM-029. Карты, помещаемые в магазин, попадают, пройдя пункты перфорации и чтения, в приемный карман. Клавиатура перфоратора подобна Рис. 1.2. Клавишный перфоратор IBM-02P. 1—стол; 2— клавиатура; 3—переключатели управления; 4—пункт перфора- ции; 3 — ключ возврата на шаг; 6 —пункт чтения ; 7 — карточный приемный кар- ман; 8—блокировка переполнения приемного кармана; 9—программное устройство; 10 — рычав подъема прижимного ролика; 11 — карточный магазин; 12 — печатающий механизм; 18 — рычаг прижима карты. клавиатуре пишущей машинки (см. рис. 1.3), над которой разме- щено несколько переключателей. Символы, перфорируемые нажа- тием каждой клавиши, приведены на рис. 1.4. Если на клавише помещены два символа, то верхний символ перфорируется в режи- ме «цифры», а нижний символ — в режиме «буквы». Следует отметить, что цифры 0—9 размещены иначе, чем это принято на большинстве пишущих машинок. Они размещены так, чтобы облегчить человеку перфорацию одной рукой всей числовой инфор- мации. Точка, запятая и дефис встречаются дважды и, таким образом, могут быть отперфорированы как в режиме «цифры», так й в режиме «буквы»; перфорируемый при этом код идентичен вне зависимости от того, какая клавиша используется. Все 63 сим- вола, приведенные на рис. 1.1, могут быть отперфорированы на перфораторе IBM-029.
1.3. Клавишный перфоратор IBM-029 13 Одним из существенных органов управления перфоратором является программный барабан, показанный на рис. 1.5. На рис. 1.6 показано расположение барабана в перфораторе. Когда рычаг программного управления поднят, зубчатые колеса Рис. 1.3. Клавиатура. (небольшие звездочки, которые ощупывают отверстия в программ- ной карте) поднимаются над барабаном и перфорация происходит в режиме «буква». Для перфорации цифрового символа клавиша «цифры» (NUMERIC) должна удерживаться в нажатом положении, когда нажимается нужная цифровая клавиша. Если рычаг программного управления опущен, зубчатые колеса соприкасаются с картой и перфорация происходит в режиме «цифры», пока пробивки в программной карте не зададут обратное. Программная перфокарта для любого вида работы пробивается следующим образом. Пробивки в строке 12 помещаются во всех колонках каждого поля, исключая первую. Рис. 1.4. Схематическое изображение клавиатуры.
3 Рис, 1.5. Программный барабан. 1 —фиксатор: 2 — контрольные отверстия; 3 —рукоятка прижимной планкиг 4 — прижимная планка. Рис. 1.6. Зубчатые колеса. I — программные губчатые колеса; 2 — индикатор номера коленки * 3 — рычаг программного управления.
llllllll 11 ill lllllll llllllllllllll'll 1 I I I I I 11 I 11 I I I I 11 11 11 li II 1J I Lil 1111 il I 1111 I I ll I I I Hill llllllll llllllll I 111 Hill lllllllll > 11 ll If llllllll 11 llUNlIlIll 'Hill'll 'll..... НЦ 1.3. Клавишный перфоратор IBM-029 15 Пробивка в строке 1 колонки вызывает переход на режим «буквы» для этой колонки. Если в колонке нет пробивки в первой строке, буквенная информация может быть отперфорирована только при одновременном нажатии клавиши «буквы» (ALPHA) и клавиши с соответствующим символом. Пробивка в строке 11 задает пропуск колонок (т. е. табуля- цию); колонки пропускаются до тех пор, пока не окончится поле (конец поля определяется по отсутствию пробивки в строке 12). При пропуске колонок никакой перфорации не происходит и поле остается пустым. Пробивка в строке 0 вызывает дублирование; пробивки на карте, находящейся в пункте чтения, дублируются в соответ- ствующие колонки карты, находящейся в пункте перфорации. Дублирование прекращается с окончанием поля. Управление перфорацией осуществляется также с помощью следующих переключателей, расположенных над клавиатурой. AUTO SKIP PUP (Автоматическая табуляция и дублиро- вание). Если переключатель установлен в положение ВЫКЛЮ- ЧЕНО, пробивки в строках И и 0 на программной карте игно- рируются. TWO PROG SEL (Селектор двух программ). Обычно этот переключатель установлен в положение «1». Если он установлен в положение «2», пробивки в строках 12—3 на программной карте игнорируются и вместо них используются пробивки в строках 4—9. При работе на второй программе пробивки в строке 4 опреде- ляют поля; пробивки в строке 5 задают табуляцию; пробивки в строке 6 задают дублирование, а пробивки в строке 7 задают режим «буква». AUTO FEED (Автоматическая подача). Если этот переключа- тель установлен в положение ВКЛЮЧЕНО, то после первых двух карт следующие карты подаются автоматически после того, как отперфорирована очередная карта. PRINT (Печать). Если этот переключатель установлен в поло- жение ВКЛЮЧЕНО, то каждый символ, отперфорированный в колонке, печатается сверху над этой колонкой. Печатающий механизм может быть установлен на любом 029 и поставляется за дополнительную плату. LZ PRINT (Печать левых нулей). Если этот переключатель установлен в положение ВКЛЮЧЕНО и если включен также переключатель PRINT, то в каждом поле слева от первой зна- чащей цифры будут печататься нули. Обычно этот переключа- тель устанавливается в положение ВЫКЛЮЧЕНО, и тогда печать левых нулей блокируется.
16 Гл, 7. Перфокарта CLEAR (Выброс карт). Если этот переключатель нажат, все карты, находящиеся внутри перфоратора, перегоняются в при- емный карман. Карты из магазина не подаются. BACKSPACE (Шаг назад) (рис. 1.2). При нажатий этой кла- виши карты, находящиеся в пунктах чтения и перфорации, воз- вращаются на колонку назад. Программная карта тоже возвра- щается назад. Номер колонки, в которой будет отперфорирован следующий символ, всегда может быть прочитан в индикаторе колонок, расположенном под программным барабаном. Чтобы проиллюстрировать подготовку программной карты, рассмотрим карту, которая будет управлять перфорацией колоды карт следующего формата: колонки 1—5 — цифры колонка 6 — всегда пропускается колонки 7—72 — буквы колонки 73—76 — буквы, причем эти буквы будут дуб- лироваться с карты на карту колонки 77—80 — пропускаются Карта такого формата потребуется нам, когда мы будем об- суждать перфорацию программы, написанной на Фортране (гл. 12). Программная карта имеет следующий вид: колонки 1 пустая 2—5 пробивка в строке 12 6 пробивка в строке 11 7 пробивка в строке 1 8—72 пробивки в строках 12 и 1 73 пробивки в строках 0 и 1 74—76 пробивки в строках 12 и 1 77 пробивка в строке 11 78—80 пробивка в строке 12 Отсутствие в колонках 1, 6, 7, 73 и 77 пробивок в строке 12 указывает на начала соответствующих полей. Чтобы поместить карту на барабан, нужно повернуть рукоят- ку зажимной планки до упора и снять с барабана старую карту. Вставить новую карту узкой стороной под ровный край метал- лической планки так, чтобы под планкой оказался край карты с колонкой 80. Повернуть рукоятку планки на полоборота. Тем самым будет зажат край карты с колонкой 80 и освобожден про- тивоположный край. Затем нужно вставить под металлическую планку край карты с колонкой 1, плотно натянув карту на бара- бан. Поворотом рукоятки до конца карта прижимается к бара-
1.3. Клавишный перфоратор IBM-02# 17 бану. Барабан помещается в программный блок, и опускаются зубчатые колеса. Если на барабане нет карты, зубчатые колеса опускать нельзя, так как это может привести к поломке устрой- ства. Для подачи первой карты надо дважды нажать клавишу FEED, затем повернуть переключатель AUTO SKIP DUP в поло- жение ВЫКЛЮЧЕНО, a AUTO FEED — в положение ВКЛЮ- ЧЕНО. Перфорируются колонки 1—5, пропускается колонка 6, перфорируются колонки 7—72; после того как в этом поле будет отперфорирован последний символ, нажимается клавиша SKIP для пропуска остальных колонок этого поля. Затем перфорирует- ся информация в колонках 73—76. Теперь переключатель AUTO SKIP DUP устанавливается в положение ВКЛЮЧЕНО. Это будет вызывать пропуск карты до конца и автоматическую подачу следующей карты. На второй и последующих картах перфорируются цифры в колонках 1—5; затем программная карта вызовет автоматиче- ский пропуск колонки 6; затем перфорируются колонки 7—72, и если информация, которая должна быть отперфорирована, не заполняет все поле, для продвижения карты до конца этого поля используется клавиша SKIP. В колонки 73—76 будет автоматически сдублирована информация с первой карты. После того как будет отперфорирована последняя карта, нужно вос- пользоваться переключателем CLEAR для выбрасывания карт из перфоратора. На клавиатуре клавиши с символами имеют серый цвет, а управляющие клавиши — голубой. Некоторые из управляю- щих клавиш мы уже упоминали. Остановимся на функциях, которые несут остальные. MULT РСН (Многократная перфорация). Если эта клавиша нажата, то в одной и той же колонке можно отперфорировать несколько цифровых символов. Эта клавиша обычно использует- ся при перфорации необычных кодов. PROG ONE и PROG TWO (Программа один и программа два). Когда начинается перфорирование карты, программное устройство находится в состоянии; указываемом переключателем TWO PROG SEL. Нажатие одной из рассматриваемых клавиш вы- зывает переключение перфоратора на соответствующую программу на барабане. Это состояние сохраняется либо до конца карты, либо до тех пор, пока не будет нажата другая клавиша. REL (Выброс карты). Нажатие этой клавиши вызывает перемещение карты, которая в настоящий момент перфори- руется, из пункта перфорации в приемный карман. Нажатием 2 3«* 15635
18 Гл. 1. Перфокарта клавиши REG (Регистр) следующая карта помещается в пункт перфорации. Если включен переключатель AUTO FEED, после первой карты автоматически выполняются функции как клавиши REL, так и REG. По нажатии клавиши DUP на карту, находящуюся в пункте перфорации, дублируются соот- ветствующие колонки с карты, находящейся в пункте чте- ния. Если используется программная карта, дублирование про- должается до конца поля; если программная карта не использует- ся, дублирование продолжается все время, пока нажата клавиша DUP. Если в пункте чтения нет карты, дублируются пробелы; это очень удобно, если нужно быстро пропустить на карте пер- вые колонки. AUX DUP (Вспомогательное дублирование). Используется . при установке дополнительного оборудования, позволяющего дублировать информацию со второго программного барабана на карту, находящуюся в пункте перфорации. LEFT ZERO (Левые нули). Эта клавиша используется для облегчения перфорации числовых данных переменной длины, расположенных справа в поле карты. Число набирается как обыч- но, только без левых нулей. При нажатии клавиши LEFT ZERO автоматически добавляются нули слева и перфорируется число. Если число отрицательное, нажатие клавиши «—» вызовет доба- вление нулей слева, а также даст пробивку в строке 11 младшего разряда числа. Если при наборе допущена ошибка, нажатием клавиши ERROR RESET (Сброс по ошибке) полностью сбра- сываются набранные в специальный регистр, но еще не отперфо- рированные на карте цифры. Размер поля задается пробивками в строках 1, 2 и 3 программной карты (строки 7, 8 и 9 для второй программы). Коды программного барабана: А Размер поля Программа один Программа два 8 кол. 2 8 7 3 9 6 2-3 8-9 5 1-2 7-8 4 1-3 7-9 3 1-2-3 7-8-9 Устройство, дающее возможность автоматического добавления левых нулей, устанавливается только за дополнительную плату. Если перфоратор оборудован печатью, то не следует дубли- ровать символы, не входящие в стандартный 63-символьный на- бор, так как это может привести к поломке печатающего меха- низма.
i'iiiliiiihiiniiihiilhii ll liiidi lili iiiiillliliilili liiii lilllllhliiiillKlIliiill LiiliilillliliilJllHulimuiillIilHi.MiliillltlilulIlluliililiiulilllll'IiillIiliLliWlluIllIhliihlilJiiilililJiililillhilliiiiiiihlUiii 1.4. Устройства для единичных записей 19 1.4. Устройства для единичных записей Термин единичная запись обычно применяется к оборудова- нию, которое имеет дело со стандартными перфокартами. Он вве- ден для отличия такого оборудования, как, например, вычисли- тельные машины или считывающие устройства с бумажной ленты, которые обрабатывают записи переменной длины, от оборудова- ния, которое обрабатывает карты фиксированной длины. Сама карта представляет собой запись, и поскольку в большинстве коммерческих применений каждая запись наносится на свою карту, обработка таких записей состоит из обработки отдель- ных карт. В этом разделе мы упомянем о некотором наиболее распро- страненном оборудовании для единичных записей. Клавишный контрольник IBM-059. Этот контрольник внешне напоминает перфоратор и работает подобным же образом. Карты, уже отперфорированные на клавишном перфораторе IBM-029, подаются в контрольник IBM-059. Оператор набирает на кла- вишах ту же информацию, которая предполагается отперфори- рованной на картах. Контрольник проверяет перфорацию; если обнаруживается расхождение, он блокирует клавиатуру и ставит отметку об ошибке сверху соответствующей колонки карты. Если карта правильная, отметка ставится на правой стороне карты и указывает на то, что карта была отперфорирована правильно. Проверка обычно делается, чтобы избежать случайных ошибок в данных на картах. Это наиболее надежный и самый дешевый способ проверки. Сортировки IBM-082, -083, -084. В этих машинах имеется 13 карманов: по одному карману на каждую строку на карте и карман для отбраковки. Установкой рычага выбирают одну из восьмидесяти колонок и помещают карты в магазин. Карты сортируются в карманы в соответствии с пробивками в выбранной колонке. Скорость сортировки от 450 до 2000 карт в. минуту (в зависимости от типа машины). Сортировка по всему полю может быть выполнена последовательно. Сначала сортировка выполняется по самой правой колонке, затем по второй справа колонке и т. д. Репродукторы IBM-514, -519. Репродукторы имеют два отдель- ных механизма подачи карт, каждый со своим магазином и прием- ным карманом. Колода карт, помещенная в один магазин, может быть сдублирована на пустые карты, помещенные в другом мага- зине, со скоростью 50 или 100 карт в минуту. Можно также вос- произвести информацию с эталонной карты на карты, следую- щие за ней в том же подающем механизме. Дополнительное устрой- 2*
20 Гл. 1. Перфокарта ство позволяет распознавать специальным образом помеченные карты и делать соответствующие пробивки. Пометки для распо- внавания наносятся на карты мягким свинцовым карандашом в нужных местах. Работа этих машин управляется специальной коммутационной доской. Раскладочные машины для перфокарт IBM-085, -087, -088. В этих машинах имеются два карточных магазина, содержимое которых объединяется в один поток карт и затём рассылается по пяти цриемным карманам. Под управлением коммутационной доски карты подаются из обоих магазинов. Поля карт могут срав- ниваться, и в результате сравнения определяется, в какой прием- ный карман следует послать карту или из какого магазина долж- на быть подана следующая карта. Раскладочная машина может обработать одну колоду карт и разделить ее на две колоды на осно- ве информации, отперфорированной на этих картах. Она может также объединить две колоды, рассортированные по некоторому принципу, в одну колоду, сохранив тот же принцип. Она может быть использована также для проверки колоды перфокарт. Мы можем проверить, находятся ли карты в надлежащем порядке, причем в качестве ключа может быть использовано число, зани- мающее 16 и более колонок. Некоторые раскладочные машины в процессе сортировки и объединения могут воспринимать как буквенную, так и цифровую информацию. Интерпретаторы IBM-548, -552, -557. В этих машинах карты читаются из магазина и содержимое колонок (до 60) печатается в строку на карте. Это дает возможность легко прочитать ее содер- жимое. Прогнав карту несколько раз через интерпретатор, можно получить распечатку в нескольких строках. На коммутационной доске указывается, какие колонки на карте будут печататься. Счетные машины IBM-602A, -604, -607, -609. Эти машины читают карту, выполняют различные операции: умножение, деле- ние и т. д. над числами, отперфорировянными ча картах, и перфо- рируют результат в указанной части той же или следующей карты. На коммутационной доске указывается, какие операции должны быть выполнены. Счетные машины иногда называют вычислительными, но этой терминологии не нужно придержи- ваться. Табуляторы IBM-402, -403, -407. Эти машины читают карты и печатают содержащуюся на них информацию. При работе могут быть вычислены и отпечатаны различные полные и частичные суммы. Могут быть распознаны карты с заголовком и информа- ция, содержащаяся на них (например, название, адрес) может
1.5. Коммутационная доска 21 быть отпечатана. Эти машины являются самыми дорогими среди машин для единичных записей. Подготовка коммутационной доски для управления работой этих машин требует высокой квалификации. 1.5. Коммутационная доска В предыдущем разделе мы упомянули о том, что работой большей части устройств для единичных записей управляют с помощью коммутационной доски. Пластмассовые, в алюминие- вом корпусе они выпускаются нескольких размеров для подклю- чения к различным машинам. Доска представляет собой не что Рис. 1.7. Коммутационная доска. иное, как прямоугольник с рядом отверстий, в которые могут быть вставлены стандартные коммутационные шнуры. Требуемая операция получается соединением (коммутацией) соответствую- щих отверстий. На рис. 1.7 приведена коммутационная доска, используемая в интерпретаторе IBM-557. Схема расположения отверстий левой половины доски приведена на рис. 1.8. Боль- шинство неотмеченных отверстий и вся правая половина панели
1 2 3 4 6 в 7 8 » К> * 12 13 14 15 1С 47 18 19 20 21 22 I 0 О I 5 Чтение uemenpemamopa—^xs — 20 Д 11-12 П Ш Ш1Ш ПIП Ш' шшппшпшп! 45 50 55 60 Ш1111ШШП1Ш1 65 70 75 80 ПШ1ШПШ1ШП - —-5 —— оооооооо 25 00.0 00000 45 оооооооо ———5 — оооооооо 25 ОООООООО 45 оооооооо Печать 1 ООО ООО ООО Печать! о о о 30 ООО 50 ООО о о о о о о —15 — о о о о о 35 о о о о о 55 О О О О О --15- О О О О О 35 О О О О О 55 О О О О О j А С Е G I 1 О О О О О 1 В 0 F Н J 1 О О О О О ГТ-— 0-9] О О О О О N 1 1142 О О О 0 О С С О О О 0 о ГТ - 0-9] о о о о о N 5 1142 О О О О О О 0 0 О О К М 0 Q S о о о о о L N Р R Т О О О О О -т—— — - Селеш О О О о о N 2 1142 О 0 о О О с с о о о о О гТ 0-9] о о о о о N 6 1142 о о о о q с с о о о о о и W Y 0 2 0 о о о о V X Z 1 3 о о о о о поры 1 ' 0*9 о о о о о N 3 1142 о о о о о с с о о о о о гТ- - - - -0-91 о о о о о N 7 1142 О О О О О с с о о о о о 4 6 8 Й- О 0 О О О 5 7 9 / О О О О рТ * 0-9i О О О О О N 4 1142 О О О О О С С 0 о о О О рТ 0-9 о о о о о N 8 1142 О 0 О 0 о С С О О О О О • Ш ° ?ы * $т о о * О О | # @т о о оооооооооооооооооооо 5 10 75 20 ОООООООООООООООООООО оооооооооооооооооооо 25 30 35 40 оооооооооооооооооооо оооооооооооооооооооо 45 50 55 60 оооооооооооооооооооо К SL м м р Q R 8 т и V W X Y Z АД А8 АС АО АЕ АГ AG АН AJ АК Рис. 1.8. Схематическое изображение коммутационной доски 557. 12 3 5 8 7 8 9 10 и 12 13 14 15 16. 17* 48 19 20 21 22
1.5Л Коммутационная доска 23 резервируются для управления дополнительными операциями. Их монтаж выполняется только за дополнительную оплату. В IBM-557 некоторые отверстия не используются вовсе. Но они предусмотрены, так как эти же коммутационные доски могут использоваться с другими машинами. Так, например, для репро- дуктора IBM-519 и раскладочной машины IBM-085 используется та же самая коммутационная доска, но, конечно, отверстия имеют на разных машинах разное назначение. Обычно один шнур соединяет два гнезда, но если нужно соеди- нить несколько гнезд, используются коммутационные шнуры с тремя или несколькими штеккерами. Использование коммута- ционной доски проиллюстрируем на устройстве IBM-557. В IBM-557 карты подаются из магазина лицевой стрропой вниз, тем краем, где расположена строка 12, и проходят через ряд из восьмидесяти читающих щеток. Щетки ощупывают карту и, когда обнаруживается пробивка, щетки касаются ролика, находящегося с противоположной стороны карты, и замыкают электрическую цепь. Таким образом, всякий раз, когда обнару- живается пробивка, возникает электрический ток. Поскольку первой поступает сторона со строкой 12, первыми ощупываются пробивки в этой строке. Интервал времени, за который ощупы- ваются пробивки в строке 12 карты, мы называем тактом 12. За тактом 12 следует такт 11 и т. д. и, наконец, такт 9. На пульте устройства предусмотрены два переключателя: «Печать», который может быть установлен в два положения, 1 или 2, и индикатор «Строка», который указывает, где печатать данную строку: над строкой 12, на строке 12, между строками 11 и 12, на строке И и т. д. За один прогон карт на них печа- тается только одна строка. Она печатается на лицевой стороне карты и может содержать до 60 символов, расположенных через равные интервалы. Положение гнезда на доске задается строкой и столбцом (см. рис. 1.8). Опишем коротко назначение различных гнезд. X — Q разделитель (А — В 1). Эти гнезда всегда выдают импульсы между тактами 11 и 0 и могут быть соединены только с гнездами X — 0 датчик селекторов. X —- 0 датчик селекторов (А — В 3—10). Эти гнезда пред- назначены для выбора любого из 8 селекторов. Цифровой датчик селекторов (А — В 11—18). Эти гнезда соответствуют тем же 8 селекторам, но импульсы получают обыч- но от гнезд Чтения интерпретатора.
24 Гл. 1. Перфокарта Чтение интерпретатора (D — L 1—20), Эти гнезда выдают импульсы в моменты, когда обнаруживаются пробивки в соот- ветствующей колонке карты. Если на схеме коммутационной доски два гнезда соединены прямой линией, то это означает, что эти два гнезда соединены и внутри машины. Такие пары гнезд уменьшают потребность в коммутационных шнурах с разветвлениями. Печать 1 (М — Р 1—20). Если переключатель Печать уста- новлен в положении 1, то импульсы, поступающие на эти гнезда, вызывают печать соответствующих символов. Эти гнезда обычно соединяются с гнездами Чтения интерпретатора. Печать 2 (Q — S 1—20). Назначение этих гнезд то же, что и гнезд Печать 1. Эти гнезда действуют только в том случае, если переключатель Печать установлен в положение 2. Наличие двух наборов гнезд Печати дает возможность задать на одной комму- тационной доске две различные операции. Разделитель колонки (С — Е 21—22). Каждый разделитель колонки состоит из трех гнезд: общего гнезда С, гнезда 11—12 и гнезда 0—9. В машине обеспечивается внутренняя коммутация гнезда С с гнездом 11—12 на тактах 11 и 12 и с гнездом 0—9 в осталь- ное время. Если соединить гнездо С с гнездом Чтения, а гнездо 0—9 с гнездом Печати, то можно отпечатать цифровую часть символа, отперфорированного в соответствующей колонке. Интерпретирующий эмиттер (W — X 1—22). На этих гнездах появляются сигналы, соответствующие символам, которыми эти гнезда промаркированы. Они могут быть использованы для вне- сения на карты такой информации, как знак доллара или точки, т. е. символов, которые обычно не перфорируются на картах. Блокировка интерпретации (N 21—22). Переключатель N (Q — R 21). Переключатель X (Q — R 22). Должны быть обязательно соединены либо два гнезда переключателя N, либо два гнезда переключателя X. Обычно соединяются гнезда переключателя X; это вызывает блокировку печати на тех картах, для которых гнезда Блокировки интерпретации получают импульсы 11 или 12. Если соединены гнезда переключателя N, печать блокируется для тех карт, для которых гнезда Блокировки интерпретации не получают импульсы Ц или 12.
1.5. Коммутационная доска 25 Селекторы (Y — AD 1—20). Каждый из восьми селекторов имеет пять позиций. Каждая позиция имеет три гнезда С, Т и N. Гнездо С (общее) обычно внутренне соединяется с гнездом N (обычным). Однако если этот селектор выбран, гнездо С соеди- няется с гнездом Т (передающим). Селектор считается выбранным, если в соответствующее гнездо X — 0 датчика селекторов или в гнездо цифрового датчика селек- торов поступил импульс. Селектор переключается на передаю- щие гнезда в момент поступления импульса и остается в этом состоянии на протяжении перфорации всей карты. Для выбора селектора могут быть использованы гнезда Чтения или даже Интерпретирующего эмиттера. Если селектор выбран, то все пять его позиций переключаются одновременно. В стандартном интерпретаторе IBM-557 для выбора селекторов используется обычно пробивка в строке 11, т. е. селекторы работают подобно разделителям колонок. Управление печатью нулей (АЕ — АК 1—20). При обычной работе символы, соответствующие одиночным пробивкам в стро- ках 0, 12 или 11 (т. е. 0, & и —), не печатаются интерпретатором IBM-557. Печать этих символов разрешается, если в нижнее гнездо соответствующей колонки поступит ненулевой импульс. Верхние гнезда выдают импульс всякий раз, когда в соседней слева колонке на гнезда Печать 1 или 2 (в зависимости от поло- жения переключателя Печать) подается символ, имеющий про- бивки в строках 1—9. Соединив нижние гнезда всех, кроме первой, колонок поля с верхними гнездами следующих колонок, можно вызвать блокировку печати левых нулей и не блокиро- вать печать значащих нулей. Чтобы проиллюстрировать подготовку коммутационной доски, рассмотрим колоду карт, содержащую два типа карт. Первый тип карт: пробел в колонке 1, количество долларов и центов, или число ххх.хх, в колонках 11—15, и число ууу в колонках 21—23. Если число отрицательное, в колонке 23 делает- ся пробивка в строке 11. Второй тип карт: пробивка в строке 11 колонки 1 и число в колонках 21—23. Колонки 11—15 могут содержать произволь- ные пробивки. Эти карты должны интерпретироваться следующим образом: на всех картах число ууу должно быть отпечатано в позициях 58—60. Если число отрицательное, знак минус должен быть отпе- чатан в колонке 57, в противном случае в колонке 57 должен стоять пробел. В колонке 60 печатается только цифровая часть (т- е. если присутствовали пробивки 8 и 11, то печататься должна Цифра 8). На картах первого типа поле колонок 11—15 должно
26 Гл, 1. Перфокарта быть отпечатано в позициях 2—-7 (десятичная точка должна печататься, а нули слева нет). Коммутация, приведенная па рис. 1.9, даст следующий результат: Карта Будет напечатано X 12345 876 Ь876 X 01237 877 Ь877 X 00003 879 Ь879 X 00000 87J -871 13579 76L 135.79 -763 13002 763 130.02 Ь763 00330 042 ЬЬЗ.ЗО Ь042 00003 000 ЬЪЬ.ОЗ ЬООО Упражнения № 1 1. Если перевернуть карту IBM вверх ногами, то произойдет замена строк 12 и 9, 11 и 8 и т. д. Как были бы считаны следую- щие карты, будучи перевернутыми? (а) 3 + 2 = 5; (Ь) $ 36; (с) HIGHLY; (d) ERROR. 2. Если бы на карте было отперфорировано (а) 3 + 2 = 5; (Ь) $ 36; (с) HIGHLY; (d) ERROR и кто-то пробил строку 8 в каждой колонке, что было бы считано с каждой карты? 3. Если при перфорации на клавишном перфораторе IBM-029 в каждой колонке карты сделано несколько пробивок, то какой символ представлен на карте? (а) 0, 3, 8 (с) 0, 8, 9 (е) 12, 11, 0, 4 (g) 12, И, 9 (Ь) 0, 5, 8 (d) 0, 1, 8 (f) 2, 4, 8 4. Какие соединения должны быть добавлены на коммута- ционной доске (см. рис. 1.9), чтобы в позиции 14 каждой карты печаталась буква G? 5. Какие соединения нужно добавить к упр. 4, чтобы буква G печаталась только на неотмеченных картах (не Х-картах)? 6. Какова должна быть программная карта, чтобы на про- грамме 1 во всех колонках перфорировалась буквенная инфор- мация, а на программе 2 цифровая? 7. Составить программную карту так, чтобы: в колонках 1—5 перфорировались пять цифр из специального регистра добавления левых нулей; в колонках 6—8 трехзначное числовое поле; в ко- лонках 9—29 печаталось бы 30- символьное буквенное поле. Пропустить колонки 30—72. В колонках 73—80 дублировать буквенную информацию (после того, как она будет отперфори- рована на первой карте).
t 3 8 9 10 И 12 13 44 1Б 1C 17 18 19 20 21 22 гХ-OSPTt— Х-0 spt или CTRL ^-Датчик селекторов . шшш -25 -30 15--11’12 м 11 6 6 6 6 6*-* Р ЗВ 40р | -- -30-/ / 35 40 гщппплцппи ^*45 60 ' '56 «л 1ПП шпш --5 - о о о О о о о о а с ।: О О Р В D F 45 50 о 20* о 40 о 60 О о 15-------------201 о о о о О О 35. 40 о o*sp ооо 55 60 X иа и -INT Х-| /о—о! ' П 55 60 ШШ! 75 80 ШИШ Печать 1 N J к L м N ₽ Q о о Ь/о о о о /3 о о £ _ -т |/~ 0-Эг-Т- —/ Селекторы '—,,w 0:9гт oojpoooofoo о]4 - - - - N 41 11-12 N / 2 и-d N i /*•—• о о о од о с / с С/ СМС о • • • о «Jbe о о о ** 4 о ) о о 3 о N О С О о о о 5 О о о О О' 11-12 О О С о о N О с о U <5 С о 6 о о О 11-12 О О С О О Рис. 1.9. Коммутационная схема. X Y Z АЛ АВ АС 0-9] % О # О о о 11-12 о о с о о —о-э о о 11-12 о о с о о о о 11-12 О О .С* ДУ^О —0-91 О о 11-12 о о с 0 -° 7 — о о о о 15 о о о о о о ООО 35 О о о о о о о о о о 55 о о О О О о N о с о о о о о о о 7 О о Управление печатью нулей ~ о * ~ * о Nj С О •Т- О N О С О о о о о о о О 8 о о ®т о ° ° ] п ] Г °« оо44444ооо ооооооооооооо 25 30 ооооооооооо ооооооооооо 45 50 ооооооооооо О' о о о оооо 20 3 0 0 0 > о о о 40 о о о о 60 АН М АК 4X3 5 6 W И 11 15 М 15 16 17 14 1« 20 21 22
Глава 2 МАТЕМАТИЧЕСКИЕ ПОНЯТИЯ 2.1. Вещественные числа При счете начинают с числа один (1) и продолжают в сторону возрастания: два (2), три (3) и т. д. Получающиеся при этом числа называют натуральными числами и говорят, что натуральные числа образуют множество, состоящее из 1, 2, 3, .... . Счет как в прямом, так и в обратном направлении приводит нас к понятию целых чисел. Считая в прямом направлении, полу- чаем +1, +2, . . ., а в обратном, начиная с единицы, нуль (0), затем —1, —2, .... Натуральные числа (называемые еще целыми числами без знака) соответствуют положительным целым числам. Целые числа делятся на три группы: 1) положительные целые, 2) нуль, 3) отрицательные целые. Положительные числа часто пишут без • знака; так вместо +789 можно писать 789. Так как нуль не является ни положи- тельным числом, ни отрицательным, у него нет знака; однако иногда для удобства пишут +0 или —0;. в любом случае подра- зумевается просто нуль. Отметим на прямой две несовпадающие точки и поставим в соответствие левой из них число 0, а правой +1. Тем самым на прямой задан масштаб, с помощью которого можно разметить прямую положительными числами справа от 0 и отрицательными слева. Каждой точке прямой поставим в соответствие число, рав- ное расстоянию этой точки от нуля, со знаком + или — в зави- симости от того, находится эта точка справа или слева от нуля; скажем, так: | , | J—-т—г—i I Г--*» -3 0 +1 +5 Числа в этом несчетном множестве носят название веществен- ных чисел. Целые числа составляют лишь небольшое подмноже- ство вещественных чисел. Под абсолютным значением или абсолютной величиной числа понимают расстояние до него от нуля. Абсолютная величина
2.2. Индексы 29 числа обозначается парой вертикальных черточек. Например, | 6.78 | = 6.78, | 3 | = 3, | —8.7 | = 8.7, | 0 | = 0 и | -2 2. Общее правило для обращения с абсолютными величинами заклю- чается в следующем: | q | = q, если q положительно; | q I = О, если q равно нулю; | q | = —q, если q отрицательнр. Одно из свойств вещественных чисел — их упорядоченность; для любых двух вещественных чисел р и q выполняется одно из следующих трех соотношений: 1) р совпадает с q; 2) р лежит справа от q; 3) р лежит слева от q. Если р совпадает с q, говорят, что р равно q, и пишут р = q; чтобы указать, что р не равно q, пишут р У= q. Если р лежит справа от q, говорят, что р больше q, и пишут р > q; чтобы ука- зать, что р не больше q, пишут р q. Если р лежит слева от q, говорят, что р меньше q, и пишут р < q; чтобы указать, что р не меньше q, пишут р <£ q. Кроме того, используются и другие символы: р q означает, что либо р = q, либо р > q. Это равносильно тому, что р <f q. р < q означает, что либо р = q, либо р < q. Это равносиль- но тому, что р 4> <!• В качестве примера рассмотрим следующие соотношения: 3 = 3, 3 > 2, 3 < 4, 3 > 1, 3 < 8, -3 < 2, -2 > -4, 7 > 14, 7 <14, ОС1/,, 0>-1/„ 4^5. 2.2. Индексы Индекс (или нижний индекс) приписывается к символу для выделения отдельных членов некоторого класса. Например, если три измерения веса предмета дали следующие результаты: 34.8 г, 35.2 г и 34.9 г, можно символически записать эти веса так: Wi == = 34.8 г, w2 = 35.2 г, w3 = 34.9 г. Здесь 1, 2, 3 — индексы. Когда говорят об измерении веса вообще, без обязательной иден- тификации отдельного измерения, в качестве общего символа пишут wt, причем подразумевается, что i = 1, 2 или 3. Для индек- сов можно использовать любые символы, но обычно берут буквы иэ середины алфавита: i, j, k, 1, m, n. Иногда требуется более одного индекса. Разные индексы обычно записываются друг за другом, например: х13, xkm, yijk, Ць Однако, чтобы избежать недоразумений, индексы иногда разделяют запятыми: xlf3; xk,m; уk; t3>1.
30 Гл. 2. Математические понятия Для обозначения сумм используется символ S (сигма — заглавная буква греческого алфавита). Запись вида п 3 х> i-m обозначает сумму Xi с индексами от m до п включительно. Проил- люстрируем это: 4 2 Xj = x24-x3 + x4; j=2 4 2 i2= I2 + 22 4-З2 + 42 = 30. i==l В последнем случае, например, производится суммирование чле- нов с i = 1, i = 2, . . ., i ~ 4. Буква i называется индексом суммирования; тип являются соответственно нижним и верхним пределами суммирования. Когда пределы суммирования и индекс очевидны из контекста, они могут быть опущёны. Греческая буква П (заглавная «пи») используется таким же образом, как и сигма, но только для обозначения произведения чисел, а не их суммы. Например: з Д Xi = Xt X Х2 X х3; 4 П j2==12>< 22 x 32x 42 = 576. 2.3. Системы счисления Когда пишут число 327, под этим подразумевают величину 3 X 102 + 2 X 101 + 7 X 10°. Когда пишут число 87.75, под- разумевают 8 X 101 + 7 X 10° + 7 X 10е"1 + 5 X 10~а. Преиму- щество такой системы, называемой десятичной системой счисле- ния, состоит в том, что она позволяет представлять любые числа, используя только десять разных символов, не считая десятичной точки, если она необходима. Первая цифра слева от десятичной точки представляет просто написанное значение цифры; следую- щая цифра слева представляет десятикратное значение цифры; следующая — стократное значение и т. д. Первая цифра справа от десятичной точки представляет десятую часть значения напи- санной цифры, следующая — сотую часть и т. д. Так как дей- ствительное значение, представляемое цифрой, зависит от ее
2.3. Системы счисления 31 положения внутри числа, мы говорим, что десятичная система счисления является позиционной. То, что числа представляют в виде степеней десяти, не вызва- но никакими особыми причинами. Вероятно, арабы взяли за основу число десять, просто потому, что в качестве «счетного устройства» они использовали десять пальцев рук. Однако и ныне существуют народы, использующие другие системы счисления. Возьмем, например, число 327. Вполне логично записать 327 и как 5 X 8а + О X 81 + 7 X 8° = 5078, где индекс указывает, что мы говорим о числе, при записи которого в качестве основания системы счисления вместо обычного числа десять используется число восемь. Числа, записанные в системе с основанием восемь, называются восьмеричными. Вместе с тем мы можем записать 32710 в виде 1 X 162 + 4 X 161 + 7 X 16° = 1471в. Числа, выра- женные в системе с основанием 16, называются шестнадцатерич- ными. Простейшим основанием системы счисления является 2. В ней 327 — 1 х 2.8 + О х 27 + 1 X 2« + О X 25 + О х 24 + 0 х 23 +1 х X 2а + 1 X 21 + 1 X 2° = 101 000 1112. Преимущество исполь- зования двойки в качестве основания системы счисления состоит в том, что требуется всего два различных числовых сим- вола, 0 и 1, для записи любого числа. Недостаток двоичной систе- мы в том, что для написания числа. в двоичной форме требуется примерно в 3.3 раза больше цифр, чем в десятичной. Подобно тому как для записи десятичных чисел используют десять цифр, для написания двоичных чисел применяют две цифры, восьмеричных — восемь и шестнадцатеричных — шестнад- цать. Так как только десять цифр из шестнадцати имеют обще- принятые обозначения 0—9, то для записи 10, 11, 12, 13, 14 и 15 будут использоваться соответственно символы А, В, С, D, Е и F. Таким образом, 2Е1в = 2 X 161 + 14 х 16° = 4610. ’С дробями при любом основании обращаются так же, как и в десятичной системе; необходимо учитывать лишь то обстоя- тельство, что конечная дробь в одной системе счисления может стать периодической в другой. Например, .381в = .2187510, но .2jo = .333333... 1в. Иногда требуется переводить числа из одной системы счисле- ния в другую. Преобразовать шестнадцатеричное число в двоич- ное совсем несложно: просто каждая шестнадцатеричная цифра записывается с помощью четырех двоичных цифр. Например, 1471в записывается как 0001 0100 0111 — 1010001112. Это воз- можно потому, что 16 является степенью 2. Подобный метод применим и для восьмерично-двоичных преобразований. Задача преобразования из десятичной системы в шестнадцатеричную (или восьмеричную, или двоичную) и обратно несколько труднее. Проиллюстрируем общий метод четырьмя примерами.
32 Гл, 2, Математические понятия Пример 1. Найти шестнадцатеричное представление числа 714310. 7143 4- 16 есть 446 И 7 в остатке, 446 4- 16 есть 27 и 14 = = Е в остатке 27 4- 16 есть 1 и 11 = = В в остатке 1 4- 16 есть 0 и 1 в остатке. Поэтому 7143 10 ~ 1ВЕ71в, Пример 2. Найти шестнадцатеричное представление числа 0.217510. .2175 X 16 = 3.48 = 3 4- .48, .48 X 16 = 7.68 = 7 4- -68, .68 X 16 = 10.88 = А 4- -88, .88 X 16 = 14.08 = Е 4- -08, .08 X 16 = 1.28 = 1 4- -28, .28 X 16 = 4.48 = 4 4- .48, .48 X 16 = 7.68 = 7 4- -68. Поэтому .217510 = .37АЕ147АЕ147..Ч Пример 3. Найти десятичное представление числа 9F3Aie 9 X 16 = 144 144 4- F = 159. 159 X 16 = 2544 2544 4- 3 = 2547. 2547 X 16 = 39152 39152 + 10 = 39162 Поэтому 9F3Aie = 39162i0. Пример 4. Найти десятичное представление числа .9В281в. 8 -5- 16 = .5 2 + .5 = 2.5. 2.5 4- 16 = .15625 11 + .15625 - 11.15625. 11.15625 4- 16 = .697265625 9 4- .697265625 = 9.697265625 9.697265625 4- 16 = .6060791015625 Поэтому .9B28ie = .6060791015625ю- (При решении примера 4 на настольной счетной машине может оказаться более удобным умножать на 1/16 = .0625, а не делить на 16.)
2.4, Плавающая точка 33 Упражнения № 2 1. Из следующего набора: —2; —2.6; —7/3; 0; У1\ 670/5 выбрать: а) положительные целые числа; Ь) числа, абсолютная величина которых меньше 2; с) числа, которые не больше —3; d) числа, которые больше или равны 4. 3 5 2. Вычислить: a) S(i2-“3i); Ь) 2 (j”“3)2; i=l j=2 5 2 45 S3(Sk*)=; d) 2 7. k=3 i=l n—3 3. Дано: xi = 3, x2 — 4, x3 = —3, x4 = 2, x5 = 1. Вычислить: a) 2 x; b) S x2; c) 5 (x — 1.2)2; d) П x; e) П (x - 3.4). 4. Преобразовать следующие десятичные числа в двоичные: а) 7; Ь) 26; с) -6; d) 6.375; е) -.00304. 5. Преобразовать следующие двоичные числа в десятичные: а) 101101; Ь) 111001; с) 10101000; d) 11.11; е) .001101. 6. Найти шестнадцатеричное представление для каждого из чисел у пр. 5. 7. Преобразовать следующие десятичные числа в шестнад- цатеричные: а) 32769; Ь) -11200; с) 16389195; d) 77875; е) 1.39; f) 2/7; g) 555.441; h) 123456789.012345. 8. Преобразовать каждое из следующих шестнадцатеричных чисел в десятичное: a) 12A3D4; b) 8ВС; с) .18; d) 45.55; е) 32769; f) 123456.789ABF; g) FFFFE; h) 3fJGBFA001.CBC. 2.4. Плавающая точка При выполнении сложных вычислений очень важно следить за положением десятичной точки. В большинстве коммерческих расчетов имеют дело с конкретными денежными единицами, и по- этому точно известно, где должна находиться десятичная точка. Однако при проведении большинства научных и инженерных вычислений положение десятичной точки может изменяться в ши- роких пределах; часто, приступая к расчету, трудно представить ее возможное положение. Для иллюстрации рассмотрим простую задачу построения графика функции х+11 у 8x2-26x4-21 Начнем с выбора значений х и вычисления соответствующих значений у. Таблица может включать, например, следующие 3 Зак. 15635
34 Гл. 2. Математические понятия значения: X У -20 -10 0 1.2 1.4 1.6 1.8 2.0 10 20 -.00241 +.000925 +.524 9.24 44.3 -105. +107. 13. .0374 .0115 Мы видим, что значения изменяются по величине по крайней мере в 10б раз. Если взять в этой задаче больше значений х, то мож- но увидеть, что значения у в действительности изменяются гораз- до больше, чем в 10б раз. Для того чтобы решить проблему о положении десятичной точки, удобно каждое вещественное число представлять в виде десятичной дроби в пределах от 0.1 до 1.0, умноженной на сте- пень десяти. Так, .0028 = .28 X 10-2, 108.75 = .10875 X 103. Говорят, что написанные таким образом числа представлены в форме с плавающей точкой. Иногда число записывают в виде правильной дроби, умноженной на степень десяти, причем дробь меньше .1, например 2.3333 = .023333 X 102; говорят, что числа, записанные таким образом, представлены в ненормализованной форме с плавающей точкой. Дробная часть числа с плавающей точкой называется мантис- сой, или дробью, а показатель степени — характеристикой, или порядком. Так как не существует способа перфорации показателей степени на перфокартах, числа часто перфорируются в экспонент циальной форме, при которой за десятичным числом следует бук- ва Е (или иногда D) и целочисленный показатель степени. Таким образом, можно написать: .28 X 10~2 == .28Е—2 = 2.8Е—3 = 28.0Е-04 108.75 = .10875Е+3 = Л0875ЕЗ Число в форме с плавающей точкой, записанное в шестнадца- теричной системе счисления, выражают дробью, умноженной
2.5. Булева алгебра 35 на степень 16. Число нормализовано, если дробь лежит между O.lie (1/16 в десятичной системе) и 1. Теоретически вещественное число имеет бесконечное число десятичных разрядов. На практике мы можем производить вычи- сления только с конечным, часто очень малым числом цифр. Опыт показал, что в большинстве практических вычислений достаточно работать с мантиссами, имеющими 8 десятичных или 6 шестнад- цатеричных цифр. 2.5. Булева алгебра Булева переменная — это переменная, принимающая только два значения, обычно называемые «истиной» (True) и «ложью» (False) и обозначаемые соответственно 1 и 0. Для булевых переменных определяются четыре операции: ~| или ~ означает логическое НЕ, | или V означает логическое ИЛИ, & или Д означает логическое И, V и © означает логическое ИСКЛЮЧАЮЩЕЕ ИЛИ. Операции определяются следующим образом: ' НЕ: “11 = 0; 0 = 1; ИЛИ: а V Ь — 1, если ‘а и Ь одновременно не равны 0, а V Ь == 0, если а = b = 0; И: а Д b = 1, если а и Ь одновременно равны 1, а Д b = 0 в остальных случаях; ИСКЛЮЧАЮЩЕЕ ИЛИ: а ® b = 1, если а =/= Ь, а ® b = 0, если а = Ь. Булевы или логические операции можно применить к произволь- ным двоичным < шслам. В этом случае они применяются отдельно к каждой паре двоичных цифр. Например: 1100 1100 1100 ~1 0101 V 0101 Д 0101 ©0101 1010 1101 0100 1001 Операция НЕ применяется к одной переменной, остальные — к двум. Подобно сложению и умножению операции ИЛИ, И и ИСКЛЮЧАЮЩЕЕ ИЛИ коммутативны: а\/Ь = Ь\/мДЬ = = Ь Д а; a®b = b®a. Для задания порядка операций можно использовать скобки: 1 v (0 д 1) = 1 V о = 1 п(1 д (1 v 1)) = п (1 Л 1) =п 1=о з*
36 Гл, 2, Математические понятия При отсутствии скобок первой всегда выполняется операция НЕ, затем И и, наконец, ИЛИ и ИСКЛЮЧАЮЩЕЕ ИЛИ: 1 у о д 1 = 1 v о = 1 В этой книге мы будем следовать в основном обозначениям, принятым для системы 360, в которой используются “1, |, & и Ф. 2.6. Дополнение Под дополнением до десяти десятичного целого числа мы пони- маем результат вычитания его из числа, состоящего из единицы с таким числом нулей, которое равно количеству цифр у допол- няемого числа. Таким образом, дополнением числа 34974 будет -100000 34974 65026 Общее правило состоит в том, что нужно вычесть каждую цифру дополняемого числа из 9 и к результату добавить 1. В основном дополнение обычно используется для пред- ставления отрицательных чисел. Почти все настольные счетные машины представляют отрицательные числа в форме дополнения до десяти. Одним из преимуществ этого представления является простота выполнения сложения. Например, при сложении 8976 с —384, если оба числа набираются на цифровых колесах ариф- мометра, операция будет выглядеть следующим образом: 00008976 +99999616 00008592 причем последняя единица переноса влево теряется из-за того, что арифмометр, например, имеет только восемь цифровых колес. Вычитание состоит из получения дополнения вычитаемого и по- следующего сложения. Под дополнением до девяти десятичного целого числа мы пони- маем результат вычитания каждой его цифры из 9. Таким обра- зом, дополнением 34974 будет —99999 34974 65025 Мы видим, что дополнение числа до десяти всегда на единицу больше его дополнения до девяти. В основном дополнения до девя- ти используют для формирования дополнения до десяти.
2.7. Ошибки округления 37 При работе с двоичными целыми числами дополнение до двух аналогично дополнению до десяти, а дополнение до единицы — дополнению до девяти. Таким образом, дополнение до двух числа 10011010 будет _100000000 10011010 01100110 а дополнение его до единицы _11111111 10011010 01100101 2.7. Ошибки округления Легко проверить, что х =? 8, у = —3 являются решением системы уравнений: 5х + 13у = 1 7х + 18у = 2 Простейший способ решения этой системы относительно у — это умножить первое уравнение на 7, второе — на 5 и вычесть второе из первого: 35х + 91у = 7 35х + 90у = 10 У = — 3 Другой метод, математически эквивалентный первому, состоит в том, чтобы разделить первое уравнение на 5, второе — на 7 и затем вычесть одно из другого: , 13 1 х+5-У = Т , 18 2 Х+Тув7 1 з 35ув 35 У--3 Теперь предположим, что нам нужно проделать вычисление над числами в форме с плавающей точкой, имеющими семираз- рядную мантиссу. Фактически это означает, что на любом этаце вычисления мы будем иметь самое большее семь значащих цифр.
38 Гл. 2". Математические понятия Наши уравнения в общем выглядели бы следующим образом: 1.000 ОООх + 2.600 ОООу = .200 000 0 1.000 ОООх + 2.571 429у = .285 714 3 .028 571у = —.085 714 3 откуда делением получаем у = -3.000 046 а не = —3.000 000. Ошибка возникла потому, что при вычитании числа были так близки друг к другу, что мы потеряли две зна- чащие цифры. Таким образом, в окончательном значении для у мы имеем только пять верных цифр, несмотря на то, что всюду при вычислениях мы использовали семь. Должно быть ясно, что ошибка округления зависит большей частью от конкретных чисел, с которыми производят вычисле- ния, а также от метода решения. Этот вопрос должным образом рассматривается в численном анализе, однако, используя при получении численных результатов приближенные значения, надо отдавать себе полный отчет в том, что ошибки все же возникают. В длинных вычислениях можно легко потерять все семь знача- щих цифр и получить совершенно неверный результат. Упражнения № 3 1. Написать в нормализованной десятичной форме с плаваю- щей точкой: а) 24.456; Ь) 1.0; с) 258.375; d) .00057; е) 1,000; f) 0.01875. 2. Написать каждое из десятичных чисел в упр. 1 в шест- надцатеричной форме с плавающей точкой. 3. Написать каждое из чисел в упр. 1 в экспоненциальной форме. 4. Вычислить выражения: а) и А V В Д С, Ь) А V В Д С, с)А7пАДВДС, d) П (А А В) V с при 1) А = 1, В = 0, С = 1; 2) А = 0, В = 0, С = 0; 3) А = 1, В = 1, С = 1; 4) А = 0, В = 1, С = 1.
2.8. Статистика 39 5. Найти дополнение до девяти каждого из заданных деся- тичных чисел: а) 677904; Ь) 990090; с) 053150; d) 000082. 6. Найти дополнение до десяти каждого из чисел в упр. 5. 7. Найти дополнение до единицы каждого из приведенных шестнадцатеричных чисел и выразить результат в шестнадца- теричной системе: а) 45В74340; b) 436DC0FF; с) 00000000; d) 1EA00F12. 8. Найти дополнение до двух каждого из чисел, заданных в упр. 7. 9. Получить сумму чисел из упр. 7а и 7Ь. 10. Решить уравнения 233х + 259у = 51 9х + 10у = 2, используя два метода из § 2.7. И. Найти произведение шестнадцатеричных чисел 1Е4 и С6. 2.8. Статистика Часто нам приходится иметь дело с настолько большим объе- мом числовых данных, что нет никакой возможности исследо- вать каждый элемент в отдельности. Наилучший выход из такого положения — это описать такую совокупность данных с точки зрения их свойств. Наиболее распространенными характеристи- ками являются среднее значение, дисперсия, квадратичное откло- нение и среднее отклонение. Среднее значение множества чисел Хъ Х2, . . ., Хп обозна- чается X (читается X с чертой) и определяется как X = 5 Xj/n. Для удобства обычно опускают индекс суммирования и пишут просто X = 2 Х/п. Если мы исследуем числа Xi = 78, Х2 = 64, Х3 = 83, Х4 = = 91, Х5 = 29, то X = 78+64+83 + 91 + 29 69 Q() 5 Среднее значение определяет центр множества. Однако если мы нашли центр множества, нас будет интере- совать разброс элементов относительно центра. Для этого чаще всего используется дисперсия, s2, определяемая как s2 = S(Xj —Х)2 nSX2—(SX)2 n— 1 n(n— 1)
40 Гл. 2. Математические понятия Вторая формула получена из первой алгебраическими преоб- разованиями. С точки зрения вычислений вторая формула являет- ся более удобной. Для чисел нашего примера SX2 = 26191, SX = 345, п = 5 и, следовательно, s2 = 596.50. Квадратичное отклонение s определяется как квадратный корень из дисперсии. В нашем примере s = 1/s2 = 24.42. Среднее отклонение м S I X—X I является другой мерой разброса. Она используется в основном в задачах товарного учета и в задачах контроля качества, где ее вычислить легче, чем дисперсию. Однако в большинстве слу- чаев легче вычислить дисперсию, и поскольку дисперсия дает более надежную меру разброса, то среднее отклонение исполь- зуется редко. В нашем примере м^9+5 + Н+22+40_18 00, 5 Если значения данных подчиняются распределению Гаусса, как чаще всего и бывает, то справедлива приближенная формула M = s |^2/л. Иногда данные группируют по классам, например; X f 12-14 1 15-17 4 18-20 7 21-23 3 15 В этом случае мы незначительно изменим наши определения: n = Sfi 2 _ S(X-X)2 f _n^X^f-gX^)* S n— 1 n(n —1) M S|X — X|f n где через Xj мы обозначаем среднее значение элемента в грани- цах его значений в классе. В нашем примере
2.9. Матрицы 41 n = 15 у 13x1 + 16x4+19x7+22x3 = lg SX«f = 13» X 1 +162 X 4+192 x 7 +222 X 3 = 5172 2 15X5172—2762 „ „Q --------i53H4----6’69 M 5.4 X 1 + 2.4 X 4 + 0.6 X 7 + 3.6 X 3 = 2 00 15 Часто нам приходится иметь дело с парами величин, которые,, как мы предполагаем, зависят друг от друга. Например, нам даны оценки по математике первокурсников и их оценки на всту- пительных экзаменах по математике. Нас интересует, существует ли линейная зависимость между этими величинами и какова она. Меру зависимости между Х-ами и Y-ами можно выразить- с помощью коэффициента корреляции: 2(Х —X)(Y-Y) д nSXY—(2Х) (SY) Г И 2 (X-X)2.S (Y—Y)2 “ l/[nSX2-(SX)2] [n2Y2-(2Y)2] Здесь вторая формула получена из первой алгебраическими пре- образованиями; г2 является мерой отклонения значений Y-ob и выражение для г2 может быть приведено к одному неизвестному при линейной зависимости между Х-ми и Y-ами. Знак г не имеет значения. Метод наименьших квадратов дает следующие формулы для вычисления коэффициентов линейной функции Y = а + ЬХ, наи- лучшим образом выражающей зависимость Y от X: S(X-X)(Y—Y) _ n2(XY)-(SX)(SY) 2(Х-Х)2 ~ nS(X2)-(SX)2 a = Y-bX Сначала вычисляется величина Ь и затем ее значение использует- ся для вычисления а. Коэффициент b называется коэффициентом регрессии. 2.9. Матрицы Рассмотрим задачу решения системы линейных уравнений: 4х — Зу = 11 6х + 8у = 9 и задачу решения уравнений: 4w — 3z = 11 6w + 8z = 9
42 Гл» 2. Математические понятия Эти две задачи эквивалентны. Действительно, для того, чтобы решить эти уравнения, нам нужны только коэффициенты и сво- бодные члены, которые могут быть записаны в следующем виде: 4 -3 11 6 8 9 Любой прямоугольный набор чисел называется матрицей. Если число строк равно числу столбцов, такая матрица называется квадратной матрицей. В приведенном примере мы имеем матрицу размера 2x3, так как в этой матрице 2 строки и 3 столбца. Матрица из одной строки называется вектором-строкой; матрица из одного столбца называется вектором-столбцом. В общем виде матрица размера г X с представляется сле- дующим образом: аи а21 ari а12 • • • а1С а22 • • • age аГ2 • • • агс Для простоты иногда пишут А = || ац || или А = || а ||. Иногда также вместо двух вертикальных линий используются большие круглые скобки. Произведением матрицы на скаляр, т. е. на произвольное число, называется матрица, полученная умножением на скаляр каждого элемента матрицы. Например, если 4 -3 И А= 7 5 9 то -8 6-22 -2х А= _14 _1() _18 Суммой и разностью матриц одного и того же размера, т. е. ма- триц с одинаковым числом строк и столбцов, называется матрица, полученная сложением или вычитанием соответствующих эле- ментов. Например: A = ||aiJ||, В = ||М» A+B = |la1J + biJ||, 4 -3 11
2,9, Матрицы 43 А + В = А-В = 7 9 1 5 -4 4 -2 -6 5 5 17 13 » Сложение и вычитание определено только для матриц одного и того же размера. Умножение матриц определяется следующим образом: А = ||ац ||, В = || Ьп||, А X В = ||2,(ап X bJk) ||, где матрица А имеет размер m X п, матрица В — n X р, а произ- ведение размер m X р. Если число столбцов матрицы А не равно числу строк В, то матрица А X В не определена. Например, пусть а А — ранее определенная матрица. Поскольку матрица А имеет размер 2 X 3, а матрица D размер 3 X 1, то произведение имеет размер 2x1. AxD = 4x6 —Зх 2+11 X ( —1) 7Х6 + 5Х2+ 9 X (— 1) 7 43 ‘ Рассмотрим матрицы х У 11 9 Таким образом, С X X = Р есть новая форма записи наших первоначальных уравнений в матричном виде. Транспонирование матрицы заключается во взаимной пере- становке ее строк и столбцов. Таким образом, при транспони- ровании С мы получим матрицу При транспонировании матрицы размера г X с мы получаем матрицу размера с X г. Квадратная матрица, все элементы главной диагонали которой равны единице, а все элементы вне этой диагонали равны нулю, называется единичной матрицей и обозначается I. Единичная матрица размера 2 выглядит так:
44 Гл, 2. Математические понятия Единичная матрица размера 3: 1 О О О 1 о о о 1 1 = Произведением какой-либо матрицы на единичную будет та же самая матрица. Обратной матрицей для данной квадратной матрицы назы- вается матрица, которая при умножении на заданную матрицу дает единичную. Например, 4 - 6 8 Н = .16 .06 - 12 .08 ’ СхН= 1 о О 1 = L Следовательно, С — обратная матрица для Н, а Н — обратная матрица для С. Мы пишем Н = С“г и это означает, что Н — обратная матрица для С. Возвратимся теперь к нашему уравнению СХ = Р. Если мы умножим обе части уравнения на С”1, то С^СХ = с-ф, а так как С-1С = I, то | 2.30 I - .60 Х = С"1Р = Это и будет решением первоначальных уравнений. Таким обра- зом, один из методов решения системы линейных уравнений заключается в составлении матрицы коэффициентов и нахожде- нии затем ее обратной матрицы. Заметим, что на практике это не самый удобный метод решения уравнений. При вычерчивании по точкам линии с помощью метода наименьших квадратов вычи- слением обратной матрицы мы не только решаем уравнение, но также получаем дисперсии, которые часто нужны статистиками. Существуют различные методы вычисления обратной матрицы, но они являются скорее предметом численного анализа, чем программирования. Упражнения № 4 1. Вычислить среднее значение, дисперсию, квадратичное от- клонение и среднее отклонение для следующей совокупности величин: 56, 59, 59, 63, 63.
2.10. Логарифмы 45 2. Для следующих чисел вычислить X, s2, s и М: X 870-876 3 877-883 12 884-890 14 891-897 14 898-904 7 3. Для следующих данных вычислить г2 и г, и вычислить а и b для построения графика Y = а + ЬХ: X | 83 86 84 82 80 Y | 55 58 62 64 66 4. Даны матрицы: получить: (а) —3 X R; (Ь) S — Т; (с) S + ЗТ; (d) S х R; (е) R'. 5. При решении уравнений SXi = У мы получим решения Х4 = (S из упр. 4). Составив матрицу U = , где -2 1 мы можем вычислить S х U = L Используя этот метод, найти обратную матрицу для Т из упр. 4. 6. Для матриц S и Т из упр. 4 найти S X Т и Т X S. Обра- тите внимание, что S X Т =/= Т X S. 2.10. Логарифмы Когда мы пишем равенство N = Ьх, мы подразумеваем, что число Ь, называемое основанием, должно быть возведено в степень х; х — показатель степени. Иногда удобно представить это ра- венство в другой форме. Мы пишем х = logb (N), что читается как «х равно логарифму N по основанию Ь». Эти два равенства означают одно и то же и просто представляют различные способы записи одного и того же факта. Если х — целое число, мы можем вычислить Ьх повторным умножением Ь, например 103 = 10 X 10 X 10; З4 = 3 X 3 X X 3 х 3 = 81. Если х не является целым, то возведение в сте-
46 Гл, 2, Математические понятия пень не так просто. Мы, конечно, можем догадаться, что 41/2 = 2, а воспользовавшись таблицей кубических корней, найти, что 71/3 _ £9129; но в общем случае возведение в степень, которая не является целым числом, легче выполняется с помощью лога- рифмов. Логарифмы обладают некоторыми интересными свойствами, из которых наиболее важные 1. logb (M X N) = logb (M) + logb (N), 2. logb<M/N) 3. logb (Mx) 4. logb (M) = logb (М) - logb (N), = X X logb (М), = logc (М) X logb (с) == logc (M)/logc (b), где b и с — два основания, которые должны быть положительны и не равны единице. Широко распространены таблицы логарифмов чисел по осно- ванию десять. С их помощью мы можем вычислить, например, 7 25 так: log10 (7-25) = .25 х log10 (7) = .25 х 0.84510 = .21128, где все логарифмы берутся по основанию десять. Теперь будем искать в таблицах число, логарифм которого равен 0.21128; на- ходим log (1.6265) = 0.21128. Следовательно, 7 25 = 1.6265. Ис- пользуя таблицы, дающие больше десятичных знаков в логариф- ме, мы можем получить и более точный результат. Задача нахо- ждения по log (N) = 0.21128 числа N, называется отысканием антилогарифма числа 0.21128. Заметим, что bx = b10gbN, так как bx = N и отыскивание антилогарифма сводится к возведению основания b в степень, равную logb N. В качестве основания может быть взято любое положительное число, не равное единице, но чаще всего используется основание 10, так как это упрощает составление таблиц логарифмов. Однако в большинстве инженерных и научных приложений вычисление формул упрощается, если логарифмы брать по основанию е (е = 2.71828182845...). Число е — непериодическое десятичное число, как и л. Логарифмы по основанию е называются нату- ральными логарифмами и записываются в форме InN, или logeN, или просто log N. Логарифмы по основанию 10 называются деся- тичными логарифмами. Между ними существует следующее соот- ношение: logic N = loge N X 2.3026, так как loge 10 = 2.3026. Поскольку степень любого положительного числа не равна нулю, нуль не может иметь логарифма. Не имеют логарифма и отрицательные числа.
2.11. Тригонометрия 47 2Л1. Тригонометрия На координатной плоскости X — Y начертим произвольный угол с вершиной в точке пересечения осей и одним лучом вдоль положительной оси X. На другом луче выберем произвольную точку. Пусть координаты этой точки — (х, у) (рис. 2.1). Пусть г — ]Лх2 + у2 — расстояние от начала координат до этой точки. Обозначив угол через А, мы определим шесть три- гонометрических функций: sin (А) = у/г, Cos (А) ~ х/г, tg (А) = у/х, ctg (А) = х/у, sec (А) = г/х, cosec (А) = г/у. В курсе тригонометрии выводятся различные соотношения или тождества, связывающие эти шесть функций. Например, sin2 (А) + cos2 (А) = 1 для произвольного угла. Кроме того, 1 + 1g2 (А) = sec2 (A), tg (А) = sin (A)/cos (A); sin (180° + А) = = —sin (А). Углы измеряются в градусах, но удобнее измерять углы в радианах. По определению л радианов равно 180°. Таким обра- зом, 1 радиан = 180/л градусов = 57.3°, 1° = л/180 радианов = — 0.01745 радиана. В этой книге все углы измеряются в радианах, если противное особо не оговаривается. В соответствии с определениями функций тангенс не опреде- лен для углов л/2 и —л/2; котангенс — для углов Ойл; секанс - для углов л/2 и — л/2: и косеканс—для углов Ойл.
48 Гл. 2. Математические понятия 2.12. Комплексные числа Попытка решить квадратные уравнения типа ха + 4 = О приводит нас к необходимости использовать комплексные числа. Комплексные числа могут быть записаны в виде а + bi, где а и b — вещественные числа, a i — символ, обладающий особым свойством: i2 —1. Таким образом, корнями уравнения Х2+ 4 = = 0 будут числа 0 + 2i и 0 — 2i. Если комплексное число записа- но в виде а + bi, то а называется вещественной частью, а b — мнимой частью этого числа. Если Ь Ф 0, мы говорим, что число Рис. 2.2. Геометрическое представление комплексного числа. мнимое, если при этом а = 0, мы говорим, что число является чисто мнимым. Множество комплексных чисел, у которых b = О, соответствует вещественным числам. В отличие от вещественных чисел комплексные числа не упо- рядочены. Следовательно, мы не можем использовать символы >, ^ ит. д., когда имеем дело с комплексными числами. Абсо- лютное значение, или модуль комплексного числа, а + bi опре- деляется как расстояние от начала координат до точки (а, Ь), т. е. К&2 + Ь2. Расположение комплексного числа на комплекс- ной плоскости показано на рис. 2.2. Вещественная часть числа откладывается по оси X, а мнимая часть — по оси Y. Для обозна- чения модуля комплексного числа обычно используется буква г. Аргументом комплексного числа называется угол, образован- ный положительной осью X и прямой, соединяющей соответст- вующую числу точку с началом координат, т. р. угол, тангенс которого равен Ь/а. Для обозначения вещественной части комплексного числа мы используем символ Re, т. е. Re (а + bi) = а, а для обозначения мнимой части Im, т. е. Im (а + bi) = b. Число а — bi назы- вается сопряженным комплексным числом к числу а + bi.
2,12. Комплексные числа 49 Арифметические действия над комплексными числами выпол- няются аналогично действиям над вещественными числами. Отли- чие заключается в том, что i2 заменяется на —1. Рассмотрим примеры: (3 4-4i) 4-(8 — 7i) -11 — 3i, (3 + 4i) X (8 - 7i) = 24 + 32i — 21i — 28i2 = = 24-|-32i—211 + 28 = = 52+Hi, (3 + 4i) H- (8 - 7i) = [(3 + 4i) (8 + 7i)J +- -H(8-7i)(8+7i)] = = (-4 + 53i)-r-H3 = 4 , 53 . e нз+из1* Последний пример иллюстрирует общие правила деления. Упражнения № 5' 1. Пусть в треугольнике АВС угол С — прямой, сторона, противолежащая углу А, равна 9 см, а сторона, противолежащая углу В, равна 40 см. На плоскости X — Y изобразить треуголь- ники, одна сторона которых совпадает с осью X, а вершина пря- мого угла совпадает с началом координат. Определить: (a) sin А; (b) sec А; (с) cos A; (d) sin В; (е) tg В; (f) sin С. 2. Вычислить^ (a) log416; (b) log8 32; (с) log40 (0.01); (d) loge 100. 3. Найти х, если (a) log!# X = 2; (b) logx 32 = 2.5; (с) log5 х = = 0; (d) log4 х = —2. 4. Записать каждое из заданных чисел в виде а + bi, где а и b вещественные числа: (а) (3 - 8i) - (7 + 4i); (b) (3 - 8i) x (7 - 4i); (c) (3 - 81) -b (7 - 4i); (d) (1 + 2i)3. 4 3«k. 15635
Глава 3 ВЫЧИСЛИТЕЛЬНЫЕ МАШИНЫ 3.1. Программы и блок-схемы Рассмотрим следующую ситуацию: торговец автомобилями нанял несколько коммивояжеров для продажи автомобилей марки Аэроджанк-6 и Батеболл-8. Каждый коммивояжер получает еже- месячное жалование в 200 долларов плюс комиссионные за каж- дый проданный им автомобиль: 30 долларов за Аэроджанк и 40 дол- ларов за Батеболл. Каждый коммивояжер представляет торговцу ежемесячно отчет о количестве проданных машин, который сверяет- ся с ведомостью их наличия, а затем используется как основа при начислении комиссионных. Так как торговец обычно слиш- ком занят, чтобы вычислять комиссионные самому, он передает эту работу одному из служащих в конторе. Так как он не может гарантировать, что эту работу каждый месяц будет выполнять один и тот же служащий, он подготавливает полный набор ин- струкций, чтобы независимо от того, кто будет выполнять работу, она всегда была выполнена правильно. Это может быть, напри- мер, следующий набор инструкций. 1. Взять ежемесячный отчет некоторого коммивояжера. Про- читать число проданных Аэроджанков из графы А отчета и число проданных Батеболлов из графы В. 2. Вычислить комиссионные А, умножив сумму из графы А на 30 долларов. 3. Вычислить комиссионные В, умножив сумму из графы В на 40 долларов. 4. Вычислить полное жалование за месяц: жалование = 200 долл. + комиссионные А + комиссионные В 5. Занести полное жалование в платежную ведомость против фамилии коммивояжера. 6. Возвратиться к пункту 1 и начать обработку следующего торгового отчета. Такой набор инструкций называется программой вычисления жалования коммивояжеров. Применительно к вычислительным машинам программой называется полный набор инструкций или команд для выполнения конкретной задачи. Программа должна охватывать все возможные случаи и ничего не принимать на веру. Иногда вместо словесного описания команд их можно изобразить
3.1» Программы и блок-схемы, 51 Рис. 3.1. Блок- схема программы. графически, как это сделано на рис. 3.1. Такое изображение называется блок-схемой программы. Заметим, что в нашей блок-схеме программа расширена ука- занием того, что следует делать (остановиться), когда будут обработаны все отчеты. Теперь нас интересует, предусмотрели ли мы все возможные случаи? Может случиться, что при чтении отчета слу- жащий (пока еще не машина) обнаружит, что коммивояжер забыл вписать в отчет свою фа- милию или какую-либо другую необходимую информацию. Не имея возможности составить точные инструкции, торговец идет на риск в том смысле, что служащий может сделать что- либо такое, что он не должен делать, например отложить и не обработать отчет или попытает- ся сам вписать недостающую информацию. Мо- жет оказаться желательным вставить в про- грамму между первой и второй инструкциями служащему еще одну: проверить, является ли отчет полным, и если нет, то передать его тор- говцу, ничего более с отчетом не делая. Во многих отношениях служащий действует подобно машине: ему дают числа (суммы граф А и В) и он выдает после небольшой паузы ве- личину полного жалования коммивояжера. Ма- шина, выполняющая работу такого типа, назы- вается вычислительной машиной. В основном все действия вычислительной машины могут быть подразделены, как и работа конторского служащего, на четыре типа. Что же делает наш служащий? 1. Ввод — вывод. Он читает числа в отчете; записывает числа в главную платежную ведо- мость. 2. Хранение, или запоминание. После вы- числения комиссионных А в пункте 2 набора инструкций наш служащий должен сохранить результат в своей памяти (или на листе бумаги) до тех пор, пока результат не по- требуется ему в пункте 4. Он также должен помнить или иметь где-нибудь записанной копию набора инструкций, которому он следует. 3. Арифметика. Умножения и сложения, которые выполняет служащий. 4. Управление. Инструкции, указывающие, что делать дальше, например пункт 6 — начать обработку следующего отчета. 4*
52 Гл. 3. Вычислительные машины Электронная вычислительная машина (ЭВМ) есть не что иное, как электронный помощник человека, который выполняет упомя- нутые четыре типа действий. Ввод и вывод могут быть представ- лены в виде электрических сигналов, генерируемых или получае- мых электрической пишущей машинкой; памятью могут служить ферритовые сердечники, намагничиваемые для представления цифр в числе; арифметическим устройством — электронная на- стольная счетная машина, а устройство управления можно пред- ставлять похожим на переключатель каналов в телевизоре, кото- рый автоматически переключается на следующую по порядку инструкцию, за исключением инструкций типа пункта 6 в нашей программе, когда требуется снова установить переключатель в начальное положение. В действительности в различных ЭВМ применяются самые разные способы реализации описанных функций. Мы будем осно- вываться на моделях 30—91 системы IBM-360, т. е. на самых распространенных ЭВМ в мире. Основные положения, однако, будут применимы также и к другим ЭВМ. 3.2. Байты Все ЭВМ работают в так называемом двоичном режиме. Это означает, что они работают с величинами, которые могут прини- мать только два возможных значения 1 и 0 или, соответственно, «включено» и «выключено». Под двоичным индикатором пони- мается любое устройство, которое в любой момент времени может быть только в одном из двух возможных состояний. Например, электрическая лампа либо включена, либо выключена; электрон- ная лампа либо проводит, либо не проводит электрический ток; перфокарта либо имеет пробивку, либо не имеет пробивки. Чтобы представить целое десятичное число с помощью двоич- ных индикаторов, мы должны использовать несколько индикато- ров на каждую цифру. Возьмем, например, четыре индикатора. На рис. 3.2 мы присвоили четырем электрическим лампам значе- ния 8, 4, 2 и 1 соответственно. Если свет включен, лампа указы- вает заданное значение; если выключен, значение считается равным 0. На рис. 3.2 представлено число 6, так как лампы 4 и 2 включены, а лампы 8 и 1 выключены. Говорят, что каждая лампа представляет одну двоичную цифру, или один двоичный разряд, или один бит. С помощью четырех ламп мы можем представить все целые числа от 0 до 15 включительно. Например, число 6 будет записано так: 0110. Для представления чисел больших 15 мы можем добавить несколько битов (или ламп). С помощью пяти битов, например, мы можем представить числа до 31 = 11111 =1 X 24 + 1 X 23 +
3.2. Байты 53 + 1 X 2s + 1 X 21 4- 1 X 2°. Числа, представляемые таким об- разом, называются двоичными числами (см. разд. 2.3). Другой способ представления чисел — это представление каж- дой десятичной цифры с помощью четырех двоичных цифр. Так, число 31 будет представлено как ООН 0001; здесь ООН служит для представления 3 и 0001 для 1, поэтому 31 запишется как ООН 0001. Это представление называется двоично-кодирован- ным десятичным; ЭВМ, использующие это представление, назы- требует не меньше битов, чем обычное двоичное. Эти дополни- тельные биты увеличивают стоимость ЭВМ, но дают возможность обращаться к ней, используя десятичные, а не двоичные числа; Мы увидим в гл. 4, что в IBM-360 объединены лучшие стороны и двоичного и двоично-кодированного десятичного представления. Минимальная единица информации, которую обычно обра- батывает ЭВМ, называется байтом; он состоит из девяти битов: восемь битов для представления информации и бит проверки на четность. Восемь битов могут представлять восемь двоичных цифр, или, что эквивалентно, две шестнадцатеричные цифры; они могут также представлять две десятичные цифры в двоично- кодированном десятичном представлении. Бит проверки на четность является особым битом, добавляе- мым к каждому байту таким образом, чтобы полное число состав- ляющих его единиц было всегда нечетным. Необходимость этого проверочного бита вызвана тем, что не существует механического или электронного устройства, которое было бы абсолютно надеж- ным. Например, электрическая лампа может перегореть. В систе- ме IBM-360 используется проверка на нечетность: каждый раз,
54 Гл. 3» Вычислительные машины когда какой-либо байт пересылается внутри машины, произво- дится проверка, представляет ли он правильный код. Если обна- руживается, что в байте оказалось четное число единиц, ЭВМ включает индикатор машинного контроля, чтобы сообщить опера- тору об ошибке. Такие случаи редки и обычно говорят о неисправ- ности машины. 3.3. Буквенно-цифровая информация Хотя способность ЭВМ выполнять арифметические операции над числами является важной, во многих случаях настолько же важно, чтобы она умела хранить и обрабатывать также и бук- венную информацию. Например, если бы мы использовали ЭВМ для программы из разд. 3.1, мы должны были бы запомнить фамилию коммивояжера, чтобы после вычисления его жалования напечатать в одной строке и то и другое. Существуют символы трех типов: цифры — 0 1 2 ... 9 буквы — Аа ВЬ . . . Zz специальные символы — . , « + пробел : ; . . . Термин буквенно-цифровая информация относится и к цифрам, и к буквам, и к специальным символам. Для удобства пробел часто обозначается буквой «Ь». Совокупность символов, исполь- зуемых каким-либо устройством, называется набором символов, или алфавитом этого устройства. Так как байт состоит из восьми битов, если не считать бит проверки на четность, можно представить 28 = 256 различных символов, используя только одну ячейку памяти. Код каждого символа наиболее просто и удобно для человека представляется в виде двух шестнадцатеричных цифр. Левая, или старшая шест- надцатеричная, цифра называется зонной частью символьного представления, или просто зоной, а младшая цифра называется цифровой частью, или просто цифрой. На рис. 3.3 приведены наи- более часто используемые символы и их представление в коде IBM-360. Полный перечень символов и их обозначений (всего 256) дается в приложении А. Таким образом, когда мы говорим, что код буквы I есть С9, это означает, что двоичным представлением буквы I является 11001001. Из рис. 3.3 видно, что числа от 0 до 9 кодируются от F0 до F9, в которых 0—9 стоят в цифровой части. Хотя некоторые перфорационные устройства могут работать со всеми 256 символами, большинство печатающих устройств (интерпретаторы, пишущие машинки, построчные печатающие
3.4. Код ASCII 55 устройства) ограничены наборами от 39 до 88 символов, которые включают 10 десятичных цифр, 26 прописных букв и наиболее важные специальные символы. символ EBCDIC ASCII А Cl Al в С2 А2 с СЗ АЗ D С4 А4 Е С5 А5 F С6 А6 G С7 А7 Н С8 А8 I С9 А9 J D1 АА К D2 АВ L D3 АС М D4 AD N D5 АЕ О D6 AF Р D7 ВО Q D8 В1 R D9 В2 S Е2 ВЗ т ЕЗ В4 и Е4 В5 V Е5 В6 W Е6 В7 X Е7 В8 Y Е8 В9 Z Е9 ВА 0 F0 50 1 F1 51 2 F2 52 3 F3 53 4 F4 54 5 F5 55 6 F6 56 7 F7 57 8 F8 58 9 F9 59 / 61 4F & 50 46 пробел 40 40 — 60 4D $ 5В 44 4В 4Е , 6В 4С # 7В 43 * 5С 4А % 6С 45 @ 7С АО ' 7D 47 Рис. 3.3. Коды символов системы 360. 3.4. Код ASCII Американский стандартный код для обмена информацией (ASCII — American Standart Code for Information Interchange) введен в качестве стандартного кода для обмена информацией между ЭВМ, а также для передачи информации по линиям связи. Этот код двоичный, восьмиразрядный, восьмой бит — бит провер- ки на четность, семь — значащие биты. Машина IBM-360 может обрабатывать информацию и в коде ASCII (обратите внимание на третий и шестой столбец рис. 3.3). Так как один байт машины имеет один лишний бит сверх семи, необходимых для кода ASCII, бит зоны со значением 2 (третий слева бит) полагается равным биту зоны со значением 8 (край- нему левому биту). В описываемом коде проверка осуществляет- ся на нечетность, так же как и в коде IBM-360, известном под названием EBCDIC, что является сокращением выражения Expan- ded Binary Coded Decimal Interchange Code и означает: расши-
56 Гл. 3. Вычислительные машины ренный двоично-кодированный десятичный код для обмена ин- формацией. В настоящей книге обычно Используется этот код как наиболее общепринятый. Упражнения № 6 1. Код «двоичный с избытком 3» строится так: берутся пять битов (С,8,4,2,1): первый — С — проверочный, остальные имеют значения слева направо 8, 4j 2, 1. Перед кодированием к цифре добавляется 3. Цифра 6 в этом коде будет представлена так: 11001. Составить таблицу, показывающую представление каждой цифры от 0 до 9. Обратить внимание на то, что дополнение любой циф- ры до 9 может быть получено заменой 0 на 1 и 1 на 0; это не от- носится к биту проверки на четность. 2. Код «2 из 5» также пятиразрядный со значениями 6, 3. 2. 1, 0; здесь бит 0 является проверочным, в котором при необходи- мости ставится 1, чтобы сделать число единиц равным двум. Подобные коды называются кодами постоянного веса, так как каждая цифра имеет ровно две единицы и три нуля. Составить таблицу возможных представлений каждой цифры. А как пред- ставить нуль? 3. Возьмите любое двоичное число, например 6 = ОНО; сдвиньте число вправо, отбросив самый правый бит, т е. ОН. Сложите оба числа, пренебрегая всеми переносами: 01 10 011 0101 Полученное представление называется кодом Грея. Получить представление в этом коде чисел от 0 до 15 включительно. Что можно сказать о преимуществах этого кода, если существует опасность случайного искажения значения бита? 4. Перфокарты с краевой перфорацией используют код 7,4,2,1. в котором каждая цифра представляется не более чем двумя битами, равными единице; Записать представление для цифр 0—9 5. Поставить в соответствие каждой приводимой двоичной комбинации символы кода EBCDIC. а) 1101 0001; Ь) 1110 0001; с) 1011 0001; d) 1001 1001; е) 1010 1001; f) 1100 1001. 6. Записать двоичное представление для каждого из симво лов упр. 5 в коде ASCII.
3.5. Память на магнитных сердечниках . 57 3.5. Память на магнитных сердечниках Электрические лампы не являются удовлетворительными дво- ичными индикаторами. Они легко перегорают, дорогостоящи и потребляют много электроэнергии. Хотя в ЭВМ используются различные двоичные индикаторы, наиболее распространенными и широко используемыми в IBM-360 двоичными индикаторами являются магнитные сердечники. Магнитный сердечник — это ферритовое кольцо неболь- шого диаметра (в IBM-360 сердечник имеет внутренний диаметр Р и с. 3.4. Направление намагниченности сердечников. 0.48 мм и внешний диаметр 0.76 мм). Сердечник легко намагничи- вается, сохраняет остаточный магнетизм неограниченно долго и так же легко размагничивается. Если сердечники нанизаны на провод наподобие бус и по проводу пропускается ток около 1/2 ампера, сердечники намагничиваются (см. рис. 3.4). Направ- ление магнитного поля зависит от направления тока. Когда ток выключается (рис. 3.5), сердечники остаются в намагниченном состоянии. Последующие небольшие токи не оказывают влия- ния на сердечники, но ток в 1/2 ампера (или более) либо не повлия- ет на сердечник, если будет пропущен в том же направлении, либо перебросит сердечник в противоположное состояние намагничен- ности, если будет пропущен в обратном направлении. Условно примем, что сердечники, намагниченные в некотором направле- нии, будут представлять двоичные единицы, а намагниченные в Другом направлении будут представлять нули. Расположив сердечники в виде прямоугольной матрицы, как показано на рис. 3.6, и используя токи в 1/4 ампера, мы можем воздействовать каждый раз только на один сердечник. В IBM-360 одна плата может содержать от 8192 до 294912 сердечников.
3 Рис. 3.5. Перемагничивание сердечника. 1 — подан ток, сердечник намагничивается в направлении против часовой стрелки; 2 — ток сброшен, сердечник остается намагниченным: 3 — направление тока изменено на противоположное, сердечник перемагничивается в направлении по часовой стрелке; 4 — ток сброшен, сердечник остается намагниченным. Рис. 3 6. Плата памяти на магнитных сердечниках.
3.5. Память на магнитных сердечниках 59 С любым двоичным индикатором нам хотелось бы уметь делать две вещи: устанавливать его в состояния 0 или 1, когда это нуж- но, и определять, в какое состояние он был установлен ранее. Для определения предыдущего состояния сердечника подается ток для перевода его в состояние 0. Если сердечник уже был в состоянии 0, ничего не произойдет, но если он был в состоянии 1, его переход в другое состояние вызовет возникновение небольшого тока, который можно обнаружить в третьем проводе, называемом проводом считывания и проходящем через все сердечники в плате. Так как при определении состояния сердечника приходится изме- нить его состояние, мы говорим, что считывание информации с магнитных сердечников осуществляется с разрушением инфор- мации. Через все сердечники в плате проходит также четвертый про- вод, называемый проводом запрета (или проводом записи). Он упрощает занесение информации на сердечники, но это мы отне- сем уже к области технических деталей. Плата с сердечниками обладает следующим примечательным качеством: работа в каждый момент времени идет только с одним сердечником на плате. В действительности же обычно бывает нужно сразу работать с одним или несколькими байтами. Очевид- ное решение проблемы — это использовать несколько плат сер- дечников. В зависимости от модели IBM-360 используется 9, 18, 36 или 72 платы, чтобы ЭВМ могла работать сразу с 1, 2, 4 или 8 байтами. Так как информацию, хранящуюся на сердечниках, можно в любой момент «вспомнить», мы говорим о запоминающем устрой- стве на сердечниках как о памяти ЭВМ. Объем памяти изме- ряется в байтах. Максимально допустимый объем памяти в IBM-360 равен 16777216 (16е байтов). Чаще всего память имеет объем 16384 или 32768 байтов. Каждому из 16777216 возможных байтов памяти (ячеек) присваивается номер, называемый адресом. Адреса обычно записываются в шестнадцатеричной системе и тре- буют 6 шестнадцатеричных цифр. Во всех случаях наименьшая адресуемая ячейка имеет адрес 000000, следующая за ней по порядку — 000001 и т. д. В машине с памятью в 16384 байта наибольшая адресуемая ячейка имеет адрес, равный 1638310 = - 003FFF16. Время, требуемое для выборки и перезаписи информации, называемое циклом памяти, зависит от конкретной модели IBM- 360. Цикл памяти составляет от 1.5 мкс (микросекунд; 1 сек. — — 1000 миллисекунд = 1000000 мкс) на байт для медленных моде- лей до 0.125 мкс на 8 байтов для быстродействующих моделей. Когда IBM-360 считывает один байт из памяти в единицу времени, мы говорим о параллельной выборке битов и последова- тельной выборке байтов. Вообще, в дешевых моделях IBM-360
60 Гл. 3. Вычислительные машины чаще операции выполняются последовательно, в то время как в более дорогих моделях используется пересылка нескольких бай- тов параллельно, чем повышается быстродействие машины. 3.6. Поля и слова Поле — это группа последовательных байтов. Длина поля определяется как число байтов в этом поле. Адресом поля счи- тается адрес самого левого (старшего) байта в ноле. Например, поле с информацией $ 872, хранящееся в ячейках 757—760, имеет адрес 757, ячейки, содержащей символ J. Слово — это группа из четырех последовательных байтов при условии, что левый байт имеет адрес, кратный 4. Например, байты 764, 765, 766 и 767 составляют слово. Байты 313, 314, 315 и 316 не составляют слово, поскольку 313 не кратно 4; байты Поле в 800 801 I 802 | 803 Полуслово J ас. в 802 Слово 8 800 804 805 ас. 6 804 Полов 805 806 | 807 ас. в 806 803 J 809 п.с. в 80ё Поле 8 810 *- Поле 8 813 810 | 811 пл. в 810 812 813 пл.8 812 814 | 815 ас. 8 814 Словов 804 Словов 808 Словов 812 Двойное слово 6 800 Двойное слово в 808 Рис. 3.7. Поля, байты, слова, полуслова и двойные слова. 416, 417, 419 и 420 не составляют слово, поскольку эти байты не расположены в последовательных ячейках. Адресом слова является адрес левого байта, например 764. Полуслово — это группа из двух последовательных байтов, причем адрес старшего байта кратен 2. Адресом полуслова являет- ся адрес левого байта. Двойное слово — это группа из восьми последовательных бай- тов, причем адрес левого байта кратен 8, адресом двойного слова является адрес этого левого байта. На рис. 3.7 показаны слова, двойные слова, полуслова, поля и байты. Биты внутри байта нумеруются слева направо от 0 до 7. Например, байт, содержащий букву А (А = С1 в шестнад- цатеричной системе), может быть представлен следующим обра- зом: Зона: С Цифра: 1 значения битов 1100 0001 номера битов 0123 4567 Внутри слова биты нумеруются от 0 до 31; внутри полуслова от 0 до 15; внутри двойного слова от 0 до 63.
3.7. Регистры 61 3.7. Регистры Кроме памяти на магнитных сердечниках в IBM-360 исполь- зуются также и регистры. Регистр — это электронное устройство для временного хранения информации во время ее обработки. В медленных моделях IBM-360 регистры строятся на магнитных сердечниках; в быстрых моделях для регистров используются специальные электронные схемы или запоминающие устройства на тонких пленках. В IBM-360 имеются регистры трех типов. Регистры общего назначения, или общие регистры. Шестнад- цать регистров, каждый из которых может хранить одно слово. Эти регистры используются в основном для хранения целочис- ленных операндов, участвующих в операциях двоичной ариф- метики. Регистры с плавающей точкой. Четыре регистра, каждый из которых может содержать двойное слово. В этих регистрах хра- нятся операнды, участвующие в арифметических операциях над числами с плавающей точкой. Эти регистры входят в стандарт- ный комплект больших моделей IBM-360 и устанавливаются за дополнительную плату на малых. Регистры управления. Эти регистры различны в различных моделях. Регистры управления содержат адреса отдельных ком- понент, участвующих в операции, сами компоненты и т. д. Регист- ры управления можно назвать электронными блокнотами, нахо- дящимися в распоряжении арифметического устройства и устрой- ства управления машины, куда эти устройства могут записывать и перезаписывать все, что угодно. За исключением самых дешевых моделей IBM-360 быстродей- ствие регистров в четыре раза превышает быстродействие основной памяти на сердечниках. Регистры и память на сердечниках рабо- тают независимо, и поэтому чтение байта из регистра может быть совмещено во времени с чтением байта из памяти. Это свойство машины позволяет, например, подать на сумматор одновременно оба слагаемых и тем самым увеличить скорость выполнения опе- рации. Под сумматором подразумевают особую схему, которая вырабатывает сумму, либо двоичную, либо десятичную, двух чисел. Регистры общего назначения перенумерованы от 0 до 15 (от О до F в шестнадцатеричной системе); регистры с плавающей точкой имеют номера 0, 2, 4 и 6. Регистры управления не должны интере- совать программиста и оператора; о них не вспоминают, пока не происходит сбоя в машине. Их назначение и функционирова- ние зависит от модели и известно персоналу, ответственному за ремонт машины.
62 Гл. 3. Вычислительные машины 3.8. Управление Под управлением понимается указание ЭВМ, что она должна делать. Это указание задается в команде. Команда может иметь следующую форму. Переслать в общий регистр 7 слово из ячейки 3140. Прибавить к числу в регистре 7 слово из ячейки 4132. Такая форма очень громоздка, особенно если нам нужно задать большое число команд; ее можно упростить, записав следующим образом: 58 7 3140 5А 7 4132 где первые шестнадцатеричные цифры являются кодом операции, которую нужно выполнить, а операнды записываются в том же порядке, как мы писали выше. Это делается не только для сокра- щения записи. Для передачи команд IBM-360 они должны быть представлены в некоторой простой форме, которую машина может понять. Так же, как и большинство ЭВМ, IBM-360 требует, чтобы команды были представлены ей в числовом закодированном виде. Еще в 1945 году было замечено, что ЭВМ стала бы более эф- фективной, если бы закодированные команды хранились в памяти вместе с данными, над которыми они выполняются. Например, мы могли бы заслать команду «пересылка» в ячейки памяти 2000— 2003, а команду «сложение» в 2004—2007. Если бы ЭВМ было «приказано» выполнить команду в ячейке 2000, то, выполнив ее, она могла бы затем перейти к следующей команде в ячейке 2004, затем к команде в ячейке 2008 и т. д. Предположим, что мы хотим написать программу, которая считывает карту, складывает два числа, отперфорированные на карте, и перфорирует новую карту с полученной суммой. Если же у нас несколько тысяч карт, для которых мы хотим выполнить эту программу, то мы могли бы поместить соответствующую про- грамму из команд в машину и начать ее выполнять. После того как требуемая карта отперфорирована, мы должны были бы иметь команду, которая приказывала бы ЭВМ возвратиться к началу и повторить все снова. ЭВМ должна была бы продолжать свою работу до тех пор, пока она не обработает все карты. Хранение команд в памяти позволяет получить большой выигрыш в скорости по сравнению с вариантом, при котором команды вводились бы в машину каждый раз заново по мере выполнения. Позднее мы уви- дим, что скорость не единственное преимущество хранения про- граммы в памяти ЭВМ.
3.9. Система 360 63 3.9. Система 360 В начале этой главы мы сказали, что ЭВМ выполняет четыре типа операций: 1) ввод —вывод; 2) запоминание; 3) арифметика и 4) управление. IBM-360 состоит из трех типов устройствг призванных выполнять эти операции. 1. Запоминающее устройство содержит основную память-на сердечниках. 2. Центральный процессор (CPU, Central Processing Unit) который содержит электрические схемы для выполнения арифме- тических операций и схемы управления. Все регистры тоже рас- положены здесь. В некоторых дешевых моделях IBM-360 запо- минающее устройство расположено в центральном процессоре, но во всех случаях логически это два разных типа устройств. 3. Устройства ввода — вывода. Количество устройств ввода — вывода для данной модели машины колеблется от нескольких устройств до нескольких десятков. Наиболее типичны следую- щие устройства: а. Пультовая печатающая машинка. Это модифицированная машина типа IBM Selectric, используемая преимущественно для печати коротких сообщений оператору о том, что он должен сделать, а также для ведения журнала, в котором фиксируется вся выполненная ЭВМ работа. Ь. Устройства чтения — перфорации карт. Эти устройства обеспечивают считывание информации с карт в память и выдачу на перфокарту содержимого указанных областей памяти. В неко- торых случаях на карте можно не только перфорировать, но и на- печатать то, что отперфОрировано. с. Построчные печатающие устройства. Эти устройства отли- чаются от пишущей мадпинки тем, что печатают сразу целую строку символов со скоростью до 1400 строк в минуту. Строка может содержать от 120 до 144 символов. d. Запоминающие устройства на дисках. Дисковые устрой- ства в чем-то сходны с автоматами для проигрывания грампласти- нок. На диски, имеющие магнитное покрытие, информация из памяти на сердечниках записывается аналогично тому, как делает- ся звукозапись. Позднее информация может быть воспроизведена или переписана в память на сердечниках. е. Лентопротяжные механизмы для магнитной ленты. Они представляют собой более емкие, более быстрые, более надежные варианты обычных магнитофонов. Информация из памяти на сердечниках записывается на ленту и может быть затем воспроизведена и опять считана в машину. Лента в некотором смысле подобна диску, но на ленте можно запом- нить больший объем информации, хотя она и работает медленнее.
64 Гл. 3. Вычислительные машины Информация на диск и на ленту записывается байт за байтом, как она расположена в памяти на сердечниках. Информация на картах перекодируется читающим устройством из кода Холле- рита в код IBM-360 (EBCDIC). На выводе код IBM-360 перекоди- руется из EBCDIC в код Холлерита. Некоторое карточное обо- рудование может работать с кодом ASCII вместо EBCDIC. Упражнения № 7 1. IBM-360 модель 30 читает один байт за 1.5 мкс; IBM-360 модель 50 читает одно слово за 2.0 мкс. Если считываются двой- ные слова, сколько их может считать модель 50 за время, пока модель 30 читает одно двойное слово? Повторить те же вычисле- ния для модели 65, которая читает два двойных слова за 0.75 мкс. 2. Записать буквенно-цифровое сообщение, представленное в шестнадцатеричном коде: a. D5D6E640C9E240E3C8C540E3C9D4C5 b. C540D7D3E4D9C9C2E4E240E4D5E4D44B с. F1F261F3407E40F44B d. С1939340С781А4934089А2408489А58984858 4408995A39640F340978199A3A24B 3. Записать следующие тексты в шестнадцатеричном кодес a. TAUGHT ТО THE TUNE OF THE HICKORY STIK b. If 7 4- X/5 =? 9, then X = 10. c. To study or not to study, that is the question. d. IF 4 (2X - 1.5) = 8, THEN X = 1.75. 4. Какие из следующих адресов допустимы в качестве границ слова? (а) 000008; (b) 00000С; (с) 0000А5; (d) 001200; (с) 001896; (d) 001899; (е) 00190Е; (f) ЕС3452. 5. Продолжение упр. 4. Если шестнадцатеричный адрес пред- ставляет границу слова, какие цифры могут быть в младшем разряде адреса? 6. Выполнить упр. 5 для границы двойного слова и для гра- ницы полуслова. 7. Если печатающее устройство печатает 1100 строк в минуту, сколько миллисекунд оно будет печатать 1 строку? 8. Если устройство считывает 1000 карт в минуту колонку за колонкой (т. е. колонку 1, затем колонку 2 и т. д.), за сколько миллисекунд оно считывает одну колонку?
Глава 4 КОМАНДЫ 4Л. Команды IBM-360 Машины системы IBM-360 являются вычислительными маши- нами с хранимой в памяти программой, т. е. команды, которые должны быть выполнены, хранятся в памяти так же, как числа и данные, над которыми выполняются действия. Команда содер- жит: код операции (сокращенно ОР), указывающий ту операцию, которая должна быть выполнена; затем два адреса, определяющие данные, или операнды, участвующие в этой операции. Схемати- чески команду IBM-360 можно представить так: Код Адрес Адрес операции операнда 1 операнда 2 Операнды могут находиться как в основной памяти, так и в ре- гистрах. Для кода операции отводятся две шестнадцатеричные цифры (один байт). Из возможных 256 различных операций в действи- тельности используются 143. Для задания регистра требуется одна шестнадцатеричная цифра, так как в машине имеются только шестнадцать регистров. Если оба операнда хранятся в регистрах, команда имеет следующий вид: Байт 0 1 ОР Ri в2 где Ri и R2 — адреса регистров, содержащих соответственно первый и второй операнды. Помня о том, что для записи кода операции требуются две шестнадцатеричные цифры, находим, что вся команда состоит из четырех шестнадцатеричных цифр, или занимает одно полуслово. Этот формат команд называется формат RR, или формат регистр — регистр. Адреса ячеек основной памяти задаются сложнее. Поскольку мы должны уметь записать адрес каждого из 16 миллионов байтов, потребуется шесть шестнадцатеричных цифр; в действительности средний объем памяти равен 32 тысячам байтов, т. е. первые две шестнадцатеричные цифры адреса, как правило, нулевые. Для экономии памяти, которая достаточно дорога, желательно хра- 5 Зак 15635
66 Гл. 4. Команды нить команды в возможно более сжатом виде. В машине IBM-360 адреса основной памяти задаются в виде: X В DDD, или в виде В DDD, где В и X — шестнадцатеричные цифры, либо равные 0, либо указывающие один из общих регистров с номерами от 1 до 15. DDD — три шестнадцатеричные цифры, называемые смещением. Регистр X называется индексным регистром, а его содержимое — индексом. Регистр В называется базовым регистром, а его содер- жимое — базовым адресом или базой. Если В = 0, то это указывает не на содержимое общего регистра 0, а на нулевое значение базо- вого адреса. В случае, когда X = 0, мы говорим об отсутствии индексации. Адрес основной памяти формируется сложением смещения и базового адреса. Если X =А 0, то добавляется также и значение индекса. Вычисленный адрес будет исполнительным адресом, обозначаемым Е. Символически это записывается так: Е = D + 4- (В) + (X), где буква, заключенная в круглые скобки, озна- чает «содержимое такого-то регистра». При выполнении сложе- ния все числа рассматриваются как двоичные целые и, если сумма занимает более трех байтов, воспринимаются только шесть ее младших шестнадцатеричных цифр. Наиболее употребительным типом команды IBM-360 являет^ ся команда типа RX, или регистр — индексируемая память, имею- щая следующий формат: Байт OP Rt Х2 В2 где Ri — адрес регистра, содержащего первый операнд, а Х2, В2 и D2 задают адрес второго операнда. Используются и другие форматы, но мы будем рассматривать их позднее. 4.2. Числа с фиксированной точкой Команды можно классифицировать не только по типу команды, но также и в соответствии с типом данных, над которыми выпол- няются операции. Под числом с фиксированной точкой мы пони- маем двоичное целое число, занимающее полуслово или, чаще, полное слово. Нулевой бит отводится под знак числа: 0 озна- чает плюс, а 1 — минус. Предполагается, что десятичная точка находится справа от самой младшей цифры числа.
4,3. Команды с фиксированной точкой 67 Числа с фиксированной точкой можно представить следующим образом: ± ххххххххххххххх. ± ххххххххххххххххххххххххххххххх. где X — двоичные цифры. Для удобства мы будем использовать для записи чисел с фиксированной точкой шестнадцатеричные цифры. Рассмотрим примеры: Десятичное Полное слово Полуслово число 67345 00010711 3104 00000С20 0С20 24832 00006100 6100 133 00000085 0085 7 00000007 0007 2147483647 7FFFFFFF 32767 00007FFF 7FFF 0 0000000 0000 Отрицательные числа представляются в виде дополнений -67345 FFFEF8EF -3104 FFFFF3E0 F3E0 -24832 FFFF9EOO 9Е00 -133 FFFFFF7B FF7A -7 FFFFFFF9 FFF9 -2147483647 80000001 —2147483648 80000000 -32768 FFFF8000 8000 -32767 FFFF8001 8001 Отметим, что наибольшее отрицательное число на единицу больше по абсолютной величине наибольшего положительного числа. Отметим также, что преобразование полуслова в полное слово достигается присвоением каждому из добавляемых шест- надцати двоичных разрядов значения, равного значению знако- вого бита исходного числа. ^Заметим также, что разрядность чисел с фиксированной точ- кой согласована с разрядностью общих регистров. Поэтому чрез- вычайно удобно использовать общие регистры при выполнении арифметических действий над числами с фиксированной точкой. 4.3. Команды с фиксированной точкой При описании каждой команды мы будем указывать: 1. Название команды, например (Add) сложение; 2. Код операции (ОР), например 5А; 5*
68 Гл. 4. Команды 3. Мнемоническое обозначение, например А; 4. Формат (тип) команды, например RX; 5. Описание команды. Поскольку трудно запомнить действительные коды операций, обычно употребляют их мнемонические обозначения. Было бы естественно знакомство с командами начать с команд ввода — вывода, так как очевидно, что первым требуемым дей- ствием должна быть запись в память некоторых команд и дан- ных. Однако для понимания команд ввода — вывода требуется некоторое представление о том, как работают другие команды. Потому в этой главе мы предполагаем существование некоторого способа ввода информации в память и вывода ее из памяти. Load (Загрузка) 58 L RX 58 Ri х2 в2 d2 (E^R, Второй операнд помещается на место первого операнда. Преды- дущее содержимое регистра Ri теряется. Второй операнд не изменяется. (Напомним, что круглые скобки используются для обозначения содержимого адреса. Таким образом, (Е2) означает число, хранимое по исполнительному адресу Е2.) Load (Загрузка) 18 LR RX 18 Ri R2 (R2) —» Rf Совпадает с предыдущей командой, отличие заключается в том, что второй операнд хранится в регистре. Пример: До выполнения команды: Регистр 3 0000 0004 Регистр 4 0000 0300 Регистр 5 0000 0021 Память 000304—07 0045 6BF3 Команда: После выполнения LR 18 53 команды: Регистры 3 и 4 без изменений Регистр 5 0000 0004 Память без изменений Команда: После выполнения L 58 50 4004 команды: Регистр 5 0045 6BF3
4.3. Команд» с фиксированной точкой 69 Add (Сложение) 5А A RX (Rt) + (Е2) -> Ri Add (Сложение) 1А AR RR (Ri) + (R2) - R, Второй операнд складывается с первым операндом. Сумма поме- щается на место первого операнда. Второй операнд не изменяет- ся. Пример: До выполнения команды: Регистр 3 Регистр 4 Регистр 5 Память 000304—07 0000 0004 0000 0300 0067 891В 0045 6BF3 Команда: После выполнения AR 1А 34 команды: Регистр 3 Регистр 4 0000 0304 без изменений Команда: После выполнения А 5А 5 0 4004 команды: Регистр 5 Память 00AC F50E без изменений Subtract (Вычитание) 5В S RX (Ri) - (Е2) Ri Subtract (Вычитание) IB SR RR (Ri) - (R2) -> Ri Второй операнд вычитается из первого операнда. Результат помещается на место первого операнда. Второй операнд не изме- няется. Практически в машине формируется дополнение второго операнда, которое складывается с первым операндом. Пример: До выполнения команды: Регистр 3 Регистр 5 0000 0034 0067 891В Команда: SR 1В 53 После выполнения команды: Регистр 3 без изменений Регистр 5 0067 88Е7 Команда: SR 1В 55 После выполнения команды: Регистр 5 0000 0000
70 Гл, 4. Команды Store (Запись в память) 50 ST RX (Ri) -> Е2 Первый операнд помещается в память по адресу второго. Эта команда обратна команде Загрузка в том смысле, что при ее выпол- нении содержимое регистра пересылается без изменения в основ- ную память. Для этой команды не существует формата RR. Пример: До выполнения команды: Регистр 4 0000 3000 Регистр 7 FF58 F399 Память 00300C-0F 7777 8888 Команда: ST 50 7 0 400С После выполнения команды: Регистры 4 и 7 без изменений Память 00300C-0F FF58 F399 Multiply (Умножение) 5С М RX ‘ (Ri 4- 1) X (Е2) -> Ri, Ri + 1 Multiply (Умножение) 1С MR RR (Ri + 1) X (R2) -> Rb Ri + 1 Умножение отличается от сложения и вычитания тем, что число значащих цифр результата операции равно сумме числа цифр обоих сомножителей. То есть, если перемножаются два 31-раз- рядных числа, произведение представляет собой 62-разрядное число. Поэтому для умножения требуется, чтобы Ri (общий ре- гистр) имел бы четный номер. Старшие значащие разряды про- изведения записываются в Ri, а 32 младших значащих разряда в Ri + 1. Знак произведения записывается только в Ri, так как знаковый бит в регистре Ri + 1 является частью произве- дения. Пример: До выполнения команды: Регистр 0 Регистр 1 Регистр 2 Регистр 3 Регистр 4 Память 003010—13 FFFF 1378 0200 Е001 0000 0086 0000 0034 0000 3000 FFFF FFE4 Команда: После выполнения М 5С 2 0 4010 команды: Регистр 2 Регистр 3 Регистры 0, 1 и 4 Память FFFF FFFF FFFF Fl 58 без изменений без изменений
4.3. Команды с фиксированной точкой 71 Команда: MR 1С 01 После выполнения команды: Регистр 0 0004 0380 Регистр 1 G801 С001 Команда: MR 1С 22 После выполнения команды: Регистр 2 0000 0000 Регистр 3 0000 1В38 Еще раз напомним, что самый левый бит в нечетном регистре не является знаковым. Divide (Деление) 5D D RX (Ri, Ri + 1) + (Е2) Частное -> Ri + 1 Остаток Ri Divide (Деление) ID DR RR (Ri, Ri + 1) 4- (R2) Частное -> Ri + 1 Остаток -> Ri Rt — регистр с четным номером. При делении число с удвоенной точностью, находящееся в двух смежных регистрах с четным и нечетным номерами, делится на второй операнд. Оба операнда рассматриваются как целые числа. Остаток помещается в общий регистр с четным номером, частное — в общий регистр с нечет- ным номером Ri + 1. Знак частного определяется по алгебраиче- ским правилам. Остаток, если он не равен нулю, будет иметь тот же знак, что и делимое. Следует позаботиться о том, чтобы для записи частного хватило 31 разряда. Если это не будет соблюде- но, операция деления не будет выполнена и будет зафиксирована ошибочная ситуация. Пример: До выполнения команды: Регистр 0 0375 8142 Регистр 1 1701 0271 Регистр 8 FFFF FFFF Регистр 9 FFFF 5678 Регистр 3 0000 0034 Команда: DR 1D 01 После выполнения команды: Регистр 0 319F 444А Регистр 1 05DE D8C7 Команда: DR 1D 83 После выполнения команды! Регистр 8 FFFF FCBE Регистр 9 FFFF FFEO
72 Гл. 4» Команды Упражнения № 8 1. Дано: Регистр 12 0000 0008 Регистр 13 0000 1000 001000-3 0000 0007 001004-7 0000 003А 001008—В FFFF 17А0 00100C-F 0017 8306 Определить содержимо « регистра 12 после выполнения команд: a) L 58 СО D008 g) M 5C CO D000 b) А 5А СО D000 h) SR IB CC с) LR 18 СС i) D 5DC0 DOOC d) S 5В СС D004 j) D 5DC0 D004 е) SR IB CD k) MR 1C CC f) AR 1А СС 1) LR 18 DC 2. При заданных в упр. 1 условиях найти команду, которая будет: а) очищать регистр 11; Ь) записывать в регистре 11 число 0000 1000; с) записывать в регистре 11 число FFFF 17АО; d) записывать в регистре 12 число 0000 000F; е) записывать в регистре 12 число 0000 0010; f) записывать в регистре 13 число 0100 0000. 3. При заданных в упр. 1 условиях найти команду, которая будет помещать в память по адресу 001004—7 числа: а) 00000008 Ь) 00001000 4. Написать две команды, которые, используя данные упр. 1, поместят в память по адресу 001004—7 числа: а) 00000042 Ь) 00000007 с) FFFF17A8 d) 00001008 4.4. Переходы Команды, которые нужно выполнить, сами должны быть раз- мещены где-нибудь в памяти. Обычно команды и данные хранят- ся в разных областях памяти, но это не обязательно. Рассмотрим программу, в которой заданы два числа с фиксированной точкой; первое по адресу 003100—03, второе по адресу 003104—07. Тре- буется вычислить сумму чисел и запомнить ее по адресу 003108—0В.
4.4» Переходы, 73 Программа могла бы выглядеть так: Адрес Команда Регистр 4 0000 3100 004000-03 L 58 2 0 4000 004004-07 А 5А 2 0 4004 004008—OB ST 50 2 0 4008 Если мы хотим возвратиться назад и повторить команды, нам нужна команда, по которой вычислительная машина начала бы выполнение команды, расположенной по адресу, не совпадаю- щему с адресом следующей по порядку команды. Такие команды называются командами перехода. Самой важной из таких команд является команда: Branch on Condition (Условный переход) 47 ВС RX 47 М, Х2 В2 D2 Следующая команда выбирается по второму адресу (Е2), если условия, указываемые в поле Mi, удовлетворены; в противном случае в качестве следующей команды выбирается команда, сле- дующая по порядку адресов за командой условного перехода. В этой команде первый операнд не является адресом. Четыре его разряда определяют условие перехода. В машине проверяется признак результата и, если условие удовлетворено, осуществ- ляется переход. Признак результата сокращенно обозначается СС (Condition Code) и может принимать четыре значения: 0, 1, 2 и 3. Он уста- навливается в результате выполнения некоторых команд. Напри- мер, команды сложения, описанные выше, устанавливают СС = 0, если сумма равна 0, СС = 1, если сумма меньше нуля, и СС = 2, если сумма больше 0. Каждый из четырех разрядов в поле Mir а именно 0, 1, 2 и 3, устанавливается равным единице, если про- граммист хочет выполнить переход для соответствующего значе- ния признака результата. Так, Mi = 0010 вызовет переход только в том случае, когда признак результата равняется 2; Mi = 1010 вызовет переход, если признак равен 0 или 2; Mi = 0111 вызовет переход, если признак не равен 0. Значение Mi = 0000 не вызы- вает перехода; при Mt = 0000 команда называется NOP (Нет Операции), a Mi = 1111 всегда вызывает переход и поэтому назы- вается безусловным переходом. Например: До выполнения команды: Признак результата 2 Регистр 4 0000 3100 Регистр 5 0000 4000 Команда в 00400C-0F: ВС 47 40 5000
74 Гл, 4, Команды Результат: Перехода нет; следующая команда выбирается по адресу 004010 Команда: ВС 47 6 0 5000 Результат: Переход; следующая команда выбирается по адресу 004000. Из тех команд, которые мы уже рассматривали, признак результата устанавливают следующие: Сложение: A RX AR RR Вычитание: S RX SR RR Эти команды устанавливают признак результата, равным 3, если возникло переполнение, т. е. если результат операции пре- вышает число, которое можно записать в регистр. В других случаях признак устанавливается равным 0, если результат нулевой, равным 1, если результат меньше нуля, равным 2, если результат больше нуля. Признак результата не изменяется при выполнении команд Загрузка, Запись в память, Умножение и Деление. Для установления признака результата можно воспользовать- ся следующими командами: Compare (Сравнение) 59 С RX (R0 - (Е2) : 0 Compare (Сравнение) 19 CR RR (Ri) - (R2) : 0 Второй операнд вычитается из первого операнда, как и в ко- мандах Вычитание, однако результат никуда не записывается. Признак результата устанавливается так же, как и в операции Вычитание. Содержимое первого регистра (Ri) не изменяется. Load and Test (Загрузка и проверка) 12 LTR RR (R2) Ri Эта команда подобна команде Загрузка; однако в отличие от нее признак результата устанавливается равным 0, 1 или 2, если загружаемое число равно 0, меньше нуля или больше нуля соот- ветственно.
4.4. Переходы 75 Load Complement (Загрузка дополнения) 13 LCR RR - (R2) Ri Дополнение второго операнда помещается на место первого операнда. Признак результата устанавливается в зависимости от того, является дополнение нулем, отрицательным или поло- жительным числом. В том случае, когда в R2 находилось макси- мальное по абсолютной величине отрицательное число, признак результата устанавливается равным 3, что свидетельствует о пере- полнении. Load Positive (Загрузка положительная) 10 LPR RR l(R2) |-> Ri Абсолютное значение второго операнда помещается по адресу первого операнда. Признак результата устанавливается равным 0, 2 или 3, но не может быть установлен равным 1, так как резуль- тат этой команды, помещаемый в Rb не может быть отрицатель- ным числом. Load Negative (Загрузка отрицательная) 11 LNR RR - I (R2) | + Ri Дополнение абсолютной величины второго операнда поме- щается по адресу первого операнда. Признак результата уста- навливается равным 0 или 1 в зависимости от того, является ли результат, помещаемый в Rb нулем или отрицательным числом. Четыре команды LTR, LCR, LPR и LNR не имеют формата RX. Примеры: До выполнения команды: Регистр 0 Регистр 1 Регистр 2 Регистр 3 Регистр 4 Регистр 5 Регистр 6 0000 0000 0000 0001 FFFF FFFE 8000 0000 8000 0001 0000 0006 0000 0006 Команда: LTR 12 22 После выполнения команды: Регистр 2 без изменений Признак результата 1 (результат Команда: LCR меньше нуля) 13 62
76 Гл. 4. Команды После выполнения команды: Регистр 6 Признак результата 0000 0002 2 (результат больше нуля) Команда: После выполнения LPR 10 60 команды: Регистр 6 Признак результата 0000 0000 0 (результат равен нулю) Команда: После выполнения LNR 11 64 команды: Регистр 6 Признак результата 7FFF FFFF 2 (результат больше нуля) Команда: После выполнения LNR 13 63 команды: Регистр 6 (дополнение) Признак результата 8000 0000 3 (переполне- ние) Команда: После выполнения CR 19 21 команды: Регистры 1 и 2 Признак результата без изменений 1 l(RJ > (R2)] Имеется и другая форма команды условного перехода: Branch on Condition (Условный переход) 07 BCR RR 07 Mt Эта команда совпадает с командой условного перехода ВС 47, но адрес перехода указывается двадцатью четырьмя младшими разрядами в общем регистре R2. Исключение: если R2 = 0, то перехода не происходит независимо от значения признака резуль- тата. Это другая форма команды NOP (Нет Операции). Пример: До выполнения команды: Признак результата 1 Регистр 9 7F00 4108 Команда: BCR 07 49 Результат: Происходит переход; следующая команда выбирается по адресу 004108 Команда: BCR 07 F0
4.5. Программа-монитор 77 Результат: Переход не происходит. Выполняется сле- дующая по порядку команда. Branch and Link (Переход с возвратом) 45 BAL RX Branch and Link (Переход с возвратом) 05 BALR RR При выполнении этих команд адрес следующей по порядку команды запоминается в общем регистре Rt и переход происхо- дит по адресу Е2 (или R2 для формата RR). В формате RR, если R2 = 0, перехода не происходит. Не следует думать, что левый байт слова, запоминаемого в Rn будет содержать нули; в нем может оказаться все, что угодно. Более детально мы будем рас- сматривать эти команды в разд. 7.7. Одно из применений команды BALR состоит в занесении адреса следующей команды в регистр с последующим использованием этого регистра в качестве базо- вого регистра. 4.5. Программа-монитор Мы уже знаем достаточно команд IBM-360, чтобы записать и выполнить законченную программу, за исключением команд ввода — вывода. В Приложении Н приведена небольшая и не- сложная программа-леотштор. Программа-монитор — это про- грамма, которая управляет выполнением на машине других программ. Она дает возможность выполнять следующие действия. 1. Ввести нашу программу, записанную в шестнадцатерич- ном виде, и разместить ее по нашему желанию в свободной области памяти. 2. Передать управление первой команде нашей программы после того, как она введена. 3. Обращаться к программе-монитору для выполнения всех наших операций ввода — вывода. 4. Возвратить управление программе-монитору по оконча- нии выполнения нашей программы. Программа-монитор обрабатывает шесть типов карт: 1. Карты JOB. Они перфорируются следующим образом:* колонки 1—2 ПП колонки 3—8 имя задания, любые шесть символов из набора печатающего устройства колонки 9—80 игнорируются. 2. Программные карты. Перфорируются следующим образом: колонки 1—2 счетчик, десятичное число колонки 3—8 адрес памяти в шестнадцатеричной форме
78 Гл, 4. Команды колонки 9—80 Команды и константы, которые должны быть введены в память, в шестнадцате- ричной форме Счетчик указывает число байтов (01—36), отперфорированных на карте. Каждая пара шестнадцатеричных цифр преобразуется в один байт и заносится в память, начиная с адреса, указанного в колонках 3—8. 3. Карты EXECUTE. Перфорируются следующим образом: колонки колонки колонки колонки 1-2 3-8 9-14 15-80 П = адрес памяти адрес программы обработки ошибок игнорируются Эти карты вызывают передачу управления команде, адрес которой указан на карте. 4. Карты с данными. Они могут содержать любые символы, однако в колонках 1 и 2 не должны появляться следующие ком- бинации символов: ПП, П = , *”)*, П&, //, /&, /*• 5. Карты EOJ (END OF JOB — конец задания). Конец задания определяется картой, на которой в колонках 1—2 отперфориро- ваны символы ♦. Остальные колонки игнорируются. 6. Карты DUMP. Перфорируются они следующим образом: колонки 1—2 ~1& колонки 3-8 начальный адрес памяти в шестнадцате- ричной форме колонки 9—14 конечный адрес памяти в шестнадцате- ричной форме колонки 15—80 игнорируются Когда встречается карта DUMP, содержимое области памяти, заключенной между начальным и конечным адресами, выдается на печать в шестнадцатеричной форме. При использовании программы-монитора карты должны быть уложены в следующем порядке: 1. Карта JOB. Как только эта карта считывается, колонки с 1 по 8 выдаются на печать и пишущую машинку. 2. Программные карты в необходимом количестве. 3. Карта EXECUTE для начала выполнения программы. 4. Карты с данными, если они нужны. 5. Карта EOJ. Карта DUMP может быть вставлена в любом месте. По ней выполняется выдача на печать содержимого указанной области памяти и затем пропуск всех карт, вплоть до ближайшей карты JOB.
4.5. Программа-монитор 79 Управляющая карта EXECUTE, поставленная с несоблюде- нием указанного порядка, приведет к прекращению выполнения программы и пропуску всех карт до ближайшей карты JOB. Все операции ввода — вывода записываются в форме Aw хх В DDD, где w — шестнадцатеричная цифра, которая указывает конкрет- ную операцию; хх — число байтов памяти, которые должны быть считаны или записаны; a BDDD — адрес первого байта в стан- дартной форме база — смещение. Различные значения w имеют следующий смысл: 0. Считать с пультовой пишущей машинки. Максимально может быть считано 72 байта. 1. Считать шестнадцатеричные числа с пультовой пишущей машинки и упаковать в байты. Максимально может быть считано 72 шестнадцатеричных цифры, т. е. 36 байтов (максимальное значение хх = 36, а не 72). 2. Считать карту. Максимально в память может быть передано 80 колонок. 3. Считать с карты шестнадцатеричные цифры в память и упаковать. Максимальное значение хх = 40. 4. Отпечатать на пультовой пишущей машинке. Макси- мально 72 байта. 5. Распаковать шестнадцатеричные цифры и отпечатать на пультовой пишущей машинке. Максимально 36 бай- тов. 6. Отперфорировать карту. Максимально 80 байтов. Если указано меньше, чем 80 байтов, то незаполненная часть карты останется чистой. 7. Распаковать и отперфорировать карту. Максимально 40 байтов. 8. Отпечатать строку. Максимально 120, 132 или 144 байта в зависимости от типа печатающего устройства. 9. Распаковать и отпечатать шестнадцатеричные символы. Максимально 60, 66 или 72 байта. А. Перевести одну строку и затем печатать. В. Перевести одну строку, затем распаковать и печатать С. Перевести п строк на печатающем устройстве. D. Прогнать бумагу на печатающем устройстве. Е. Возвратить каретку на пишущей машинке. F. EOJ (конец задания). При w = С происходит пропуск на печатающем устройстве хх строк (максимум три строки) сразу. По окончании печати на печатающем устройстве бумага не продергивается. При w = D
80 Гл. 4. Команды происходит прогон бумаги на печатающем устройстве до пробивки на дорожке с номером хх (от 1 до 12) на управляющей ленте печатающего устройства. Обычно хх = 1 задает начало следую- щей страницы, а хх = 12 задает последнюю строку страницы. Функции печатающего устройства станут яснее после того, как мы познакомимся с устройствами ввода — вывода в гл. 6. Возврат каретки пишущей машинки вызывает перевод еще хх строк (максимум трех). Для кодов w = С, D, Е и F часть команды, обозначенная BDDD, не используется и может быть заполнена любыми символами. Код w = F указывает конец задания. Это стандартный способ завершения выполнения программы. Управление передается мони- тору, который отпечатает (EOJ) и считает затем следующую карту JOB. Это дает возможность организовать безостановочную смену программ, если они подложены в устройстве ввода друг за другом. Для размещения каждой команды, задающей операцию ввода — вывода, требуется 4 байта. После выполнения операции ввода — вывода управление пере- дается команде, непосредственно следующей за BDDD. Признак результата всегда устанавливается в нулевое значение, за исклю- чением двух следующих случаев: 1. При считывании очередной карты после того, как введена последняя карта данных (т. е. когда считывается “Iе), информа- ция не передается в память и программа вновь получает управ- ление с признаком результата, равным 1. 2. Если в процессе печати или перевода строк пройдена по- следняя строка на странице {обнаружена пробивка в дорожке 12 управляющей ленты), то следующая команда печати или перевода строк, хотя и будет выполнена, установит признак результата равным 1. Обычно в этом случае нужно дать прогон бумаги к началу страницы (дорожка 1). В программе задачи могут использоваться все регистры. Чтобы проиллюстрировать использование программы-мони- тора, напишем программу считывания колоды перфокарт, содер- жащих: в колонках 1—8 число X, в колонках 9—16 число Y, вычисления Z = X + 2Y и выдачу на печать чисел X, Y, Z. Будем предполагать, что все числа положительны и что числа X, Y, Z должны быть считаны и отпечатаны в шестнадцатеричной форме. Предполагаем также, что X и Y целые. Адрес Команда Примечания 004000 05 20 Установить регистр 2 равным 004002 ’ 004002 AD01 0000 Прогнать бумагу к началу страницы
4.5. Программа-монитор 81 004006 А308 202А Считать карту 0А 47 80 200Е Перейти, если СС = 0 0Е AF00 Конец задания 10 58 30 202А Загрузить X 14 5А 30 202Е Сложить с Y 18 5А 30 202Е Сложить с Y 1С 50 30 2032 Запомнить Z 20 AB0C 202А Печатать 24 47 40 2000 Если СС = 1, перейти к прого- ну па начало страницы 28 47 F0 2004 Безусловный переход к 004006 на считывание карты 00402G-2F X 004030-33 Y 004034-37 Z Заметим, что иаш базовый регистр содержит число 00004002; поэтому при адресации нужно к содержимому регистра 2 прибав- лять адрес минус 4002. Для выполнения этой программы карты должны быть отпер- форировапы следующим образом: П-(SAMPLE 360040000520AD010000A308202A4780200EAF0 05830202А5А30202Е5А30202Е50302032АВ0С202А 080040244740200047F02004 “1= 004000 Карты данных 0000001800000023 0000010200002004 0000000000000033 0000000100000009 “I* Отпечатанный результат при этих данных должен быть таким! 00000018000000230000005Е 00000102000020040000410А 000000000000003300000066 000000010000000900000013 Если бы у нас было бы больше карт с данными, бумага продвину- лась бы к началу следующей страницы. 6 Зак 15635
82 Гл. 4. Команды Упражнения № 9 1. Пусть в памяти и в регистрах содержится следующая инфор- мация: 001000-03 00000005 001004-07 FFFFF38A 001008-0В 00001764 Регистр 0 00004000 Регистр 1 00001000 Регистр 2 00000008 Пусть признак результата равен 3. Чему будет равен признак результата после выполнения команды? a) LTR b) CR с) С d) А е) LCR f) LP g) s h) L i) SR . i) м 12 22 19 22 59 21 5 A 01 13 20 10 20 5B 21 58 21 IB 00 5C 01 0008 0004 0004 0004 0008 2. Заданы следующие константы: 00100C-F 70006320 001010-3 80120000 Регистр 1 00001000 Регистр 2 00000008 Регистр 3 FFF30004 Определить адрес команды, которая будет выполняться после следующих команд: а) 002000 LNR 11 33 ВС 47 41 0020 Ь) 002000 AR 1А 11 ВС 47 И 0020 с) 002000 L 58 31 000С AR 1А 33 ВС 47 11 0100 d) 002000 L 58 31 0010 AR 1А 33 ВС 47 И 0100 3. Изменить программу из разд. 4.5 так, чтобы после каждой печати результата пропускалась дополнительная строка.
4.6. Формат SS (память — память) 83 4. Написать программу, которая будет под управлением про- граммы-монитора читать колонки 1—60 карт, информация на кото- рых отперфорирована в коде EBCDIC, и печатать содержимое карт на печатающем устройстве в шестнадцатеричной форме. 5. Изменить программу из разд. 4.5, так, чтобы она печатала Y, X, Z вместо X, Y, Z. 6. В памяти имеется следующая информация: 001900—3 00005000 001904—7 00000050 001800 05 ВО АЗ 12 В101 А4 11 В100 07 FB 47 FB 0000 Что будет отпечатано, если на введенной карте содержится E3C8C9E240C9E240G140D7D9D6C2D3C5D45A. 7. При условии упр. 6 что следовало бы отперфорировать на карте, чтобы строка в упр. 6 была отпечатана соответствующими заглавными и строчными буквами? 4.6. Формат SS (память — память) В командах, которые мы рассматривали до сих пор, действия выполнялись над словами. Форматы RR и RX для команд этого типа являются наиболее подходящими. В этом разделе мы рас- смотрим команды, которые выполняются над полями переменной длины в основной памяти. Формат SS представляется следующим образом: Байт 1 2 3 4 5 1 6 ОР L В, Di в2 d2 где L — длина операнда, указывающая сколько байтов должны участвовать в этой операции. L может принимать любое значе- ние из интервала от 0 до 255 включительно, и всегда на единицу меньше числа байтов (от 1 до 256), участвующих в операции. Во всех операциях данные перемещаются из второго поля в первое. Move (Пересылка) D2 МУС SS Второе поле помещается по адресу первого операнда. Данные пересылаются последовательно байт за байтом, начиная с левого 6*
84 Гл. 4. Команды байта поля. Адреса в команде, как и во всех командах IBM-360, являются адресами левых байтов полей. Примеры: 0000 4000 0001 020304050677 88 EEDD ССВВАА99 34 До выполнения команды: Регистр 1 Память 004000—08 Память 004010—16 Команда: После выполне- MVC D2 06 1000 1010 ния команды: Память 004000—08 Память 004010—16 EEDD ССВВ АА99 3477 88 без изменений Команда: После выполне- MVC D2 04 1012 1011 ния команды: Память 004010—16 EEDD DD DD DD DD 34 Move Numerics (Пересылка цифр) DI MVN SS Младшие половины каждого байта (цифры) из поля второго опе- ранда замещают младшие половины байтов в поле первого опе- ранда. Старшие половины байтов (зоны) остаются без изменений. Эта команда подобна команде Пересылка; отличие заключается в том, что в команде Пересылка цифр пересылаются только млад- шие половины байтов. Move Zones (Пересылка зон) D3 MVZ SS Старшие половины (зоны) каждого байта из поля второго операнда замещают соответствующие части байтов в поле перво- го операнда. Младшая половина каждого байта (цифра) остается без изменений. Эта команда подобна команде Пересылка; отличие заключается в том, что в команде Пересылка зон перемещаются только старшие половины байтов. Пример: До выполнения команды: Регистр 1 Память 004000—08 0000 0001 4000 0203 Память 004010—16 0405 EEDD 0677 88 CCFB Команда: MVN АА99 D1 03 34 1005 1010 После выполне- ния команды: Память 004000—08 0001 0203 040Е 0D7C 8В Память 004010—16 без изменений Команда: После выполне- MVZ D3 02 1 000 1012 ния команды: Память 004000—02 СО Fl А2
4.7. Упакованные данные 85 Команды MVN и MVZ наиболее удобны при редактировании ин- формации, которая считывается или выдается на карты. Зонные пробивки на картах часто помещаются над не имеющими к ним отношения числовыми полями, и эти команды используются для отделения такой информации после того, как информация считана, но еще не обработана. 4.7. Упакованные данные Поскольку две десятичные цифры могут быть расположены в одном байте, можно сэкономить память, «упаковав» две деся- тичные цифры в один байт. Для облегчения такой упаковки преду- смотрены две команды. Они имеют формат SS, но немного отли- чаются от команд того же формата, которые мы рассматривали в предыдущем разделе. Байт В этих командах, вообще говоря, поля, задаваемые первым и вторым операндами, могут и не иметь одинаковую длину. Поэто- му каждое поле должно иметь свой указатель длины. Для ука- зания каждой длины используется одна шестнадцатеричная циф- ра, принимающая значения от 0 до 15 включительно, что соот- ветствует полям длиной от 1 до 16 байтов. Раск (Упаковать) F2 PACK SS Второй операнд преобразуется из зонного формата фв упако- ванный формат и помещается на место первого операнда. Если поле первого операнда не вмещает весь результат операции, левые (старшие) значащие цифры теряются, правые (младшие) знача- щие цифры остаются. Если поле первого операнда имеет боль- шую длину, чем это требуется для хранения результата, оно дополняется слева нулями. Приведенный ниже пример иллюстри- рует упаковку шестибайтового поля в четырехбайтовое. Зонный формат
86 Гл. 4. Команды нено слева нулем. Предполагается, что в четырех старших разря- дах (в зоне) младшего байта поля, содержавшего данные в зонном формате, располагается знак + или —. Этот знак помещается без изменения в самую правую шестнадцатеричную позицию упако- ванного поля. Остальные зоны поля зонного формата во внимание не принимаются. Поля обрабатываются справа налево, и цифры упаковываются в последовательные шестнадцатеричные позиции. Число десятичных цифр в поле упакованных данных будет всегда нечетным и будет лежать в диапазоне от 1 до 31. Unpack (Распаковать) F3 UNPK SS Эта команда преобразует второй операнд из упакованного формата в зонный формат; результат помещается на место перво- го операнда. Знак упакованного поля помещается в зоне младшей цифры; всем остальным зонам присваивается шестнадцатеричное значение F — стандартное обозначение зоны цифровых симво- лов в коде EBCDIC. Если поле первого операнда не вмещает результат операции, старшие значащие цифры теряются: если оно длиннее результата операции, свободные левые байты запол- няются нулями. Если вычислительная машина переключена на работу в коде ASCII, то зонам будет присваиваться значение 5, а не F. Пример: Регистр 1 До выполне- 0000 5000 ния команды: Память 005000—08 F3F4 F2F3 F0F5 F6F7 D8 Память 005009—11 090А 0B0C 437Е 0F1O 11 Память 005012—14 5678 9D Команда: После РАСК F2 8 8 1009 1000 выполнения команды: Память 005009—11 0000 0000 3423 0567 8D Команда: После UNPK F3 8 2 1009 1012 выполнения команды: Память 005009—11 FOFO F0F0 F5F6 F7F8 D9
4.8. Десятично-двоичные преобразования 87 При использовании машины для решения экономических задач около 60% всех данных являются числовыми данными, так что упаковка их экономит около 30% всей памяти, выделенной для хранения данных. 4.8. Десятично-двоичные преобразования В машине IBM-360 имеются две команды, выполняющие пре- образования упакованных десятичных чисел в двоичные и обрат- но. Упакованное десятичное число занимает в основной памяти двойное слово (это означает, что его длина равна 8 байтам и адрес самого левого байта числа должен быть кратен 8), а двоичное число занимает общий регистр. Числа, которые должны быть пре- образованы, трактуются как десятичные и двоичные целые соот- ветственно; отрицательное двоичное число представляется при помощи дополнения. Отрицательные десятичные числа имеют в знаковой позиции либо D (для кода EBCDIC), либо В (для кода ASCII). Convert to Binary (Преобразование в двоичную) 4F CVB RX Десятичное число в форме упакованного двойного слова по адресу второго операнда преобразуется в двоичное целое и поме- щается в общий регистр Ri. Если знаковая позиция равна В или D, то это означает, что десятичное число отрицательно и двоич- ное число представляется дополнением; если знаковая позиция равна А, С, Е или F, результатом преобразования будет положи- тельное двоичное число. Convert to Decimal (Преобразование в десятичную) 4Е СУР RX Целое двоичное число, находящееся в общем регистре Ri, преобразуется в упакованное десятичное число и помещается в двойное слово по адресу Е2. При преобразовании отрицатель- ных чисел в знаковую позицию помещается D (для кода EBCDIC) или В (для кода ASCII); при преобразовании положительных чисел — С или А соответственно. Диапазон преобразуемых чисел ограничен только длиной общего регистра. Поэтому числа должны быть в интервале от +2147483647 до —2147483648. Если исходное десятичное число выходит за границы этого интервала, операция выполняет- ся, но результат содержит только младшие цифры двоичного числа. Пример:
88 Гл. 4. Команды До выполнения операции: Регистр 1 0000 5100 Регистр 2 0000 0002 Регистр 3 FFFF 1287 Память 005100-07 0000 0000 0000 123D Память 005108-0F 0000 0000 0000 123С Память 005110—17 1334 677D 8ВА5 С200 Команда: После выполне- CVB 4F 2 0 1000 ния команды: Регистр 2 FFFF FF85 Команда: После выполне- CVB 4F 2 0 1008 ния команды: Регистр 2 0000 007В Команда: После выполне- CVD 4Е 3 01008 ния команды: Память 005108-0F 0000 0000 0000 793D Команда После выполне- CVD 4Е 1 0 1008 ния команды: Память 005108—0F 0000 0000 0020 73GC С помощью команд Раск и Convert легко преобразовать число, считанное в машину в зонном формате, в целое двоичное число. После обработки результат снова преобразуется в зонный формат для выдачи на печать. Рассмотрим программу сложения двух шестиразрядных чисел в зонном формате, расположенных в памя- ти, начиная с адресов 005200 и 005206; результат помещается по адресу 00520С в зонном формате. Регистр 1 0000 5200 Команды: РАСК F2 75 1018 1000 CVB 4F 20 1018 РАСК F2 75 1018 1006 CVB 4F 30 1018 AR 1Л 23 CVD 4Е 20 1018 UNPK F3 57 100С 1018 В этой программе область 005218—1F мы использовали как рабочую область для временного хранения упакованных чисел. Регистры 2 и 3 использовались для размещения двоичных чисел. Легко заметить, что из семи приведенных команд только одна является арифметической; все остальные предназначены для
4.9, Десятичная арифметика 89 получения чисел в желаемом формате. Это типично при решении экономических задач, где операции преобразования данных встре- чаются чаще, чем арифметические операции. 4.9. Десятичная арифметика В примере, приведенном в предыдущем разделе, было немного арифметических операций, но много команд преобразования данных. Для облегчения,решения таких задач в IBM-360 имеется восемь команд десятичной арифметики. Этот набор команд являет- ся стандартным для большинства моделей и может быть включен при желании за небольшую дополпительную плату на других. Шесть из этих команд будут описаны в этом разделе, две другие в разд. 7.15. Все эти команды имеют формат SS: ОР Li Ь2 Bi Di в2 d2 Add Decimal (Сложение десятичное) FA АР SS Второй операнд складывается с первым, и сумма помещается па место первого операнда. Поля операпдов могут перекрываться, но так, чтобы их правые (младшие) байты совпадали. Знак резуль- тата определяется по правилам алгебры, но нулевой результат всегда имеет знак плюс. Признак результата устанавливается равным 0, 1 или 2, если сумма равна нулю, меньше пуля, пли больше пуля соответственно. Если сумма слишком длинна и по укладывается в отведенное для результата поле, признак резуль- тата устанавливается равным 3, что указывает па переполнение; в этом случае теряются старшие значащие цифры. Subtract Decimal (Вычитание десятичное) FB SP SS Второй операнд вычитается из первого; разность помещается па место первого операнда. Признак результата устанавливается по правилам предыдущей команды. Эта команда аналогична команде сложения; отличие состоит в том, что машина прп выпол- нении операции автоматически изменяет знак второго операнда на обратный. Совместив правые байты обоих операпдов, команду SP можно использовать для очистки всего поля или его части. Zero and Add (Сложение с очисткой) F8 ZAP SS Второй операнд помещается на место первого операнда. При- знак результата устанавливается по правилам команды сложе- ния. Если длина поля первого операнда превышает длину ноля
*90 Гл. 4. Команды второго операнда, слева добавляются нули; если длина поля первого операнда короче длины поля второго операнда, старшие левые цифры теряются. Если теряются ненулевые цифры, признак результата устанавливается равным 3, что указывает на перепол- нение. Поля первого и второго операнда могут перекрываться, но так, чтобы их правые байты совпадали. Фактически эта коман- да засылает нули в поле первого операнда, а затем добавляет туда второй операнд. Compare Decimal (Сравнение десятичное) F9 СР SS Эта команда аналогична команде вычитания; отличие заклю- чается в том, что результат не сохраняется. Оба операнда остают- ся без изменений. Признак результата устанавливается равным 0, если операнды равны, равным 1, если первый операнд меньше, и равным 2, если первый операнд больше второго. Поскольку результат не запоминается, переполнения не возникает. При вы- полнении этой команды разницы между положительным и отри- цательным нулем нет. Multiply Decimal (Умножение десятичное) FC MP SS Второй операнд (множитель) умножается на первый операнд (множимое). Результат помещается в поле первого операнда. Длина второго операнда не может превышать восьми байтов и должна быть всегда меньше длины первого операнда. Кроме того, в первом операнде должно быть столько нулевых старших цифр, каков размер поля второго операнда. В этих условиях переполнение результата произойти не может. Поля могут пере- крываться, но так, чтобы совпадали их правые (младшие) байты. Признак результата остается без изменения. Заметим, что для расширения поля первого операнда может использоваться команда сложения с очисткой, если это необходимо. Divide Decimal (Деление десятичное) FD DP SS Первый операнд (делимое) делится на второй операнд (дели- тель). Частное помещается в поле первого операнда и его длина в байтах равна Li — L2. Остаток помещается после частного по адресу Ei + Li — L2, и его длина в байтах равна Ь2. Длина поля делителя не может быть больше восьми байтов, и во всех случаях его длина должна быть меньше длины поля делимого. Делимое, делитель, частное и остаток рассматриваются как целые числа. Знак остатка тот же, что и у делимого, даже если остаток равен нулю. Поля операндов могут перекрываться, но так, чтобы совпадали их младшие байты. Признак результата остается без
4.9» Десятичная арифметика 91 изменения. Максимальный размер делимого равен 31 десятичной цифре; максимальный размер частного равен 29 десятичным цифрам. Move with Offset (Пересылка со сдвигом) Fl MVO SS Эта команда не относится к командам десятичной арифмети- ки, но мы рассмотрим ее здесь, так как она используется с этими командами. Второй операнд сдвигается на 4 разряда влево, и к нему при- страивается в качестве младших разрядов знаковая позиция пер- вого операнда. Результат помещается в поле первого операнда. Поля обрабатываются справа налево. Если необходимо, второй операнд дополняется нулями. Если поле первого операнда не вме- щает результат операции, левые (старшие) разряды второго опе- ранда теряются. Поля первого и второго операндов могут пере- крываться. С помощью этой команды легко произвести сдви! десятичного числа на До выполне- ния команды: нечетное число цифр вправо. Пример: Регистр 1 0000 4800 Память 004800-06 1234 5678 9012 ЗС Память 004810—16 1122 3344 5566 7D Память 004900-04 0000 0123 4С Память 004905-09 0034 1200 0D Память 00490А—14 0000 0000 0000 0310 0040 0D Память 004915—1F 0000 6826 1400 1301 3500 1D Память 004920-2А 7777 7777 7777 7777 7777 77 Команда: SP FB 4 4 1100 1105 После выполне- ния команды: Память 004900-04 0034 1323 4С Команда: ZAP F8 А 4 1120 1100 После выполне- ния команды: Память 004920-2А 0000 0000 0000 0000 0123 4С Команда: MP FC А 4 110А 1105
92 Гл. 4. Команды, . После выполне- ния команды: Память 00490А—14 0000 0010 5773 3648 0000 ОС Команда: После выполне- DP FD А 4 1115 1105 ния команды: Память 004915—1F 2000 6272 019С 0013 0700 ID Команда: После выполне- MVO Fl 6 5 1010 1000 ния команды: Память 004810—16 0123 4567 8901 2D Команда: После выполне- MVO Fl 4 5 1012 1000 ния команды: Память 004810—16 1122 4567 8901 2D 4.10. Прерывания Иногда необходимо приостановить выполнение некоторой про- граммы. Например, может случиться так, что использование про- цессора должно быть разрешено программе с более высоким при- оритетом. Может оказаться, что произошло некоторое событие и программа, которая выполнялась процессором, не может больше выполняться, например, в программе оказалась команда с несу- ществующим кодом операции. Кроме очень маленьких вычислительных машин, заставлять оператора тратить машинное время на выяснение того, что же произошло в машине, слишком расточительно. В IBM-360 преду- смотрен аппарат прерывания для обработки особых ситуаций» которые могут возникнуть в ходе работы машины. Рассмотрим следующий пример. Пусть в памяти вычислитель- ной машины находятся две программы. Одна программа выполняет большие инженерные вычисления, и работа ее организована сле- дующим образом: сначала считывается карта, затем в течение нескольких минут идет счет, результат счета перфорируется па другую карту, и тогда считывается следующая карта. Вторая программа — короткая программа, которая считывает записи с магнитной лепты, редактирует информацию и выводит строчку на печатающее устройство. Счет во второй программе занимает всего несколько миллисекунд, он постоянно прерывается на ожи- дание окончания работы печатающего устройства. В первой про- грамме мало операций ввода — вывода, но требуется много вре- мени для счета. Вторая программа может быть более важной (например, это распечатка результатов проверки платежных ведомостей, которая должна быть завершена к сроку). Вообще го- воря, не существует никаких причин, по которым процессор
4.10. Прерывания 93 не мог бы выполнять счет по первой программе в те моменты, когда для второй программы выполняются более медленные опера- ции на печатающем устройстве. В этом случае всякий раз, когда печатающее устройство заканчивает печать строки, возникает прерывание, результатом которого будет передача , управления второй программе. Когда вторая программа выполнит всю воз- можную обработку данных, она будет возвращать управление на очередную команду в первой программе. Для работы по этой схеме необходимо, чтобы была предусмотрена возможность сохра- нения точного состояния всего того в процессоре, что относится к первой программе на тот момент, когда возникает прерывание. Вся эта информация содержится в двойном слове, слове состоя- ния программы PSW (Program status word). В IBM-360 предусмотрены пять тицов прерываний. С каждым из них связаны два двойных слова, одно для хранения старого PSW и одно нового. Адреса этих двойных слов в памяти фикси- рованы. Тип прерываний Внешние Обращения к супервизору Программные От схем контроля Ввод — вывод Старое PSW 24 32 40 48 56 Новое PSW 88 96 104 112 120 При возникновении прерывания код, указывающий его при- чину (например, печатающее устройство закончило работу), поме- щается в PSW и текущее PSW запоминается по адресу старого PSW.» Затем выбирается новое PSW, и процессор использует это PSW в качестве текущего для пуска программы, обрабатывающей прерывания. После того как прерывание обработано, прервав- шая программа выдаст команду, по которой старое PSW, разме- щенное в соответствующем двойном слове, будет загружено в ка- честве текущего. Это приведет к восстановлению того состояния процессора, которое он имел, когда произошло прерывание. Внешние прерывания возникают, когда или 1) счетчик реаль- ного времени (часы) в машине отсчитал установленный интервал времени; или 2) оператор нажимает кнопку прерывания на пульте управления; или 3) некоторое устройство, внешнее по отношению к вычислительной машине, например другая вычислительная машина, посылает заранее установленный сигнал. ^Обращение к супервизору вызывает свой собственный осо- бый тип прерывания, который мы будем рассматривать в разд. 7.9. Программные прерывания возникают, если в программе имеют- ся ошибки — недопустимый код операции, несуществующий адрес
94 Гл. 4. Команды памяти, а также при возникновении необычных ситуации с дан- ными — переполнение при арифметических операциях, попытка деления на нуль и т. д. Прерывания от схем контроля возникают, когда обнаруживает- ся неверное функционирование аппаратуры. Обычно в этом слу- чае на машине выполняются диагностические программы до тех пор, пока не явится вызванный для ремонта персонал. Прерывания ввода — вывода возникают, если устройство вво- да — вывода завершит операцию или если в устройстве произо- шло что-то, требующее внимания со стороны CPU. 4.11. PSW Слово состояния программы имеет следующий формат: Байт | 0 1 2 | 3 J I Маска 1 системы Ключ Код прерывания 4 5 1 5 1 7 IL СС Маска прогр. Адрес команды Биты 0—7 содержат Маску системы. Она относится к прерываниям ввода — вывода и внешним прерываниям и будет описана ниже в разделе, где рассматриваются эти прерывания. Биты 8—14 содержат Ключ защиты памяти. Если защита памя- ти не включена в комплект машины или если она не использует- ся, эти биты должны быть заполнены пулями. Биты 12—15 являются признаками, задающими различные режимы р&боты процессора. Бит 12(A), равный 1, означает, что в IBM-360 используется код ASCII; если в этом бите записан 0, предполагается код EBCDIC. Это оказывает влияние на команды десятичной ариф- метики и команду Распаковать. Бит 13(М), равный 1, означает, что будут происходить преры- вания из-за машинных сбоев; если этот бит равен 0, машинные сбои игнорируются. Обычно этот бит равен 1, если только обслу- живающий персонал не проводит специальные работы. Бит 14(W), равный 1, означает, что процессор находится в со- стоянии ожидания: если этот бит равен 0, то' процессор находится в состоянии счет. В состоянии счет команды выполняются обыч- ным образом. В состоянии ожидания команды не выполняются. В любом из этих состояний могут возникнуть прерывания. Вообще процессор устанавливается в состояние ожидания, если
4.11. PSW 95 программа достигла точки, где она не может работать дальше,, пока не возникнет следующее прерывание. Бит 15(Р), равный 1, означает, что цроцессор находится в состоя- нии задача; если этот бит равен 0, процессор находится в состоянии супервизор. В состоянии задача допустимы все команды, кроме команд ввода — вывода и некоторых других «привилегированных» команд. Эти команды могут быть выполнены только в состоянии супервизор. Наличие в процессоре этих двух состояний облегчает отладку и исправление ошибок в программе. Ни одна из рассмот- ренных до сих пор команд не является привилегированной. Биты 16—31 содержат код прерывания. Их значение помогает определить причину прерывания. Биты 32—33 содержат код длины команды (ILC—Instruction Length Code), т. е. количество полуслов в последней выполняв- шейся команде: 01 для команды типа RR, 10 для команд типа RX и 11 для команды типа SS. Код 00 указывает, что длина команды не была определена вычислительной машиной. Биты 34—35 содержат признак результата. Биты 36 — 39 содержат Маску программы. Они определяют, будут ли некоторые необычные ситуации с данными, например переполнение, вызывать прерывания или будут игнорироваться. Биты 40 — 63 содержат адрес следующей выполняемой команды. Детальное использование различных полей в PSW будет дано тогда, когда мы будем рассматривать средства, к которым они относятся. За исключением содержимого регистров, вся информа- ция, относящаяся к выполняемой программе, содержится в PSW. В гл. 7 мы рассмотрим специальные команды, которые облегчают изменение всего PSW или некоторых его полей. Каждая исполняемая программа требует PSW. В настоящий момент нашим целям вполне отвечает PSW с нулевыми значе- ниями полей, за исключением поля Адрес команды, которое должно содержать адрес первой команды программы. Упражнения № 10 1. Дана программа: 003900-03 5В406В4В 003904—0В область ввода 00390С-16 область вывода 0037FE BALR О5В0 003800 А208 В104 0700 08 ВС 478В 000Е ОС EOJ AF00
96 Гл. 4. Команды 0Е МУС D2 02 B10D В104 14 МУС D2 02 Bill В107 1А МУС D2 01 В115 В10А 20 МУС D2 00 В10С В100 26 МУС D2 00 В110 В102 2С МУС D2 00 В114 В103 003832 А8 0В В10А ЗА ВС 47 F0 В000 Определить выдаваемый результат, если эта программа выпол- няется под управлением программы-монитора, описанной в разд. 4.5, и колонки 1—8 вводимых карт содержат: (а) 12345678; (Ь) 00134598; (с) 00000678; (d) 00000000. 2. Изменить упр. 1 так, чтобы при вводе всех нулей на пе- чать выдавалась бы пустая строка. 3. Изменить упр. 1, заменив команды, начинающиеся с 00380Е на 00380Е РАСК F2 73 В140 В104 14 РАСК F2 73 В148 В108 1А АР FA77 В140 В148 20 UNPK F3 А7 В10С В140 26 В 47 F0 В032 Что будет выдано на печать, если будет введена та же информация, что и в упр. 1? 4. Изменить упр. 3, заменив команды, начинающиеся с 00380Е на 00380Е РАСК F3 73 В140 В104 14 РАСК F3 73 В148 В108 1А CVB 4F 30 В140 IE CVB 4F 40 В148 22 AR 1А 34 24 CVD 4Е 30 В140 28 UNPK F3 А7 В ЮС В140 2Е ВС 003832 47 00 0000 А8 0В В10А Что будет выдано на печать? 5. Написать программу для считывания карт, содержащих: колонки 1—7 ххххххх 8—14 ууууууу 15—80 пробелы
4.11. PSW 97 где x и у— цифры. Считать эти карты и выдать карты, содержа- щие: колонки 1—7 ххххххх 8—20 пробелы 21—27 УУУУУУУ 28—80 пробелы 6. Изменить упр. 5 так, чтобы в колонках 30—38 перфориро- вались х — у. Предусмотреть возможность ввода отрицательных чисел. (Пробивка в строке 11 над младшим разрядом числа ука- зывает на то, что число отрицательно.) 7. Написать программу, которая вводит с пишущей машинки числа из одной, двух или трех цифр, а затем эти же числа печа- тает как трехзначные числа, выравненные по правым концам. Например: 378 378 37 037 8 008 8. Написать программу, которая считывает карты, заданные в упр. 1, и которая после того, как считана последняя карта, выдает на пишущую машинку сумму чисел в колонках 5—8. Для подсчета суммы используйте команду АР. 9. Запрограммировать упр. 8, не используя команды десятич- ной арифметики. 10. Пусть по адресу 002000—03 находится двоичное число. Написать последовательность команд, которые будут делать это число кратным 4, добавляя к нему числа 0, 1, 2 или 3. Команды разместить, начиная с адреса 001Е00. 7 Зек 15635
Глава 5 ПРОГРАММИРОВАНИЕ ВВОДА — ВЫВОДА 5.1. Основные понятия ввода — вывода Ввод — термин, определяющий передачу информации от внеш- него по отношению к центральному процессору источника в основ- ную память. Вывод — термин, определяющий пёредачу информа- ции из основной памяти внешнему источнику. Устройства, выполняющие преобразование информации с кода IBM-360 на язык какого-либо внешнего носителя информации и наоборот, называются устройствами ввода - вывода (УВВ). Наиболее часто подсоединяемыми к IBM-360 устройствами вво- да — вывода являются устройства чтения и перфорации карт, построчные печатающие устройства, пишущие машинки, запоми- нающие устройства на магнитной ленте и магнитных дисках. Рабо- той каждого УВВ управляет устройство управления или, как мы будем говорить в дальнейшем, контроллер (ударение на втором слоге). В некоторых случаях контроллер встроен в УВВ и физи- чески неотделим от него; в других случаях, в частности для маг- нитных лент и дисков, представляет собой самостоятельную еди- ницу, причем один контроллер может управлять работой несколь- ких УВВ. Механические действия, например, перфорация отвер- стий на карте, перемотка ленты, всегда выполняются самим устройством ввода — вывода. Определение того, какие отверстия должны быть пробиты на карте, или что должно быть записано на движущуюся ленту, осуществляется контроллером. Вообще говоря, операции, сводящиеся к чисто механическим движениям, могут выполняться в УВВ без участия контроллера, но любая операция, включающая передачу данных, обязательно выпол- няется через контроллер. Подключение УВВ к ЭВМ порождает некоторые специфические проблемы. Например, самое быстрое из используемых устройств чтения перфокарт может передавать данные в основную память со скоростью 750 мкс на байт, в то время как наименьшая ско- рость основной памяти — 1.5 мкс на байт. Если ЭВМ будет при- останавливать обработку информации и ждать, пока будут про- читаны карты, то, очевидно, память при вводе будет простаивать 99.80% времени. Эта ситуация была типичной для ранних ЭВМ. При разработке IBM-360 было выдвинуто два требования:
5,1. Основные понятия ввода—вывода 99 1) машина должна выполнять операции ввода — вывода одновре- менно с работой центрального процессора (CPU); 2) она должна одновременно выполнять несколько операций ввода — вывода. Если необходимо, чтобы операции ввода — вывода выполня- лись одновременно с операциями CPU, то должны существовать средства управления операциями ввода — вывода, не зависящие от CPU. В IBM-360 такими средствами являются каналы. Канал сам представляет собой малую вычислительную машину. Он, подобно CPU, выполняет некоторую программу, составленную из хранимых в основной памяти команд. Отличие заключается в том, что команды канала относятся к операциям ввода — выво- да. Когда CPU требуется, чтобы выполнялась операция ввода — вывода, каналу сообщается адрес первой команды требуемой программы канала и канал выполняет эту программу. Когда канал кончает всю работу, Я иногда только указанную часть программы, он сообщает об этом CPU или в форме сигнала прерывания про- граммы, или же в ответ на выполнение соответствующих команд опроса канала. Выполнение второго требования о допустимости выполнения нескольких операций ввода — вывода одновременно достигается двумя путями. Для быстродействующих устройств, таких, как ленты и диски, простейшее решение заключается в использовании нескольких каналов. К IBM-360 может быть подсоединена макси- мально семь каналов, хотя на практике очень немногие машины имеют более трех каналов. Когда желательна одновременная рабо- та нескольких медленных УВВ (таких, как устройства чтения пер- фокарт), самым дешевым решением является образование в одном канале нескольких подканалов и разделение имеющихся в кана- пе средств обслуживания между этими подканалами. Если все УВВ весьма медленны, канал может опрашивать каждый подка- нал по очереди, передавая уже подготовленные байты, и, перехо- дя от подканала к подканалу, «пробегать» по всем подканалам настолько быстро, что каждое УВВ будет работать так, как если бы оно одно обслуживалось каналом. В IBM-360 в этом режиме работает канал 0, называемый муль- типлексным каналом. Он управляет максимально 128 подкана- лами. Остальные каналы, каналы 1, 2, 3, 4, 5 и 6, называемые селекторными каналами, имеют только по одному подканалу и в каждый конкретный момент могут передавать информацию толь- ко для одного УВВ. Это вполне оправдано, так как для быстрых УВВ их скорость довольно близка к той максимальной скорости, с которой может работать канал. Говорят, что селекторный канал работает в монопольном режиме, а мультиплексный канал работает в мультиплексном режиме. Если к мультиплексному каналу подсоединяются высокоско- ростное УВВ и его контроллер, то канал уже не может передавать ?♦
100 Гл. 5. Программирование ввода — вывода данные для УВВ в своем обычном мультиплексном режиме, так как это УВВ работает слишком быстро для этого относительно мед- ленного типа канала. Всякий раз, когда начинает работать высо- коскоростное УВВ, канал должен заблокировать другие УВВ в канале и обслуживать только это высокоскоростное УВВ; т. е. Подканал 2 Контроллер ленты Мультиплексный канал Подканал 14 1403 Построчное печатающее устройство С 00Е>^ Подканал 20 CPU и основная память Подканал 21 Подканал Подканал 48 Подканал 49 Подканал 50 Селекторный канал\ Селекторный канал 6 Контроллер дисков Контроллер ленты Контроллер дисков 190 191 1С0 6С0 Рис. 5.1. Одна из возможных конфигураций 360.
5.2. Скорость передачи данных 101 в этом случае канал работает в монопольном режиме подобно селекторному каналу. Как только высокоскоростная передача завершится, канал снова переключается на мультиплексный режим. Каждое УВВ, подсоединенное к каналу, имеет однобайтный адрес. Если к одному контроллеру подсоединено несколько УВВ, эти УВВ должны иметь последовательные адреса. В мультиплекс- ном канале контроллеры высокоскоростных УВВ могут быть под- соединены только к первым восьми подканалам, называемым раз- деленными подканалами. Первая шестнадцатеричная цифра адре- са должна быть равна 8 плюс номер подканала для всех УВВ в разделенных подканалах. Другие мультиплексные подканалы допускают на подканал только одно УВВ и используются обычно для подсоединения устройств чтения перфокарт, перфораторов и т. д. На рис. 5.1 приведена одна из возможных конфигураций IBM-360. Одно УВВ может быть подсоединено к нескольким контролле- рам. В этом случае УВВ должно иметь отдельный адрес для каж- дого контроллера. Так, на рис. 5.1 адреса 083 и 0А1 (0 указывает номер канала) — это два адреса одного устройства. Контроллер (а следовательно, и его УВВ) может быть подсоединен к несколь- ким каналам. В этом случае для всех каналов УВВ должны иметь одни и те же адреса. Например, на рис. 5.1 адреса 1С0 и 6С0 являются адресами одного и того же устройства. 5.2. Скорость передачи данных При разработке принципов ввода — вывода для IBM-360 руководствовались следующими соображениями: обеспечить под- соединение широкого набора устройств ввода — вывода и при этом обеспечить максимально возможную глубину программного управления работой этих устройств. Все УВВ естественно распа- даются на три категории. 1. Высокоскоростные УВВ, которые работают с магнитными носителями информации. Скорость передачи данных для этих УВВ, т. е. скорость, с которой данные передаются между УВВ и основной памятью, колеблется от 15000 до 1200000 байтов в секунду. К этой категории относятся: магнитные ленты, магнит- ные диски, магнитные карты и магнитные барабаны. 2. Среднескоростные УВВ передают данные со скоростью от 160 до 1900 байтов в секунду. К этому классу относятся: устрой- ства чтения перфокарт, карточные перфораторы, построчные печа- тающие устройства, а также устройства чтения символов, напи- санных магнитными чернилами, и оптические читающие устрой-
102 Гл» 5. Программирование ввода — вывода 3. Низкоскоростные УВВ, такие, как пишущие машинки и выносные терминалы. Для этих УВВ скорость передачи дан- ных обычно менее 15 байтов в секунду. Для высокоскоростных УВВ контроллер почти всегда отделен от УВВ. Большинство контроллеров могут обслуживать до шест- надцати УВВ, хотя практически случаи подключения более вось- ми устройств встречаются довольно редко. Среднескоростные УВВ за немногими исключениями имеют контроллер, встроенный в само УВВ. Что касается низкоскоростных устройств, то, например, один контроллер терминалов может обслуживать до тридцати одного терминала. Хотя высокоскоростные устройства обычно подсоединяются к селекторным каналам, они могут быть также подсоединены к первым восьми подканалам мультиплексного канала. Обычной причиной подсоединения этих устройств к мультиплексному кана- лу является экономия денежных средств на дополнительный селекторный канал. Среднескоростные устройства могут подсоединяться и к муль- типлексным, и к селекторным каналам. Почти всегда они под- соединяются к мультиплексному каналу. Низкоскоростные устройства могут быть подсоединены толь- ко к мультиплексному каналу. Типичный комплект IBM-360 таков: пультовая пишущая машинка, используемая в основном для печати сообщений оператору; устройство чтения перфокарт, читающее от 400 до 1000 карт в минуту; карточный перфоратор, перфорирующий от 90 до 500 карт в минуту; построчное печатающее устройство, печатающее от 240 до 1100 строк в минуту (от 120 до 144 символов в строке); контроллер магнитных лент, управляющий пятью лентопро- тяжными механизмами со скоростью передачи от 15 000 до 180000 байтов в секунду; один контроллер, управляющий двумя дисковыми механиз- мами со скоростью передачи 156 000 байтов в секунду. 5.3. Программа канала Познакомиться с программой канала проще всего на примере. Поскольку программа канала должна в значительной мере зави- сеть от конкретного УВВ, в качестве примера рассмотрим устрой- ство чтения — перфорации карт IBM-2520, модель В1. Это устрой- ство читает карты со скоростью 500 штук в минуту, перфорирует
5.3. Программа канала 103 их с той же скоростью, а затем помещает в один из двух приемных карманов. На рис. 5.2 показана схема транспортировки карт через устройство. Карты подаются узкой стороной (колонка за колонкой), проходят фотоэлементы, которые определяют присут- ствие пробивок, и затем, поступая широкой стороной (строка за Рис. 5.2. Тракт карты в устройстве 2520. 1 — пункт изменения направления движения; 2 — 12 фотоэлементов пункта чтения (только модель Bl); 3—пункт предчтения; 4—магазин; 5 — 80 перфорационных пуансонов; в — приемный карман 1; 7 — приемный карман 2. строкой), проходят через перфорационные пуансоны, которые пер- форируют эту же карту и, наконец, понадают в один из двух при- емных карманов. Если устройство остановлено, то обычно в тракте находятся две карты: одна только что захвачена из магазина, а другая уже прочитана и ожидает перфорации. Говорят, что первая карта находится в пункте предчтения, а вторая — в пункте предпер- форации. Когда карта читается, содержимое каждой колонки перево- дится в код IBM-360 и каждый байт пересылается в основную память. Читающее устройство может запомнить один байт, с тем чтобы послать по каналу сразу два байта. Перфорация карт осуществляется иначе. Данные из памяти должны поступать последовательно колонка за колонкой, а перфоратор работает по строкам. Небольшое специальное запоминающее устройство, называемое буфером, вмещает 80 колонок данных. Если нужно отперфорировать карту, все 80 байтов передаются из памяти в этот буфер. Только после заполнения буфера может начаться перфорация. Каждый раз, когда очередная строка карты посту- пает под перфорационные пуансоны, просматривается буфер для определения того, какие колонки должны быть отперфорированы в этой строке. После перфорации карта сразу же попадает в прием- ный карман.
104 Гл. 5. Прогр армирование ввода — вывода Хотя имеется большее для нашего примера мы число кодов операций для IBM-2520, рассмотрим только три? С2 Чтение и подача 09 Запись и выбор приемного кармана 1 01 Запись, подача и выбор приемного кармана 1 Код операции 09 вызывает пересылку данных из памяти в бу- фер и устанавливает специальный переключатель так, чтобы после перфорации эта карта попала в приемный карман 1 (суще- ствуют аналогичные команды для приемного кармана 2). Факти- ческой перфорации карты не . происходит, производится лишь предварительная передача информации в буфер. Операция 01 осуществляет те же действия, что и операция 09 плюс перфора- цию карты (после заполнения буфера). Карта, находящаяся в предперфорационном пункте, перфорируется, а карта в пункте предчтения подается в пункт предперфорации без чтения. По коду операции С2 карта из предперфорационного пункта проходит перфорационные пуансоны и, если эта операция следует за опера- цией 09, нужная информация будет отперфорирована на карте. Карта из пункта предчтения пройдет фотоэлементы, и ее содержи- мое будет передано в канал последовательно парами байтов. Пусть, например, нужно написать программу перфорации содержимого адресов памяти 00210А—002111 в колонках 1—8 карты, находящейся в предперфорационном пункте, и чтения содержимого колонок 13—16 в память по адресу 002100—03, а колонок 75—80 по адресу 002104—09 для карты, находящейся в пункте предчтения. Содержимым других колонок карты мы не интересуемся. Программа канала состоит из команд канала CCW (Channel Command Words), которые имеют следующий формат: КоЗ операции Адрес памяти 4 5 6 I 7 Признаки Счетчик Код команды (С2, 09 или 01) занимает байт 0. Следующие три байта содержат адрес (в памяти) первого байта данных. Байт 4 содержит признаки. Байт 5 игнорируется и может содержать любую информацию. Последние два байта (счетчик) задают число байтов, которые должны быть считаны или отперфорированы. Как
5.3. Программа канала 105 только передан один байт, счетчик уменьшается на 1, а адрес памя- ти увеличивается на 1. Передача данных заканчивается, когда счетчик станет равным нулю или когда будет обнаружен конец карты. Опишем байт 4 подробнее. Бит 32 — Признак цепочки данных CD (Chain Data). Если задан этот признак (т. е. бит установлен в 1), то после того, как счетчик станет равным нулю, будет выбрано следующее CCWr которое определит новый адрес данных, новые признаки и новый счетчик, но код операции нового CCW игнорируется, и продол- жается выполнение той же операции. Бит 33 — Признак цепочки команд СС (Chain Command). Если задан этот признак, то после того, как счетчик станет "рав- ным нулю, выполняться будет следующее CCW вместе со своим кодом операции. В каждом CCW в программе, за исключением последнего, должен быть задан либо бит 32, либо бит 33. Бит 34 — Признак блокировки неправильной длины SLI (Suppress Length Indicator). Обычно, если число байтов, задавае- мое программой канала, не совпадает с числом байтов, с которым работает УВВ (80 для IBM-2520), выдается сигнал об ошибке. Если бит 34 равен 1, сигнал об ошибке блокируется. Необходимо установить бит 34 в 1, если в программе канала для IBM-252O указывается не 80 байтов. Бит 35 — Признак блокировки записи в память SKIP (Skip). Если задан этот признак, то во время операции чтения данные посылаются в канал, но не записываются в память. Это дает возможность пропускать некоторые колонки на карте, не выделяя для них места в памяти. Бит 36 — Признак программно-управляемого прерывания PCI (Program Controlled Interrupt). Если этот бит равен 1, канал посылает в CPU сигнал прерывания, как только выбрано CCW и начинается операция. Биты 37, 38 и 39 должны быть равны нулю. Ненулевое зна- чение этих битов рассматривается как ошибка в программе канала. Напишем нашу программу канала так, чтобы она сначала засылала содержимое адресов 00210А—11 в первые восемь пози- ций перфорации буфера (остальная часть буфера будет чистой), а затем дадим команду чтения карты, причем первые двенадцать колонок будут пропущены, следующие четыре колонки будут помещены по адресам 002100—03, следующие пятьдесят восемь колонок будут пропущены и последние шесть колонок будут поме- щены по адресам 002104—09. Программа будет выглядеть еле-
106 Гл. 5. Программирование ввода — вывода дующим образом: Код Память Признаки — Счетчик 09 00210А 60 00 0008 С2 000000 90 00 ооос 00 002100 80 00 0004 00 000000 90 00 ООЗА 00 002104 00 00 0006 Первое GGW, в котором заданы признаки СС и SLI, вызовет запись в буфер и выбор приемного кармана. Второе CCW — это команда чтения и подачи с признаками CD и SKIP. Поскольку в ней задан признак SKIP, Можно использовать любой адрес памяти, в частности и адрес 000000. Третье GGW — это продол- жение операции чтения. Поскольку в предыдущем GCW установ- лен признак CD, код команды в этом CGW игнорируется и поэтому заполнен нулями. На этот раз установлен только признак CD, так что указанные четыре байта будут направлены в память, начиная с адреса 002100, указанного в поле адреса данных. В чет- вертом CCW установлены признаки CD и SKIP, следовательно, 003А, или пятьдесят восемь, колонок должны быть пропущены. В последнем GCW признаки не установлены, и поэтому программа канала завершает работу. Составление программ канала, подобных приведенной выше, не вызывает трудностей, но требует некоторых знаний об осо- бенностях конкретного устройства. Устройства, обычно исполь- зуемые в IBM-360, описываются в гл. 6. 5.4. Связь между CPU и каналом В этом разделе мы рассмотрим, как CPU говорит каналу о том, что он хочет, чтобы было сделано, а в следующем разделе будем рассматривать, как канал отвечает CPU о том, что же сделано. В операциях ввода — вывода используются две фиксирован- ные ячейки памяти. Первая фиксированная ячейка содержит адресное слово кана- ла CAW (Channel Address Word) — полное слово, находящееся по адресу 72. Оно имеет следующий формат: Байт О 1 1 2 1 3 Ключ ОООО Адрес памяти О 3 4 7 а 31 Первая шестнадцатеричная цифра задает ключ защиты памяти. Если защита памяти не предусмотрена в машине или не исполь-
5.4. Связь между CPU и каналом 107 зуется, то это поле должно быть нулевым. Вторая шестнадцате- ричная цифра должна быть нулем. Три последние байта задают адрес памяти первого CCW программы канала. Вторая фиксированная ячейка содержит Слово состояния канала CSW (Channel Status Word) — двойное слово, находя- щееся по адресу 64. Оно имеет следующий формат: Байт 1 О__________> | 2 | & 1 1Кяюч 0000 Адрес памяти | 3 4 7 8 3/ | 4 | g | б | 7 I СостояниеУВВ ® Счетчик 32 38 40 47 48 63 CSW обычно заносится в память в конце операции, но при некоторых обстоятельствах это может произойти и в процессе выполнения операции. Поле Ключ (байт 0) переносится в CSW из CAW, указывающего на начало программы. Поле адреса памя- ти (первый, второй и третий байты) содержит адрес следующего CGW: обычно это адрес текущего (или последнего) CCW плюс 8. Следующие два байта (четвертый и пятый) содержат соответствен- но байт состояния УВВ и байт состояния канала. Последние два байта (шестой и седьмой) содержат значение, до которого про- двинулся счетчик в последнем CGW; если CSW запоминается в конце операции, то это поле обычно равно нулю. Два байта состояния (четвертый и пятый) содержат инфор- мацию, описывающую состояние УВВ и канала. Они будут рас- смотрены в разд. 5.6. В них находят отражение такие случаи, как занятость устройства, нарушение четности в данных, недо- пустимый код команды в CGW и т. п. Среди команд CPU имеются четыре команды ввода — вывода: 9G SIO (Начать ввод — вывод) 9D ТЮ (Опросить ввод — вывод) 9Е НЮ (Остановить ввод — вывод) 9F ТСН (Опросить канал) Эти команды являются привилегированными и могут выпол- няться только в случае, когда GPU находится в состоянии супер- визор (см. разд. 4.11). Они имеют следующий формат: Байт I О I 1/1 2 | 3 | Ь, I
108 Гл. 5. Программирование ввода — вывода где исполнительный адрес Ei = (Bi) + Di интерпретируется сле- дующим образом: Байт I 0 I 1 I 2 0 20 I-----з— К [Устройство J 24 31 Байт 1 в командах ввода — вывода не используется и может быть заполнен произвольной информацией. Адрес в этих командах не является адресом памяти,— это «адрес» УВВ. Самый правый байт исполнительного адреса задает адрес собственно УВВ, а три бита слева от адреса УВВ задают канал. Остальные биты игно- рируются. Выполнение программы канала начинается по команде SIO. При этом выполняется следующее: 1. Анализируется адрес УВВ и опрашивается соответствую- щий канал. Если канал в нерабочем состоянии, например, выклю- чен, признак результата устанавливается равным 3 и выполнение команды заканчивается. 2. Если канал работает в монопольном режиме, признак результата устанавливается равным 2 и выполнение команды заканчивается. 3. Проверяются байты состояния канала и устройства. Если в одном из них указана причина, по которой операция ввода — вывода не может быть выполнена, эти два байта запоминаются в CSW (остальная часть CSW остается без изменений), и признак результата устанавливается равным 1. Выполнение команды заканчивается. 4. Если же ни одна из описанных ситуаций не обнаружена, т. е. канал и УВВ готовы для выполнения операции ввода — вы- вода, то признак результата устанавливается равным 0, CAW передается в канал, канал начинает работать и CPU переходит к следующей команде. После команды SIO (Start I/O) может стоять команда Услов- ного перехода (ВС), которая вызовет переход к некоторой под- программе, если команда SIO не может быть выполнена. В этом случае может быть выдано сообщение оператору или нужно про- сто ждать, когда канал освободится. Если операция начата, то довольно редко возникает необхо- димость вмешиваться в ее выполнение, пока она не закончится нормально. Однако, если необходимо прекратить выполнение операции, можно воспользоваться командой НЮ (Halt I/O). При этом так же, как и в команде SIO, признак результата может быть установлен равным 2 или 3, или он может быть установлен равным 0, если канал не был занят. Признак результата устанав-
5.5, Прерывания 109 ливается равным 1, если действительно остановлена операция, находившаяся в процессе выполнения. Команда ТСН (Test Channel) не оказывает никакого действия на выполняемую операцию. Она игнорирует адрес УВВ и исполь- зует только адрес канала. Канал опрашивается, и признак резуль- тата устанавливается равным 3 для неработоспособного канала, равным 2 для канала, работающего в монопольном режиме, равным 1 для канала с необработанным прерыванием, равным О для незанятого канала. Об условиях, приводящих к прерыванию, будет рассказано в следующем разделе. Команда TIO (Test I/O) связана с прерываниями и будет рас- смотрена далее. Теперь мы знаем достаточно, чтобы запустить операцию вво- да— вывода. Для этого нужно адрес первого CCW поместить в CAW (адрес 72), выдать команду SIO и проверить признак результата. Если признак результата не равен нулю, нужно перейти на подпрограмму, которая анализирует, почему операция не может быть выполнена, 5.5. Прерывания Прерывание — это стандартный способ, с помощью которого канал может обратить на себя внимание CPU. Сигналы преры- вания возникают 1. когда канал кончает выполнение программы канала; 2. когда УВВ кончает работу; 3. когда с УВВ происходит что-либо необычное; 4. когда очередное CCW, выбранное каналом из памяти, содержит единицу в бите 36. Когда происходит прерывание от ввода — вывода, PSW про- граммы, выполняемой в текущий момент (текущее PSW), запо- минается по адресу 56 вместе с кодом прерывания, содержащим в правых одиннадцати битах адрес канала и устройства и в левых пяти битах — нули. Затем в качестве текущего PSW берется PSW, хранящееся по адресу 120. Тем самым начинается обработка прерывания. Прерывание от ввода — вывода вызывает также запоминание полного CSW по адресу 64. В некоторых случаях нежелательно, чтобы прерывалась работа CPU. Для маскирования (запрещения) прерываний от вво- да — вывода используется Маска системы — биты 0 — 7 из PSW. Биты 0—6 соответствуют каналам 0—6. Если бит канала равен 1, то соответствующему каналу разрешается вызывать прерывание. Если бит равен 0, то говорят, что соответствующий канал зама- скирован-, в этом случае он не может вызвать прерывание и сигнал прерывания хранится в канале необработанным. Этот сигнал
110 Гл. 5. Программирование ввода — вывода вызовет прерывание, как только в качестве текущего PSW будет загружено такое PSW, в котором этот канал незамаскирован. После того как прерывание произошло, сигнал прерывания боль- ше не хранится, и говорят, что он сброшен, или погашен. Поскольку при прерывании запоминается CSW, существенно, чтобы все каналы маскировались, когда исполняются команды SIO или НЮ, так как они могут вызвать запоминание части CSW, а если будет разрешено прерывание и если прерывание действительно произойдет, то содержимое байтов, запомненное при выполнении команд SIO или HIO, будет утеряно. Аналогично, при обработке прерывания все каналы должны быть замаскиро- ваны, пока анализируется содержимое GSW. Чтобы избежать прерывания, можно замаскировать канал, но наличие необработанного прерывания не позволяет выполнять следующие команды SIO. С помощью команды TIO можно сбро- сить сигналы необработанных прерываний. Это позволяет иметь нечто вроде «управляемой обработки прерываний» без выпол- нения фактических операций ввода —- вывода. При выполнении TIO признак результата устанавливается равным 3, если канал неработоспособен; равным 2, если операция выполняется в моно- польном режиме; равным 0, если нет необработанных прерываний; равным 1, если есть необработанные прерывания. Если признак результата установлен равным 1, запоминается полное CSW и хранившийся сигнал прерывания сбрасывается. Некоторые УВВ, такие, как IBM-2702 (устройство сопряжения с линиями связи), не могут выполнять команду ТЮ. Для этих УВВ прерывания должны происходить. Теперь мы можем перечислить общие правила программирова- ния ввода — вывода на IBM-360. 1. Программа CPU выдает команду SIO, которая «отвечает» признаком результата, равным 0. 2. Соответствующий бит маски устанавливается в 1. 3. CPU продолжает счет, пока канал выполняет свою про- грамму. 4. По окончании выполнения программы канала канал выдает сигнал прерывания. Программа, обрабатывающая прерывание, проверяет, нормально ли завершилась операция, и, если обна- руживает какую-либо ошибку, выполняет соответствующие дей- ствия. Она устанавливает некоторый признак. 5. Когда проблемная программа доходит до того места, где она не может выполняться дальше, если информация не введена, она проверяет этот признак. Если оказывается, что ввод завер- шен, программа помещает данные обычно в рабочую область, и начинает следующую операцию ввода — вывода. 6. Если же оказывается, что ввод не завершен, программа переходит в состояние ожидания. Прерывание от ввода — вывода
5.6. Байты состояния и уточненного состояния 111 сбросит бит ожидания в старом PSW, прежде чем сделать его текущим PSW. На практике основная (проблемная) программа обычно запро- граммирована в состоянии задача и не может выполнять собствен- ные операции ввода — вывода. Это означает, что должна сущест- вовать программа супервизор, которая выполнит эти операции. Супервизор может быть одним и тем же для большинства про- грамм, так что каждому программисту нет нужды писать свой собственный. Связь между проблемной программой и супервизо- ром обычно осуществляется с помощью команды обращение к супервизору, которую мы будем рассматривать в гл. 7. Разработаны весьма сложные супервизоры, и ими могут вос- пользоваться все, работающие на IBM-360. Некоторые из супер- визоров будут рассмотрены во второй половине книги. Для пра- вильного использования любой из этих программ необходимо хотя бы самое общее представление о том, как взаимодействуют между собой каналы, CPU, супервизоры и проблемные программы. 5.6. Байты состояния и уточненного состояния В каждом подканале имеется один байт памяти, называемый байтом состояния канала. Этот байт содержит большую часть информации о состоянии подканала, которая может быть исполь- зована программистом. Состояния восьми битов этого байта озна- чают следующее. So Программно-управляемое прерывание. Бит 0 устанавли- вается равным 1, если CCW содержит 1 в бите 36 (признак PCI). Si Неправильная длина. Бит 1 устанавливается равным 1, если содержимое поля счетчика в программе канала не совпадает с физической длиной записи и не задан признак блокировки неправильной длины (SLI) (бит 34 в CCW). S2 Ошибка в программе. Бит 2 устанавливается равным 1, если встретились недопустимые CAW или CCW. Имеется в виду отсутствие нулей в битах с 4 по 7 в CAW, несуществующий код команды канала и т. п. S3 Нарушение защиты. Бит 3 устанавливается равным 1 во время операций чтения, если ключ в CAW не совпадает с клю- чом памяти. S4 Ошибка в канале (в данных). Бит 4 устанавливается равным 1, если у символа, передаваемого через канал, обнаружена непра- вильная четность. Поскольку канал формирует правильные чет- ности для поступающих в него данных, это указание об ошибке будет единственным, которое получит программист.
112 Гл. 5. Программирование ввода — вывода S5 Ошибка в канале (в управлении). Бит 5 устанавливается равным 1, если в подканале обнаружен недопустимый сигнал управления. Это означает, что подканал или какое-то из УВВ в нем неисправны. Se Ошибка в интерфейсе (см. разд. 6.1.—Ред.). Бит 6 уста- навливается равным 1, если в контроллере или в УВВ, подсое- диненном к подканалу, произошел сбой. S7 Ошибка в цепочке. Бит 7 используется тогда, когда задана цепочка данных и канал должен прочитать следующее GGW и декодировать его в промежутке между пересылкой двух после- довательных байтов в УВВ или из него. Если произошло что- либо, что помешало каналу завершить декодирование вовремя, т. е. до поступления очередного байта, вырабатывается сигнал об ошибке в цепочке, т. е. бит S7 устанавливается равным 1. Такие ошибки обычно свидетельствуют о том, что канал перегру- жен. Если хотя бы один бит из байта состояния канала, за исклю- чением So и S4, равен 1, выполнение программы канала и даль- нейшая передача данных прекращаются. УВВ, однако, будет продолжать работать до обычной остановки. Так же как каждый подканал имеет свой байт состояния, каждое УВВ имеет один байт состояния и один или несколько байтов уточненного состояния. В байте состояния содержится следующая информация. Uо Внимание. Бит 0 устанавливается равным 1, если опера- тор нажал специальную кнопку на УВВ. Ui Модификатор состояния. Бит 1 используется совместно с U3 и U5 для изменения обычного значения состояния. U2 Контроллер кончил. Бит 2 возбуждается, если контроллер окончил свою часть операции ввода — вывода. Этот сигнал выдает- ся только в том случае, когда контроллер используется несколь- кими УВВ, опрашивался ранее и был занят. U3 Занято. Бит 3 возбуждается, когда УВВ занято выполне- нием ранее начатой операции. Если одновременно Ui (бит 1) возбуждается, то это означает, что опрашивался контроллер и оказался занятым. U4 Канал кончил. Бит 4 возбуждается, если подканал окончил свою часть операции ввода — вывода (передачу данных). При этом УВВ может продолжать свою работу, если это нужно, а может и быть остановлено.
5.6. Байты состояния и уточненного состояния 113 U5 УВВ кончило. Бит 5 возбуждается, если УВВ кончило свою операцию и готово к выполнению следующей. Он возбуж- дается также, когда запускается ранее остановленное УВВ. Если этот сигнал появился вместе с сигналом Ub это означает, что операция окончилась необычно, но допустимо. Ue Ошибка в устройстве. Бит 6 обычно возбуждается, если какие-то биты в байтах уточненного состояния тоже возбуждены. Предполагается, что программа должна проверить и эти байты для выяснения ситуации. U7 Особый случай в устройстве. Бит 7 возбуждается, если произошло что-то необычное, но допустимое. Этим необычным может быть, например, достижение конца печатаемой страницы, чтение последней карты или конец ленты. Значение битов в байтах уточненного состояния зависит от УВВ. Однако значения первых шести битов фиксированы для всех УВВ и устанавливаются равными 1 в следующих случаях. Бит 0 — команда отвергнута. УВВ не может выполнить посланную ему команду канала. Бит 1 —- требуется вмешательство. Замята карта, кончилась бумага в печатающем устройстве и т. д. Бит 2 — ошибка в выходной шине. УВВ получило из подка- нала символ с неправильной четностью. > Бит 3 — ошибка в оборудовании. Некоторые типы сбоев в обо- рудовании. Бит 4 — ошибка в данных. Обнаружены недопустимые дан- ные (например, несуществующий код на карте). Установка этого бита равным 1 означает, что обнаружена ошибка на внешнем носителе, а не в УВВ. Бит 5 — переполнение. Канал не успел обслужить УВВ в отведенное ему время. Это обычно означает, что общая скорость всех выполняемых операций ввода — вывода превышает про- пускную способность основной памяти. Точное значение каждого бита уточненного состояния опре- деляется для каждого УВВ отдельно, так же как и само число байтов уточненного состояния. Они могут быть считаны в память подобно данным с помощью специальной команды канала уточ- нить состояние. Вообще биты уточненного состояния в начале каждой опера- ции чтения или записи сбрасываются в нуль. Однако бит «тре- буется вмешательство» остается равным 1 все время, пока не будет устранена причина неполадки. 8 Зак. 15635
114 Гл. 5, Программирование ввода — вывода В байте состояния все биты, кроме битов U3 (занято) и Uj (модификатор состояния), будучи однажды установлены рав- ными 1, остаются равными 1 до сброса. Сброс происходит в тот момент, когда байт состояния записывается в CSW. 5.7. Пример Чтобы лучше проиллюстрировать взаимосвязь программы кана- ла и программы CPU, напишем программу считывания колоды карт, содержащих в колонках 13—16 число хххх, в колонках 75—80 число уууууу, и перфорации на тех же самых картах числа zzzzzzzz в колонках 1—8, где z = х + у. Это значит, что если, например, колонки 13—16 содержали число 1234 и колонки 75—80 число ЬЬ9765 (Ь — пробел), то в колонках 1—8 должно быть отперфорировано число 00010999. Запишем нашу программу в шестнадцатеричной системе и предположим, что она уже считана в память и что регистры уже содержат следующую информацию: регистр 1 0000 2100 регистр 2 0000 2200 регистр 3 0000 2300 регистр 4 произвольная информация. Желая воспользоваться программой канала из разд. .5.3. распределим память следующим образом: 002100—03 хххх из колонок 13—16 002104—09 УУУУУУ из колонок 75—80 00210А—11 zzzzzzzz в колонки 1—8 002112—14 0хххх+ упакованный х 002115—18 Оуууууу+ упакованный у Для CCW, GAW и других констант, которые нам потребуются, будем использовать память, начиная с адреса 002200, а для команд отведем память, начиная с адреса 002300. Предположим, что, когда наша программа начинает выполняться, PSW содержит 0000 0000 0000 2300, т. е. все прерывания замаскированы, и пер- вая команда будет выбираться по адресу 002300. Предположим далее, что наше устройство чтения — перфорации карт IBM-2520 присоединено к мультиплексному каналу и его адрес есть 0D. Нам придется обращаться к адресу 000048, содержащему CAW. Адреса байтов состояния в CSW суть 000044—45. Напишем сначала программы канала, которых потребуется три. Первая программа будет считывать первую карту. Вторая будет перфорировать результат на одной карте и считывать сле- дующую карту. Третья программа будет перфорировать результат
5.7. Пример 115 на последней карте. Вторую программу мы возьмем из разд. 5.3. Присвоим ей начальный адрес, равный 002200: 002200 09 00210А 60 000008 002208 G2 000000 90 00000С 002210 00 002100 80 000004 002218 00 000000 90 00003А 002220 00 002104 00 000006 Первая программа канала должна совпадать со второй во всем, кроме первой части, в которой перфорируется карта. Следова- тельно, в качестве первой программы мы просто используем ту же самую программу, но ее начальный адрес будет равен 002208. Третья программа должна просто вызвать перфорацию карты, которая выполняется одним CCW по адресу 002200. Однако в случае последней карты мы должны использовать команду с кодом операции 01, чтобы вызвать подачу и перфорацию карты. Кроме того, в ней не должно быть признака цепочки команд. Наша третья программа будет состоять из одного CCW. Поместим его по следующему свободному адресу: 002228 01 00210А 20 000008 Нам потребуются три CAW. Разместим их по порядку — первое, второе, третье — по следующим трем адресам: 002230 00 002208 первая программа 002234 00 002200 вторая программа 002238 00 002228 третья программа Позднее мы увидим, что нам нужна одна константа, которую мы запишем пока без объяснения: 00223С 0000 0100 Наши команды CPU будут записаны, начиная с адреса 002300. Так как при обращениях к командам мы будем для базирования использовать регистр 3, то, обращаясь по тем или иным адресам команд, мы будем задавать смещения относительно адреса 002300. Начнем нашу программу засылкой в нужное место CAW для первой программы канала и затем сбросим возможно хранящийся в УВВ необработанный сигнал прерывания (возможные необрабо- танные прерывания для других устройств принимать во внимание не будем). Если необработанного прерывания нет, то в результате выполнения команды ТЮ признак результата (СС) установится равным 0; если же такое прерывание есть, то команда ТЮ его сбросит и, выполняясь второй раз, выработает признак резуль- тата равным 0. 8*
116 Гл. 5. Программирование ввода — вывода 000 MVC 006 ТЮ 00А ВС 00Е SIO 012 ВС D2 03 0048 2030 9D 00 000D 47 70 3006 Возвратиться к команде ТЮ, если СС =^0 9С 00 000D 47 30 3006 Возвратиться к команде ТЮ, если СС = 2 или 3 47 80 3038 Уйти на 002338, если СС = 0. 016 вс После сброса сигнала прерывания командой ТЮ выдаем команду SIO. После нее признак результата должен равняться 0, если только за те несколько микросекунд, в течение которых выполнялась эта команда, с устройством ничего не случилось; но, чтобы быть в этом уверенными, мы опросим его еще раз. Если признак результата равен 2 или 3, возвращаемся к ТЮ. (В прак- тических программах, если признак результата = 3, выполняется переход на программу обработки ошибок.) Случай, когда признак результата = 1, может возникнуть, если была считана последняя карта. Для устройства IBM-2520 после считывания последней карты следующая команда в программе канала не выполняется, а вместо этого запоминаются байты состояния, причем в байте состояния УВВ фиксируется особый случай в устройстве. Мы реши- ли сначала написать ту часть программы, которая обрабатывает последнюю карту, и поэтому в качестве условия перехода задали равенство нулю признака результата, имея в виду, что при равен- стве его единице переход не произойдет и это будет означать либо последнюю карту, либо аварийную ситуацию. Загрузим байты состояния в регистр 4 и выполним логическое умножение их на константу 0000 0100. В результате выполнения этой операции признак результата будет равен 1, если в байтах состояния был зарегистрирован особый случай в устройстве. в противном случае признак результата будет равен 0 и будет выполняться переход. Эта проверка осуществляется следующими командами CPU: 01A LH 48 40 0044 01Е N , 54 40 203С г) 022 ВС 47 80 3006 По команде LH, с которой мы еще не встречались, полуслово из ячейки 44 помещается в правую половину регистра, а левая половина регистра устанавливается равной 0. Если мы имеем *) Описание этой команды «Логическое И» дано в разд. 7.6.—Прим. ред.
5.7. Пример 117 какое-либо другое условие, а не случай чтения последней карты, то выполнится возврат на команду ТЮ, хотя на практике можно было бы перейти к подпрограмме обработки ошибок. Если переход не выполняется, значит мы считали последнюю карту и выполняем тогда следующие команды: 026 MVC D2 03 0048 2038 02С SIO 9С 00 000D 030 ВС 47 70 302G 034 ВС 47 F0 3000 Пересылаем CAW для третьей программы кан&ла в нужное место и выполняем команду SIO. Если СС =^0, то где-то произо- шла ошибка, и повторяем команду (как и раньше, можно было бы перейти к программе обработки ошибки). И, наконец, возвра- щаемся на начало нашей программы. Это означает, что теперь можно считать новую колоду карт. В некоторых случаях мы могли бы перейти на начало некоторой новой программы. Если при выполнении команды по адресу 016 все же произо- шел переход, то это значит, что читается содержимое карты и теперь требуется выполнить некоторую обработку. Сначала с помощью команды ТЮ проверяем, занято ли еще УВВ или оно уже закончило считывание; мы могли бы написать более эффективную программу, но наша цель — написать программу попроще: 038 ТЮ 9D 00 000D ОЗС ВС 47 70 3038 040 РАСК F2 23 1012 1000 046 РАСК F2 35 1015 1004 04С АР FA 32 1015 1012 052 UNPK F3 73 100А 1015 058 MVC D2 03 0048 2034 05С ВС 47. F0 3006 Вся обработка данных выполняется командами, размещен- ными по адресам: 040, 046, 04С и 052, а остальные 17 команд управляют вводом — выводом. Это соотношение характерно для многих применений ЭВМ. Упражнения № 11 1. Каждая из следующих программ канала предназначена для управления устройством IBM-2520. Найти ошибки.
118 Гл, 5, Программирование ввода — вывода (а) С2 001000 00 000000 (b) С2 001000 00 000080 (с) С2 001000 02 000050 (d) 01 001000 40 000050 С2 001000 30 000000 2. Написать необходимые CCW для: а) чтения колонок 1—50 карты в память, начиная с адреса 001000 и колонок 51—80 в память, начиная с адреса 001283; Ь) перфорации содержимого памяти 001000—ЗЕ в колонках 1—63; содержимое колонок после 63 оставить неизменным; с) перфорации содержимого памяти 001000—ЗЕ в колонках 1—63 и чтения колонок 64—80 следующей карты в память по адре- су 00103F-4F; d) чтения двух карт; первую карту поместить в память 001000—4F, вторую — в 001050—9F. 3. При попытке выполнить программу канала С2 001000 00 000050 на IBM-2520 при выполнении команды SIO признак результата был установлен равным 1 и карта не была считана. При проверке содержимого ячеек 000044—45 было обнаружено, что они содержат информацию 0100. Что произошло? 4. Пусть в условии упр. 3 ячейки 000044—45 содержат 1000. Объяснить, что происходит. 5. Программа канала 01 00 1000 40 000050 С2 00 1000 28 000020 была запущена командой SIO при СС — 0. Произошло прерыва- ние, причем байты 000044—45 содержат 0080. Что вызвало пре- рывание? 5.8. Начальная загрузка программ При первоначальном запуске ЭВМ для того, чтобы ввести программу в память и начать ее выполнение, требуются некоторые дополнительные средства. На IBM-360 начальная загрузка про- грамм осуществляется следующим образом: сначала с помощью трех круговых переключателей, расположенных на пульте управ- ления, набирают адрес канала и УВВ, затем нажимают кнопку начальной загрузки (кнопку IPL). Нажатие этой кнопки вызы- вает следующие действия. 1. Сброс CPU, каналов и всех устройств. Это означает, что все индикаторы, байты состояния и байты уточненного состояния сбрасываются в нуль. Все работающие УВВ останавливаются.
5.9. CCW 119 2. Процессор моделирует выполнение команды SIO при CAW = = 00 000000 и CCW = 02 000000 60 000018, используя набран- ный на пульте адрес в качестве адреса канала и УВВ. Команда с кодом операции 02 — это стандартная команда чтения, которая может быть выполнена всеми устройствами ввода. После того как двадцать четыре байта (18 в шестнадцатеричной системе) считаны в первые 24 ячейки памяти, канал выбирает следующее CCW (так как установлен признак цепочки команд) по адресу 8. 3. После того как выполнение программы канала заканчи- вается, начинает работать CPU, причем в качестве PSW выби- рается двойное слово по адресу 0. Двойное слово по адресу 8 называется первым CCW или CCW1; аналогично, двойное слово по адресу 16 называется CGW2. Таким образом, действие кнопки IPL сводится к тому, что она останавливает все работающие УВВ, все сбрасывает, читает новое PSW и два CCW. Эти CCW используются затем, чтобы считать остальную программу, после чего управление передается только что считанному PSW. Поскольку автоматически устанавливаются признак SLI и признак цепочки команд, считываются только первые двадцать четыре байта первой записи. Если для загрузки используется карта, то это означает, что считываются только первые двадцать четыре колонки этой карты. 5.9. CCW Теперь, когда мы в общих чертах ознакомились с вводом — выводом IBM-360, коснемся некоторых вопросов более детально. Коды команд канала делятся на следующие типы: хххх 0000 недопустимый хххх 1000 переход в канале (TIC) УУУУ ууО1 запись УУУУ yyll управление УУУУ ууЮ чтение УУУУ 0100 уточнить состояние УУУУ 1100 чтение в обратном направлении где х обозначает бит, который игнорируется, а у — бит, который может модифицировать основную операцию, указывая приемный карман и т. п. Код команды, в которой биты с 4 по 7 равны нулю, недопустим. Команда TIG может быть помещена в любое место в программе анала. Она приводит к выполнению следующих действий: GCW
120 Гл. 5. Программирование ввода — вывода игнорируется, за исключением поля адреса, который восприни- мается как адрес следующего CCW. Она, таким образом, является командой безусловного перехода в программе канала. Первое GCW в программе не может быть командой TIC, и две такие команды не могут выполняться друг за другом. За исключением недопустимых команд и команды TIC все коды, у которых правый бит равен 1, являются командами записи и все коды, у которых самый правый бит равен 0, являются командами чтения. Команда управление — это особый случай команды записи; по этой команде управляющая информация посылается в УВВ без какой бы то ни было записи данных на внешнем носителе. Команда управление вызывает выполнение таких действий, как продвижение бумаги на печатающем устройстве, перемотку маг- нитной ленты и т. д. Частный случай команды управления: 0000 ООН Нет операции (NOP) Эта команда не требует от УВВ никаких действий, но после деко- дирования команды сразу же генерируются сигналы УВВ кон- чило и канал кончил. Команда уточнить состояние — это особый случай команды чтения; по этой команде вместо данных в память считываются байты уточненного состояния. Команда чтение в обратном направлении — это тоже особый вид команды чтения. Для некоторых УВВ команда чтения в обрат- ном направлении вызывает запись данных в память в порядке убывания адресов, т. е. в обратном порядке. Это позволяет читать магнитную ленту, движущуюся и в обратном направлении. Цепочка данных возникает, если счетчик досчитал до нуля, и в команде установлен признак цепочки данных (бит-32). Цепочка данных обрывается и операция прекращается, .если в байте состоя- ния канала какой-либо из битов: бит 1 (неправильная длина), бит 2 (ошибка в программе), бит 3 (нарушение защиты), бит 5 (ошибка в канале в управлении), бит 6 (ошибка в интерфейсе) или бит 7 (ошибка в цепочке) установлен равным 1. Цепочка данных не обрывается, если бит 4 (ошибка в канале в данных) установ- лен равным 1. Цепочка данных дает возможность разместить информацию из одной физической записи в несколько областей памяти. Цепочка данных не может распространяться на несколько физических записей на внешнем носителе. Цепочка команд позволяет каналу автоматически начать дру- гую операцию ввода — вывода, т. е. перейти на следующую запись, если предыдущая операция завершилась и при этом нор- мально. Цепочка команд всегда относится к информации, разме-
5.9. CCW 121 щенной в отдельных физических записях и не может быть исполь- зована для обработки различных частей одной и той же физиче- ской записи. Цепочка команд задается, если в CCW бит 32 равен О и бит 33 равен 1. При окончании операции канал ждет появления сигналок канал кончил и УВВ кончило, а затем проверяет байты состояния. Если в байте состояния канала какой-либо бит, кроме бита 0 (программно-управляемое прерывание), окажется рав- ным 1, операция прекращается. Операция также прекращается, если в байте состояния УВВ какой-либо бит, кроме битов канал кончил и УВВ кончило (которые должны быть равны 1) и бита модификатор состояния (который возбуждается только для некоторых операций на дисках или других устройствах с прямым доступом), оказался равным 1. Всякий раз, когда операция пре- кращается, происходит прерывание и адрес следующего CCW в CSW на 8 (или на 16, если модификатор состояния равен 1) больше адреса последнего использованного CCW. Если же опера- ция заканчивается нормально и если задана цепочка команд, то канал переходит к выполнению следующей команды. Сигнал неправильной длины вырабатывается обычно, если счетчик досчитал до нуля и не задана цепочка данных. Если в CGW бит 34 равен 1, а бит 32 равен 0, сигнал неправильной длины не вырабатывается. Сигнал неправильной длины выраба- тывается также, если физическая запись кончилась, а содержимое поля счетчика не равно нулю. В этом случае, если бит 32 равен О и бит 34 равен 1, сигнал не вырабатывается. Если бит 32 равен 1, признак SLI игнорируется и сигнал о неправильной длине может выработаться. Признак блокировки записи в основную память (бит 35) учи- тывается только в том случае, когда самый правый бит в коде операции команды канала равен 0, т. е. во время операций чтение, уточнить состояние и чтение в обратном направлении. Если бит 35 равен 1, канал не отсылает в память данные, передаваемые из устройства. Эти байты просто пропадают. Они, однако, про- веряются на четность, т. е. проходят обычную проверку, поэтому могут привести к тому, что бит ошибка в канале (в данных) будет установлен равным 1. Признак PCI (бит 36) в любом CCW устанавливает равным 1 самый левый бит в байте состояния канала и тем самым вызы- вает прерывание, которое обычно возникает при декодировании каналом очередного CCW. Если CCW порождает сигнал ошибка в программе, то признак PCI игнорируется, и прерывание про- изойдет из-за того, что прекращено выполнение программы кана- ла. Признак PCI вызывает прерывание, и оно может произойти как до, так и после того, как будут переданы первые байты данных.
122 Гл. 5. Программирование ввода — вывода В поле счетчика CCW может задаваться любое ненулевое число. Нулевое поле счетчика даже для команды управления, которая не связана с передачей данных, вызовет сигнал ошибки в про- грамме. 5.10. Байт состояния канала Биты в байте состояния канала возбуждаются по следующим причинам: So Программно-управляемое прерывание возбуждается любым CCW, в котором бит 36 равен 1. So не возбуждается, если то же CCW возбуждает S2 = 1. Если So = 1, то в подканале вырабаты- вается сигнал прерывания. St Неправильная длина. Бит возбуждается, если достигнут конец записи и при этом 1) задана цепочка данных или 2) счетчик не равен нулю и признак SLI сброшен. Si также возбуждается, когда физический конец записи не достигнут, а счетчик уже досчитал до нуля и при этом SLI сброшен. S± = 1 обрывает цепоч- ку данных, прекращает операцию и порождает сигнал прерыва- ния в подканале. S2 Ошибка в программе. S2 возбуждается в следующих случаях: 1. любым CAW с битами 4—7 не равными нулю; 2. любым CAW, биты 8—31 которого задают адрес, не крат- ный 8; 3. любым CAW с битами 0—3 не равными нулю, если в данной машине не предусмотрены средства защиты памяти; 4. если первое CGW в программе является командой переход в канале (TIG); 5. двумя последовательными командами TIC; 6. если CGW = TIC и содержимое поля адреса не кратно 8; 7. если CCW = TIG и адрес превышает объем памяти; 8. если GCW =/=Т1С, а поле счетчика равно 0; 9. если CGW Ф TIG, а биты 37—39 не все нулевые; 10. если CCW, не являющаяся командой TIC, указана в цепоч- ке команд или в качестве первой CCW в программе и имеет биты 4—7 равными 0. Если S2 = 1, то прекращается операция и порождается сигнал прерывания в подканале. S3 Нарушение защиты. S3 возбуждается, если при помощи команд чтение, уточнить состояние или чтение в обратном направ- лении делается попытка передать данные в ячейки памяти, ключ защиты которых не равен ключу в CAW. Данные не записываются в память. Если в GAW задан нулевой ключ, то S3 = 0 и данные
5,10, Байт состояния канала 123 записываются независимо от значения ключа защиты памяти. S3 = 1 блокирует передачу данных, прекращает операцию и по- рождает сигнал прерывания в подканале. S4 Ошибка в канале (в данных). S4 возбуждается, если между каналом и каким-либо УВВ передан символ с неправильной чет- ностью. Если S4 — 1, передача данных может продолжаться или не продолжаться, но цепочка команд всегда обрывается. При этом в подканале возникает сигнал прерывания. В некоторых случаях может быть выполнен сброс по сбою. Канал принудительно фор- мирует правильную четность во всех передаваемых через него данных. S5 Ошибка в канале (в управлении). S5 возбуждается при обна- ружении сбоя в оборудовании канала. Состояние канала непред- сказуемо. Содержимое CSW может быть неправильным. Выпол- няется сброс по сбою. Se Ошибка в интерфейсе. Se возбуждается в следующих слу- чаях: 1. если на сигнал канала УВВ выдает ответ, не соответствую- щий этому сигналу; 2. если ответ соответствует сигналу, но имеет неправильную четность; 3. если УВВ не ответило в отведенное для ответа время; 4. при сбоях в памяти мультиплексного канала (память на сердечниках, в которой находятся CCW, CSW и т. д. для каж- дого подканала); Se всегда указывает на машинный сбой. Текущая операция прекращается, и в подканале возникает сигнал прерывания. Сброс по сбою может как выполняться, так и не выполняться. S7 Ошибка в цепочке. S7 возбуждается во время выполнения операций чтение, уточнить состояние или чтение в обратном направлении, если первый байт, после того как сработал механизм цепочки данных, выдается из УВВ до того, как канал способен его обработать. Эта ситуация переполнения возникает потому, что устройство передает данные быстрее, чем канал способен их принять. S7 — 1 прекращает операцию без дальнейшей передачи данных и порождает сигнал прерывания в подканале. Сброс по сбою всегда происходит, если S5 = 1, в некоторых моделях, если S4 = 1 или Se = 1. Что будет выполняться в резуль- тате сброса по сбою — зависит от модели машины. В некоторых случаях канал устанавливается в нерабочее состояние; в других сбрасываются все устройства в канале; иногда следующая команда
124 Гл, 5. Программирование ввода — вывода ввода — вывода передает CSW в память, но при этом некоторые или все его поля могут быть заполнены нулями. Вообще, если S4, S5 или Se оказываются равными 1, следует вызвать инженера фирмы для проведения ремонта. 5.11. Начать ввод — вывод Так же как и все команды IBM-360 команда SIO выполняется поэтапно. На каждом шаге выполняются необходимые проверки. В одних ситуациях устанавливается признак результата и опе- рация прекращается, в других — выполняется следующий шаг. Если признак результата (СС) устанавливается равным 1, то одновременно запоминается байт состояния УВВ (U) и байт состояния канала (S). Остальная часть CSW не изменяется. Логика выполнения операции SIO состоит в следующем: 1. Если канал неработоспособен, установить СС = 3. 2. Если канал работает в монопольном режиме, установить СС = 2. 3. (Только в мультиплексном канале.) Если адрес подканала больше максимального номера подканала, допустимого на данной модели машины, установить СС = 3 и возбудить сигнал преры- вания в канале. 4. Если в подканале хранится необработанное прерывание, установить СС = 2. 5. (Только в мультиплексном канале.) Если подканал работал в мультиплексном режиме, установить СС = 2. 6. Проверить CAW на: a) CAW4_7 #=0000 х) Ь) CAW2fl_31 #=000 с) CAW0_3 =/=0000 и схемные средства защиты не преду- смотрены в машине. Если удовлетворено хотя бы одно из перечисленных условий, установить S2 = 1. На некоторых моделях, если S2 = 1, устано- вить СС = 1 и CSW = 0, S. 7. Проверить первое CCW на: a) CCW37_39 #=000 b) CCW4_7 = 0000 с) CCW4_7 #=1000 (TIC) d) CCW48_63 = 0 (поле счетчика) Если удовлетворено хотя бы одно из перечисленных условий, установить S2 = l. На некоторых моделях, если S2 = l, установить СС=1 и CSW = 0, S. х) Подстрочный индекс при CAW означает номер бита.—Прим. ред.
5.11. Начать ввод — вывод 125 8. Если S2 = 0 и CGW3e (PCI) = 1, установить So = 1. При So = 1 возбуждается сигнал прерывания в подканале, но So = 1 не оказывает никакого влияния на выполнение программы канала. 9. Если поступил сигнал ошибка в интерфейсе, установить Se = 1, СС = 1 и CSW = О, S. 10. Если адресуемому УВВ в подканале но удалось правильно ответить на сигналы из канала, установить СС — 3. И. Если контроллер занят, установить СС = 1, U = 50 и CSW = U, S. 12. Если поступил сигнал ошибка в интерфейсе, установить Se = 1, СС = 1 и CSW = 0, S. 13. Если S2 = 0 и U = 0, установить СС — 0. 14. Если S2 = 0, CCW32_33 = 01 (цепочка команд) и U = 08, ОС или 4G, установить СС = 0. 15. В противном случае установить СС = 1 и CSW = U, S. Если СС равно 2 или 3, операция прекращена, не начинаясь. Если СС = 0, операция началась нормально. Если СС = 1 и S2 = 0, код команды первого CCW был послан в УВВ и был им декодирован. Но либо эта операция не требовала передачи данных и уже завершена УВВ, либо УВВ не выполнило команду. Таким образом, признак результата устанавливается равным 3, если: 1. канал неработоспособен; 3. был задан адрес несуществующего мультиплексного канала; 10. УВВ отказало. Признак результата устанавливается равным 2, если: 2. канал работает в монопольном режиме; 4. в подканале хранится необработанное прерывание; 5. мультиплексный подканал работает в мультиплексном режиме. Признак результата устанавливается равным 0, если: 13. ошибка в программе не обнаружена и все биты в байте состояния устройства равны 0; это нормальная ситуация; 14. первое CCW не вызвало сигнала ошибки в программе, в нем задана цепочка команд, но оно не требовало передачи дан- ных, и в результате в байте состояния устройства появился сигнал канал кончил и, возможно, сигнал УВВ кончило. Если сигнал УВВ кончило присутствует, то может присутствовать также и модификатор состояния. Никакие другие биты не могут быть равны 1 в байте состояния устройства. Это обычно происходит, если первое CCW является командой выбрать карман, NOP и т. д. и содержит признак цепочки команд. СС = 0 означает, что
126 Гл. 5. Программирование ввода — вывода первая операция была успешно завершена и программа канала продолжает выполняться. Признак результата устанавливается равным 1, и оба байта состояния запоминаются 6, 7. на некоторых моделях при ошибке в программе, CSW = = О, S; 9, 12. при ошибке в интерфейсе, GSW = О, S; 11. Контроллер занят: CSW = U, S, где U = 50 (признаки занято и модификатор состояния); 15. «в противном случае». Случай 15 означает, что: а) была обнаружена ошибка в программе, но не такая, как в случаях 6 и 7; Ь) первое CCW не требовало передачи данных и операция продвинулась по крайней мере до получения сигнала канал кон- чил. Так как признак цепочки команд не был указан, канал сво- боден и может выполнять другую программу; с) в байте состояния УВВ возбуждаются признаки: внимание, контроллер кончил, ошибка в УВВ или особый случай в УВВ, оставшиеся от предыдущей операции. Текущая операция не выполнялась; d) при декодировании первой команды канала были обнару- жены сигналы: внимание, контроллер кончил, ошибка в УВВ или особый случай в УВВ. Операция не выполнялась. В случаях 6, 7, 9 и 12 будет запомнен байт состояния УВВ равный 0, а в байте состояния канала S2 или Se будут установлены равными 1. В необычных ситуациях в этом байте могут быть равны 1 и другие биты. В случае 11 (контроллер занят) стандартно устанавливается U = 50, в байте состояния канала могут быть биты равные 1, но обычно они равны нулю. В случае 15, если U = 08, ОС или 4С и S2 = 0, то завершена текущая операция. Во всех других случаях при СС = 1 операция не выполнялась. Если S2 = 1, байт состояния УВВ не имеет смысла, или же в УВВ возникло условие прерывания, но сигнал прерывания не был передан в подканал. Прерывание этого типа сбрасывается командой SIO4 Биты 1, 3, 4 и 7 в S должны всегда быть равны 0, если CSW запоминается с помощью SIO. Бит 0 равен 1 только в том случае, когда в первом CCW указан PCI. Если S5 или Se равен 1, зовите обслуживающий персонал. Если S2 = 1, то либо в CAW, либо в первом CCW были ошибки.
5.12. Остановить ввод — вывод 127 5.12. Остановить ввод — вывод Команда НЮ выполняется следующим образом: 1. Если капал неработоспособен, установить СС — 3. 2. Если капал работает в монопольном режиме, установить СС - 2. 3. (Только в мультиплексном канале.) Если помер подканала больше максимально возможного номера подканала в данной модели машины, установить СС = 3. 4. Если в подканале имеется необработанное прерывание, установить СС = 0. 5. Если обнаружена ошибка в интерфейсе, установить S8 — 1 и CSW = 0, S. 6. Если адресуемое УВВ неработоспособно, установить СС = 3. 7. Если контроллер занят, установить U — 50, СС = 1 и CSW = U, S. 8. В других случаях установить СС = 1 и CSW == 0, 0. Признак результата устанавливается равным 3 при тех же условиях, что и в команде SIO. Он устанавливается равным 2 только тогда, когда операция выполняется в монопольном режиме; в этом случае передача данных сразу же прекращается, а УВВ продолжает работу до нормальной остановки. Признак устанав- ливается равным 0 только в том случае, когда в подканале имеется необработанное прерывание; в этом случае не выполняется ника- ких операций и останавливать нечего. Если признак результата устанавливается равным 1 или 3, канал выдаст команду дстановиться, как только УВВ станет работоспособным или когда УВВ в мультиплексном канале запро- сит передачу следующего байта данных. Выполнение койанды НЮ для селекторного канала сопро- вождается установкой сигнала прерывания в этом канале. Для мультиплексного канала такой установки не производится, но в результате выполнения НЮ должны появиться сигналы канал кончил, УВВ кончило, а возможно, и контроллер кончил. Любой из этих сигналов сам вызывает прерывание. Обычно НЮ прекращает передачу данных только для адре- суемого УВВ. Однако, если адресуется разделенный подканал в мультиплексном канале, НЮ остановит любую выполняемую операцию передачи данных в подканале, даже если она выпол- няется для другого УВВ. 5.13. Опросить канал (ТСН) Команда ТСН выполняется следующим образом: 1. Если канал неработоспособен, установить СС = 3.
128 Гл. 5. Программирование ввода — вывода 2. Если канал работал в монопольном режиме, установить СС = 2. 3. Если в канале имеется необработанное прерывание, уста- новить СС = 1. 4. В остальных случаях установить СС — 0. Команда ТСН декодирует только адрес канала. Ни УВВ, ни контроллеры, ни подканалы не участвуют в этой операции. На некоторых дешевых моделях IBM-360, если мультиплекс- ный канал работает в монопольном режиме, CPU блокируется, пока не окончится передача данных. На этих моделях, если выпол- няется какая-либо команда CPU, мультиплексный канал не может работать в монопольном режиме. Следовательно, на этих моделях команда ТСН никогда не установит СС = 2 для мультиплексного канала. На более дорогих моделях IBM-360 мультиплексный канал, как и селекторные каналы, работает одновременно с CPU. 5.14. Опросить ввод — вывод (ТЮ) В то время как команды SIO и НЮ запоминают только два байта состояния CSW, команда ТЮ запоминает все двойное слово, если она устанавливает признак результата равным 1. В остальном команда ТЮ выполняется подобно другим командам ввода — вывода. В ней выполняется следующая последователь- ность проверок. 1. Если канал неработоспособен, установить СС = 3. 2. Если канал работает в монопольном режиме, установить СС = 2. 3. (Только для мультиплексного канала.) Если номер под- канала превышает максимальный homcjJ, имеющийся на данной модели, установить СС = 3. 4. Если для адресуемого УВВ в подканале хранится сигнал необработанного прерывания, установить СС = 1 и запомнить CSW = CAW, U, S, Счетчик. 5. Если для какого-либо другого УВВ в этом подканале хра- нится сигнал необработанного прерывания, установить СС = 2. 6. Если обнаружена ошибка в интерфейсе, установить Se = 1, СС = 1 и запомнить CSW = 0, 0, S, 0. 7. Если адресуемое УВВ^неработоспособно, установить СС = Зе 8. Если адресуемый контроллер занят, установить U = 50, СС = 1 и запомнить CSW = 0, U, S, 0. 9. Если обнаружена ошибка в интерфейсе, установить Se = 1, СС = 1 и запомнить CSW = 0, 0, S, 0. 10. Если байт состояния УВВ (U) не равен 0, установить СС = 1 и запомнить CSW = 0, U, S, 0. 11. В остальных случаях установить СС = 0.
5.14. Опросить ввод — вывод (ТЮ) 129 Следовательно, признак результата устанавливается рав- ным 3 в результате следующих проверок, приведенных выше, если: 1. канал неработоспособен; 3. указан несуществующий мультиплексный подканал; 7. УВВ неработоспособно. Признак результата устанавливается равным 2, если: 2. канал работает в монопольном режиме; 5. в подканале для другого УВВ хранится сигнал необрабо- танного прерывания. Признак результата устанавливается равным 0, если: 11. команда SIO может быть выполнена каналом. Признак результата устанавливается равным 1 и запоминается все CSW, если: 4. для адресуемого УВВ в подканале хранится сигнал необ- работанного прерывания; 6, 9. ошибка в интерфейсе; 8. контроллер занят; 10. хранится сигнал необработанного прерывания в адре- суемом УВВ. При ошибке в интерфейсе все CSW равно 0, кроме байта состояния канала. Если контроллер занят, все CSW равно 0, кроме байтов состояния; в байте состояния УВВ установлены равными 1 только биты занято и модификатор состояния; в байте состояния канала могут быть как единицы, так и нули. При хранении сигнала необработанного прерывания в устройстве CSW равно 0, кроме байтов состояния; в байте состояния УВВ будет равен 1 по крайней мере еще один бит, кроме бита занято и бита модификатор состояния. При хранении сигнала необработанного прерывания в подка- нале запоминается все CSW. В поле CAW содержится адрес сле- дующего CCW. В поле счетчика будет находиться конечное значе- ние счетчика для последнего CCW, если передача данных была завершена; в противном случае в этом поле будет находиться счетчик текущего CCW или счетчик текущего CCW, уменьшенный на некоторое число, не превышающее 8. Уменьшенное значение в этом поле бывает в тех случаях, когда канал способен обрабо- тать несколько байтов в параллельном режиме. На некоторых больших моделях IBM-360 обрабатывается сразу по 8 байтов. Команда ТЮ используется для выборочной обработки пре- рывания. Если признак результата установлен равным 1, CSW заносится в память, а байты состояния в устройствах сбрасы- ваются вместе с необработанным сигналом прерывания. Результат команды ТЮ аналогичен тому, какой получился бы, если бы оыло разрешено прерывание. 9 Зак. 15635
130 Гл. 5. Программирование ввода — вывода 5.15. Прерывания от ввода — вывода При запоминании CSW запоминаются следующие четыре поля. Первое поле — CAW, которое состоит из двух подполей: 1. ключ защиты из CAW; 2. адрес следующего CCW. Этот адрес обычно на 8 байтов больше адреса последнего (или текущего) CCW, но, если одно- временно равны 1 биты УВВ кончило и модификатор состояния, этот адрес будет на 16 байтов больше адреса последнего CCW. Второе поле — байт состояния УВВ (U). Третье поле ~ байт состояния канала (S). Четвертое поле — поле счетчика, содержащее остаточное значе- ние счетчика в последнем или текущем CCW. В конце операции это поле обычно равно 0. Если в запоминаемом CSW установлены равными 1 биты S2 (ошибка в программе), S3 (нарушение защиты) или So (PCI) в то время как программа канала продолжает выпол- няться, то поле счетчика будет правильным или уменьшенным на некоторое число, не превышающее 8, поскольку некоторые модели IBM-360 параллельно обрабатывают несколько байтов. Если CSW запоминается командами НЮ или SIO, то запо- минаются только два байта состояния. Если CSW запоминается командой ТЮ или при прерывании, то запоминается полное двойное слово. Прерывания от ввода — вывода возникают в четырех случаях. 7. Программно-управляемое прерывание. Это прерывание воз- никает при So = 1 и может произойти, хотя программа канала продолжает выполняться. Запоминаются следующие поля: CAW 0 S Счетчик Запомненный байт состояния УВВ всегда равен 0. 2. Окончание. Прерывание, указывающее на окончание, воз- никает в конце программы канала. Признак канал кончил уста- навливается равным 1. Запоминаются следующие поля: CAW U S Счетчик 3. Прерывание от устройства ввода — вывода. Оно возникает, если в УВВ произошло событие, которое может заинтересовать CPU. Например, если на УВВ включено питание и оно перево- дится в состояние готовности, то бит УВВ кончило устанавли- вается равным 1 и возникает прерывание данного типа. Точно так же, если на пишущей машинке нажимается клавиша «запрос», то возбуждается сигнал внимание, и возникает это же прерывание.
5.15. Прерывания от ввода — вывода 131 Запоминаются следующие поля: О U S О Поскольку такие прерывания не связаны ни с какими конкрет- ными программами, то запоминаются только байты состояния. 4. Ошибка в интерфейсе. Это прерывание может возникнуть только в мультиплексном канале. Оно происходит, если обнаружи- вается ошибка в интерфейсе в тот момент, когда канал просмат- ривал подканалы в поисках УВВ, ожидающего обслуживания или хранящего сигнал прерывания. Запоминаются следующие поля: О О S О Поскольку это прерывание не связано ни с конкретной програм- мой канала, ни с УВВ, запоминается только байт состояния канала. При этом Se == 1. Каждый раз, когда байт состояния отправляется в память, он устанавливается равным 0, так что одни и те же сигналы в GPU дважды не поступают. Существуют два исключения: признак занято остается равным 1 до конца операции, а признак ошибка в УВВ, порожденный сигналом «требуется вмешательство», остает- ся равным 1, пока не будет устранена вызвавшая причина. В машине» предусмотрены приоритеты. Как только возникает конфликт, т. е. когда несколько УВВ или каналов одновременно хотят использовать некоторые средства процессора, эти операции выполняются согласно следующим приоритетам. 1. Передача данных имеет преимущество над всеми осталь- ными операциями. 2. Запросы каналов на обращение к памяти имеют преиму- щество над запросами CPU. 3. Прерывания имеют преимущество перед обслуживанием каналами команд CPU. 4. Среди УВВ в канале старшинство фиксируется при их под- ключении к каналу. 5. Среди каналов селекторный канал номер 1 имеет наивысший приоритет. Приоритет мультиплексного канала может изменяться от модели к модели, но он никогда не имеет ни самого высокого, ни самого низкого приоритета. Среди самих прерываний также установлена некоторая иерар- хия. Необработанное прерывание может храниться: 1- в самом канале, 2. в подканале, 3. в УВВ или в контроллере. 9*
132 Гл. 5. Программирование ввода — вывода Программно-управляемые прерывания и прерывания по окон- чании операции вырабатываются в подканале и передаются в канал, как только канал может их принять. Прерывания, выработанные УВВ или контроллером, остаются в УВВ до тех пор, пока подканал и канал не освободятся и не примут их, после чего прерывания передаются в канал. Если прерывания возникли в нескольких УВВ сразу, канал, освободившись, принимает прерывание от УВВ с более высоким приоритетом. Возникшее позднее прерывание от УВВ с более высоким приоритетом должно храниться до тех пор, пока не будет обслужено необработанное прерывание. Если прерывание замаскировано, оно остается необ- работанным до тех пор, пока не будет сброшено командами SIO, НЮ или ТЮ или размаскировано. Упражнения № 12 1. В каждой из приведенных ниже программ канала имеются ошибки. Предполагается, что каждая из этих программ написана для устройства IBM-2520 и что первое CCW находится по адресу 00 1800. Найти ошибки (а) 01 001000 АО 000010 11 001307 АО 000041 С2 0013А4 20 000008 (с) СО 001000 ' 20 000050 (d) 01 001000 40 000050 С2 001000 40 000050 (е) 11 001000 л 80 000024 08 001810 ' 00 600038 00 001302 40 000018 (b) С8 001000 08 001804 С2 001000 20 000050 00 000000 00 000050 2. См. упр. 1. Команда ТЮ установила СС = 0. Если^бы были даны команды SIO для запуска приведенных программ, то для каких программ СС оказалось бы равным 0? 3. См. упр. 1. Что запоминается в момент окончания про- грамм (тех, которые могут начаться) при прерывании по сигналу канал кончил? Какие фактически действия будут выполнены? 4. Обычно на IBM-360 разрешаются все прерывания, относя- щиеся к УВВ. С каждым устройством свяжем один или несколько байтов, в которых содержится информация о текущем состоянии устройства. Предположим, что нужно написать программу считы- вания колоды карт нд устройстве IBM-2520 и сложения чисел, на- ходящихся в колонках 1—5 каждой карты. После того как будет считана последняя карта, сумма должна быть отпечатана на пуль- товой пишущей машинке. Для IBM-2520 имеется один байт призна- ков. Программа, обрабатывающая прерывания, должна устанавли- вать бит 1 равным 0, если обнаружит признак УВВ кончило; бит
5.15. Прерывания от ввода — вывода 133 6 равным 1, если Ue = 1 или установлен равным 1 любой из битов S2 — S7, другими словами, если была ошибка; бит 7 равным 1, если U7 = 1 сигнализирует о считывании последней карты. В памя- ти, отведенной программе имеются две отдельные области ввода, так что выполнение вычислений не прекращается, пока считы- вается следующая карта. Написать программу обработки пре- рывания, начиная с адреса 002000. Эта программа должна воз- вращать управление начальной программе. Написать подпро- грамму считывания следующей карты в область данных, адрес которой находится в регистре 15. Эту программу поместить в па- мять с адреса 002400. Написать программу, упаковывающую дан- ные ит. д. и обращающуюся к другим подпрограммам и поме- стить ее начиная с адреса 002800. Написать подпрограмму «конец файла» — подпрограмму выдачи на печать суммы — и поме- стить ее в память, начиная с адреса 002С0О. Для возвращения управления тем программам, которые выполнялись при возник- новении прерывания, использовать команду 82 00 0038.
Глава 6 УСТРОЙСТВА ВВОДА - ВЫВОДА 6.1. Интерфейс В этой главе описывается работа отдельных устройств, кото- рые обычно подключаются к IBM-360. У каждого подканала линия селекции начинается от клеммы «выход селекции» этого подканала и идет к контроллеру с наи- большим приоритетом в подканале. От этого контроллера она продолжается к следующему по приоритету контроллеру и т. д.. и в конце концов достигает контроллера с наименьшим приори- тетом. после чего она возвращается к клемме «вход селекции» подканала. Имеется еще несколько линий, которые идут от устрой- ства к устройству. Их можно классифицировать следующим обра- зом: выходная информационная шина — 9 линий (8 информацион- ных плюс одна контрольная), по которым передаются команды, адреса устройств и данные из подканала в устройство; входная информационная шина — 9 линий, по которым пере- даются адреса устройств, информация о состоянии устройств и данные из устройств в подканал; линии сопровождающих сигналов — импульсы этих линий идентифицируют информацию, передаваемую по информационным шинам, т. е. данные, команды и т. д.; линии селекции — эти линии используются подканалом при выборе определенного устройства, а также при опросе устройств для выяснения, необходимо ли какому-либо устройству обслу- живание канала; линии счетчиков — эти линии используются для включения и выключения счетчиков времени. Счетчики применяются для подсчета числа часов работы оборудования в течение месяца и определения арендной платы. Те или иные действия с устройствами ввода — вывода (УВВ) могут быть инициированы самим устройством или подканалом. Подканал инициирует работу с УВВ в связи с исполнением команд SIO, HIO или ТЮ, если они поступили, когда канал находится в работоспособном состоянии и не работает в монополь-
6.1. Интерфейс 135 ном режиме. Адрес УВВ выдается на выходную информационную шину и сопровождается сигналом-идентификатором «Адрес от ка- нала». Импульс «Адрес от канала» распространяется последова- тельно от УВВ к УВВ, и в момент прихода этого импульса устрой- ство просматривает адрес на выходной информационной шине. Если оно опознает этот адрес как свой собственный, устройство посылает в канал ответный импульс «Адрес от абонента». Если ни одно из устройств не выдает сигнала «Адрес от абонента», канал считает, что адресуемое устройство неработоспособно. Кро- ме выдачи сигнала «Адрес от абонента», УВВ также возбуждает некоторые линии выборки, в результате чего контроллер данного УВВ подключается к подканалу и прекращается дальнейшее распространение импульса «Адрес от канала». Когда подканал получает сигнал «Адрес от абонента», он помещает тестовую команду, содержащую одни нули, на выходную информационную шину и выдает сигнал «Команда от канала». Устройство отвечает выдачей сигнала «Состояние устройства» и помещением своего байта состояния на входную информационную шину. При этом байт состояния в устройстве очищается. Затем следующая команда канала помещается на выходную информационную шину и вновь выдается сигнал «Команда от канала», после чего следует пере- дача» данных. При этом, если младший бит кода команды равен 1, то данные передаются из канала в устройство, в противном слу- чае — из устройства в канал. «Ошибка в канале (в данных)» (S4) возбуждается всякий раз, когда во входной информационной шине обнаруживается непра- вильная четность. «Ошибка в канале (в управлении)» (S5) воз- буждается, когда в линиях, соединяющих канал с контроллером, обнаруживаются неверные сигналы. Предполагается, что устрой- ства отвечают в пределах некоторого интервала времени после получения сигнала. Если ответ не получен в пределах этого интервала времени, то возбуждается сигнал «Ошибка в интер- фейсе». Работа с УВВ может также инициироваться самим УВВ. Сиг- налы «Внимание» и «УВВ кончило» или просто готовность устрой- ства передать следующий байт в мультиплексном режиме могут быть причиной этого. Всегда, когда канал свободен, он опраши- вает подключенные к нему устройства. Первое же устройство, которому потребовалось обслуживание канала, помещает свой адрес на входную информационную шину и выдает сигнал «Адрес от абонента». Все остальное происходит так же, как в случае, когда инициатива начала взаимодействия исходит от канала. Устройства различаются по тому, как они себя ведут, если канал не может их достаточно быстро обслужить. Некоторые устройства, такие, как устройство чтения перфо- карт 2501, после запуска механической части не способны изме-
136 Гл. 6. Устройства ввода — вывода нить свою скорость, и данные будут потеряны, если подканал не сможет принять их вовремя. Другие устройства, такие, как печатающее устройство 1403, просто останавливаются и ждут столько, сколько потребует канал; чрезмерная задержка может снизить скорость печати, но потери данных не происходит. Такие устройства, как карточный перфоратор 1442, являются асинхрон- ными, т. е. они просто перфорируют каждый символ, когда он по- лучен, и совершенно нечувствительны к любым задержкам. Состояние, при котором происходит потеря данных, называется переполнением. Если оно происходит на первом байте после цепоч- ки команд, то выдается сигнал «Ошибка в цепочке» (S7). При переполнении всегда устанавливается равным 1 бит «Перепол- нение» в байте уточненного состояния УВВ. Байты уточненного состояния имеют различные значения для различных УВВ, кроме битов 0—5 нулевого байта, которые всегда имеют одинаковый смысл. Бит 0 Команда отвергнута. Полученная команда не может быть выполнена, так как: 1) конструкцией устройства не предусмотрено ее выпол- нение; 2) команда требует некоторых дополнительных средств, которые не установлены в УВВ; 3) устройство находится в состоянии, препятствующем выполнению команды, которая при других обстоятель- ствах была бы выполнена. Последнее состояние может иметь место для диска, если требуется считать поле счетчика, когда под считывающей головкой уже находится поле данных. 1 Требуется вмешательство. Устройство находится в состоя- нии «Не готово», замята карта, кончилась бумага и т. д. Требуется вмешательство оператора, чтобы вновь привести устройство в состояние «Готово». 2 Ошибка в выходной информационной шине. Устройство (а не канал) получило на выходной информационной шине байт с неправильной четностью. 3 Ошибка в оборудовании. Был обнаружен сбой в электриче- ском или механическом оборудовании. Обычно это вызывает прекращение передачи данных. 4 Ошибка в данных. Неопределенный код или код с непра- вильной четностью содержится на внешнем носителе или же при выводе информация на внешний носитель записана неверно. Операция продолжается, но правильность пере- даваемых данных не гарантируется. При вводе контроллер
6.2. Устройство чтения перфокарт 2501 137 всегда формирует правильную четность для байта на вход- ной шине. Переполнение. Обычно переполнение прекращает передачу данных как при вводе, так и при выводе. Байты уточнен- ного состояния сбрасываются следующей выполняемой кон- троллером командой, отличной от команд «Уточнить состоя- ние» или «NOP». Вообще присутствие любой единицы в байте уточненного состояния будет вызывать возбуждение бита «Ошибка в устрой- стве» (Ue). При сбросе байта уточненного состояния бит «Тре- буется вмешательство» остается возбужденным, если не устранена причина его появления. Обычно высший прио- ритет в каналах приписы- вается устройствам, более склонным к переполнению. Следует подчеркнуть, что адрес устройства абсолют- но не связан с приорите- том — оба присваиваются независимо и не имеют ни- чего общего. 6.2. Устройство чтения перфокарт 2601 На рис. 6.1 изображено устройство чтения перфо- карт 2501. Перфокарты по- даются из магазина в пункт предчтения, а оттуда мимо двенадцати фотоэле- ментов (которые- обнару- живают свет, проводящий Рис. 6.1. Устройство чтения карт 2501. через отверстия в карте) в приемный карман. Тракт перфокарты изображен на рис. 6.2. Модель В1 считывает перфокарты со скоростью 600 карт в минуту, модель В2 — 1000 карт в минуту. Предусмотрены два режима чтения перфокарт. При чтении ГигпИМе каждая колонка перфокарты преобразуется в код EBCDIC и полученный байт посылается в канал. Режим 2 уста- навливается только за дополнительную плату и является режимом
138 Гл. 6. Устройства ввода — вывода ввода «образа карты». Каждая колонка перфокарты переходит в два байта. Строки 12—3 переходят в биты 2—7 первого байта, а строки 4—9 в биты 2—7 второго байта. Биты 0 и 1 обоих бай- тов заполняются нулями. Таким образом, буква А в режиме 1 заполняет один байт памяти в виде С1, а в режиме 2 она заполняет Рис. 6.2. Тракт карты в устройстве 2501. 1 —- приемный карман; 2 — 12 фотоэлементов пункта чтения; 3 — пункт предчтения; 4 — магазин. два байта в виде 2400. В режиме 2 все комбинации отверстий считаются допустимыми. В режиме 1 любая колонка перфокарты с более чем одной пробивкой в строках 1—7 считается недопу- стимой и будет вызывать «Ошибку в данных». Команды имеют следующие коды: 02 Чтение в режиме 1 22 Чтение в режиме 2 03 Нет операции (NOP) 04 Уточнить состояние
6.2. Устройство чтения перфокарт 2501 139 Байт состояния устройства Бит О, 1, 2 Не используются. 3 Занято. 4 Канал кончил. Этот сигнал выдается, как только послед- ний байт передан в канал. Если считывается менее 80 колонок, то сигнал выдается, как только поле счет- чика CGW станет равным нулю. 5 УВВ кончило. Этот сигнал выдается после того, как перфокарта полностью прошла пункт чтения. Это про- изойдет не ранее чем через 3.5 миллисекунды после сиг- нала «Канал кончил». 6 Ошибка в устройстве. Ue — 1 всегда, когда байт уточ- ненного состояния отличен от нуля. 7 Особый случай в устройстве.. После того как была про- читана последняя карта колоды, при первом же новом чтении будет выдан этот сигнал еще во время выбора устройства. То есть в ответ на команду SIO будет установлено СС = 1. Байт уточненного состояния Бит О Команда отвергнута. 1 Требуется вмешательство. Сигнал выдается при полном приемном кармане, при замятии перфокарты, при пустом магазине (без EOF), в состоянии «Не готово». 2 Ошибка в выходной информационной шине. 3 Ошибка в оборудовании. 4 Ошибка в данных. Сигнал выдается только в режиме 1, если в строках 1—7 присутствует более одной пробивки. 3 Переполнение. 6, 7 Не используются. На рис. 6.3 изображена панель управления. На ней располо- жены следующие шесть индикаторных лампочек: 1. Питание включено (POWER ON). Сигнализирует о подаче питания на устройство. 2. Ошибка подачи (FEED CHECK). Эта лампочка указывает замя- тие перфокарты или повреждение фотоэлемента, при этом возбуждается бит 1 байта уточненного состояния.
140 Гл» 6. Устройства ввода — вывода 3. Готово (READY). Лампочка включается, если: 1) включено питание, 2) перфокарта находится в пункте предчтения, 3) горит лампочка EOF или в магазине имеются карты, 4) приемный карман не переполнен, 5) лампочка «Ошибка подачи» не горит, 6) защитный кожух устройства 2501 закрыт, 7) клавиша «Стоп» (STOP) не нажималась после того, как последний раз была нажата клавиша «Старт» (START). VALIDITY CHECK END OF FILE READ CHECK READY FEED CHECK POWER ON P uc. 6.3. Панель управления устройства 2501. Если лампочка «Готово» не горит, то бит 1 байта уточненного состояния устанавливается равным 1. 4. Ошибка при чтении (READ CHECK). Возбужден бит 3 байта уточненного состояния. 5. Конец файла (END OF FILE — EOF). Транспортировка карт прекращается, как только из магазина уходит последняя перфокарта. Для того чтобы эта последняя карта была про- читана, должна быть нажата клавиша EOF. Эта клавиша вклю- чает лампочку «Конец файла» и обеспечивает транспортировку последней перфокарты. После того как последняя перфокарта окажется в приемном кармане, лампочка EOF гаснет. 6. Контроль допустимости (VALIDITY CHECK). Возбужден бит 4 байта уточненного состояния. Кроме того, на панели имеются 4 клавиши: 1. Старт (START). Вызывает подачу первой перфокарты. Если эта клавиша нажимается после того, как устройство было остановлено, она переводит его в состояние «Готово». 2. Прогон перфокарт (NON-PROCESS RUN-OUT — NPRO). Если магазин пуст, эта клавиша используется для прогона перфо- карты через механизм транспортировки в приемный карман без считывания. 3. Стоп (STOP). Переводит устройство в состояние «Не готово» и останавливает устройство после окончания текущей операции.
6.3. Устройство чтения — перфорации карт 2520 141 4. EOF (конец файла). Включает лампочку EOF и обеспечивает чтение последней карты. При нормальной работе нужно загрузить перфокарты в мага- зин и нажать клавишу «Старт», а после того как в магазин поме- щены последние перфокарты, которые должны быть считаны, нажать клавишу EOF. Если возникла какая-либо ошибка, то необ- ходимо вынуть перфокарты из магазина, нажать клавишу NPRO, после чего последнюю перфокарту в приемном кармане (которая не была считана), положить перед картами, оставшимися в мага- зине. Процедура повторного запуска после ошибки может выклю- чить лампочку EOF; в этом случае нужно вновь нажать кла- вишу EOF. 6.3. Устройство чтения — перфорации карт 2520 Мы уже встречались с устройством 2520 в гл. 5. Оно изобра- жено на рис. 6.4. Перфокарты подаются из магазина мимо фото- элементов пункта чтения так же, как в устройстве 2501. Одновре- менно с этим предшествующая перфокарта проходит под набором Рис. 6.4. Устройство чтения — перфорации карт 2520.
142 Гл. 6. Устройства ввода — вывода 80 пуансонов и затем направляется в один из двух приемных карманов, как показано на рис. 5.2. Модель В1 считывает и пер- форирует 500 карт в минуту. Модель В2 аналогична модели В1, но она не имеет пункта чтения. Модель ВЗ перфорирует 300 карт в минуту; подобно модели В2 она не имеет пункта чтения. В моде- лях В2 и ВЗ карты транспортируются так же, как если бы имелся пункт чтения, однако считывание не происходит. Коды команд, используемых устройством 2520, приведены на рис. 6.5. Режим 12 Приемный карман | 1 2 1 1 2 Запись, подача и выбор приемного кармана ВВ J 01 41 II 21 61 -(-Запись и выбор приемного кармана ВА | 09 49 1 29 69 -(-Выбор приемного кармана ВА | | 23 63 I23 63 +Чтение, подача и выбор приемного кармана АА 02 42 II 22 62 -(-Чтение и подача | | АВ С2 II Е2 Нет операции (NOP) | 03 Уточнить состояние | 04 -(-только для модели В1. Рис. 6.5. Коды команд 2520. Команда «Запись, подача и выбор приемного кармана» пере- сылает данные в буфер перфорации, подает карту и перфорирует ее; однако карта, которая проходит пункт чтения во время цикла транспортировки, не считывается. В модели В1 каждой команде присваивается тип — АА, АВ, ВА или ВВ. Требуется, чтобы за каждой командой следовала такая команда, у которой первая буква типа совпадает с последней буквой типа предыдущей коман- ды. Например, за командой типа АВ могут следовать команды типа ВА или ВВ, но не типа АА или АВ. Команды «NOP» и «Уточ-
6.3. Устройство чтения — перфорации карт 2520 143 нить состояние» не влияют на правильность следования команд. Работа устройства всегда начинается с выполнения команды типа А А или АВ, чтобы вызвать продвижение первой карты через пункт чтения. Режим 2 для устройства 2520 устанавли- вается только за дополнительную плату. Выбор приемного кармана выполняется для карты, находя- щейся в пункте предперфорации. В модели В1 команда «Запись и выбор приемного кармана» загружает буфер перфорации при чтении следующей карты. Если выдана команда «Выбор прием- ного кармана», она также фактически выполняется во время следующей команды чтения. Байт состояния устройства в точности подобен байту состоя- ния для устройства 2501. Байт уточненного состояния Биты 0 Команда отвергнута. 1 Требуется вмешательство. 2 Ошибка в выходной информационной шине. 3 Ошибка в оборудовании. Этот сигнал означает: а) ошибку перфорации, б) неправильную четность в буфере перфорации, в) недопустимый символ при перфорации в режиме 1, г) неверное чтение колонки перфокарты (только для моде- ли В1). 4 Ошибка в данных. Карта имеет более одной пробивки в строках 1—7. Только для модели В1. 5 Переполнение. Только для модели В1. 6 , 7 Не используются. На рис. 6.6 изображена панель управления. На ней распо- ложены следующие восемь индикаторных лампочек. 1. Питание включено (POWER ON). Сигнализирует о подаче пита- ния на устройство. 2. Готово (READY). Лампочка включается, если: 1) включено питание, 2) приемные карманы не переполнены, 3) имеются карты в магазине и пункте предчтения или же включена лампочка EOF, 4) ящик для конфетти на месте и не переполнен, 5) лампочка «Ошибка подачи» не горит, 6) защитные кожухи устройства закрыты,
144 Гл, 6» Устройства ввода — вывода 7) клавиша «Стоп» не нажималась после того, как в последний раз была нажата клавиша «Старт». CHIP BOX END OF FILE READY PUNCH CHECK POWER ON DATA CHECK P и c. 6.6. Панель управления устройства 2520. Если лампочка «Готово» не горит, то выдается сигнал «Требуется вмешательство». 3. Ошибка при чтении (READ CHECK) (только для модели В1). Включается, если возбужден бит 3 байта уточненного состояния. 4. Ящик для конфетти (CHIP BOX). Ящик предназначен для конфетти при перфорации карт. Если ящик переполнен или его нет на месте, то включается эта лампочка. Лампочка выклю- чается, когда пустой ящик ставится на место. 5. Ошибка в данных (DATA CHECK) (только для модели В1). Включается, если возбужден бит 4 байта уточненного состоя- ния. 6. Ошибка перфорации (PUNCH CHECK). Указывает, что карта была отперфорирована неправильно; при этом возбуждается бит 3 байта уточненного состояния, и карта всегда направ- ляется в приемный карман 1. 7. Ошибка подачи (FEED CHECK). Перфокарты в тракте непра- вильно транспортируются. При этом выдается сигнал «Тре- буется вмешательство». Нажатие клавиши NPRO выключает эту лампочку. 8. Конец файла (EOF) (только для модели В1). Включается, когда нажимается клавиша EOF. Выключается после того, как выдан сигнал «Особый случай в устройстве».
6.4. Устройство чтения — перфорации карт 1442 145 Кроме этого на панели управления находятся четыре клавиши. 1. Старт (START). Подается карта из магазина и, если все в по- рядке, включается лампочка «Готово». После нажатия клавиши «Стоп» или клавиши NPRO клавиша «Старт» используется для восстановления состояния «Готово». 2. Стоп (STOP). Останавливает устройство после окончания текущей операции. Лампочка «Готово» выключается. 3. Прогон перфокарт (NPRO). Если магазин пуст, клавиша NPRO вызывает прогон двух карт из тракта в приёмный кар- ман 1 без перфорации и чтения. Чтобы устранить замятие карты, вынимают карты из магазина и нажимают клавишу NPRO, после чего две последние карты из приемного карма- на 1 помещают перед картами, оставшимися ранее в магазине, и нажимают клавишу «Старт». Так как NPRO выключает лам- почку EOF, то для ее включения после клавиши «Старт» нужно снова нажать клавишу EOF. 4. EOF (только для модели В1). Позволяет считать последнюю карту, когда магазин пуст. После чтения последней карты колоды при первой же новой команде чтения или записи выдается сигнал «Особый случай в устройстве». Сигнал вы- дается во время выбора устройства. 6.4. Устройство чтения -7- перфорации карт 1442 На рис. 6.7 изображено устройство 1442. Перфокарты подают- ся из магазина мимо фотоэлементов пункта чтения в пункт пред- перфорации. Далее карты поколонно проходят пункт перфорации и направляются в один из двух приемных карманов, как пока- зано на рис. 6.8. Модель N1 считывает 400 перфокарт в минуту и перфорирует со скоростью 160 колонок в секунду. Модель N2 похожа на модель N1, но она не имеет механизма чтения и имеет только один приемный карман. В отличие от устройства 2520 при перфорации карта не буферизуется и, вообще говоря, перфорация происходит независимо от операции чтения. Коды команд приведены на рис. 6.9. Режим 2 вводится только за дополнительную плату. Байт состояния устройства в точности подобен байту состояния устройства 2501. Байт уточненного состояния Бит 0 Команда отвергнута. 1 Требуется вмешательство. Возбуждается всегда, когда не горит лампочка «Готово». 10 Зак. 15635
Рис. 6.7. Устройство чтения — перфорации карт 1442. Рис. 6.6. Тракт карт в устройстве 1442. 1 — пункт изменения направления движения; 2 — пункт перфорации; 3 — пункт чтения (только модель N1); 4 — магазин’, 5 — приемный карман 2 (только модель N1); 6 —приемный карман 1.
6.4. Устройство чтения — перфорации карт 1442 147 2 Ошибка в выходной информационной шине. 3 Ошибка в оборудовании. Возбуждается, если в режиме 1 отперфорирован недопустимый символ или в цепях чте- ния — перфорации обнаружены сбои. 4 Ошибка в данных (только для модели N1). В режиме 1 колонка перфокарты в строках 1—7 содержит более одной пробивки. 5 Переполнение (только для модели N1). Переполнение может иметь место только при чтении перфокарт. 6 , 7 Не используются. Карта, которую нужно отперфорировать, проходит пункт чтения и останавливается так, что колонка 1 помещается в пункте перфорации. Когда содержимое очередной колонки передается из основной памяти, колонка перфорируется. Устройство 1442 не распознает конец перфокарты, поэтому если передается более 80 байтов, устройство будет продолжать перфорацию «в воздух», несмотря на то, что перфокарта уже прошла пункт перфорации. Приемный карман 1 2 Режим 1 2 1 2 Запись 01+ 21+ 41 61 Запись и подача 81+ А1+ С1 Е1 Чтение 02 22 42 62 Выбор приемного кармана 03+ 43 Подача 83+ СЗ Уточнить состояние 04+ +только для устройства 1442 — N2. Рис. 6.9. Коды команд 1442. Кроме того, если команда записи не вызывает подачу перфокарты (т. е. не продвигает ее целиком через пункт перфорации по окон- чании операции), то следующая команда записи начнет перфо- рацию со следующей колонки той же самой карты. Устройство 1442 перфорирует 80 колонок перфокарты со скоростью 91 пер- фокарта в минуту; карты с пробивками только в колонках 1—10 перфорируются со скоростью 265 карт в минуту. Поэтому при использовании устройства 1442 целесообразно располагать колонки, которые нужно отперфорировать, у левого конца перфо- 10*
148 Гл. 6. Устройства ввода — вывода Панель управления изображена на рис. 6.10. Функции кла- вишей точно такие же, как и у устройства 2520. Все лампочки HOPR FEED DATA READ CLU EQUIP STA PUNCH BUS STA OUT TRANS OVER RUN POWER ON READY END OF FILE CHECK CHIP BOX END OF FILE Рис. 6.10. Панель управления устройства 1442» идентичны, за исключением лампочки «Ошибка», которая вклю- чается, если высвечивается один из следующих индикаторов. Магазин (HOPR). Карты не подаются из магазина. Возбужден бит 1 байта уточненного состояния. Пункт чтения (READ ST А). Карта неправильно установлена в пункте чтения, или же повреждение в лампах подсветки или цепях считывания. Возбужден бит 1 байта уточненного состояния. Пункт перфорации (PUNCH STA). Замятие карты в пункте пер- форации. Возбужден бит 1 байта уточненного состояния. Транспортировка (TRANS). Замятие карты в области приемного кармана. Возбужден бит 1 байта уточненного состояния. Цикл подачи (FEED CLU). За время полного цикла подачи не было передачи данных. Возбужден бит 1 байта уточненного состоя- ния. Данные (DATA). Возбужден бит 4 байта уточненного состояния. Оборудование (EQUIP). Возбужден бит 3 байта уточненного состояния. Выходная шина (BUS OUT). Возбужден бит 2 байта уточненного состояния. Переполнение (OVERRUN). Возбужден бит 5 байта уточненного состояния. Ранее выпускавшиеся устройства 1442 имеют другой набор лампочек и клавишей, но функции их, однако, те же самые.
6.5. Устройство чтения — перфорации карт 2540 149 6.5. Устройство чтения — перфорации карт 2540 В отличие от карточных устройств, описанных выше, устрой- ство 2540, изображенное на рис. 6.11, подключается к IBM-360 с помощью отдельного контроллера 2821 (модели 1, 4 или 5). Так как контроллер и УВВ могут рассматриваться логически Рис. 6.11. Устройство чтения — перфорации карт2540. \ как одно устройство «контроллер — УВВ», мы не будем проводить различие между функциями контроллера 2821 и функциями самого устройства 2540. Логически устройство 2540 состоит из двух устройств. Из мага- зина справа (устройство чтения) карты подаются широкой сто- роной со скоростью 1000 карт в минуту мимо двух наборов счи- тывающих щеток и отсюда попадают в один из трех правых прием- ных карманов. Карман вмещает 3000 перфокарт. Из магазина слева (устройство перфорации) карты проходят два пункта чтения и один пункт перфорации и отсюда попадают в один из трех левых приемных карманов. Центральный приемный карман используется обоими устройствами, которые в остальном работают независимо Друг от друга. Один из пунктов чтения в устройстве перфорации
150 Гл, в. Устройства ввода — вывода (слева на рис. 6.12) устанавливается за дополнительную плату и называется пунктом предперфорационного чтения (PFR). Каждому устройству присваивается адрес «канал — УВВ*. Это означает, что в мультиплексном канале для 2540 требуются два подканала. Каждое устройство в 2540 имеет свой собственный Рис, 6,12. Тракт карты в устройстве 2540. I —магазин перфорации', 2—пункт PFR (предперфорационного чтения); 3 — пункт перфорации; 4 — пункт контроля перфорации; 5 — положение карты перед приемным карманом; 6 —пункт чтения; 7 —пункт контроля чтения; 8 — магазин чтения. байт состояния и свой байт уточненного состояния, а также свои клавиши и Индикаторные лампочки. На рис. 6.12 изображены тракты перфокарт для обоих устройств, входящих в 2540. Оба устройства имеют буферы. Устройство чтения 2540 считывает в буфер, а затем, когда канал выдает команду чтения, информация передается из буфера в основ- ную намять. Как только буфер освобождается, считывается следующая карта. При перфорации буфер используется так же, как в устройстве 2520. Сначала рассмотрим устройство чтения, а затем устройство перфорации. Коды команд для устройства чтения следующие: Режим Тип 1 2 Чтение, подача и выбор приемного кармана АА SSOO 0010 SS10 0010 Чтение Подача и выбор приемного АВ 1100 0010 1110 0010 кармана ВА SS10 ООН Уточнить состояние — 0000 0100 Нет операции (NOP) — 0000 ООН Здесь SS. = 00 указывает карман RI; SS — 01 указывает карман R2; SS = 10 указывает карман RP3.
6.5. Устройство чтения — перфорации карт 2540 151 Команды должны выполняться так, чтобы за командой типа АА следовала команда типа АВ или типа АА; за командой типа АВ должна следовать либо другая команда типа АВ, либо команда типа ВА; за командой типа В А должна следовать команда типа А А или типа АВ. Режим 2 устанавливается только за дополнительную плату. Команда «Чтение» вызывает передачу содержимого буфера в основную память. Команда «Подача и выбор приемного кар- мана» вызывает чтение следующей перфокарты в буфер, замещая содержимое предыдущей карты, а карта, находящаяся в пункте перед карманом (т. е. карта, которая последней была передана в память), помещается в указанный приемный карман. Команда «Чтение, подача и выбор приемного кармана» объединяет обе эти операции, но при этом естественно предполагается, что програм- мист знает, в какой приемный карман он хочет поместить карту до того, как она прочитана. Байт состояния устройства подобен байту состояния устройства 2501. Байт уточненного состояния Бит 0 Команда отвергнута. Этот бит возбуждается при недопустимой последовательности команд, а также при не определенном коде команды. 1 Требуется вмешательство. В устройстве 2540 значение этого бита, равное 1, не вызывает возбуждения бита «Ошибка в уст- ройстве» при выполнении команды «Уточнить состояние», однако возбуждение происходит при выполнении других команд. 2 Ошибка в выходной информационной шине. 3 Ошибка в оборудовании. Этот бит возбуждается только при окончании работы канала и относится к перфокарте, данные с которой были только что переданы. 4 Ошибка в данных. В режиме 1 колонка перфокарты в стро- ках 1—7 содержит более одной пробивки. 5 Не используется. В устройстве 2540 переполнение невозможно. 6 Необычная последовательность команд. Возбуждается, если за командой типа АВ следует другая команда типа АВ и между ними нет команды типа ВА. 7 Не используется. Панель управления для 2540 изображена на рис. 6.13. Сле- дующие пять индикаторных лампочек относятся только к устрой- ству чтения:
152 Гл. 6. Устройства ввода — вывода 1. Останов подачи (FEED STOP). Замятие карты, ошибка в подаче и т. д. Возбужден бит 1 байта уточненного состояния. 2. Готово (READY). Перфокарты находятся в пунктах предчтения (первый пункт чтения служит лишь пунктом контрольного чтения; перфокарта считывается в буфер во втором пункте Рис. 6.13» Панель управления устройства чтения 2540 чтения), магазин не пуст (если только не включена лампочка EOF), и бит 1 байта уточненного состояния сброшен. 3. Ошибка при чтении (READ CHECK). Возбужден бит 3 байта уточненного состояния. 4. Контроль допустимости (VALIDITY CHECK). Возбужден бит 4 байта уточненного состояния. 5. Конец файла (EOF). Включается, когда нажимается клавиша EOF; выключается после того, как считана последняя карта и сигнал «Особый случай в устройстве» выдан в канал. Четыре индикаторные лампочки являются общими для устрой- ства чтения и устройства перфорации. 1. Транспортировка (TRANSPORT). Замятие карты в области приемного кармана. Возбуждается бит 1 байта уточненного состояния. 2 Питание (POWER). Сигнализирует, что питание постоянного тока подано на 2540. 3. Карман (STACKER). Указывает, что приемный карман полон. Возбуждается бит 1 байта уточненного состояния.
6.5. Устройство чтения — перфорации карт 2540 155 4. Предохранитель (FUSE). Указывает, что перегорел предохра- нитель. Вызывайте инженера для его замены. Возбуждается бит 1 байта уточненного состояния. Управляется устройство тремя клавишами. 1. Старт (START). Используется для подачи первой карты и приведения устройства в состояние «Готово». После того как устройство чтения было остановлено с помощью клавиши «Стоп», нажатие клавиши «Старт» восстанавливает состояние «Готово». Если лампочка EOF выключена, магазин пуст и стенка укладчика карт поднята, то при нажатии клавиши «Старт» выполняется операция NPRO (прогон перфокарт). 2. Стоп (STOP). Прекращает выполнение операции и выключает лампочку EOF. 3. Конец файла (EOF). Включает лампочку EOF, разрешая счи- тывание последних перфокарт. В устройстве перфорации используются следующие коды команд: Режим Тип 1 2 Чтение АВ 1100 0010 » PFR-чтение, запись, по- дача и выбор приемного кармана ВА SSOO 1001 SS10 1001 Запись, подача и выбор приемного кармана ВВ SSOO 0001 SS10 0001 Уточнить состояние — 0000 0100 Нет операции (NOP) — 0000 ООН Необходимо соблюдение следующих правил при выполнении последовательности команд: за командой типа ВВ должны сле- довать команды типа ВВ или ВА; за командой типа ВА — коман- да типа АВ; за командой типа АВ — команда типа АВ, В А или ВВ. Команда «Уточнить состояние» и «NOP» не влияют на пра- вильность построения последовательности. SS = 00 указывает карман Pl, SS = 01 указывает карман Р2, a SS = 10 указывает карман RP3. Команда «Запись, подача и выбор приемного кармана» вызы- вает пересылку данных из основной памяти в буфер и затем пода- чу, при которой содержимое буфера перфорируется на карту, находящуюся в пункте предперфорации. Перфокарта, находя- щаяся в пункте предчтения (PFR), не считывается в буфер. Выбор приемного кармана относится к перфокарте, которую нужно отперфорировать. Однако, если при перфорации карты допущена ошибка, она автоматически посылается в карман Р1.
154 Гл. 6. Устройства ввода — вывода Команда «PFR-чтение, запись, подача и выбор приемного кармана» совпадает с предыдущей командой, за исключением того, что карта, находящаяся в пункте предчтения (PFR), счи- тывается в буфер в то время, когда карта, находящаяся в пункте предперфорации, перфорируется. Байты состояния устройства и уточненного состояния иден- тичны описанным выше соответствующим байтам для устройства CHIP BOX PUNCH CHECK READY rssszssssssssssA Рис. 6.14» Панель управления устройства перфорации 2540. чтения 2540. Отметим, что бит 6 байта уточненного состояния возбуждается только, если две команды чтения выполняются непосредственно друг за другом. Если средства PFR не установ- лены, команды «Чтение» и «PFR-чтение, запись, подача и выбор приемного кармана» недопустимы. Панель управления для устройства перфорации изображена на рис. 6.14. На ней расположены следующие пять лампочек: 1. Ящик для конфетти (CHIP BOX). Ящик для конфетти пере- полнен. Возбуждается бит 1 байта уточненного состояния. 2. Готово (READY). Бит 1 байта уточненного состояния сброшен. 3. Ошибка перфорации (PUNCH CHECK). Возбужден бит 3 байта уточненного состояния. 4. Останов подачи (FEED STOP). Замятие карты или ошибка подачи. Возбуждается бит 1 байта уточненного состояния. 5. Конец файла (END OF FILE;. Используется только, если установлены средства PFR.
6.6. Пультовая пишущая машинка 1052 155 Кроме того, на панели имеются три клавиши. 1. «Старше. Используется для подачи первой карты и приведе- ния устройства в состояние «Готово». Во время подачи первой карты она считывается в буфер, если установлено PFR. Если магазин пуст и лампочка EOF выключена, то при нажатии клавиши «Старт» все перфокарты прогоняются в карман Р1 без чтения и перфорации. Если устройство было остановлено с помощью клавиши «Стоп», то нажатие клавиши «Старт» восстанавливает состояние «Готово». 2. «Стом». Останавливает движение карт после окончания теку- щей операции и выключает лампочку EOF. 3. EOF (конец файла). Включает лампочку EOF, разрешая подачу последних карт (только для моделей с PFR). Устройство 2540 может быть приспособлено для чтения перфо- карт IBM с 51 колонкой. В этом случае скорость считывания уменьшается до 800 карт в минуту. Так как устройство 2540 имеет буферы, то оно является наиболее быстродействующим устройством чтения перфокарт для IBM-360. 6.6. Пультовая пишущая машинка 1052 Устройство 1052 представляет собой модифицированную пишу- щую машинку, позволяющую печатать и вводить в машину информацию с клавиатуры. В IBM-360 устройство 1052 исполь- зуется в основном для выдачи сообщений оператору; оператор в свою очередь может сам печатать короткие сообщения, напри- мер текущую дату. В модели 30 устройству 1052 должен присваиваться адрес 01F, 03F или 05F. В других моделях может использоваться любой адрес. Существует несколько моделей устройства 1052, но все они сходны между собой. На рис. 6.15 схематически изображена клавиатура машинки и клавиши управления. 89 символов, используемых в устрой- стве 1052, включают 65 символов, используемых в клавишном перфораторе 029 (исключая С и !), плюс 26 строчных букв. Команды для устройства 1052 имеют следующие коды: Запрос чтения (ввод информации с клавиатуры) 0А Запись с возвратом каретки 09 Запись без возврата каретки 01 Уточнить состояние 04 Нет операции (NOP) 03 Звуковая сигнализация 0В
156 Гл. 6. Устройства ввода — вывода Команда «Запрос чтения» позволяет оператору ввести с кла- виатуры любой символ. После того как символ передан в машину, может быть введен следующий символ. Когда клавиатура раз- блокирована, горит лампочка «Работайте» (PROCEED) и оператор Рис. 6.15. Схематическое изображение клавиатуры и панели управления устройства 1052. может вводить символ. Между вводом двух следующих друг за другом символов должно пройти не менее 67.5 миллисекунд. Операция прекращается, если: 1. Поле счетчика в CCW становится равным нулю. 2. Оператор нажимает «5» при нажатой клавише ALTN CODING. 3. Оператор нажимает «О» при нажатой клавише ALTN CODING. В любом случае при прекращении операции происходит воз- врат каретки. Сигнал «Канал кончил» выдается по окончании передачи данных; сигнал «УВВ кончило» выдается после воз- врата каретки. По команде «Звуковая сигнализация» выдается пятисекундный звуковой сигнал. По команде «Запись» происхо- дит печать данных. Автоматический возврат каретки следует за печатью при команде с кодом 09. Байт состояния устройства Бит 0 Внимание. Возбуждается, когда нажимается клавиша «Запрос» (REQUEST) справа от клавиатуры. Если кон- троллер устройства 1052 занят, сигнал «Внимание» не вы- дается, пока не закончится выполняемая операция. 1, 2 Не используются.
6,6. Пультовая пишущая машинка 1052 157 3 Занято. 4 Канал кончил. 5 УВВ кончило. 6 Ошибка в устройстве. Возбуждается, если байт уточнен- ного состояния имеет ненулевые разряды. Как исключение, бит «Ошибка в устройстве» возбуждается во время началь- ного выбора устройства по команде чтения или записи при наличии сигнала «Требуется вмешательство». Если же условие, требующее вмешательства, возникает в процессе выполнения операции, то бит «Ошибка в устройстве» не воз- буждается. 7 Особый случай в устройстве. Возбуждается, когда операция чтения прекращается из-за того, что оператор нажал цифру «О» вместе с клавишей ALTN CODING, что порождает сигнал аннулирования (Cancel), который используется как сообщение о допущен- ной ошибке. Байт уточненного состояния Биты О Команда отвергнута. Устройство 1052 получило не опре- деленную команду. 1 Требуется вмешательство. Возбуждается, если нажата кла- виша «Не готово» (NOT READY справа от клавиатуры), в то время как устройство 1052 не занято, а также если кончилась бумага и устройство 1052 не занято. Ни одно из этих условий не вызывает прекращения выполняемой операции. 2 Ошибка в выходной информационной шине. 3 Ошибка в оборудовании. 4—7 Не используются. Работой устройства 1052 можно управлять с помощью трех клавиш, находящихся справа от клавиатуры. Клавиша READY переводит устройство 1052 в состояние «Готово». Клавиша NOT READY выводит устройство 1052 из состояния «Готово». Кла- виша REQUEST возбуждает разряд «Внимание» в байте состоя- ния устройства. Клавиша ALTN CODING вызывает смену кода, т. е. переход к альтернативному коду. Если эта клавиша нажата вместе с цифрой 5, то будет выдан сигнал «Конец блока» (ЕОВ), это вызовет нормальное завершение операции ввода; байт инфор- мации при этом в канал не передается. Если клавиша ALTN CODING нажата вместе с цифрой «0», то это означает аннулиро-
158 Гл. 6. Устройства свода — вывода вание, т. е. отмену напечатанного текста. Цифра 6 при этом же условии означает «Конец передачи данных» (EOT) и используется подобно цифре 5. Клавиша ALTN CODING сама по себе не вызы- вает печати или передачи данных. При вводе информации в IBM-360 могут быть переданы четы- ре управляющих символа: 05 — НТ — горизонтальная табуляция, 15 — NL — новая строка (с возвратом каретки), 16 — BS — возврат каретки на один шаг, 25 — LF — перевод строки (без возврата каретки). При выводе в устройство 1052 можно послать 16 управляю- щих символов вида OOxxOlxx, однако не все устройства 1052 могут воспринимать все эти символы. Если устройство 1052 подсоединено к контроллеру 1051, то к этому контроллеру могут быть подсоединены и другие УВВ и тогда некоторые управляю- щие символы применимы только к определенным УВВ, таким, как карточные перфораторы, перфораторы бумажной ленты и др. Важное значение имеет символ префикса (27 в шестнадцате- ричной системе). Он никогда не печатается. Он означает, что следующий символ является не символом данных, а специальным управляющим символом. Задаваемые с помощью префикса управ- ляющие символы относятся к специальным средствам. Среди них: префикс А сдвиг красящей ленты вверх префикс В сдвиг красящей ленты вниз 6.7. Построчно печатающее устройство Вместо того чтобы перфорировать данные на карты, гораздо удобнее отпечатать их на бумаге, где их можно прочитать. Печать может осуществляться с помощью пишущей машинки, но неболь- шая скорость делает ее пригодной только для выдачи коротких и достаточно редких сообщений. Построчно печатающие устрой- ства, используемые IBM-360, печатают сразу целую строку, содержащую от 120 до 144 символов. Устройство 1443 (модель N1) печатает от 200 до 600 строк в минуту; каждая строка содержит 120 или 144 символа (последняя возможность устанавливается только за дополнительную плату). Устройство 1403 (модель N2) печатает от 143 до 1285 строк в минуту, и каждая строка содержит 132 символа. Устройство 1403 (модели N1 и 3) печатает от 309 до 1400 строк в минуту и строка имеет длину 132 символа. Устрой- ство 1443 содержит свой собственный контроллер; устройства 1403 подсоединяются к контроллеру 2821. В устройстве 1443 используется стержень, содержащий набор из 13, 39, 52 или 63 различных символов. Стержень переме-
6,7. Построчно печатающее устройство 159 щается попеременно слева направо, а затем справа налево вдоль печатаемой строки. Электромагнитные молоточки ударяют по стержню по мере его перемещения, отпечатывая символы. Скорость печати зависит от набора символов на стержне: Число различных символов Скорость печати в наборе в строках в минуту 13 ббб 39 300 52 240 63 200 Стандартным является стержень с 52 различными символами. Обычно используемые наборы символов приведены в Прило- жении А. Устройство 1403—2 использует цепь, подобную велосипедной цепи, в которую вмонтированы 240 символов. При использовании стандартного набора из 48 символов, каждый из которых повто- ряется пять раз, достигается скорость в 600 строк в минуту. Подобно устройству 1443 могут использоваться различные наборы символов. Они приведены в приложении А. Устройства 1403—3 и 1403—N1 используют несколько иную конструкцию цепи, обеспечивая повышение скорости от 600 до 1110 строк в минуту. Дополнительное средство для устройств 1403 — универсаль- ный набор символов (UCS) — позволяет иметь до 240 различных символов. Скорость печати зависит от того, сколько раз символ повторяется на цепи. Скорость печати в строках в минуту равна 60000 а (—-ь) +с где для устройства 1403—2 а = 1.665, b = 1, с = 21.7, а для устройств 1403—N1 и 1403—3 а = 0.729, Ь = 3, с = 21.2. В любом случае максимальная скорость печати для устройства 1403—2 равна 1285 строкам в минуту, а для устройств 1403—N1 и 1403—3 равна 1400 строкам в минуту. Обычно специальная аппаратура UCS используется для получения такого набо- ра, в котором наиболее часто употребляемые символы (буквы, точка, цифры и т. д.) повторяются чаще, чем реже используемые (вопросительный знак, точка с запятой и т. д.). Это обеспечивает высокую скорость печати для обычных документов и в то же время дает достаточно широкий набор различных символов для специальных работ. Некоторые функции управления протяжкой бумаги выпол- няются с помощью специальной перфоленты, которая называется
160 Гл, 6. Устройства ввода — вывода лентой управления кареткой. Это 12-дорожечная бумажная лента (см. рис. 6.16) такой же длины, что и формат, или бланк доку- мента, который предстоит печатать. На ленте перфорируются отверстия соответственно строкам печати формата. После пер- форации лента вставляется в механизм протяжки и устанавли- вается так, что первая строка формата соответствует начальной строке на ленте. Далее лента и формат будут двигаться одновре- менно. Обычно отверстие на дорожке 1 соответствует первой строке формата, отверстие на дорожке 12 — последней. Если Рис. 6.16. Лента управления кареткой. формат короткий, отверстия на ленте могут повторяться соот- ветственно формату 2, 3, 4 и более раз, так что один оборот ленты будет соответствовать заполнению нескольких форматов. Дорожка 9 часто используется для указания строки итоговых сумм и иногда применяется для задания последней строки фор- мата. Движение бумаги может задаваться с помощью команд кана- ла, причем команды могут задавать как только одно продвижение, так и печать с последующим продвижением. Вообще устройство работает быстрее, если движение бумаги происходит после печати строки, а не перед печатью. Команды для печатающего устройства имеют следующие коды: Запись и перевод строк 0 LLLL 001 Перевод строк 0 LLLL ОН где LLLL изменяется от 0000 до ООН (от 0 до 3 строк) Запись и прогон бумаги 1 CCCG .001 Прогон бумаги 1 CGCG ОН где CCCG изменяется от 0001 до 1100 (дорожки управляющей пер- фоленты от 1 до 12) Уточнить состояние 0 0000 100 Заметим, что команда «перевод 0 строк» есть NOP. Повторная печать одной и той же строки без продергивания бумаги делает строку более отчетливой, и это иногда используется для выделения заголовков.
6.7, Построчно печатающее устройство 161 Байт состояния устройства Бит 0—2 Не используются. 3 Занято. 4 Канал кончил. Все печатающие устройства используют буфер. Сигнал «Канал кончил» выдается после заполнения буфера. Как только буфер заполнен, начинается печать. 5 УВВ кончило. Выдается по завершении операции. 6 Ошибка в устройстве. Байт уточненного состояния содер- жит ненулевые биты. 7 Особый случай в устройстве. Возбуждается, когда в про- цессе перевода строк происходит переход через пробивку в дорожке 12. При прогоне бумаги этот сигнал не возбуж- дается. Сигнал выдается вместе с сигналом «УВВ кончило». Байт уточненного состояния Бит 0 Команда отвергнута. Недопустимыми являются команды пере- вода бумаги более чем на три строки или прогона бумаги при номере дорожки вне интервала 1 —12. 1 Требуется вмешательство. Этот бит возбужден а) при нажатии клавиши «Стоп», Ь) если открыт кожух устройства и т. п., с) при ошибке в формате, d) при ошибке синхронизации, е) если кончилась бумага. 2 Ошибка в выходной информационной шине. Этот сигнал выдается одновременно с сигналом «Канал кончил». 3 Ошибка в оборудовании. Для печатающих устройств обычно попытка повторить операцию приводит к успешному выпол- нению этой операции. 4 Не используется. 5 Ошибка в данных (только для устройства 1403 с аппаратурой UCS). В буфер печатающего устройства был передан символ, которого нет на цепи. 6 Не используется. 7 Дорожка 9. Подобен биту «Особый случай в устройстве» для дорожки 12. Заметим, что перевод строк при переходе бумаги через пробивку в дорожке 9 всегда возбуждает бит «Ошибка в устройстве» в байте состояния устройства. Н Зак. 15635
162 Гл. 6. Устройства ввода — вывода В UCS входит 240-символьный буфер, в который загружаются (с помощью команд, которые здесь не описаны) байты, соответ- ствующие каждому символу на цепи. Содержимое этого буфера должно изменяться при смене цепи. Арендная плата за допол- нительную цепь составляет 100 долларов в месяц, поэтому боль- шинство установок имеет только одну цепь. При наличии средств UCS две команды используются для управления битом 5 байта уточненного состояния. 73 Установить блокировку ошибки в данных. 7В Сбросить блокировку ошибки в данных. После выполнения команды 7В передача в печатающее устрой- ство символа, отличного от имеющихся в 240 символьном буфере, вызывает возбуждение бита 5 байта уточненного состояния, что в свою очередь приводит к возбуждению бита «Ошибка в устрой- стве» байта состояния устройства. Команда 73 блокирует воз- буждение бита 5. Если средства UCS не установлены, то печать недопустимых символов не вызывает сообщения об ошибках. Если же эти сред- ства установлены, то программист имеет право выбора. Если он не хочет иметь сообщения об ошибках в данных, нужно выпол- нить команду 73. На панели управления печатающего устройства находятся следующие индикаторные лампочки: Питание включено (исключая устройство 1403—2, 1403—3). На печатающее устройство подано питание. Готово. Печатающее устройство находится в состоянии «Готово». Кончилась бумага. До конца бумаги осталось около 4 дюймов. Нажимая каждый раз на клавишу «Старт», можно печатать еще по одной строке. Появление отверстия на дорожке 1 управляющей ленты блокирует дальнейшую печать. Ошибка печати. Для устройства с UCS эта лампочка включается, если возбужден бит 5 байта уточненного состояния. Для • остальных печатающих устройств она включается при сбое печатающих молоточков или при ошибке по четности. Воз- буждается бит 3 байта уточненного состояния. Лампочка выключается первой командой, отличной от команд «Уточнить состояние» или NOP. Сбой синхронизации. Включается при нарушении синхронизации в печатающем устройстве. Нажатие клавиши «Сброс ошибки» выключает эту лампочку.
6.7. Построчно печатающее устройство 163 Сбой в подаче бумаги. Бумага не подается соответствующим обра- зом. Для устройств 1403 эта лампочка также включается, когда нажимают клавишу «Стоп». Кроме того, на панели управления располагаются следующие клавиши. «Включение питания» (только у устройства 1443). Включает питание. «Выключение питания» (только у устройства 1443). Выключает питание. «Старт». Переводит печатающее устройство в состояние «Готово», если питание включено, печатающая головка подведена, кожух закрыт, бумага заправлена, нет условий для сигнализации об ошибке. «Стоп». Выводит печатающее устройство из состояния «Готово». В устройствах 1403 также включает лампочку «Сбой в подаче бумаги». «Сброс». Выключает все индикаторы ошибок. Для продолжения операции нужно нажать клавишу «Старт». «Стоп каретки». Прекращает подачу бумаги. «Перевод строки». Переводит бумагу на 1 строку. «Новая страница». Прогоняет бумагу, пока не встретится пробив- ка на дорожке 1 ленты управления кареткой. «Опустить кожух» (только для устройства 1403—N1). Опускает верхний кожух печатающего устройства. «Поднять кожух» (только для устройства 1403—N1). Поднимает верхний кожух печатающего устройства. Два других печатающих устройства (1445 и 1404) также исполь- зуются в IBM-360. Устройство 1445 аналогично, устройству 1443, но может печатать на бланках, имеющих магнитные пометки. Устройство 1404 может использоваться подобно устройству 1403—2, кроме того, оно может читать и надпечатывать карты. Упражнения № 13 1. Дано: все биты ячеек 002000—002100 нулевые, а перфо- карты в колоде содержат в колонках 1—5 следующее: первая перфокарта ABCDE вторая перфокарта 6/3=2 третья перфокарта !!♦
164 Гл. 6. Устройства ввода — вывода Что будет находиться в ячейках 002000—03 и 002050—53 в момент прерывания, вызванного программой канала 02 002000 40 000052 02 002052 00 000050 а) для устройства чтения перфокарт 2501, Ь) для устройства чтения перфокарт 2501 с режимом 2 (чтение образа карты), с) для устройства чтения — перфорации 1442—N2? 2. Если CSW было передано в память только после выдачи сигнала «УВВ кончило», то каково его содержимое для условий упр. 1? 3. То же, что и в упр. 1, но для программы 22 002000 40 000052 02 002052 00 000050 4. Условия упр. 2 для программы из упр. 3. 5. В условиях упр. 1 устройство выполнило следующую про- грамму канала: 04 002050 00 000001 Что будет в ячейке 002050? 6. То же, что и в упр. 1 для программы: 22 002000 40 000100 С2 002100 40 000050 Е2 002150 00 000050 при условии, что: а) программа относится к карточному устройству 2520 без режима 2, Ъ) программа относится к карточному устройству 2520 с режимом 2, с) программа относится к карточному устройству 1442—N1 с режимом 2. 7. То же, что в упр. 2, но для программы из упр. 6. 8. Написать супервизорную программу, начинающуюся в ячейке 000350, для тестирования пишущей машинки (адрес устройства 01F) и, если возможно, вывести на печать сообщение из 7 симво- лов, расположенное в памяти. Адрес сообщения хранится в реги- стре 14. Возвратить каретку в исходное положение перед печатью. 9. Фамилию и адрес нужно отпечатать в трех последователь- ных строках верхней части следующей страницы. Данные хра- нятся в ячейках 002000, 002064 и 0020С8, причем каждая строка имеет длину в 100 символов. Написать соответствующую про- грамму канала. После печати прогнать бумагу до отверстия в дорожке 2.
6.8. Лентопротяжные устройства 165 6.8. Лентопротяжные устройства Магнитная лента изготовляется путем нанесения ферромаг- нитного покрытия на основу из пластика. Лента для вычисли- тельных машин отличается от обычной магнитофонной ленты только размером и качеством. Большинство лент для вычисли- тельных машин имеет ширину 0.5 дюйма и длину 2400 футов. Скорость движения ленты под парой головок чтения — записи составляет от 18.75 до 112.50 дюймов в секунду. При записи новой информации на ленту первая головка (записывающая) осущест- вляет запись, а вторая (считывающая) читает только что запи- санную информацию. Если прочитанное не совпадает с тем, что должно быть записано, то выдается сигнал об ошибке. При чтении ранее записанной информации лента проходит под теми же голов- ками и читается ими обеими. Если результаты чтения различны, то выдается сигнал об ошибке. Большинство лентопротяжных устройств IBM-360 выполняет запись одновременно девятью парами головок, образуя, таким образом, девять информационных дорожек вдоль ленты. Девять одновременно записанных битов представляют один байт с кон- трольным битом четности. Эти девять битов называются кадром записи. Используются два метода магнитной записи. При записи без возврата к нулю (NRZ) импульсы, соответствующие нулям и единицам, располагаются на ленте без промежутков, при этом запись единиц представлена изменением состояния намагничи- вания, а запись нулей — отсутствием такого изменения. При фазовом потенциальном способе записи (РЕ) для бита, совпадаю- щего по значению с предыдущим, дважды меняется направление намагничивания; если бит отличается по значению от предыду- щего, направление намагничивания меняется только один раз. Фазовое кодирование дороже и требует ленты лучшего качества, но в этом случае намного быстрее и проще можно исправить большинство ошибок, возникающих из-за незначительных лен- точных дефектов. В IBM-360 при NRZ-кодировании на один дюйм помещается 800 кадров, а при фазовом кодировании — 1600 *). Износ и разрывы ленты приводят к разрушению магнитного покрытия, вызывая тем самым появление дефектных участков. Если на ленте немного дефектных участков, их можно пропу- скать и использовать оставшуюся часть ленты. Однако если их слишком много, лента бракуется. Иногда ошибки вызываются частичками пыли, прилипающими к поверхности. Физическое движение ленты часто приводит к тому, что пылинки отскакивают х) Если иметь^ в виду одну дорожку, то можно говорить о плотности 8«™си, измеряемой числом импульсов на дюйм; например 800 импульсов иа
166 Гл. 6. Устройства ввода — вывода и эта часть ленты вновь становится годной для использования. Ошибки такого рода называются случайными, и они обычны при работе с магнитной лентой. Лента может быть различной длины, однако наиболее рас- пространены ленты длиной в 2400 футов. Всю бобину целиком не записывают одной операцией (одна бобина содержит при- мерно 23 миллиона байтов при плотности 800 импульсов на дюйм), а предпочитают записывать много небольших блоков. Блоки разделяются межблочными промежутками (IBG), длина которых около 0.6 дюйма. Вычислительная машина воспринимает любой промежуток на ленте длиной не менее 0.6 дюйма как межблочный промежуток. Поэтому, когда обнаруживают на ленте дефектный участок, просто пропускают дополнительно 6 дюймов и пытаются повторить запись блока. Это приведет к тому, что длина IBG станет 6.6 дюйма, однако единственным следствием этого будет небольшое увеличение времени прохождения промежутка «юд головками. Размеры блоков в IBM-360 могут быть настолько большими, насколько это позволяет основная память. Минималь- ный размер блока составляет 18 байтов. На обратной стороне ленты в нескольких футах от начала наклеивается маленький кусочек алюминиевой фольги, отражаю- щей свет. Эта точка ленты называется точкой загрузки. Она является маркером начала ленты для чтения и записи. Никогда ничего не записывается на тех нескольких футах ленты, которые расположены между точкой загрузки и физическим началом ленты. Такой же кусочек фольги отмечает и конец ленты (EOT). Однако EOT помещается довольно далеко от физического конца ленты, так что несколько блоков могут быть записаны после того, как обнаружен маркер EOT. Обычно после заверше- ния записи последнего блока записывают еще специальный блок, который служит индикатором того, что больше на ленте дан- ных нет. Этот специальный блок называется маркой ленты (ТМ). Марка ленты представляет собой специальным образом закоди- рованный блок, который лентопротяжное устройство может отли- чить от блока данных. Для контроля правильности данных на ленте осуществляются три вида проверок. Проверка избыточности по горизонтали (LRG) состоит в проверке четности каждого байта. Проверка избыточности по вертикали (VRC) состоит в записи такого допол- нительного символа в конце каждого блока, чтобы каждая дорож- ка содержала нечетное число единиц. При чтении ленты символ VRG вычисляется вновь и сравнивается с символом на лентё. Символ VRC не посылается в канал. Третьей является проверка при помощи циклического кода (CRC). Она использует допол- нительный байт, вычисляемый при записи блока. Байт CRC
6.8. Лентопротяжные устройства 167 записывается перед байтом VRC. Основное назначение байта CRC состоит в том, чтобы помочь исправить одиночную ошибку, т. е. такую, когда весь блок считан правильно, кроме одного бита. При фазовом кодировании чтение ленты, которая содержит ошибку в одном бите, не вызывает затруднений. Ошибка обна- руживается немедленно, и контроллер ленты приступает к ее исправлению до того, как байт отсылается в память. При фазовом кодировании не используется байт CRC. При NRZ-кодировании ошибочный бит не может быть выявлен до тех пор, пока не будет достигнут конец блока. Когда установлено, какая дорожка содер- жит ошибку, информация о дорожке с ошибкой (TIE) пересы- лается в контроллер, лента возвращается назад, и блок считы- вается вновь. Во время повторного считывания контроллер использует контрольную дорожку для генерации правильного содержимого дефектной дорожки. Для предотвращения случайной записи на ленту, содержащую ценную информацию, используется кольцо защиты файла. Кольцо, Рис. 6.17. Бобина ленты и кольцо защиты файла. изображенное на рис. 6.17, вставляется в гнездо бобины с лентой. Если кольцо отсутствует, лентопротяжные механизмы не могут выполнять никакие команды записи и тем самым информация на ленте защищена. Над лентопротяжным механизмом находится панель управ- ления, подобная той, что изображена на рис. 6.18. На панели расположены следующие пять индикаторных лампочек:
168 Гл. 6. Устройства ввода — вывода 1. Выбрано (SELECT). Горит, когда это устройство выбрано. 2. Готово (READY). Горит, если лента заправлена в вакуумные колонки, дверца бобинного отсека закрыта, лента не перема- тывается и нажата клавиша «Старт». 3. Защита файла (FILE PROTECT). Горит, если бобина не имеет кольца защиты файла, или на лентопротяжном механизме нет бобины, или выполняется перемотка. 4. Индикация конца ленты (ТАРЕ INDICATE). Загорается, когда пройден маркер конца ленты (EOT). Гаснет, если устрой- ство выполняет команду «Перемотка», «Перемотка и разгрузка» Рис. 6.18. Панель управления устройства 2401. или команду с обратным движением. Лампочка выключается также при нажатии клавиши «Перемотка к началу». 5. СВ (отсутствует для устройства 2415). Отключился автомати- ческий выключатель. Вызвать обслуживающий персонал. Кроме того, на панели оператора находятся 4 клавиши: 1. «Стиартп» (START). Используется для приведения устройства в состояние «Готово». 2. «Разгрузка» (UNLOAD). Эта клавиша действует только тогда, когда выключена лампочка «Готово» и экран над головками чтения — записи находится на месте. С помощью этой кла- виши лента удаляется из вакуумных колонок. 3. «Перемотка к началу» (LOAD REWIND). Эта клавиша дей- ствует только тогда, когда выключена лампочка «Готово». Лента перематывается к точке загрузки и устанавливается в нормальное исходное положение. 4. «Сброс» (RESET). Приводит устройство в состояние «Не готово», выключает лампочки «Готово» и «Индикация конца ленты» и прекращает выполнение любой операции.
6.8. Лентопротяжные устройства 169 Рис. 6.19. Лентопротяжное устройство 2401. Полезно знать еще о двух вещах: 1. Освобождение бобины. При нажатии этой кнопки бобину можно вращать вручную, например для разматывания ленты во время установки новой бобины 2. Блокировка дверцы бобины. Блокировка вмонтирована в дверцу бобинного отсека и предотвращает работу лентопротяжного механизма, когда дверца открыта. На рис. 6.19 изображено лентопротяжное устройство 2401. На рис. 6.20 изображено лентопротяжное устройство 2415 (модель 1), имеющее два ленто- протяжных механизма. В обоих устройствах лента устанавливает- ся слева, пропускается под го- ловками чтения — записи и на- матывается на правую бобину. На рис. 6.21 изображен тракт ленты в устройстве 2415. Последовательность действий при снятии ленты заключается в следующем: 1. Если включена лампочка «Готово», нажмите клавишу «Сброс», чтобы выключить ее. 2. Нажмите клавишу «Перемот- ка к началу» (исключая устрой- ство 2415). 3. Если лента находится в точ- ке загрузки (в любом месте для устройства 2415), нажмите клави- шу «Разгрузка». 4. Откройте дверцу шкафа лен- топротяжного устройства. В уст- ройстве 2415 поднимите экран над головками чтения-записи. На дру- гих моделях это выполняется авто- матически. 5. Нажмите кнопку «Освобо- ждение бобины» и вручную вра- щайте левую бобину против часовой стрелки, пока вся лента не пере- летается на нее. Должно потребоваться всего несколько оборотов. 6. Откройте замок левой бобины, потянув его на себя. Сни- мите бобину, не нажимая на ее наружный край, так как можно повредить края ленты.
Рис. 6.21. Тракт ленты в устройстве 2415 модели 1—6. 1 — бобина файла; 2 — направляющие ролики вакуумной колонки; 3 — направляю- щая ленты; 4 — щелевой очиститель ленты; S — щеточный очиститель ленты; 6 —направление прямого движения; 7 —источник света; 8 —экран головок; 9 — головки чтения — записи — стирания; 10—направляющая ленты; 11—ведущий вал; 12—направляющий ролик вакуумной колонки; 13—вакуумная колонка; 14 — приемная бобина.
6.8. Лентопротяжные устройства 171 Установка новой ленты заключается в следующем: 1. Откройте замок левой бобины, установите бобину и закрой- те замок. 2. Нажмите кнопку «Освобождение бобины», чтобы отмотать около четырех футов ленты. 3. Заправьте ленту, как показано на рис. 6.21 для устройства 2415 или как показано на рис. 6.22 для других моделей. В устрой- стве 2415 должен быть поднят вручную экран над головками. Не заправляйте ленту в вакуумные колонки. 4. Намотайте несколько оборотов ленты на правую (приемную) бобину. Старайтесь не повредить ленту. 5. В устройстве 2415 опустите экран. 6. Закройте дверцу шкафа. 7. Нажмите клавишу «Перемотка к началу». Это вызовет заправ- ку ленты в вакуумные колонки и перемотку ее к точке загрузки. 8. Нажмите клавишу «Старт», чтобы привести устройство в состояние «Готово». Р и с. 6.22. Тракт ленты в устройстве 2401—2404 модели 2 и 3. 2 — ведущий вал; 3 — кнопка освобождения бобин; 4 — бобина файла: тормозной ролик; 6 — приемная бобина; 1 — блок головок чтения — записи.
172 Гл, 6, Устройства ввода — вывода 6.9. Функционирование лентопротяжных устройств Устройства, которые выполняют физическое перемещение ленты, называются лентопротяжными механизмами. Они рабо- тают под управлением ленточного контроллера (TGU), который может быть отдельным устройством или объединяется с ленто- протяжным механизмом. Единственное преимущество такого объе- динения заключается в экономии питания и т. п., что приводит к снижению затрат. На рис. 6.23 перечислены лентопротяжные устройства, используемые IBM-360. Лентопротяжные механизмы и контроллеры различаются спо- собностью читать ленту с плотностью записи 800 импульсов на дюйм в режиме NRZ или 1600 импульсов на дюйм в режиме РЕ. С помощью дополнительного оборудования как контроллеры, так и лентопротяжные механизмы, рассчитанные па режим 1600 РЕ, могут читать ленту или в режиме 800 NRZ, или в режиме 1600 РЕ с программный переключением режима. На устройства, рассчитанные на работу в режиме 800 NRZ, по желанию заказчика может устанавливаться семиканальная головка, читающая и запи- сывающая только семь дорожек для совместимости с лентами, которые использовались на старых вычислительных машинах. Мы не будем обсуждать семидорожечные ленты. Мы также не будем рассматривать лентопротяжку 7340 (гипертейп), которая использует ленты шириной в один дюйм с плотностью записи до 3022 импульсов на дюйм, обеспечивая скорость передачи 340 тысяч байтов в секунду при скорости движения ленты 112.5 дюйма в секунду. Применяются два типа контроллеров. Контроллеры 2415, 2403 и 2803 (устройства 2403 и 2415 включают контроллер и лен- топротяжный механизм) подсоединяются к одному каналу и допу- скают в каждый момент единственную операцию передачи данных. При выполнении этой операции другие устройства могут выпол- нять перемотку и т. п., но не могут выполнять чтение или запись. Контроллеры 2404 и 2804 подсоединяются к двум каналам и допу- скают выполнение двух операций передачи данных одновременно, однако одна из них должна быть чтением, а другая — записью. Если требуется одновременное выполнение двух операций чтения или двух операций записи, то нужно иметь два контроллера 2403 или 2803 и т. п. Контроллер 2804 дороже, чем 2803, но зна- чительно дешевле, чем два контроллера 2803. Лента движется со скоростью 18.75, 37.5, 75.0 или 112.5 дюйма в секунду. Скорость передачи данных часто измеряют частотой следования байтов в килогерцах (один килогерц — тысяча бай- тов в секунду).
Тип — модель Плотность (импульсов на дюйм) Контроллер Число лентопро- тяжных механиз- мов— скорость передачи данных 2401—1 800 1—30 кгц —2 ' 800 — 1—60 » —3 800 — 1—90 » —4 1600 — 1-60 > —5 1600 — 1-120 > —6 1600 — 1-180 > 2402-1 800 — 2—30 кгц —2 800 — 2—60 » —3 800 —, 2—90 » -4 1600 — 2—60 » -5 1600 — 2—120 » -6 1600 — 2-180 > 2403-1 800 чтение или запись 1—30 кгц —2 800 чтение или запись 1—60 » —3 800 чтение или запись 1—90 » —4 1600 чтение или запись 1—60 » -5 1600 чтение или запись 1-120 > -6 1600 чтение или запись 1-180 » 2404-1 800 'чтение и запись 1—30 кгц —2 800 чтение и запись 1-60 > —3 800 чтение и запись 1-90 » 2803-1 800 чтение или запись —2 1600 чтение или запись 2804-1 800 . чтение и записи —2 1600 чтение и запись 2415—1 800 чтение или запись 2—15 кгц —2 800 чтение или запись 4-15 » -3 800 чтение или запись 6—15 » -4 1600 чтение или запись 2—30 » —5 1600 чтение или запись 4-30 » -6 1600 чтение или запись 6-30 » Рис. 6.23. Лентопротяжные устройства J ВМ.
174 Гл, 6. Устройства ввода — вывода Независимо от типа все лентопротяжные устройства имеют одинаковое программное управление и возможности, кроме: 1. Различия в плотности записи (800 или 1600 импульсов на дюйм). 2. Отсутствия средств коррекции ошибок с помощью инфор- мации об ошибочной дорожке (TIE) в устройстве 2415 (режим 800 NRZ). Если даже два лентопротяжных механизма объединены в одном устройстве, каждое имеет свой собственный адрес. Контроллер адресуется при обращении к любому устройству, подсоединен- ному к нему. Используются следующие коды команд: 02 Чтение. Лента перемещается до следующего IBG. Данные передаются в канал. ОС Обратное чтение. Лента движется в обратном направлении до IBG. Данные передаются в канал. В основной памяти данные запоминаются в порядке уменьшения адресов, начиная с ячейки, адрес которой задан в CCW. 04 Уточнить состояние. Шесть байтов информации уточненного состояния передаются в канал. Байты уточненного состояния сбрасываются в начале каждой операции чтения или записи, а также в начале каждой операции управления, которая требует движения ленты. 01 Запись. Лента движется в прямом направлении. Запись происходит, пока канал посылает данные. По окончании передачи на ленте формируется IBG. Размер блока не должен быть“меныпе 18 байтов. 07 Перемотка (REW). Лента перематывается к началу, т. е. к точке загрузки. Как только начинается перемотка, вырабатывается сигнал «УВВ кончило»; Передачи данных не происходит. Эта операция выпол- няется устройством автономно без связи с контроллером. Когда перемотка заканчивается, вырабатывается второй сигнал «УВВ кончило». 0F Перемотка и разгрузка (RUN). То же, что и перемотка к началу; кроме того, лента разгру- жается.
6.9. Функционирование лентопротяжных устройств 175 17 Стереть участок (ERG). Это операция записи, по без передачи данных. Фактически осуществляется стирание участка длиной около 3.5 дюйма, в ре- зультате чего создается удлиненный IBG. Эта команда исполь- зуется для пропуска дефектных участков при записи на ленту. 1F Запись марки ленты (WTM). Записывается специальный короткий блок, называемый мар- кой ленты. Как и для любого другого блока, ему предшествует и за ним следует IBG. 27 Шаг назад на блок (BSB). Лента движется назад до следующего IBG. Данные передаются из устройства в TCU, но не передаются в канал. Таким образом, канал свободен для выполнения другой операции, но TCU занято, пока не будет достигнут IBG. 2Е Шаг назад на файл (BSF). Лента движется назад за следующую марку ленты. Если марка не будет найдена, лента остановится в точке загрузки. Лента останавливается так, чтобы последующее чтение приводило к чтению марки ленты. Канал освобождается в начале операции, но TGU занято до окончания движения ленты. 37 Шаг вперед на блок (FSB). То же, что и BSB, но лента движется вперед доследующего IBG. 3F Шаг вперед на файл (FSF). То же, что и BSF, но лента движется вперед за следующую марку ленты. Следующие три команды являются командами управления; при их выполнении не происходит движения ленты. СЗ Установить режим 1600 РЕ Для устройств, рассчитанных на запись с плотностью 1600 им- пульсов на дюйм, эта команда вызывает необходимую настройку. Для устройств, которые не могут выполнять чтение при плот- ности 1600 импульсов на дюйм, эта команда означает «нет опе- рации» (NOP). При чтении нет необходимости задавать специ- фикацию плотности, так как устройства, рассчитанные на режим 1600, допускают любую плотность записи на ленте. Попытка читать ленту с плотностью записи 1600 импульсов на дюйм
176 Гл. 6. Устройства ввода — вывода на устройстве, не приспособленным для этого, вызовет ошибку при прохождении первого же блока под считывающей головкой. СВ Установить режим 800 NRZ. Эта команда может быть выдана только для устройств, которые могут работать с обеими плотностями. Команды СЗ и СВ выполняются контроллером, а не самим устройством. Они вызывают настройку контроллера на работу в указанном режиме со всеми лентами, которые впоследствии окажутся в точке загрузки. Спецификация плотности исполь- зуется только для операции записи. Если лента не находится в точке загрузки, то команды установки режима не влияют на работу, пока лента не будет перемотана к началу. DB Запрос TIE. В режиме 1600 РЕ эта команда не может выполняться устройст- вом 2415, которое рассматривает ее как команду «Нет операции» (NOP). Устройства, отличные от 2415, работающие в режиме 800 NRZ, пересылают контроллеру байт 2 уточненного состояния, который применяется при исправлении ошибки. Байт состояния устройства Бит 0 Не используется. 1 Модификатор состояния. Если возбужден одновременно с би- том «Занято», то контроллер занят. 2 Контроллер кончил. Возбуждается в следующих случаях: а) в конце любой операции, при выполнении которой был выдан сигнал «Контроллер занят», б) в конце любой операции управления, при выполнении которой были обнаружены «Ошибка в устройстве» или «Особый случай в устройстве». 3 Занято. Если возбужден одновременно с модификатором состояния, то контроллер занят; если возбужден, а модифи- катор состояния нет — занято устройство. 4 Канал кончил. Для команд управления возбуждается сразу после поступления команды; для команд чтения и записи — в конце передачи данных. 5 УВВ кончило. Означает, что устройство завершило операцию. Сигнал «УВВ кончило» выдается также, когда устройство переходит из состояния «Не готово» в состояние «Готово». 6 Ошибка в устройстве. Возбуждается всякий раз, когда: а) возбужден любой бит байта 0 уточненного состояния;
6.9. Функционирование лентопротяжных устройств 177 Ь) возбужден бит 4 байта 1 уточненного состояния; с) контроллер завершил свою работу, начав выполнение команды «Перемотка и разгрузка». 7 Особый случай в устройстве. Возбуждается, если при выпол- нении команд «Запись», WTM или ERG пройден отражающий маркер конца ленты (EOT). Возбуждается также, если при выполнении команд Чтение, Обратное чтение, FSB или BSB обнаружена марка ленты. Бит «Особый случай в устройстве» при выполнении команд BSF или FSF не возбуждается. Для ленточных устройств предусмотрено шесть байтов уточ- ненного состояния. Байт О Бит О Команда отвергнута. Недопустимая команда, или команды «Запись», WTM или ERG выданы для защищенного файла (со снятым кольцом). 1 Требуется вмешательство. Бит 1 байта 1 равен 0. 2 Ошибка в выходной информационной шине. 3 Ошибка в оборудовании. Бит 7 байта 3 и биты 1, 5, 6 и 7 бай- та 4 не все равны 0. 4 Ошибка в данных. Биты 0—4 байта 4 не все равны 0. 5 Переполнение. Возможно при выполнении операций «Чтение», «Запись», «Обратное чтение». Передача данных прекращается. 6 Нулевое число слов. Возбуждается при выполнении записи, если операция прервана (например, с помощью НЮ) до того, как мог быть записан первый байт. Движения ленты не было. 7 Не используется. Байт 1 Бит 0 Помеха. При работе в режиме NRZ обнаружены сигналы помех в межблочном промежутке. При работе в режиме РЕ бит всегда равен 0. 1 Готово. Устройство находится в состоянии «Готово». 2 Если этот бит возбужден, а бит 1 сброшен, то лентопротяж- ного устройства нет. Если одновременно с этим битом бит 1 возбужден, но сброшен бит «Занято», то устройство находится в состоянии «Не готово». Если одновременно с этим битом возбуждены бит 1 и бит «Занято», то выполняется перемотка. 3 Головка установлена для работы с семидорожечной лентой. 12 Зак. 15635
178 Гл. 6. Устройства ввода — вывода 4 Лента находится в точке загрузки. 5 Лента находится в состоянии записи. Это означает, что послед- нее движение ленты относилось к командам Запись, ERG или WTM. 6 Лента защищена (снято кольцо защиты). 7 При работе в режиме NRZ не используется. При работе в режиме РЕ означает, что: а) лентопротяжное устройство несовместимо с установлен- ной на нем лентой. Возбуждается после выполнения пер- вой команды чтения для новой ленты; Ь) лентопротяжное устройство несовместимо с выданной командой записи; с) на устройстве не удалось установить режим 800 NRZ или вернуться к режиму 1600 РЕ. Байт 2 При работе в режиме РЕ: не используется. Для устройства 2415: биты 6 и 7 всегда возбуждены при ошибке в данных. Для всех устройств, кроме 2415, работающих в режиме NRZ: а) при наличии ошибки, если возбужден только один бит, то он указывает дорожку, на которой произошла ошибка. Если возбуждены биты 6 и 7, то ошибки произошли на не- сколькцх дорожках. Ь) при отсутствии ошибки возбуждаются по крайней мере биты 6 и 7. Байт 3 Бит 0—4 Указывают тип ошибки в данных для диагностических целей. 5 Для устройства установлен режим работы с плотностью 1600 импульсов на дюйм. 6 Лентопротяжное устройство находится в состоянии «Назад», т. е. последняя операция выполнялась при движении ленты в обратном направлении. Бит 7 байта 3 и байт 4 Содержат диагностическую информацию о неисправностях в оборудовании. Байт 5 Содержит все нули. Чтобы исправить ошибку с помощью байта CRC, нужно посту- пить следующим образом:
6.10. Память на дисках 2311 17$ 1. Выполнить команду «Уточнить состояние». Байт 2 содержит единственный бит, равный 1, если ошибка была только на одной дорожке; если ошибки произошли на нескольких дорожках, то исправление невозможно. 2. Выполнить шаг назад (или шаг вперед), чтобы установить ленту для повторного чтения того же самого блока. 3. Выполнить команду «Запрос TIE». 4. Повторить команду «Чтение» (или «Обратное чтение»). Пункт 2 должен следовать сразу за пунктом 1, так как иначе теряется информация об ошибке. Аналогично, пункт 4 должен следовать за пунктом 3. 6.10. Память на дисках 2311 Стоимость памяти большого объема на магнитных сердечниках очень высока, поэтому с экономической точки зрения желательно иметь вспомогательную память, пусть не столь быстродействую- щую и удобную, как память на сердечниках, но значительно более дешевую. В качестве такой вспомогательной памяти можно использовать магнитную ленту. Однако лента имеет два недостат- ка. Во-первых, если нужно обратиться к информации, находя- щейся на дальнем конце ленты, то требуется много времени для поиска этой информации; такая задержка значительна даже в том случае, когда используются быстродействующие лентопро- тяжные механизмы. Во-вторых, для малых вычислительных машин стоимость дополнительного лентопротяжного устройства срав- нительно высока. Термин «Запоминающее устройство с прямым доступом» (DASD) является общим для всех устройств, в которых время, необходимое для доступа к любой части информации, относи- тельно не зависит от места расположения этой информации. Этот термин обычно используется, чтобы противопоставить лен- топротяжные устройства таким устройствам, как дисковое устрой- ство 2311, наиболее распространенное DASD на сегодня. Подобно тому, как лентопротяжное устройство читает инфор- мацию, записанную на ленте, которую можно при желании заме- нить, так и дисковый механизм 2311 читает информацию, записан- ную на алюминиевых дисках, покрытых, как и магнитная лента, ферромагнитным слоем. Диски объединяются в пакеты. На рис. 6.24 изображен пакет дисков IBM-1316, установленный на устройстве 2311. Диаметр диска (очень похожего на патефон- ную пластинку) 14 дюймов. Диски в пакете расположены на рас- стоянии по вертикали около 1 дюйма друг от друга. Такой пакет весит около 10 фунтов. Специальный футляр предохраняет диски от повреждений при хранении и переноске. 12*
Гл, 6. Устройства ввода — вывода Каждый диск имеет две поверхности — верхнюю и нижнюю. Верхняя поверхность верхнего диска в пакете и нижняя поверх- ность нижнего диска не используются, так как они наиболее подвержены повреждениям. Работают с десятью дисковыми поверхностями, пронумерованными от 0 до 9. Нижняя поверх- ность верхнего диска — это нулевая поверхность, верхняя поверх- ность следующего диска — первая поверхность, его нижняя поверхность — вторая поверхность и т. д. Верхняя поверхность нижнего диска в пакете — это девятая поверхность. Каждая поверхность диска содержит 203 концентрически расположенные дорожки, на которые записывается информация. Рис. 6.24. Пакет дисков, установленный на устройстве 2311. Дорожки нумеруются от 0 у наружного края диска до 202 у его центра. На каждую дорожку помещаются 3625 байтов, емкость всего пакета — около 7.25 миллионов байтов. Физически дорожки представляют собой окружности на диске. Для указания начальной точки записи на дорожках на нижнем диске пакета есть отверстие, которое опознается при каждом полном обороте. Эта отметка, называемая маркером начала обо- рота, обеспечивает определение начала информации, записанной на дисках. Пакеты дисков могут сниматься и храниться для последую- щего использования подобно бобинам магнитных лент. Пакет дисков стоит 490 долларов (бобина ленты стоит около 40 долла- ров). Поэтому, если требуется хранить очень большое количество данных (например, в коммерческих применениях ЭВМ), то обычно
6.10. Память на дисках 2311 181 используется магнитная лента. Однако данные, к которым часто обращаются, а также часто используемые программы обычно хранят на дисках, что обеспечивает экономию времени. После того как пакет дисков установлен на валу дискового механизма, верхняя часть футляра снимается, и можно нажимать клавишу «Старт». На рис. 6.25 изображено устройство 2311. Когда пакет дисков достигает скорости вращения 2400 оборотов Рис. 6.25. Дисковый механизм IBM 2311. в минуту, специальные щетки очищают пакет от пыли, кото- рая может повлиять на качество записи. После этого устрой- ство 2311 готово к работе и на нем включается зеленая лампочка «Готово». Пять держателей головок, несущих по две головки чтения — записи каждый, вдвигаются между дисками так, что 10 головок располагаются друг над другом, образуя цилиндр. Понятие «цилиндр» важно для метода организации информации на диске. Если головки установлены на цилиндр 185, то можно читать любую из 10 дорожек этого цилиндра без перемещения головок. В среднем требуется 85 миллисекунд для перемещения головок с одного цилиндра на другой; таким образом, надлежа- щее размещение связанных между собой данных уменьшает количество перемещений головок и, тем самым, сокращает время доступа, или (как еще говорят) время поиска.
Ig2 Гл. 6. Устройства ввода — вывода Головки не касаются поверхности дисков, а плавают над ними на воздушной подушке, которая образуется при вращении дисков. Управление работой устройств 2311 осуществляется контрол- лером 2841. К контроллеру 2841 можно подсоединить до 16 устройств 2311, хотя фактически обычно подключают 4 устрой- ства. Основными операциями являются: «Установка», которая устанавливает головки на указанный цилиндр; «Поиск», которая сравнивает поле из основной памяти с полем на дорожке диска; «Чтение», «Запись» и «Управление». Если участок магнитной ленты становится непригодным для использования, он пропускается с помощью команды «Стереть участок». На диске такой пропуск невозможен. Поэтому, если дорожка становится дефектной, то информацию просто записы- вают на какую-либо другую дорожку. Обычным образом исполь- зуемая дорожка называется основной. Та дорожка, которая исполь- зуется в случае непригодности основной, называется запасной (или альтернативной). Обычно три последних цилиндра резер- вируются для таких запасных дорожек. Даже если испортилась только часть дорожки, как правило, лучше оставить неисполь- зованной всю дорожку, чем пытаться сохранить ее часть. Переключатель «Старт — Стоп» — это единственный переклю- чатель, используемый для управления устройством 2311. Кроме зе- леной лампочки «Готово», на устройстве также имеется красная лампочка «Сбой». Она включается в случае неисправности; для ремонта устройства необходимо вызвать обслуживающий персонал. 6.11. Организация данных в запоминающих устройствах с прямым доступом Можно представить себе диск как совокупность 203 полос магнитной ленты, каждая из которых имеет длину в несколько Рис. 6.26. Схема дорожки на диске. Адресный маркер дюймов. Такой подход, однако, еще не дает возможности эффек- тивно использовать свойства устройств описываемого типа. Он отражает лишь тот факт, что каждая дорожка рассматривается независимо от других и что в пределах одной дорожки можно располагать данные таким образом, чтобы наиболее полно исполь- зовалась имеющаяся емкость устройства. На рис. 6.26 схематически изображена дорожка. В начале каждой дорожки записывается собственный адрес. Этот адрес
6.11. Организация данных в устройствах с прямым доступом.183 содержит номер цилиндра и номер головки для этой дорожки и используется в целях контроля. Затем помещается запись — описатель дорожки Ro. Все стандартные программы фирмы IBM используют эту запись для хранения восьми байтов информации 0 1 2 3 4 5 6 Рис. 6.27. Поле собственного адреса. о дорожке, например насколько эта дорожка заполнена данными и т. д. Затем идет адресный Ларкер (AM). Это специальный символ, предшествующий всем записям, кроме Ro. Далее следует первая запись данных Rt. Потом — следующий адресный маркер и сле- дующая запись данных R2. Количество записей на дорожке зави- сит от дЛин записей; каждой записи предшествует адресный маркер. Так как хранение битов четности требует мцого дополнитель- ного места на диске, контроллер 2841 отбрасывает биты четности символов, поступающих из канала, и записывает 8-битовые байты без бита четности. Вместо них контроллер вычисляет два кон- трольных байта, называемых байтами циклической проверки, и записывает их в конце каждой записи. При чтении записи биты четности восстанавливаются, а байты циклической проверки вновь вычисляются и сравниваются с записанными. На рис. 6.27 изображено поле собственного адреса (НА). Биты 0—5 байта признаков — всегда нулевые. Бит 6 установлен равным 1, если дорожка дефектная, бит 7 установлен равным 1, только если она используется как запасная. Дхя записи собствен- ных адресов в новом пакете дисков используется обычно вспомо- гательная программа, поставляемая фирмой IBM. Заметим, что под номер цилиндра и номер головки, хранящихся в двоичном виде, обычно отводится по два байта. На устройстве 2311 диапазон адресов цилиндров 0000—О0СА; диапазон номеров головок 0000—
184 Гл. 6. Устройства, свода — вывода 0009. Два крайних правых байта — это байты циклической про- верки (СС). Отметим также, что длина поля собственного адреса всегда 5 байтов плюс 2 байта СС, т. е. всего 7 байтов. На рис. 6.28 изображена структура типичной записи Rri. На самом деле эта запись включает три записи: поле счетчика, поле ключа и поле данных. Поле счетчика содержит идентифици- рующую информацию и длину двух других полей. Поле ключа имеет длину от 00 до FF (в шестнадцатеричном виде) или от О до 255 байтов; длина 0 просто означает, что поля ключа нет. Говорят, что запись пишется без ключа или с ключом в зависи- мости от того, используется ли это поле. Поле данных имеет длину от 0000 до FFFF или от 0 до 65535 байтов. Если длина рав- на 0, то поля данных нет. Для устройства 2311 максимальная Рис. 6.28. Компоненты записи на DASD. длина поля данных определяется количеством места на дорожке, оставшегося после записи поля ключа и предыдущих записей. Обычно все записи должны оканчиваться на той же дорожке, на которой они начинаются. Устанавливаемые за дополнительную плату средства переполнения дорожки обеспечивают продолжение записи с одной дорожки на другую, но обязательно в пределах одного цилиндра. Кроме двух байтов циклической проверки, поле ключа и поле данных содержат только ту информацию, кото- рая записана туда программой. На рис. 6.29 изображена структура поля счетчика. В байте признаков бит 0 установлен равным 1 только у записей с четными номерами: Ro, R2 и т. д.; бит 1 равен 1 только у записи, пере- полняющей дорожку и продолжающейся на следующую. Биты 2—7 копируются из байта признаков собственного адреса. Байт признаков в поле счетчика никогда не считывается и не записы- вается программой; он создается при выполнении записи кон- троллером 2841 и используется при чтении самим контроллером. Подобно байтам проверки байт признаков никогда не пере- дается в основную память.
6.11. Организация данных в устройствах с прямым доступом 185 На исправной основной дорожке номера цилиндра и головки (в поле счетчика) должны быть теми же, что и в поле собствен- ного адреса. На исправной запасной дорожке номера цилиндра и головки в поле собственного адреса соответствуют данной дорожке, а номера цилиндра и головки в записях на такой дорож- ке совпадают с номерами цилиндра и головки той основной дорож- ки, из которой перенесены записи. На дефектной основной дорож- ке поле собственного адреса содержит адрес (т. е. номера цилиндра Запись Попе Ванных ключа Попе счетчика (СС) (НН) Цикличес- кая проверка (СС) запи- си (R) Длина банных (QL) При- _ зна- Цилиндр ки (F) Головка НомвР мим • илиипа 9ппн-1 клю- чи (KL) О 1 Адресный маркер v 0 1 2 3 4 5 6 7 8 9 10 , --------------------v-----------------------/ Попе счетчика Рис. 6.29. Поле счетчика. и головки) этой дорожки, в то время как у записей поле счетчика содержит адрес запасной дорожки, на которую перенесены записи. Запись Ro — описатель дорожки — физически отличается только тем, что ей не предшествует адресный маркер. Эта запись не имеет поля ключа. Поле данных состоит из 8 байтов и всегда содержит информацию о том, что записано на дорожке. Емкость дорожки, равная 3625 байтам, не включает запись Ro. Когда записи пишутся на диск, длина ключа (KL), равная 00г означает, что поле ключа писать не нужно; длина данных, равная 0000, означает, что поле данных писать не нужно. В действи- тельности записывается однобайтовая фиктивная запись. При чтении поле счетчика всегда считывается перед чтением полей ключа и данных. Запись с нулевой длиной поля данных’ опознается как «Конец файла» (EOF); такая запись обычно записывается в конце каждого набора данных. Поле адресного маркера содержит один байт, за которым сле- ДУ1юг ДВа байта циклической проверки. Между каждыми двумя соседними областями на диске остав- яются пустые промежутки. Размер промежутка между полем
186 Гл. В. Устройства ввода — вывода ключа и следующим за ним полем данных всегда имеет длину не менее 18 байтов; другие промежутки отличаются по длине в зависимости от длины предыдущей записи. Чтобы получить общее число байтов, которые могут разместиться на дорожке, нужно подсчитать число фактически занимаемых записью байтов по формуле 61 + 1.049 X DL для'записей без ключей, и по фор- муле 81 + 1.049(KL+ DL) для записей с ключами. Эти формулы верны для всех записей, кроме последних, которые не требуют промежутка после себя и поэтому занимают меньше места. Послед- няя запись занимает либо DL байтов, если ключа нет, либо 20 -j- + (KL + DL), если ключ есть. Такие промежутки характерны для устройства 2311 и большинства других DASD, но не для всех устройств с прямым доступом. Необходимость в промежутках определяется механическими трудностями в синхронизации вра- щения диска. При оценке места на дорожке нужно исходить из того, что запись EOF имеет длину поля данных, равную 1 байту. 6.12. Коды команд для DASD Программирование для DASD (в отличие от большинства других устройств) существенно опирается на использование механизма цепочек команд и команды TIC (Переход в канале). Как было указано в разд. 5.9, если устройство выдает одно- временно сигналы «Модификатор состояния» и «УВВ кончило» при завершении операции, то следующая CCW пропускается. Контроллер 2841 использует пять типов команд: «Установка» (Seek), «Поиск» (Search), «Чтение» (Read), «Запись» (Write), «Управление» (Control). Имеются следующие команды установки: 07 Установка (Seek) 0В Установка цилиндра (Seek Cylinder). 1В Установка головки (Seek Head). Команды установки передают из основной памяти шестибай- товое поле Байты 0 1 2 3 4 5 Ячейка Цилиндр Головка Байты 0 и 1 указывают номер ячейки магнитных карт или номер пакета для дисковых установок с несколькими пакетами. Для устройств с одним пакетом (таких, как 2311) эти байты долж-
6,12. Коды команд для DASD 187 ны быть равны 0. Байты 2 и 3 указывают номер цилиндра; для устройства 2311 байт 2 всегда равен 0, так как в пакете дисков всего 203 цилиндра. Байты 4 и 5 указывают номер головки, для устройства 2311 байт 4 должен быть равен 0, так как имеется только 10 головок. По команде «Установка» механизм перемеще- ния головок устанавливается на указанный цилиндр и выбирается указанная головка. Команда «Установка цилиндра» игнорирует байты 0 и 1. Для устройства 2311 эта команда идентична команде «Установка». Команда «Установка головки» игнорирует байты 0—3. Она не вызывает перемещения головки, а только выбирает определен- ную головку и, следовательно,, определенную дорожку. Если канал посылает более шести байтов, выдается сигнал «Неверная длина записи» и используются только первые 6 бай- тов. Если передано меньше 6 байтов, возбуждаются биты «Ошибка установки» и «Команда отвергнута» в байте уточненного состояния и операция не выполняется. Переданные шесть байтов должны задавать допустимый адрес (номер цилиндра и головки). Команды поиска сравнивают байты из основной памяти с бай- тами на диске. Эти команды таковы: 39 Поиск по собственному адресу на равно (Search НА EQ). Байты 1—4 поля собственного адреса сравниваются с данными из основной памяти. Байты признаков, длины ключа, длины дан- ных и проверочные не учитываются. Если из основной памяти передано более 4 байтов, используются только первые 4 байта; если передано меньше 4 байтов, в сравнении участвует только соответствующее число байтов на диске. Вместе с сигналом «УВВ кончило» выдается сигнал «Модификатор состояния», если при сравнении произошло совпадение. Выполнение операции «Поиск по собственному адресу на равно» начинается сразу после того, как опознан маркер начала оборота. Выполнение операции пре- кращается по окончании поля собственного адреса. 31 Поиск по идентификатору на равно (Search ID EQ). 51 Поиск по идентификатору на больше (ID HI). 71 Поиск по идентификатору на больше или равно (ID ЕН). Байты 1—5 поля счетчика сравниваются с данными из основ- ной памяти. Остальные байты поля счетчика (байт 0 и байты 6—10) не учитываются. Если передано более 5 байтов, то исполь- зуются только первые 5 байтов; если передано меньше 5 байтов, то в сравнении участвует только соответствующее число байтов
188 Гл, 6. Устройства ввода — вывода на диске. Вместе с сигналом «УВВ кончило» выдается сигнал «Модификатор состояния», если сравнение дало результат: «равно» (код 31) «больше» (код 51) (значение на диске больше значения в па- мяти), «больше или равно» (код 71). Объектом операции является поле счетчика, идущее за первым же встретившимся адресным маркером или маркером начала обо- рота. В последнем случае объектом операции будет запись Ro. Операция завершается по окончании исследуемого поля. 29 Поиск по ключу на равно (Search Key EQ). 49 Поиск по ключу на больше (Key HI). 69 Поиск по ключу на больше или равно (Key ЕН). Данные из основной памяти сравниваются с полем ключа на диске. Операция прекращается, если канал закончил передачу данных из основной памяти или исчерпано поле ключа. Вместе с сигналом «УВВ кончило» выдается сигнал «Модификатор состоя- ния», если сравнение дало «равно» (код 29), «больше» (код 49) или «больше или равно» (код 69). Сигнал «Модификатор состоя- ния» не выдается, если длина поля ключа равна нулю. Выпол- нение операции начинается с первого обнаруженного поля ключа; Ro не исследуется, если только данная команда не следует в цепоч- ке команд за командой «Поиск ID», причем поиск завершился успешно для записи Ro. Выполнение операции прекращается по окончании поля ключа. 2D Поиск по ключу и данным на равно. 4D Поиск по , ключу и данным на больше. 6D Поиск по ключу и данным на больше или равно. Эти три команды представляют собой часть специальных средств «Сканирование файла» и отсутствуют на большинстве устройств 2311. Перед выдачей команд сканирования в основной памяти подготавливается маска, содержащая единичные биты в байтах, которые не нужно сравнивать, и необходимые данные в остальных байтах. При нулевой длине ключа сравниваются только данные. В остальном сравнение выполняется так же, как в командах поиска по ключу. Особенность контроллера 2841 состоит в том, что если маркер начала оборота встречается дважды во время выполнения цепочки команд, не содержащей команд чтения или записи, то возбуждает-
6.12. Коды команд для DASD 189 ся бит «Запись не найдена» в байте уточненного состояния, вызы- вая сигнал «Ошибка в устройстве», прерывающий выполнение цепочки команд. Это вместе с командой TIC (Переход в канале) может быть использовано для поиска записи по заданному иден- тификатору, ключу или ключу и данным на целой дорожке. Например, для того чтобы прочитать запись R3 на цилиндре 18, дорожке 4 (т. е. дорожке, соответствующей головке 4), мы могли бы написать следующие команды: 002000 07 003000 40 000006 Установка 002008 31 003002 40 000005 Поиск по идентифика- тору на равно 002010 08 002008 00 000000 Переход в канале 002018 Команда чтения 003000—06 0000 0012 0004 03 ВВ СС НН R С помощью команды «Установка» выбирается соответствую- щая дорожка. Первое выполнение команды поиска произойдет для записи, следующей за первым встреченным адресным марке- ром или за маркером начала оборота. Если команда поиска завер- шается неудачно, следующая за ней команда «Переход в канале» вызывает повторное выполнение этой команды. Если в конце концов выполнение этой команды завершается успешно, команда «Переход в канале» пропускается, так как выдается сигнал «Моди- фикатор состояния»; если же такая запись не найдена после двух (самое большее) оборотов диска, то выполнение цепочки команд прерывается по сигналу «Ошибка в устройстве». Существуют команды поиска и чтения, выполнение которых начинается на' заданной дорожке и может продолжаться на последующих дорожках того же самого цилиндра вплоть до его конца. В таких многодорожечных (МТ) операциях поиска всякий раз при обнаружении маркера начала оборота осуще- ствляется переход на следующую дорожку. Если же пройден маркер начала оборота на последней дорожке цилиндра, воз- буждается бит «Конец цилиндра» в байте уточненного состояния, что в свою очередь порождает сигнал «Ошибка в устройстве» и прекращает безуспешный поиск. Многодорожечные операции имеют коды команд, аналогичные ранее приведенным командам чтения и поиска, но крайний левый бит в них равен 1: В9 МТ-поиск по собственному адресу на равно. В1 МТ-поиск по идентификатору на равно. D1 МТ-поиск по идентификатору на больше. F1 МТ-поиск по идентификатору на больше или равно.
190 Гл. 6. Устройства ввода — вывода А9 МТ-поиск по ключу на равно. С9 МТ-поиск по ключу на больше. Е9 МТ-поиск по ключу на больше или равно. Средства сканирования файла также используют команды’ AD МТ-поиск по ключу и данным на равно. CD МТ-поиск по ключу и данным на больше. ED МТ-поиск по ключу и данным на больше или равно. Для того чтобы найти запись на цилиндре 18, которая имеет ключ == F0F3F4F6, можно использовать такую цепочку команд: 002000 07 003000 40 000006 002008 39 003002 40 000004 002010 А9 003006 40 000004 002018 08 002010 00 000000 002020 Команда чтения 003000-05 0000 0012 0000 003006-09 F0F3F4F6 Установка Поиск по собственному адресу на равно МТ-поиск по ключу на равно Переход в канале Ключ Если записи хранятся с ключами, они обычно располагаются в порядке возрастания ключей, так что можно воспользоваться командой поиска по ключу на больше или равно. Если ключ оказался больше, то искомая запись отсутствует, поиск на дорож- ке может быть прекращен, и нет необходимости продолжать его на оставшейся части цилиндра. Команды чтения передают данные с диска в основную память. Хотя для них нет определенных требований по образованию цепо- чек, они обычно образуют цепочку с командой поиска. Сущест- вуют следующие команды чтения: 12 Чтение счетчика. 92 МТ-чтение счетчика. Байты 1—8 поля счетчика передаются в канал. Байт признаков и байты проверки не передаются. Читается первая запись, следующая за ближайшим адресным маркером. Запись Ro не может быть считана с помощью этой команды. 1Е Чтение счетчика, ключа и данных.
6.12, Коды команд для DASD 191 9Е МТ-чтение счетчика, ключа и данных. Восемь байтов поля счетчика, все поле ключа и поле данных передаются в канал. Читается первая запись, следующая за бли- жайшим адресным маркером. Запись Ro не может быть считана с помощью этой команды. Если при МТ-чтении опознан маркер начала оборота, то читается запись R< следующей дорожки. ОЕ Чтение ключа и данных. 8Е МТ-чтение ключа и данных. Поле ключа и поле данных передаются в канал. Если непосредственно перед этой командой читался счетчик, то чтение будет относиться к той же записи, в противном случае будет читаться ключ и данные после ближайшего обнаруженного^ поля счетчика. 06 Чтение данных. 86 МТ-чтение данных. Поле данных передается в канал. Если команда выдана в момент, когда считывающая головка находится в промежутке за полем счетчика или полем ключа, то читается та же запись; в противном случае читается первое поле данных, следующее за ближайшим полем ключа или полем счетчика. Если длина ключа равна 0, то команда «Чтение ключа и данных» эквива- лентна команде «Чтение данных». 16 Чтение Ro. 96 МТ-чтение Ro. Поля счетчика, ключа и данных записи Ro передаются в канал. Эта команда идентична команде «Чтение счетчика, ключа и данных», но относится к записи Ro- Если эта команда образует цепочку с командой «Чтение собственного адреса» или «Поиск по собственному адресу», то запись Ro читается немедленно. В противном случае Ro читается после обнаружения маркера начала оборота. 1А Чтение собственного адреса. 9А МТ-чтение собственного адреса. Пять байтов (включая байт признаков) собственного адреса передаются в канал. Операция начинает выполняться, когда обнаруживается маркер начала оборота, и прекращается при Достижении конца собственного адреса.
192 Гл. 6. Устройства ввода — вывода 02 Чтение начальной загрузки программы (IPL). Эта команда вызывает установку на цилиндр 0 и выбор дорож- ки 0. После этого запись Ri передается в канал. Обычно Ri пред- ставляет собой 24-байтовую запись и служит для выполнения начальной загрузки программы. При выполнении команд записи данные принимаются из кана- ла и образуют соответствующие записи на диске. Обычно, чтобы быть выполненными, команды должны образовывать определенные цепочки с другими .командами. Операции записи в многодо- рожечном режиме не допускаются. 19 Запись собственного адреса. Пять байтов записываются в поле собственного адреса. Если получено менее пяти байтов, контроллер 2841 дополняет поле нулями; если получено более пяти байтов, то остаток после записи пяти байтов игнорируется. Выполнение команды начинается, как только обнаружен маркер начала оборота. 15 Запись Ro. Записываются поля счетчика, ключа и данных для Ro. Восемь байтов записываются как поле счетчика, а длины ключа и данных берутся из полей длины ключа и длины данных в поле счетчика. Если из основной памяти передается недостаточное количество байтов, то контроллер 2841 дополняет поле нулями; если пере- дано больше байтов, чем нужно, то остаток игнорируется. Выпол- нение операции начинается после прохождения собственного адреса и заканчивается после образования записи Ro. Эта команда должна образовывать цепочку с командой «Запись собственного адреса» или с успешно выполненной командой поиска собствен- ного адреса; в противном случае возбуждается бит «Недопустимая последовательность команд» в байте уточненного состояния. 1D Запись счетчика, ключа и данных. Подобна команде «Запись Ro», но перед полем счетчика запи- сывается адресный маркер. Эта команда должна образовывать цепочку с командой «Запись Ro», другой такой же командой, или с успешно выполненной командой «Поиск по идентификатору на равно» или «Поиск по ключу на равно», при этом сравнение не должно быть обрезанным, т. е. должно распространяться на всю длину поля идентификатора или ключа. Между командой поиска и командой записи могут присутствовать команды «Чтение ключа и данных» или «Чтение данных».
6Л2. Коды команд для DASD 193 01 Запись специальная счетчика, ключа и данных. Эта команда подобна команде «Запись счетчика, ключа и дан- ных»; кроме того, она помещает 1 в первый бит байта признаков для работы со средствами переполнения записи. Эта команда входит в состав этих средств. 05 Запись данных. Записывается поле данных; поля счетчика и ключа не изме- няются. Поле длины данных в счетчике задает число записывае- мых байтов. Контроллер 2841 выдает нули, если требуется допол- нить поле данных. Эта команда должна образовывать цепочку с успешно выполненной командой «Поиск по идентификатору на равно» или «Поиск по ключу на равно», причем сравнение не должно быть обрезанным; в противном случае возбуждается бит «Недопустимая последовательность команд». 0D Запись ключа и данных. Эта команда подобна команде «Запись данных», но еще запи- сывается и поле ключа. Эта команда должна образовывать цепоч- ку с командой «Поиск по идентификатору на равно». Заметим, что счетчик, ключ и данные, участвующие в опера- ции, занимают смежные ячейки памяти как дри чтении, так и при записи. Средства переполнения записи позволяют продолжать запись на следующей дорожке, но только в пределах цилиндра. Если при выполнении команд чтения бит 1 байта признаков в поле счетчика установлен в 1, то по окончании чтения поля данных чтение авто- матически продолжается на следующей дорожке, начиная с записи Ri Команда-«Запись специальная счетчика, ключа и данных» должна использоваться только для последней записи на дорожке. Она применяется для записи каждого сегмента расположенной на нескольких дорожках записи, кроме последнего, для которого используется обычная команда «Запись счетчика, ключа и дан- ных». Отсутствие 1 в первом бите признаков означает, что данный сегмент последний в записи. Перечислим команды управления» И Стереть. Все записанное на остатке дорожки до маркера начала оборота стирается. Эта команда стирает все, включая адресные маркеры. Она обычно выдается после переполнения дорожки, т. е. когда пытались сделать запись, которая не уместилась на оставшемся свободном месте дорожки. Эта команда должна удовлетворять таким же требованиям в отношении формирования цепочек, что и команда «Запись счетчика, ключа и данных». 13 Зак. 15635
194 Гл, 6, Устройства ввода — вывода 03 Нет операции. При получении этой команды выдаются сигналы «Канал кон- чил» и «УВВ кончило». 1F Установить маску файла. Один байт пересылается в контроллер 2841. Этот байт не пере- дается устройству 2311. Биты этого байта используются контрол- лером 2841 для того, чтобы разрешить или запретить определен- ные типы команд. Биты 2, 5, 6 и 7 не используются. Биты 0 и 1 имеют следующее значение. 01 00 Разрешены все команды записи, кроме команд «Запись собственного адреса» и «Запись Ro». 01 Команды записи не разрешены. 10 Разрешены только команды «Запись данных» и «Запись ключа и данных». 11 Разрешены все команды записи. Биты 3—4 управляют командами установки. 34 00 Разрешены все команды установки. 01 Разрешены только команды «Установка цилиндра» и «Установка головки». 10 Разрешена только команда «Установка головки». 11 Команды установки не разрешены. Обычно эта команда является первой в последовательности команд. Если затем выдается неразрешенная команда, то возбу- ждается бит «Защита файла» в байте уточненного состояния. При записи возбуждается также бит «Команда отвергнута». В каждой цепочке допускается только одна команда «Установить маску файла», последующая такая команда возбуждает биты «Недопустимая последовательность команд» и «Команда отверг- нута». Маска файла сбрасывается в нуль по окончании каждой цепочки CCW. 13 Установка в начальное положение. Выполняется установка на цилиндр 0 и выбор головки 0, если только такая установка допускается маской файла.
6.13. Байты состояния и уточненного состояния для DASD 195 04 Уточнить состояние. Шесть байтов передаются в канал. Последние четыре из них содержат только диагностическую информацию. Добавление к контроллеру 2841 специального «Двухканаль- ного переключателя» позволяет подключать контроллер к двум каналам. Если требуется, эти каналы могут принадлежать разным вычислительным машинам. Команды В4 Зарезервировать устройство. 94 Освободить устройство. используются для резервирования контроллера 2841 определен- ным каналом. Если контроллер зарезервирован, то другой канал не может подключиться к этому контроллеру, пока первый канал не выдаст команду «Освободить устройство». 6.13. Байты состояния и уточненного состояния для DASD Байт состояния устройства Биты 0 Не используется. 1 Модификатор состояния. Возбуждается вместе с битом «Заня- то» для указания, что контроллер занят; возбуждается вместе с битом «УВВ кончило» для указания успешного завершения операции поиска. 2 Контроллер кончил. Этот бит возбуждается, если был выдан ответ о занятости контроллера. Заметим, что сигнал «Кон- -. троллер кончил» прекращает выполнение цепочки команд. 3 Занято. Если этот бит установлен равным 1, а бит 1 равным 0, то это говорит о занятости устройства 2311; если же бит 1 равен 0, то о занятости контроллера 2841. Все операции передачи данных и поисковые операции занимают контроллер, операции же установок, раз начавшись, контроллер не зани- мают. Поэтому возбуждение одного этого бита говорит о неза- вершенности операции установки. 4 Канал кончил. 5 УВВ кончило. Указывает на то, что механизм перемещения головок свободен. 3 Ошибка в устройстве. Возбуждается, если байты уточненного состояния 0 и 1 не являются нулевыми. 13*
196 Гл. 6. Устройства ввода — вывода 7 Особый случай в устройстве. Возбуждается при выполнении команд «Чтение Ro», «Чтение ключа и данных», «Чтение дан- ных», «Запись ключа и данных» или «Запись данных», если в поле счетчика обнаружена нулевая длина данных. Данные не пересылаются, но. если требуется, то пересылается поле ключа. Имеется шесть байтов уточненного состояния. Байт О Бит О Команда отвергнута: а) недопустимый код команды, Ь) недопустимая последовательность команд, с) недопустимый адрес в команде установки, d) команда записи противоречит маске файла. 1 Требуется вмешательство. Указанный файл не подключен к системе, не включен мотор, открыт кожух и т. д. 2 Ошибка в выходной информационной шине. Обнаружена ошибка по четности в данных или команде. 3 Ошибка оборудовании. Второй байт уточненного состояния ненулевой. 4 Ошибка в данных. Контроллером получены ошибочные данные из устройства 2311. 5 Переполнение. Может возникнуть при выполнении цепочки команд на любой команде или при передаче данных на коман- дах чтения и записи. При выполнении записи остаток записи заполняется нулями. При чтении остаток данных считывается в контроллер 2841, но не передается в основную память. 6 Дефектная дорожка. 7 Ошибка установки. Установка не была завершена, так как: а) было передано меньше шести байтов в качестве адреса установки, или Ь) адрес установки вне допустимых границ. В первом случае бит «Команда отвергнута» равен 0, а во вто- ром равен 1. Байт 1 Бит О Ошибка в области счетчика. Бит 4 байта 0 должен быть уста- новлен равным 1. Обнаружена ошибка в данных в области счет- чика. Заметим, что если этот бит сброшен, а бит «Ошибка
6ЛЗ. Байты состояния и уточненного состояния для DASD 197 в данных» возбужден, то ошибка произошла в поле ключа или в поле данных. 1 Переполнение дорожки. Во время выполнения команд «Запись Во» или «Запись счетчика, ключа и данных» маркер начала оборота обнаружен раньше, чем закончена запись. 2 Конец цилиндра. Конец цилиндра обнаружен раньше, чем завершена цепочка команд. 3 Недопустимая последовательность команд. Также возбуж- дается бит «Команда отвергнута». Две команды «Установить маску файла» в одной цепочке или недопустимая последова- тельность CCW. 4 Запись не найдена. Во время выполнения цепочки команд, не включающей команд чтения или записи данных, собствен- ного адреса или Ro, был дважды обнаружен маркер начала оборота. Этот бит также возбуждается вместе с битом 6 байта 1, если на дорожке нет данных. При выполнении операций в многодорожечном режиме этот бит никогда не возбуждается. 5 Защита файла. Команды установки или записи противоречат маске файла. Для команд записи в этом случае также воз- буждается бит «Команда отвергнута». 6 Потеря адресного маркера. Две следующие друг за другом .записи на дорожке имеют в адресном маркере одинаковый бит 0. Это означает, что на дорожке, возможно, пропала запись. Этот бит также возбуждается, если маркер начала оборота пройден дважды и за это время ни разу не встретился адрес- ный маркер. 7 Переход на следующую дорожку выполнен неверно. Этот бит используется средствами переполнения дорожки для ука- зания: а) вместе с битом 6 байта 0: о переходе на дефектную дорожку или с дефектной дорожки; Ь) вместе с битом 7 байта 0: о неправильном переходе на новую дорожку; возбуждается только при выполнении операций записи; с) вместе с битом 0 байта 0 и битом 5 байта 1: о переходе через границу области защищенного файла. Ошибка «Дефектная дорожка» (бит 6 байта 0) возникает, если запись переполнения продолжается на дефектную дорожку. Пре- рывание произойдет раньше, чем будет передан' первый байт Данных. При выполнении команд «Поиск собственного адреса», тение собственного адреса» или «Чтение Ro» в многодорожечном р жиме, переключение головки на дефектную дорожку вызывает
198 Гл. 6. Устройства ввода — вывода возбуждение этого бита, если предпринималась операция поиска, цтличная от поиска собственного адреса. Данные не передаются. Команды записи не возбуждают этот бит. Байты 2, 3, 4 и 5 Содержат диагностическую информацию, необходимую для ремонта оборудования. 6.14. Другие запоминающие устройства с прямым доступом Запоминающее устройство на дисках 2314 имеет девять диско- вых механизмов, любые восемь из которых могут быть одновре- менно подсоединены к машине. Это устройство имеет свой соб- ственный контроллер и выполняет те же команды, что и устрой- ство 2311. Устройство 2314 использует пакеты дисков 2316, имею- щие И дисков с двадцатью рабочими поверхностями. Каждая дорожка имеет емкость 7294 байта (не считая запись Ro). Если не учитывать различия в емкости, то устройство 2314 иден- тично устройству 2311. Запоминающее устройство на дисках 2302 (модель 3) содержит 25 дисков с пятьюдесятью поверхностями. Имеются 500 цилинд- ров, т. е. 500 дорожек на каждой дисковой поверхности. Один механизм перемещения головок обслуживает 250 внешних цилин- дров, второй — 250 внутренних. Диски устройства 2302 несъем- ные. Устройство 2302 подсоединяется к контроллеру 2841 и рас- сматривается при программировании как два отдельных устрой- ства, каждое из которых имеет свой механизм перемещения головок. Устройство 2302 (модель 4) содержит два дисковых меха- низма в одном устройстве и рассматривается при программиро- вании как два отдельных устройства 2302 модели 3. Емкость каждой дорожки — 4984 байта. Запоминающее устройство на магнитных картах 2321 исполь- зует ячейки для хранения магнитных карт и является более деше- вым, но менее быстродействующим устройством. Ячейка состоит из 20 подъячеек, каждая из которых содержит 10 магнитных карт. На каждой магнитной карте имеется 100 дорожек, которые логически разделены на 5 цилиндров по 20 дорожек в каждом. Команды установки выполняются устройством 2321 иначе, чем для дисков. Шестибайтовое поле адреса содержит: Байт 0 нули 1 0—9 ячейка 2 0—19 подъячейка 3 0—9 магнитная карта 4 0—5 цилиндр 5 0—19 головка
6,14. Другие запоминающие устройства с прямым доступом 199 Каждый байт представляет собой самостоятельное двоичное число. Для устройства 2321 команда «Установка цилиндра» использует только байты 4 и 5, а команда «Установка головки»— только байт 5. Байт 1 указывает на ячейку в устройстве. Имеется одна команда, специфичная для устройства 2321, а именно 17 Возвратить. Эта команда вызывает возвращение магнитной карты на место после ее использования, тем самым сокращая время обращения к следующей карте. Другие устройства воспринимают эту команду как «Нет операции». Емкость дорожки магнитной карты равна 2000 байтов. Мак- симальное время доступа составляет 600 миллисекунд, в то время как у устройства 2311 оно равно 145 миллисекундам. Запоминающее устройство на магнитном барабане 2303 под- соединяется к контроллеру 2841 и работает подобно дисковому устройству. Устройство 2303 не имеет механизма перемещения головок (положение всех головок фиксировано), поэтому среднее время доступа составляет 8.6 миллисекунды. Устройство 2303 рассматривается при программировании как устройство, имеющее один цилиндр 0 с 800 дорожками, емкость каждой из которых равна 4892 байтам. Обычно устройство 2303 используется для хранения программ общего назначения на больших моделях IBM-360. Барабан 2301 подсоединяется к контроллеру 2820. На каж- дой из его 200 дорожек можно записать 20483 байта. Достоинством устройства 2301 является очень высокая скорость передачи дан- ных — 1200000 байтов в секунду — и малое время доступа — в среднем 8.6 миллисекунды. Оно обычно используется на самых больших моделях системы 360 для хранения программ. Програм- мирование для устройства 2301 аналогично программированию для устройства 2311. Запоминающее устройство на дисках 2315 программно не сов- местимо с другими запоминающими устройствами с прямым досту- пом. Оно было создано в основном как системное резидентное устройство для вычислительных машин IBM-ИЗО и 1800, а также для модели 44 IBM-360. Под системным резидентным устройством мы понимаем устройство, предназначенное для хранения всех программ, которые обычно используются на данной установке, и в качестве временной памяти для данных. Устройство 2315 состоит из одного диска, который находится под защитным кожу- хом. Он может храниться подобно обычному пакету дисков. Информация с диска считывается двумя головками, каждая для своей стороны диска. На диске имеются 203 цилиндра, каждый состоит из двух дорожек — на верхней и нижней стороне диска.
200 Гл. 6. Устройства ввода — вывода Каждая дорожка разделена на 8 секторов. Каждый сектор имеет фиксированную длину в 340 байтов. Головки перемещаются одно- временно с помощью команды 0В Установка. Для управления диском передается один байт. 0н содержит адрес требуемого цилиндра (от 0 до 202). Канал не связан с устрой- ством во время перемещения головок. HSSS1010 Чтение данных. Читается дорожка Н, сектор SSS. Чтение начинается с адре- сованного сектора и продолжается до конца дорожки. Если SSS = ООО, то считываются все 8 X 340 = 2720 байтов дорожки. Задавая в поле счетчика CCW меньшее число байтов и используя признак SLI, можно прекратить выполнение команды раньше. HSSS1001 Запись. Запись начинается на дорожке Н, сектор SSS, и продолжается до конца дорожки. Если поле счетчика в CCW обращается в 0 преж- де, чем будет достигнут конец дорожки, оставшаяся часть сектора заполняется нулями, а остальные секторы не изменяются. 0000 0010 Чтение IPL. Вызывает начальную загрузку программы с дорожки 0, сектора 1. 0000 ООН Нет операции. 0000 0100 Уточнить состояние. Устройства 2315 взаимозаменяемы в вычислительных машинах IBM-360 и 1130—1800. Упражнения № 14 1. Составить программу канала, которая будет записывать 80-байтовую запись, находящуюся в основной памяти по адресу 003000, на ленту, установленную в точку загрузки. 2. Изменить упр. 1 так, чтобы сначала была автоматически выполнена перемотка, а затем на ленту помещалась запись и сле- дом за ней маркер ленты. 3. Составить программу супервизора, которая будет работать на IBM-360 с памятью в 8К, для записи собственных адресов в пакете дисков 2311. Считать, что все дорожки основные, воз- можность дефектных дорожек не учитывать.
6.14. Другие запоминающие устройства с прямым доступом 201 4. Составить программу канала для записи 80-байтовой записи, находящейся в основной памяти по адресу 003000, на цилиндр 0, дорожку 1 в качестве записи Rt. Предполагается, что собственные адреса и Ro уже имеются на дисках. 5. Изменить упр. 4 так, чтобы записать EOF (без поля ключа) в качестве R2 после Rb 6. Используя формулу емкости дорожки, приведенную в тексте, определить, какое количество записей (без поля ключа) будет располагаться на дорожке устройства 2311, если каждая запись имеет длину? а) 80, Ь) 200, с) 10 байтов. 7. Повторить упр. 6 для устройства 2302. 8. Повторить упр. 6 для устройства 2321. Также определить, сколько таких записей поместится в каждой из 10 ячеек. 9. Считать колоду перфокарт и записать каждую карту как 80-байтовую запись на диск. Первой записью на диске будет R4 на цилиндре 107, дорожке 0. Имеется не больше 2000 перфокарт. Записать EOF после последней перфокарты. 10. Изменить упр. 9 так, чтобы использовать содержимое колонок 2—7 в качестве поля ключа. Записи данных должны быть длиной 80 байтов и включать поле ключа. 11. Составить программу для поиска записей, образованных в упр. 10, и прочитать идентификатор записи с наименьшим клю- чом (рассматривая ключ как двоичное поле) в память с адреса 003000. 12. Изменить упр. 11 так, чтобы считать вместо идентификато- ра поле с ключом ALA360, если такая запись существует. Если она не существует, заполнить соответствующее поле в основной памяти нулями.
Глава 7 ДОПОЛНИТЕЛЬНЫЕ КОМАНДЫ 7.1. Числа с плавающей точкой Числа с плавающей точкой в IBM-360 представляются в сле- дующем формате: =F Характеристика Мантисса 0 1 8 31 или 63 Самый левый бит отводится под знак числа: 1 означает минус, О — плюс. Следующие 7 битов содержат характеристику. Осталь- ные биты слова или двойного слова содержат дробную часть, или мантиссу. Если мантисса задается 14 шестнадцатеричными циф- рами, то говорят, что число с плавающей точкой представлено с удвоенной точностью; если же мантисса задается 6 шестнадца- теричными цифрами, то число представлено с обычной точностью. Число, представленное в виде ±ccffffff, имеет значение ± .ffffff х X 10сс“64. Таким образом, мантисса, у которой десятичная точка фиксирована перед левым битом (позиция 8), умножается на 16 в степени характеристика минус 64. Представление в такой форме позволяет изображать числа, абсолютная величина которых больше 00100000 = .540 х 10~78 и меньше 7F FFFFFF FFFFFFFF = .724 х 107в. Приведем несколько примеров записи чисел Десятичное Двоичное С плавающей точкой 1 00000001 41 100000 10 0000000А 41 А0000О л 40 199999 9999999А .01 3F 28F5C2 8F5G28F6 0 . оооооооо 00 оооооо оооооооо 974 000003СЕ 43 3CE000 67 345 00010711 45 107110 66 371 00010343 45 103430 -67 345 FFFFF8FF С5 107110 2 147 483 647 7FFFFFFF 48 7FFFFFFF000000 .000 915 527 343 75 ЗЕ ЗСОООО —.000 915 527 343 75 BE 3C0000 67.345 42 435841 ЕВ841ЕВ8
7.2, Команды с плавающей точкой 203 Заметим, что отрицательные числа с плавающей точкой пред- ставляются не в виде дополнений. Числа, представленные с обыч- ной точностью, занимают меньше места в памяти, а числа с удвоен- ной точностью значительно увеличивают точность вычислений. В большинстве моделей IBM-360 арифметические операции над числами, представленными с обычной точностью, выполняются несколько быстрее операций с удвоенной точностью. Когда значение мантиссы лежит между 1/16 и 1, мы говорим, что число нормализовано, В IBM-360 числа с плавающей точкой могут быть не нормализованы, однако результат операции над ненормализованными числами может содержать меньше знача- щих цифр. 7.2. Команды с плавающей точкой Команды с плавающей точкой имеют два формата: RR или RX. В каждом из этих форматов существует два типа команд: для операций с обычной точностью и для операций с удвоенной точностью. На малых моделях IBM-360 команды с плавающей точкой включаются за дополнительную плату, на больших они являются обязательными. В командах с плавающей точкой не используются 16 общих регистров. Они выполняются с использованием четырех регистров с плавающей точкой, каждый из которых занимает двойное слово. Эти регистры имеют номера 0, 2, 4 и 6 и вмещают числа с удвоен- ной точностью. 44 команды, которые рассматриваются в этом разделе, используют только эти специальные регистры, все осталь- ные команды IBM-360 с регистрами в качестве операндов исполь- зуют общие регистры. Команды с плавающей точкой Формат RR RX Точность Удвоенная Обычная Удвоенная Обычная Загрузка 28 LDR 38 LER 68 LD 78 LE *Сравнение 29 CDR 39 CER 69 CD 79 СЕ *Сложение N 2А ADR ЗА AER 6А AD 7А АЕ * Вычитание N 2В SDR ЗВ SER 6В SD 7В SE Умножение 2С MDR ЗС MER 6С MD 7С ME Деление 2D DDR 3D DER 6D DD 7D DE * Сложение U 2Е AWR ЗЕ AUR 6Е AW 7Е AU * Вычитание U Запись в память 2F SWR 3F SUR 6F SW 60 STD 7F SU 70 STE * Загрузка положительная 20 LPDR 30 LPER Загрузка отрицательная *Загрузка и проверка Загрузка дополнения Пополам 21 LNDR 31 LNER 22 LTDR 32 LTER 23 LCDR 24 HDR 33 LCER 34 HER
204 Гл. 7, Дополнительные команды В этой таблице N означает, что результат операции будет нормализован, a U, что результат не будет нормализован. Коман- ды, ^помеченные символом ♦, устанавливают признак результата равным 0, 1 или 2 соответственно при нулевом, отрицательном или положительном результате. Эти команды во всем аналогичны обычным командам, с той разницей, что действия производятся над числами с плавающей точкой. Команды с удвоенной точностью на каждом этапе своих вычи- слений оперируют с 14 шестнадцатеричными цифрами. За счет отбрасывания значащих цифр в процессе вычисления точность результата может снижаться иногда до 12 значащих цифр и ниже. При вычислениях с обычной точностью содержимое правой половины регистров сохраняется неизменным. При выполнении операции вычисления ведутся с 8 шестнадцатеричными цифрами, к которым при необходимости справа добавляются нули. Резуль- тат выдается с 6 шестнадцатеричными цифрами. Загрузка Второй операнд помещается на место первого операнда. Сравнение Второй операнд вычитается из первого; результат вычитания не сохраняется, а используется для установки признака результа- та равным 0, если операнды равны; равным 1, если первый операнд больше; равным 2, если второй операнд больше. Заметим, что при сравнении чисел 45 067440 44 674400 е будет установлено их равенство, так как обе записи представляют одно и то же число. Сложение с нормализацией Второй операнд складывается с первым и сумма помещается на место первого операнда. Признак результата устанавливается равным 0, если сумма равна нулю, равным 1, если сумма меньше 0, равным 2, если сумма больше нуля, и равным 3, если произошло переполнение. Например, если мы сложим числа 44 674400 89654000 44 12809Е 79001000 с помощью команды АЕ, результатом будет число 44 79С49Е 89654000, так как правая половина регистра не участвует в операции. Если же мы воспользуемся командой AD, то результатом будет число 44 79C49F 02655000.
4.2. Команды с плавающей точкой 205 Вычитание с нормализацией Второй операнд вычитается из первого и результат помещает- ся на место первого операнда. Умножение Два операнда перемножаются, и результат помещается на ме- сто первого операнда. Результат округляется в соответствии с тем, куда он помещается — в слово или в двойное слово. Деление Первый операнд делится на второй. Остаток теряется. Частное помещается на место первого операнда. Сложение без нормализации Вычитание без нормализации Все арифметические команды, кроме двух последних, всегда дают результат в нормализованном виде, даже если операнды были ненормализованы. При сложении или вычитании чисел с плавающей точкой прежде всего производится выравнивание характеристик, т. е. мантисса числа с меньшей характеристикой сдвигается вправо до тех пор, пока у обоих чисел не будут одинаковые характеристики. Например, при сложении чисел 44 674400 89654000 42 123001 11348997 мантисса второго числа должна быть сдвинута на 2 шестнадцате- ричные цифры вправо и результатом сложения будет 44 674400 89654000 44 001230 01113489 44 675630 8А767489 Теперь рассмотрим такой пример 44 674400 89654000 С4 5F0000 00001000 44 084400 89653000 В результате получается ненормализованное число. Кроме этих двух команд без нормализации, все остальные арифметические команды нормализуют результат операции, и в Данном примере получилось бы 43 844008 96530000 Запись в память Число из регистра переписывается в память.
206 Гл. 7. Дополнительные команды Загрузка положительная Абсолютная величина второго операнда помещается на место первого операнда. Признак результата устанавливается равным 0 или 2. Загрузка отрицательная Абсолютная величина второго операнда, взятая со знаком минус, помещается на место первого операнда. Признак резуль- тата устанавливается равным 0 или 1. Загрузка и проверка Совпадает с командой Загрузка, но устанавливается признак результата. Загрузка дополнения Второй операнд помещается на место первого операнда с про- тивоположным знаком. Признак результата устанавливается рав- ным 0, 1 или 2. Пополам Это особая команда с плавающей точкой. Второй операнд де- лится пополам и помещается на место первого операнда. Если вто- рой операнд имел, нулевую мантиссу, то результат будет нулевым. Приводимая ниже программа прибавляет число, находящееся в памяти по адресу 003800, к числу, находящемуся по адресу 003804, и помещает результат по адресу 003808. Предполагается, что Общий регистр 3 содержит 00 003800: 003800 003804 003808 44 124889 СЗ F17333 78 111111 Команды: 003810 LE 78 2 03 000 003814 АЕ 7А 2 03 004 003818 STE 70 2 03 008 Результат по адресу 003808: 43 33155D Результат в регистре с плавающей точкой 2: 43 33155D Поскольку правая половина регистра в этих командах не ис- пользуется, ее содержимое не изменится. Упражнения № 15 1. Дано: Общий регистр 11 00002000 Регистр с плавающей точкой 4 Регистр с плавающей точкой 6 002000-07 BE 827146 01234567 41 400000 00000000 44 100000 40100000
7.2. Команды с плавающей точкой 207 Определить содержимое регистра с плавающей точкой 6 после выполнения команд: (a) AD 6A 6B 0 000 (b) SD 6B 6B 0 000 (с). MD 6C 6B 0 000 (d) DDR 2D 64 (е) ADR 2A 66 (f) SER 3B 44 LDR 28 64 (g) HDR 24 64 (h) DDR 2D 66 HDR 24 66 (i) AU 7E 4B 0 004 LDR 28 64 (j) ae 7A 4B 0 004 LDR 28 64 2. Используя данные упр. 1, написать одну или две команды^ которые поместят в регистр с плавающей точкой 6 следующую информацию: (a) 00 000000 00000000 (b) 42 100000 00000000' (c) BE 827146 00000000 (d) Cl 800000 00000000 (e) 42 200000 00000000 (f) BF 104E28 C02468AC (g) 41 400827 14601234 (h) 40 FF7D8E B9FEDCC0 3. Написать программу считывания с перфокарт коэффициен- тов А, В и С уравнения Ах2 + Вх + С = 0 и выдачи на перфо- рацию значений А, В, С, и R2, где Rf и R2 — корни урав- нения. Предполагается, что Rf и R2 — вещественные числа. Пусть все числа занимают на перфокарте по 16 колонок и пред- ставлены в шестнадцатеричной форме с плавающей точкой. 4. Написать программу вычисления ех=1+х+1г+1г+--- Значение х задано в регистре с плавающей точкой 0; ех должно' быть помещено в левой половине регистра 0. Последней командой в программе должна быть команда BCR FE, т. е. безусловный переход по адресу, который содержится в регистре 14.
208 Гл. 7. Дополнительные команды 5. Изменить программу упр. 4 так, чтобы она вычисляла ех непосредственно по указанной формуле для х < 0, а для х > 0 1 вычисляла сначала е“х, а затем ех = —. е“х 7.3. Команды, выполняющие действия над полусловами Обычные команды с фиксированной точкой производят опера- ции над словами. Ради экономии памяти желательно хранить короткие константы в виде полуслов. Имеется шесть команд типа RX, выполняющих действия над полусловами. 40 48 49 4А 4В 4С STH — Запись в память полуслова LH — Загрузка полуслова СН — Сравнение полуслов АН — Сложение полуслова SH — Вычитание полуслова МН — Умножение полуслова Эти команды выполняются совершенно аналогично обычным командам ST, L, С, А и S. Полуслово расширяется до полного слова распространением самого левого бита (знакового) на 16 старших битов, а затем выполнение операции происходит так же, как если бы данные в памяти с самого начала занимали полное слово. Команда МН несколько отличается от обычной команды М. В команде МН содержимое полуслова из памяти (второй операнд) умножается на содержимое регистра (первый операнд), и резуль- тат операции помещается на место первого операнда. В этой операции принимает участие только один регистр, в то время как при выполнении команды М участвуют два. Сохраняются только 32 младших бита полученного произведения и переполнение не регистрируется. Рассмотрим следующий пример: До выполнения команды: 008300—07 FFFD 0002 9999 9999 регистр 3 00 008300 Команда Содержимое регистра 4 после выполнения команды LH 48 4 03 000 МН 4С 4 03 002 ST 50 4 03 004 SH 4В 4 03 006 FFFF FFFD FFFF FFFA FFFF FFFA 0000 0000
7.4. Команды формата RS 209 7.4. Команды формата KS В IBM-360 имеется несколько команд, для выполнения кото- рых требуется три адреса. Для этих команд предусмотрен фор- мат RS: Байт 0 1 2 3 ОР R, Из в2 d2 Этот формат напоминает формат RX за тем исключением, что адрес второго операнда не может индексироваться и вместо индек- са задается третий операнд — содержимое одного из общих регистров. Позже мы встретимся с несколькими командами формата RS. Здесь же давайте познакомимся только с двумя из них: 90 STM Запись в память групповая. Содержимое общих регистров R1? R4 + 1, . . ., R3 записы- вается в последовательные ячейки памяти, начиная с ячейки, заданной исполнительным адресом Е2 = (В2) + D2. Если Rj больше R3, то происходит циклическая адресация, т. е. за реги- стром с адресом 15 следует регистр с адресом 0, затем регистр с адресом 1 и т. д. При помощи этой команды можно записан в память содержимое любого числа регистров — от 1 до 16 Например, команда 90 DC 0400 помещает содержимое регистра 13 в ячейки 000400—03, регистра 14 в 000404-07, регистра 15 в 000408—0В, регистра 0 в 00040С—0F,... • регистра 12 в 043С—3F. 98 LM Загрузка групповая Команда LM противоположна команде STM. В общие регистры Ri, Ri 4-1, . . Кз помещается содержимое ячеек памяти, начиная с ячейки, определяемой адпесом второго операнда (Е2). Так, йо команде 98 CD 0500 в регистр 12 помещается содержимое ячеек 000500—03 и в регистр 13 содержимое ячеек 000504—07. 14 Зак 15635
210 Гл. 7. Дополнительные команды 7.5. Команды формата SI Команды формата SI имеют следующую структуру: Байты 0 1 2 3 ОР 12 Bi D, В командах формата SI, как и в командах формата SS, первый операнд есть содержимое ячейки памяти. Второй операнд не являет- ся содержимым ячейки памяти или регистра, а является частью самой команды. 12 называют непосредственным адресом. Поле 12 определяет один байт данных, участвующий в операции. Для иллюстрации рассмотрим команду 92 MVI Пересылка непосредственная. Байт данных 12 записывается в память по адресу Ei = Di + + (Bi). Например, команда 92 FF 0 509 заменит предыдущее содер- жимое ячейки 000509 числом FF. С помощью этой команды в память записывается только один символ. Другой командой формата SI является команда 91 ТМ Проверить по маске. Команда ТМ сопоставляет маску 12 и байт памяти, определяе- мый адресом первого операнда, и устанавливает признак резуль- тата. Если каждому биту в 12, равному 1, соответствует бит, рав- ный 0 в байте памяти, признак результата устанавливается рав- ным 0; если каждому биту в 12, равному 1, соответствует бит, равный 1 в байте памяти, то признак результата устанавливается равным 3; во всех остальных случаях признак результата уста- навливается равным 1. Если 12 = 00, то признак результата устанавливается равным 0. Содержимое байта по адресу Ei этой командой не меняется. Рассмотрим несколько примеров: 12 Байт в памяти Результат 0000 1111 0001 0101 СС = 1 12 0000 1111 Байт в памяти 1100 0000 Результат СС = 0 12 0003 0000 Байт в памяти 1111 1111 Результат СС = 0
7.6. Логические команды 211 Четыре команды ввода — вывода SIO, НЮ, ТЮ, ТСН являют- ся командами формата SI. Однако в этих командах поле 12 игно- рируется. 7.6. Логические команды Следующие команды принадлежат к стандартному набору команд для IBM-360: RR RX SI SS И 14 NR 54 N 94 NI D4 NC Сравнение кодов 15 CLR 55 CL 95 CLI D5 CLC ИЛИ 16 OR 56 О 96 01 D6 ОС Исключающее ИЛИ 17 XR 57 X 97 XI D7 XC Заметим, что в формате SS поля обоих операндов имеют одина- ковую длину. И. Производится поразрядное логическое умножение операн- дов. Результат помещается на место первого операнда. Признак результата устанавливается равным 0, если в результате полу- чится нуль; в противном случае признак результата устанавли- вается равным 1. ИЛИ. Команда аналогична команде И, только производится пораз- рядное логическое сложение операндов. 14*
212 Гл, 7. Дополнительные команды Исключающее ИЛИ. Команда аналогична команде И, только производится пораз- рядное сложение по модулю два. Сравнение кодов. Два операнда, понимаемые как двоичные величины без знака, поразрядно сравниваются. Операция сравнения прекращается, как только встречаются несовпадающие разряды. Признак результата устанавливается равным 0, если операн- ды равны, равным 1, если первый операнд меньше второго, и рав- ным 2, если первый операнд больше второго. Эта команда полез- на при сравнении буквенно-цифровой информации. Рассмотрим примеры: До выполнения команды: 008600-03 7654 FFOO 008604-07 0001 1000 008608—0В 3580 0346 Регистр: 2 00 008600 Команда: LM 98 35 2000 Результат: Регистр 3 7654 FFOO Регистр 4 0001 1000 Регистр 5 3580 0346 Команда: NR 14 3 4 Результат: Регистр 3 0000 1000 СС = 1 Команда: CLR 15 45 Результат: СС = 1 Команда: I 96 06 2008 Результат: 008608 37 СС = 1 Команда: ХС D7 01200А 2000 Результат: 00860А—0В 7512 Команда: ХС D7 012000 2000 Результат: 00860А-0В 0000 Иногда полезно расписать шестнадцатеричные цифры в двоич- ном виде, чтобы наглядно представить действие логической команды. Заметим, что в последнем примере приведен простой способ очистки памяти. Упражнения № 16 1. Дано: 001800-3 0031 F721 Регистр 6 0000 0017 Регистр 11 0000 1800 СС = 3
7,6, Логические команды 213 • Определить содержимое регистра 6 и значение признака результата после выполнения команд: а) Ь) с) d) е) о g) h) j) к) 1) т) п) о) Р) q) LH 48 6В 0 000 LH 48 6В 0 002 АН 4А 6В 0 000 SH 4В 6В 0 002 МН 4С 6В 0 002 СН 49 6В 0 002 LM 98 66 В 000 ТМ 91 01 В 001 ТМ 91 F3 В 001 ТМ 91 64 В 001 NR 14 6В CLR 15 6В CLI 95 F0 В 001 CL 55 6В 0 000 OR 16 6В XR 17 6В ХС D7 01 В 002 В 000 (определить содержимое ячеек 001800 — 03) г) з) NC D4 00 В 002 В 003 ОС D6 00 В 002 В 0Q0 ХС D7 00 В 002 В 000 2. Используя данные упр. 1, определить содержимое ячеек 001800—03 после выполнения команды (a) STM 90 66 В 000 3. Написать программу поразрядной печати двоичного зна- чения символа по адресу 001800; например, если символ есть СЗ, необходимо отпечатать 11000011. 4. Изменить программу упр. 3 так, чтобы в середине двоич- ного значения символа печатался бит проверки на четность — символ Т, если этот бит равен 0, и символ F, если он равен 1. Например, для символа СЗ было бы отпечатано 1100Т0011. 5. Написать программу, которая считывает колонки 1—7 карты, содержащие восьмеричные числа, и печатает на одной стро- ке и восьмеричное-число, и его шестнадцатеричный эквивалент. Например, число 0Q14762 в шестнадцатеричном виде записывается так: 0019F2. 6. Преобразовать число в упр. 5 в десятичную форму и от- пгшсТать его ®ез знака> например, 0014762 будет отпечатано как
214 Гл. 7. Дополнительные команды 7.7. Команды переходов Мы уже рассматривали команду Условный переход, которая бывает двух форматов RX и RR. Теперь рассмотрим еще 6 команд переходов. 45 BAL Переход с возвратом (RX). 05 BALR Переход с возвратом (RR) Правые 32 бита PSW (содержащие код длины команды 1 для BALR и 2 для BAL, признак результата, маску программы и адрес команды, следующей за BAL или BALR) загружаются в общий регистр RP Если используется команда BAL, то происходит безусловный переход к команде, определяемой исполнительным адресом Е2 = D2 + (Х2) + (В2). Если используется команда BALR и R2 =/=0, происходит переход по адресу, определяемому правыми 24 битами в реги- стре R2. Если используется команда BALR и R2 = 0, переход не проис- ходит, и выбирается следующая по порядку команда. Команда BALR в таком виде применяется обычно для установки регистра базы. Команда BALR Rb0 загружает увеличенный на 2 адрес команды BALR в регистр Ri; затем выполняется следующая команда. Такая команда BALR обычно ставится в начале про- граммы, а все остальные адреса представляются с помощью сме- щения относительно базового адреса в регистре Rt. При такой адресации программа может перемещаться в памяти и при этом будет работать правильно. 46 ВСТ Переход по счетчику (RX). 06 BCTR Переход по счетчику (RR). Из содержимого регистра Ri автоматически вычитается 1. Если результат равен 0, выбирается следующая по порядку команда. Если результат не равен 0, происходит переход по адресу Е2 в случае команды ВСТ, и по адресу, который задается в реги- стре R2, в случае команды BCTR. Если в команде BCTR R2 = 0, переход не происходит. Таким образом, команда BCTR с R2 = 0 может быть использована для уменьшения счетчика без перехода. Команду Переход по счетчику удобно использовать в тех случаях, когда нужно повторить несколько раз один и тот же
7.7. Команды переходов 215 набор команд. Предположим, что требуется написать программу, которая складывает 20 чисел, Хь ...» Х20, расположенных в памяти, и помещает результат в регистр 3. Исходная информа- ция и программа могут быть расположены в памяти следующим образом: 008700-03 Xi 008704-07 Х2 00874C-4F Х,о 008800 BALR 05 60 008802 SR 1В 33 008804 L 58 20 6016 008808 LH 48 50 601А 00880С А 5А 34 2000 008810 SH 4В 20 601С 008814 ВСТ 46 50 600А 008818 00 00874С 00881С 0014 (=20) 00881Е 0004 Имеются две команды формата RS, с помощью которых облег- чается программирование циклов (так, в нашей программе коман- ды A, SH, BGT образуют цикл и выполняются несколько раз). 86 ВХН Переход индекс больше (RS). 87 BXLE Переход индекс меньше или равен (RS). Эти две команды выполняются следующим образом: 1. Содержимое регистров Ri и R3 складывается, и результат помещается в регистр Rb замещая предыдущее содержимое этого регистра. 2. Новое содержимое регистра Ri сравнивается с содержи- мым регистра R3 или R3 + 1 (выбирается регистр с нечетным номером). 3. Переход происходит, если (Rt) > (R3 или R3 + 1) в слу- чае команды ВХН, или, если (Ri) (R3 или R3 4- 1), в случае команды BXLE. Если R3 — регистр с нечетным номером, то при выполнении шагов 1 и 2 команды используют регистр R3; но обычно R3 являет- ся регистром с четным номером, так что команды используют три регистра Rb R3 и R3 + 1.
216 Гл, 7. Дополнительные команды G помощью этих команд можно упростить последний пример так: 008700-03 х, 00874С—4F Х20 008800 BALR 05 60 02 LM 98 25 600Е 06 А 5А 30 2000 0А BXLE 87 24 6004 008810 00008700 14 оооооооо 18 00000004 1G 0000874G Отметим также, что мы использовали команду LM для того, чтобы загрузить адрес числа Xi в регистр 2, начальное нулевое значение суммы в регистр 3, приращение, равное 4, в регистр 4. и адрес Х2о (константу сравнения) в регистр 5. 7.8. Команды сдвига Сдвиг — это операция смещения всех битов регистра на одну или несколько позиций вправо или влево. Сдвиг вправо на один бит эквивалентен делению содержимого на 2, а сдвиг влево на один бит эквивалентен умножению содержимого на 2. Команды сдвига все имеют формат RS: {/(од операции R1 В21 Рг Поле R3 не используется и может быть заполнено произвольной информацией. Команды сдвига: Код операции Направление Точность Тип 88 SRL вправо обычная логическая 89 SLL влево обычная логическая 8А SRA вправо обычная арифметическая 8В SLA влево обычная арифметическая 8С SRDL вправо удвоенная логическая 8D SLDL влево удвоенная логическая 8Е SRDA вправо удвоенная арифметическая 8F SLDA влево удвоенная арифметическая Точность. один общий В командах с обычной точностью используется регистр Ri, содержимое которого и сдвигается.
7.8. Команды сдвига 217 В командах с удвоенной точностью должен указываться регистр с четным номером. Сдвигается содержимое обоих регистров Rj и Ri + 1, причем содержимое этих регистров рассматрива- ется как одно число, знаковый бит которого находится в реги- стре RP Тип. В логических командах сдвига знаковый бит ничем не отличается от прочих, и поэтому перемещаются вправо или влево все 32 или 64 бита; освобождаемые позиции заполняются нулями. В арифметических командах сдвига перемещаются толь- ко 31 или 63 бита, т. е. данные, кроме знака. При сдвигах влево освобождаемые позиции заполняются нулями, а при сдвигах вправо освобождаемые позиции заполняются значением знакового бита, т. е. знаковый бит как бы «размножается». Признак результата. Арифметические команды сдвига уста- навливают признак результата равным 0, 1 или 2, если резуль- тат равен нулю, меньше нуля или больше нуля соответственно. Признак результата устанавливается равным 3, если при выпол- нении сдвига влево значение разряда, выдвигаемого на место знакового разряда (из позиции 1), отличается от значения послед- него. Логические команды сдвигов не устанавливают признак результата. Величина сдвига. Шесть самых правых битов исполнительно- го адреса Е2 = D2 + (В2) задают величину сдвига. Отметим, что в этих командах второй адрес воспринимается не как адрес памяти, а как число позиций, на которое должен быть произведен сдвиг. С помощью шести битов можно задать максимальную величину сдвига 63 и минимальную 0. Арифметический сдвиг на 0 позиций может быть использован для проверки знакового бита. Примеры: До выполнения команды: Регистр 1 Регистр 2 Регистр 3 ООН 2233 FF89 7658 А010 1023 Команда: Результат: SRL Регистр 1 88 10 0004 0001 1223 Команда: Результат: SRA Регистр 2 8А 20 0008 FFFF 8976 Команда: Результат: SLDL Регистр 2 8D 20 0001 FF12 ЕСВ1 Регистр 3 4020 2046
218 Гл* Дополнительные команды 7.9. Некоторые дополнительные команды В этом разделе будут рассмотрены несколько команд, не состав- ляющих единую группу. 41 LA Загрузка адреса (RX). Исполнительный адрес Е2 = D2 + (Х2) + (В2) помещается в общий регистр, определяемый RP Восемь старших битов в реги- стре Ri заполняются нулями. Заметим, что эта команда не вызы- вает обращение к памяти по адресу Е2, а только загружает сам адрес. Эта команда наиболее полезна для загрузки небольших констант в регистры. Например, команда LA 41 70 0034 загружает в регистр 7 число 0000 0034. 43 IC Прочитать символ (RX) Байт по адресу Е2 помещается на место самого правого байта регистра Rp Остальные байты в регистре Ri не изменяются. 42 STC Запись в память символа (RX). Самый правый байт из регистра Ri записывается'по адресу второго операнда. 04 SPM Установить маску программы (RR). Биты 2—7 регистра Ri замещают признак результата и маску программы в PSW. Адрес R2 игнорируется. Остальная часть PSW не изменяется. Биты 2—3 замещают признак результата; биты 4—7 — маску программы. Маска программы обсуждается в разд. 7 этой главы. Этой команде часто предшествуют команды BAL или BALR, которые запоминают предыдущее содержимое PSW в регистре. Затем для изменения нужных битов используют- ся команды И или ИЛИ. 0А SVC Обращение к супервизору (RR). Эта команда имеет особый формат: ОА It Регистры не участвуют в этой операции. Эта команда и толь- ко эта команда вызывает прерывание, которое называется обра- щением к супервизору. Байт Ij помещается в биты 24—31 старого PSW, а биты 16—23 заполняются нулями. Старое PSW затем помещается в ячейку 32, а из ячейки 96 выбирается новое PSW.
7.9. Некоторые дополнительные команды 219 Команда SVC является естественным способом обращения про- блемной программы к супервизору. Восемь битов в команде, помещаемые в старое PSW, представляют собой закодированное сообщение супервизору о виде обслуживания, которое требуется программе. 93 TS Проверить и установить (SI). Второй операнд (12) не используется в этой команде. Байт в памяти по адресу Ei используется для установки признака результата, а затем замещается байтом, все биты которого рав- ны!. Признак результата устанавливается равным 0 или ^зави- симости от значения левого бита в проверяемом байте (0 или 1 соответственно). Особенность этой команды заключается в том, что выборка байта для анализа и занесение всех единиц осуще- ствляются за один цикл обращения к памяти. Эта особенность является важной, если одна и та же память совместно используется двумя или более процессорами. Команда TS представляет удоб- ный способ одному процессору определить, что делает другой. Он может, например, определить, заполнил ли другой процессор некоторую ячейку памяти, не опасаясь, что попытка заполнения придется как раз на момент проверки. 1Е ALR Сложение кодов (RR). 5Е AL Сложение кодов (RX). 1F SLR Вычитание кодов (RR). 5F SL Вычитание кодов (RX). Эти четыре команды выполняются в точности так же, как и соответствующие им команды AR, A, SR, S; единственное отли- чие заключается в установке признака результата. Эти команды введены для облегчения программирования операций с удвоен- ной точностью над числами с фиксированной точкой. Признак результата устанавливается следующим образом: О Сумма равна нулю и перенос из знакового бита отсут- ствует. 1 Сумма не равна нулю и перенос из знакового бита отсутствует. 2 Сумма равна нулю и произошел перенос из знакового бита. 3 Сумма не равна нулю и произошел перенос из знако- вого бита. Для иллюстрации предположим, что в результате умножения получилось число двойной длины в регистрах 2 и 3. Требуется
2’20 Гл. 7. Дополнительные команды г сложить это произведение с подобным произведением, находя- щимся в регистрах 4 и 5. Допуская, что можно игнорировать возможность переполнения в регистре 4, прибавляем с помощью команды Сложение (AR) содержимое регистра 2 к содержимому регистра 4 и прибавляем с помощью команды Сложение кодов (ALR) содержимое регистра 3 к содержимому регистра 5. Если после выполнения последнего сложения признак результата равен 2 или 3, прибавляем 1 к содержимому регистра 4. Вычисле- ния с удвоенной точностью часто нужны при обработке стати- стических данных, где приходится накапливать сумму произве- дений или сумму квадратов многих чисел. 7.10. Привилегированные команды Команды, рассматриваемые в этом разделе, объединяет тот факт, что все они являются привилегированными. т. е. эти коман- ды CPU может выполнить только в режиме супервизор. Попытка выполнить эти команды в режиме задача вызовет программное прерывание. 82 LPSW Загрузка PSW (SI). Второй операнд (12) не используется. Двойное слово, опреде- ляемое адресом первого операнда, замещает PSW. Следующей будет выполняться команда, задаваемая новым PSW. 80 SSM Установить маску системы (SI) Второй операнд (1г) не используется. Байт, определяемый адресом первого операнда, замещает биты маски системы (биты 0—7) в PSW. С помощью этой команды программа-супервизор может замаскировать или размаскировать прерывания от ввода — вывода. 83 Диагностика (SI). Эта команда не имеет мнемонического кода. Она вызывает выполнение некоторых диагностических процедур на CPU, резуль- таты которых записываются в память, начиная с ячейки Д28. На модели 30 заполняются 12 байтов, на моделях с большими номе- рами—до 256 байтов. На каждой модели эта команда выпол- няется по-своему. Она используется при ремонте машины. 84 WRD Прямая запись (SI). 85 RDD Прямое чтение (SI). Эти две команды являются составной частью совокупности средств, называемых прямым управлением. Они дают возможность обеспечить обмен сигналами между IBM-360 и другими ЭВМ. Это осуществляется так: поле 12 команды подается в качеств:©
7.11. Средства защиты 221 синхроимпульсов длительностью от .5 до 1.0 мксек на 8 выход- ных сигнальных линий. Помимо этого команда WRD выбирает байт из памяти по адресу первого операнда и подает его в форме статических сигналов на другие 8 линий. Под статическими сиг- налами имеются в виду такие, которые сохраняются вплоть до следующей команды WRD. Что касается команды RDD, то она формирует байт из сигналов, получаемых с аналогичных 8 линий, и отправляет его в память по адресу первого операнда. Обычно выходные сигнальные линии с подаваемыми на них сигналами используются для того, чтобы вызвать внешнее прерывание в дру- гих машинах (IBM-360), а также для управления другими устрой- ствами. 7Л1. Средства защиты Машина IBM-360 конструировалась так, чтобы несколько несвязанных между собой программ могли одновременно нахо- диться в основной памяти. Чтобы предотвратить воздействия программ друг на друга, в машине предусмотрены средства защиты памяти, необязательные для моделей IBM-360 с малыми номерами и стандартные для моделей с большими мерами. Каждому блоку из 2048 байтов приписывается восьмибитовой ключ памяти. Биты 0—3 предназначены для защиты от записи, бит 4 для защиты от выборки, а биты — 5—7 всегда равны нулю. Имеются две команды для работы с ключами: 08 SSK Установить ключ памяти (RR). 09 ISK Прочитать ключ памяти (RR). Регистр R2 содержит адрес 2048-байтового блока памяти. Биты с 8 по 20 задают адрес. Биты 0—7 и 21—27 игнорируются. Биты 28—31 должны быть нулевыми. Регистр Ri в битах 24—31 содержит ключ памяти. Команда SSK игнорирует биты 0—23 и биты 29—31. Биты 24—27 помещаются в биты 0—3 ключа памя- ти. Если в машине предусмотрена защита от выборки, то бит 28 помещается в бит 4 ключа памяти, в противном случае бит 4 всегда нулевой. Биты 5—7 ключа устанавливаются равными нулю. Команда ISK помещает ключ памяти в правый байт реги- стра Rle Это дает возможность программе проверить ключ. В каждом PSW в битах 0—3 содержится ключ защиты. Если бит 4 ключа памяти равен нулю, то любая попытка программы изменить содержимое какого-либо байта в блоке основной памяти подчиняется следующим правилам защиты памяти. Если ключ в PSW соответствует ключу (биты 0—3 ключа памяти) для ячейки памяти, которая должна быть изменена, то это изменение разре- шается. В противном случае новый байт не будет записан и воз-
222 Гл. 7. Дополнительные команды никнет прерывание из-за нарушения защиты. Любая программа, однако, может прочитать любую ячейку памяти, независимо от того, совпадают ключи или нет. Если же бит выборки (бит 4) установлен в 1, то запрещена не только запись в память, но и выборка. Это означает, что блок памяти может быть защищен и от записи, и от выборки, или только от записи. Считается, что ключ защиты соответствует ключу памяти,, если ключи равны или если ключ защиты равен 0. Программе супервизору обычно присваивается нулевой ключ защиты, а все- области памяти, которые она использует, имеют нулевой ключ памяти и не защищены от выборки. Всем другим программам назначаются нецулевые ключи. Каждому блоку памяти ключ присваивается независимо от ключей памяти других блоков. Таким образом, программа может занимать несколько блоков, которые не обязательно должны быть размещены рядом. CAW тоже содержит ключ защиты. Он действует так же, как и ключ защиты в PSW. Если средства защиты не предусмотрены в машине, поля ключей во всех PSW и CAW должны быть нулевыми. • На модели IBM-67 используются также биты 5 и 6 ключа памяти. Бит 5 устанавливается равным 1 каждый раз, когда в этот блок записывается или из этого блока выбирается какой- либо байт. Бит 6 устанавливается равным 1 каждый раз, когда в этот блок записывается какой-либо байт. Это позволяет про- грамме с помощью команды ISK определить, изменилось ли содержимое этого блока и даже, было ли оно использовано. Упражнения № 17 1. Дано: Регистр 2 0000 0004 Регистр 3 0000 2024 Регистр 4 0000 2000 Регистр 5 FFFF FF13 Регистр 11 0000 1000 002000-03 0000 8132 04-07 0000 00F1 08—0В 0001 E012 0G-0F 0001 EF01 10-13 FFFF FFD7 14-17 0000 0103 18-1В FFFF F174 1C-1F 0000 0002 20-23 0000 0008 24—27 0000 0E00
7.11. Средства защиты 223 Определить содержимое команд: регистров 4 и 5 после выполнения а) 001000 SR A BXLE ST IB 55 5A 54 0000 87 50 42 B002 54 0028 Ь) 001000 AR 1A 55 BCTR 06 2B ST 50 53 0004 с) 001000 L 58 34 0008 L 58 54 000C MR IC 23 MR IC 45 SLR IF 53 BC 47 CB 0014 BCTR 06 40 001014 SR IB 42 Ф SRL 88 40 2000 е) SLL 89 50 2005 0 SRA 8A 50 0008 g) SLA 8B 40 0006 h) srdl 8C 40 0007 i) SLDL 8D 40 B016 j) SRDA 8E 40 0087 k) SLDA 8F 40 0020 1) LA 41 54 B175 m) IC 43 5B 0012 2. Используя данные упр. 002024—27 после выполнения 1, определить содержимое ячеек команд: a) STC 42 5B B025 b) TS 93 99 5025 c) L 58 54 0018 SRL 88 50 0002 STC 42 54 0016 AP FA 21 4024 4015 d) 001000 BALR 05 50 ST 50 54 0024 OI 96 30 4024 L 58 54 0024 SPM 04 50 3. Написать подпрограмму супервизора, которая при выпол- 0П9пИ К0Манды §VC будет загружать новое PSW из ячейки 002000 + 8 х j, где j — код прерывания.
224 Гл. 7. Дополнительные команды 4. Используя программу-монитор разд. 4.5) для ввода — вывода, написать программу, которая будет считывать колоду карт, содержащих Xi в колонках 1—5; Х2 в колонках 6—10, . . ., Xie в колонках 76—80, и будет печатать для каждой считанной карты S Xj и 3 X*. Использовать двоичную арифметику. Пред- полагается, что числа отперфорированы в десятичной форме, причем у отрицательных чисел в разряде единиц сделана пробивка в строке 11. 5. Написать программу, которая использовала бы программу упр. 4 для ввода информации и печатала бы таблицу Х-ов и Y-ob, где Y — представление значения X в форме с плавающей точ- кой, например X Y 12345 0.12345Е + 05 00138 0.13800Е + 03 00002 0.20000Е + 01 —00002 -0.20000Е + 01 00000 О.ОООООЕ + 00 Для каждой введенной карты должно быть выдано на печать 16 строк. 6. Изменить программу упр. 5 так, чтобы печатать также для каждой карты произведение 16 чисел, умноженное на 10“40. Предполагается, что произведение всегда находится в интервале от 1042 до 1038. 7.12. Программные прерывания При выполнении программы CPU постоянно следит за аварий- ными ситуациями. Некоторые события, как, например, несуще- ствующий адрес памяти, должны обязательно привести к пре- кращению выполнения команды; другие события, такие, как переполнение, могут быть проигнорированы или могут вызвать прерывание в зависимости от желания программиста. Возник- новение любого из описанных ниже пятнадцати событий может вызвать программное прерывание. Когда происходит программное прерывание, код прерывания заносится в старое PSW (биты 16— 31, которые определяют событие). Затем старое PSW записывается в ячейку 40 памяти, а новое PSW загружается из ячейки 104. Четыре события, которые приводят к программному преры- ванию, могут быть замаскированы с помощью соответствующих битов маски программы, которые устанавливаются в 0. Если события замаскированы, то эти прерывания не происходят. Ниже перечисляются 15 кодов прерывания, запоминаемых в PSW и характеризующих причину прерывания.
Программные прерывания 225 0001 Некорректность кода операции. Несуществующий код операции или отсутствующая на кон- кретной модели команда. 0002 Привилегированная операция. В режиме задача встретилась привилегированная операция. Операция не выполняется. 003 Некорректность команды Выполнить. Команда Выполнить ссылается на другую команду Выпол- нить (см. разд. 7.16). 0004 Нарушение защиты памяти. Ключ памяти ячейки, к которой обращаются, не соответ- ствует ключу защиты в PSW (см. разд. 7.11). Данные, обращение к которым вызвало нарушение, не выбираются из памяти или не записываются в нее. ILC (код длины команды) может быть равен 0. 0005 Неправильная адресация. Адрес считается неправильным, если какая-то часть указы- ваемых им данных, команды или управляющего слова выходит за пределы памяти данной конкретной модели IBM-360. Если это адрес данных, ILG может быть равен 0. Операция прекра- щается. При неправильном адресе команды операция не выпол- няется. 0006 Неправильная спецификация. Считается, что спецификация неправильная, если: 1. адрес команды не кратен двум; адрес полуслова не кратен двум; адрес слова — четырем; адрес двойного слова — восьми; 2. в командах, оперирующих с парой регистров (четный — нечетный), в поле Ri указан регистр с нечетным номером; 3. адрес используемого регистра с плавающей точкой не равен 0, 2, 4 или 6; 4. в операциях десятичной арифметики длина множителя или делителя превышает максимально допустимую (15 цифр и знак), или поле первого операнда не больше поля второго; 5. не все четыре младших бита адреса блока памяти, ука- занного в командах SSK или ISK, нулевые; 6. PSW с ненулевым ключом защиты загружается на машине, не оборудованной средствами защиты. Во всех случаях операция не выполняется. 15 Зак. 15635
226 Гл. 7. Дополнительные команды 0007 Неправильные данные. Это событие возникает, и выполнение команды прекращается, если: 1. в операциях десятичной арифметики, редактирования или преобразования в двоичную систему обнаружен недопустимый код цифры или знака; 2. в операциях десятичной арифметики неправильно перекры- ваются поля; 3. множимое в операциях десятичной арифметики не имеет по крайней мере L2 нулевых старших байта. 0008 Переполнение с фиксированной точкой. Если во время выполнения арифметических операций или операций сдвига с фиксированной точкой теряется старший бит, или происходит перенос из старшего бита целой части в знако- вый бит, то возникает переполнение. Команда завершается, причем информация, которая выходит за пределы регистра, теряется. Бит 36 в PSW маскирует это прерывание. Если этот бит равен 0, прерывание замаскировано; если этот бит равен 1, пре- рывание разрешено. 0009 Некорректность деления с фиксированной точкой. Это событие возникает, если при выполнении деления с фик- сированной точкой частное не умещается в регистре или резуль- тат команды CVB занимает более 31 бита. Деление не выпол- няется; команда CVB завершается, причем информация, которая выходит за пределы регистра, теряется. 000А Десятичное переполнение. Переполнение, которое возникло во время выполнения любой десятичной операции. Операция завершается, причем перепол- нение игнорируется. Бит 37 в PSW маскирует это прерывание. 000В Некорректность десятичного деления. Возникает, если частное не умещается в отведенное ему поле. Операция не выполняется. РООС Переполнение порядка. Результат операции с плавающей точкой имеет характеристи- ку, большую 127. Из характеристики вычитается 128 и опера- ция завершается. Переполнение порядка не влияет на установку признака результата, поскольку не меняет знака результата. 000D Исчезновение порядка. Результат операции с плавающей точкой имеет характеристи- ку, меньшую 0 (порядок меньше, чем —63). Если бит 38 в PSW
7,13- Другие типы прерываний 227 равен 0, операция завершается выдачей нулевого результата; если же бит 38 в PSW равен 1, то к характеристике прибавляется 128, операция завершается и происходит прерывание. 000Е Потеря значимости. Результат операции с плавающей точкой имеет нулевую мантиссу и ненулевую характеристику. Если бит 39 в PSW уста- новлен в 1, то выдается нулевой результат (характеристика равна 0); в противном случае характеристика сохраняется и про- исходит прерывание. Это прерывание не относится к командам Пополам (HDR и HER). 000F Некорректность деления с плавающей точкой. Делитель в операции деления с плавающей точкой имеет нулевую мантиссу. Операция не выполняется. Причина, по которой для четырех из пятнадцати перечислен- ных ситуаций прерывания предусмотрены маски, состоит в том, что в некоторых случаях эти прерывания можно предусмотреть и обработать без специального уведомления об их появлении. Обычно все разряды маски программы устанавливаются в 1 и управление передается подпрограмме обработки ошибок. 7.13. Другие типы прерываний Мы уже познакомились с программными прерываниями и пре- рываниями из-за ввода — вывода. Прерывание при обращении к супервизору просто помещает непосредственный байт из коман- ды SVC в биты 24—31 старого PSW, устанавливает биты 16—23 в 0 и запоминает старое PSW в ячейке 32, выбирая новое PSW из ячейки 88. Внешнее прерывание устанавливает биты 16—23 в 0 и засылает 1 в те биты (биты 24—31) байта PSW, которые соответствуют сигналам внешних прерываний. Бит Причина 24 Таймер 25 Прерывание с пульта 26 Внешний сигнал 2 27 Внешний сигнал 3 28 Внешний сигнал 4 29 Внешний сигнал 5 30 Внешний сигнал 6 31 Внешний сигнал 7 Если пришло несколько сигналов, все биты, соответствующие этим сигналам, устанавливаются в 1. Старое PSW записывается 15е
228 Гл,, 7. Дополнительные команды в ячейку 24, новое PSW выбирается из ячейки 88. Бит 7 в PSW — маска внешних прерываний. Если этот бит равен 1, прерывание разрешается; если равен 0, прерывание ждет обработки подобно прерыванию от ввода — вывода. Внешние сигналы 2—7 выдаются устройствами, внешними по отношению к вычислительной машине. Сигнал «прерывание с пульта» вызывается нажатием клавиши на пульте управления. В IBM-360 предусмотрено специальное средство, так называе- мый Таймер; на большинстве моделей он входит в комплект стандартного оборудования. Через каждую 1/300 секунды из бита 23 слова, находящегося по адресу 80, вычитается 1. Когда значе- ние таймера становится отрицательным, выдается сигнал преры- вания. Если в слове по адресу 80 были установлены все единицы, таймер будет работать 15.5 часов без прерывания. Содержимое ячейки 80 может быть изменено в любой момент записью в эту ячейку нового значения. Если CPU находится в состоянии стоп, таймер не продвигается. Стандартный метод отсчета времени заключается в том, что через каждую 1/60 секунды вычитается единица из бита 21 и едини- ца из бита 23. Поэтому биты 22—31 не следует считать значащими. Таймер с высокой разрешающей способностью, который может быть установлен по желанию заказчика на некоторых моделях, вычитает единицу из бита 31 через каждые 13 микросекунд. При частоте электросети 50 гц продвижение счетчика произво- дится иным образом, но так или иначе на всех моделях конеч- ный итог эквивалентен вычитанию единицы из бита 23 через каж- дую 1/300 секунды. 7.14. Команды перекодировки Для перекодировки информации из одного восьмибитового кода в другой предусмотрены команды. DC TR Перекодировать (SS). Адрес второго операнда определяет начальную ячейку 256- байтовой таблицы в основной памяти. Первый операнд имеет длину от 1 до 256 байтов. Каждый байт первого операнда, вос- принимаемый как восьмибитовое положительное двоичное целое число, добавляется к адресу таблицы Е2 = D2 + (В2) и байт, выбираемый из таблицы по этому адресу, замещает байт в первом операнде. Байты первого операнда выбираются последовательно, один за другим слева направо. Операция продолжается до тех пор, пока не кончится поле первого операнда. С помощью команды TR можно перейти от одного восьмиби- тового кода к другому.
7.14. Команды перекодировки 229 DT TRT Перекодировать и проверить (SS). Адрес второго операнда определяет 256-байтовую таблицу (как и в команде TR). Проверка выполняется последовательно, начиная с левого байта первого операнда. Таблица просматри- вается так же. как и в команде TR, но байт первого операнда не изменяется. Если байт, выбранный из таблицы, равен нулю, происходит выборка следующего байта первого операнда. Опера- ция продолжается до тех пор. пока из таблицы не будет выбран ненулевой байт. В этом случае адрес соответствующего байта первого операнда помещается в правые 24 бита общего регистра 1. Байт из таблицы помещается в правые 8 битов общего регистра 2. Левые 8 битов регистра 1 и левые 24 бита регистра 2 остаются без изменений. В результате выполнения операции устанавливается признак результата: СС = 0 операция завершилась, т. е. поле первого операнда кончилось, и все байты, выбранные из таблицы^ были нулевыми; СС = 1 обнаружен ненулевой байт в таблице до окон- чания поля первого операнда; СС = 2 последний байт, выбранный из таблицы, был ненулевым. Хотя при поверхностном взгляде команда TRT похожа на команду TR, области применения этих команд совершенно раз- личны. Команда TRT, например, может использоваться для про- смотра входных данных и выявления в них точек, запятых и т. д. Таким образом, информация, поступающая в вычислительную машину в свободном формате, может быть разбита на предложе- ния и т. д. Для примера, предположим, что число из одиннадцати цифр с десятичной точкой считано в память. Это могло быть одно из следующих чисел: 12345678.01 12.34567908 .1110003333 0000000011. Требуется переслать это 11-байтовое поле, расположенное в ячейках 008Е14—1Е, в 20-байтовое поле по адресу 008Е2А—3D, причем надо исключить явную запись десятичной точки, кото- рую считаем фиксированной после 10-й цифры от левой границы поля. То есть число 12345678.01 будет переписано в следующем виде: 00123456780100000000
230 Гл. 7. Дополнительные команды Распределим память следующим образом: 008Е00—13 008Е14-1Е 008E1F-29 008E2A-3D 008F00-FF нули (двадцать) X нули (одиннадцать) Y — преобразованный X Таблица, содержащая все нули, кроме байта по адресу 008F4B, который должен быть ненулевым (в EBCDIC код десятич- ной точки равен 4В). Регистр 1 Регистр 2 Регистр 3 Команды: 00000000 00000000 0000 8Е00 MVC D2 13 TRT DD 0А 302А 3000 Засылка нулей в Y. 3014 3100 Получение адреса десятичной MVC D2 09 точки в регистре 1. 1000 1001 Сдвиг дробной части X на один байт влево. LR 18 23 SR 1В 21 AR 1А 23 Получение в регистре 2 числа, равного содержимому регистра 3, умноженному на 2, минус содер- жимое регистра 1. MVC D2 09 2048 3014 Если бы мы хотели получить результат в упакованном форма- те, надо было бы воспользоваться командой РАСК. Отметим, что мы должны были вычислить адрес первого операнда послед- ней команды. Эти вычисления выполнялись в регистрах, и такие вычисления называют адресной арифметикой. 7.15. Редактирование Вообще говоря, число вида $ 12345.67 удобнее всего хранить в двоичной форме или в упакованной десятичной форме, а именно 12 34 56 7+, где десятичная точка не записывается явно, а под- разумевается. Когда же нужно напечатать информацию так, чтобы человек мог прочитать ее, необходимо вставить точки, запятые, знак доллара и т. д. Две команды облегчают выполнение преобразования упакованного десятичного числа в формат для печати: DE ЕР Отредактировать (SS). PF ЕРМК Отредактировать и отметить (SS).
7.15. Редактирование 231 Второй операнд является десятичным числом в упакованном формате. Длина, заданная в команде, относится к первому опе- ранду, который перед выполнением команды должен содержать поле шаблона. В шаблоне располагаются запятые, точки и т. д., т. е. символы, которые будут вставлены в результат. Кроме того, в нем используются три специальных кода: Шестнадцатеричный Название Обозначение код 20 Символ выбора цифры DS или d 21 Символы начала значимости SOS или 8 22 Символ разделения полей FS или f Символ разделения полей употребляется далеко не во всех опера- циях редактирования. Кроме того, первый байт в шаблоне является символом-запол- нителем. Предположим, что в памяти имеется упакованное десятичное поле 00 12 34 56 7 и требуется представить его в виде: ЬЬМ2,345.67bbb. Начнем с составления шаблона, который мог бы выглядеть так: b(cnMBon-3anonHHTenb)d,ddd,dds.ddbCR. Здесь Ь, как обычно, обозначает пробел, a CR — символ кредита, которым будут отмечены отрицательные числа. Команда Отредак- тировать выполняется следующим образом: 1. . Символ-заполнитель остается без изменений и запоми- нается для последующего использования. 2. Всякий раз когда в шаблоне встречается символ d, выби- рается очередная цифра из поля второго операнда; если эта цифра оказывается незначащим нулем (слева от первой значащей цифры), в шаблон вставляется символ-заполнитель; если эта цифра знача- щая, то вставляется она сама. В нашем примере первая цифра второго операнда есть нуль; следовательно, будет вставлен сим- вол-заполнитель, т. е. пробел. 3. При продвижении к следующему байту очередным символом в шаблоне оказалась запятая. Так как это не d и не s, проверяется, была ли уже обнаружена хотя бы одна значащая цифра. Посколь- ку этого не было, символ, какой бы он ни был, заменяется симво- лом-заполнителем. 4. Следующий символ в шаблоне d, а соответствующая ему цифра 0. Как и ранее, незначащий нуль заменяется символом- заполнителем. 5. Следующий символ в шаблоне d, а соответствующая ему цифра 1. Так как 1 — значащая цифра, она помещается в поле первого операнда и отмечается, что была обнаружена значащая Цифра.
232 Гл. 7. Дополнительные команды 6. Последующие символы d и s в шаблоне заменяются соот- ветствующими цифрами; символы в шаблоне, отличные от d и S, сохраняются без изменений. Это продолжается до тех пор, пока в поле второго операнда не будет найден знак +. 7. Если' результат положительный, все остальные символы в поле шаблона заменяются символом-заполнителем. Если же результат отрицательный, символы остаются без изменений. Признак результата устанавливается равным 0, если второй операнд нуль, равным 1, если второй операнд меньше нуля, и равным 2, если второй операнд больше нуля. Обычно за один раз редактируется одно поле. Однако возмож- но (но это не всегда проще) отредактировать несколько полней с помощью одной команды. Эти поля должны быть расположены друг за другом, и символ разделения полей должен отделять каждое поле шаблона. Символ разделения полей всегда считается первым символом шаблона и всегда заменяется символом-запол- нителем. Если первым символом в шаблоне являются символ выбора цифры или символ начала значимости, то они всегда заменяются первой цифрой из поля второго операнда, даже если это цифра 0. Символ SOS .по своему назначению подобен символу DS. Их отличие заключается в том, что символ SOS указывает, что все последующие позиции являются значащими, независимо от того, какие цифры находятся в поле второго операнда. Следую- щие примеры поясняют операции редактирования: Регистр 1 Регистр 2 Регистр 3 008F00-0F 008F10—14 0000 0000 0000 8F00 Адрес первой команды Отредактированный результат Упакованные данные. Рассмотрим четыре случая: а. 00 12 34 56 7+ Ь. 00 00 00 81 3- с. 00 00 00 00 о+ d. 99 00 05 78 9- 008F16—17 008F20-2F FFFF (—1 в двоичном коде) 4020 6В20 2020 6В20 2021 4В20 2040 G3D9 (первый шаблон: bd,ddd,dds.ddbCR) 008F30-3F 4040 2020 206В 2020 206В 2021.204В 2020 (второй шаблон: bbbbd,ddd,dsd.dd) 008F40-4F 5С20 2020 6В20 2020 6В20 2020 6В20 2120 (третий шаблон: *bbbddd,ddd,dsd—)
7,15. Редактирование 233 Команды: MVC D2 OF 2000 2020 ED DE OF 2000 2010 Сначала шаблон засылается в поле результата и затем выпол- няется команда Отредактировать. Используя первый шаблон, получим следующие результаты: 1. bbbbl2,345.67bbb 2. bbbbbbbbb8.13bCR 3. bbbbbbbbbb.OObbb 4. b9,900,057.89bCR Если бы мы использовали второй шаблон, то написали бы команду MVC так: MVC D2 0F 2000 2030 и получили бы следующие результаты: 1. bbbbbbb. 12,345.67 2. bbbbbbbbbbbb8.13 3. bbbbbbbbbbbbO.OO 4. bbbb9,900,057.89 Отметим, что символ SOS, встречающийся во втором шаблоне левее, чем в первом, вызывает печать 0.00, а не .00. Если бы пер- вая команда имела вид MVC D2 0F 2000 2040 то мы использовали бы третий шаблон, и получили следующие результаты! 1. ••••♦*1,234,567* 2' ************§|з__ 3. **************д* 4 ****990,005,789- Команды EDMK и ED идентичны, но дополнительно команда EDMK помещает в регистр 1 адрес первой значащей цифры. Эта информация может быть использована для вставки знака долла- ра и т. д. Проиллюстрируем это на примере MVC D2 0F 2000 2030 EDMK DF OF 2000 2010 АН 4A 10 2016 ВС 47 ВО 3018 MVI 92 60 1000
234 Гл. 7. Дополнительные команды Команда АН вычитает 1 из адреса, помещаемого в регистр 1 командой EDMK. Мы могли бы использовать для этого команды ВСТ или BCTR. Команда MVI пропускается, если второй операнд не отрицателен. MVI вставляет код 60 (знак минус) перед первой значащей цифрой в отрицательных числах. Мы получим следую- щие результаты: 1) ЬЬЬЬЬЪЫ2,345.67 2) bbbbbbbbbbb-8.13 3) bbbbbbbbbbbbO.OO 4) bbb—9,900,057.89 Команды ED и EDMK являются специальными командами десятичной арифметики. 7.16. Команда выполнить Особый вид команды перехода представляет собой команда! 44 ЕХ Выполнить (RX). Адрес второго операнда является адресом команды (так назы- ваемой подчиненной команды), которая должна быть выполнена. Как и любой адрес команды, он должен указывать на границу полуслова. Адрес первого операнда задает общий регистр, в кото- ром используются только биты 24—31. Команда ЕХ позволяет выполнить одну команду, не входя- щую в нормальную последовательность команд, вне* очереди. Может быть выполнена любая команда, кроме другой команды ЕХ. Когда встречается команда ЕХ, выбирается адрес второго операнда и читается команда, записанная по этому адресу. Эта команда выполняется обычным образом, однако в PSW в поле ILC поме- щается 2, длина самой команды ЕХ, а не подчиненной команды, и адрес следующей команды в PSW указывает на команду, рас- положенную в памяти за командой ЕХ. Если подчиненная команда является командой перехода, то этот переход выполняется обычным образом. Во всех осталь- ных случаях следующей выполняемой командой будет команда, следующая за командой ЕХ. Если Ri = 0, подчиненная команда выполняется так, как описано. Если Rt ^0, то самый правый байт в Rj поразрядно логически складывается со вторым байтом в подчиненной коман- де до ее выполнения. Таким образом, производится модификация части команды. В командах типа RR и RX этот модифицируемый байт задает регистры; в командах типа SI этот байт задает непо- средственный операнд 12, и в командах типа SS этот байт задает длину операнда (операндов). Такие команды, как TRT, обычно
7.16, Команда выполнить 235 выполняются с помощью команды ЕХ, причем команда ЕХ управ- ляет переменной длиной операнда. Например, если мы хотим найти точки в строке текста, то начальным значением L должно быть число символов в строке без 1. После выполнения каждой команды TRT длина поля, оставшегося необработанным, будет уменьшаться. В команде TRT записывается нулевая длина поля, а команда ЕХ будет всегда задавать нужную длину в регистре. Упражнения № 18 1. Дано: Регистр 11 Регистр 10 000028—2F 00001000 0030089F FFOO 0000 0F 00OD00 Текущее PSW: FF01 0000 0F 001000 Определить содержимое ячеек 000028—2F после того, как выпол- нена команда, расположенная в ячейке 001000: a) L 58 5А 0 004 Ь) 00 ВВ с) SRDL 8G 50 0 004 d) АР FA 21 0 028 0 02D е) DP FD 21 0 02А 0 02D f) ВС 47 FB 0 007 Предполагаем, что наша машина имеет память объемом в 65 536 байтов. 2. В программе-мониторе (см. разд. 4.5) необходимо считы- вать информацию в шестнадцатеричном коде и преобразовывать ее в упакованные байты. При этом буквы А — F должны быть преобразованы в битовые конфигурации 10—15. Составить таб- лицу, с помощью которой коды F0 — F9 будут переводиться в F0 — F9, a Cl - С6 (т. е. буквы А - F) - в FA — FF. 3. В поле 002000—0F требуется поменять местами все точки и запятые. Таким образом, число 2,123,456,981.14 должно быть записано как 2.123.456.981,14 (европейский способ записи чисел). Составить таблицу и соответствующую программу, причем в про- грамме использовать команды TRT и ЕХ. 4. Шаблон редактирования имеет вид: bd,ddd,ddd.sd.— Каков будет результат выполнения команды TR, если заданы следую-
236 Гл. 7. Дополнительные команды щие упакованные десятичные поля: а) 00 00 00 44 5С d) 22 33 87 77 OF b) 00 12 98 78 6С е) 00 00 00 00 ОС с) 00 00 13 И 9D 5. Предложить шаблон редактирования, который мог бы ис- пользоваться для преобразования числа из упр. 4 (с) к виду ****** $131.19==. 6. Колода карт отперфорирована следующим образом: колонки 1-5 N 6-10 х4 11-15 Х2 51—55 Х10 56-80 пробелы Написать программу, которая считывала бы эти карты, а затем распечатывала бы значения N и всех X; последние должны бы!ъ отпечатаны в одной из форм ±ххх.хх, b ± хх.хх, bb ± х.хх, в зависимости от того, сколько значащих цифр в числе перед десятичной точкой. Перед точкой должна быть отпечатана хотя бы одна значащая цифра. Между полями должно быть оставлено по три пробела. 7. Пусть требуется отпечатать предметный указатель. Опре- деляемые термины отперфорированы в колонках 1—71 карты, а номера страниц в колонках 72—74, 75—77 и 78—80. Предпо- лагается, что в одной записи не может быть указано более трех номеров страниц. Предметный указатель должен быть отпечатан в следующем виде: COMPUTERS . . . Ь7, Ы89, Ь245 CONDITION CODES . . . Ь289 Общая длина строки печати должна составлять 32 символа. Перед каждым номером страницы должен стоять пробел, между номерами страниц — запятые, и между терминами и номерами страниц — точки. Карты в нашем случае должны быть отперфо- рированы следующим образом: колонки 1—9 COMPUTERS 10—71 пробелы 72-80 007189245 Написать программу, которая будет считывать эти карты и печа- тать предметный указатель. 8. Изменить программу упр. 7 так, чтобы указатель печатался страницами, на каждой странице печаталось бы 48 строк, а в пра- вом верхнем углу печатался порядковый номер страницы.
Глава 8 НЕКОТОРЫЕ ВОПРОСЫ ПРОГРАММИРОВАНИЯ 8.1. Назначение программирования Программой называют законченную совокупность команд, необходимых для выполнения определенной задачи, а программи- рованием — процесс составления такой программы. Хотя с про- граммированием самым тесным образом связано использование вычислительных машин, с ним, вообще говоря, связано нечто гораздо большее. Например, в случае программы обработки платежной ведомо- сти используемые при этом перфокарты должны быть собраны, проверены, отперфорированы и рассортированы. Затем перфокар- ты подаются в вычислительную машину с учетом возможных изме- нений количества иждивенцев, льготных и налоговых сумм и т. д. После того как вычислительная машина отпечатает чек и корешок квитанционной книжки, все еще останется задача подписать чеки, оторвать квитанции, распределить чеки и предусмотреть, чтобы чеки не были потеряны или неправильно составлены. Хотя программа для вычислительной машины, рассчитанная на удовлетворение потребностей крупной фирмы, может насчи- тывать порядка 25 000 команд, составление такой программы является лишь одной из трудностей, с которыми приходится сталкиваться при рассмотрении выполнения всей операции плате- жа. Даже при расчетах, необходимость в выполнении которых возникает в процессе проведения научных исследований, наиболее трудным в решении задач является не этап фактического написа- ния команд для вычислительной машины, а определение того, что должно вычисляться и каким образом. Для иллюстрации давайте рассмотрим случай, когда в ходе решения большой задачи требуется решить квадратное уравнение. Известно, что при решении квадратного уравнения с помощью карандаша и бумаги можно воспользоваться несколькими извест- ными методами, но применение какого из них более целесообразно при решении этой задачи с помощью вычислительной машины? Можно говорить о предпочтительности использования выбранно- го метода в том или ином смысле, например в смысле наискорей- шего выполнения вычислений, или в смысле экономии требуемого объема памяти, или, возможно, в смысле наилегчайшего состав-
238 Гл. 8. Некоторые вопросы программирования ления программы. На программисте лежит обязанность прини- мать необходимые решения. Программист не принимает все решения сразу. Обычно он начинает с общего изучения всей системы*, при этом вычислитель- ная машина рассматривается как один из многих элементов этой системы. Разрабатывая проект системы, программист рисует логическую схему системы — наглядное графическое изображение того, что происходит в системе. Затем он разбивает каждую часть этой логической схемы на более мелкие части с необходимой степенью подробности, получая подробные логические схемы. Затем он разрабатывает специальную логическую схему программы для решения на вычислительной машине, указывая в ней, вообще- то, наиболее существенные шаги, которые следует учитывать при составлении программы вычислений. Наличие подробной логической схемы программы облегчает процесс программирова- ния; используя ее, можно приступать к кодированию, т. е. к напи- санию команд. Тот человек, который будет писать программу, может быть (а может и не быть) лицом, проводившим анализ системы. Он переводит каждый блок логической схемы в одну или большее число машинных команд. 8.2. Логические схемы системы При составлении логической схемы системы внимание обра- щается больше на обрабатываемые физические документы и на элементы, используемые при обработке, чем на подробности выполнения операций. Три основные символа, представленные на рис. 8.1, исполь- зуются при начертании любых логических схем. Прямоугольник Ввод-вывод Овра&ткй Последовательность выполнения действий Рис» 8.1» Основные символы логических схем. соответствует любому виду обработки данных, трапеция — любой операции ввода — вывода, а стрелки определяют порядок выпол- нения действий. Дополнительно к этому при изображении логической схемы системы можно воспользоваться определенными символами других видов, представленными на рис. 8.2. Применение этих символов
8.2. Логические схемы системы 239 вообще-то необязательно, однако их использование делает схемы более наглядными. Процесс составления логических схем проиллюстрируем на кон- кретном примере. Предположим, что владелец торговой фирмы «Нордвест Аэроджанк» считает, что его продавцы столкнулись с затруднением при назначении точной цены на автомобили типа Аэроджанк-6, поскольку они оказались не в состоянии правильно Рис. 8.2. Символы. логических схем системы. учесть цены всех принадлежностей или деталей, в которых заинте- ресован потребитель. Владелец фирмы решает использовать вычислительную машину IBM-360 для выполнения необходимых расчетов. Он заказывает перфорацию колоды перфокарт: одну перфокарту для каждой модели и одну перфокарту для каждой принадлежности. Продавцу остается только выбрать соответ- ствующие перфокарты из картотеки, ввести их в вычислительную машину и затем оторвать лист, на котором будет напечатан пере- чень наименований принадлежностей, перечень их цен и общая цена. В* отпечатываемый список предполагается включить не толь- ко цену принадлежности по прейскуранту розничных цен, но так- же и ее оптовую цену. Необходимые данные разместятся на перфо- картах следующим образом. Колонки 1—3 4—60 61-67 68-73 74-80 Трехзначный номер, используемый при сорти- ровке перфокарт во время работы с карто- текой. Описание модели машины или принадлеж- ности Цена по прейскуранту в форме 1234.56 Пробел Оптовая цена
240 Гл. 8. Некоторые вопросы программирования Кроме того, в перфокартах в колонках 60 и 73 может быть записан знак доллара. Поскольку карты будут считываться в зонном формате, цены должны преобразовываться в упакованную десятичную форму, так чтобы было легко Перфорация карт по каждой модели ^принадлежностям^ произвести накопление итоговых сумм. После обработки последней перфо- карты полученные значения итоговых сумм преобразуются в отредактирован- ный зонный формат для печати. На рис. 8.3 представлена логическая схема системы решения рассмотренной задачи. Выбрать карты / каждой j / модели / и / ^принадлежности/ порядочить карты Ввести карты Вычислить полные цены Печать списка деталей и цен Рис. 8.3. Логическая схема системы» 8.3. Логические схемы программ При разработке логической схемы про- граммы, или блок-схемы, как ее иногда называют, основное внимание обращает- ся на составление подробного формаль- ного описания процесса обработки дан- ных с учетом специфики реализации на вычислительной машине. Поэтому приходится пользоваться несколько от- личными символами, нежели те, которые применяются при составлении логиче- ской схемы системы. В блок-схеме про- граммы можно воспользоваться как сим- волами, изображенными на рис. 8.1, так и символами, представленными на рис. 8.4. Вместе с тем символы, приведенные на рис. 8.2, при составлении логических схем программ не используются. На рис. 8.5 изображена логическая схема программы, относящаяся к при- меру, рассмотренному в предыдущем разделе. Заметим, что блок 5 разделен горизонтальной линией на две части. Такое обозначение часто используется для того, чтобы показать, что имеется более подробная логическая схема дан- ного блока. Но это обозначение не яв- ляется ни обязательным, ни единственно возможным. Подробное «раскрытие со- держания» может относиться к блокам любого типа. На рис. 8.6 приведена схема, раскрывающая содержание блока 5.
Решение Подпрограмма Модификация программы тпиип иПи„ Межстраничный Точка начали коннектор или конца н Рис. 8.4. Символы логическим схем Коннектор программ. Начало 01 02 Записать нули 8 поля сумм Рис. 8.6. Деталь- ная логическая схе- ма части программы. и с.. 8.5. Логическая схема программы. Р 16 Зак. 15635
242 Гл. 8. Некоторые вопросы программирования Символы связи блоков (коннекторы) используются в тех случаях, когда возникают трудности при попытках изобразить направление развития процесса с помощью сплошной линии. Межстраничные коннекторы предназначаются для того, чтобы показать связь с другой страницей, при этом стрелка коннектора должна указывать направление развития процесса. Пока еще мы не обсуждали вопросы модификации программ и не рассма- тривали стандартные подпрограммы, однако для полноты карти- ны соответствующие символы здесь представлены. Следующим этапом в написании программы является распре- деление памяти и определение формы входных и выходных запи- сей. В разд. 8.2 формат входной карты уже был определен. Давай- те используем тот же самый формат при печати выходных резуль- татов; исключение составят лишь колонки 1—3, содержимое которых не будет печататься. Память вычислительной машины должна быть распределена таким образом, чтобы обеспечить место для размещения а) машинных команд, Ь) констант, с) обла- стей ввода — вывода и рабочих областей, а также d) программ супервизора и программы-монитора наподобие рассмотренной в разд. 4.5, которая обеспечивает выполнение операций ввода — вывода. Распределим память в нашем примере следующим образом: КОМАНДЫ: BALR 05 BO ООО AD 01 0000 MVC D2 03 B1D2 B106 MVC D2 03 B1D6 B106 010 A2 50 B10A ВС 47 40 B04A MVC D2 4C B15D B10D AA 50 B15A PACK F2 36 B1DA B146 MVO Fl 21 B1DA B1DA AP FA 33 B1D2 B1DA PACK F2 36 B1DA B153 MVO Fl 21 B1DA B1DA AP FA 33 B1D6 B1DA BC 47 F0 B010 04А MVC D2 77 B15A B086 MVC D2 07 B195 BOFE LA 41 10 B199 EDMK DF 08 B194 B1D2 BCTR 06 10 MVI 92 5B 1000
8.3. Логические схемы программ 243 MVC D2 07 В1А2 B0FE LA 41 10 В1А6 EDMK DF 08 В1А1 B1D6 BCTR 06 10 MVI 92 5В 1000 АС 02 0000 АА 78 В15А 084 BCR 07 FB КОНСТАНТЫ: 086 120 пробелов 2020 0FE шаблон редактирования! 2020 214В 2020 106 нуль 0000 ооос ОБЛАСТИ ВВОДА - ВЫВОДА: 10А область ввода (80 байтов). Начальное содержимое не играет роли. 15А область вывода (120 байтов). Первоначально байты с 15А по 15С включительно должны содержать пробелы. РАБОЧИЕ ОБЛАСТИ: ID2 4 байта. Поле итоговой цены по прейскуранту (в упакованном формате). ID6 4 байта. Поле итоговой оптовой цены (в упакован- ном формате). IDA 4 байта. Используется при упаковке значений цен. Предполагается использование приведенной в разд. 4.5 про- граммы-монитора, которая позволяет осуществлять ввод данных с перфокарт и печать выходных данных, а также позволяет указы- вать адреса в виде «база-смещение». Программа решения задачи состоит из трех частей. Первая часть, которую можно рассматривать как предварительную, выполняется до ввода первой перфокарты с данными. Здесь исполь- зуются команды от 002 до 00 А включительно, и вся эта часть соответствует блокам 1 и 2 на рис. 8.5. Вторая часть повторяется для всех перфокарт. Здесь использованы команды от 010 до 046 включительно, и эта часть соответствует блокам 3, 4, 8 и 9, пред- ставленным на рис. 8.5. Третья часть, в которой используются команды от 04А до 084 включительно, является программой «последней карты», исполняемой лишь после того, как введется последняя перфокарта; эта часть соответствует блокам 5, 6 и 7. 16*
244 Гл. 8. Некоторые вопросы программирования Каждый блок из блок-схемы реализуется с помощью группы команд в основной программе. Блоки и команды могут быть легко связаны между собой следующим образом: Блок Первая команда Число команд 1 ООО 1 2 004 2 3 010 1 4 014 1 8 018 2 9 022 7 5 04А 11 6 07С 1 7 080 2 При разработке подробных логических схем, сходных с той, которая изображена на рис. 8.6, многие программисты предпо- читают указывать в блоках фактические команды. Часто это делается в схематичной форме. 8.4. Подпрограммы Одной из трудностей, присущих большинству программ, является то обстоятельство, что в программе определенные после- довательности почти одинаковых операций повторяются более одного раза. Например, после чтения перфокарты получаются два поля, которые должны быть преобразованы в упакованную десятичную форму. На выходе опять-таки существуют два поля, которые должны быть отредактированы в выходном формате. Следующий пример дает представление о другом возможном способе редактирования выходных данных: 056 LA 41 АО В102 05А BAL 45 80 B1F6 05Е MVC D2 07 В199 В1ЕЕ 064 LA 41 АО В106 068 BAL 45 80 B1F6 06С MVC D2 07 В1А2 BIEE 072 ВС 47 F0 B07C 1EE 8-байтовая рабочая область. Пробел в 1ED. 1F6 MVC D2 07 BIEE B0FE 1FC LA 41 10 B1F2 200 EDMK DF 08 B1ED А000 206 BCTR 06 10 208 MVI 92 5В 1000 20С BCR 07 F8
8.4. Подпрограммы 245 Нами написана совокупность команд, или подпрограмма* обеспечивающая выполнение требуемого редактирования. Эта под- программа размещена в памяти, начиная с адреса (1F64-базо- вый адрес). Каждый раз когда возникает необходимость в исполь- зовании этой подпрограммы, нужно переслать адрес операнда в Регистр 10, адрес возврата в Регистр 8 и передать управление по адресу (1F6 + содержимое Регистра 11). Программа, начи- нающаяся с адреса 1F6, производит редактирование и помещает результат по адресу 1ЕЕ. Последней командой в подпрограмме является команда возврата, т. е. перехода на следующую команду основной программы. Программа с адресом ООО и далее носит название основной* или главной программы, а программа с адресом 1F6 и далее назы- вается подпрограммой. Команды LA и BAL, с помощью которых основная программа осуществляет обращение к подпрограмме, называются командами связи. Использование подпрограмм преду- смотрено в логической схеме программы, где имеется специаль- ный блок для изображения подпрограмм (см. рис. 8.4). Приведенная в качестве иллюстрации подпрограмма являет- ся, вообще-то, тривиальной. По существу она содержит большее количество новых команд и характеризуется большей сложностью» чем это необходимо. Сама по себе подпрограмма может рассма- триваться как законченный блок, могущий быть использован- ным с любой выполняемой программой. Аргументы или же адреса аргументов обычно засылаются в регистры и для входа в под- программу применяются команды BAL или BALR. Подпрограм- мы, предназначенные для вычисления значений квадратного корня, логарифма числа и т. д., представляют собой существен- ную ценность для программиста, поскольку всякий раз, когда у него возникает потребность в вычислении подобной функции, он просто вводит подпрограмму в свою рабочую программу. От программиста совершенно не требуется задумываться о том, каким образом производится вычисление квадратного корня; он обязан только лишь указать аргумент функции (т. е. число, из которого извлекается квадратный корень), проследить, чтобы нужная подпрограмма была размещена в памяти, и написать команды связи. Поэтому наличие готовых к употреблению, пред- варительно составленных и проверенных подпрограмм суще- ственно облегчает труд программиста и позволяет ему сконцен- трировать внимание на других частях своей задачи. Система Управления Вводом — Выводом* с которой предпола- гается познакомиться несколько позднее, представляет собой совокупность стандартных подпрограмм, предназначающихся для реализации всех функций ввода — вывода, необходимость в вы- полнении которых существует практически всегда.
246 Гл. 8. Некоторые вопросы программирования Рис. 8.7. Схема табу- лирования функции f(x) = = 3х3 ~ 4х2 4- 2х - 13. В программе, приведенной в предыдущем разделе, програм- ма-монитор, на которую возложено исполнение функций ввода — вывода, также является стандартной подпрограммой. Вообще говоря, использование команды SVC позволяет обеспечить связь с подпрограммами супервизора и стандартными подпрограммами ввода — вывода, а команд BAL и BALR — связь с подпро- граммами, употребляемыми в основной программе. 8.5. Десятичные точки Одно из ограничений, связанных с применением соответствую- щих команд для выполнения арифметических операций с деся- тичными числами и двоичными числами с фиксированной точкой, заключается в том, что они не учитывают положения точки, отде- ляющей целые разряды от дробных. В слу- чае команды вида АР: FA63A09FA089 вычислительная машина производит суммирование 7-разрядного поля, распо- ложенного, начиная с адреса (089 + содер- жимое Регистра 10), с 13-разрядным полем, расположенным с адреса (09F + содержи- мое Регистра 10), и обрабатывает во всех практических случаях оба поля как целые числа. Вычислительная машина не имеет средств для учета веса десятичных цифр в числах. Поэтому все заботы о соответ- ствующем выравнивании позиций десятич- ных разрядов при выполнении операций сложения, вычитания или сравнения ложатся на программиста. Для того чтобы проиллюстрировать высказанное замеча- ние, рассмотрим задачу вычисления функ- ции f (х) = Зх3 — 4х2 + 2х — 13 для х = 2.0 (.0001) 2.1, т. е. для значений х, лежащих в интервале от 2.0 до 2.1 с шагом .0001. Первое, с чего следует начать,— это переписать заданное выражение в виде f (х) == {(Зх - 4) х + 2} х - 13, т. е. в такой форме, когда для его вычисления потребуется только 3 операции умножения вместо 6, что имело место в первоначаль- ной форме. Следующий шаг заключается в составлении логической схемы програм- мы наподобие той, которая представлена на рис. 8.7. Поскольку f (2.0) = — 1.0 и f (2.1) = + 1.3, то левее десятичной точки
8.5, Десятичные точки 247 в значении f (х) необходимо предусмотреть место для записи по меньшей мере одного десятичного разряда. Вместе с тем, если х имеет 4 дробных разряда, то значение f (х) будет иметь 12 дробных разрядов. Будем считать, что такая высокая точность для f (х) нам не нужна и округлим до 6 десятичных разрядов. Тогда наша программа будет иметь следующий вид: КОМАНДЫ: BALR 05 A0 000 MVC D2 02 A0AC A07E 006 ZAP F8 72 A0AF A0AC оос MP FC 70 A0AF A085 012 SP FB 72 A0AF A086 018 MP FC 72 A0AF A0AC 01Е AP FA 74 A0AF A089 024 MP FC 72 A0AF A0AC 02А SP FB 77 A0AF A08E 030 MVI 92 ОС A0A4 034 AP FA 51 A0AF A096 ОЗА MVN DI 00 A0B3 A0B6 040 MVC D2 13 A0B7 A098 046 ED DE 13 A0B7 AOAC 04С BC 47 АО A054 050 MVI 92 60 A0B2 054 AA 14 A0B7 058 AP FA 20 A0AC A084 05Е CP F9 22 A0AC A081 064 BC 47 CO A006 068 AF 00 0000 КОНСТАНТЫ: 07E 2000 ОС 081 2100 ОС 084 1C 085 ЗС 086 4000 ОС 089 2000 0000 ОС 08E 0130 0000 ОСИ 096 050С 098 4040 214В 201 2240 2020 2U 2020 2020 РАБОЧИЕ ОБЛАСТИ: OAC 3 байта OAF 8 байтов ОБЛАСТЬ ВЫВОДА: Начальное значение х Конечное значение х Приращение х 3. 4.0000 2.00000000 000С 13.000000000000 1/2 2020 2020 шаблон редактирования х в упакованной десятичной форме f(x) 20 байтов
248 Гл, 8. Некоторые вопросы программирования В приведенной выше программе задаются относительные адре- са с базированием по содержимому Регистра 10, который уста- навливается первой командой BALR. Для выполнения операции вывода использовалась программа-монитор, рассмотренная в разд. 4.5. Посмотрим как осуществляется в программе необходимое «выравнивание» десятичных разрядов. Мы начинаем с передачи х в поле результата (значение f (х) хранится по адресу A0AF). Результат будет содержать 4 дробных десятичных разряда, поскольку значение х, хранимое по адресу АО АС, имеет 4 дроб- ных разряда. После умножения на 3 по-прежнему остается четыре дробные десятичные цифры, поэтому вычитается число 4.0000. После следующего умножения на х получается 8 дробных разря- дов, и поэтому далее производится суммирование с двойкой, записанной в виде числа с 8 нулями, т. е. 200000000. После выпол- нения последней операции умножения получается уже 12 дроб- ных разрядов, так что при записи числа 13 к нему должно быть добавлено 12 нулей. Теперь результат вычислений, который может быть либо положительным, либо отрицательным, должен быть округлен. Для округления положительного числа к цифре, стоящей в 7-м десятичном разряде, нужно было бы прибавить 5; для округления отрицательного числа нужно произвести вычитание 5. Чтобы не делать проверки знака, мы просто вносим положительный знак после 9-го десятичного разряда, прибавляем 5 (поскольку поле, которое участвует в операции сложения, теперь будет положи- тельным) и затем передвигаем правильный знак с границы поля на свое место. Для того чтобы проиллюстрировать сказанное, рассмотрим случай х = 2.0001. При вычислении имеем f (х) = = 000.9977 9985 9997—. После внесения положительного знака поле принимает вид 000.9977 9980 + 997— К полученному значению прибавляем 5: 000 9977 9980 + 997— 050 + 000 9978 0030 + 997— правая часть f (х) не участвует в операции и поэтому не изме- няется. Затем знак минус переносим на нужное место, что приво- дит к следующему: 000 9978 00-0 + 997— Правая часть числа, не играющая никакой роли, была испорчена, однако полученный результат —000.997800 является правиль- ным и мы его редактируем и печатаем.
8,6. Работа с пультом управления 249 Возможно применение других способов округления. По жела- нию программиста в данном случае может быть использована команда ВС, однако часто представляется более целесообразным составлять программы с как можно меньшим числом команд перехода. Рассмотренная нами задача может быть решена также при помощи двоичных команд с фиксированной точкой. Но тогда потребуется осуществлять сложение с удвоенной точностью и поэтому придется применять команды AL или SL. Упражнения № 19 1. Составить подробную логическую схему для блока 2 на рис. 8.5. 2. Составить блок-схему программы ввода числовых значений параметров лиги вычисления по формуле Р = (1 + г)п — величины роста начального капитала в 1 доллар при норме про- цента г за п периодов начисления процента. 3. Составить логическую схему подпрограммы преобразова- ния четырехразрядных десятичных целых чисел в пятиразряд- ные восьмеричные целые числа. Восьмеричные цифры располо- жить по одной в каждом байте. 4. Составить логическую схему программы для упр. 9.5. 5. Составьте логическую схему программы для упр. 10.8. 6. Составьте логическую схему программы для упр. 10.9, 7. Составьте логическую схему программы для упр. 15.4. 8. Составьте логическую схему программы для упр. 17.4. 9. Составьте логическую схему программы для упр. 18.6. 10. Напишите стандартную подпрограмму вычисления п! (п фа- кториал), т. е. произведения натурального ряда чисел 1*2- ... ...•(п — 1) -п. Область изменения и ограничена интервалом 1 < п < 99. И. Перепрограммировать пример, приведенный в разд. 8.5, используя операции двоичной арифметики с фиксированной точ- кой. Начать следует с составления подробных логических схем программы. 8.6 . Работа с пультом управления На панели управления системы предусматриваются переклю- чатели, кнопки и лампочки, необходимые для нормальной работы па вычислительной машине IBM-360. Панель управления может размещаться либо в передней части центрального процессора
250 Гл. 8. Некоторые вопросы программирования (CPU), либо быть частью отдельного пульта. Устройство панели является одинаковым для всех моделей и показано на рис. 8.8. Нажатие на кнопку включения питания (POWER ON) вызывает установку в исходное состояние всех индикаторов и обеспечивает подачу питания на все блоки, входящие в комплект машины. POWER ON POWER OFF LOAD UNIT ---------.SYSTEM MANUAL WAIT TEST LOAD INTERRUPT О О О О О L0AD Рис. 8.8. Панель управления системы. При подаче питания осуществляется подсветка кнопки. Включе- ние питания не вызывает выполнения команд. Кнопка выключения питания (POWER OFF) предназначена для отключения питания. Выключение питания так же, как и после- дующее его включение, не меняет содержимого оперативной памяти. Однако регистры и ключи защиты памяти сбрасывают- ся в нуль. Кнопка прерывания (INTERRUPT) возбуждает внешнее пре- рывание. В случае прерывания по этому сигналу разряд 25 PSW устанавливается равным 1. Нажатие на кнопку загрузки (LOAD) обеспечивает выполне- ние процедуры загрузки начальной программы (IPL). К загрузке относятся три круговых переключателя, которые применяются для установки одиннадцатиразрядного двоичного числа, использующегося при выборе канала, и адреса устрой- ства, необходимого для загрузки начальной программы.
8.6. Работа с пультом управления 251 Пять лампочек, расположенных на панели управления систем мы, выполняют следующие функции. Лампочка системы (SYSTEM) включена всегда, когда рабо- тает счетчик времени; это означает, что либо происходит выпол- нение команд программы, либо работают устройства ввода — вывода. Лампочка ручного управления (MANUAL) включена всякий раз, когда вычислительная машина находится в состоянии «стоп». Это означает, что ранее была нажата кнопка останова или успешно завершилась операция IPL. Лампочка ожидания (WAIT) включается в тех случаях, когда вычислительная машина находится в состоянии ожидания. Это означает, что разряд 14 текущего PSW установлен равным 1. При подаче питания должна включиться по крайней мере одна из лампочек (системы ручного управления или ожидания). Лампочка контроля (TEST) сигнализирует о том, что органы ручного управления находятся в неправильном положении или же выполняется команда диагностика. Нормальным положением для всех ключей является среднее положение, а для всех пово- ротных переключателей — верхнее» Лампочка загрузки (LOAD) включается при нажатии на кнопку загрузки и выключается, если новое PSW успешно загружено. В каждой модели IBM-360 имеются определенные средства управления для оператора и средства управления, необходимые для организации технического обслуживания. Размещение соот- ветствующих органов управления изменяется от модели к модели. Однако во всех моделях предусматриваются следующие органы управления для оператора. Аварийный выключатель немедленно снимает все питание со всех устройств. Возврат выключателя в исходное положение* может быть осуществлен только после вмешательства обслужи- вающего персонала. Кнопка сброса системы переводит вычислительную машину в состояние «стоп» после сброса CPU, каналов, а также контрол- леров и УВВ. Контроллеры и УВВ, используемые совместно с другими вычислительными машинами, не сбрасываются. Кнопка сброса CPU производит сброс CPU, но состояния каналов не изменяет. Однако все ожидающие обработки преры- вания сбрасываются. Кнопка сброса ошибок используется для сброса индикаторов ошибок CPU и каналов. Нажатие кнопки останова переводит CPU в состояние «стоп». Выполнение операций ввода — вывода продолжается до завер- шения, и сигналы прерывания воспринимаются.
252 Гл. 8. Некоторые вопросы программирования Кнопка пуска действует только в том случае, если CPU нахо- дится в состоянии «стоп». Если ранее кнопка останова не нажи- малась, то продолжается выполнение следующей команды. Другие органы управления используются главным образом для технического обслуживания; обычно они не представляют интереса для программиста. 8.7 » Файлы на магнитной ленте Если при вводе — выводе данных используются перфокарты или печатные документы, оператор в случае необходимости может, что называется, воочию удостовериться в том, что он имеет дело с интересующим его документом и ни с каким другим. Если же используется магнитная лента, то осмотр является бесполезным занятием, поскольку записанную информацию глазами прочи- тать невозможно. При наличии нескольких тысяч бобин магнит- ной ленты избежать ошибок оператора возможно лишь путем применения некоторых определенных приемов. Стандартный путь решения этой задачи заключается в размещении специальных головной и хвостовой записей на концах каждой бобины магнит- ной ленты и в конце каждого набора данных, записанного на ленте. Сделать это можно многими разными способами. Однако суще- ствуют специально разработанные стандартные форматы. Их при- менение позволяет программисту избежать возникновения многих неприятностей. Во всех последующих главах основное внимание уделяется рассмотрению различных программ, поставляемых фирмой IBM с целью облегчить программирование для вычисли- тельных машин, изготавливаемых фирмой. Во всех поставляемых программах предусматривается работа со стандартными ленточ- ными метками. Метки бывают следующих типов: Метки тома. Записываются в начале каждой бобины магнит- ной ленты. Головные метки. Записываются в начале каждого набора данных, хранимого на ленте. Метки конца тома. Записываются в конце каждой бобины, за исключением последней, если набор данных занимает более одной бобины. Хвостовые метки. Записываются в конце каждого набора данных. Прежде чем касаться вопроса о самих метках, необходимо сначала познакомиться с некоторыми особенностями принятой терминологии. Том — это физическая единица, такая, как бобина магнитной ленты или пакет магнитных дисков, которая может быть использована для хранения информации. Набор данных — это совокупность взаимосвязанных записей, называемая иногда
8.7 Файлы на магнитной ленте 253 файлом, которая занимает часть тома, весь том или несколько томов. Наб.ор данных предназначается для ввода, для вывода или для ввода и вывода. Если информация в наборе данных размещается последова- тельно, т. е. если физический порядок расположения записей совпадает с порядком их будущей обработки, то набор данных называют физическим последовательным, стандартным последо- вательным, или просто последовательным. Наборы данных на маг- нитной ленте, так. же как и на перфокартах и на печатающем уст- ройстве, являются всегда стандартными последовательными набо- рами данных. Все записи, являющиеся метками, имеют длину 80 байтов. При рассмотрении меток условимся обозначать буквой п любое целое число от 1 до 8 включительно. Метки тома содержат символы VOLn в первых четырех байтах. Головные метки содержат символы HDRn в первых четырех байтах. Специальные головные метки пользователя содержат символы UHLn в первых четырех байтах. Метки конца тома содержат символы EOVn в первых четырех байтах. Метки конца файла содержат символы EOFn в первых четырех байтах. Специальные хвостовые метки пользователя содержат символы UTLn в первых четырех байтах. Конец полезной информации, хранимой на магнитной ленте9 всегда отмечается двумя подряд идущими маркерами (ТМ). Рис. 8.9. Файл9 занимающий одну бобину ленты. На рис. 8.9 показан порядок размещения меток, когда набор данных занимает весь том. Первыми идут метки тома VOL 1..., затем головные метки HDR1..., головные метки пользователя UHL1... и после них маркер ленты. Следом за набором данных идет другой маркер ленты, за которым следуют метки конца файла EOF1... и хвостовые метки пользователя UTL1... Наконец, два маркера ленты сигнализируют об окончании записанной на ленте информации.
254 Гл. 8. Некоторые вопросы программирования На рис. 8.10 показан порядок размещения меток, когда в одном и том же томе располагается несколько наборов данных. Первыми идут метки тома, затем головные метки и метки пользователя для первого набора данных. Далее указан маркер ленты, за которым следует первый набор данных (data set). Затем идут маркер ленты,. Рис. 8.10. Расположение нескольких файлов на одной бобине ленты. метки конца файла, хвостовые метки пользователя и снова маркер ленты. Следующими поставлены головные метки и метки пользова- теля для второго набора данных. За ними следуют снова маркер ленты, второй набор данных, маркер ленты, метки конца файла и хвостовые метки пользователя. Один маркер ленты записы- вается после последней метки для каждого набора данных; два Рис. 8.11. Файл, занимающий несколько бобин ленты (показаны первая и последняя бобины). последовательно расположенных маркера ленты записываются после последней метки последнего набора данных, хранимого на данной магнитной ленте. На рис. 8.11 показано размещение меток в том случае, когда набор данных занимает более одной бобины. Как обычно, метки тома, головные метки и головные метки пользователя ставятся в начале первого тома. В конце бобины за маркером ленты запи- сываются метки конца тома (EOV), за которыми следуют хво- стовые метки пользователя (UTL) и маркер ленты. В начале каж- дого дополнительного тома ставятся метки тома, головные метки и головные метки пользователя и за ними маркер ленты. Далее продолжается набор данных. В конце каждого тома (кроме
8,7. Файлы на магнитной ленте 255 последнего) повторяются метки конца тома EOV и хвостовые метки пользователя. В конце набора данных, следуя за маркером ленты, записываются обычные метки конца файла, за ними пишутся хвостовые метки пользователя и два маркера ленты. Метки VOL1, HDR1, EOF1 и EOV1 являются обязательными. Все остальные метки необязательны и обычно отсутствуют. Необя- зательные метки должны удовлетворять следующим требованиям. Они должны иметь в длину 80 байтов и содержать в первых трех байтах символы VOL, HDR, EOF, EOV, UTL, UHL, а в четвер- том байте — последовательные номера меток. Допускается запись не более восьми меток одного типа. Использование всех дозволен- ных меток в любом томе или файле считается весьма необычным делом, и начинающий программист может без каких-либо колеба- ний опустить все необязательные метки. Метка VOL1 имеет следующий формат: Байты 1—4 VOL1 5—10 Серийный номер тома. Этот номер обычно присваивается бобине магнитной ленты после ее приобретения и запи- сывается на внешней стороне бобины. Номер может содержать буквенные символы, но обычно это — число, например, 000186. 11 Секретность. В случае 0 никакой дополнительной иден- тификации тома перед его использованием не требуется. В случае 1 необходима дополнительная идентификация. 12—21 Всегда пробелы. 22—31 Всегда гГробелы. 32—41 Всегда пробелы. 42—51 Имя и адрес владельца. 52—80 Всегда пробелы. Метка HDR1 имеет следующий формат: Байты 1-4 HDR1 5—21 Идентификация. Для идентификации файла используют- ся любые графические символы. 22—27 Серийный номер файла. Всегда серийный номер первого тома, в котором размещается файл. 28—31 Порядковый номер тома. Он должен быть 0001 для первого тома, 0002 — для второго тома многотомного файла и т. д.
256 Гл. 8. Некоторые вопросы программирования 32—35 Порядковый номер набора данных (файла). Он должен быть 0001 для первого набора данных в томе, 0002 — для второго набора данных в том же самом томе и т. д. 36—39 Номер поколения. Если подновление (корректирование) информации в файле производится часто, то это поле указывает на конкретное поколение файла. В качестве номера могут быть взяты числа 0000, 0001, . . .,.9999. 40—41 Номер варианта в поколении. Целое число, лежащее в диапазоне значений от 01 до 99 и необходимое для того, чтобы отразить этапы обработки данного поколе- ния набора данных. 42—47 Дата создания в форме byyddd, где b — пробел, уу — год, ddd — день в году. Например, 67031. 48—53 Срок хранения в форме byyddd, где указывается дата, после которой набор данных может считаться недей- ствительным и на ленту может быть записан новый. 54 Секретность. В случае 0 — несекретно; в случае 1 — секретно. 55—60 Всегда нули. 61—73 Код системы. Идентифицирует программу. 74—80 Всегда пробелы. Формат меток EOV и EOF совпадает с форматом метки HDR1; разница сводится к тому, что в первых четырех байтах записывают- ся символы EOV1 или EOF1, а в байты 55—60, которые для метки HDR1 содержат нули, заносится счетчик блоков. Счетчик блоков содержит количество блоков, записанных в файле (EOF1) или в томе (EOV1). Операционная система OS для IBM-360 предполагает также использование метки HDR2 специального формата. Эта метка не нужна для работы других операционных систем этой ЭВМ. 8.8. Группировка записей в блоки Предположим, что желательно разместить на магнитной ленте 30000 записей, каждая из которых имеет длину 320 байтов. При плотности записи, равной 1600 байтов на дюйм, на каждую запись придется участок ленты длиной .2 дюйма плюс промежуток между блоками в .6 дюйма, т. е. в сумме .8 дюйма на блок. Поскольку 30000 X .8/12 = 2000 футов, для размещения всех записей необходима почти целая бобина магнитной ленты. Из этих 2000 футов 500 футов будут заняты собственно информацией, а 1500 футов придутся на промежутки между блоками. Теперь предположим, что на ленте две логические записи раз- мещаются в виде одной физической записи, т. е. на ленте записы-
8.8. Группировка записей в блоки 257 ваются фактически 15000 записей, каждая длиной 640 байтов. Поскольку для размещения одной записи требуется участок ленты длиной .4 дюйма (на саму запись) и промежуток между блоками равен .6 дюйма, то в сумме это составит 1.0 дюйм. Тогда на все записи потребуется 15000 X 1.0/12 = 1250 футов маг- нитной ленты. Налицо существенная экономия в длине ленты. Более того, если скорость работы программы, которая читает эту магнитную ленту, лимитируется вводом (как это имеет место в большинстве задач, связанных с обработкой файлов), то будет достигнута экономия во времени, поскольку на прогон более короткой ленты требуется меньшее время. Заметим, что на запись данных потребуется по-прежнему 500 футов ленты, но на проме- жутки между блоками только 750 футов. Если каждая физическая запись на ленте представляет собой блок данных, состоящий из трех логических записей, то для хранения данных потребуется 500 футов магнитной ленты. Такое же количество ленты необходимо на промежутки между блоками. Таким образом, всего потребуется 1000 футов ленты. В то же время в случае объединения пяти записей в блок нужно всего лишь 800 футов ленты. Если блоки объединяют по 10 записей, то требуется 650 футов, а если по 100 записей, то 515 футов ленты. За те преимущества, которые дает объединение записей в бло- ки, приходится расплачиваться по двум линиям. Прежде всего необходимо иметь область ввода, достаточно большую для того, чтобы там можно было поместить физическую запись магнитной ленты независимо от того, будет ли она состоять из одной, двух, трех, пяти, десяти или ста логических записей. В случае ста логических записей только для области ввода потребуется объем оперативного запоминающего устройства порядка 32000 байтов. Обеспечить подобную область ввода можно только при исполь- зовании очень крупной вычислительной машины, так что высокий коэффициент объединения или коэффициент блокирования вооб- ще-то не имеет смысла. Более того, при изменении коэффициента блокирования от 10 до 100 достигается только дополнительная 20 %-я экономия ленты, но зато требуется дополнительный объем оперативной памяти порядка 29000 байтов. В некоторых случаях приходится отказываться от возможной экономии в ленте и време- ни ее чтения ради дополнительного объема оперативного запоми- нающего устройства. Резюме может звучать примерно так: при объединении записей следует добиваться как можно более высо- кого значения коэффициента блокирования в сочетании с имею- щимся в наличии объемом памяти. Количество логических записей в каждой физической записи носит название коэффициента бло- кирования. Если этот коэффициент равен 1, то говорят, что записи являются несблокированнымщ ц противном случае речь идет о сблокированных записях. 17 Зак. 15635
258 Гл. 8. Некоторые вопросы программирования Второй проблемой, связанной с использованием сблокирован- ных записей, является внутренняя проблема программного «хозяйства». Если предполагается чтение блока данных, состоя- щего из пяти записей, то необходимо следить за тем, которую из пяти записей мы сейчас обрабатываем. Один из возможных способов заключается в использовании содержимого регистра в качестве базового адреса записи,, обработка которой осуще- ствляется в данный момент. Если обработка этой записи закан- чивается, то содержимое регистра увеличивается на длину записи и полученное значение сравнивается с некоторой предельной величиной. Если предел превышен, то это говорит о том, что пора читать следующий блок записей и вернуть регистр базы к его начальному состоянию. Другой путь связан с последовательной пересылкой каждой записи в рабочую область памяти, так что при обработке данных все адреса памяти будут оставаться теми же самыми для каждой записи. По окончании обработки каждой записи осуществляется передача управления системной програм- ме, которая обеспечивает пересылку следующей записи в рабочую область. В случае необходимости эта системная программа вызы- вает новый блок данных, который считывается с магнитной ленты. При использовании рабочей области, после того как последняя запись в блоке окажется переданной в рабочую область, следую- щий блок данных может быть считан с ленты в оперативную память в то время, как производится обработка этой последней записи; тем самым достигается совмещение операций по обра- ботке уже имеющегося и чтению нового блока данных. При обра- ботке данных непосредственно в области ввода это невозможно. Третье решение сводится к обработке данных в области ввода, но с тем, однако, чтобы иметь две различные области ввода и пере- ключаться с одной на другую. Такое решение обеспечивает даже большее совмещение, чем это имеет место при использовании рабочей области, однако требует большего объема памяти, а так- же наличия регистра для базирования текущей области ввода. В четвертом случае предполагается использование двух обла- стей ввода плюс рабочей области. Обычно подобным решением стараются не пользоваться, поскольку оно экономит время толь- ко тогда, когда большинство записей вообще не нуждаются в обра- ботке или же эта обработка совсем незначительна; или лишь некоторые записи требуют определенной, но тоже небольшой обработки. На рис. 8.12 проиллюстрированы варианты совме- щения, получающегося при различных условиях. С учетом сказанного следует различать следующие три типа записей. Записи фиксированной длины. В этом случае все логические записи характеризуются одинаковой длиной.
8.8. Группировка записей в блоки 259 Число Наличие Формат записи областей рабочей Совмещение В/В области 1 Нет Совмещение только для буфери- зованных УВВ. Нет совмещения для лент и ди- сков. Несблоки- Есть Совмещение для каждой записи. рованные * 2 Нет Совмещение для каждой записи. Есть Совмещение для каждой записи. Рабочая область не дает пре- имуществ. Сблокиро- 1 Нет Нет совмещения. Есть Совмещение для последней запи- си в каждом блоке. ванные 2 Нет Совмещение для каждой логиче- ской записи. Есть Совмещение для каждой записи. Рабочая область не дает пре- имуществ. Рис. 8.12. Глубина совмещения для сблокированных и несблокированных о записей. Записи переменной длины. Логические записи имеют различ- ную длину, однако программист всегда может указать, какова длина данной записи. Записи неопределенной длины. Этот вид записей характери- зуется произвольной длиной, и программист не может указать точную длину данной записи. Записи фиксированной длины являются наиболее удобными Для работы, и этот тип записей целесообразно использовать sei всех возможных случаях. Стандартным условием формирования записей переменной длины является необходимость добавления слева от каждой логи- ческой записи четырех байтов, при этом первые два указывают длину записи в байтах (ограничивая длину записи 65536 байта- ми — ограничение, практически не существенное). Если записи переменной длины группируются в блоки, то дополнительные четыре байта предусматриваются в начале блока, чтобы указать общее количество байтов в блоке. Третий и четвертый байты этих четырехбайтовых записей заполняются пробелами. Это делается с целью получить гарантию, что логическая запись начнется с границы полного слова, поскольку удобно определять области ввода — вывода таким образом, чтобы они начинались с границ полного слова. 17*
260 Гл. 8. Некоторые вопросы программирования Записи неопределенной длины записываются аналогично запи- сям фиксированной длины без использования каких-либо байтов, содержащих сведения о длине. Однако формально они рассма- триваются всегда как несблокированные. Выделение отдельных записей из блока должно выполняться программистом. При работе с магнитной лентой обычно избегают использования записей неопределенной длины. Записи фиксированной длины часто обозначаются как записи в формате F, записи переменной длины — как записи в формате V, |_______Логическая запись_________| Heed локированная запись формата Г | LLbb | Логическая запись Несблокированная запись формата V | Логическая запись Запись формата U Логическая запись 1_____|______Логическая запись 2____|______Логическая запись 3 Блок записей формата Г {коэффициент блокировки = 3) всего LLbb LLbb Логическая запись 1 LLbb Логическая запись 2 LLbb Логическая запись 3 Блок записей, формата V {коэффициент блокировки-3) Рис. 8.13. Форматы сблокированных и несблокированных записей. записи неопределенной длины — как записи в формате U. На рис. 8.13 изображена структура сблокированных и несблоки- рованных записей. Для сблокированных записей допускается, чтобы последний блок был неполным, т. е. содержал меньшее число записей, чем обычные блоки. 8.9. Файлы на устройствах с прямым доступом В отличие от магнитной ленты, где обработка данных произ- водится только последовательным образом, запоминающие устрой- ства с прямым доступом (DASD) допускают большее разнообразие методов обращения к данным или, как говорится, методов доступа. Наиболее часто в IBM-360 применяются следующие пять методов доступа. Стандартный последовательный. В этом случае DASD используются как быстрая магнитная лента.
8.9. Файлы на устройствах с прямым доступом 261 Индексно-последовательный. В этом случае просматривается индекс, хранящийся в DASD, и в нем отыскивается указанная дорожка, в которой затем оты- скивается запись с заданным полем ключа. Библиотечный. Каждому элементу из набора данных присваивается опреде- ленное имя, которое хранится в специальной таблице. При воз- никновении необходимости выбрать требуемые данные осуще- ствляется поиск по таблице, целью которого является отыскание адреса нужного элемента. Каждой записи в наборе данных должно быть присвоено свое собственное имя. Мы не будем детально рассматривать библиотечные наборы данных, заметим лишь, что большей частью они содержат про- граммы. Если требуется выполнить программу, мы вызываем ее по имени из библиотечного набора данных. В этом случае набор данных представляет собой совокупность всех программ, исполь- зуемых на данной машине. Телекоммуникационный. Используется для ввода в вычислительную машину данных, поступающих от^ удаленных (выносных) устройств по линиям связи. Соответствующий тип файла в этой книге мы рассматри- вать не будем. Прямой. В случае файлов с прямым доступом некоторым образом определяется дорожка, после чего осуществляется поиск по дорож- ке; отдельная запись выбирается либо по полю ключа, если тако- вой есть, либо по номеру записи. Дорожка может быть либо задана своим номером относительно первой дорожки, на которой хранится набор данных, либо может быть указан действительный (абсолютный) адрес дорожки. Иногда задается относительный номер блока и, зная количество блоков информации на каждой дорожке, можно вычислить и относительный номер дорожки, и номер записи на дорожке. Все рассматриваемые устройства требуют использования стан- дартных меток как тома, так и файла. Метка тома идентична метке тома на магнитной ленте, исключение составляют лишь байты 12—17, которые в случае ленты заполняются пробелами. В случае DASD в этих байтах предусматривается запись вида CCHHR — начальный адрес оглавления тома. Метка тома должна быть 3-й записью, размещаемой на дорожке 0 цилиндра 0. На резидентном диске или барабане, т. е. на диске или барабане, где размещаются различные программы общего назначения, имею- щиеся на установке, 1-я и 2-я записи на дорожке 1 содержат
262 Гл. 8. Некоторые вопросы программированил записи IPL. В случае любых других устройств в этих двух запи- сях содержатся двоичные нули. Можно использовать дополнительные метки тома, определяе- мые с помощью VOLn (п = 2, . . 8) в первых четырех байтах. Для хранения этих меток выделяются записи 4—10 на дорожке 0 цилиндра 0. Оглавление тома (VTOC) — Volume Table of Contents — это совокупность записей, в которых указано местоположение каждо- го набора данных, хранимого в устройстве. Записи, сделанные в оглавлении, имеют 44-байтовые поля ключей и 96-байтовые поля данных, при этом используются 5 форматов записей, а имен- но формат 1, формат 2, формат 3, формат 4 и формат 5. Само оглавление имеет одну метку, составляемую в форма- те 4; ссылка на эту метку содержится в байтах 12—17 в метке тома. Метка формата 4 содержит: 1) сведения о размере самого оглавления, т. е. максимальный и минимальный адреса интервала, занимаемого на диске оглавлением, 2) данные о размещении и количестве неиспользованных запасных дорожек, 3) постоян- ную информацию об устройстве, такую, как количество байтов на дорожке, количество дорожек в цилиндре и т. д. Оглавление тома должно размещаться в пределах одного цилиндра и может занимать любое количество дорожек. В обыч- ных случаях, когда приобретается новый пакет дисков или пакет магнитных карт, вспомогательная программа фирмы IBM исполь- зуется для записи собственных адресов и записей Ro. С помощью этой же самой программы записывается метка тома (которая в дальнейшем не меняется) и создается начальное оглавление. Оно составляется из записей с нулевым содержанием, размещае- мых на каждой дорожке в заданной области диска. Формируется запись в формате 4 и в случае необходимости записи в формате 5. Запись в формате 5 необходима для работы с программами Операционной Системы. Запись состоит из описателей свободных областей и указателя (ссылки) на следующую запись в формате 5, если таковая существует; последняя запись в формате 5 имеет нулевой указатель. Везде в дальнейшем область на диске или любом другом устрой- стве с прямым доступом будем называть экстентом. Описатель экстента представляет собой десятибайтовое поле. Первый байт содержит сведения о типе информации, имеющейся в области: данные, метки пользователя, индексы для файла с ин- дексной организацией и т. д. Во втором байте записывается поряд- ковый номер экстента, используемый в том случае, если набор данных хранится в физически разделенных частях устройства или более чем в одном устройстве; каждая часть набора данных определяется как самостоятельный экстент. В следующих четырех
8.9. Файлы на устройствах с прямым доступом 263 байтах указывается минимальный адрес ССНН (цилиндр, дорож- ка) экстента. В последних четырех байтах записывается макси- мальный адрес ССНН экстента. Обычно набор данных занимает один экстент, однако в случае необходимости для хранения набора может быть отведено любое количество экстентов. Для некоторых приложений желательно хранить два набора данных в одной и той же совокупности цилиндров, при этом один из наборов* данных занимает 0, 1, . . . дорожки, а другой — дорожки с номе- рами . . ., 8, 9. Такое использование устройства носит название разделения цилиндров, или коллективного использования цилинд- ров. В первом байте описатели таких экстентов имеют специаль- ный признак. Каждый набор данных имеет метку формата 1. Она соответ- ствует головной метке на магнитной ленте с полем ключа, содер- жащим имя файла. Метка формата 2 используется только для индексных файлов. Эти файлы обсуждаются в разд. 8.10. Ссыл- ка на метку формата 3 может содержаться в метках либо фор- мата 1, либо формата 2, либо в другой метке формата 3. Каждая метка формата 3 содержит до 13 описателей экстентов; метки формата 3 используются в тех случаях, если метка формата 1 или формата 2 не вмещает описатели всех экстентов набора данных. При использовании Операционной Системы OS-360 выделе- ние участка памяти указанного размера для хранения набора данных может выполняться автоматически; в случае работы с другими операционными системами это должно задаваться человеком. Размещение информации в метке формата 1 осуществляется следующим образом. Поле ключа занимает 44 байта, используемые для записи имени файла. В байтах. 1—35 хранится имя файла, за которым следует Gnnnn, где nnnn есть номер поколения, за которым следует Vnn, где пп — вариант поколения. В качестве номеров поколений и вариантов используются десятичные, а не двоичные числа. Если номера поколений или вариантов отсутствуют, то под запись имени файла могут быть отведены все 44 байта. 96-байтовое поле данных содержит следующую информацию. Байты 1 Всегда 1 для формата 1. 2—7 Серийный номер файла. 8—9 Порядковый номер тома. Ю—12 Дата создания в форме YDD, где Y — это записываемое в двоичном виде число в пределах от 00 до 99, a DD — некоторое также двоичное число в пределах от 1 до 366.
264 Гл. 8. Некоторые вопросы программирования 13-15 16 Срок хранения, записывается также в форме YDD. Счетчик экстентов. Количество экстентов для набора данных в данном томе. Дорожка, на которой содержатся метки пользователя, не учитывается. 17 18 19-31 32-38 39-40 Пробел для всех наборов данных, кроме библиотечных. Пробел. Код системы. Пробелы. Тип файла. При записи в шестнадцатеричной системе это означает: 0000 — неопределенный, 0200 — библиотечный, 2000 — прямой, 4000 — стандартный последовательный, 8000 •— индексный. 41 Формат записи. Биты в этом байте определяют: Биты 0—1 = 01 Записи типа V. = 10 Записи типа F. = 11 Записи типа U- Бит 2 = 1 Используются дорожки переполнения. Бит 3 = 1 Сблокированные записи. Бит 4 = 1 Возможны укороченные блоки (более короткие, чем размер полного блока). Биты 5—6 = 00 Управляющий символ отсутствует х). = 01 Управляющий символ в коде ASA. = 10 Управляющий символ в машинном коде. Бит 7 = 1 Ключи записываются. 42 = 80 (в шестнадцатеричной системе), если при запи- си проводится проверка ее правильности*при помощи контрольного считывания. 43-44 45-46 Длина блока данных (в двоичном виде). Длина записи. В случае записей, отличных от типа F, максимальная длина. 47 48-49 Длина ключа (в двоичном виде). Место ключа в записи для сблокированных записей (в двоичном виде). 50 Бит 0 = 1 Последний том набора данных. С управляющими символами, используемыми при работе с печатаю- щим устройством и перфокартным выводом, мы познакомимся при изучении алгоритмических языков PL/1, Фортран, Кобол и языка Ассемблера.
8.9. Файлы на устройствах с произвольной выборкой 265 Бит 1 = 1 Данные должны оставаться на одних и тех же абсолютных адресах в устройстве. Бит 2 = 1 Длина блока данных должна быть кратна 7 байтам. Бит 3 = 1 Набор данных секретный. 51 —54 Пробелы (используются в случае OS-360) 55—59 TTRLL, последняя запись в последовательном файле. ТТ — это относительный адрес дорожки, содержащей последнюю запись, R — номер записи и LL — коли- чество байтов, оставшихся свободными на дорожке. 60—61 Пробелы. 62—71 Описатель первого экстента. 72—81 Описатель второго экстента. 82—91 Описатель третьего экстента. 92—96 CCHHR ссылка-указатель поля следующей метки набора. В случае индексных наборов данных он указывает на запись формата 2, в противном случае — на запись фор- мата 3. Если же надобность в дополнительной метке отсутствует, то указатель равен нулю. Запись Ro записывается всегда в виде восьмибайтового поля данных без ключа. Использование этой записи служит трем целям. 1. Если дорожка повреждена, то первые четыре байта поля данных используются для хранения адреса запасной дорожки. В качестве запасных обычно используются дорожки в самых внутренних цилиндрах диска. 2. В случае файлов с прямым доступом в Ro записывается CCHHR — адрес последней записи, хранимой на дорожке, а в сле- дующих двух байтах число неиспользованных байтов, оставшихся на дорожке. 3. Для индексных файлов Ro может содержать адрес, куда можно* поместить запись в случае переполнения дорожки. Этот случай, рассматривается в разд. 8.10. В остающейся части этого раздела мы будем рассматри- вать ’ стандартные последовательные файлы и файлы с прямым доступом. Индексные файлы будут рассмотрены в следующем Разделе.
266 Гл, 8. Некоторые вопросы программирования Стандартный последовательный файл. В таких файлах поля ключей, как правило, не используются. Допускаются несблокированные записи в формах F, U или V и сблокированные записи в форматах V и F. При организации файла задается экстент на диске, по меньшей мере достаточный для хранения всех необходимых записей. В случае записей в фор- мате F задается также длина записи и коэффициент блокирова- ния, т. е. максимальное количество записей в каждом блоке. (Конечно, последний блок может содержать меньшее, а не мак- симальное количество записей, однако во всех остальных блоках число хранящихся в них записей должно быть максимальным.) Иногда последний блок каждой дорожки делается укороченным в такой мере, чтобы обеспечить максимальное использование объема дисковой памяти. Сигналом об этом служит единица в бите 4 байта 41 метки формата 1. В случае записей в форма- те V указывается максимальная длина записей и максимальный размер блока. В случае записей в формате U указывается макси- мальный размер записей. Записи размещаются последовательно, начиная с записи Ri на первой дорожке экстента и до тех пор, пока все записи на окажутся записанными. Программы, реали- зующие стандартный последовательный метод доступа, обеспе- чивают сблокирование записей, формирование и запись на диск соответствующих полей счетчиков и т. п. Наборы данных, записан- ные с помощью программ стандартного последовательного метода доступа, не могут читаться путем использования программ индекс- ного метода. Применение программ прямого метода позволяет прочитать любой набор данных. Поскольку диск по сравнению с лентой характеризуется более высоким быстродействием, то для хранения стандартных файлов с последовательной выборкой вместо лент часто используются диски. Файл с прямым доступом. Для описываемых файлов применение ключей является необя- зательным, однако они все же чаще используются. Набор данных с прямым доступом позволяет осуществить почти полное управ- ление форматом и размещением записей в этом наборе. Поскольку каждая запись размещается индивидуально, сблокированных записей не бывает. Можно использовать средства обработки переполнения дорож- ки, однако в операционных системах IBM для случая прямого метода доступа такие средства предусмотрены только в OS и толь- ко для записей типа F. Если ключи не используются, то при формировании набора данных указывается действительный адрес дорожки. После того как дорожка найдена, делается запись, имеющая наименьший допустимый номер; т. е. первая запись, которая должна разме-
8.9, Файлы на устройствах с прямым доступом 267 щаться на дорожке, пишется как запись Ri, следующая запись — как R2 и так далее. В записи Ro хранится информация о том, где на дорожке находится последняя запись, и указывается количество байтов, остающихся свободными. Если места на дорож- ке недостаточно, то обычная процедура состоит в переходе на сле- дующую дорожку и попытке разместить на ней запись. При счи- тывании записи программист обязан знать CCHHR — действи- тельный адрес записи. Вместо действительного адреса программист в некоторых случаях может задать относительный адрес дорожки в форме TTR, где ТТ — относительный номер дорожки. Поэтому, если набор данных должен храниться на дисковом устройстве 2311, начиная с 0-й дорожки 120-го цилиндра и до 9-й дорожки 128-го цилиндра, то он займет 90 дорожек, относительными номерами которых станут номера от 00 до 89 включительно. Использование относительных номеров дорожек целесообразно в тех случаях, когда набор данных перемещается, располагаясь в разное время в различных частях диска. В случае как абсолютной, так и относительной адресации дорожек необходимо задать адрес дорожки, если пишется новая запись, и адрес дорожки и номер записи, если читается старая. Некоторые системы программирования допускают также при- менение относительной адресации блоков данных. При этом требуется, чтобы записи имели тип F. Программист указывает только относительный номер блока 1,2,..., а программы досту- па должны преобразовывать эти значения в относительный адрес дорожки и записи. Поэтому, если, например, задать длину записи, равной 160 байтам, то на дисковом устройстве 2311 можно полу- чить 16 записей на дорожку. Следовательно, программа доступа разделит относительный адрес блока на 16, используя получаемое частное в качестве относительного номера дорожки и остаток в качестве номера записи. Обычно, используя относительную адресацию блоков, программист начинает с того, что последо- вательно расписывает все записи, заполняя их нулями, а уже после этого начинает писать нужные записи в произвольном порядке. В случае использования ключей программист получает боль- шую свободу действий. Он может по-прежнему применить отно- сительную адресацию блоков, и тогда использование поля ключа не дает ему никакого преимущества. Он может, однако, задать относительный или абсолютный адрес дорожки с целью получе- ния соответствующей дорожки и затем задать ключ, по которому осуществляется поиск записи на дорожке. Если обнаруживается нужный ключ, то осуществляется чтение соответствующего поля данных. Если же отыскать ключ не удается, то по желанию про- граммиста поиск может быть продолжен по следующим дорожкам
268 Гл. 8. Некоторые вопросы программирования до тех пор, пока не удастся найти запись или же пока не встретит- ся конец набора данных; этот метод называется методом расширенного поиска. При формировании файлов с ключами процедура сводится к тому, чтобы задать адрес дорожки (абсолют- ный или относительный) и при наличии на дорожке свободного участка разместить там запись; в противном случае нужно перей- ти к следующим дорожкам и поместить запись на первой же дорож- ке, где есть свободное место. При наличии файла с прямым доступом разрешается иметь одно и то же значение ключа более, чем для одной записи. Нужно только быть уверенным, что такие записи хранятся на различных дорожках. Можно отметить, что в процессе рассуждений мы неоднократно ссылались на стандартные программы методов доступа. Эти стандартные программы поставляются фирмой IBM как части различных Систем Управления Вводом — Выводом (IOCS — Input-Output Control System) и используются в разнообразных программах, с которыми мы познакомимся в остальной части этой книги. Хотя и можно написать свою собственную программу канала, на деле редко пользуются этой возможностью — нецеле- сообразно перепрограммировать то, что уже сделано кем-то дру- гим, и редко появляется необходимость использовать диски каким-либо способом, отличным от стандартного. 8.10. Индексно-последовательные наборы данных Наборы данных, организованные индексно-последовательным способом, должны записываться с ключами, при этом возможно использование записей типа F или V, но не типа U. Записи могут быть сблокированными или несблокированными, чаще бывают сблокированными. Для сблокированных записей поле ключа должно повторяться как часть поля данных. В случае несблоки- рованных записей это не требуется. Программы индексно-последовательного доступа обеспечивают обращение к записям из набора данных последовательно в соответствии с порядком ключей, хотя их расположение на диске может быть совсем другим. Кроме того, просто по ключу можно обращаться к записям в произвольном порядке. Для того чтобы объяснить принцип размещения данных, организованных индексно-последовательным способом, давайте рассмотрим несблокированные записи типа F. В целях иллюстра- ции предположим, что имеются 117 записей с длиной поля данных 240 байтов и двухбайтовым полем ключа, в котором записано положительное двоичное число. Пусть для хранения файла выбра- ны цилиндры 87 и 88 диска 2311. Оставим пока в резерве часть 0-й дорожки и целиком дорожки 8 и 9 и первоначально разместим
8.10. Индексно-последовательные наборы данных 269 записи в таком порядке, как это показано на рис. 8.14, т. е. поме- стим по 6 записей на 0-е дорожки и по 11 записей на все прочие. Запись конца файла (EOF) размещается после последней записи данных. (Одиннадцать записей — это максимальное количество записей данной длины с ключами, которые помещаются на до- рожке.) Цилиндр 87 Дорожка 0 Дорожка 1 13 Дорожка 2 39 Дорожка 3 53 Дорожка 4 94 Дорожка 5 109 Дорожка 6 138 Дорожка 7 176 Цилиндр 88 Дорожка 0 Дорожка 1 224 Дорожка 2 312 Дорожка 3 345 1 14 17 19 20 21 41 42 43 44 45 59 61 69 71 73 95 96 98 99 100 111 113 119 123 126 139 140 141 142 143 180 181 183 184 186 197 240 248 267 278 291 317 318 320 324 329 367 438 494 508 512 2 3 5 7 11 23 24 29 31 37 46 48 49 50 51 79 83 89 91 93 102 104 105 106 108 127 129 131 133 137 144 148 150 158 172 187 188 189 190 192 199 200 208 213 217 296 302 306 307 308 330 334 338 341 344 EOF Рис. 8.14. Записи в индексно-последовательном файле, Дорожки 8 и 9 зарезервированы как область переполнения, т. е. в качестве места для хранения дополнений к набору данных. Начальная часть 0-й дорожки зарезервирована для хранения 17 записей, каждая с двухбайтовым полем ключа и десятибайто- вым полем данных. Запись Ro в 87 цилиндре на 0-й дорожке имеет 8-байтовое поле данных, содержащее COCR, или Управляющую запись переполнения цилиндра (Cylinder Overflow Control Record). Она содержит CCHHR (где СС = 87, НН = 8 и R — 1), чтобы ука- зать первую запись в области переполнения для этого цилиндра. В записи указывается также ВВ, двухбайтовое поле счетчика байтов, имеющихся на дорожке переполнения, число которых в случае диска 2311 равно 3625. Восьмой байт Ro не используется. Запись Ri содержит ключ 11, тот же самый ключ, что и у послед- ней записи на 0-й дорожке в качестве своего поля ключа, и в каче- стве поля данных CCHHR, где СС = 87, НН = 0 и R = 18, что указывает, следовательно, на первую запись данных на дорожке. Другие пять байтов определяют запись как принадлежащую к индексу. Запись R2 идентична Ri, а именно ключ = 11, адрес = = 87, 0, 18. Запись R3 имеет ключ = 37 и адрес = 87, 1, 1; ключ опять-таки равен ключу последней записи на 1-й дорожке, а адрес указывает на местоположение первой записи данных
270 Гл. 8, Некоторые вопросы программирования на дорожке. Запись R4 аналогична записи R3. Точно таким же образом следующие две записи относятся ко 2-й дорожке, еще две следующие записи — к 3-й дорожке и т. д. Наконец, R15 и Rie относятся к 7-й дорожке. В записи Ri7 все поле ключа состоит из двоичных единиц и поле данных игнорируется. Ключ из единиц указывает на конец индекса дорожек. Организация файла начинается с размещения на 0-й дорожке первых 17 записей с нулевым содержимым, после чего записы- ваются первые шесть записей в набор данных. Теперь нужно вернуться назад и сформировать правильные записи Rj и R2. Далее следует перейти к размещению записей на 1-й дорожке, после чего необходимо вернуться и записать R3 и R4 и так до тех пор, пока цилиндр не окажется заполненным; затем переходят к следующему цилиндру. Обращение к записи с заданным ключом начинается с поиска в индексе дорожек. Предположим, что производится поиск записи с ключом 46. Поиск в индексе дорожек ведется по команде Search Key ЕН (поиск по ключу больше или равно), которая по цепочке идет вслед за командой Search НА (поиск собственного адреса). В результате поиска будет обнаружена запись R5 с ключом 51. Данные записи R5 вводятся в оперативную память и указывают на дорожку 2, запись 1. Затем с помощью команды Seek head (Установка Головки) выбирается 2-я дорожка и опять после команды Search НА отыскивается (команда Search Key ЕН) равный или больший ключ. Поиск приводит к записи 7. Считывая тогда ключ и данные, мы получаем нужную запись в оперативной памяти. Если запись найдена и оказалось, что ее ключ больше 46, то это говорит о том, что запись с ключом 46 в наборе данных отсутствует. Теперь предположим, что в файл необходимо добавить три записи, причем первая из них имеет ключ 36, вторая — ключ 532 и третья — ключ 173. При добавлении записи с ключом 36 прежде всего отыскиваем ключ 36 в индексе и получаем ссылку на 1-ю дорожку. На этой дорожке обнаруживается запись с ключом 37, однако запись с ключом 36 отсутствует. С диска считывается запись с ключом 37, и ключ и данные для нашей новой записи (ключ = 36), записы- ваются на ее место. Используя теперь Ro на 0-й дорожке, поме- щаем запись для ключа 37 на 8-ю дорожку, запись 1, и корректи- руем COCR установкой указателя на 8-ю дорожку, запись 2, и вычитанием соответствующей величины из содержимого счетчи- ка оставшихся байтов. Теперь нужно скорректировать записи R3 и R4. Для R3 производим изменение поля ключа в индексе на зна- чение 36, поскольку теперь 36 относится к последней записи на дорожке. Ключ для записи R4 остается прежним, однако изме- няется указатель на 8-ю дорожку, запись 1. Поэтому любые воз-
8.10. Индексно-последовательные набор» данных 275 можные в будущем поиски по ключу 36 приводят к попаданию на 1-ю дорожку, а поиск по ключу 37 — на 8-ю дорожку. Запись на 8-й дорожке является записью переполнения, поскольку она принадлежала к 1-й-дорожке, но была переписана из-за недостат- ка места. При добавлении в файл записи с ключом 532 находим, что максимальным ключом в файле является 512. Поэтому нужно заменить запись EOF на запись 532, записать новый EOF и заменить в двух записях индекса число 512 на 532. В случае добавления в файл записи с ключом 173 поиск по индексу дорожек приводит нас к записи Ri5 с ключом 176. Поскольку 173 меньше 176, мы считываем запись с ключом 176 в оперативную память и записываем вместо нее запись с клю- чом 173. Затем считываем следующую запись, 180, в оперативную память и записываем на ее место запись с ключом 176. Этот процесс продолжается до тех пор, пока не будет достигнут конец дорожки, на которой теперь окажутся расположенными записи с ключами 173, 176, 180, . . ., 189, 190. Запись с ключом 192 переносится в область переполнения на 8-ю дорожку, запись 2, и при этом соответствующим образом корректируется индекс дорожек и COCR. Может оказаться необходимым перенести не одну, а большее количество записей, взятых с одной и той же дорожки. Чтобы это было возможным при занесении записи в область переполне- ния, к записи добавляется десятибайтовое поле перед полем данных в качестве указателя на следующую запись, перенесен- ную в область переполнения с той же самой дорожки. Указатель будет нулевым, если с дорожки взята только одна запись перепол- нения. Например, если бы было нужно добавить запись с ключом 191, то она была бы записана как R3 на 8-й дорожке, a R2 - также запись переполнения, взятая с 7-й дорожки, имела бы указание на R3. В то же время в R4 (в записи переполнения с 1-й дорожки) указатель равен нулю. В индексе в качестве ключа берется наибольшее значение ключа среди записей в области переполнения, в то время как адрес является всегда адресом записи с наименьшим ключом в области переполнения. Поэтому, если бы проводился поиск по ключу 191, мы прочитали бы запись Вг и, пользуясь указателем (после того, как выявится, что R2 не та запись, что нам нужна), добрались бы до R3. Поскольку для хранения файла может использоваться боль- шое количество цилиндров, даже до нескольких пакетов дисков, необходимо предусмотреть также индекс цилиндров и отвести ему место на диске. Индекс цилиндров аналогичен индексам дорожек; исключение составляет только лишь то обстоятельство, что каждая пара полей указывает на последнюю запись во всем цилиндре. Индекс цилиндров может занимать любое нужное число дорожек. Для нашего примера индекс цилиндров мог бы
272 Гл, 8, Некоторые вопросы программирования иметь 5 записей: Ri и R2, указывающие на 87-й цилиндр; R3 и R4, указывающие на 88-й цилиндр, и R5, имеющую в качестве ключа все единицы, что сигнализирует о конце индекса. Если индекс цилиндров занимает свыше четырех дорожек, иногда применяется главный индекс или мастер-индекс. Это фак- тически индекс для индекса цилиндров, точно так же как индекс цилиндров является индексом для индекса дорожек. Естественно, мастер-индекс и индексы цилиндров распола- гаются в своих собственных областях на дисках. Соответствую- щая информация содержится в метке формата 2, которая привя- зывается к метке формата 1 для всех индексных наборов данных. Обе метки создаются при организации файла. Тогда же програм- мист указывает количество дорожек, которые должны быть выде- лены для области переполнения, и может определить даже разде- ленный файл. Поскольку существует возможность переполнения в свою очередь самих областей переполнения, предусмотрена возможность задавать так называемые независимые области пере- полнения (одну на цилиндр). В этих областях переполнения программа индексно-последовательного метода доступа будет хранить и искать любые записи, которые не поместятся в обычные области переполнения. Заметим, что из-за добавления к записям десятибайтового поля указателя получается только лишь по десять записей переполнения на 8-й и 9-й дорожках по сравнению с один- надцатью записями на других дорожках. Исключение записи нельзя осуществлять простым удалением ее из файла, ибо это приведет к появлению пустого участка. Вместо этого исключаемая запись помечается единицами во всех битах левого байта поля данных. Если индексно-последовательный файл обрабатывается последовательно, то программа выборки пропу- скает такие записи. Если же при добавлении новых записей про- грамма выборки осуществляет проталкивание записей в конец дорожки и доходит до помеченной записи, то производится физи- ческое исключение записи. В этом случае исчезает необходимость выносить добавляемую запись в область переполнения. Конечно, при активном использовании индексно-последова- тельного файла через некоторое время многие записи окажутся в областях переполнения. Следовательно, целесообразно осуще- ствлять периодическую реорганизацию файла. Реорганизация состоит в чтении файла и записи хранящихся в нем данных на ка- кое-либо другое место. Поскольку чтение записей выполняется в последовательном порядке, а их запись связана с организацией нового файла, этот новый файл будет иметь совершенно другие индексы и, являясь новым файлом, не будет иметь записей переполнения. Индексно-последовательный файл очень удобен для работы, однако необходимо отметить, что подобная организация данных
8.10. Индексно-последовательные наборы данных 273 несколько уменьшает полезный объем дисковой памяти за счет индексов и областей переполнения. Кроме того, на выборку каждой записи требуется по меньшей мере два поиска на диске, а это замедляет процесс выборки. Положительной особенностью является тот факт, что «эксплуатация» файла существенно упро- щается. Записи в индексно-последовательном файле могут быть сбло- кированными при условии, что поле ключа также содержится в поле данных. Более того, если записи должны исключаться, то ключ записи, т. е. ключ в поле данных, не должен занимать первого байта; в противном случае программы доступа, обнару- жив нарушение упорядоченности ключей, просигнализируют об ошибке. Предположим, что нужно сгруппировать наши записи в при- веденном выше примере в блоки по три записи в каждом. На одной дорожке при этом поместится четыре блока данных, т. е. 12, а не 11 записей, что приведет к некоторой экономии в объеме дисковой памяти. На 0-й дорожке разместились бы две записи, одна из которых содержала бы записи 1, 2 и 3 и записывалась с ключом 3, а дру- гая — записи 5, 7 и 11 с ключом 11. На первой дорожке имелись бы такие записи: Ri, содержащая записи 13, 14 и 17 с ключом 17; R2 (19, 20,21) с ключом 21; R3 (23, 24,29) с ключом 29 и R4 (31,37, 39) с ключом 39. В индексе для 1-й дорожки будет зарегистриро- ван ключ 39, поскольку это максимальный ключ на дорожке. Выбор в качестве ключа блока наибольшего из ключей, входя- щих в этот блок записей, становится понятным, как только мы вспомним, что поиск нужного блока производится по условию «Ключ больше или равен». Программа выборки осуществляет чтение всего блока данных в основную память и затем производит сравнение ключей записей с требуемым значением. В случае совпадения запись, которой принадлежит этот ключ, может обрабатываться программой вычи- слений. Если же в результате сравнения результат «больше» будет достигнут раньше, чем «равен», то это говорит о том, что нужная запись отсутствует; в этом случае осуществляется переда- ча управления программе обработки ошибок. Процедура добав- ления записи для сблокированного файла мало отличается от процедуры для несблокированного. Для внесения записи 36 запись R4 на 1-й дорожке следовало бы изменить таким образом, чтобы включить туда записи 31, 36 и 37 с ключом 37, поместив в то же время запись 39 в область переполнения. Записи пере- полнения всегда записываются несблокированными. В момент создания набора данных создается запись форма- та 2. Поле ключа состоит из 44 байтов и содержит 6 под- полей: 18 Зак. 15635
274 Гл. 8. Некоторые вопросы программирования Байты 1 02 в шестнадцатеричной системе 2-8 + 9-13 + 14—20 + 21-25 + 26—44 Всегда пробелы где символ + обозначает поля, использующиеся в некоторых системах программирования, допускающих наличие четырех уров- ней мастер-индексов, каждый из которых указывает на следую- щий индекс более низкого уровня. 96-байтовое поле данных подразделяется на 31 подполе: Байты 1 2 в коде EBCDIC 2 Количество уровней индексов (в двоичном виде). 3 + 4—6 HHR, указывающее на первую запись данных в каждом цилиндре. 7—8 НН, указывающее на последнюю дорожку с данными в каждом цилиндре. 9 Число дорожек переполнения (в двоичном виде), выде- ляемых в каждом цилиндре. 10 Наибольшее возможное значение R (номера записи) на дорожках индекса цилиндров и мастер-индекса. 11 Наибольшее возможное значение R на первичных дорож- ках (т. е. не на дорожках переполнения). 12 Наибольшее значение R на дорожках переполнения. 13 Наибольшее значение R на разделенной дорожке. 14—15 Пробелы. 16—17 Количество записей (в двоичном виде), которые помече- ны как записи для исключения. 18—20 Количество обращений (в двоичном виде) к не первым в цепочке записям переполнения в режиме произволь- ной выборки. 21—22 Число байтов, требуемых для размещения в основной памяти индекса цилиндров (в двоичном виде). 23 + 24—27 Количество записей (в двоичном виде) в первичной области данных. 28 Бит 0 = 1, если последний блок в наборе данных запол- нен полностью.
8.11. Языки программирования 275 Бит 1 = 1, если последняя дорожка заполнена полно- стью. 29—35 МВВССНН, адрес первой дорожки индекса цилиндров. 36—42 МВВССНН, адрес первой дорожки мастер-индекса. 43-49 + 50—57 MBBCCHHR, адрес последней записи в первичной обла- сти данных. 58—62 CCHHR, адрес последней обычной позиции в индексе дорожек последнего цилиндра. 63—67 CCHHR адрес последней позиции в индексе цилиндров. 68—72 CCHHR адрес последней позиции в мастер-индексе. 73—80 MBBCCHHR, указатель на последнюю запись, сделан- ную в независимой области переполнения. 81-82 + 83—84 Количество дорожек (в двоичном виде), оставшихся в независимой области переполнения. 85—86 Количество записей в независимой области переполнения (в двоичном виде). 87 —88 Количество полных цилиндров (в двоичном виде) в не- зависимой области переполнения. 89—91 Пробелы. 92—96 Указатель на метку формата 3, если для хранения файла данных требуется свыше трех экстентов; в противном случае — двоичные нули. Символом + отмечены поля, которые используются, если сам мастер-индекс подразделяется на два, три или четыре уровня индексов. Такой прием целесообразен только в случае чрезвы- чайно больших файлов. Обычно программист не заботится о содержимом меток, посколь- ку их создание и корректировку обеспечивают различные про- граммы, входящие в систему управления вводом — выводом. 8.11. Языки программирования Прежде чем вычислительная машина сможет производить вычисления, необходимо составить соответствующую программу на машинном языке. С другой стороны, когда программист начи- нает с формулировки задачи и составления блок-схемы програм- мы, он пользуется своим родным языком, а также математической и логической символикой. Каким-то образом программа должна быть переведена с естественного языка на язык вычислительной машины. Этот перевод может быть выполнен самим программи- стом, однако если программа велика и сложна, то в процессе 18*
276 Гл. 8. Некоторые вопросы программирования перевода можно наделать много ошибок и затратить много времени. Перевод — это в основном техническая работа: каждый, кто знаком с правилами машинного языка, понимает обычный язык и знаком с математическим языком, на котором программист представляет программу вычислений, окажется в состоянии сделать перевод, приложив, естественно, определенные усилия. Проблема перевода заключается в том, что на его выполнение требуется время, даже много времени, и вместе с тем необходимо привлечение относительно медленно работающего и дорогостоя- щего персонала. Сама вычислительная машина способна выполнять большую техническую работу и точно, и быстро. Поэтому представляется возможным составить программу вычислений для ЭВМ таким образом, чтобы ввести в запоминающее устройство вычислитель- ной машины команды на одном языке и осуществить их перевод (трансляцию) на другой язык. Такая программа будет сложной и может потребовать такого большого количества команд, что возникнут трудности с их размещением в памяти машины. Степень сложности транслирующей программы (программы-транслятора) пропорциональна сложности языка, который предъявляется вычи- слительной машине для перевода. Простейшим языком программирования является просто сим- волическая форма машинного языка. Например, программист может написать: AR 2,3 ST 2.XYZ имея в виду следующие две команды: 1А 23 50 20 В067 В этом случае процесс трансляции сводится к переводу мнемони- ческих кодов операций в их эквивалентные шестнадцатеричные коды и составлению таблицы символических адресов, таких, как XYZ = 067 4- Регистр 11, а также к подстановке вместо этих символических адресов их эквивалентов на машинном языке. Программа-ассемблер машины IBM-360 воспринимает в. качестве входных данных символические команды,, наподобие вышеуказан- ных, и обеспечивает получение выходных данных в виде соответ- ствующих команд на машинном языке. Относительно таких программ, составленных с использованием такой системы симво- лических обозначений, говорят, что они написаны на языке Ассемблера. В 1956 г. появился искусственный язык Фортран, который можно рассматривать как некоторый гибрид английского языка и системы математических обозначений. Была разработана про-
8.11. Языки программирования 277 грамма перевода предложений, записанных на языке Фортран, в команды для вычислительной машины IBM-704. В дальнейшем аналогичные программы были разработаны почти для всех типов вычислительных машин. Пользуясь языком Фортран, программист мог бы, например, написать: С = XYZ + 67.89 и программа для вычислительной машины, называемая компиля- тором, могла бы обеспечить трансляцию этого одного предложения в последовательность команд, которые поместят XYZ в регистр, прибавит к нему записанную в памяти константу, и затем поме* стят результат операции по адресу С. Фортран является языком программирования, находящим наиболее широкое применение для решения инженерных задач. В 1961 году комитетом, учрежденным Министерством Обороны США, был создан язык программирования под названием Кобол для решения экономических задач. Кобол имеет много общего с Фортраном. Например, предложение Кобола, эквивалентное по функциям только что рассмотренному предложению Фортрана С = XYZ + 67,89, имело бы следующий вид: ADD XYZ ТО 67.89 GIVING С В то время как применение Фортрана предпочтительно при необ- ходимости выполнения с помощью программы сложных вычисле- ний, использование Кобола представляется более целесообраз- ным в тех случаях, когда1 при организации ввода — вывода данных требуется проведение сложного редактирования. В насто- ящее время компиляторы Кобола реализованы для большинства современных вычислительных машин. В 1964 году комитетом пользователей больших вычислитель- ных машин фирмы IBM и специалистами по программированию этой фирмы был создан другой язык программирования, который получил название PL/1. В языке PL/1 сочетаются многие полез- ные особенности Фортрана и Кобола, однако более важным обстоятельством является тот факт, что применение этого языка позволяет осуществлять обработку строк символов — область, которая приобретает особую важность при необходимости про- граммирования логических задач. Когда ЭВМ начали вытеснять традиционное счетно-перфора- ционное оборудование, естественно возникла потребность в про- граммах, облегчающих переход на новую технику. Один из подхо- дов нашел отражение в программах, называемых Генераторами Программ Отчетов (RPG). Они принимают в качестве входной информации подробные описания формы нужных входных и выход- ных данных и требуемых вычислений и генерирует программу — возможно, неэффективную — для выполнения требуемой обра-
278 Гл. 8. Некоторые вопросы программирования ботки данных. Программы RPG являются очень полезными для малых вычислительных машин, и их употребление оказы- вается весьма целесообразным при необходимости составления небольших стайдартных финансовых и экономических отчетов. Языки программирования аналогичны обычным разговорным и письменным языкам в том отношении, что они постепенно совершенствуются и со временем подвергаются некоторым изме- нениям. Поэтому в отношении каждого языка время от времени можно наблюдать появление новых версии с теми или иными усовершенствованиями. Следует отметить, что целиком компилятор с полного Фортрана может поместиться в оперативную память только очень больших вычислительных машин. Поэтому для машин меньшего размера имеется подмножество полного языка (Subset-Фортран). Исполь- зование компиляторов с полных языков в IBM-360 становится оправданным при наличии основной памяти объемом 256К байтов. При этом нужно иметь вспомогательные ЗУ на дисках или бараба- нах. Однако подмножества PL/1, Фортрана и Кобола реализуются уже на памяти в 16К, а подмножества RPG и язык Ассемблера —- даже на памяти в 8К без дисков и лент. 8.12. Управляющие программы Независимо от того, каким образом осуществляется програм- мирование для IBM-360, существуют вещи, с которыми приходится сталкиваться постоянно. Можно запрограммировать выполнение обычных операций ввода — вывода, однако требуется предусмо- треть и случаи ошибочных и необычных условий, даже если их возникновение маловероятно. Что действительно хотелось бы иметь в таких случаях — так это стандартную программу обра- ботки ошибок, которая находилась бы на диске или ленте и вводи- лась бы в оперативную память, когда это надо. Если же все идет нормально, то она может так и оставаться на диске или ленте. Точно так же необходима программа для загрузки программ, т. е. для ввода программ и их размещения в памяти, и не суще- ствует серьезных причин, по которым нельзя было бы иметь стандартную программу загрузки. Для моделей 360 фирма IBM поставляет управляющую про- грамму, предназначенную для обработки прерываний, выполне- ния операций ввода — вывода, переходов от выполнения одного задания к другому и от одного шага выполняемого задания к дру- гому, проведения загрузки начальной программы и присвоения символических имен устройствам ввода — вывода. Фактически управляющая программа состоит из следующих трех компонентов.
8.13. Системные сервисные программы 279 1. IPL-загрузчик Когда начинается работа машины, аппаратно-реализованная процедура IPL вводит эту программу, которая затем очищает неиспользуемую часть оперативного запоминающего устройства, выполняет обычно некоторые вспомогательные операции и вводит после этого супервизор. 2. Супервизор Это резидентная часть управляющей программы, занимающая часть основной памяти с младшими адресами во время выполнения любого задания. Супервизор занимает свыше 4000 байтов памяти, однако точный объем era зависит от функций, которые он должен выполнять, а также от конкретного состава устройств ввода — вывода. Он может управлять выполнением любой операции ввода — вывода, обеспечить стандартную обработку всех преры- ваний, а также поставить в очередь операцию ввода — вывода, так что эта операция начнется сразу же, как только освободятся соответствующие канал и устройство. 3. Управление потоком заданий При окончании выполнения задания управление обычно возвращается супервизору, который затем считывает программу Управления заданиями. Эта программа ищет на стандартном устройстве ввода (обычно это карточный считыватель или магнит- ная лента) карту, на которой в колонках 1 и 2 отперфорированы символы //. Эта карта индентифицирует новое задание или новый пункт задания. Программа Управления заданиями проверяет и обрабатывает все эти карты; после ввода нового задания она передает управление этому заданию. Такая организация работы исключает необходимость вмешательства оператора в процессе смены заданий, что является очень важным на больших ЭВМ, где среднее время счета задания может быть меньше одной минуты. Управляющая программа—-это, как ясно из сказанного, большая программа, занимающая тысячи байтов. Она обычно хранится на магнитной ленте или на диске, хотя в больших моде- лях IBM-360 она постоянно находится на барабане, так как бара- бан быстрее диска. Конкретное устройство, на котором хранится программа, называется резидентным. В качестве резидентных запоминающих устройств могут использоваться ленты, диски или магнитный барабан. 8.13. Системные сервисные программы Набор всех программ, используемых на данной машине, обычно находится на резидентном устройстве. Все вместе они составляют библиотеку машины. Библиотеки содержат при- кладные программы, написанные либо пользователем, либо изго-
280 Гл. 8. Некоторые вопросы программирования товителем машины для решения специальных задан, и системные программы. Последние делятся на: Трансляторы: Ассемблер, Фортран, Кобол, PL/1, RPG. Управляющие программы: Супервизор, Программа Управления Заданиями, IPL-загрузчик. Системные сервисные программы: Библиотекарь, Редактор связей. Системные сервисные программы используются для ведения библиотечного хозяйства; они выполняют следующие функции: помещают новую программу в библиотеку, исключают, замещают и изменяют уже имеющиеся в библиотеке программы, считывают программы из библиотеки в память, объединяют сегменты про- грамм, написанные в разное время, в одну программу и т. п. Три библиотеки создаются Библиотекарем: Библиотека готовых программ (в машинных кодах); Библиотека перемещаемых модулей; Библиотека программ на входном языке. В библиотеке готовых программ хранятся трансляторы, управ- ляющие программы и прикладные программы, состав которых определяется потребностями учреждения. Эти программы записа- ны в той форме, в какой они будут ввЬдиться в основную память и выполняться. В библиотеке перемещаемых модулей содержатся модули, которые записаны таким образом, что каждый модуль может быть настроен для работы на любом месте памяти. Модуль может быть завершенной программой или относительно независимой частью большой программы. В библиотеке программ на входном языке содержатся макро- определения, т. е. стандартные наборы команд, которые могут быть вставлены в программу для выполнения некоторых особых функций. Такие наборы могут включать разделы программы, необходимые для задания операций ввода — вывода, или пред- ставлять собой группу команд для вычисления, скажем, кубиче- ского корня из числа, находящегося в регистре. Вопросы исполь- зования макроопределений рассматриваются в гл. 18 и 19. Модули из библиотеки перемещаемых модулей не могут быть считаны в память и выполнены в том виде, в каком они хранятся в библиотеке. Сначала они должны быть помещены в библиотеку готовых программ, либо как постоянный элемент этой библиотеки, либо как временный. Эта функция выполняется Редактором связей. Редактор связей выбирает один или несколько модулей и объединяет их в одну законченную программу, которую он и помещает в библиотеку готовых программ. Бели требуется с помощью Программы Управления Задания- ми выполнить программу из библиотеки перемещаемых модулей,
8Л4. Операционные системы 281 то первая вызывает Редактор связей для получения нужного варианта готовой программы, которую уже можно считать в память и передать ей управление. 8.14. Операционные системы Под операционной системой или монитором понимают набор программ, которые организуют непрерывную работу машины от программы к программе без вмешательства оператора. . Поскольку модели IBM-360 выпускаются с различными объема- ми основной памяти и различными комплектами устройств ввода — вывода, фирма IBM поставляет программное обеспечение раз- личных уровней. Для моделей 25, 30, 40, 50, 65, 75 и 85 пред- лагаются следующие уровни программного обеспечения. Операционная Система (OS) Требует по крайней мере 32К основной памяти с диском или барабаном в качестве резидента системы. Дисковая Операционная Система (DOS) Требует по крайней мере 16К основной памяти с диском в ка- честве резидента системы. Ленточная Операционная Система (TOS) Вариант DOS с лентой в качестве резидента системы. Базовая Операционная Система (BOS) Требует по крайней мере 8К основной памяти с диском 2311 в качестве резидента системы. Базовое программное обеспечение (BPS) — лента Вариант BOS с лентой в качестве резидента системы. Базовое программное обеспечение (BPS) — карты Ни диск, ни лента в качестве резидента системы не нужны. Первые пять уровней программного обеспечения являются операционными системами. Карточный вариант BPS не является операционной системой, а представляет собой набор программ, в состав которых входят вспомогательные программы (записать собственный адрес на диск, скопировать колоду перфокарт на лен- ту и т. д.) и исчерпывающий набор подпрограмм ввода — вывода. OS обеспечивает работу следующих трансляторов: 256К Фортран 128К Кобол Фортран 64К PL/1 Алгол
282 Гл, 8. Некоторые вопросы программирования Ассемблер Basic-Фортран Subset-Кобол RPG DOS обеспечивает следующие трансляторы: 24К Subset-Кобол 16К Basic-Фортран Subset-PL/1 Subset-Ассемблер RPG TOS обеспечивает те же трансляторы, как и DOS, только TOS-Кобол требует 16К памяти. BOS обеспечивает: 8К Subset-Ассемблер RPG BPS обеспечивает: 16К Basic-Фортран 8К Subset-Ассемблер RPG Карточный BPS обеспечивает только: 16К Basic-Фортран 8К RPG Basic-Ассемблер В следующих главах мы познакомимся с несколькими транс- ляторами для IBM-360. При этом мы вообще не будем рассматри- вать Алгол или RPG, а со всеми остальными трансляторами познакомимся настолько, насколько это необходимо, чтобы уметь читать и понимать фирменные руководства по трансляторам. В гл. 18 и 19 мы рассмотрим более подробно DOS и OS. Осталь- ную часть этой главы мы посвятим картам Управления Задания- ми, с помощью которых можно провести компиляцию, редакти- рование связей и счет по программе. В каждой из пяти опера- ционных систем используются свои карты управления заданием. Мы будем рассматривать OS и DOS, поскольку именно эти опе- рационные системы используются наиболее широко. Управляю- щие карты TOS идентичны картам DOS. Управляющие карты BOS и BPS похожи между собой и во многих отношениях подоб- ны картам DOS. Поскольку карты управления заданиями в OS и DOS совершенно отличаются друг от друга, мы рассмотрим их в двух различных разделах этой главы.
8,15. DOS. Присвоение символических имен устройствам ввода — вывода 283 8.15. DOS. Присвоение символических имен устройствам ввода — вывода Конструкция машины IBM-360 позволяет подключать к ней много устройств одного и того же типа. Это дает возможность оператору заменять одно устройство другим, подобным ему, например заменить одну ленту другой. Это означает, что в своей программе программист может указать для каждого устройства 'только его тип и его символическое имя, ответственность же ^а присвоение этого символического имени соответствующему конкретному устройству ложится на оператора. Символические имена, по которым программист обращается ко всем устройствам, записываются в форме SYSnnn, где ппп — число из интервала 0—244 включительно, или ппп = RDR, IPT, PCH, LST, LOG, LNK, RES. Эти специальные названия означают: SYSRDR — системный считыватель, чаще всего карточное считывающее устройство или лента, с которых считываются управляющие карты. SYSIPT — вводное устройство системы, лента или кар- точный считыватель, с которых обычно счи- тываются данные. Словами SYSIPT и SYSRDR можно назвать одно и то же устройство. SYSPCH — системный перфоратор, обычно карточный пер- форатор или магнитная лента. SYSLST — построчное печатающее устройство или ленто- протяжный механизм, на который выводятся результаты.. SYSLST и SYSPCH, так же как и выше, могут относиться к одному и тому же устройству. SYSLOG — построчное печатающее устройство или пуль- товая пишущая машинка, на которые выводят- ся сообщения оператору. SYSLNK — область памяти на диске, используемая Редак- тором связей в качестве входной. SYSRES — системное резидентное устройство, чаще всего дисковое устройство 2311. Кроме этого оператор (но не программист) может использовать имена SYSIN или SYSOUT. Если SYSRDR й SYSIPT присвоены одному и тому же устройству, оператор может обращаться к ним по имени SYSIN. Имя SYSIN следует также использовать, если SYSRDR и SYSIPT присвоены одной и той же области на диске. Имя SYSOUT используется, если SYSPCH и SYSLST присвоены одному и тому же лентопротяжному механизму; оно относится
284 Гл. 8. Некоторые вопросы программирования к обоим файлам. Имена SYSOO1, SYS002 и SYSOO3 используются компиляторами для обозначения рабочих областей. При генерации операционной системы каждое из приведенных семи имен (за исключением SYSRES), которыми пользуется про- граммист, присваивается конкретному устройству. Кроме того, для любого нужного числа имен SYSnnn (п = ООО, . . .) произ- водится стандартное присвоение. На конкретной машине может быть введено ограничение на максимальное значение ппп; так, например, SYSOO9, SYS024 и т. д. могут быть для нее максималь- ными символическими именами. Поскольку каждое значение ппп требует по крайней мере два байта памяти в поле супервизора, то, введя подобное ограничение, мы можем сэкономить несколько сотен байтов памяти. При выполнении начальной загрузки адрес устройства, кото- рому присвоено название SYSRES, помещается в таблицу, с кото- рой работает супервизор. Это присваивание может быть изменено только новой процедурой IPL. Часто оператору бывает необходимо изменить стандартное присвоенное устройству имя. Он осуществляет это, вводя управ- ляющую карту присваивания в SYSRDR. Эта карта имеет следующий формат: //bASSGNb SYSnnn,X'CUU'l,спецификация], где SYSnnn — символическое имя, CUU — адрес канала и устрой- ства, которому должно быть присвоено имя. Это присвоение сохраняется до конца задачи, в которой появилась эта карта, или пока не появится другая карта ASSGN для того же SYSnnn. Буква b указывает, что перед и после слова ASSGN должно быть не мень- ше, чем по одному пробелу. Последний операнд не обязателен. Он может принимать следующие значения: Х'СО' установить на ленте плотность 1600 байтов на дюйм, Х'С8' установить на ленте плотность 800 байтов на дюйм, UCS заблокировать проверку данных на устройстве 1403, ALT альтернативная лентопротяжка, IGN игнорировать команды вывода. Спецификация плотности ленты может использоваться только с лентами, способными работать с обеими плотностями. UCS может указываться только для печатающего устройства с уни- версальным набором символов. Если задано ALT, то это устрой- ство используется как альтернативное, когда полностью обра- ботано первоначальное устройство, например, для ленточного файла, расположенного на нескольких бобинах. Альтернативная лента должна иметь те же характеристики, что и первоначаль-
8.16. Управление заданиями в DOS 285 пая; например, карты // ASSGN SYS008,X'180' // ASSGN SYS008,X'181',ALT вызовут обработку, при которой сначала будет использоваться лента на лентопротяжке 180. Как только попадется EOV, авто- матически произойдет переключение на лентопротяжку 181. Если же файл занимает более двух томов, мы переключимся снова на лентопротяжку 180, если на 181 будет обнаружено EOV. Опе- ранд IGN приводит к тому, что команды вывода на SYSLST и SYSPCH (для других устройств IGN задавать нельзя), не испол- няются супервизором, хотя ответы о их якобы нормальном завер- шении поступают в рабочую программу. DOS допускает одновременное выполнение трех программ: двух высокоприоритетных программ и одной основной програм- мы, называемой также фоновой программой. Высокоприоритет- ные программы ограничиваются обычно операциями ввода — вывода и занимают мало времени CPU. В этой книге мы не будем останавливаться на высокоприоритетных программах. 8.16. Управление заданиями в DOS В этом разделе мы упомянем в общих чертах о картах, необхо- димых для (1) компиляции программы, и (2) для компиляции, редактирования связей и счета по программе. Если программа только что написана, трудно надеяться, что она сразу будет работать правильно, и потому ее только компилируют. При ком- пиляции программы обычно печатаются сообщения об ошибках. После того, как все ошибки найдены и исправлен^, выполняется компилирование, редактируются связи и программа запускается. Однако прежде всего нужно включить машину и выполнить процедуру IPL. Это означает, что мы должны поместить SYSRES- Диск на соответствующий дисковый механизм и включить его. Затем мы помещаем карты в SYSRDR и нажимаем клавиши «старт» и, если нужно, EOF. Второй пакет дисков обычно используется как рабочая область, и его подключают так же, как и SYSRES. После приведения в готовность всей машины набирают адрес SYSRES на пульте, устанавливая соответствующим образом переключатели загрузки и нажимают кнопку «загрузка». На пер- вой карте в SYSRDR должно быть отперфорировано SET DATA=mm/dd/yy,CLOCK=hh/mm/ss SET может быть отперфорировано в любом месте карты, но чаще всего оно перфорируется, начиная с 1-й колонки. После SET Должен идти один или несколько пробелов. Текущая дата перфо-
286 Гл. 8. Некоторые вопросы программирования рируется либо в форме 01/31/67 (месяц, день, год), либо 31/01/67 (день, месяц, год). Конкретная используемая форма определяет- ся при генерации пакета SYSRES. Если в оборудование включен таймер, то второй операнд устанавливает время дня в форме: часы, минуты, секунды. Если таймера нет, операнд CLOCK опу- скается. Пробелы в операндах не допускаются. Второй картой может быть LOG и эта карта вызовет распечатку всех управляющих карт (только колонки 1—72) на SYSLOG по мере того, как они будут вводиться. После этих двух карт в SYSRDR помещаются карты управле- ния заданием для первой программы. В случае компиляции это будут карты: J ОВ-карта OPTION-карта или карты, если нужно ЕХЕС-карта для компиляции Исходная программа /♦-карта. Определяет конец исходной программы /&-карта. Определяет конец задания Карта JOB имеет следующий формат: // JOB имя-задания В колонках 1—3 должно быть отперфорировано /1Ъ. За двумя ко- сыми чертами может следовать произвольное количество пробелов, но не менее одного. Подобным же образом за словом JOB должен следовать хотя бы один пробел. Имя задания содержит от одного до восьми символов и является именем программы. Если LOG указывался, имя задания будет отпечатано при запуске и окон- чании задания. Для компиляции карты OPTION обычно не требуются. При генерации системы задается некоторый стандартный набор функций (например, отперфорировать результат на SYSPCH, включить программу в каталог на SYSRES, распечатать все символические имена, используемые в программе, и т. д.). Карта OPTION опре- деляет те или иные изменения стандартных функций для кон- кретного задания. В конце задания восстанавливается стандарт- ный набор функций. Карта ЕХЕС имеет следующий формат: И ЕХЕС имя-компилятора В качестве имени-компилятора могут быть использованы ASSEMBLY, FORTRAN, COBOL, RPG или PL/1. Карта EXEC
8.16. Управление. заданиями в DOS 287 имеет тот же формат, что и карта JOB: // один или несколько пробелов ЕХЕС один или несколько пробелов имя-компилятора Карта с /*Ъ в колонках 1—3 определяет конец данных (Ь — пробел), а карта /&Ъ определяет конец задания.- В одно задание может быть включено несколько компиляций, например: // JOB MULTIEX8 // EXEC ASSEMBLY Исходная программа на языке Ассемблера /♦ И OPTION LISTX // EXEC COBOL Исходная программа на Коболе /♦ // EXEC COBOL Исходная программа на Коболе /♦ I& Наше задание состоит из трех разделов или шагов: работы ассемблера, работы компилятора с Кобола и еще раз работы компилятора с Кобола. Функции, указанные на карте OPTION» справедливы до конца задания (/&) или до тех пор, пока не появится другая карта с OPTION и не отменит действия первой. Полный набор функций, которыми управляет карта OPTION» приведен в Приложении К. Если требуется скомпилировать, отредактировать связи и запустить счет; то надо отперфорировать- следующие карты: JOB-карта OPTION LINK PHASE-карта EXEC для компиляции Исходная программа /♦ ЕХЕС для Редактора связей ЕХЕС для объектной программы Данные для программы /• /&
288 Гл. 8. Некоторые вопросы программирования Карта JOB совпадает с картой, приведенной в предыдущем примере. Карта OPTION // OPTION LINK должна быть включена в задание, если функция LINK не входит в стандартный набор функций. (Вообще говоря, иметь ее в стан- дартном наборе нежелательно.) Функция LINK означает, что результат трансляции будет записан на SYSLNK, откуда он и будет считываться редактором связей. Карта PHASE перфорируется подобно картам SET и LOG и имеет следующий формат: PHASE имя-фазы,операнд где в качестве операнда могут быть отперфорированы: ♦ ♦ ± смещение имя имя ± смещение * в данном случае обозначает первую свободную ячейку после поля, занимаемого супервизором. Смещение — десятичное целое число (от 1 до 8 цифр) или шестнадцатеричное число в формате X'hhhhhh' (от 1 до 6 цифр). Операнд задает адрес поля, в которое редактор связей поместит рабочую программу. Обычно просто используется символ *. Если же указывается имя, то оно должно быть определено в программе, как внешнее. Карты ЕХЕС для всех компиляций задаются одинаково. Конец исходной программы указывается картой /♦ и далее начи- нается второй шаг задания // EXEC LNKEDT Эта карта вызовет Редактор связей, который отредактирует объект- ный модуль из SYSLNK и поместит его в библиотеку готовых программ в область временного хранения. Чтобы выполнить готовую программу, пишется карта // ЕХЕС Отсутствие операнда на этой карте указывает, что должна быть выполнена программа из области временного хранения в библио- теке готовых программ. Если эта программа читает какие-либо карты, то эти карты с данными должны стоять после карты ЕХЕС и сопровождаться картой /*, указывающей на конец данных. Ранее мы предположили, что SYSIPT и SYSRDR — это одно и то же устройство. Если это два разных устройства, то управ- ляющие карты считываются с SYSRDR, а исходная программа
8.16. Управление заданиями в DOS 289 и данные — с SYSIPT. Таким образом, карты /♦ будут в SYSIPT, а карты /& в SYSRDR. Мы предположили также, что в объектной программе исполь- зуются стандартные имена устройств ввода — вывода, принятые в системе. Если это не так, то после карты // ЕХЕС LNKEDT и перед картой // ЕХЕС должны стоять управляющие карты ASSGN. Если и рабочие области, которые используются при компиляции (SYS001 — SYS003 включительно) почему-либо отклоняются от системных стандартов, то после карты JOB и перед картой ЕХЕС с именем компилятора должны стоять карты ASSGN для этих рабочих областей. Если в объектной программе используются ленты или диски со стандартными метками, то нужны дополнительные управляю- щие карты. Для каждого файла на диске и ленте со стандартными метками требуется карта тома. Она имеет следующий формат: // VOL SYSnnn,имя-файл а Имя-файла может содержать от одного до восьми символов. Имя- файла — это имя, по которому объектная программа обращается к набору данных. Для программ, написанных на Коболе, имена файлов совпадают с системными именами, т. е. SYSnnn. Таким образом, допустимы следующие карты: // VOL SYS017,SYS017 // VOL SYS018,KHYRRZZ Непосредственно за картой тома должна следовать карта DLAB для диска или карта TPLAB для ленты. Информация для DLAB не помещается на одной карте и всегда продолжается на вторую. Например, // DLAB 'поля-метки 1—3', xxxx,yyddd,yyddd, 'код-системы' В первых кавычках записываются 51 символ метки DASD формата 1. Это 44 символа ключа (идентификатор файла), тип формата (всегда 1) и 6-байтовый серийный номер файла. Колонка 72 содержит пробивку (не пробел), указывающую на продолжение. Пробивки на второй карте должны начинаться в 16 колонке. За четырьмя цифрами порядкового номера тома (поле 4 в метке формата 1) следует дата создания файлд и срок 19 Зак. 15635
290 Гл» 8. Некоторые вопросы программирования хранения файла (поля 5 и 6 метки). Код системы заключается в кавычки и записывается в поле 8 метки на выходных файлах. На файлах ввода этот операнд игнорируется. В некоторых слу- чаях после закрывающей кавычки ставится запятая и тогда за ней должны следовать или DA, или ISC, или ISE, или SD. Если последний операнд опущен, как и бывает чаще всего, пред- полагается SD (последовательный файл). DA определяет файл с прямым доступом, ISC — создаваемый индексно-последователь- ный файл и ISE — существующий индексно-последовательный файл. Карта TPLAB (для лент) имеет следующий формат: // TPLAB 'поля-метки 3—10' Поля метки — это строка из 49 символов, начинающаяся с идентификатора файла (17 байтов) и заканчивающаяся сроком хранения. Все эти 49 символов записаны в точности так, как в метке файла. DOS не обрабатывает поля секретности, счетчик блоков или код системы, но, если требуется, можно отперфори- ровать в 72 колонке любой символ, кроме пробела, и, начиная с 16 колонки, отперфорировать на следующей карте: 'поля-метки 11—13' Эти три поля в метке файла будут заполнены при создании файла. И, наконец, нужно задать по одной карте для каждого экстен- та для файла на диске. Эта карта имеет следующий формат: / / ХТЕNТ тип, порядковый-номер, нижняя-граница, вер х- няя-граница, 'серийный-номер', SYSnnn Эту карту мы будем рассматривать только для диска 2311. Тип занимает одну или три колонки: 1 = область данных для неразделенных цилиндров; 2 = область переполнения для индексно-последователь- ного файла; 4 = область индекса для индексно-последовательного файла; 128 == область данных для файла с разделением цилиндров. Порядковый-номер занимает от 1 до 3 колонок, содержащих десятичное число от 0 до 255. Мастер-индекс для индексно-после- довательного файла имеет порядковый номер 0; индекс дорожек — порядковый номер 1; области данных нумеруются последователь- но, начиная с 2. Если мастер-индекс не используется, то для этого файла не существует порядкового номера 0. Для всех файлов, кроме индексно-последовательных, экстенты данных нумеруют- ся с 0.
8,16. Управление заданиями в DOS 291 Нижняя и верхняя граница занимают поля по 9 колонок, в которых перфорируется BSSCCCKHH, где В — номер ячейки (О для 2311), SS — номер подъячейки, ССС — номер цилиндра (ООО—199), К — позиция блока (0 для 2311), и НН головка (00—09). Определенные таким образом дорожки являются первой и последней дорожкой области, т. е. его нижней и верхней грани- цей. Нижняя граница области не должна быть нулевой. Для файлов, размещенных с разделением цилиндров, КНН задает нижнюю и верхнюю головки файла. Серийный номер, заключен- ный в кавычки, задает серийный номер тома в метке формата 1. И, наконец, для каждого файла на диске или ленте требуется карта // LBLTYP NSD(nn) или карта // LBLTYP ТАРЕ Первая карта используется при обработке всех файлов на диске, кроме последовательных файлов; йп — максимальное число экстен- тов в любом файле в программе. Если в программе нет дисковых файлов, отличных от после- довательных, но есть помеченные ленточные файлы, то должен быть указан операнд ТАРЕ. Карта LBLTYP помещается сразу же перед картой ЕХЕС LNKEDT. По этой карте Редактор связей зарезервирует область памяти, чтобы супервизор мог выполнить соответствующую обработку меток. Символ * в карте PHASE относится к первой ячейке после этой области. И, наконец, оператор // PAUSE комментарий вызовет печать комментария, если он имеется и машина остано- вится, ожидая сигнала на продолжение от оператора. Символ ЕОВ (ALTN CODING с цифрой 5) вызовет продолжение обработки. В некоторых случаях может потребоваться перед картой ЕХЕС LNKEDT поместить карту ENTRY имя-входа Имя-входа в операторе должно быть допустимым входом (^почкой входа) в объектную программу. Использование карты ENTRY ^заменяет обычную точку входа, которая является первой командой в программе или адресом, указываемым как начальный адрес в программе, написанной на языке Ассемблера, на точку, задаваемую именем-входа на карте. Если на карте операнд отсут- ствует, то предполагается обычная точка входа. Если этой карты 19*
292 Гл. 8. Некоторые вопросы программирования вообще нет, то Редактор связей сам вставляет карту ENTRY (пробел) что приводит к использованию обычной точки входа. На первый взгляд все это может показаться очень сложным, но после того как вы составите несколько программ, простейшие и наиболее общие случаи запомнятся сами собой. Карты должны следовать в следующем порядке: JOB другие карты, но с обязательным условием, что карты DLAB и TPLAB следуют сразу после соответствующих карт VOL, а карты XTENT следуют сразу после соответ- ствующих карт DLAB ЕХЕС данные, если они имеются, после которых должна идти карта /* другие управляющие карты, если они нужны. ЕХЕС данные, если они имеются, после которых должна идти карта /* '/& 8.17. Системы TOS и BOS Управляющие карты TOS совпадают с соответствующими картами DOS, но имеется два исключения: 1. поскольку в TOS не допускается DASD, карты DLAB и XTENT не используются; 2. вместо карты LBLTYP карте ЕХЕС LNKEDT предше- ствует карта // NMTLB ппп где ппп — десятичное число, указывающее число карт VOL и TPLAB, которые будут стоять перед оператором ЕХЕС, задаю- щим начало выполнения объектной программы. Это означает, что nnh — есть число помеченных ленточных файлов в объектной программе. В случае BOS положение несколько иное. Во-первых, для IPL дата задается картой // DATE yyddd где уу — год, ddd — день года. Дата определяется только один раз, и карта с датой должна вводиться до того, как начнется
8.17. Системы TOS и BOS 293 выполнение какого-либо задания. Карта LOG имеет следующий формат: // LOG На картах ASSGN имеется дополнительный операнд. В случае BOS эта карта имеет следующий формат: // ASSGN SYSnnn,X'cuu',dd где dd задает тип устройства. dd Устройство Cl DI Ll L2 Pl P2 P3 RO RI R2 R3 R4 R5 RR T1 T2 1052 2311 1403-1404 1443-1445 Перфоратор 2540 Перфоратор 1442 Перфоратор 2520 2671 Читающее устройство 2540 2540 PFR Читающее устройство 1442 2501 Читающее устройство 2520 1285 7-дорожечная лента 9-дорожечная лента 2400 Для 1403—1404, оборудованных UCS, допускается указание еще одного — четвертого операнда // ASSGN SYSnnn,X'cuu',Ll.X'73' И ASSGN SYSnnn,X'cuu',Ll,X'7B' Операнд X'73' приводит к игнорированию ошибок в данных UCS, операнд Х'7В' заставляет реагировать на эти ошибки. Название компилятора указывается на карте JOB, а не на карте ЕХЕС. Если требуется только компиляция, то карты имеют следующий формат: // JOB имя-компилятора // ЕХЕС Если должна выполняться компиляция, редактирование и счет, то на карте JOB перфорируется // JOB имя-компилятора,имя-программы
294 Гл. 8. Некоторые вопросы программирования При этом именем компилятора должны быть RPG или ASSEMBLER (заметьте: ASSEMBLER, а не ASSEMBLY). В слу- чае BOS не допускается в одном задании несколько компиляций. Кроме того, карта /♦ не используется для обозначения конца исходной программы. Как и в случае DOS, эта карта означает конец данных для объектной программы. Следующее отличие состоит в том, что карты VOL, DLAB и XTENT для рабочих областей, используемых компиляторами и Редактором связей должны всегда включаться в набор карт задания. В случае DOS эти карты подкладываются только тогда, когда есть какие-либо отклонения от стандартного распределения областей, сделанного при генерации системы. Обычная последовательность карт для запуска ассемблера выглядит следующим образом: // JOB ASSEMBLER ASSGN-карты, если нужно // VOL SYS000 . . . // DLAB . . . // XTENT; . . // VOL SYS001 . . . // DLAB . . . // XTENT . . . // EXEC AWORK 2 исходная программа // JOB следующее-задание Карты /♦ и /& не нужны для BOS. Для компиляции и счета нужны следующие карты: // JOB ASSEMBLER,имя-фазы ASSGN-карты, если нужно // VOL SYS000 до // ЕХЕС, как раньше AOPTN ENTRY AFILE LIBRARY AWORK 2 REPRO PHASE . . . исходная программа данные, сопровождаемые /♦ Карты для SYS001 и карта AWORK 2 могут быть опущены. В этом случае будет использоваться только одна рабочая область,
8.18. Управляющие карты OS 295 а именно SYS000, что замедлит трансляцию. Обычно используют- ся два рабочих файла. Карта PHASE имеет следующий формат: PHASE имя-фазыД, смещение Имя-фазы — это имя, присвоенное фазе, и оно должно совпа- дать с именем программы на карте JOB. Если f = А, то смещение задает адрес основной памяти, начиная с которого редактор связей будет помещать программу. Если f = S, то рабочая программа будет помещена по адресу, равному адресу первой свободной ячейки после супервизора плюс смещение. Смещение задается числом, имеющим от 1 до 5 десятичных цифр, или шестнадцате- ричной константой в форме X'hhhhhh'. Смещению может пред- шествовать знак + или —. Примеры карт PHASE: PHASE SAMPLNM,S PHASE SKI,A,8192 PHASE S87Y,S,+X'2OO' В большинстве случаев встречается первый вариант, т. е. f = S без смещения. После IPL первой обычно помещается карта LOG. Карта DATE следует непосредственно за первой картой JOB. LOG // JOB . . . // DATE . . . // ASSGN . . . Карты NMTLB и LBTYP в BOS не используются. 8.18. Управляющие карты OS После IPL оператор должен набрать на пишущей машинке пульта по крайней мере две команды; первая команда: SET DATE=уу.ddd,CLOCK =hh.mm.ss, Q = устройство,PROC = устройство вторая команда: START Заметим, что команда SET отличается от соответствующей команды в DOS как формой задания даты, так и использованием то^ек вместо косых линий. Операнды Q и PROC задают DASD в форме cuu, где с — номер канала, a uu — адрес устройства. пеРанд Q задает устройство, которое будет содержать управ- ляющие карты заданий; операнд PROC указывает устройство,
296 Гл. 8. Некоторые вопросы программирования содержащее Библиотеку процедур. Типичная команда SET имеет вид SET DATA=67,031,CLOCK=08.00.00, Q=191, PROG-191 Здесь Q и PROC задают одно и то же устройство. В команде START операнды не нужны, если при генерации системы были определены стандартное устройство ввода карт задания и стандартное системное устройство вывода. Если они не были определены, то команды START исполь- зуются для их задания в таком виде: START RDR,cuu START WTR,cuu где cuu — адрес устройства. На карте START могут задаваться дополнительные операнды, но они, как правило, не нужны, и мы не будем их рассматривать. Управляющие карты задания отличаются от соответствующих карт DOS, поскольку OS предоставляет больше возможностей Существует шесть типов управляющих карт OS: JOB ЕХЕС DD /* И команда Управляющие карты JOB и ЕХЕС выполняют по существу те же функции, что и в DOS. Карта /* отмечает конец набора данных. Карта И отмечает конец потока заданий, т. е. набора управляющих карт заданий, между которыми могут стоять карты наборов данных. Если карта // (на которой в колонках 3—80 должны быть пробелы) оказывается не последней картой в устрой- стве ввода, то она воспринимается как карта конца задания. Карты команд определяют такие операции, как перемотка лент и т. д., и мы не будем их здесь рассматривать. Карта DD (карта определения данных) используется для описания данных. Карта JOB имеет следующий формат: //имя-задания JОВ учетная-информация,фамилия-програм- MHCTa,MSGLEVEL=x,COND=xxx Имя-задания — это имя, состоящее из 1—8 символов, причем первый символ должен быть буквой. Имя-задания должно начи- наться в колонке 3 и отделяться от JOB одним или несколькими
8.18. Управляющие карты OS 297 пробелами. JOB от операндов тоже отделяется одним или несколькими пробелами. Учетная информация не обязательна. Если этот операнд задается, то первым подоперандом должен быть учетный номер. Формат информации в этом поле должен соответствовать приня- тым в данном учреждении учетным программам. Если в операнде задается несколько подоперандов, то они заключаются в круглые скобки и разделяются запятыми. Если подоперанд один, то круг- лые скобки не ставятся. Если же в подоперандах появляются пробелы, круглые скобки или знак «равно», то весь операнд должен быть заключен в кавычки, а не в круглые скобки, например: 218 (218,176,Р) '218,1 = 6, Р' Фамилия программиста тоже не обязательна. Если же вклю- чается и этот операнд, и если он содержит точки, пробелы, круг- лые скобки или запятые, то он должен быть заключен в кавычки, например: SMITH JSMITH 'J.SMITH' Операнд MSGLEVEL=x не обязателен. Если х = 1, то выдаются на печать все управляющие карты. Если х = 0 или этот операнд опущен, то выдаются только сообщения об ошибках. Операнд COND тоже не обязателен. Он задает условия, при которых выполнение задания должно быть прекращено. Каждое условие задается в форме (код, операция); может быть задано до 8 условий. В результате выполнения каждого шага задания в супервизор передается код (код возврата), указывающий тип обнаруженных ошибок. Ошибки имеют следующие коды: О Ошибок нет. 4 Возможны ошибки (предостережение). 8 Обнаружены серьезные ошибки. 12 Грубые ошибки; дальнейшее выполнение программы не обещает ничего хорошего. 16 Критические ошибки; нормальное выполнение про- граммы невозможно. 20 Компиляция прекращена, поскольку обнаружена не- устранимая ошибка ввода — вывода. Кроме того, каждая программа пользователя может выраба- тывать код возврата; он должен быть меньше 4095 и должен быть кратен 4.
298 Гл. 8, Некоторые вопросы программирования В качестве операций в условиях можно задавать следующее: GT Больше GE Больше или равно EQ Равно NE Не равно LT Меньше LE Меньше или равно Если указанное условие удовлетворяется, то выполнение задания прекращается. Если бы мы задали COND-(7,GT) и код возврата был бы равен 8, выполнение задания было бы прекращено. Если задается несколько условий, то каждое усло- вие заключается в круглые скобки, и все условия заключаются во внешние круглые скобки. Например, COND=((7,GT),(4,EQ)) Типичная карта JOB выглядит следующим образом: //TYPICAL JOB, JONES,MSGLEVEL=1, COND=(12,GE) Следует заметить, что запятая после JOB указывает на пропуск операнда учетная-информация. Операнды учетная-информация и фамилия-программиста, если они задаются, должны стоять первыми. Остальные операнды идентифицируются ключевыми словами, за которыми следуют знаки равенства, и могут запи- сываться в любом порядке. Например, следующие две карты эквивалентны: //Л JOB MSGLEVEL=1,COND=(12,GE) //J2 JOB COND=(12,GE),MSGLEVEL-1 Заметим, что если пропущены оба операнда, а именно учетная- информация и фамилия-программиста, то запятые, указывающие на отсутствие этих операндов, можно не ставить. 8.19. Каталогизированные процедуры Поскольку некоторые комбинации управляющих карт, такие, например, как задания на компиляцию, редактирование связей и счет, используются довольно часто, в OS имеется Библиотека процедур. Элементами этой библиотеки являются наборы стан- дартных управляющих карт. Эти управляющие карты могут определять шаг задания или даже несколько шагов. Конечно, в библиотеке хранятся не сами карты, а образы управляющих карт ЕХЕС и DD.
8,19, Каталогизированные процедуры 299 Если для выполнения программы используется карта ЕХЕС, то она имеет следующий формат: //имя-шага ЕХЕС Р GM=имя-программы, Р ARM=. . . . . ACCT- . . .,COND = . . . Имя-шага требуется только в том случае, если где-то в картах задания есть ссылки на этот конкретный шаг. Указание PGM= имя-программы должно присутствовать всегда и должно быть первым операндом. Имя-программы — это имя, под которым программа была включена в библиотеку готовых программ. Другие операнды необязательны. Если присутствует операнд АССТ=, то учетная информация передается системной учетной подпрограмме; эта информация представляется в той же форме, что и учетная информация на карте JOB. Так же, как и на карте JOB, могут задаваться условия прекращения выполнения шага. Подчеркнем, что эти условия относятся к прекращению выпол- нения именно шага, а не всего задания. В операнде PARM задают-' ся в качестве параметров различные функции, которые нужно выполнить. Этот операнд по существу соответствует карте OPTIONS в DOS. Типичным примером карты ЕХЕС является карта //LKED ЕХЕС PGM=IEWL,PARM—(XREF,LIST, LET) Эта карта вызовет выполнение Редактора связей (IEWL). При использовании каталогизированных процедур вместо PGM—имя-программы записывается PROC = имя-процедуры или просто имя-процедуры. Типичной процедурой для компиляции программы, написанной на Фортране, является //FORT ЕХЕС FORTEC,PARM=(SIZE=15360, LINELNG=208,NOLOAD) В данном случае для процедуры FORTEC задаются три пара- метра: объем основной памяти, выделенной под компилятор, мак- симальная длина выводных записей и указание о том, что объект- ный модуль не будет обрабатываться Редактором связей, т. е. не надо формировать никакой информации для передачи Редактору связей. Заметим, что управляющая карта может иметь продолжение. Для этого на карте, которую нужно продолжить, в колонке 72 перфорируется произвольный символ (не пробел), а на самой карте продолжения в колонках 1—2 — две косые черты. ^помянутая выше процедура FORTEC включает не только соответствующую карту ЕХЕС, но и все необходимые карты DD.
300 Гл. 8. Некоторые вопросы программирования этой книге нам будут нужны следующие процедуры: FORTEC FORTECLG ASMEC ASMECLG PL1LFC PL1LFCLG СОБЕС COBECLG Фортран, компиляция Фортран, компиляция, редактирование и счет Ассемблер, компиляция Ассемблер, компиляция, редактирование и счет PL/1, компиляция PL/1, компиляция, редактирование и счет Кобол, компиляция Кобол, компиляция, редактирование и счет Если желательно использовать компилятор Фортрана уровня G или Н, то эти буквы следует записать вместо Е перед послед- ним С и CLG. Для программы Ассемблера уровня F буква Е также заменяется буквой F. Аналогичная замена буквы Е на F производится и в случае использования компилятора Кобола уровня F. В большинстве случаев все остальные операнды, кроме имени процедуры, опускаются. В тех, однако, случаях, когда нужно задать операнд PARM (или АССТ, или COND), можно указать, к какому конкретно шагу процедуры относятся параметры. Если мы напишем PARM.FORT = . . . то параметры будут отнесены только к шагу компиляции. Если мы напишем PARM.LKED = . . . то параметры будут отнесены только к шагу редактирования. Если мы напишем PARM.GO = . . . то параметры будут отнесены только к объектной программе. В случае Кобола, PL/1 или языка Ассемблера мы пишем PARM.ASM = . . . PARM.COB = . . . PARM.PL1 = . . . Имя, стоящее после точки, является именем шага процедуры. Для каждого шага может быть написан свой операнд, например: // ЕХЕС FORTECLG,PARM.FORT = (NOLOAD, SIZE = 15360),PARM.LKED = (LIST,XREF)
8.20. Определение данных 301 8.20. Определение данных Карта DD имеет следующий формат: //сМимя DD операнды ddHMH — это имя из блока управления данными в программе, напи- санной на языке Ассемблера, или его эквивалент. Если исполь- зуются процедуры, то можно написать шаг-процедуры • ddnMH и это будет означать, что ddHMH определяется для указанного шага (FORT, СОВ, PL1, ASM, LKED, GO), а не для всей про- цедуры. Первым операндом обычно является символ * или слово DATA Это означает, что набор данных непосредственно следует за картой DD во входной колоде карт. В любом случае набор данных должен оканчиваться картой /♦. Если используется символ *, то карты, в колонках 1—2 которых отперфорировано //, воспринимаются как ошибка; если используется слово DATA, такие карты допустимы. Остальные операнды могут следовать в любом порядке. Рассмотрим эти операнды: DDNAME = ddHMH. ddnMH — это имя другой карты DD. Характеристики, задан- ные в карте DD с этим именем, переносятся на указанный набор данных. DSNAME = dsHMH. В этом операнде указывается имя набора данных. Если набор данных новый, то он будет каталогизирован под этим именем. Для старого набора данных это имя, под которым он был катало- гизирован раньше. Имя набора данных можно задать в форме &имя; в этом случае набор данных с этим именем рассматривается как временный (рабочий) и будет исключен при окончании выпол- нения задания. Можно использовать также такую форму записи: DSNAME = ♦. шаг-задания.шаг-процедуры.ddnMH Это означает, что параметр DSNAME будет копироваться из дру- гой карты DD, которая встречается в задании раньше. Элемент
302 Гл. 8. Некоторые вопросы программирования ddnMH задает имя этой карты. Элементы шаг-задания и шаг-про- цедуры нужны для того, чтобы при необходимости можно было отыскать нужную карту DD в другом шаге задания, а в случае, когда этот шаг сам ссылается на процедуру, выбрать нужный шаг уже в этой процедуре. Эти элементы опускаются, когда они не нужны. UNIT—имя Указывает устройство, на котором хранится набор данных. В качестве имени может быть использовано: cuu, адрес канала- устройства, тип устройства, например устройство 2311; или класс устройства. Некоторые классы устройств определяются во время генерации системы. Хотя можно использовать произ- вольные названия, существуют стандартные: SYSSQ Любая лента или DASD SYSDA Любое DASD SYSCP Любой карточный перфоратор Определяются также и некоторые другие имена, но это зависит от требований системы. Если имя указывает тип или класс устрой- ства, то супервизор OS сам выбирает, какое конкретное устрой- ство из этого класса будет использоваться, и посылает сообще- ние об этом оператору. Если, скажем, нужно печатающее устрой- ство, то вместо операнда UNIT= нужно писать: SYSOUT-A На больших моделях IBM-360 с несколькими печатающими уст- ройствами допускается использование значений, отличных от А. Если набор данных будет размещен на DASD, то нужен операнд SPAGE=(t,(n,a)) где п равно числу дорожек, которые должны быть зарезервиро- ваны, если t = TRK; n — числу цилиндров, которые должны быть зарезервированы, если t — CYL; п может равняться числу записей, если t равно средней длине записи. Если указывается подоперанд а, то после того, как будет полностью заполнена вся первоначально выделенная область, будет выделено а дополни- тельных дорожек, цилиндров или длин записей. Подоперанд а может быть опущен. Для всех остальных устройств, кроме устройств с прямым доступом, операнд SPACE игнорируется. Пример: операнд SPACE=(CYL,(20,2))
8.20, Определение данных 303 вызовет выделение 20 цилиндров и, в случае надобности, еще двух. Операнд SPACE=(120,(300)) вызовет выделение области для 300 записей, средняя длина кото- рых равна 120 символам. Операнды VOLUME= . . ., SER= . . REF= . . . вызывают создание или проверку меток тома. Обычно операнд VOLUME имеет формат: V OLUM Е = (, R ЕТ Al N, поряд ковый-номер, счетчик) Если записан подоперанд RETAIN, то набор данных не должен сниматься с устройства, пока он не будет упомянут в следующей карте DD. Если RETAIN опущен, то должна быть сохранена вторая запятая. Порядковый-номер — это номер первого тома набора данных (четыре цифры), чаще всего он равен 1, так как обычно начинают работать с первым томом набора. Счетчик задает число томов в наборе данных. SER =(серийный-1, . . .) Записывается один или несколько серийных номеров тома. Если задается операнд SER, то подоперанд счетчик в операнде VOLUME может быть опущен REF=dsHMH. Указывает, что набор данных должен быть расположен в toiM же самом томе, что и набор данных (Ishmh. Правая часть операнда может быть записана в любой форме, которая допустима в опе- ранде DSNAME. LAB Е L = (порядковый-номер, SL, EXPDT=yyddd, RETPD=xxxx). Первый операнд — порядковый номер набора данных. Если этот операнд опущен, то предполагаются стандартные метки. Второй операнд равен NL (без меток), SL (стандартные метки), NSL (нестандартные метки), или SUL (стандартные метки и мет- ки пользователя). Если операнд опущен, предполагается SL. Последние два операнда необязательны, и может быть записан только один из них. EXPDT задает срок хранения, т. е. дату, после которой вместо данного набора может быть записан другой. RETPD указывает число дней, по прошествии которых набор Данных может быть уничтожен. Если не был записан операнд oYSOUT=A, то может быть записан операнд DISP= ...
304 Гл. 8. Некоторые вопросы программирования Первым подоперандом в этом операнде может быть либо NEW, либо OLD, либо MOD в зависимости от того, является ли набор данных новым, старым или изменяемым старым. Если этот под- операнд опущен, то предполагается NEW. Второй подоперанд DELETE KEEP PASS CATLG UNCATLG указывает диспозицию набора данных по окончании шага задания. PASS означает, что к набору данных будут обращаться в после- дующих шагах задания. Если второй подоперанд опущен, то при окончании шага задания вновь созданные наборы данных уничтожаются, а все старые наборы данных хранятся. При использовании процедур для компиляции или компиля- ции, редактирования и счета обычно приходится описывать только один набор данных на одной карте DD, поскольку внутри процедуры описаны все наборы, кроме того, который содержит исходную программу, предназначенную для компиляции. Обыч- ная форма карты DD //FORT.SYSIN DD * или //PL1.SYSIN DD ♦ и т. д. Кроме того, каждый набор данных, используемый объект- ной программой, кроме стандартных наборов, должен быть пред- ставлен своей картой DD. Типичный набор карт для компиляции программы, написанной на Фортране, выглядит так: //Ji JOB MSGLEVEL=1 //SI ЕХЕС FORTEC //FORT.SYSIN DD ♦ Исходная программа /♦ Для задания, состоящего из компиляции, редактирования и вы- полнения рабочего счета подойдет, например, следующий набор карт: //J2 JOB MSGLEVEL-1 //S2 ЕХЕС FORTECLG //FORT.SYSIN DD ♦
8.20. Определение данных 305 исходная программа /♦ //GG.FT04F001 DD DSNAME=MX1,UNIT=SYSSQ, DISP=(NEW,CATLG),VOLUME=(,SER=123) В последнем примере описан один выходной набор данных для рабочей программы. Упражнения № 20 1. Что можно сказать о следующих метках на ленте? (a) HDRlPRGBLEMlbbbbbbbbb00001300 020001003401b67034b680340bbbbbb SYSTEMPROBbbbbbbbbbb (b) EOVlPRQBLEMlbbbbbbbbb00001300 020001003401b67034b680340bbbbbb SYSTEMPROBbbbbbbbbbb 2. Для ленты из упр. 1 (b) составить метку VOL1, если вла- делец определен как «360TXTGNT». 3. Составить метки в предположении, что файл из упр. 2 был помещен на диск 2311, VTOC которого занимает цилиндр 0 дорож- ки 1—8. 4. Сколько записей по 160 байтов каждая можно получить на бобине магнитной ленты в 2500 футов длиной (предполагает- ся, что дефектных участков нет), если использовать коэффициент блокирования, равный (а) 1 (несблокированные); (Ь) 2; (с) 3; (d) 4; (е) 8; (f) 16, при плотности записи на ленте 1600 байтов на дюйм? 5. Если на ленте обнаружен дефект, то программа IOCS для ленты выдает команду ERG (стереть интервал), вызывающую пропуск 3.5 дюймов. Если этот дефект приходится на IRG (проме- жуток между записями), то стирать не нужно. Сколько команд IRG в среднем должна выдать IOCS, если в условиях упр. 4 на ленте имеется 7 дефектных участков по 80 байтов каждый? 6. Предположим, что требуется на устройстве 2311 записать 2000000 записей по 3 байта каждая. Цилиндр 0 резервируется для меток и VTOC. Если использовать стандартную последова- тельную организацию данных, каково должно быть минимальное значение коэффициента блокирования, если желательно вместить все записи на одном пакете дисков? Цилиндры 200—203 зарезер- вировать для запасных дорожек. 20 Зак. 15635
306 Гл. 8. Некоторые вопросы программирования 7. В условиях упр. 6 каково должно быть значение коэффи- циента блокирования, если имеется 100000 записей по 3 байта каждая? 8. В условиях упр. 7 каков должен быть ответ, если длина записи равна 60 байтам? 9. В условиях упр. 7 каково должно быть значение коэффи- циента блокирования, если желательно на устройстве 2311 полу- чить 100000 записей; каждая запись имеет длину 9 байтов (вместе с полем ключа записи) и ключ занимает 6 байтов. Предполагаем индексно-последовательную организацию; отводим девятую дорож- ку для переполнения и считаем, что индекс цилиндров записан на цилиндре 0 вместе с метками и VTOG. 10. Прорешать упр. 9, если требуется помещать файл только на цилиндры 1—106. 11. В условиях упр. 10 каково должно быть значение коэф- фициента блокирования, если требуется зарезервировать дорож- ки 8 и 9 для переполнения. 12. В условиях упр. 9 предполагаем, что первые записи имеют в поле ключа 2,4, 6,8и т. д., и в поле данных, предшествующему ключу, ТРЪ, где Т = 1, если ключ кратен трем, Т = 0 в осталь- ных случаях, Р = 1, если ключ представляет собой степень двойки (т. е. 2, 4, 8,16 ит. д.), Р = 0 в остальных случаях. Записать содержимое каждой записи на дорожке 1 первого цилиндра данных в формате ТРЬКККККК, где КККККК — ключ. 13. Повторить упр. 12 для дорожки 0 второго цилиндра данных.
Глава 9 ВВЕДЕНИЕ В PL/1 9.1. PL/1 Наименование алгоритмического языка PL/1 образовано из начальных букв английских слов Programming Language/One (язык программирования один). Между 1963 и 1966 гг. комитет, составленный главным образом из пользователей больших вычи- слительных машин и представителей фирмы IBM, разработал искусственный язык, который получил известность как алгорит- мический язык PL/1. При создании языка была учтена необхо- димость обеспечения как можно большей простоты и удобства написания программы. При этом необходимость составления общих и подробных логических блок-схем программ все еще сохраняется, но при соответствующем опыте программирования на языке PL/1 можно избежать большой и утомительной работы, связанной с написанием программы на машинном языке. Обычно при написании программ на языке PL/1 программист руководствуется правилами, которые предполагается рассмотреть в этой и последующих двух главах. После составления програм- ма перфорируется. Существует специальная библиотечная про- грамма, поставляемая фирмой IBM. Программа на языке PL/1 вводится в вычислительную машину в качестве входных данных для этой библиотечной программы, которая печатает исходную программу на PL/1, а также эквивалентную программу на машин- ком языке. Упомянутая библиотечная программа носит название компилятора PL/1. В машинах IBM-360 применяются два вида компиляторов PL/1: для Операционной Системы уровня F (OS — F), для Ленточной и Дисковой Операционных систем (TOS/DOS). Версия OS — F требует оперативной памяти объемом 64К, десятичной арифметики и арифметики с плавающей точкой. Для работы компилятора необходима дисковая память или магнитный барабан. В случае применения компилятора TOS/DOS требуется оперативная память объемом 16К. Операции десятичной арифме- тики и арифметики с плавающей точкой обычно бывают нужны, хотя можно написать такие программы на языке PL/1, в которых они не потребуются. Компиляторы TOS и DOS аналогичны; исключение составляет лишь то, что компилятор TOS не допу- скает дискового ввода — вывода. Оба компилятора TOS/DOS 20*
308 Гл. 9. Введение в PL/1 не позволяют использовать весь язык PL/1; допускается исполь- зование лишь подмножества полного языка (Subset). Мы будем отмечать различия по ходу изложения. В этой книге предполагается рассмотреть большую часть обычно используемых элементов языка PL/1. В то же время мы не будем касаться некоторых элементов, которые используются главным образом в очень больших вычислительных машинах. Программа задачи, написанная на языке PL/1, носит назва- ние исходной программы. Она должна состоять исключительно из операторов языка PL/1 (или Subset-PL/1). Программа перфо- рируется на карты, при этом для записи информации исполь- зуются колонки 2—72. Колонка 1 обычно не используется, чтобы избежать путаницы между управляющими картами для опера- ционных систем и операторами PL/1. Колонки 73—80 обычно используются для идентификации программы и нумерации карт, так что если карты случайно рассыпались, их можно рассортиро- вать в исходном порядке. Процесс ввода исходной программы в память вычислительной машины, переработки ее с помощью компилятора и получение выходной программы называют компиляцией. Выдаваемые компилятором данные, кроме тех, которые вы- даются в виде печатного документа (листинга) и содержат исход- ную программу, диагностические сообщения и т. п., составляют выходную или объектную программу. Объектная программа, полученная с помощью компилятора машины IBM-360, является перемещаемой; чтобы присвоить про- грамме действительные адреса оперативной памяти, этот объект- ный модуль обрабатывается Редактором связей. Обычно объект- ная программа размещается на магнитном диске или ленте и немед- ленно обрабатывается Редактором связей. Поэтому составитель программы не видит этого промежуточного этапа. В действитель- ности сама объектная программа обычно хранится на диске, оставаясь физически невидимой для программиста или оператора. В любом случае объектная программа логически идентична исходной программе в том смысле, что она обеспечивает выпол- нение точно такой же обработки данных. Процесс компиляции есть не что иное, как перевод с одного языка на другой. В отличие от перевода, скажем, с французского языка на английский перевод (трансляция) с языка PL/1 на машин- ный язык IBM-360 является очень точным. Исходная программа должна быть составлена в соответствии со строгими правилами языка PL/1, и это обеспечит получение правильной объектной программы. При переводе с французского языка на английский допускается определенная свобода и переводчик может принять в расчет плохой французский язык переводимого документа. Вычислительная же машина в отличие от переводчика-человека
9.1. PL/1 309 не может допустить наличия в тексте-оригинале даже незначи- тельных ошибок. /♦PL1F - 01*/ CMPD: PROCEDURE OPTIONS(MAIN); Р: GET LIST(R); А == 1.0000; N = 1; F = 1 + R; PUT LIST (R); Q: A = A *F; PUT LIST (N, A); N = N'+ 1; IF N < 20 THEN GO TO Q; ELSE GO TO P; END CMPD; P и c. 9.1. Программа на PL/1. На рис. 9.1 представлена короткая программа на языке PL/1. В качестве входных данных в этой программе используется годо- вая норма процента R, например R = 0.0400, а в качестве резуль- татов печатается таблица роста исходной суммы в 1 доллар при начислении процентов один раз в год для срока N = 1, 2, . . . ..., 19 годам. Первая строка программы является примечанием и не обра- батывается. Программе присваивается имя CMPD в соот- ветствии с меткой второго оператора. Следующий оператор также имеет метку Р. Присутствие оператора GET LIST (R) означает, что со стандартного устройства ввода, например карточного читающего устройства, объектная программа должна получить значение для каждой переменной в списке, заключенном в круг- лые скобки. В данном случае присутствует только одна пере- менная R. Следующие операторы полагают А = 1.0000 долла- ров, N = 1 и F = 1 + R. Оператор PUT LIST (R) обеспечивает просто печать значения R на стандартном устройстве вывода, которым обычно является построчно печатающее устройство. Следующий оператор также имеет метку, а именно метку Q. Действие оператора заключается в перемножении значений, переменных А и F; получаемый при этом результат присваивает- ся (замещает прежнее значение) переменной А. Знак умножения обозначается звездочкой, так как в перфокартах знак умноже- ния отсутствует. Оператор PUT LIST (N, А) обеспечивает печать значений переменных N и А. Оператор N = N + 1 вызывает увеличение N на 1, причем следует заметить, что знак равенства в языке PL/1 и знак равенства в математике имеют различное значение. Следующий оператор обеспечивает передачу управле-
310 Гл. 9. Введение в PL/1 ния опять на оператор Q, если N < 20; в противном случае управление передается оператору Р. При передаче управления оператору Р произойдет ввод и обработка следующего значения R. Последний оператор предназначен для того, чтобы сообщить компилятору об окончании программы. Для отделения одного оператора от другого в языке PL/1 применяется точка с запятой. 9.2. Синтаксис Если вам предстоит изучать новый язык, то первое, что вы делаете,— это знакомитесь с алфавитом. В языке PL/1 исполь- зуются 60 символов, которые разделены на три группы: 1) 29 букв, куда входят буквы от А до Z, а также $ — знак доллара; @ — коммерческое «at»; # — номер. 2) 10 десятичных цифр от 0 до 9; 3) 21 специальный символ, а именно пробел == знак равенства + плюс — минус ♦ звездочка (знак умножения) / наклонная черта (знак деления) ( открывающаяся скобка ) закрывающаяся скобка , запятая точка ' кавычка (апостроф) % процент ; точка с запятой : двоеточие < знак меньше > знак больше | символ ИЛИ & символ И 1 символ отрицания . символ разбивки (черта под строкой) ? вопросительный знак Цифры 0 и 1 также используются как двоичные цифры. Под буквенно-цифровым символом в языке PL/1 понимается любой буквенный или цифровой символ. Наличие 29 букв позволяет использовать некоторые неанглийские алфавиты. Определенные комбинации символов, использование которых допускается в языке PL/1, имеют следующие специальные зна- чения:
9.2, Синтаксис 311 ♦* возведение в степень (так 5**2 = 25) || операция сцепления (конкатенации) >= больше или равно <= меньше или равно П= не равно П> не больше ~|< не меньше /♦ начало примечания */ конец примечания —> знак указателя Поскольку некоторые перфораторы и многие построчно печа- тающие устройства не рассчитаны на печать всех 60 символов при написании программ на языке PL/1 можно воспользоваться 48-символьным алфавитом языка, являющимся подмножеством 60-символьного алфавита. В 48-символьном алфавите символы . @ и # не используются и приняты следующие замены: . . означает э » • означает // означает % GT означает GE означает = NE означает = LE означает NG означает -| > NL означает и < LT означает NOT означает и OR означает 1 AND означает & CAT означает II PT означает — В 48-символьном алфавите применяется только 11 специаль- ных символов, а именно: пробел =.,+_*/()' В случае использования 48-символьного алфавита слова GT, GE и т. д. резервируются, т. е. могут быть использованы только в этом своем специальном смысле. При использовании 60-символь- ного алфавита никакие слова не резервируются. В языке PL/1 слово или идентификатор может включать от одного до тридцати одного буквенно-цифрового символа. Пер- вым символом идентификатора должна быть обязательно буква (А — Z) или же символ @, # или $. Символ разбивки (_) может быть использован везде, за исключением начала или конца иден- тификатора. Никакие другие специальные символы использовать нельзя. В частности, не разрешены пробелы.
312 Гл. 9. Введение в PL/1 Некоторые идентификаторы должны относиться не только к компилятору PL/1, но также и ко всей операционной системе. К таким идентификаторам, например, принадлежат: имена фай- лов, метки программ и т. д. При составлении этих имен допу- скается использование только символов А — Z и 0—9, причем первым символом должна быть обязательно буква. Максималь- ное количество символов в таких идентификаторах должно быть равно семи. Примечания могут быть введены в любое место программы в такой форме /* примечание */. Компилятор пропускает приме- чания, но они воспроизводятся в распечатке программы, т. е. в ее листинге. В качестве примеров правильно составленных иден- тификаторов можно привести следующие: CMPD .INTEREST XYZ Р А U17 $ @17 E3RF_9_PU CUST.NAME.ADDR AGENT007 Примерами неправильно составленных идентификаторов могут служить такие: 7Y8 (первый символ не буквенный) RJ5.3 (содержит специальный символ — точку) YU TH (включает пробел) 9.3. Исходные данные Для того чтобы компилятор обеспечил формирование соот- ветствующих команд для обработки информации, ему должна быть известна форма данных, которые подлежат обработке. В языке PL/1 используются данные различных типов. В этом разделе предполагается рассмотреть некоторые из этих типов. Если данные представляются в стандартном коде EBCDIC любым необходимым количеством байтов (один символ на байт), можно сказать, что мы имеем дело с символьной строкой {строкой символов). В исходной программе символьная строка записывает- ся в форме 'символы' В кавычки могут быть включены любые символы, за исключе- нием кавычки. При необходимости представить кавычку, ее запи-
9.3. Исходные данные 313 сывают дважды, так чтобы компилятор мог отличить эту кавычку от той, которая сигнализирует об окончании строки. Приведем примеры символьных строк: 'ABCDEF' '$3.45' 'CAN' "Г Они эквивалентны следующим последовательностям символов ABCDEF $3.45 CAN'T соответственно. Строка может быть повторена несколько раз, если перед открывающей кавычкой предусмотреть запись коэффициента повторения (повторителя), который указывается в скобках: (2) 'АВС' (3) '27' (0) 'RTY5U' Эти примеры эквивалентны следующим строкам: АВСАВС 272727 (пусто) Символьная строка вида или же любая строка с коэффициентом повторения, равным нулю, воспринимается как пустая строка, поскольку она не содержит символов. Иногда полезно определить строку /двоичных цифр. Записи битовых и символьных строк аналогичны; разница лишь в том, что^ битовые строки состоят лишь из цифр 0 и 1. После закрываю- щей кавычки пишется буква В; это позволяет идентифицировать строку как битовую. Примерами битовых строк могут служить такие записи: '00110' В '11110000' В '111111' В (6) 'г в Здесь последние две записи определяют одну и ту же строку. в IBM-360 битовые строки хранятся как последовательные биты, начинающиеся от границы байта. Если требуется только
314 Гл. 9. Введение в PL/1 часть байта, биты располагаются слева. Поэтому '00110' будет храниться как ООН 0000=301в, а (6)'1'~ как НИ 1100=FCle. Аналогично битовая строка '111100001010' займет два байта, хранимые в виде F0A0i6. В противоположность строковым данным в языке имеются арифметические данные. Язык PL/1 позволяет оперировать с ве- щественными и комплексными числами, двоичными и десятич- ными, с плавающей и фиксированной точкой, допуская также различную точность. Точность числа с фиксированной точкой определяется заданием количества цифр в числе и количества дробных десятичных разрядов. Точность чисел с плавающей точкой определяется заданием количества значащих цифр в числе. В качестве примеров вещественных десятичных констант с фиксированной точкой могут служить следующие: 72.398 796 784. .00243 Если десятичная точка не пишется, то константа является вещественной десятичной константой целого типа. Веществен- ные десятичные числа с фиксированной точкой хранятся в IBM-360 в виде упакованных десятичных полей, использующих необ- ходимое количество байтов. Поэтому число 72.398 хранится как 72 39 8+, а число .00243 — как 24 3+. Компилятор выравнивает положение десятичной точки, но сама точка не хранится как часть упакованного поля. Приведем примеры вещественных двоичных констант с фикси- рованной точкой: 11111100110.0001В 10010110В 1000100В .000001001В Заметим, что двоичные константы отличаются от десятичных наличием буквы В. Двоичные числа в IBM-360 хранятся в формате полного слова. • В Subset-PL/1 двоичные константы не должны содержать десятичную точку. Укажем примеры вещественных десятичных констант с пла- вающей точкой: 234.5Е + 7 236Е - 2 6.78Е2 .00023Е + 02
9.4. Константы и переменные 315 Присутствие буквы Е определяет константу как константу с плавающей точкой. Число перед буквой Е умножается на 10 в степени, которая следует за буквой Е. Поэтому число 234.5Е + 7 означает 234.5 X 107 == 2345000000. Аналогично, 236Е — 2 = = 2.36. В IBM-360 десятичные числа с плавающей точкой с шестью или меньшим количеством значащих цифр хранятся в формате полного слова; в случае когда количество значащих цифр свыше шести, отводится двойное слово. Примеры вещественных двоичных констант с плавающей точ- кой: 1.1101ЕЗВ .001101Е — 4В В этом случае показатель степени — это десятичный целый показатель степени при основании 2. Следовательно, 1.1101ЕЗВ = = 1.1101 X 23 = 1110.1. Двоичные числа с плавающей точкой хранятся в полном слове, если они содержат 21 или меньшее количество значащих цифр; в противном случае они занимают двойное слово. Мнимая константа — это любая вещественная константа, за которой следует буква I. Следовательно, число 3.271 является мнимой десятичной константой с фиксированной точкой, число 1011BI — мнимой двоичной константой с фиксированной точкой, число 1.2Е + 21 — мнимой десятичной константой с плавающей точкой. Комплексная константа в языке PL/1 — это просто сумма вещественной и мнимой константы. Следовательно, числа 56.7 + 3.271 3.2Е + 0 — 2.7Е — II являются комплексными; они хранятся как пара вещественных чисел. • Subset-PL/1 не рассчитан на выполнение операций с исполь- зованием комплексных и мнимых чисел. 9.4. Константы и переменные Чтобы определить константу, нужно просто записать ее зна- чение. Если нужно воспользоваться какой-то величиной, не зная ее значения, то используется идентификатор, которому ставится в соответствие это значение. Любой идентификатор может быть использован, чтобы обозначить переменную (исключая зарезер- вированные слова в случае применения 48-символьного алфавита). Если не указано что-либо иное, предполагается, что имена переменных, начинающиеся с букв I, J, К, L, М и N, соответ-
316 Гл, 9, Введение в PL/1 ствуют двоичным числам с фиксированной точкой, а имена пере- менных, начинающиеся с любой другой буквы,— десятичным числам с плавающей точкой. Поэтому обычное предположение (в условиях умолчания) означает то, что переменной IKY соответствует двоичное число с фиксированной точкой; WKY соответствует десятичное число с плавающей точкой; #78 соответствует десятичное число с плавающей точкой. Предполагается, что разрядность десятичных переменных с плавающей точкой определяется шестью десятичными цифрами, а разрядность двоичных переменных с фиксированной точкой соответствует пятнадцати двоичным разрядам. Иногда эти предположения не соответствуют тому, что хотелось бы иметь. Программист, работающий на языке PL/1, может от- вергнуть эти определения по умолчанию для части программы, указав, что он хочет, в операторе DECLARE (ОБЪЯВИТЬ). Этот оператор имеет форму: DECLARE имя описатель, имя описатель, имя описатель; Для наглядности программы могут быть использованы пробе- лы, добавляемые в произвольном количестве к одиночному про- белу между словами, поскольку компилятор к ним нечувствите- лен. В операторе DECLARE можно специфицировать любое необходимое количество переменных. Поэтому можно записать DECLARE KMY FIXED (5, 3), IU79 BINARY (7, 2), X BINARY FLOAT REAL, Y CHAR (7); Если за именем переменной нет описателя, компилятор при- писывает переменной только те свойства, которые предполагают- ся в случае умолчания. Для спецификации строковых данных применяются описатели BIT (БИТОВЫЙ) или CHARACTER (СИМВОЛЬНЫЙ) (который может быть сокращен до CHAR); следом за этими описателями указывается длина (в скобках). Тогда запись вида Y CHAR (7)
9,4, Константы и переменные 317 определяет 7-байтовое поле для хранения символьной строковой переменной Y. Эквивалентна ей и такая запись: Y CHARACTER (7) Аналогичным образом запись В BIT (8) определяет В как строку битов, занимающую 8 двоичных разря- дов (т. е. один байт). Если же длина не указана, как в случае ВТМ BIT то компилятор предполагает длину, равную одному биту или одному байту. Для спецификации арифметических данных применяются сле- дующие описатели: DECIMAL (ДЕСЯТИЧНЫЙ) или BINARY (ДВОИЧ- НЫЙ); если ничего не указано, то предполагается описа- тель DECIMAL; FIXED (ФИКСИРОВАННЫЙ) или FLOAT (ПЛАВАЮ- ЩИЙ); в случае отсутствия указания предполагается описатель FLOAT; REAL (ВЕЩЕСТВЕННЫЙ) или COMPLEX (КОМ- ПЛЕКСНЫЙ); при отсутствии указания подразумевается описатель REAL. Разрядность указывается в форме (w, d) в случае данных с фиксированной точкой и в форме (w) для данных с плавающей точкой. Здесь w — это общее количество цифр (максимальное), допустимое для переменной (значащие цифры в случае числа с плавающей точкой), ad — количество дробных разрядов в деся- тичном или двоичном числе. Если значение d не записано, то ком- пилятор предполагает, что d = 0. Комплексное число представ- ляется как пара вещественных чисел, имеющих одинаковые описатели. Для каждого типа чисел компилятор имеет встроенную или подразумеваемую по умолчанию точность, которую он использует в том случае, если эта точность не указана в операторе DECLARE. Имеется также ограничение максимального размера чисел допу- стимого в компиляторе. Ниже приведены соответствующие значения: По умолчанию Максимум DECIMAL FIXED (5,0) (15,d) BINARY FIXED (15,0) (31 ,d) DECIMAL FLOAT (6) (16) BINARY FLOAT (21) (53) CHARACTER (1) (32767) BIT (1) (32767)
318 Гл. 9. Введение в PL/1 Здесь d может быть положительным или отрицательным. Деся- тичные числа с фиксированной точкой хранятся как упакован- ные десятичные поля. Двоичные числа с фиксированной точкой хранятся как полные слова. Все числа с плавающей точкой хра- нятся как полные слова, или же, если разрядность превышает подразумеваемую по умолчанию,— как двойные слова. Рассмо- трим следующие примеры: БА REAL FLOAT DECIMAL (9), ЕВ COMPLEX FLOAT BINARY (5), EC REAL FIXED DECIMAL (9, 4), ED REAL FIXED BINARY (8), EE FIXED BINARY, EF FIXED DECIMAL (4, -1); EA займет двойное слово, ЕВ — пару полных слов, ЕС — 5 байтов с предполагаемыми четырьмя дробными разрядами, ED — полное слово. Заметим, что при разрядности, равной 31, потребовался бы объем памяти точно такой же, как должен быть зарезервирован в этом случае. Однако в других вычислитель- ных машинах, отличных от IBM-360, дело обстоит иначе, так что программисту следует указывать действительно необходимую для него разрядность. ЕЕ задается с подразумеваемой разряд- ностью по умолчанию (15,0) и занимает полное слово. EF занимает 3 байта с десятичной точкой, подразумеваемой на одну позицию справа от числа. Таким образом, поле EF может содержать числа 12340 и 12350, но не число 12348, поскольку поле не имеет разряда единиц. • В Subset-PL/1 использование комплексных переменных недопустимо. Не разрешено использование ни описателя COMPLEX, ни описателя REAL. Всегда предполагается, что описатель есть REAL. 9.5. Данные, управляющие программой На рис. 9.1 переменная А неявно объявлена как десятичное число с плавающей точкой с разрядностью 6 цифр. Аналогич- ным же образом обстоит дело с переменными F и R. Переменная N неявно объявлена как двоичное число с фиксированной точкой с разрядностью 15 битов. В этой же программе используются еще три идентификатора: Р, Q и CMPD. Из их числа CMPD можно назвать скорее не идентификатором PL/1, а именем процедуры, по которому программа будет опознаваться операционной систе- мой OS, DOS или TOS. Это имя можно назвать внешним именем программы в том смысле, что оно не локализовано в программе. Все другие имена являются внутренними, поскольку они лока-
9.6. Арифметические выражения 319 лизованы внутри программы. Идентификаторы Р и Q называют константами типа метка. Они являются константами, посколь- ку они не изменяются в программе. В последующем мы позна- комимся с другими типами управляющих данных. Тем не менее в этой главе константы типа метка являются единственным типом идентификатора, с которым мы встретимся, отличным от внешних имен и переменных задачи. 9.6. Арифметические выражения Арифметическое выражение представляет собой произволь- ную комбинацию идентификаторов и констант, разделенных символами операций (+, — и т. п.) и круглыми скобками так, чтобы образовать имеющее смысл математическое выражение. Приведем примеры: X + 17.45 Y + (.018/Y) —7 — YU7 • Разрешается использование следующих операций: 1) одноместные + и —; 2) ** для возведения в степень; 3) ♦ для умножения и / для деления; 4) двуместные + и —. Поскольку в математике знаки + и — играют двоякую роль (с одной стороны, они используются при записи положительных и отрицательных чисел, а с другой — для обозначения операций сложения или вычитания) необходимо различать одноместные и двуместные операции. Одноместной операции не предшествует никакой идентификатор или константа, а двуместной предше- ствует. Поэтому в указанных выше примерах знак — перед циф- рой 7 является одноместным, а знак — перед членом YU7 — двуместным. Две звездочки, записанные рядом, рассматриваются как один символ и означают возведение первого операнда в степень, указанную во втором операнде. Например, 2**3 = 23 = 8 3**2 = З2 = 9 Если круглые скобки не определяют полностью порядок вы- полнения операций, одноместные операции выполняются первы- ми; следом за ними выполняются операции возведения в степень, причем порядок их выполнения в выражении — справа налево. Следующими выполняются операции умножения и деления в обыч- ном порядке (слева направо) и, наконец, в таком же порядке —
320 Гл. 9. Введение в PL/1 операции сложения и вычитания. Поэтому выражение —7 + .018/Y + 3 обрабатывается таким образом, как если бы оно было написано в виде ((-7) + (.018/V)) + 3 Описанные правила очень просты, но нужно быть вниматель- ным при написании выражений вроде 2**3**2 = 2** (3**2) = 2**9 = 512, поскольку (2**3)**2 = 8**2 = 64. В противоположность обычному математическому смыслу запись рядом двух символов не предполагает выполнение какой- либо операции. Поэтому запись вида YU7 (3 + X) считается не определенной. Если предполагается выполнение умножения, то обязательно должна быть указана обозна- чающая его звездочка: YU7* (3 + X) Также лучше избегать использования двух символов операций подряд. В частности, выражение YU7 + 3** - 7 + 4 лучше представить в виде YU7 + 3** (-7) + 4 Если в языке PL/1 вещественные и комплексные числа пред- ставлены в одном выражении, то вещественные преобразуются в комплексные числа с мнимой частью, равной нулю. Если числа с фиксированной и плавающей точкой присутствуют в одном выражении, то числа с фиксированной точкой преобразуются в числа с плавающей точкой. В случае когда имеются десятичные и двоичные числа, десятичные преобразуются в двоичные. При различной разрядности чисел компилятор оставляет разрядность всех членов выражения равной более высокой; при этом количе- ство цифр не должно превышать ту величину, которая может быть размещена в упакованном десятичном поле для IBM-360 (15 деся- тичных цифр), в двоичном слове (31 двоичный разряд) или в фор- мате числа с плавающей точкой с удвоенной точностью (14 шест- надцатеричных цифр). Хотя смешение в одном выражении чисел различных типов и допускается, программист обязан помнить, что компилятор
9.6. Арифметические выражения 321 должен вводить команды для осуществления требуемых пре- образований. А это связано с добавлением команд в объектной про- грамме и, следовательно, замедлением ее выполнения. Поэтому всегда следует помнить хорошее программистское правило: по возможности не смешивать различные типы чисел. Приводимые ниже примеры являются выражениями с пра- вильной формой записи: В**2 - 4*А*С (-В + DELTA) / (А + А) (А*В - C*D)* (А*С + B*D) При выполнении операции возведения в степень следует пом- нить о следующих специальных правилах: 1. Возведение нуля в нулевую или отрицательную степень воспринимается как ошибка и не выполняется. 2. При возведении нуля в положительную степень получается нуль. 3. Возведение ненулевого числа в нулевую степень дает единицу. 4. Возведение отрицательного числа в положительную пелую с фиксированной точкой степень осуществляется многократным умножением. 5. Возведение отрицательного числа в степень любого другого типа воспринимается как ошибка. 6. Возведение положительного числа в целую с фиксирован- ной точкой степень осуществляется многократным умножением; в случае любого другого типа показателя используются логарифмы. 7. Комплексный показатель степени допустим только в том случае, когда мнимая часть равна нулю; проведение вычислений при наличии показателя степени с ненулевой мнимой частью воспринимается как ошибка. 8. При возведении комплексного нуля в степень с показате- лем степени, имеющим вещественную часть, равную положи- тельной величине, и мнимую часть, равную нулю, получается нуль. Если в арифметическом выражении используется битовая строка, она преобразуется в двоичное полуслово и обрабатывает- ся как FIXED BINARY (15,0). Если в арифметическом выражении используется символьная строка, она может содержать допустимую константу, которая может быть представлена в форме числа типа FIXED или FLOAT, DECIMAL или BINARY, REAL или COMPLEX. Символьная строка преобразуется в форму содержащейся в ней константы и затем используется в арифметических операциях. 21 Зак. 15635
322 Гл. 9. Введение в PL/1 • В Subset-PL/1 преобразования символьных строк в ариф- метические данные и обратно не разрешаются. В то же время преобразования битовых строк в арифметические данные и обрат- но разрешены (так же, как и преобразования битовых и сим- вольных строк). 9.7. Операторы присваивания Операторы присваивания имеют форму метка: переменная — выражение Значение выражения преобразуется в форму переменной и заме- няет ее текущее значение. Наличие метки не обязательно, но дает возможность обращаться к данному оператору по имени. Можно привести такие примеры операторов присваивания: XI = —В/2; А = A*F; RADDR: N = N + 1; Для обозначения одного и того же оператора может быть использовано несколько меток; они должны быть разделены двоеточием. Примером подобного оператора может служить следующий: WDR: RADDR: N = N + 1; Вообще говоря, использование нескольких меток не предостав- ляет никаких преимуществ. Иногда нужно вычислить значение выражения и присвоить его не одной, а нескольким переменным. В подобных случаях просто следует записать каждую переменную слева от знака равенства, отделив ее от остальных переменных с помощью запятой. Например, выполнение оператора JHR: X, Y, Z = 0; сводится к присваиванию значения 0 переменным X, Y и Z. Это эквивалентно выполнению следующей совокупности операторов: JHR: X = 0; Y = 0; Z = 0; В этом случае предполагается отсутствие каких-либо выпол- няемых африметических действий, поскольку выполнение опе- раторов сводится к простой передаче данных в виде константы, равной 0 и хранящейся где-то в памяти, в три различные ячейки памяти.
9,7. Операторы присваивания 323 • Присваивание одного значения нескольким переменным не допустимо-в Subset-PL/1. Поэтому оператор вида А, В = 7 + Е; должен быть заменен двумя следующими операторами: А = 7 + + Е; В = А;. Упражнения № 21 1. Какие из приведенных ниже идентификаторов написаны правильно? (a) BATMAN (b) HORMET (с) #007 . (d) 7896 (е) DOLLAR® (f) AIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIS (g) B.C_D_E_F (h) /*RG (i) M@7H (j) PACKPIER (k) $325 (1) _E_R 2. Какие из указанных в упр. 1 идентификаторов могут быть использованы в качестве внешних меток? 3. Написать строки, получающиеся в каждом из следующих случаев: (a) 'AIN' 'Т' (Ь) '0010' (с) 'ООЮ'В (d) (4) 'J8' (е) (5) 'ОООНО'В 4. Применительно к упр. 3 определить, сколько байтов в рабо- чей программе будет занято в каждом из случаев? 5. Указать, какая из приведенных ниже констант является 1) символьной строкой, 2) битовой строкой, 3) имеет тип REAL или COMPLEX, FIXED или FLOAT, DECIMAL или BINARY, или же 4) не может рассматриваться как константа в языке PL/1. (a) 'ROLLS' (b) 'R R' (с) 45 (d) 0010.09 (е) 0010.09Е + 00 (f) 7 + 41 (g) 7ЕЗ - 2E4I (h) 100010111В 21»
324 Гл. 9. Введение в PL/1 (i) 200010020В (i) 1001Е + 4В (к) 123456.78Е + 34 (1) '010201'В 6. Сколько байтов оперативной памяти потребуется для запи- си каждой из допустимых констант, приведенных в упр. 5? 7. Если J = 4, К = 5, L = —3, то какие значения будут отправлены в память в следующих случаях: (a) NA = J*K; (b) NB = J/(—L); (с) NC = K**L; (d) ND = L**K; (e) NE = (((K + L)*J/2) + 2)/8; Считайте, что каждая переменная, указанная в левой части операторов присваивания, имеет разрядность, подразумеваемую по умолчанию. 9.8. Управление программой Обычно программа, написанная на языке PL/1, начинает исполняться с первого выполняемого оператора (т; е. с первого оператора, отличного от операторов вида PROCEDURE. DECLARE и т. п.). Последующие операторы программы выпол- няются в порядке следования. Оператор GO ТО метка; обеспечивает безусловную передачу управления на оператор с указанной меткой, начиная с которого выполняется новая последовательность операторов. Сам оператор GO ТО (ПЕРЕЙТИ НА) также может быть помеченным. Приведем примеры: GO ТО WDR; X7U: GO ТО Х8Р; Х8Р: X9R: GO ТО Р88; GOTO Р887; Последний случай иллюстрирует тот факт, что в языке PL/1 допускается написание слов GO ТО и в виде одного слова. Оператор имя-процедуры: PROCEDURE; должен быть первым оператором каждой программы на языке PL/1. Имя процедуры должно быть составлено в соответствии с правилами написания имен для данной операционной системы, т. е. необходимо, чтобы оно начиналось с букв А — Z; остальны-
9.8. Управление программой 325 ми символами имени могут быть буквы А — Z и цифры 0—9. Длина имени не может быть более семи символов. Примерами допустимых имен могут служить: PROC, А789006, B7Y8657, DF6 и т. п. Обычно оператор PROCEDURE включает также описатель OPTIONS (MAIN), указывающий, что выполнение должно начаться с первого выполняемого оператора процедуры. В операторе ON ситуация оператор; задается ситуация, которая может возникнуть, а может и нет, и оператор, который выполняется при возникновении ситуации. Здесь может быть задан только простой оператор без метки. Обычно в качестве оператора используется оператор GO ТО. Можно задать несколько возможных ситуаций, но мы рассмо- трим лишь одну: ENDFILE (КОНЕЦ ФАЙЛА). Ситуация ENDFILE возникает в том случае, когда в указанном входном файле достигается конец. Приведем такие примеры: ON ENDFILE (SYSIN) GO TO XYZ; ON ENDFILE (SYSIN) KLH = 999; ON ENDFILE (PAYFILE) GO TO TOTAL_PAY; Если имя файла не записано, предполагается стандартный входной файл системы SYSIN. Необходимо, чтобы оператор ON выполнялся только один раз. С его помощью указываются дей- ствия, которые должны выполняться по концу файла. Если обна- ружен конец файла, а оператор ON ENDFILE для этого файла не был выполнен, то выполнение программы прекращается. • В Subset-PL/1 в операторе ON ситуация в качестве опера- тора может быть указан только GO ТО. Оператор END; или END имя-процедуры; должен быть последним оператором в программе на языке PL/1. Он сообщает компилятору, что в программе операторов больше нет. Во время выполнения объектной программы оператор END обеспечивает передачу управления операционной системе. Оператор RETURN; (возврат) также может быть использован для того, чтобы сообщить операционной системе об окончании объектной про- граммы.
326 Гл. 9. Введение в PL/1 Выполнение оператора STOP; обеспечивает немедленное прекращение выполнения объектной про- граммы. Считается, что оператор STOP (останов) обеспечивает аварийное, а операторы RETURN или END — нормальное прекра- щение выполнения объектной программы. Типичными операторами управления в программе могут быть следующие Pl: PROCEDURE OPTIONS (MAIN); ON: ENDFILE (SYSIN) GO TO ENDING; P7: К = J/*BEGIN LOOP*/; GO TO P7; ENDING: XVY7.IU = K*K + 4; END Pl; 9.9. Ввод — вывод, управляемый списком В языке PL/1 существуют различные методы указания опера- ций ввода — вывода. Так, при вводе — выводе, управляемом списком, входной поток рассматривается как строка символов, в которой конкретные вводимые переменные разделены одним или большим числом пробелов. Прц выводе дацные располагают- ся таким образом, что впоследствии они могут быть введены в машину снова. Ввод данных обеспечивается с помощью оператора GET FILE (имя-файла) LIST (vlt . . ., vn); Если в операторе опущено FILE (имя-файла), то предполагается стандартный входной файл SYSIN. Тогда имеем GET LIST (vt, . . ., v^; Каждое vi обозначает переменную, значение которой должно быть прочитано. Данные читаются символ за символом с ввод- ного устройства и рассматриваются как строки символов. Пробел или запятая задают конец каждой переменной. При вводе оче- редной строки символов в память машины объектная программа преобразует ее в форму, объявленную для соответствующего идентификатора. Например, операторы DECLARE A FIXED (5,2); В FIXED (3,2); С FIXED (5,1); GET LIST (А, В, С);
9,10. Пример программы 327 обеспечат чтение карт с отперфорированными на них, скажем, следующими данными: 2.3 3.45 6.7, 89 —4.22 1.07 5 -3 4 В результате первого выполнения оператора GET получаем А = 002.30, В = 3.45, С = 0006.7, после второго выполнения — А = 089.00. В = —4.22, С = 0001.0 (заметим, что значение С усе- кается из-за ограниченности выделяемого числового поля), после третьего выполнения — А = 005.00, В = —3.00, С = 0004.0. Заметим, что при вводе — выводе, управляемом списком, границы карты игнорируются и вводимые данные обрабатываются как непрерывный поток. При выводе данных используется оператор PUT FILE (имя-файла) LIST (vf, . . ., vn); Если в операторе опущено FILE (имя-файла), то предполагается стандартное системное устройство вывода SYSPRINT. Границы строк или карт игнорируются; каждой вводимой переменной отводится столько места, сколько нужно. Переменные разделяют- ся пробелами. Ввод — вывод, управляемый списком, удобен в основном в тех случаях, когда программист не связан с форматом данных. Обычно это имеет место при проведении научных вычислений, и почти никогда при решении экономических задач. В полном PL/1, но не в подмножестве языка, слово COPY может быть добавлено к оператору GET. Это обеспечивает печать вводимых данных на SYSPRINT. Например, оператор GET LIST (A) COPY; обеспечивает чтение и преобразование переменной А во внутрен- нюю форму. Вместе с тем значение переменной А в том виде, как оно было воспринято на устройстве ввода, выдается на печать. ЗЛО. Пример программы Предположим, что проводится несколько наблюдений; резуль- таты наблюдений выражаются двух- или трехзначными целыми числами и требуется ввести эти числа и отпечатать а) число наблюдений, Ь) сумму результатов наблюдений и с) сумму квад- ратов результатов наблюдений. Эти данные требуются для вычи- сления среднего квадратичного отклонения. Программа может
328 Гл. 9. Введение в PL/1 быть такой: /♦PL1F — 02*/ S: PROCEDURE OPTIONS (MAIN); DECLARE COUNT FIXED (3,0), SUM FIXED (6,0), X FIXED (3,0), SQS FIXED (9,0); COUNT, SUM, SQS = 0; ON ENDFILE GO TO E; LOOP: GET LIST (X); COUNT = COUNT + 1; SUM = SUM и- X; SQS = SQS + X*X; GO TO LOOP; E: PUT LIST (COUNT, SUM, SQS); END S; При использовании подмножества языка PL/1 необходимо, чтобы операторы DECLARE следовали сразу же за операторами PROCEDURE ранее любых других операторов. Для того чтобы осуществить компиляцию, редактирование связей и выполнение этой программы в системе DOS, надо распо- ложить перфокарты в колоде следующим образом: // JOB имя-задания // OPTION LINK PHASE имя-фазы,* // ЕХЕС PL1 исходная программа /• // ЕХЕС LNKEDT // ЕХЕС данные для объектной программы /♦ /& В системе OS перфокарты необходимо расположить в следу- ющем порядке: //имя-задания JOB // ЕХЕС PL1LFGLG
9.11. Операции сравнения 329 //PL1L.SYSIN DD * исходная программа /♦ //GO.SYSIN DD ♦ данные для объектной программы /♦ 9.11. Операции сравнения Операции сравнения записываются в форме операнд! операция операнд2 В качестве операндов могут использоваться арифметические данные, строки символов или. строки битов. Допускается исполь- зование восьми операций < = п = Если какой-либо операнд является комплексным, то возмож- но использование только операций = иП = . Если сравниваются операнды различных типов, то строки битов преобразуются в строки символов, строки символов — в арифметическую форму, фиксированные — в плавающие, десятичные — в двоичные, веще- ственные — в комплексные. Сравнение арифметических данных или строк, преобразованных в арифметическую форму, является алгебраической операцией. Сравнение строк символов является логической операцией, при этом в правой части более короткой строки символов добавляются пробелы, а в правой части укоро- ченной битовой строки — нули. е В случае использования Subset-PL/1 преобразование стро- ки символов в арифметическую форму не допускается. Результатом выполнения операции сравнения является строка битов длины один со значением '1'В, если отношение истинно, или 'О'В, если отношение ложно. Операндами могут быть выражения или же просто перемен- ные или константы. Пусть мы имеем DECLARE X FIXED (3,0), Y FLOAT (6), Z COMPLEX (6), H CHARACTER (5), В BIT (4);
330 Гл. 9. Введение в PL/1 X = -15; Y = 7.8; Z = 7.8; Н = 'CRTR5'; В = '1101'В; Тогда следующие отношения истинны! Y > X Z = Y Н > 'ABCDE' В ~ = '111ГВ Следующие отношения ложны: X = Y В = '111ГВ Н П > 'А' н>в Следующие отношения являются недействительными и приве- дут к выдаче объектной программой сигнала об ошибке: Z > Y Z “]> X Если строка символов преобразуется в операнд арифметиче- ского типа, то строка должна включать арифметическое значение точно в такой же самой форме, как при вводе — выводе, управ- ляемом списком. Поэтому любая попытка сравнить Н с X приве- дет к возникновению сигнала об ошибке, поскольку переменная Н не содержит арифметического значения. Однако, если мы имеем Н = '—34' то сравнение Н и X разрешено для полного языка PL/1. Результат сравнения, может быть использован двумя путями. Он может быть присвоен переменной в обычном операторе при- сваивания. Например, в результате выполнения оператора В = Y = Z В получит значение '1000'В, поскольку отношение истинно и дли- на переменной В равна четырем битам. В случае В = Y>X также имеем В = '1000'В. Присутствие знака операции сравнения справа от знака равенства в операторе присваивания заставляет компилятор выполнять сравнение.
9,12. Ввод — вывод, управляемый данными 331 Сравнение может присутствовать в операторе IF, который в этом случае записывается в следующей форме: IF сравнение THEN Si; ELSE s2; где Si и s2 — одиночные операторы. Если сравнение истинно, то выполняется оператор s2, а оператор, следующий за ELSE, пропускается. Если отношение ложно, то оператор Si пропускает- ся, а оператор s2 выполняется. Следует, отметить, что конструк- цию ELSE, а именно «ELSE s2» можно опускать. Заметим также, что перед словом THEN не должно стоять никаких знаков пре- пирания- Приведем такие примеры: IF X > Y THEN В = '1100'В; ELSE В = '0000'В; IF В = 'ИЮ'В THEN; ELSE Н = 'ABCD7'; IF Y = Z THEN В = 'llll'B; IF X > Y THEN IF Y = Z THEN В = '0001'В; ELSE В = 'СНОСИВ; ELSE В = '0010'B; Во втором примере оператор, следующий за словом THEN, назы- вают пустым оператором, поскольку он не вызывает никакого действия. Заметим, что в третьем примере конструкция ELSE опущена. Это эквивалентно написанию просто ELSE;. В послед- нем примере оператор si сам является оператором IF. Глубина вложений операторов IF может быть произвольной; каждое слово ELSE образует пару с непосредственно предшествующим словом THEN. Часто операторы st или s2 (или оба) оказываются операторами GO ТО. Необходимо помнить, что только один оператор может следовать за словом THEN и только один — за словом ELSE. Поэтому оператор GO ТО часто используется для передачи управления на некоторый участок программы, где должна выпол- няться соответствующая группа операторов. 9.12. Ввод — вывод, управляемый данными • Рассматриваемые в этом разделе операторы не могут быть использованы в Subset-PL/1. Операторы GET FILE (имя-файла) DATA; GET FILE (имя-файла) DATA (vt, . . ., vn); PUT FILE (имя-файла) DATA (vt, . . ., vn); могут использоваться для чтения или записи данных. Если часть оператора FILE (имя-файла) опущена, то предполагается SYSIN Для оператора GET и SYSPRINT для оператора PUT. При пер-
332 Гл. 9. Введение в PL/1 вой форме оператора GET, где переменные не указываются, мас- сив читается как строка символов, и входные данные перфори- руются в форме N=27, R—8.1,А=2.4 В=1.7Е-3; Переменные, новые значения которых должны быть введены, перфорируются во входной последовательности и за каждой из них следует знак равенства и новое значение. Переменные разделяются запятыми или пробелами. Набор входных данных должен заканчиваться точкой с запятой. • При использовании 48-символьного алфавита кодом точ- ки с запятой на перфокартах является комбинация пробивок 11—8—6. Ёсли пишется список переменных, то новые значения могут быть присвоены только этим переменным из списка. Любая попыт- ка присвоить новое значение переменной, не указанной в списке, приводит к сигналу об ошибке. Следует отметить, что нет необ- ходимости присваивать новые значения каждой переменной в списке. Поэтому оператор GET DATA (А, В, С, D); мог бы считать, скажем, следующие входные данные: А = 78 С = 13 В = 12; Обратите внимание на то обстоятельство, что порядок размещения переменных во входных данных может отличаться от порядка размещения, принятого в списке данных. Оператор PUT обеспечивает вывод каждой переменной в спи- ске. Элементы разделяются пробелами, и в конце ставится точка с запятой. Так же как в случае ввода — вывода, управляемого списком, ввод и вывод выполняются как бы непрерывным потоком сим- волов без учета границ строк или самих карт. Поэтому один набор входных данных может оказаться записанным на несколь- ких картах и вместе с тем несколько наборов входных данных могут быть записаны на одной. Ввод — вывод, управляемый данными, требует значительного объема оперативной памяти в рабочей программе. Необходимый объем оперативной памяти несколько уменьшается, если списки переменных задаются во всех операторах GET. • К оператору GET может быть добавлена конструкция COPY (что не допускается в Subset-PL/1). Она аналогична рас- смотренной в разделе о вводе — выводе, управляемом списком. Наличие COPY обеспечивает выдачу входных данных на стан- дартное устройство вывода — SYSPRINT.
9.14. Ввод — вывод, управляемый редактированием 333 9.13. Оператор DISPLAY Оператор DISPLAY (выражение) обеспечивает преобразование выражения, заключенного в круг- лые скобки, в строку символов и выдачу его на печать с помощью пишущей машинки на пульте машины. Длина строки не может быть свыше 72 символов. Процесс вычислений продолжается и во время выдачи на печать. Поскольку пишущая машинка имеет весьма низкое быстродействие, при составлении программы целесообразно использовать оператор DISPLAY только для обще- ния с человеком-оператором. Арифметические данные (речь не идет о Subset-PL/1, где не допускается преобразование ариф- метических данных в символьные строковые данные) преобра- зуются в строку символов. Несколько элементов данных могут быть объединены в одну строку символов с помощью операции сцепления (||). Например, в результате выполнения оператора DISPLAY ('MESSAGE' || XZW); где XZW = '784', на пульте будет получено сообщение MESSAGE 784 Если мы напишем оператор DISPLAY (выражение) REPLY (переменная); то вычислительная машина перейдет на режим ожидания, пока сообщение печатается и оператор у пульта отвечает. Переменная должна быть символьной строковой переменной длиной не свыше, чем 72 байта. Если оператор машины вводит менее 72 символов, остальная часть поля, отведенного под эту переменную, будет заполнена пробелами. Возобновление вычислений возможно толь- ко по получении машиной ответа. Поэтому это особенно медленная операция. 9.14. Ввод — вывод, управляемый редактированием При использовании ввода — вывода, управляемого списком или данными, компилятор сам выбирает наиболее удобную форму выходных данных, иногда же программисту необходимо указать точный формат заранее. В языке PL/1 это можно выполнить двумя способами: с помощью ввода — вывода записей (этот способ будет рассмотрен в следующей главе) и с использованием ввода — вывода, управляемого редактированием. Форма для последнего
334 Гл. 9. Введение е PL/1 при вводе такова: GET FILE (имя-файла) EDIT (vb . . ., vn) (формат!, . . ., формат^ [COPY); Если в записи опущена конструкция FILE (имя-файла), то пред- полагается SYSIN для ввода и SYSPRINT для вывода. В случае когда задано COPY, входные данные воспроизводятся в точно- сти с помощью SYSPRINT. • Использование COPY в Subset-PL/1 не разрешается. Оператор вывода имеет вид PUT FILE (имя-файла) EDIT (vB . . ., vn) (форматА, . . ., форматп); Предполагается, что все вводимые и выводимые данные пред- ставляют собой поток символов. Преобразование из внешней фор- мы во внутреннюю (и наоборот) определяется соответствующей спецификацией формата. Как и в случае ввода — вывода, управ- ляемого списком, порядок размещения переменных в списке соответствует тому порядку, в котором присваиваются вводимые значения. Для арифметических данных применяются следующие спецификации формата: F (w). Входное поле содержит w символов, соответствующих десятичному числу с фиксированной Точкой. Если десятичная точка не перфорируется, то предполагается, что число целое. Перед отрицательным числом должен стоять знак минус. При выводе данные перфорируются как числа целого типа. Десятич- ная точка не перфорируется. F (w, d). Если при вводе данных десятичная точка не перфори- руется, то по умолчанию она стоит непосредственно перед послед- ней (считая справа) из d десятичных цифр в w-символьном поле. Если же десятичная точка отперфорирована, то заданное d не имеет значения. При выводе данных десятичная точка перфори- руется всегда. В этом случае для записи цифр после десятичной точки отводится d десятичных разрядов, а для записи цифр до деся- тичной точки — (w — d — 1), если число положительное, или же (w — d — 2) разрядов, если число отрицательное. F (w, d, s). При вводе данных считываемая величина перед преобразованием умножается на 10s. При выводе число, хранимое в оперативной памяти, умножается на 10~8.
9.14. Ввод — вывод, управляемый редактированием 335. Рассмотрим пример R = 7.812; S = -2130; Т = 45.; PUT EDIT(R,S,T)(F (6,3),F (7,3,3), F (5)); GET EDIT(R,S,T)(F (6,3),F (7,3,3), F (5)); Выводимые данные будут состоять из 18 символов Ь7.812Ь—2.130ЬЬЪ45 После ввода этой цепочки символов значения R, S и Т сохра- нятся прежними. Для внешних полей с плавающей точкой предусмотрено исполь- зование двух форматов. Е (w, d). Внешний носитель содержит число с плавающей точкой. При вводе допустимы следующие формы записи чисел: +1.234Е+07 М.234Е07 М.234Е7 bl.2344-7 —1.234Е—07 b—1234Е—7 Ь—1234—7 —1.234—07 Требуется, чтобы перед показателем степени присутствовал по меньшей мере хотя бы один из символов: Е, + или —. Если десятичная точка не перфорируется, то количество десятичных разрядов определяется форматом. При выводе показатель степени всегда записывается с помощью четырех символов в форме Е ± хх и число печатается с d дробными десятичными разрядами. Знак числа (пробел или минус) предшествует десятичной точке. Число располагается справа в w-символьном поле. Если число положи- тельное, то оставлять места для знака (слева) не требуется. Форма выводимых данных эквивалентна спецификации Е (w, d, d 4- 1). Е (w, d, s). При вводе данных s во внимание не принимается. Если десятичная точка в числе не задана, то подразумевается, что она расположена перед последними d цифрами числа. Если десятичная точка задана, то именно она, а не d, определяет вели- чину числа. При выводе для записи числового значения выде- ляется s — d позиций перед десятичной точкой и d позиций после- Десятичной точки. Показатель степени всегда записывается с помощью четырех символов в форме Е ± хх. Знак минус пред- шествует самой левой цифре отрицательных чисел.
336 Гл. 9. Введение в PL/1 В нашем последнем примере оператор PUT EDIT (R,S,T)(E (10,4),Е (10,2),Е (10,0,2)); обеспечит получение следующих выходных данных: 7.8120E+00b—2.13E+03bbbb45.E+00 Использование значении w больших, чем минимально необхо- димые, позволяет улучшить читабельность полученного резуль- тата. Допускается использование также следующих спецификаций формата. В (w). Строка символов длиной w считывается и преобразуется во внутреннюю строку битов. При выводе, строка битов преоб- разуется в строку символов из нулей и единиц, расположенных слева в выводимом поле. Правая часть поля дополняется пробе- лами, если длина строки битов меньше w. В. Этот вид спецификации используется только при выводе; значение w предполагается равным длине выводимой строки битов. X (w). При вводе w символов во внимание не принимаются. При выводе добавляется w пробелов. Заметим, что эта специ- фикация формата не соответствует ни одному*элементу в списке переменных. A (w). Значение строки символов длины w присваивается символьной переменной. Если переменная содержит больше, чем w символов, то она справа дополнится нужным числом пробелов. Если переменная содержит меньше, чем w символов, справа производится усечение вводимого поля. При выводе переменная располагается слева в поле. Правая часть поля дополняется про- белами. Выводимая переменная должна иметь тип строки сим- волов. А. Такая спецификация применяется только при выводе. Зна- чение w берется равным длине переменной, имеющей тип строки символов. В список переменных могут также быть включены строки символов, заключенные в кавычки. Они обрабатываются анало- гично переменным типа строки символов; разница состоит лишь в том, что здесь отсутствует имя соответствующей переменной
9.14. Ввод — вывод, управляемый редактированием 337 Например, в результате выполнения следующих операторов: DECLARE CH CHAR (4), BI BIT (4); CH = '2RE = ' ; BI = '0011'В; PUT EDIT (CH, BI, 'CNST') (A (6), B, A); получаем 2RE = bbOOHCNST Комплексные переменные могут быть специфицированы таким образом: С (вещественная-спецификация) С (вещественная-спецификация!, вещественная-специфика- ция2) Если задана только одна спецификация, то она используется и для вещественной и для мнимой частей. Если же спецификаций две, то первая используется для вещественной части, а вторая — для мнимой. Следует иметь в виду, что задаваться могут только спецификации Е и F. • В подмножестве языка PL/1 использование форматов С не разрешается. Повторение. Если имеются, скажем, форматы Е (10,4), Е (10,4), то запись может быть сделана более экономной путем указания коэффициента повторения (заключенного в круглые скобки) перед спецификацией. Следовательно, запись форматов в виде (2) Е (10,4) эквивалентна записи Е (10,4), Е (10,4). Косвенные элементы форматов. Иногда весь формат или часть формата используется в нескольких операторах GET или PUT. Можно избежать повторной записи спецификаций путем написа- ния В(метка) в формате, где метка является меткой оператора FORMAT. Оператор FORMAT имеет следующий вид: метка: FORMAT (формат!, . . ., форматт); Таким образом, допустимы следующие операторы: PUT EDIT(R,S,T)(R (FMLB),F (5)); GET EDIT(R,S,T)(R(FMLB),F(5,0)); FMLB: FORMAT (F (6,3),F (7,3,3)); Спецификация косвенных элементов формата может включать все спецификации или же только часть из них в зависимости от необ- 22 Зак 15635
338 Гл. 9. Введение в PL/1 ходимости. В операторе может быть использовано любое нужное количество спецификаций типа R. Выражения. При написании форматов допускается, чтобы параметры w, d и s были выражениями. Поэтому возможно изме- нение размера поля в программе. 9.15. Печать файлов Если выводимый файл поступает на печатающее устройство, то при наличии определенных дополнительных спецификаций может быть осуществлено управление подачей бумаги. При любом выводе, управляемом данными, списком или редактированием, в операторе PUT можно записать что-нибудь одно из следующего набора: PAGE PAGE LINE (выражение) SKIP SKIP (выражение) LINE (выражение) Если выражение записано, оно преобразуется в целое число. Если оно получается меньше единицы, то берется равным единице. Использование слова PAGE предполагает прогон бумаги до пер- вой печатаемой строчки на следующей странице. SKIP обеспе- чивает печать с начала следующей строки. SKIP (выражение) обеспечивает пропуск строк, число которых равно значению выра- жения без единицы, перед печатью следующей строки. Если пропуск вызывает движение бумаги за пределы страницы, то SKIP эквивалентно по своему действию PAGE. LINE (выражение) вызывает движение бумаги к указанной выражением строке. Поэтому действие LINE (5) сводится к тому, что следующей строкой должна стать строка 5 печатаемой страницы. Эти пере- мещения бумаги происходят до того, как произойдет печать дан- ных, специфицированных при помощи оператора PUT. При выводе, управляемом редактированием, любая из выше- приведенных возможностей может быть также включена в спе- цификацию формата. Это позволяет печатать более чем одну строку с помощью единственного оператора PUT. Например, оператор FORMAT(SKIP(2),F(6,3),F(8),SKIP(2),F(5)); обеспечивает пропуск одной строки, печать двух элементов дан- ных, пропуск другой строки и затем печать еще одного элемента данных.
9.15. Печать файлов 339 Во всех случаях выдачи файлов на печать место первого сим- вола на каждой строке не занимается выводимыми данными, оно используется для управления движением бумаги. Бумага продвигается перед печатью, причем характер движения опре- деляется первым символом в строке; этот символ может быть 1 начало новой страницы; пробел перевод строки; О перевод двух строк; — перевод трех строк; + блокировка перевода. Не следует предполагать, что в начале выполнения программы бумага находится в начале страницы. Упражнения № 22 1. Изменить программу, приведенную в разд. 9.10, таким образом, чтобы предусмотреть также печать среднего значения и дисперсии. 2. Напечатать таблицу значений х и у, где У = 2х24~3 для х<0 3 —4х для 0<х<;2 3 —2х2 для х> 2 Значения х изменяются в диапазоне от —1 до 4-3 с шагом .01. 3. Изменить упр. 2 таким образом, чтобы шаг по х брать рав- ным .05 всякий раз, когда разница между двумя последними зна- чениями у становится менее .1. 4. При перфорации колоды перфокарт значение х записы- вается в колонках 1—10, а значение у — в колонках 11—20, причем оба числа пишутся в формате 999999.9999 и десятичная точка не перфорируется. Составить программу чтения этих карт, предусмотрев печать значений а, b и г из разд. 2.8. 5. Ввести значения коэффициентов уравнения ах2 4- Ьх 4- с = = 0, где а, Ъ и с перфорируются на карте в формате Е (18, 8), и попытаться решить уравнения при х = .00, .01, .02 и т. д. Для каждого значения х вычислить f (х) = ах2 4- Ьх 4- с. Если полу- чены два последовательных значения функции f (х) с разными знаками, то можно сказать, что корень «локализован». Затем последовательно пробовать значения х между двумя найденными значениями до тех пор, пока корень не будет локализован с точ- ностью до .001. Напечатать значения коэффициентов и корня. Если в диапазоне от 0 до 10 отыскать значения корня не удалось, напечатать значения коэффициентов и сообщение ЗНАЧЕНИЯ КОРНЕЙ НЕ НАЙДЕНЫ. 22*
340 Гл. 9» Введение в PL/1 6. Предположим, что переменные В и С описаны как FIXED (3, 0). Написать программу чтения значений В в колон- ках 1—3 перфокарт колоды и предусмотреть печать значений В и С = 2В — 1 на одной и той же строке. Воспользоваться выражением для спецификации формата, чтобы значение С печа- талось с фиксированной точкой и отстояло точно на два пробела от конца значения В. Десятичные точки на печать не выводить. 7. Изменить программу, составленную в соответствии с пре- дыдущим условием, таким образом, чтобы предусмотреть печать десятичных точек в значениях переменных В и С.
Глава 10 КАК ПИСАТЬ ПРОГРАММУ НА ЯЗЫКЕ PL/1 10.1. Встроенные функции Необходимость в проведении определенных типов вычисле- ний, таких, как извлечение квадратного корня, вычисление зна- чений логарифмов чисел, определение абсолютных значений и т. п., встречается настолько часто, что для программистов, занимаю- щихся программированием на языке PL/1, были разработаны специальные средства реализации этих функций в программах. Программисту достаточно только написать оператор Y = SQRT (X); и компилятор идентифицирует SQRT как имя специальной функ- ции. После этого набор команд на машинном языке, предназна- ченных для вычисления значений квадратных корней, будет автоматически введен в программу. Для этой функции аргу- ментом может быть любое неотрицательное число с плавающей точкой. Так как функция определена и для комплексных чисел, можно использовать эту функцию даже в случае комплекс- ного х, получая при этом главное значение квадратного корня. Как и в любом операторе присваивания, результат будет пре- образован с учетом основания системы счисления, типа и точности представления Y. В качестве аргумента можно использовать выражение. Функции могут быть использованы в любом месте программы, где имя переменной может быть использовано при написании выражений. Список некоторых часто встречающихся функций, встроен- ных ъ язык PL/1, приводится в Приложении Е. Давайте рассмот- рим некоторые из них. Функция LOG (х) обеспечивает вычисление натурального логарифма числа х. Полу- чающийся при этом результат — это переменная с плавающей точкой независимо от точности аргумента. Аналогично, функция LOGlO(x)
342 Гл. 10. Как писать программу на языке PL/1 обеспечивает вычисление логарифма х при основании 10. Если аргумент записывается в радианах, то функция SIN (х) обеспечивает вычисление значения синуса х. Вместе с тем, если аргумент указывается в градусах, то используется функция SIND (х). Функция MAX (xi, ..., хп) обеспечивает вычисление максимального значения х из совокуп- ности заданных значений х и получение результата в форме, совпадающей с формой аргументов. Когда аргументы различаются между собой по типу, результат получится типа FLOAT (с пла- вающей точкой), если используемые аргументы имеют типы FIXED (с фиксированной точкой) и FLOAT, и типа BINARY (двоичный), если аргументы имеют типы BINARY и DECIMAL (десятичный); при этом обеспечивается разрядность не меньшая, чем число знаков в самом длинном аргументе. Аргументы для функции МАХ должны быть типа REAL, поскольку для ком- плексных чисел понятие наибольшего не определяется. Функция HIGH(n), где п — десятичная целая константа, обеспечивает получение символьной строки длиной п, причем каждый байт является шестнадцатеричным FF. В качестве аргумента некоторой функции может быть исполь- зована другая функция. Например, при необходимости извлече- ния квадратного корня из суммы ех + е-х мы можем написать Y = SQRT (EXP (X) + EXP (-Х)); Следует помнить, что аргументы функций всегда заключаются в круглые скобки. 10.2. Оператор ON Оператор ON (при) записывается в следующих формах* ON ситуация [SNAP] оператор ON ситуация SYSTEM;
10.2, Оператор ON 343 где в качестве оператора может использоваться лишь одиночный оператор, который не может быть оператором PROCEDURE, RETURN, FORMAT, DECLARE или END. • В Subset-PL/1 в качестве оператора должен использоваться оператор GO ТО или пустой оператор. Если оператор задан, то он выполняется всякий раз при возникновении указанной ситуации. Если записано слово SYSTEM, то имеет место стандартная реакция системы. Если записано слово SNAP (квадратные скобки указывают на то, что его присутствие не обязательно), то печатается, или, как иногда говорят, «фотографируется», определенная инфор- мация о состоянии программы,позволяющая следить за ее выпол- нением и полезная для отладки. Выдача этой информации на печать происходит перед выполнением оператора. Полный список возможных ситуаций приводится в Приложе- нии Е. Следующие ситуации относятся к вводу — выводу. ENDFILE (имя-файла) [конец-файла (имя-файла)]. Эта ситуа- ция возникает при попытке считать что-либо находящееся за пре- делами последней записи данных в указанном файле. Реакция системы: сигнализация и возбуждение ситуации ERROR (ситуа- ции ОШИБКА). ENDPAGE (имя-файла) [конец-страницы (имя-файла)]. Эта ситуация возникает при выполнении оператора PUT EDIT, если производится попытка начать печать новой строки после послед- ней на данной странице. После возврата управления оператору PUT EDIT слова PAGE, LINE или SKIP игнорируются. Реакция системы: начинает печататься новая страница. TRANSMIT (имя-файла) [передача (имя-файла)]. Эта ситуа- ция возникает из-за наличия устойчивой ошибки при выпол- нении операций ввода, что может приводить к неправильному чтению некоторых данных. Реакция системы: сигнализация и возбуждение ситуации ERROR. При вводе с использованием оператора GET ситуация возникает при каждом присваивании элементу данных значения, которое предполагается неправиль- ным в связи с ошибкой в передаче. UNDEFINEDFILS (имя-файла) [файл не определен (имя- файла)]. Эта ситуация возникает при попытке использовать файл, который не определен. Реакция системы: сигнализация и возбуж- дение ситуации ERROR.
344 Гл» 10. Как писать программу на языке PL/1 NAME (имя-файла) [имя (имя-файла)]. Эта ситуация может возникнуть при выполнении оператора GET DATA, если обна- руживается неправильное имя данных. Реакция системы: сигна- лизация и игнорирование вводимого поля. К числу системных ситуаций относятся следующие: FINISH (Окончание). Эта ситуация возникает при окончании выполнения процедуры. Реакция системы: окончание программы. Эта ситуация возникает при выполнении операторов RETURN, END или STOP. ERROR (Ошибка). Эта ситуация возникает в том случае, когда появление какой-либо ошибки вызвало окончание программы. Реакция системы: возбуждение ситуации FINISH. Вычислительными ситуациями являются следующие: CONVERSION (Преобразование). Эта ситуация возникает при преобразовании данных типа строки символов, написанной с ошиб- кой. Результат не определен. Реакция системы: сигнализация и возбуждение ситуации ERROR. Ситуация возникает при каждом появлении неправильного символа в строке. FIXEDOVERFLOW (Переполнение с фиксированной точкой). Эта ситуация возникает при выполнении арифметических операций над числами с фиксированной точкой, когда получающийся результат для типа FIXED BINARY превышает 31 бит и для типа FIXED DECIMAL превышает 15 десятичных цифр. Резуль- тат усекается слева. (Это означает, что старшие значащие цифры теряются.) Реакция системы: сигнализация и продолжение счета. OVERFLOW (Переполнение). Эта ситуация возникает, если порядок числа с плавающей точкой превышает максимально допустимый порядок, определяемый реализацией языка. Резуль- тат не определен. Реакция системы: сигнализация и возбужде- ние ситуации ERROR. SIZE (Размер). Эта ситуация возникает, когда поле резуль- тата оказывается недостаточным для записи всего результата, что приводит к потере старших значащих цифр числа. Результат не определен. Реакция системы: сигнализация и возбуждение ситуации ERROR. UNDERFLOW (Исчезновение). Эта ситуация возникает, когда порядок числа с плавающей точкой меньше допустимого мини-
10,2. Оператор ON 345 мума, определяемого реализацией языка. Результат равен нулю. Реакция системы' сигнализация и продолжение счета. Ситуация не возникает при вычитании равных чисел. ZERODIVIDE (Деление на нуль). Эта ситуация возникает при попытке разделить на нуль (при этом не различаются случаи деления с фиксированной и плавающей точкой). Результат не опре- делен. Реакция системы: сигнализация и возбуждение ситуации ERROR. Иногда у программиста может возникнуть необходимость игнорировать ошибки определенного рода и распознавать ошибки иного рода. В начале программы автоматически устанавливается режим игнорирования следующих трех ситуаций: SIZE SUBSCRIPTRANGE CHECK (последние две — диапазон индексов и проверка — мы не рас- сматривали). Реакция системы на каждую из этих ситуаций может быть «включена» в программе. Реакция на ситуации UNDERFLOW OVERFLOW ZERODIVIDE CONVERSION FIXEDOVERFLOW обычно «включена», хотя и может «выключаться» программистом. Реакция на все остальные ситуации включена всегда и не под- властна прогр аммисту. Программист включает реакцию на ситуацию указанием имени этой ситуации в круглых скобках перед меткой оператора, причем после скобок (перед меткой) ставится двоеточие. Например, (SIZE): Р78: Y = (X — 3)* 4; Если реакция должна быть выключена, нужно добавить к имени ситуации буквы NO в качестве приставки. Тогда запись вида (NOOVERFLOW, SIZE): Р: Y = 3 + X; обеспечивает реакцию на ситуацию SIZE и отсутствие реакции на ситуацию OVERFLOW. Если имя ситуации записано перед оператором PROCEDURE, то оно относится ко всей процедуре. Если имя ситуации записано перед оператором IF, то оно остается в силе до конца этого оператора. Если же имя ситуации записано перед простым оператором, оно относится только к нему. Дей-
346 Гл» 10. Как писать программу на языке PL/1 ствие приставки NO может быть отменено, если написать имя ситуации непосредственно перед нужным оператором. Тогда в случае (NOOVERFLOW): PR: PROCEDURE; (OVERFLOW): Y = 76.4* (X + 1); возможна реакция на ситуацию OVERFLOW только для одного оператора в процедуре. Набор операторов, выполняемых как результат возникновения ситуации, указанной в операторе ON, обрабатывается компиля- тором как миниатюрная процедура. Поэтому, если задано ON ZERODIVIDE GO ТО ACC; ACC: Y = 0; . . . END ACC; можно закончить программу ACC операторами END или RETURN и управление будет передано на оператор, который вызвал появ- ление ошибки. В большинстве случаев передача управления на участок программы, где возникла ошибка, пользы не принесет, если причина ошибки не устранена. Оператор SIGNAL ситуация; выполняемый в любом месте программы, вызывает немедленное возбуждение указанной в нем ситуации. Эта возможность позво- ляет существенно упростить процесс отладки сложной программы. Программист может также ввести свои собственные ситуации с помощью оператора ON CONDITION (идентификатор)... Возникновение таких ситуаций может задаваться только в операторе SIGNAL. Стандартная реакция системы: сигнали- зация и продолжение счета. В языке PL/1 указание ситуаций в операторе ON обеспечивает возможность обработки необычных ситуаций без замедления выполнения объектной программы. В большинстве случаев про- граммист предпочтет согласиться со стандартной реакцией системы для всех ситуаций и своих указывать не будет.
10.3. Логические операции . 347 10.3. Логические операции Предположим, что мы имеем переменные типа строки битов DECLARE ВА BIT (4), ВВ BIT (4), ВС BIT (8); и были заданы операторы ВА = 'ООН'В; ВВ = '0001'В; Теперь, если мы запишем оператор ВС = ВА + ВВ; то строки битов будут обрабатываться как двоичные целые числа и получится значение ВС, равное ВС = 'ОЮООООО'В Для выполнения операции переменные В А и ВВ преобразуются в тип BINARY FIXED (15,0) с добавлением к ним по 12 нулей. После выполнения сложения происходит обратное преобразова- ние. Аналогично в результате выполнения оператора ВС = ВА*ВВ; переменная ВС оказывается равной '00000000'В, поскольку если переменной ВА присвоено значение 3000 (в шестнадцатеричной системе), а переменной ВВ — значение 1000 (также в шестнадца- теричной системе), то их произведение равно 0300 0000. Но при разрядности (15,0) для представления результата — значения переменной ВС — остается только правая половина произведения, а после преобразования в тип BIT (8) — только две левые шест- надцатеричные цифры 00. Приведенные выше примеры говорят о том, что при выполне- нии элементарных арифметических операций со строками битов или строками символов требуется соблюдать определенную осто- рожность. И в то время как арифметические данные наиболее удобны для выполнения операций сложения, умножения и т. п., символьные данные наиболее целесообразно использовать для хранения имен и проведения с ними различных манипуляций, а также при выполнении операций ввода — вывода. В то же время применение строк битов представляется идеальным при выполнении логических операций И, ИЛИ и НЕ. Так, в резуль- тате выполнения операции ВС = ВА & ВВ;
348 Гл. 10. Как писать программу на языке PL/1 переменной ВС присваивается значение 'ОООЮООО'В, а в резуль- тате выполнения операции ВС = ~]ВА; переменная ВС оказывается равной 'НОООООО'В. Заметим, что переменная “1ВА есть четырехбитовая строка, которая расши- ряется до восьми битов путем добавления четырех нулей. Посколь- ку разрядность переменной ВА равна четырем битам, то же самое можно сказать и о разрядности пВА. При выполнении операции ИЛИ в случае ВС = ВА | ВВ; переменной ВС присваивается значение 'ООНОООО'В. Операция сцепления может выполняться при любых строковых данных. В случае строк битов в результате выполнения операции сцепле- ния две строки объединяются в одну. Поэтому, если мы имеем ВС = ВА || ВВ; то переменной ВС присваивается значение '00110001'В. Логические операции могут встречаться в тех выражениях, в которых производятся и арифметические вычисления. Пусть имеется, скажем, такой фрагмент программы: DECLARE ВА BIT (4), ВВ BIT (4), СА FIXED BINARY (31,0), СС FIXED BINARY (31,0); LA: СА = 345; LB: СС = СА — 138; ВА = '0110'В; ВВ = '0001'В; IF СА < СС + 800 & ВА > ВВ THEN GO ТО LB; ELSE ВВ = 'ООЮ'В; При вычислении выражения СА < СС + 800 & ВА > ВВ первым выполняется сложение СС + 800. Получаемый при этом результат равен 1007, что больше, чем 345. Результатом же выпол- нения первой операции является установление факта истинности проверяемого соотношения, т. е. значение левой части выражения равно '1'В. Проверка соотношения В А > ВВ производится слева направо в строках битов; оказывается, что отношение истинно, и поэтому значение правой части выражения также равно '1'В.
10.3. Логические операции 349 Теперь имевшееся вначале выражение сводится к 'ГВ & 'ГВ Результатом выполнения этой операции и, тем самым, результа- том вычисления всего выражения является 'ГВ, а это вызывает исполнение оператора THEN. Обратите внимание, что работа в цикле будет продолжаться до тех пор, пока не окажется, что СС = —521; в этом случае произойдет выполнение оператора ELSE. Если в последовательности операций предусмотренные круглые скобки не полностью определяют очередность их выполнения, то очередность соответствует следующим рангам операций: 1. Одноместный +, одноместный —, **, 2. ♦, / 3. Двуместный +, двуместный — 4. = , “1 = , <, >, ”1>, <=, >= 5. & 6. 7. Все операции более высокого ранга должны выполняться до того, как следует переходить к выполнению операций более низкого ранга. При необходимости выполнения операций одного и того же ранга очередность их выполнения естественная — слева направо. Исключение составляют лишь операции наивыс- шего (первого) ранга, очередность выполнения которых — справа налево. В случае необходимости производится преобразование данных. Преобразования (прямые и обратные) арифметических данных и строк символов (это не предусмотрено в Subset-PL/1) аналогич- ны преобразованиям, производимым в случае ввода — вывода, управляемого списком. Преобразования строк битов в строки символов (и наоборот) вызывают преобразование каждого бита в символ 0 или 1 (и наоборот). При проведении преобразований (прямых и обратных) строк битов и арифметических данных строка битов обрабатывается как число типа FIXED BINARY (15,0). Учитывая эти правила, следует иметь в виду, что при наличии DECLARE Н CHAR (1), J BINARY FIXED (31,0); J = 1; Н == J; значение H будет храниться в виде 'Ь', поскольку при преобра- зовании J в строку символов оно преобразуется в bbbbbbbbbbbbl
350 Гл. 10. Как писать программу на языке PL/1 и Н полагается равным самому левому символу этой строки. Вообще преобразование числовых данных в строку символов приведет к получению 13-символьного поля. ЮЛ. Ключевые слова Мы уже познакомились со многими операторами, использую- щимися в языке PL/1, и все они, за исключением операторов присваивания, начинались с каких-то основных слов, за кото- рыми следовали какие-то идентификаторы. Эти основные слова называют ключевыми словами. Они определяют тип оператора, например, DECLARE, GO ТО (рассматривается как одно слово), END и т. д. Оператор присваивания отличается от других видов операторов тем, что в нем роль ключевого слова играет знак равенства, который сам следует за одним или несколькими иден- тификаторами. Общая форма всех используемых в языке PL/1 операторов такова: (имя-ситуации!, . . , имя-ситуациик): метка!: . . . . . . меткап: ключевое-слово идентификаторы описатели; В конце оператора всегда ставится точка с запятой. Вид исполь- зуемых описателей определяется типом оператора. Оператор DECLARE может иметь в качестве описателей слова FIXED, BINARY, FLOAT и т. д. Оператор GO ТО может использоваться без описателей. Поскольку некоторые ключевые слова и описатели, а также некоторые ситуации, имеющие определенные имена, используются часто и достаточно длинны при написании, допустимо применение сокращенных форм записи этих слов. Поэтому вместо слова DECLARE можно воспользоваться сокращенной формой DCL. Слова, полные и записанные в сокращенной форме, могут быть «перемешаны» самым произвольным образом в одной программе, и это не оказывает на работу компилятора никакого влияния. Полный перечень сокращений приводится в Приложении Е. Ниже приводятся некоторые из встретившихся нам сокраще- ний ключевых слов: PROC PROCEDURE DCL DECLARE DEC DECIMAL BIN BINARY CPLX COMPLEX CHAR CHARACTER OFL OVERFLOW
10.5. Индексы 351 UFL UNDERFLOW FOFL FIXEDOVERFLOW ZDIV ZERODIVIDE CONV CONVERSION 10.5. Индексы Предположим, что имеется многочлен ао 4" aiX + ajX2, которым мы воспользуемся в качестве формулы для вычислении. Он может быть представлен в такой форме: Y = а0 + X (at 4- X (а.» и в этом случае операция умножения выполняется только два раза. Если значения всех коэффициентов представлены в форме числа с плавающей точкой и требуется вычислить данный мно- гочлен при различных значениях X, то можно написать такую программу: PLYEVAL: PROCEDURE OPTIONS (MAIN); DCL A(3) FLOAT, X FLOAT, Y FLOAT; STP: GET LIST (A(l), A(2), A(3)); X = -10; LOP: Y = A(l) + X*(A(2) + X*A(3)); PUT LIST (X, Y); X = X + 1; IF X < 10 THEN GO TO LOP; END PLYEVAL; Здесь фигурируют все три коэффициента aj (i = 1, 2, 3), которые необходимо ввести. Они характеризуются идентичными свойствами и могут рассматриваться как переменные, которым присвоены имена Aj, Аа и А3. Однако невозможно перфорировать индексы на перфокарты, поэтому нужно представить их в другой форме: заключить в круглые скобки и поместить следом за именем соответствующей переменной. Чтобы сделать возможным использование индекса, требуется объявить его максимальный размер, т. е. наибольшее значение, в операторе DECLARE. Это дает компилятору возможность зарезервировать достаточный объем памяти в объектной про- грамме. Максимальное значение, которое может быть использо-
352 Гл. 10. Как писать программу на языке PL/1 вано при объявлении любого массива, равно 32 767. После объяв- ления обращаться к значениям переменных Ai, . . ., Ап можно так: просто написать идентификатор А, открывающую скобку, выражение и закрывающую скобку. Выражение вычисляется, и полученный результат преобразуется в двоичное целое число с фиксированной точкой, которое не может превышать макси- мального значения индекса, указанного в операторе DECLARE. Кроме того, значение должно быть положительным. Поэтому в нашем примере выражение может принимать только значения 1, 2 и 3. В нашем примере выражения относительно просты— они являются константами. Следует иметь в виду, что допустимо использование несколь- ких индексов. Поэтому при описании системы уравнений ацХ + ai2Y = bi a2iX -J- a22Y = b2 нужно объявить, что переменная А имеет два индекса, а пере- менная В — один. Тогда оператор DECLARE может быть пред- ставлен в таком виде DCL А(2, 2) FLOAT, В(2) FLOAT; Когда компилятор будет размещать четыре значения А в опера- тивной памяти, они будут записаны в объектной программе в сле- дующем порядке: А(1, 1) । А(1, 2) А(2, 1) А(2, 2) т. е. упорядочение будет выполнено сперва по первому, а потом по второму индексу. Нетрудно заметить, что индексы отделяются друг от друга запятыми. При индексировании переменной допускается исполь- зование не свыше 32 индексов. • В Subset-PL/1 допускается использование не более трех индексов. При выполнении операций ввода — вывода указание только имени массива без указания значений индексов обеспечивает чтение или запись всего массива. В то же время указание индексов вызывает чтение или запись только указанного эле- мента массива. Следовательно, оператор GET LIST (А);
10.5. Индексы 353 обеспечивает чтение всех четырех значений А в следующем поряд- ке: А(1, 1), А(1, 2), А(2, 1), А(2, 2). Оператор GET LIST(A(1, 1), А(2, 1)); прочитает только два указанных значения. Программист может также задать «сечение» массива (по стро- кам или столбцам). Например, оператор GET LIST(A(1, •)); производит чтение всех значений А, первым индексным элементом которых является единица, а именно А(1, 1) и А(1, 2). Написа- ние только имени массива эквивалентно указанию имени массива, за которым следуют звездочки в позиции каждого индекса. • В Subset-PL/1 «сечение» массивом задавать нельзя. Имена массивов могут также быть использованы в операторах присваивания. Если это сделано, то арифметические операции выполняются с соответствующими элементами массивов^ Тогда при выполнении операторов DCL 0(2,3), D(2,3), Е(2,3); Е = С + 2*D + 4; произойдет замена каждого элемента Е суммой: удвоенное зна- чение соответствующего элемента D плюс 4 плюс соответствую- щее значение элемента С. Следовательно, если 2 3 -1 4 9 то 7+ 2(2)+4 9+2(3)+4 15 19 5+2(-1) + 4 —2+2(4)+4 = — 1 10 Заметьте, что скаляр 4 добавляется к каждому элементу Е. В язы- ке PL/1 написание оператора Е + C*D + 4; означает, что при его выполнении каждый элемент С умножается на соответствующий элемент D, а затем прибавляется 4. Это не есть алгебраическое перемножение матриц. Обычно индексы имеют тип FIXED BINARY (15,0) и являются положительными целыми 1, 2, . . ., п. Язык PL/1 допускает использование нулевых и отрицательных целых индексов, опре- деленных заранее в операторе DECLARE. Форма записи опера- 23 3»к. 15635
354 Гл, 10, Как писать программу на языке PL/1 тора такова: DCL F(0 : 2), G(-3 : 1, 2 : 4); в скобках помещены граничные пары: наименьшее значение индекса, двоеточие и максимальное значение индекса. Поэтому будут существовать три переменных F с индексами 0, 1 и 2. Имя G (с соответствующими индексами) присвоится 15 переменным, причем диапазон изменений числовых значений первого индекса от —3 до +1» а второго индекса —от +2 до +4. Если записать DCL Н(0 : 3, 2); то этот массив с именем Н будет включать восемь элементов, а именно Н(0, 1), Н(0, 2), Н(1, 1), Н(1, 2) и т. д. в указанном порядке. Обратите внимание на то обстоятельство, что граничные пары разделены запятой и что если указывается только одна граница массива, то предполагается, что это — верхнее гра- ничное значение индекса, а нижняя граница индекса равна единице. • В Subset-PL/1 не допускается указание нижней границы массива. Поэтому невозможно указать отрицательные и нулевые индексы. Если бы потребовалось использовать нулевой индекс, скажем в нашем примере, приведенном в данном разделе (Y = а^ + + aiX + а2Х2), можно было бы составить такую программу: DCL А(0 : 2) FLOAT; . . . GET LIST(A); . . . LOP: Y = A(0) + X*(A(1) + X*A(2)); . . . Следует заметить, что при составлении программы вычислений легко спутать функцию и переменную с индексами. В частности, такие операторы, как DCL SQRT(4); Y = SQRT(X); при выполнении могут означать и извлечение квадратного корня из X, и Х-й элемент массива с именем SQRT. В языке PL/1 всегда предполагается последнее. И чтобы не допустить возможной путаницы, программисту вообще-то лучше избегать использова- ния имен функций в качестве имен массивов. 10.6. Начальные значения При объявлении имени переменной можно также задать зна- чение этой переменной, которое будет присвоено в момент загруз- ки объектной программы в память. Для этого записывается
10.6. Начальные значения 355 INITIAL (значение) для скалярной величины и INITIAL (зна- чение!, . . ., значениеп) в случае массива. Вместо записи слова INITIAL можно воспользоваться его сокращением INIT. Рас- смотрим такой пример: DCL A FIXED DEC(5,0) INITIAL(14), В FIXED BIN(15,0) INlT(-4), C(3) FIXED DEC(5,0) INITIALS, -7, 2), D(0: 3, 2) FIXED DEC(2, 1) INIT(1,O, 0, 0,0, 1,0, 0); Это эквивалентно следующему: DCL A FIXED DECIMALS, 0), В FIXED BIN(15, 0), . . . ; A = 14; В = —4; C(l) = 1; C(2) = -7; C(3) = 2; D(0, 1) = 1; D(0, 2) = 0; D(l, 1) = 0; и т. д. Различие заключается в том, что присвоение начального зна- чения переменной обеспечивает ввод этого значения, но не тре- бует объема памяти для размещения каких-либо команд в объект- ной программе. Следовательно, присвоение начальных значений вообще-то позволяет сэкономить небольшой объем оперативной памяти. Если задаваемые значения должны быть организованы в виде массива, они записываются в том порядке, в каком предполагается организовать хранение массива в оперативной памяти. В больших массивах часто приходится встречаться с тем, что нескольким переменным должно быть задано одно и то же значение. В подоб- ных случаях целесообразно воспользоваться коэффициентом по- вторения, или повторителем^ который записывается перед значе- нием. Поэтому запись вида: D(0: 3, 2) FIXED DEC(2, 1) INIT (1, (4)0, 1, (2)0); может быть использована для объявления D. Можно повторить группу значений, например INIT(1, (2) (2, -1), (2)3) эквивалентно написанию INIT(1,2,-1,2,-1,3, 3) Комплексное начальное значение задается путем написания вещественной константы, за которой следует знак + или — 23е
356 Гл. 10. Как писать программу на языке PL/1 s далее мнимая константа, например INIT(3 + 21, 4 - 71) Допустимо указание начальных значений части массива без указания начальных значений всего массива. Звездочка показы- вает, что начальное значение не задается. Поэтому, если INIT(3, 4, (2)*, 4, *) то такая запись будет означать, что первое, второе и пятое значе- ния задаются в качестве начальных значений. Если оказы- вается, что массив содержит больше элементов, чем записано начальных значений, то предполагается, что оставшимся пере- менным соответствуют звездочки. Если количество начальных значений превышает число элементов в массиве, то самые правые начальные значения игнорируются. Хорошее правило, которого следует придерживаться при программировании, заключается в том, что количество присваиваемых начальных значений должно быть равно числу элементов в массиве. Коэффициенты повторения — это обычно положительные кон- станты, но они могут быть любыми выражениями, написание которых допускается в языке PL/1. Нулевой или отрицательный коэффициент не вызывает присвоения начальных значений. Если написано INIT(2, (2*N + 3)4) то это означает, что присваивается одно значение, равное 2, за которым следует 2N + 3 значений, равных 4. Значение N должно быть предварительно определено. В случае переменных типа строки может возникнуть некоторая путаница между повторителем строки и повторителем для при- своения начальных значений. Чтобы избежать путаницы, повто- ритель начальных значений необходимо записывать первым, а по- вторитель строки в этом случае должен задаваться даже тогда, когда он равен 1. Например, оператор DCL CH CHAR(5) INIT((5)'G9, CJ(4) CHAR(8) INIT((4)(1) 'ABCDEFGH'); обеспечивает присваивание переменной CH(1) начального зна- чения вида 'GGGGG'. Переменным от СН (2) до СН (5) начальные значения не присваиваются. С другой стороны, каждой перемен- ной CJ присваивается значение вида 'ABCDEFGH'. Значение, которое присваивается символьной переменной, не обязательно должно быть строкой символов. Если значение
10,7. Переменные типа метка 357 имеет другой тип, то оно будет преобразовано в строку символов. Однако в языке PL/1 не разрешено использовать комплексное число в качестве начального значения переменной типа строки символов. 10.7. Переменные типа метка Предположим, что имеется программа, которая анализирует значение переменной V. Если V = 1, то происходит последо- вательное выполнение подпрограмм А, В и С. Если V = 2, то последовательно выполняются подпрограммы А, В и D. Во всех иных случаях обеспечивается последовательное выполнение под- программ Е, В и С. Программа выглядит так: А: . . . ; GO ТО В; В: . . . ; GO ТО MAIN1; С: . . . ; GO ТО MAIN2; D: . . . ; GO ТО MAIN2; Е: . . . ; GO ТО В; MAINO: IF V = 1 | V =. 2 THEN GO ТО А; ELSE GO TOE; MAIN1: IF V = 2 THEN GO TO D; ELSE GO TOC; MAIN2: Во многих случаях оказывается неудобным сохранять значе- ние переменной V для более поздних проверок в программе. Поскольку все, что мы хотим,— это иметь возможность переклю- чаться после подпрограммы В, мы можем заменить оператор GO ТО MAIN1, стоящий после нее, на оператор IF W THEN GO ТО D; ELSE GO TO C; где W — переменная типа строки битов длины 1. Если W = = '1'В, то выполняется группа операторов, помеченных мет- кой D; в противном случае выполняются операторы, помеченные меткой С. При этом в группе операторов с меткой MAIN0 (перед разветвлением программы) нужно проверить значение V и уста- новить W. Язык PL/1 предлагает другой способ. Метка MAIN1 объяв- ляется переменной типа метка, и непосредственно перед MAIN0 пишется оператор IF V = 2 THEN MAIN1 = D; ELSE MAIN1 = C; Здесь оператор присваивания использован, чтобы присвоить «значение» D или С переменной MAIN1. Все переменные типа
358 Гл, 10, Как писать программу на языке PL/1 метка должны быть объявлены в операторе DECLARE. Форма записи такова: DCL MAIN1 LABEL; Переменной типа метка может быть присвоено значение только другой переменной типа метка или же константы такого же типа. Напомним, что все метки, записываемые перед оператором, являют- ся константами типа метка. В нашем примере и D и С являются константами этого типа. Переменные типа метка могут быть массивами, как и любые другие переменные. Информацию о размерности необходимо вклю- чать в оператор DECLARE. Поэтому можно написать DCL LBVR(7) LABEL; и обращаться в программе к меткам LBVR(2), LBVR(J + 4) и т. д. Можно написать, например, такие операторы: GO ТО LBVR(J - 1); IF LBVR(J) = MAIN THEN LBVR(3) = MAINO; LBVR(2) = B; Переменная типа метка никогда не может быть использована в качестве метки оператора. Начальные значения переменным типа метка присваиваются аналогично переменным любых других типов, например: DCL ВН(3) LABEL INIT(B, С, MAIN2); DCL ВК(3) LABEL INIT(*, D, *); Последний оператор присваивает ВК(2) = D; в то же время переменным ВК(1) или ВК(3) начальные значения не присваи- ваются. Упражнения № 23 1. Написать программу на языке PL/1 для вычисления у (~1)Р log(n) п—2 В программе необходимо предусмотреть продолжение суммиро- вания до тех пор, пока очередной член не станет меньше, чем 0.0000001. 2. Предусмотреть в программе, составленной для решения упр. 1, продолжение суммирования до тех пор, пока очередной член численно не окажется менее а) 0.01; Ь) 0.001; с) 0.0001;
10.7» Переменные типа метка 359 d) 0.00001; е) 0.000001. Сформировать в программе соответствующий цикл, который обеспечивал бы счет для всех пяти пределов ошибок. 3. Требуется оценить максимальную ошибку, имеющую место при приближенном вычислении значения квадратного корня Г 1+у по формуле 1 + (х — у)/2. Пусть х и у лежат в пределах между —0.1 и +0.1. Составить программу вычисления функции f (X, y) = ^Zi±5—1 —(X—у)/2 для х и у, изменяющихся в одинаковом диапазоне от —0.10 до +0.10 с шагом (0.01). Предусмотреть выдачу на печать только одного числа, а именно максимальной ошибки. 4. Изменить программу, составленную в соответствии с усло- виями упр. 3, таким образом, чтобы обеспечить получение табли- цы данных, показывающих максимальную ошибку для каждого из 101 значений х. Выдать на печать и значение х и максимальное значение функции f (х, у). 5. Написать программу чтения х с карты и печати значений у и z для z = 0, 1, 2, . . ., х. Пусть х вводится как целое число. Пусть у = 4z/(3 + z — 2х). Если знаменатель равен нулю, то для присваивания у значения нуль воспользоваться оператором ON ZERODIVIDE. 6. Дан оператор DECLARE Т(3, 3) BIN(2). Пусть перемен- ная Т с соответствующими индексами обозначает квадраты доски, используемой при игре в крестики и нолики. Значение '10'В означает, что игрок занимает этот квадрат. В случае значения '01'В квадрат занимает вычислительная машина. Если же зна- чение равно '00'В, то это означает, что квадрат пустой. Случай 'И'В не использовать. Игроку предоставляется право сделать первый ход. Игрок указывает свои ходы путем ввода двух целых чисел, определяющих строку и колонку (1, 2 или 3), в которых он намеревается сделать свою отметку. Программа должна делать выбор из числа пустых квадратов и выдавать на печать доску (для игры в крестики и нолики) с использованием обозначения X для игрока и 0 для вычислительной машины. Незанятые квадраты оставить пустыми. Совсем необязательно, чтобы ваша программа обеспечивала наилучший выбор. 7. Написать программу чтения значения N, а затем чтения совокупности карт, содержащих значения х. Карта с N вводится первой. Для каждого х вычислить у = Зх2 + 5х + 4, z = 2х2 + + 6х + 3 и w = y/z, если z #=0, или w = 17.4, если z = 0. ш Если N = 1, то для каждого х отпечатать значения х, у и z.
360 Гл. 10. Как писать программу на ягнке PL/1 Если N =2, отпечатать значения х, у, z и w. Если N = 3, отпеча- тать значения х, у и w, оставляя на бумаге свободное место для г. Если N = 4, отпечатать только значения х и w. Использовать четыре отдельных оператора PUT, за каждым из которых запи- сать оператор GO ТО. Воспользоваться переменной типа метка размерности 4 и взять N в качестве индекса для выбора нужного оператора PUT. Предусмотреть соответствующую проверку, чтобы быть уверенным, что при вводе N = l, 2, 3 или 4. 10.8. Группы Предположим, что требуется решить квадратное уравнение вида АХ2 + ВХ + С = 0 а следовательно, прочитать значения А, В и G с карты и отпеча- тать значения А, В, С и двух корней XI + Yli и Х2 -}- Y2i. При этом потребуем, чтобы А, В и С были вещественными пере- менными. Корни могут быть либо вещественными, либо комп- лексными. Приведем вариант программы вычислений: /♦PL1F — 03*/ ROOTS: PROCEDURE OPTIONS (MAIN); ON ENDFILE (SYSIN) GO TO ENDING; Pl: GET LIST (А, В, C); D = B*B — 4*A*C; E = —B/(A + A); IF D < 0 THEN GO TO NEG; ELSE GO TO POS; POS: Yl, Y2 = 0; R = SQRT(D) / (A + A); XI = E + R; X2 = E - R; GO TO PRNT; NEG: XI, X2 = E; Yl = SQRT (—D) / (A + A); Y2 = -Yl; PRNT: PUT LIST (А, В, С, XI, Yl, X2, Y2); GO TO Pl; ENDING:; END ROOTS;
10.8. Группы 361 Было бы хорошо, если бы после слов THEN и ELSE можно было бы записать целую последовательность, а не только один оператор. Способ обойти это ограничение заключается в исполь- зовании группы DO. В этом случае применяется следующая форма записи: DO; один или несколько операторов; END; или если записывается метка метка: DO; . . . ЕНО[метка]; Использование метки в операторе END необязательно. В операторе DO все операторы до соответствующего оператора END образуют группу. За исключением оператора ON группа DO может быть использована почти в любом месте программы, там, где может быть написан один оператор. Одна группа DO может быть вложена в другую. Использование групп DO весьма целесообразно при написании оператора IF после слов THEN и ELSE. Так, если воспользоваться группами DO, приведенная ранее программа запишется в виде: ROOTS: PROCEDURE OPTIONS (MAIN); ON ENDFILE (SYSIN) GO TO ENDING; . Pl: GET LIST (А, В, C); D = B*B — 4*A*C; E = —В / (A + A); IF D < 0 THEN DO; XI, X2 = E; Yl = SQRT (—D) / (A + A); END; ELSE DO; R = SQRT (D) / (A + A); XI = E + R; X2 = E - R; Yl = 0; END; Y2 = -Yl; PUT LIST (А, В, С, XI, Yl, X2, Y2); GO TO Pl; ENDING:; END ROOTS; Заметим, что благодаря использованию операторов DO уда- лось исключить три метки. Вообще, чем меньше меток в програм- ме, тем легче производить ее отладку. Рассмотрим случай вложенных групп: A: PROCEDURE; В: DO; . . .
362 Гл. 10. Как писать программу на языке PL/1 С: DO; . . . END С; END В; END А; Последнюю строку можно было бы записать и в виде END; END; END; В тех случаях, когда появляются несколько следующих друг за другом операторов END, допускается написание только одного END при условии, что он включает метку внешней группы или процедуры. Поэтому мы могли бы написать END А; и это было бы воспринято как окончание всего того, что начи- нается после А. Вместе с тем, хотя использование одного опера- тора END и позволяет обеспечить экономию в записи, подобная форма представления оказывается менее понятной при чтении программы человеком. Начинающему программисту реко- мендуется крайне осторожно обращаться с этой формой опера- тора END. • В Subset-PL/1 должны записываться все операторы END. 10.9. Оператор DO Рассмотрим порядок составления программы вычисления зна- чения кубического корня с использованием метода Ньютона. Полагаем Хо = 1 и затем вычисляем ' X, = (2Х0 + N/X20)/3 где N — число, из которого необходимо извлечь кубический корень. Далее полагаем Хо = Х4 и вычисляем новое значение Х2. Этот процесс вычислений продолжается до тех пор, пока раз- ница между двумя последовательными значениями X не окажется в пределах допустимой ошибки. Например, процесс вычисления кубического корня из 4 мы можем представить следующим образом: N = 4 Хо = 1 Х4 - (2 + 4/1)/3 - 2 Х2 = (4 + 4/4)/3 = 1.667 Х3 = (3.333 + 4/2.778)/3 = 1.591 и, если продолжить процесс вычислений, то значения X будут приближаться к 1.5874 — корню кубическому из 4.
10.9. Оператор DO 363 В общем случае программа на языке PL/1 для вычисления кубического корня может иметь такой вид: XOLD = 0; XNEW = 1; Ll: IF ABS(XNEW - XOLD) < .0001 THEN GO TO EXIT; XOLD = XNEW; XNEW = (2*XOLD + N/XOLD**2)/3; GO TO Ll; EXIT: . . . Поскольку такие задачи встречаются довольно часто, можно воспользоваться специальной формой оператора DO, позволяю- щей упростить написание программы подобных вычислений. Форма оператора DO WHILE (выражение); операторы . . . , END; Повторное выполнение операторов в группе производится до тех пор, пока значение выражения истинно. Как только зна- чение выражения становится ложным, операторы пропускаются и управление передается на оператор, следующий за END. Если значение выражения оказывается ложным с самого начала, то операторы в группе совсем не выполняются. Наш пример вычи- сления кубического корня можно написать теперь так: XOLD = 0; XNEW = 1; DO WHILE (ABS(XNEW - XOLD) > .0001); XOLD = XNEW; XNEW = (2*XOLD + N/XOLD**2)/3; END; Применение другой формы записи оператора DO целесообразно при необходимости проведения вычислений, подобных, скажем, вычислению суммы кубов элементов массива. Пусть ARY — имя вектора, содержащего 19 элементов, л нам требуется подсчитать сумму кубов этих 19 элементов. Можно предложить такую про- грамму: DCL ARY(19) DEC FIXED(4, 0), SUM.CUBE DEC FIXED(13, 0) INIT(0); J = 1; LB: IF (J > 19) THEN GO TO NEXT; SUM.CUBE = SUM .CUBE + ARY(J)**3;
364 Гл. 10. Как писать программу на мыке PL/1 J = J + 1; GO ТО LB; NEXT: . . . Если воспользоваться группой DO, ее можно записать так: DO WHILE (J < = 19); . . . ; J = J + 1; END; но возможен также и другой способ: DO I = 1 ТО 19 BY 1; SUM-CUBE = SUM-CUBE + ARY(J)**3; END; Возможно применение такой формы оператора DO: DO v = et TO e2 BY e3 WHILE (e4) . . . где v — скалярная переменная (в противоположность перемен- ной массива), которая может быть переменной с индексами или без них. Переменная может быть строковой, арифметической или даже переменной типа метка. Все е^ являются выражениями. При этом слова ТО и BY могут быть записаны в любом порядке. Следовательно, записи операторов DO J = 1 ТО 19 BY 1; и \ DO J = 1 BY 1 ТО 19; эквивалентны. Приведенная выше общая форма эквивалентна такой записи: метка!: IF (е3 > = 0 & v > е2) (е3 < 0 & v < е2) THEN GO ТО метка2; st2: IF “1 е4 THEN GO ТО метка2; операторы . . . ; st3: v = v + е3; GO ТО метод; метка2: . . . Если опущена конструкция WHILE (выражение), то должен быть опущен и оператор sta. Если опущена конструкция ТО выражение, то метка! заменяется пустым оператором. Если же опущена конструкция BY выражение, то по умолчанию е3 = 1. В операторе DO часть справа от знака равенства, а именно в! ТО е2 BY е3 WHILE (е4) называется спецификацией. Один оператор DO может включать любое необходимое количество различных спецификаций, которые
10,9. Оператор DO 365 в этом случае отделяются друг от друга запятыми. Так, оператор DO J = 1 ТО 19, 23, 25 ТО 37 BY 2, WHILE (ETY > 1.0Е — 4); обеспечивает выполнение группы операторов для J = 1, 2, . . . . . ., 19, 23, 25, 27, 29, 31, 33, 35, 37 и затем столько раз, сколько необходимо, до тех пор пока переменная ETY не становится меньше или равна 10~4. Обратите внимание на указанную выше спецификацию 23. Если и ТО, и BY опущены, то группа операторов выполняется один раз с переменной, равной указанному значению. Оператор DO — это одно из наиболее мощных средств любого компилятора. Хотя переменной (часто называемой параметром цикла DO) обычно соответствует двоичное целое число с фикси- рованной точкой, может быть использована любая скалярная переменная. Упражнения № 24 1. Переписать упр. 23.4 с использованием оператора DO. 2. Выполнить то же с упр. 23.5, 3. Использовать операторы DO для вычисления значения 2/ nn-i 3*+4* ' Ч 2(6П) • Процесс вычисления продолжать до тех пор, пока последний член не окажется менее 0.00001. 4. Матрица А имеет четыре строки и три столбца. Элементами матрицы являются десятичные целые числа. Написать программу чтения элементов, отперфорированных в следующем порядке: Колонка 2 строка матрицы (1—4) Колонка 4 столбец матрицы (1—3) Колонка 5—11 элемент матрицы После чтения матрицы отпечатать ее элементы на четырех строках (по одной строке матрицы на каждую строку). Ниже матрицы отпечатать сообщение 'КОЛИЧЕСТВО НУЛЕВЫХ ЭЛЕМЕНТОВ =' и далее число нулевых элементов матрицы. 5. Написать программу вычисления таблицы значений функ- ции f (х) = sin (х) + cos (2х) + 3.5 sin (Зх) для изменяющихся значений х (от 0.00 до 0.50). Таблица должна содержать 51 эле- мент, поскольку х изменяется с шагом 0.01.
366 Гл. 10. Как писать программу на языке PL/1 6. Несколько изменить программу, составленную для реше- ния упр. 5, предусмотрев в ней возможность чтения карт, содер- жащих значение функции f (х) < 3.4. Провести поиск по таб- лице и найти, какому интервалу значений х соответствует зна- чение f(x). Затем отпечатать более близкое значение х. Это простой, но не эффективный способ поиска по таблице. 10.10. Индексирование в списках ввода — вывода Форма спецификации типа DO допустима для записи списков данных в операторах GET и PUT. Внутри списка за словом DO спецификации следуют точно так же, как это имеет место в опе- раторе DO; отличие заключается лишь в том, что теперь не исполь- зуется слово END. Индексирование может быть вложенное, и тогда для большей ясности записи предусматриваются круглые скобки. Рассмотрим следующий пример: GET LIST(((A(I, J) DO I = 2 ТО 4, 7) DO J = 1 TO 5 BY 2)); Это эквивалентно следующему: DO J = 1 TO 5 BY 2; , DO I = 2 TO 4, 7; GET LIST (A(I, J)); END; END; В результате происходит чтение элементов в следующей очеред- ности: А(2, 1), А(3, 1), А(4, 1), А(7, 1), А(2, 3), А(3, 3), А(4, 3), А(7, 3), А(2, 5), А(3, 5), А(4, 5), А(7, 5). Использование спецификаций повторения в списках ввода — вывода данных имеет два преимущества. В некоторых случаях это позволяет достигнуть экономии при написании длинных списков (в вышеприведенном примере мы должны были бы запи- сать в своем списке каждый из 12 элементов) или сложных групп DO. В других дает удобства, которые не удается получить другими методами. Предположим, что нам нужна программа печати матриц произвольного размера, такая, чтобы размер зада- вался только в момент ее исполнения. Используя конструкцию ТО в группе DO, можно задать вывод произвольного числа пере- менных. Например, оператор PUT LIST(((A(I, J) DO J = 1 ТО N) DO I = 1 ТО N)); обеспечивает печать квадратной матрицы размером N. Если используется ввод — вывод, управляемый редактированием, то
10.11. Структуры 367 другого такого несложного способа написания этого оператора просто не существует. Теперь рассмотрим спецификации формата. Обычно соблю- дается поэлементное соответствие между переменными и специ- фикациями формата, если не считать спецификаций управления, включаемых в формат. Однако все осложняется, когда число выво- димых элементов неизвестно. Поэтому существуют следующие правила. 1. Если список переменных исчерпан, вывод данных пре- кращается. 2. Если список спецификаций формата исчерпан, то специ- фикации повторяются от начала списка форматов. В целях иллюстрации воспользуемся оператором PUT EDIT (((А(1, К) DO К = 1 ТО 7), B(I) DO I = 1 ТО 5))-(SKIP,(7) Е(14, 6), Е(24, 6)); При выполнении он обеспечивает печать пяти строк, каждая из которых содержит восемь переменных. 10.11. Структуры Предположим, что к вам обращаются с просьбой предусмот- реть в программе календарную дату в виде строки символов. Вы можете написать следующее: DCL MONTH CHAR(2), DAY CHAR (2), YEAR CHAR(2); но, поступив подобным образом, вы лишаетесь возможности обращаться ко всей дате по одному имени. В операторе DECLARE можно указать номер уровня для эле- мента данных или строки программы. Номер уровня выражается десятичным целым числом без знака, меньшим 256. Для нашего примера можно написать DCL 1 DATE, 2 MONTH CHAR(2), 2 DAY CHAR(2), 2 YEAR CHAR(2); так что когда мы говорим об элементе DATE, мы включаем в него и три подполя. Любая упорядоченная совокупность данных,
368 Гл. 10. Как писать программу на языке PL/1 подобная рассмотренной, называется структурой. Элементами структуры могут являться скалярные переменные, массивы и дру- гие структуры. Если номер уровня структуры, например DATE, равен 1, то структуру называют старшей структурой-, во всех других случаях речь идет о младшей структуре. Если элемент записан в операторе DECLARE без номера уровня, компилятор ставит в соответствие уровень по умолча- нию, равный 1. Рассмотрим следующую структуру: DCL 1 А, 2 В CHAR(16), 2 С, 7 D(4) FIXED(5, 0), 2 Е(2), 5 F CHAR(8), 5 G(3) CHAR(4); Здесь главная структура А состоит из структур В, С и Е. Струк- тура С представляет собой вектор D, который включает 4 элемен- та. Структура Е — это массив, состоящий из двух элементов: переменной F и вектора G. При обращении к элементам вектора G следует пользоваться двумя индексами, причем первый из нйх является индексом Е, поскольку вектор G входит в массив Е. Порядок следования элементов в структуре такой: В D(l) D(2) D(3) D(4) F(l) G(l, 1) G(l, 2) G(l, 3) F(2) G(2, 1) G(2, 2) G(2, 3) Точно так же, как допускается, чтобы массивы были элемен- тами структуры, разрешается, чтобы элементы массива были структурами; это имеет место, например для массива Е, элемен- тами которого являются символьная переменная F и массив G. Имена структур могут использоваться в операторах присваи- вания. Структура, указанная слева от знака равенства, должна
10.11. Структуры 369 быть идентичной соответствующей структуре, приведенной справа. Необходимо только, чтобы структуры были одинаковыми по существу, номера ясе уровней, использованные при описании структур, могут быть различными. Например: DCL 1 А, 2 В CHAR(16), 2 С, 3 D(2) CHAR(4), 1 Н, 2 К CHAR(16), 2 R, 8 U(2) CHAR(4) INIT(0); A = H; Операторы присваивания, предполагающие использование структур, обрабатываются компилятором как последовательность операторов, присваивающих значение соответствующих элемен- тов. Поэтому оператор А = Н; обрабатывается как В = К; С = R; а оператор С = R; разбивается на следующие: D(l) = U(l); D(2) = U(2); Правой частью оператора присваивания может быть выражение, но какой бы она ни была, обработка ведется именно так, как если бы была записана последовательность операторов. В операторе присваивания, включающем структуры, могут быть записаны слова «BY NAME». В этом случае две структуры не обязательно должны иметь одинаковое строение, но по мень- шей мере по одному элементу в каждой структуре должны иметь одинаковое имя. Рассмотрим такую последовательность операторов: DCL 1 J, 2 К GHAR(4), 2 L CHAR(4); DCL 1 М, 2 L CHAR(4), 2 P GHAR(4); J = M, BY NAME Конструкция BY NAME порождает операторы присваивания, кото- рые обеспечивают запись переменных с соответствующими име- нами, а не соответствующие позиции в структуре. В приведенном 24 Зак 15635
370 Гл, 10. Как писать программу на языке PL/1 выше примере оператор эквивалентен следующему: L в J = L в М; • BY NAME не допускается в Subset-PL/1. Если требуется употреблять одинаковые имена для различных переменных, то необходимо иметь в своем распоряжении неко- торые средства для уточнения, какую из переменных мы имеем в виду. Таким средством являются составные имена. В языке PL/1 составные имена записываются так: имя структуры, точка и затем имя элемента. Например, запись J.L = M.L означает, что разговор идет oLbJhLbM. Если в строении структур существует иерархия, единственное требование заклю- чается в том, чтобы написать составное имя таким образом, чтобы его можно было отличить от всех остальных употребляемых в программе переменных. • В Subset-PL/1 допускается использование составных имен, однако во все записи составных имен следует включать имя стар- шей структуры. При использовании составного имени допустимо применение индексов, которые могут указываться на любом уровне. Поэтому имена A.E(2).G(3) A.G(2, 3) взаимозаменяемы. • В случае массива структур разрешено обращение ко всему массиву или к отдельным элементам, но задать сучение нельзя. Это ограничение относится и к Subset-PL/1, и к компилятору OS уровня F. 10.12. Повторные определения Часто приходится обращаться к переменной путем использо- вания различных имен. Иногда это происходит оттого, что про- грамма была составлена различными программистами, которые случайно воспользовались различными именами для обозначения одного и того же. Иногда это делается для того, чтобы получить большую мнемоничность обозначений. Или же иногда просто желательно, чтобы две различные переменные, использован- ные в различных частях программы, находились в одной
10.12, Повторные определения 371 и той же ячейке оперативной памяти. В любом случае повторные определения программируются одинаково. При определении по соответствию ранее определенному (базо- вому) элементу или элементам просто дается новое имя. Это может производиться двумя способами: двум массивам одинаковых раз- мерностей может быть отведена одна и та же область памяти или части массива может присваиваться другое имя. Говоря о первом случае, приведем такой пример: DCL А(9,9) FIXED(5,0) INIT((81)0), В(9,9) DEFINED A FIXED(5,0); Здесь А и В — два различных имени, присвоенных одному и тому же массиву. Описатель DEFINED, за которым следует имя базовой переменной, задает повторное определение. Начальные значения могут быть присвоены только в первоначальном определении, при повторном определении это не допускается. Поэтому указать INIT... для В было бы неправильным. Описания А и В должны быть идентичными. Во втором случае используется специальное «слово» вида iSUB (i = 1, 2, . . ., п), которое обозначает первый, второй и последующие индексы базовой переменной. В целях иллюстра- ции воспользуемся следующим примером: DCL А(9,9) FIXED(5,0) INIT((81)0), С(9) FIXED(5,0) DEFINED A (ISUB, 10 - ISUB); Здесь A — это двумерный массив размерностью 9x9; каждый из двух индексов может принимать значения от 1 до 9; начальные данные, используемые для начального заполнения массива, нули. Имя С имеет только один индекс, который может принимать зна- чения от 1 до 9. Элементы вектора С должны быть таковы, что С (j) = A (j, 10 — j), т. е. элементы вектора С расположены по диагонали массива (матрицы) А, «проведенной» из правого верхнего угла в левый нижний угол. Переменные iSUB введены для того, чтобы сделать возможными определения подобного типа. Выражения, в которых используются переменные iSUB, не долж- ны содержать операций умножения или деления двух величин iSUB. Поэтому выражение вида 3SUB -|- 4*5SUB допустимо, а выражение 3SUB*5SUB недопустимо. Выражение должно иметь форму ai* ISUB + а2* 2SUB + . . ., где все ai могут быть чем угодно, не содержащим имен iSUB. Определения по соответствию разрешаются для всех перемен- ных, за исключением массивов структур. Определение по наложению позволяет двум или большему числу полей различного типа занимать одну и ту же область памяти 24*
372 Гл. 10. Как писать программу на языке PL/1 или всю память, отведенную под некоторое поле. В простейшей форме это можно записать так: DCL D GHAR(IO), Е CHAR(8) DEFINED D; Переменная Е займет 8 байтов, являющихся теми же самыми байтами, которые выделяются для записи первых 8 символов переменной D. Заметим, что определение по соответствию тре- бует идентичных описаний данных, в то время как определение по наложению — нет. Если необходимо, чтобы для записи переменной Е были выде- лены самые правые 8 позиций переменной D, то можно восполь- зоваться либо таким оператором: DCL 1 DUMMY, 2 G CHAR(2), 2 Е CHAR (8), D CHAR(IO) DEFINED DUMMY; либо специальным описателем POSITION(d) указывающим, что новая переменная накладывается начиная с позиции d базовой переменной. Таким образом, необходимо записать лишь следующее: DCL D CHAR(IO), Е CHAR(8) DEFINED D POSITIONS); и 8-символьное поле переменной Е начнется с 3-й позиции пере- менной D. При повторном определении нельзя выходить за границу базового поля, а также задавать начальные значения переменных. Кроме того, необходима совместимость типов вновь определяе- мой и базовой переменных. Поэтому допустимы следующие виды наложений. Определяемая переменная: скалярные арифметические данные. Базовая переменная: арифметические элементы (с индексами или без индексов) при одинаковых основаниях, масштабе, типе и разрядности. Определяемая переменная: скалярная переменная типа метка. Базовая переменная: скалярная переменная типа метка, воз- можно с индексом.
10.13. Ввод — вывод записей 373 Определяемая переменная', битовая переменная. Базовая переменная: битовая переменная, не являющаяся сечением массива. Определяемая переменная: символьная переменная. Базовая переменная: символьная переменная, не являющаяся сечением массива. Определяемая переменная: структура. Базовая переменная: идентичная структура, строение которой таково, что для соответствующих пар элементов из структур допу- стимо определение по наложению. Здесь в понятие битовых переменных включаются числовые двоичные поля, битовые строки фиксированной длины, а также упакованные структуры и массивы, содержащие только двоичные поля и битовые строки. В понятие символьных переменных вклю- чаются числовые поля символов, символьные строки фиксиро- ванной длины, а также упакованные структуры и массивы, содер- жащие только строки символов. Описатель POSITION может быть использован только с бито- выми и символьными переменными. 10.13. Ввод — вывод записей До сих пор мы рассматривали следующие способы ввода — вывода: ввод — вывод, управляемый данными, ввод — вывод, управляемый списком, и ввод — вывод, управляемый редактиро- ванием. И во всех трех случаях фактически предполагалось, что обрабатывается поток символов, содержащих данные, элементы которых некоторым образом разделены. После ввода каждый элемент преобразуется из строки символов в вид, соответствую- щий объявленному внутреннему формату. При выводе произво- дится обратное преобразование. Эти три способа ввода — вывода называются вводом — выводом потока данных. В языке PL/1 применяется также ввод —вывод записей. При вводе — выводе записей обрабатываемая информация понимается как дискретные записи, формат которых совпадает с форматом внутренних данных для языка PL/1. Назначение операции ввода заключается в том, чтобы скопировать запись, передав ее с устрой- ства ввода в оперативную память. Назначение операции вывода — копирование записи с передачей ее из оперативной памяти на устройство вывода. Поскольку считается, что запись должна содержать данные в такой форме, в которой они используются в машине, проведение преобразований во время ввода или вывода не предусматривается. Это означает, что при необходимости
374 Гл. 10, Как писать программу на языке PL/1 какого-либо преобразования программист должен это преду- смотреть сам. Следует отметить, что операции ввода — вывода записей являются обычно более быстрыми по сравнению с опе- рациями ввода — вывода потока, поскольку в последнем случае имеет место расход времени на преобразования. С другой стороны, поскольку вывод записей осуществляется в машинном коде, он удобен для файлов, хранимых на магнитных лентах или дисках. При решении научных задач более распространен ввод — вывод потока. В большинстве коммерческих приложений чаще используется ввод — вывод записей. Возможности управления операциями ввода — вывода в ком- пиляторе PL/1 невелики. Поэтому приходится обращаться к Системе Управления Вводом — Выводом (IOCS) операционной системы и указывать, что требуется, с помощью: 1. Карты DD в операционной системе OS (в системах TOS/DOS такого эквивалента нет); 2. Оператора DECLARE; 3. Оператора OPEN. Если для IOCS указаний нет, то иногда возможна интерпрета- ция по умолчанию. Рассмотрим сначала некоторые описатели, используемые в языке, а затем выясним, где они могут быть записаны. ENVIRONMENT. Формат описателя ENVIRONMENT (тип (размер-блока, длина-записи)). Различают три типа: F, V и U, что соответствует записям постоянной, переменной и неопределенной длины. Размер блока — это длина блока в байтах. Длина-записи включается только в случае файлов типа F и типа V — это размер записи, также выраженный в байтах. В случае наборов данных типа U и типа V указываются максимальные длины. BUFFERS(n). Здесь п — целое, которое меньше или равно 255. Если описатель не записан, предполагается, что п = 2. В опера- ционной системе OS этим определяется параметр BUFNO. В систе- мах DOS/TOS п 2. STREAM | RECORD (ПОТОК ЗАПИСИ). Если не задано ни то, ни другое, предполагается STREAM. INPUT | OUTPUT | UPDATE. Описатель UPDATE исполь- зуется только при работе с дисками, которая будет рассмотрена в разд. 11.9.
10.13. Ввод — вывод записей 375 PRINT. Этот описатель может быть задан, если заданы OUT- PUT и STREAM. В случае печати файла первый символ каждой выводимой строки используется для управления движением бумажной ленты на печатающем устройстве. LINESIZE (выражение). Применяется только для файлов с описателем PRINT; специфицирует длину печатаемой строки (включая символ управления). По умолчанию длина строки равна 120 печатных знаков. PAGESIZE (выражение). Указывает число строк, приходя- щихся на одну страницу. По умолчанию число строк равно 60. Описатель может быть указан только с описателем PRINT. BACKWARDS. Указывает на необходимость чтения магнитной ленты в обратном направлении. Если описатель отсутствует, то лента читается в прямом направлении. TITLE (выражение). Выражение преобразуется в строку сим- волов, и первые восемь символов используются для идентифика- ции файла в картах DD (OS) или ASSGN (DOS/TOS). Если описа- тель TITLE опущен, то используется имя файла. BUFFERED | UNBUFFERED. Эти описатели могут употреб- ляться только применительно к вводу — выводу записей. Следует иметь в виду, что в языке PL/1 и IOCS IBM-360 эти термины применяются в различных смыслах. В языке PL/1 файлом без буфера является такой файл, при котором входные данные вводят- ся в структуру, а выходные данные выводятся из структуры. В случае файла с буфером ввод и вывод данных осуществляется в буфер. Вопрос о буферах предполагается рассмотреть в разд. 11.3. Существуют также несколько описателей, которые применяют- ся только при работе с дисками. Чтобы объявить имя файла, нужно записать следующее: DECLARE имя-файла FILE описатели; Описатели, которые могут быть здесь использованы, следующие: STREAM, RECORD, INPUT, OUTPUT, UPDATE, PRINT, BUFFERED, UNBUFFERED, BACKWARDS, ENVIRONMENT, и BUFFERS. Имя-файла нужно объявлять в операторе DECLARE только в том случае, когда нужно задать хотя бы один описатель файла.
376 Гл. 10. Как писать программу на языке PL/1 • В Subset-PL/1 необходимо объявлять каждое имя файла, отличное от SYSIN и SYSPRINT, даже если никакие описатели не нужны. Прежде чем приступать к чтению или записи какого-либо фай- ла, он должен быть открыт. Открытие файла побуждает IOCS установить определенные управляющие биты, чтобы обеспечить правильную обработку данных. Наряду с этим при работе с маг- нитной лентой или диском осуществляется считывание и проверка меток при вводе или их создание при выводе. В языке PL/1 любой файл может быть открыт двумя способами: 1) явно — путем использования оператора OPEN; 2) неявным образом. Файл открывается неявным образом, если выполняется опера- тор GET, PUT или другой оператор ввода — вывода, относящийся к файлу, который не был открыт. Открытие файла неявным обра- зом не позволяет программисту вводить какие-либо описатели во время открытия. е В Subset-PL/1 открытие в неявной форме допускается только в случае ввода — вывода потока. Оператор OPEN должен выполняться для каждого файла, работающего с записями. Оператор OPEN имеет форму OPEN FILE (имя-файла) описатели; Если в один и тот же момент необходимо открыть несколько файлов, то оператор записывается в следующей форме: OPEN FILE (имя-файла1) описатели, FILE (имя-файла2) описатели, . . . ; В операторе OPEN можно указывать: INPUT, OUTPUT, UPDATE, TITLE, STREAM, RECORD, BUFFERED, UNBUF- FERED, BACKWARDS, PRINT, LINESIZE, PAGESIZE. Если описатели указываются не только в операторе OPEN, они должны быть согласованы. После того как файл открыт, можно получать записи путем использования оператора READ FILE (имя-файла) INTO (переменная); где переменная — это имя старшей структуры (т. е. уровня 1). Обратите внимание, что описатель GET используется для ввода — вывода потока, а описатель READ — для записей. Оператор READ FILE (имя-файла) IQNORE (выражение); обеспечивает вычисление выражения и преобразование получен- ного результата в целый тип. Если целое — положительное,
10.14. Вынесение описателей за скобки 377 то соответствующее количество записей из указанного файла пропускается без использования в программе. Если целое — отрицательное, оператор просто игнорируется. Оператор READ FILE (имя-файла); выполняется таким образом, как если бы было добавлено IGNORE(l). • В Subset-PL/1 использование описателя IGNORE не раз- решается. Вывод данных производится с помощью оператора WRITE FILE (имя-файла) FROM (переменная); где переменная — это имя старшей структуры. Первая же команда READ или WRITE, относящаяся к файлу, автоматически открывает этот файл. (В Subset-PL/1 автоматиче- ское открытие файлов не предусмотрено.) После обработки пользователем последней записи файла про- граммы IOCS должны получить указание закрыть файл (обрабо- тать хвостовые метки и т. п.). Для этого служит оператор CLOSE FILE (имя-файла^, FILE (имя-файла2), . . .; Оператор CLOSE для не открывавшегося файла игнорируется; игнорируется и оператор OPEN для файла, который уже открыт. После того как файл был закрыт, он может быть открыт снова. Однако, если файл закрывается, то теряются те описатели, кото- рые были указаны в операторе OPEN; остаются лишь описатели, записанные в операторе DECLARE. Поэтому можно закрыть файл, использованный для вывода, и затем открыть его повторно, но уже в качестве входного. 10.14. Вынесение описателей за скобки Если большое количество переменных объявляется с одина- ковыми описателями, то их можно объединить. Переменные заклю- чаются в круглые скобки, причем допускается вложение, и общие описатели записываются за правой скобкой. Например, возможен такой оператор: DCL((A FIXED(4, 0), В FIXED(3, 0), С FLOAT(6)) DECIMAL, D FIXED BIN(15, 0)) INIT(O); и он эквивалентен следующему: DCL A FIXED(4, 0) DEC INIT(0), В FIXED(3, 0) DEC INIT(0), C FLOAT(6) DEC INIT(0), D FIXED BIN(15,0) INIT(0);
378 Гл. 10. Как писать программу на языке PL/1 Упражнения № 25 1. Переделать упр. 24.4 в расчете на возможность обработки матрицы любого размера менее чем 10 х 10. Перед чтением первой карты с данными предусмотреть чтение карты, содержащей све- дения о размерах, а именно о числе строк в колонках 1—2 и числе столбцов в колонках 3—4. 2. Изменить упр. 1 таким образом, чтобы исключить необхо- димость в использовании первой карты. Программа должна пре- дусмотреть чтение карт до EOF, после чего использовать макси- мальную из размерностей, указанных во вводимых картах. 3. Колледж намеревается хранить регистрационные записи на магнитной ленте. Перед регистрацией колода карт перфори- руется в следующем порядке: Колонки 1—2 Крд факультета 3—5 Номер курса 6—7 Номер группы 8—27 Описание курса 28—29 Период времени 30—35 Дни 36—38 Максимально допустимый размер группы Составить программу, которая обеспечивала бы чтение этих карт и приготовление следующей магнитной ленты: Структура (frames) 1—2 Код факультета 3—5 Номер курса 6—7 Номер группы 8—27 Описание курса 28—29 Период времени 30 Дни (как строка битов) 31—32 Максимальный размер группы (десятичное число с фиксированной точкой) 33—34 Число зачисленных (вначале нуль) При размещении записей на магнитной ленте предусмотреть коэффициент блокирования, равный 5. 4. Используя ленту, приготовленную з соответствии с усло- виями упр. 3, составить программу чтения карт, содержащих дан- ные следующего характера: номер, присвоенный студенту (колонки 1—6) фамилия (колонки 7—46) факультет-курс-секция (колонки 47—53, 54—60, 61—67 и 68-74)
10,14» Вынесение описателей за скобки 379 На одного студента может приходиться свыше одной карты, если студент слушает более четырех курсов. Предусмотреть до трех карт на студента. Программа должна обеспечивать поиск данных на магнитной ленте, чтение записанных на ленте записей для каждого из двенадцати возможных курсов, которые может выби- рать студент, и осуществлять соответствующий контроль за тем, чтобы у студента не возникало затруднений, связанных, ска- жем, с необходимостью прослушивания двух курсов, читаемых в одно и то же время одного и того же дня. В случае возникнове- ния подобной ситуации предусмотреть печать расписания для сту- дента, указывая его номер и фамилию, а для каждого курса — название, описание и время. Пусть периоды времени нумеруются цифрами от 1 до 12 включительно.
Глава 11 БОЛЕЕ СЛОЖНЫЕ ЭЛЕМЕНТЫ ЯЗЫКА PL/1 11.1. Шаблоны В тех случаях, когда используется ввод — вывод записей, мы должны иметь возможность описать в операторе DECLARE точную форму вводимых или выводимых данных. Это означает, что в описаниях должны, в частности, допускаться такие символы редактирования, как знак доллара, точка, запятая, бухгалтер- ский знак кредита и т. п. В некоторых случаях язык PL/1 разре- шает описывать формат данных путем задания шаблона данных. Это описание задается вместо обычного типа описания, такого, как, скажем, CHAR(5). Например, шаблон вида '(5)9V99' может быть использован для описания поля, включающего пять деся- тичных цифр, подразумеваемую десятичную точку и затем еще две десятичные цифры. Все данные, описанные шаблоном, занимают один байт на сим- вол. Шаблон может описывать строку символов или десятичные данные, взятые в форме числа с фиксированной или плавающей точкой. Комплексные данные могут быть представлены шаблоном в том случае, если записан описатель COMPLEX, а вещественная и мнимая части имеют один и тот же шаблон. Применение шабло- нов не разрешено для двоичных данных. Давайте рассмотрим прежде всего шаблоны, описывающие десятичные данные. В этом случае приводимые ниже символы означают: 9 — любую десятичную цифру. V — подразумеваемую десятичную точку. Например, если мы хотим, чтобы поле, содержащее 23456, представ- ляло число 234.56, то нужно задать шаблон 999V99. Ни один символ в поле данных не соответствует сим- волу V; символ V только указывает подразумеваемое положение точки. S — место знака числа в поле; ставится знак +, если поле больше или равно 0, и знак — в противном случае. Я---место знака числа в поле; ставится знак +, если поле ^>0, и пробел в противном случае. ----место знака числа в поле; ставится знак —, если поле <0, и пробел в противном случае.
II.I. Шаблоны 381 E — место буквы Е в поле, указывающей начало пока- зателя степени числа с плавающей точкой. К — начало показателя степени числа с плавающей точ- кой, но по аналогии с V не соответствует никакому символу в поле. Т — цифру со знаком, который отперфорирован над этой цифрой. I — цифру со знаком, который отперфорирован над этой цифрой, если поле ^>0. R — цифру со знаком, который отперфорирован над этой цифрой, если поле <0. CR — два символа, которые появляются, если поле ^0. DB — два символа, которые появляются, если поле <0. F — наличие в шаблоне масштабного множителя. Мас- штабный множитель заключается в круглые скобки и может быть отрицательным или положительным. Он обрабатывается в точности как масштабный мно- житель, указанный в описании формата F. В шаблоне можно использовать только один символ знака S, , Т, I или R или же эквивалент (CR либо DB). Исключение составляет поле с плавающей точкой, которое состоит из двух подполей — мантиссы и показателя степени (порядка),—и оба подполя могут иметь собственные знаки. Для повторения символа в шаблоне перед ним в круглых скоб- ках записывается коэффициент повторения. Шаблон всегда заклю- чается в кавычки. Форма записи такова: DCL XYZ PICTURE 'шаблон' . . . ; Следует иметь в виду, что вместо слова PICTURE может быть использована его сокращенная форма РЮ. Рассмотрим несколько примеров: Шаблон Поле памяти Число '(5)9V99' 1234567 12345.67 '99999V99' 1234567 12345.67 'S99V9' +457 45.7 'S99V9' -457 -45.7 '+99V9' +457 45.7 '+99V9' Ь457 -45.7 '999Т' 676С 6763. '999Т' 676L -6763. '99F(2)' 78 7800. '99F(—2)' 78 .78 'V9999ES99' 7867Е+02 .7867*10» 'V9999KS99' 7867+02 .7867*10»
382 Гл. 11. Более сложные элементы языка PL/1 При использовании символов Т, I или R наличие пробивки 12 в карте означает знак -J-, а наличие пробивки 11 — знак — Применение описания типа F не разрешено в случае полей с пла- вающей точкой. Символ знака должен занимать крайнее левое или крайнее правое положение по отношению к каждому подполю в случае шаблона с плавающей точкой или же по отношению к одному полю в случае шаблона с фиксированной точкой. В числовых шаблонах допустимо использование некоторых других символов шаблона. Они предназначаются главным обра- зом для редактирования подлежащих печати выходных данных. Укажем эти символы: Z — Задает цифровые позиции, которые должны быть заме- нены пробелами, если в этих позициях окажутся левые незначащие нули. Так, число 00123 с шаблоном ZZZZZ отредактируется как ЬЫ23. * — Аналогичен символу Z. Различие заключается в том, что нули заменяются звездочками. Обычно исполь- зуется в долларовых шаблонах. Y — Аналогичен символу Z. Отличие заключается в том, что все нули, где бы они ни появились, заменяются пробелами. Поэтому запись 08/05/67 превратится в Ь8/Ь5/67, если использовался шаблон Y9/Y9/99. $ — Символ знака доллара; вставляется в указанную позицию. Этот символ может размещаться только в крайней правой или крайней левой части подполя. , — Запятая вносится в указанную позицию. Если нали- чие символов Z или * вызвало подавление нулей и циф- ровые символы слева от запятой отсутствуют, то запя- тая должна заменяться пробелом в случае символа Z или звездочкой в случае символа*. . — Аналогична запятой. Разница в том, что исполь- зуется точка. / — Аналогична запятой. Отличие заключается лишь в том, что использована будет косая черта. В — Пробел; вводится всегда в указанную позицию. Основное использование символов редактирования в шаблоне заключается в том, чтобы обеспечить указанное редактирование при помещении в память значения элемента, например DCL DF FIXED(5, 2) INIT(-4.6), DG’PICTURE '♦♦♦V.99CR'; DG = DF;
11.1» Шаблоны, 383 Если DF передается в DG, то редактирование осуществляется в соответствии с шаблоном для DG. Поэтому после выполнения оператора DG = DF; в DG окажется величина **4.60CR. Символы ♦ и Z используются только в левой части поля или подполя и обычно образуют цепочку символов. Еще четыре сим- вола ($, S, +, —) могут применяться таким же образом. Если эти символы появляются только один раз, они являются статическими символами и их функции совпадают с теми, которые описаны выше. Если же они появляются более одного раза, они являются плавающими символами и показывают, что знак дол- лара, плюс, минус или пробел должны быть введены именно перед старшей значащей цифрой в поле или в крайнюю правую позицию плавающего символа в строке. Такое использование символов вызывает замену левых символов пробелами. Редакти- рование выполняется точно так же, как в случае записи символов Z; отличие заключается лишь в том, что знаки +, — или знак доллара займут один символ в позиции, которая соответствовала бы самому правому пробелу. Рассмотрим примеры: Число Шаблон Результат 12.56 < $999V.99 $012.56 12.56 SZZ9V.99 $ 12.56 12.56 $**9V.99 $*12.56 12.56 $$$9V.99 $12.56 12.56 zzzz.zz 12 .06 $999V99 $000.06 .06 SZZ9V.99 $ 0.06 .06 $**9V99 $♦*0.06 .06 $$$9V.99 $0.06 .06 $$$$V.99 $.06 .06 $$99V.99 $00.06 .06 $$$$V.$$ $.06 .00 $$$$V.$$ (пробел) .00 <t> «««*** .06 zzzz.zz (пробел) .06 zzzzv.zz .06 312.56 zzzz.zz 3.12 Сделаем несколько замечаний. Если плавающий символ исполь- зуется справа от символа V, то он должен занимать все цифровые позиции (справа от V). Если поле равно нулю, то символ ♦ или пробел заменят все поле; в противном случае все позиции справа от V считаются значащими. Обратите внимание на то обстоя- тельство, что простая точка в шаблоне сама по себе не указы- вает компилятору действительное положение десятичной точки.
384 Гл. 11. Более сложные элементы языка PL/1 Поэтому при редактировании числа .06 с шаблоном, который не содержит V, компилятор предполагает, что десятичная точка находится справа от последнего символа редактирования, и поэтому теряет дробную часть поля. Шаблон может также быть использован и для строк символов. Шаблон для строки символов может включать любой символ, кото- рый может быть определен в числовом шаблоне, и должен вклю- чать по крайней мере один из следующих символов: А означает: символ может быть любым буквенным симво- лом или же пробелом. X означает: символ может быть любым символом из алфа- вита IBM-360. Добавим, что в шаблоне символьных строк цифра 9 означает любую цифру (0—9) или пробел. Шаблоны числовых данных (но не шаблоны строк символов) могут быть использованы как описатели форматов при вводе — выводе, управляемом редактированием. Форма записи следую- щая: Р'шаблон'. Это предоставляет возможность выполнить такое редактирование, которое не легко выполнить при использовании других форматов. Например, если X = 17.05 и Y = —3.45, мы можем воспользоваться таким оператором: PUT EDIT(X, Y) (F(7, 2), F(7, 2)); . Этот оператор обеспечит вывод точно такой же, как и другой оператор: PUT EDIT (X, Y) (P'(4)ZV.99',P'(4) - V.99'); • В Subset-PL/1 использование описателя Р при вводе — выводе, управляемом редактированием, не предусмотрено. 11.2. Псевдопеременные Перечисляемые ниже функции могут использоваться слева от знака равенства в операторе присваивания, в качестве пере- менной в группе DO или же как элемент списка данных в опера- торе GET. Эти же функции могут быть использованы и справа от знака равенства аналогично любой другой функции. SUBSTR(s, i, к) или SUBSTR (s, i). Значение выражения, приведенного справа от знака равенства, присваивается под- строке, определенной с помощью функции SUBSTR. Некоторые сведения о функции SUBSTR даны в приложении Е.
11.3. Ввод — вывод с буфером 385 UNSPEC(v). Скалярная переменная v, которая может быть арифметической величиной или строкой символов, но не может быть переменной типа метка, преобразуется в строку битов и при- сваивается v без преобразования в тип v. Длина строки битов равна числу байтов, занимаемых переменной v. COMPLEX(a, Ь). Вещественная часть выражения присваи- вается а, мнимая часть — Ь. Эти величины (а и Ь) могут иметь различные характеристики. REAL(c). Вещественная часть выражения присваивается вещественной части комплексной переменной с; мнимая часть этой переменной остается без изменений. IMAG(c). Мнимая часть выражения присваивается мнимой части комплексной переменной с; вещественная часть этой пере- менной остается без изменений. Следующие две функции используются при обработке пре- рывания, возникшего из-за ошибки при преобразовании данных (ситуация ON CONVERSION). ONSOURCE. Выражение преобразуется в строку символов и присваивается строке, в которой произошла ошибка, вызвавшая прерывание ON CONVERSION. В случае необходимости строка дополняется пробелами справа. ONCHAR. Выражение преобразуется в строку символов и используется для замены символа, вызвавшего ошибку. • В Subset-PL/1 могут быть использованы только функции SUBSTR, UNSPEC и ONSOURCE. 11.3. Ввод — вывод с буфером Рассмотрим программу, которая предусматривает чтение двух типов карт и для каждой читаемой кар ы делает короткую запись на магнитную ленту. Размещение данных на картах производит- ся следующим образом: Карты первого типа Кол. 1 1 2—6 Номер счета 7—14 Сумма $ххх,ххх.хх 15—19 Дата 20—80 пробел 25 Зак. 15635
386. Гл. 11. Более сложные элементы языка PL/1 Карты второго типа Кол. 1 Не 1 2—6 Дата 7—20 пробел 21—25 Номер счета 26—33 Сумма 34—80 пробел Когда вводится поток данных, карты разного типа могут идти в перемешку. Поэтому программист не в состоянии опреде- лить структуру, с которой придется иметь дело, до ввода карты. Нужно отметить, что из-за принятого порядка размещения данных на картах ввод данных в режиме потока вызывает трудности. В этих случаях решение заключается в том, чтобы не передавать данные в структуру сразу после чтения, а оста- вить данные в буфере и предусмотреть столько различных определений данных, сколько необходимо с учетом содержимого буфера. Принятое в языке PL/1 использование термина буфер отли- чается от использования его в IOCS. Если файл (на языке PL/1) определен как UNBUFFERED (без буфера), то создается буфер ввода — вывода для файла, а также область для структуры. Файл читается в буфер ввода — вывода, и нужная запись пере- дается в область структуры, задаваемую описателем INTO в опе- раторе READ . . . INTO имя-переменной; Если входной файл оформлен в виде блоков данных, то дебло- кирование производится в буфере ввода — вывода. Если файл определен как BUFFERED (с буфером), то никакая передача данных в область структуры не производится. Вместо этого в ука- затель (например, в общий регистр, используемый в качестве базового регистра) устанавливается адрес обрабатываемой записи. Если входной файл определен с буфером, то очередная запись делается доступной программе обработки просто за счет соот- ветствующего продвижения указателя. При этом фактически программами IOCS могут использоваться два буфера для тогог чтобы совместить обработку записей с чтением следующего блока; это не влияет на организацию буферов с точки зрения языка PL/1. Выходная запись, которая должна получиться после чтения карт указанных двух типов, должна насчитывать 19 символов и иметь коэффициент блокирования, равный десяти. Формат записи следующий:
11.3. Ввод — вывод с буфером 387 1 Тип 2—6 Номер счета 7—14 Сумма 15—19 Дата Можно составить такую программу: ОТТ: PROCEDURE; DCL 1 CD A CONTROLLED^), 2 TYPE CHAR(l), 2 ACCT CHAR(5), 2 AMT PIC '(6) 9V9R', 2 DATE CHAR(5), 3 BLANK CHAR(61), 1 CDB CONTROLLED(P), 2 TYPE CHAR(l), 2 DATE CHAR(5), 2 BLANK CHAR(14), 2 ACCT CHAR(5), 2 AMT PIC'(6)9V9R', 2 BLK CHAR(47), 1 TAPE, 2 TYPE CHAR(1), 2 ACCT CHAR(5), 2 AMT PIC'(6)9V9R' 2 DATE CHAR(5), P POINTER, SYSIPT FILE INPUT RECORD BUFFERED ENVIRONMENT (F, 80, 1), SYS007 FILE OUTPUT RECORD UNBUFFERED ENVIRONMENT (F, 19, 1); OPEN FILE (SYSIPT), FILE (SYS007); ON ENDFILE (SYSIPT), GO TO BRCH2; BRCH1: READ FILE (SYSIPT) SET(P); IF CDA. TYPE = 1 THEN TAPE = CD A, BY NAME; ELSE TAPE = CDB, BY NAME; WRITE FILE (SYS007) FROM 25*
388 Гл. 11. Более сложные элементы языка PL/1 ТАРЕ; GO ТО BRCH1; BRCH2: CLOSE FILE (SYSIPT); CLOSE FILE (SYS007); END CTT; Описатель CONTROLLED(P) говорит компилятору, что струк- тура должна быть при буфере и что Р — это обычный указатель для буфера. Переменная, такая, как CD А, которая адресуется относительно указателя, называется базированной переменной. Поскольку и переменная CDA и переменная CDB рассматривают- ся относительно одного и того же указателя, по своему действию это — два раздельных описания одной и той же области данных. Теперь, если адресовать область, используя имена из CDA, тем самым получается тип расположения данных, указанных при организации структуры CDA. Если же вместо этого использовать имена из CDB, то получается организация структуры GDB. Переменная Р определяется просто как переменная типа POINTER. Простое присутствие переменной Р, следующей за ключевым словом CONTROLLED, определяет Р как указатель, так что нет никакой необходимости объявлять это Р, если только не возникает потребность дать в программе некоторые допол- нительные описатели. • В Subset-PL/1 все переменные типа указатель должны объявляться. В приведенной выше программе объявлены два файла с имена- ми SYSIPT и SYS007. Мы решили (совершенно произвольно) перечислить описатели в объявлении, а не в операторе OPEN. Следует иметь в виду, что при отсутствии в записи описателя BUFFERED по умолчанию предполагается описатель UNBUF- FERED. Приведенная программа является относительно простой. После чтения файла с именем SYSIPT устанавливается указатель Р. При наличии 1 в колонке 1 мы имеем запись типа один и исполь- зуем формат CDA; в противном случае используется формат CDB. Указатель сохраняется до тех пор, пока следующий описа- тель SET не встретится в следующем операторе READ, который устанавливает тот же самый указатель • В Subset-PL/1 использование варианта BY NAME не раз- решено. Вместо этого следовало бы записать IF CDA. TYPE = 1 THEN DO; TAPE. TYPE = CDA. TYPE; TAPE. ACCT = CDA. ACCT;
11.3. Ввод — вывод с буфером 389 ТАРЕ. АМТ == CDA. АМТ; ТАРЕ. DATE = CDA. DATE; END; ELSE . . . Описать структуру CDA (но не CDB) можно и по-другому, а именно: DCL 1 CDA CTL(P), 2CDAA, 3 TYPE CHAR(l), 3 АССР CHAR(5), 3 АМТ PIC '(6)9V9R', 3 DATE CHAR(5), 2 BLANK CHAR(61); при этом обязательным является использование оператора IF CDA. TYPE = 1 THEN TAPE = CDAA; ELSE . . . и целого ряда отдельных операторов для CDB. (Между прочим, в случае применения этого метода получится более быстрая объектная программа, чем при использовании варианта с BY NAME (если это разрешено).) Форма оператора ввода в случае входных файлов с буфером всегда следующая: READ FILE (имя-файла) SET (переменная-указатель); Мы использовали в программе обычный оператор WRITE. Вывод данных из буфера возможен, хотя полезность такого спо- соба носит ограниченный характер. В операторе DCL для ТАРЕ мы могли бы добавить CTL(Q) (заметим, что мы можем исполь- зовать сокращение CTL вместо полного слова CONTROLLED и затем объявить Q: Q POINTER, Изменилась бы только часть программы, помеченная меткой BRCH1. Она была бы заменена на BRCH1: READ FILE(SYSIPT) SET(P); LOCATE TAPE FILE(SYSIPT) SET (Q); IF CDA. TYPE = 1 THEN TAPE = CDA, BY NAME; ELSE TAPE =-- CDB, BY NAME; GO TO BRCH1;
390 Гл. 11, Более сложные элементы языка PL/1 Оператор LOCATE имеет форму LOCATE переменная FILE (имя-файла) SET (переменная-указатель); Переменная в операторе LOCATE, так же как и переменные в операторе READ, должна быть базированной переменной стар- шей структуры. Оператор LOCATE обеспечивает наложение структуры, объявленной в ТАРЕ, на область, указываемую в Q. Нужно помнить, что выполнение оператора LOCATE не вызывает выполнения операции вывода; вывод данных производится немед- ленно перед следующим оператором LOCATE или WRITE, в кото- ром встречается обращение к тому же самому файлу. Выполнение оператора CLOSE для файла или достижение конца процедуры вызывает запись последней записи. Поэтому после оператора LOCATE можно постепенно формировать необходимую запись, которая не будет записываться до появления следующего опера- тора LOCATE. В некоторых задачах (в данной программе это не имеет смысла) путем размещения оператора LOCATE непо- средственно перед оператором READ можно воспользоваться одной и той же входной и выходной областью, используя указа- тель Р в качестве указателя для обоих файлов. Переменные типа указатель могут быть использованы в опе- раторах присваивания, но операторы должны иметь форму переменная-указатель = выражение-указатель где выражение-указатель является либо другой переменной типа указатель, либо функцией. Приведем пример Q = ₽; Здесь указатель Q устанавливается равным некоторому текущему значению Р. В языке PL/1 предусматриваются две стандартные функции: ADDR (переменная) NULL Функция ADDR устанавливает указатель равным адресу оперативной памяти, где хранится заданная переменная, которая может быть (но не обязательно) структурой. Функция NULL устанавливает указатель в специальное нулевое значение, так что он больше ни на что не указывает. Обе эти функции используются главным образом при решении задач, связанных с обработкой списков. Если записано CD А. АМТ, компилятор предполагает, что Р будет использоваться как указатель, поскольку объявлялось, что CDA использует Р. Если имеет смысл действовать подобным
11.4. Операторы GET и PUT STRING 391 образом, то программист может заменить обычный указатель, приписанный переменной в операторе DECLARE, другим, задав, например, Q — >CDA.AMT Это означает, что в дальнейшем будет использоваться Q, а не обычный указатель. Мы могли бы записать заранее Q=P или Q = ADDR (CDA); Символ операции — > (знак минус, за которым следует знак больше чем) читается: указывает на и обрабатывается как один символ. • Символ операции — >• не используется в Subset-PL/1 и во всех версиях PL/1 для OS. 11.4. Операторы GET и PUT STRING Предположим, что карты в предыдущем разделе прочитаны и их требуется записать на магнитную ленту с полями TYPE и АМТ в форме десятичных чисел с фиксированной точкой. Программа могла бы иметь такой вид: СТТ: PROCEDURE; DCL 1 CDA CHAR(80) CTL(P), 1 CDB CTL(P), 2 TYPE CHAR(l), 2 BLANK CHAR(79), 1 TAPE, 2 TYPE FIXED(1, 0), 2 ACCT CHAR(5), 2 AMT FIXED (8, 2), 2 DATE CHAR(5), P POINTER, SYSIPT INPUT RECORD BUFFERED ENVIRONMENT (F, 80,1), SYS007 OUTPUT RECORD UNBUFFERED ENV (F, 19,1); OPEN FILE (SYSIPT), FILE (SYS007); ON ENDFILE (SYSIPT) GO TO BRCH2; BRCH1: READ FILE (SYSIPT) SET(P); IF CDB. TYPE = 1 THEN
392 Гл. 11. Более сложные моменты языка PL/1 GET STRING (CDA) EDIT (TAPE. TYPE, DATE, ACCT, AMT) (R(FMT)); ELSE] GET STRING (CDB) EDIT (TAPE. TYPE, ACCT, AMT, DATE) R(FRT)); WRITE FILE (SYS007) FROM TAPE; GO TO BRICH1; BRCH2: CLOSE FILE (SYSIPT); CLOSE FILE (SYS007); FMT: FORMAT (F(l), A(5), F(3, 2), A(5)); FRT: FORMAT (F(l), A(5), X(14), F(3, 2), A(5)); END CTT; Здесь использован новый оператор GET STRING(CDA)EDIT (список-данных) (форматы); В любом операторе GET или PUT можно записать STRING (переменная-строка-символов) вместо FILE (имя-файла). Функции оператора при этом будут аналогичны функциям обычных опера- торов GET или PUT. Разница лишь в том, что вместо вводимой извне или выводимой информации используется строка символов с заданным именем (в данном случае CD А). Поэтому действие оператора GET STRING (CDA) EDIT... эквивалентно управляе- мому редактированием вводу данных, которые содержат строку символов, задаваемую переменной CDA. В результате выполнения такого оператора строка символов редактируется в структуру для ленты. Строка в CDA остается не измененной. Слово STRING может быть записано в любом операторе GET или PUT, но практически оно встречается редко; исключение составляет ввод — вывод, управляемый редактированием. 11.5. Обычные блоки Обычный блок (блок. BEGIN) имеет форму метка: BEGIN; операторы END [метка]; Обычный блок записывается аналогично простой группе DO и может быть размещен в любом месте, где может быть записан простой оператор. Как правило, блок указывается в операторе
11.5. Обычные блоки 395 ON или операторе IF, но может появиться и в любом другом месте программы. Различие между обычным блоком и группой DO состоит глав- ным образом в области действия имен. В группе DO, если записан оператор DECLARE (не разрешено в Subset-PL/1), указанное имя определено (и может быть использовано) во всей программе. В случае же имени, объявленного в обычном блоке, дело обстоит совершенно иначе. Объявленные в блоке идентификаторы лока- лизованы только в этом блоке; вместе с тем имена, объявленные в процедуре, внешней по отношению к блоку, также локализованы в блоке, если только такое имя не объявлено также и в блоке. • В Subset-PL/1 оператор DECLARE может следовать только* за оператором BEGIN или другим оператором DECLARE. В качестве иллюстрации приведем такой фрагмент программы: ABC: PROC; DCL X CHAR(5), Y FLOAT(6), Z FIXED(7, 2); IF Y > 0 THEN GO TO BGNBK; BGNBK: BEGIN; DCL U CHAR(6), V BIN FIXED (31, 0), W BIT(4), X FIXED(4, 0); END BGNBK; END ABC; Идентификаторы U, V, W и X определены в блоке BGNBK. Идентификаторы X, Y и Z определены вне блока. В основной программе вне блока можно пользоваться переменными X (сим- вольная переменная), Y и Z; переменными U, V и W пользоваться нельзя. Внутри блока можно пользоваться переменными U, V и W, а также X (переменная с фиксированной точкой). Кроме того, внутри блока можно пользоваться переменными Y и Z. В то же время символьная переменная X, объявленная вне блока, в нем не определена и не может быть использована. Обычные блоки могут оказаться особенно полезными в тех случаях, когда программист вводит некоторый стандартный обыч- ный блок для обработки некоторой указанной в операторе ON ситуации прерывания. До тех пор пока блок использует только
394 Гл. 11. Более сложные элементы языка PL/1 собственные переменные, он не затрагивает другие переменные в программе вне этого блока. Иногда желательно, чтобы переменная, объявленная в обычном блоке, стала переменной, объявленной и вне блока. В подобных случаях можно воспользоваться описателем EXTERNAL, кото- рый просто добавляется к объявлению переменной. Действие этого описателя заключается в том, что переменная объявляется и вне блока, в котором она объявлена первоначально. Размер внешних имен ограничивается семью символами, что обусловлено необходимостью сообразовываться с требованиями операционных систем; например, оператор DCL U CHAR(6) EXTERNAL; делает U внешним именем и, следовательно, определенным внутри и вне блока. Вне блока означает, что переменная становится опре- деленной в каждом другом блоке, в котором содержится блок BGNBK. Блоки могут быть вложены один в другой аналогично группам DO. Правила, касающиеся области действия имён, применимы при входе в каждый блок, и не делается никаких различий относительно того, где данное имя было определено. •Упражнения № 26 1. Дано: DCL Л PIC'-V.(8)9ES99', J2 PIC'-9V.(7)9KS99', J3 PIC'S9V.(7)9E9R', J4 PIC'(4)9V.(4)9— J5 PIC'(4)ZV.(4)9—', J6 PIC'ZZ,9V99.99', J7 PIC'Z,(3)Z,ZZ9V.', J8 PIC'(4)—.99', J9 PIC'(3)Z9V.(4)9— J10 PIC'ZB(3)ZV.(4)9—', Jll PIC'*.***,♦***+', J12 PIC'*.***V,(4)*—', J13 PIC'999YY99', J14 PIC'+,+++',+V-}-+'; JI, J2, J3, J4, J5, J6, J7, J8, J9, J10, Jll, J12, r13, J14 = 234.56; Указать содержимое каждого J. 2. Сделать то же самое, что и в упр. 1, для всех значений J, равных: а) —7809.3724; Ъ) -.37; с) 2003; d) 7.894436.
11.6. Функции 395 3. Что отпечатается в следующей программе: DCL ВН BIT(16) INIT ('1101001111101000'В), CH CHAR (2); CH = UNSPEC(BH); PUT LIST (CH); END; 4. Переделать упр. 25.3 так, чтобы предусмотреть ввод и вывод с буфером. 5. Переделать пример, приведенный в разд. 10.8, предусмотрев ввод — вывод записей. Для выполнения преобразования данных воспользуйтесь операторами GET(PUT) STRING. 6. Для обработки конца файла в примере, приведенном в разд. 11.3, ввести обычный блок. 11.6. Функции Кроме функций, являющихся частью языка PL/1, программи- сту может иногда понадобиться записать свою функцию. Вообще это может потребоваться по двум причинам: 1) функция необхо- дима для нескольких программ, а желательно запрограммировать ее только один раз или 2) функция настолько сложна, что отладка программы существенно упростится, если программу функции можно будет отладить отдельно. Функция записывается как специальный тип процедуры — процедуры-функции. Проиллюстрируем это на примере функ- ции, предназначенной для подсчета количества гласных в задан- ной строке символов. ABC: PROCEDURE OPTIONS(MAIN); DCL ARY CHAR(32), ASU CHAR(32), NUMB = VOWELS(ASU); . . . ; JK = VOWELS(ARY); . . . ; END ABC; VOWELS: PROCEDURE(S) BIN FIXED; DCL S CHAR(32), 1 R DEFINED S, 2 T(32) CHAR(l), CT FIXED BIN; CT = 0; J = 0; B: J = J + 1; IF T(J) = 'A' | T(J) = 'E' | T(J) = T | T(J) = 'O'| T(J) = 'U' THEN CT = CT 4- 1; IF J -] = 32 THEN GO TO B; RETURN (CT); END VOWELS;
396 Гл, 11, Более сложные элементы языка PL/1 В основной программе мы записали OPTIONS (MAIN) в опе- раторе PROCEDURE. Это означает для компилятора, что АВС есть процедура, управление которой передается при выполнении объектной программы. В основной программе предусмотрено обра- щение к VOWELS как к имени функции. Поскольку это имя должно сообразовываться с правилами составления имен для процедур, оно должно начинаться с буквы и содержать не более 7 символов. Чтобы определить функцию, необходимо указать в процедуре имя функции как имя процедуры; также нужно определить фор- мальный параметр S. Описатель FIXED BIN говорит о том, что результатом вычисления функции будет двоичная величина с фик- сированной точкой и с разрядностью по умолчанию (15,0). Формальные параметры, определенные в операторе PROCEDU- RE, должны согласовываться по типу, виду и разрядности с аргу- ментами, которые предполагается использовать в тех программах, из которых будет выполняться обращение к этому оператору. Функция может иметь любое необходимое количество аргу- ментов. В операторе DECLARE в приведенном выше фрагменте S определено как 32-байтовая строка символов. Это определение должно согласовываться с тем, что используется в основной про- грамме для переменных ARY и ASU. Переменная S переопреде- ляется, так что S можно выбирать побайтно, используя индекс J, который не объявляется; по умолчанию I будет иметь тип FIX BIN(15,0). После перебора всех 32 символов значение пере- менной СТ, выполняющей роль счетчика, будет равно числу встретившихся гласных. Для того чтобы закончить выполнение процедуры-функции, используется оператор RETURN (СТ); Эта форма оператора RETURN применяется только в функциях. Значение, указываемое в скобках, является результатом вычис- ления функции. В общем виде оператор RETURN может быть представлен так: RETURN (выражение); Выражение преобразуется в соответствии со спецификациями, заданными в операторе PROCEDURE, и получаемое значение затем передается (через общий регистр 0 в IBM-360) в основную программу. В нашем случае переменная СТ уже имеет тип FIXED BIN(15,0), так что надобности в проведении каких-либо преобразований нет. Оператор PROCEDURE имеет следующую общую форму: имя: PROCEDURE (параметр!, . . ., параметр^ описатели;
11,6. Функции 397 Если- описатели не указаны, то первая буква имени функции определяет тип: FIXED BIN(15,0), если имя начинается с буквы I — N, и тип FLOAT DEC(6,0), если имя начинается с любой другой буквы. Строго говоря, согласованность типа и разрядно- сти аргументов основной программы и формальных параметров функции не является абсолютно необходимой, однако нарушение согласованности приводит к появлению лишних команд, осуще- ствляющих соответствующие преобразования. В нашем примере функция записана как полностью отдель- ная процедура. Разрешается включать одну процедуру в другую. Поэтому можно записать ABC: PROC OPTIONS (MAIN); VOWELS: PROC(S) BIN FIXED; END VOWELS; END ABC; В отличие от группы DO и обычного блока вход в процедуру никогда не может быть осуществлен при последовательном выпол- нении операторов. Поэтому, если оператор, выполняемый перед «VOWELS: PROC . . .», не является оператором GO ТО, то сле- дующим будет выполнен оператор, следующий сразу же за «END VOWELS»;. Если одна процедура записана в другой, то область действия имен аналогична тому, что имеет место в обычном блоке. Вообще же, если одна процедура написана в другой, то она записывается в конце программы. Один оператор END может обслуживать обе процедуры (это неверно для Subset-PL/1, в кото- ром требуется использование отдельных операторов END). Из функции можно выйти с помощью оператора GO ТО и перейти на некоторый оператор, находящийся вне функции, но входящий в процедуру, которая содержит процедуру-функцию. В этом случае функция остается невычисленной. Такой выход рассматривается как аварийный и обычно не применяется. Аргументами функции может быть: массив, скалярная пере- менная или структура. Существуют только два способа передачи управления на про- цедуру. Первый заключается в том, что ее вызывают как функ- цию. Другой способ предполагает применение оператора CALL, с которым мы познакомимся в следующем разделе. В подавляю- щем большинстве случаев функции компилируются отдельно
398 Гл. 11. Волее сложные ялеженты языка PL/1 от основной процедуры и заносятся в библиотеку перемещаемых модулей, откуда они могут быть вызваны любой программой. Программы, написанные на языке PL/1, могут вызывать функ- ции, записанные на других языках, таких, как Фортран и язык Ассемблера. 11.7. Процедуры-подпрограммы В предыдущем разделе мы использовали функцию для того, чтобы для основной программы подсчитать количество гласных, имеющихся в 32-байтовой символьной строке. Пусть теперь тре- буется получить сведения не только о числе гласных, но и коли- честве ^пробелов в строке. Одной из особенностей функции является то, что она передает только одно значение в основную программу. Когда же возникает необходимость в том, чтобы получить несколько значений, тогда обычно используют под- программу. В целях иллюстрации приведем такую подпрограмму, написанную на языке PL/1, повторяя, по существу, программу из предыдущего раздела, но используя при этом подпрограмму с именем VOWSP для подсчета числа гласных (значение пере- менной CTV) и числа пробелов (значение переменной CTSP): ABC: PROC OPTIONS(MAIN); DCL ARY CHAR(32), ASU CHAR(32); CALL VOWSP (ASU, NUMB, NUMSP); NUCNS = 32 - NUMB - NUMSP; CALL VOWSP (ARY, NUMB, NUW); END ABC; VOWSP: PROC (S, CTV, CTSP); DCL S CHAR(32), 1 R DEFINED S, 2T (32) CHAR(l), (CTV, CTSP) FIXED BIN; CTV = 0; CTSP = 0; J = 0; B: J = J + 1; IF T(J) = 'A' | T(J) = 'E' | T(J) = 'Г | T(J) = 'O'| T(J) = 'U' THEN CTV = CTV + 1; ELSE IF T(J) = ' ' THEN CTSP + 1; IF J П = 32 THEN GO TO B; RETURN; END VOWSP;
11.7. Процедуры-подпрограммы 399 Процедура-подпрограмма VOWSP по внешнему виду сильно напоминает функцию. В данном случае процедура-подпрограмма записана как независимая процедура, хотя она может быть запи- сана в основной процедуре аналогично функции. В процедуру- подпрограмму введены три параметра: S, CTV и CTSP. Здесь S соответствует входным данным из основной программы, a CTV и GTSP — двум значениям, возвращаемым в основную программу. Параметры можно описывать в любой последовательности, но при этом необходимо соблюдать соответствие с аргументами в опера- торе CALL. Оператор CALL основной программы передает теку- щие значения аргументов (ASU, NUMB и NUMSP — для первого CALL) в стандартную подпрограмму. Когда выполняется опера- тор RETURN (или, что эквивалентно, оператор END), текущие значения аргументов передаются назад в основную программу. Таким образом процедура-подпрограмма может изменять значе- ния одного или же всех аргументов. Различие при использовании подпрограммы и функции заключается в том, что для обращения к подпрограмме исполь- зуется оператор CALL. Форма записи его такова: CALL имя (параметр!, . . ., параметр^; или просто CALL имя; если передача параметров не нужна. В процедуре-подпрограмме мы замечаем некоторые особен- ности. В операторе PROCEDURE, так же, как для функции, указаны формальные параметры, но в нем нет спецификаций типа и разрядности, поскольку нет явно возвращаемой в основную программу переменной. По той же причине в операторе RETURN отсутствует выражение. При выборе имени процедуры-подпро- граммы (так же, как и для функции) следует сообразовываться с правилами написания внешних имен для операционных систем, однако не существует правил умолчания об основании системы счисления, способе представления и точности в зависимости от пер- вой буквы имени подпрограммы. В то время как функции размещаются обычно вне основной процедуры, обычное место процедур-подпрограмм — внутри основной процедуры. Это дает возможность основной программе обращаться к подпрограмме, вообще не задавая аргументов. Если программа очень длинна, то в большинстве случаев экономия времени может быть достигнута путем разбиения программы на части. При этом одна часть, скажем, сегмент MAIN или ROOT, просто обеспечивает вызов одной подпрограммы за другой
400 ZU. 11. Более сложные элементы языка PL/1 и реализует связи между ними. Подпрограммы можно отладить независимо, а затем объединить в единую программу. Если разместить подпрограмму внутри основной процедуры, то подпрограмму пришлось бы модифицировать, например, так: S = ARY; GALL VOWSP; NUMB = CTV; NUW = CTSP; а объявления S, CTV и CTSP перенести в основную про- цедуру. И функции, и процедуры-подпрограммы называют просто подпрограммами — название, общее для группы операторов, кото- рая вызывается некоторыми другими операторами и которая обычно возвращает управление вызывающей программе. Любая подпрограмма может вызывать другие подпрограммы и случай вложения, скажем, пятнадцати вызовов подпрограмм — это не такое уж необычное явление. Аналогично функции, оператор GO ТО может использоваться для организации аварийного выхода из подпрограммы. В языке PL/1 различие между функцией и процедурой-под- программой заключено лишь в возможности вызова функции непо- средственно без использования оператора CALL и в том, что одно значение функция передает в основную программу явно. Если функция является внутренней по отношению к основной программе, использование имен, определенных вне процедуры- функции, может оказаться весьма эффективным для осуществле- ния передачи (неявным образом) нескольких переменных в про- грамму, как это имеет место в случае подпрограммы. Поэтому можно рассматривать функцию как подпрограмму, которую мож- но вызывать неявным образом. 11.8. Операторы ENTRY Нередко два различных вычисления оказываются настолько схожими, что у программиста появляется естественное желание объединить их в одной программе. Например, встроенные функции, предназначенные для вычисления значений синуса в градусах и в радианах, различаются только одной дополнитель- ной операцией умножения в начале вычислений. Аналогичным образом, вычисление значений арктангенса также в градусах и радианах отличается лишь одной операцией умножения в конце вычислений. В случае подпрограммы или функции оператор Метка: ENTRY (параметр!, . . ., параметрп);
11.8. Омраторы ENTRY 401 может быть использован для получения второго входа (ENTRY) в процедуру. Оператор ENTRY должен иметь по меньшей мере одну метку, так же как и оператор PROCEDURE. • В Subset-PL/1 операторы ENTRY и PROCEDURE могут иметь только одну метку. Вместе с тем допускается написание двух операторов ENTRY (одного за другим) с разными метками. Поэтому в Subset-PL/1 недопустима запись вида ABC: DEF: ENTRY . . .; но можно записать ABC: ENTRY . . DEF: ENTRY . . .; Совсем необязательно, чтобы параметры, указанные в опера- торе ENTRY, согласовывались каким-либо образом с парамет- рами, определенными в операторе PROCEDURE, и, так же, как и в операторе PROCEDURE, параметры вообще могут отсут- ствовать. Когда процедура вызывается по имени ENTRY, обра- ботка начинается с первого выполнимого оператора, следующего после оператора ENTRY Оператор ENTRY при обычном после- довательном выполнении операторов в процедуре во внимание не принимается. Приводимая ниже подпрограмма выбирает индекс максималь- ного или минимального элемента в векторе с десятью компонен- тами и передает результат в основную программу: MAXNO: PROCEDURE (A) FIXED BIN; DCL А (10) FLOAT, X FLOAT; X = MAX (A (1), A (2), A (3), A (4), A (5), A (6), A (7), A (8), A (9), A (10)); BR: N = 1; IF A (N) = X THEN RETURN (N); N = N + 1; GO TO BR; MINNOt ENTRY (A); X = MIN (A (1), A (2), A (3), A (4), A (5), A (6), A (7), A (8), A (9), A (10)); GO TO BR; END MAXNO; 26 Зак. 15635
402 11, Более сложные элементы языка PL/1 Если в основной программе имеется оператор J = MAXNO (R); где R объявлен как вектор с плавающей точкой и с десятью ком- понентами, то J получится равным индексу максимальной ком- поненты R. В случае же использования оператора К - MINNO (R); переменная К получится равной индексу минимального компо- нента R. Заметим, что процедура-функция использует функ- ции МАХ и MIN. Вообще функции в функциях- используются без ограничений. 11.9. Дисковый ввод — вывод Язык PL/1 рассчитан на использование стандартных после- довательных файлов, индексно-последовательных файлов и файлов с прямым доступом. Обращение к файлу может быть либо последовательным, либо произвольным. В операторе DECLARE файл задается одним из следующих описателей: CONSECUTIVE INDEXED REGIONAL Если ни один из трех типов файлов не указан, то по умолча- нию предполагается тип CONSECUTIVE (последовательный). Тип CONSECUTIVE означает, что файл — стандартный и с последо- вательный обращением;, в случае типа INDEXED (индексный) файл является индексно-последовательным; в случае типа REGIO- NAL (региональный) речь идет о файле с прямым доступом. Если файл не является стандартным последовательным, то он должен иметь ключи. Либо в операторе DECLARE, либо в операторе OPEN необходимо указать: KEYED (длина) где длина определяется как десятичная целая константа. Напри- мер, KEYED (6) определяет 6-байтовое поле ключа. В операторах DECLARE или OPEN применяют также описа- тели SEQUENTIAL DIRECT задающие последовательное или произвольное обращение. Если описатель не указан, то по умолчанию предполагается описатель
11.9. Дисковый ввод — вывод 403 SEQUENTIAL. В языке PL/1 обращение к файлам с прямым доступом возможно только в произвольном порядке. Если файл определен описателем INPUT как входной, то воз- можно использование только оператора READ. Если файл опре- делен описателем OUTPUT как выходной, то может быть исполь- зован только оператор WRITE. Если же файл определен описа- телем UPDATE как требующий внесение изменений, то после оператора READ может быть задан оператор REWRITE, что позволяет заменить запись записью с внесенными изменениями. Никаких других разновидностей операторов OPEN и DECLARE нет. Оператор CLOSE сохраняет свою форму и функции полно- стью. В операторе READ допустимо применение следующих двух дополнительных описателей: KEY (выражение); KEYTO (переменная-типа-строки-символов); В случае файла, описанного как «DIRECT», следует обязательно указать описатель «KEY (выражение)». Выражение в описателе KEY содержит ключ записи, которая должна быть прочитана. Описатель KEY нельзя использовать в случае последовательного файла. Описатель KEYTO необязателен для файла с ключами и описателем SEQUENTIAL. Если же описатель KEYTO исполь- зован, то ключ из записи помещается в указанную переменную типа строки символов. Применение описателя KEYTO запреще- но в файлах с прямым доступом. е Описатель KEYTO не может быть использован в Subset- PL/1. Для оператора WRITE единственное изменение состоит в том, что для файлов, задаваемых описателем DIRECT, необходимо записать следующий описатель: KEYFROM (выражение); Для последовательных файлов, имеющих ключи, это необя- зательно. Выражение в операторе задает переменную типа строки символов, содержащую поле ключа. Так, операторы DCL F FIXED (8,2); WRITE FILE (DSKOUT) FROM OTP KEYFROM (F); вызывают преобразование переменной F в строку символов (с дли- ной, указанной описателем KEYED (длина) в операторе OPEN или DECLARE) для использования в качестве ключа для новой записи. Для файлов, заданных описателем UPDATE, оператор REWRITE FILE (имя-файла) [KEY (выражение)] [FROM (переменная)]; 26*
404 Гл. 11. Более сложные элементы языка PL/1 используется для замены существующей записи. Оператор WRITE всегда создает новую запись; оператор REWRITE заме- няет существующую запись с тем же самым ключом или в той же самой последовательности по порядку. Обычно, но не обязательно, это бывает запись, предварительно прочитанная в оперативную память. Описатель «KEY (выражение)» необходим для файлов, заданных описателем DIRECT, и не разрешен во всех других случаях. Выражение преобразуется в строку символов и исполь- зуется как ключ записи, которая должна быть заменена. Описатель FROM обязателен в операторе WRITE и может опускаться в операторе REWRITE. Если описатель FROM опу- щен, то перезаписывается последняя прочитанная в буфер запись. В частности, если оператор REWRITE без описателя FROM следует за оператором READ INTO, то запись перезаписывается без изменений, т. е. в том виде, в каком она была прочтена; однако, если оператор REWRITE без описателя FROM следует за опера- тором READ SET, то перезаписываемая запись может отличаться от прочтенной, поскольку программа может переработать запись прямо в буфере. Поэтому при корректировке записей обычно поль- зуются последовательностью операторов READ INTO REWRITE FROM или READ SET REWRITE При этом при необходимости добавить новые записи в файлы используется оператор WRITE. Для последовательного файла, открытого как UPDATE, применение оператора WRITE не допу- скается. В общем же случае язык PL/1 допускает использование любой формы ввода — вывода, которая разрешена операционной системой, потому что компилятор просто связывает рабочую про- грамму с подпрограммами IOCS. 11.10. Классы памяти Программист может управлять распределением оперативной памяти для всех типов данных, объявленных в операторе DECLARE. Могут быть указаны четыре класса памяти: STATIC AUTOMATIC CONTROLLED CONTROLLED (указатель)
11.10. Классы памяти 405 Тип CONTROLLED мы не рассматриваем. Если переменная объявляется как STATIC, то память для этой переменной отво- дится в начале выполнения программы и не освобождается до кон- ца ее выполнения. Если переменная объявляется как AUTO- MATIC, то память отводится каждый раз при входе в процедуру и освобождается при выходе из нее. Если память для данных уже отведена при входе в процедуру, а новый вход в процедуру про- исходит до выхода из нее, то уже отведенная память «опускается» в магазин и отводится новая память, которая используется до пер- вого выхода из процедуры, после чего восстанавливается («под- нимается» из магазина) ранее выделенная память. Такая методика распределения памяти требуется при организации рекурсивного программирования, с которым мы не знакомились. Для данных с описателем CONTROLLED (указатель) память отводится, когда выполняется оператор READ SET (указатель), и сохраняется за ними до следующего отведения памяти для этого файла или до его закрытия. В структуре описатели классов памяти могут быть заданы только на уровне 1. В операторе DECLARE имя может быть снабжено одним из описателей: INTERNAL EXTERNAL По умолчанию всем именам переменных присваивается тип INTERNAL (внутренний), а именам процедур и входов — тип EXTERNAL (внешний). Имя, объявленное как внутреннее, счи- тается описанным и может быть использовано только в процедуре, в которой оно определено, а также в обычных блоках и процеду- рах, являющихся внутренними для процедуры с описанием имени. Внешнее имя может быть использовано в любом месте программы. Присваивание классов памяти по умолчанию следующее: STATIC для имен типа EXTERNAL и AUTOMATIC для имен типа INTERNAL. Базированные переменные могут быть только типа INTERNAL. Обычно программисту совсем не требуется заниматься вопро- сами, связанными с классами памяти или с областью действия имен переменных. В случае написания необычных программ использование этих описателей позволяет программисту активно вмешиваться в процесс размещения данных.
406 Гл. 11. Более сложные элементы языка PL/1 Упражнения № 27 1. Следуя разд. 10.9, написать подпрограмму-функцию для вычисления кубического корня из значения переменной с пла- вающей точкой. 2. Ввести результат, полученный при решении упр. 1, в про- грамму печати таблицы значений N, N2, N3; квадратного корня из N и 10N; кубического корня из N, 10N и 100N. Пусть диапазон изменений числа N лежит в пределах от 1000 до 9999. 3. Изменить упр. 2 таким образом, чтобы пропускать строку после печати строк для N = 1005,1010,1015 и т. д. Предусмотреть печать пятидесяти значений N на каждой странице. 4. Измените упр. 25.3 таким образом, чтобы записывать дан- ные в индексно-последовательный файл, используя код факуль- тета, номер курса и номер группы в качестве ключа. Чтобы избе- жать проблемы, связанной с расположением начала ключа в пер- вом байте, обеспечить нуль в позиции 1 и воспользоваться 35-бай- товой записью. 5. Используя результаты упр. 4, написать программу чтения карт упр. 25.4 и проверить заполненность курсов лекций. Если выбранные студентом курсы еще не заполнены, то прибавить по единице к счетчикам числа студентов на этих курсах и отпе- чатать расписание студента. Если курс уже заполнен, то единицу к соответствующему счетчику не прибавлять и напечатать распи- сание студента с сообщением 'FILLED' (заполнено) против заполненных курсов.
Глава 12 ВВЕДЕНИЕ В ФОРТРАН 12.1. Фортран Слово «Фортран» образовано из начальных слогов двух англий- ских слов FORmula TRANslator (переводчик " формул). Если попытаться дать определение термина «Фортран», как это делает- ся в словарях, то окажется, что с ним связаны! 1) определенный язык, опубликованный впервые в 1956 году и находящийся на стыке английского языка и математики, а так- же любой диалект этого языка; 2) программа, называемая исходной программой решения любой задачи, которая написана на языке Фортран; 3) программа на машинном языке, называемая компилято- ром по отношению к которой входными данными является исход- ная программа на Фортране, а выходными — эквивалентная программа на машинном языке; 4) программа на машинном языке, полученная после обра- ботки' исходной программы компилятором Фортрана и называе- мая объектной программой; 5) специальные бланки (или формы), специальные карты и т. п., употребляемые при подготовке программ на Фортране Слово Фортран как имя существительное чаще обозначает язык Фортран. Поэтому говорят, что программа составлена на Фортране, если она написана на языке Фортран. В определении Фортрана не содержится никаких упоминаний о машине IBM-360. Действительно, одной из важнейших осо- бенностей языка Фортран является то обстоятельство, что он относительно свободен от специфики конкретной вычислительной машины. В связи с этим говорят, что Фортран является машинно- независимым языком программирования. Подобно любому другому существующему языку Фортран эволюционировал в последние несколько лет. Вариантом языка, используемым повсеместно на сегодняшний день, является Фор- тран IV. Этот же вариант Фортрана реализуется и в моделях IBM-360. Следует сказать, что фирма IBM поставляет для машины IBM-360 два компилятора Фортрана: компилятор для Фортрана IV и компилятор для Basic-Фортрана.
408 Гл. 12. Введение в Фортран Компилятор для Фортрана IV существует в двух вариантах. Вариант, требующий память объемом 256К байтов (уровень Н), и вариант, способный работать на памяти в 128К байтов (уро- вень G). Разница между вариантами компилятора заключается в скорости компиляции и в эффективности получаемой про- граммы. Компилятор для Basic-Фортрана предусматривается в пяти вариантах соответственно для следующих супервизоров: OS уровень Е (32К); TOS (16К); DOS (16К); BPS, лента (16К); BPS, карты (16К). Научная система команд (стандартные команды плюс команды с плавающей точкой) требуется и для компиляторов, и для объект- ной программы. Прежде чем переходить к дальнейшему изложе- нию материала, необходимо сделать несколько замечаний. Во-пер- вых, программа, компилированная с помощью компилятора Фор- трана, не является наилучшей с точки зрения общего времени ее выполнения, однако опыт показывает, что по своей эффектив- ности объектная программа довольно близка к соответствующей программе на машинном языке, составленной средним програм- мистом. Во-вторых, написание программы на Фортране требует приблизительно втрое меньше времени, чем составление такой программы на машинном языке. В третьих, нельзя считать, что использование Фортрана одинаково целесообразно для всех задач. Применение Фортрана имеет наибольший смысл для инже- нерных и научных расчетов и наименее оправдано для экономиче- ских и статистических задач. 12.2. Написание программ на Фортране Обычно исходная программа на Фортране записывается на спе- циальных бланках, аналогичных представленным на рис. 12.1. Предложение на Фортране, или, как часто говорят, оператор Фортрана, занимает колонки с 7-й по 72-ю включительно. Для того чтобы можно было ссылаться на предложения, им могут присваиваться номера. Номера предложений, или, иными словами, метки — это целые числа без знака, содержащие не более пяти цифр и лежащие в диапазоне значений от 00001 до 99999 вклю- чительно. Обычно левые незначащие нули не записываются и заменяются пробелами, поэтому записи вида 00123 и 123 счи- таются идентичными. Метки могут присваиваться в любом поряд- ке, однако никакие два предложения не должны иметь одинако- вых меток. Необходимо отметить, что метки следует присваивать
Punching Instructions Роде of Program Graphic ЦCard Form# ’ Identification Programmer |Date Punch J_ C FOR COMMENT | STATEMENT ’ NUMBER 1 ’ 5 3* s 6 FORTRAN STATEMENT 7 10 15 20 VS 30 35 40 45 50 55 60 65 70 » iii' tiilil. filtiillti*llltiiiliiiiflllflll!llt!lll!l!lllllllll|||||ft|| till I I 1 1 1 1 1 1 I 1 I f 1 1 I l__l__l 1.1 1 1 I 1 I I I 1 1 I I I 1 f f 1 1 1 1 1 I I I 1 f f f 1 1 1 1 1 I 1 t i I 1 1 I i i t 1 I t I ill I II. 1. I. J 1 I Illi 1 1 l 1 l i 1 I 1 1 1 1 1 I 1 1 1 1 1 1 1 1 1 -1 I 1 1 l 1 l J 1 i I I 1 1 i 1 1 I I I _ i _1 .1 i A 1 1 I 1 1 f 1 I f 1 1 1 I 1 1 1 I 1 1 I 1 1.1 III ill 1 I 1 1 1.1 1 .1 1 1 1 1 1 1 1 1 1 1 1 1 I 1 1 1 1 1 1 1 1 1 1 1 1 1 1 till 1 1 1 1 I 1 1 1 1 1 J 1 1 1 1 »J . t 1 1 1 t 1 1 1 1 I 1 I 1 1 1 4 1 1 LX 1 1 1 I 1 1 1 t 1 1 t 1 1 1 > 1 1 t 11 1 1 1 1 1 1 If i i t i 1 1 t I 1 t 1 t I I .1 L. lit 1 L t 1 1 I I 1 1 I I I I 1 1 I I I 1 1 1 1 1 1 1 Г 1 1 1 f 1 1 I 1 1 1 1 1. 1 I I t 1 1 1 1 1 I 1 f 1 f 1 1 1 1 1 t I 1 1 1 1 1 1 1 1 I 1 I 1 1 f f 1 l 1 1 1 l l 1 l 1 f 1 t 1 1 1 1 t 1 Ilf 1 1 1 1 > l 1 1 I 1 1 l 1 1 1 1 I I 1 lllllllllllflllftlllttllfliflllllllfllltltllllltlltltlillllllllll Jill i i i I i i i i 1 i I f f 1 i i t f 1 i t i t 1 i f i f 1 i i i.l.Lj.1 i t l i i t t 1 f i t i 1 i i i t 1 i t i i 1 t i I I 1 i iiii 1 l i l t 1 _L 1.1.LLL 1 1 1 1 I 1 1 1 1 1 1.1 1 I i t lltlllllf.fllllfltlllllllfl.l. It.lllftlll ii ii 1 Illi 1 1 I I 1 1 i ill f ill 1 1 1 I 1 1 1 1 I 1 1 f 1 1 1 1 I 1 1 1 1 1 Г 1 1 1 I 1 1 I 1 I 1 ill 1 1 1 1 1 1 1 I 1 1 1 1 1 _ i i i i । t । i 1 । i । ill i । i 1 f i I I 1 f । i t 1 f i । i 1 i i _f i 1 f f f । 1 i i । i L.i l _.i i Liiii li i t । 1 । till । । । 1 । t । । 1 t i f i 1 t г । । 1 t i t i I i i । i 1 t t t > 1 । i t-i 1 । t f । 1 । f । । 1 i i i i 1 f i i i 1 । । i i 1 । lift 1 1 1 1 1 1 1 1 1 I LL! 1 t f 1 1 1 1 1 1 1 L f L 1 1 1 1 1 1 1 1 1 1 I 1 1 1 I I 1 1 f 1 1 f 1 1 1 1 1 1 1 1 1 I 1 1 I 1 I 1 1 1 I 1 1 1 1 I 1 1 1 I 1 I 1 i t 1 1 I 1 1 1 1 1 1 1 1 t 1 1 1 I I I I 1_ I. I 1 I 1 1 I 1 1 1 1 I 1 t_ 1 L 1 1 1 1 1 1 1 1 1 1 I 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 I L J_L L I 1.1 1 I 1 I I f 1 1 1 1 1. I 1 III 1 J 1 1 l.lj.l 1 1 1 1 1 I 1 1 I 1 I I I 1.1 1 1 1 1 Illi 1 1 1 1 1 1 I 1 1 1 1 1 I 1 I 1 1 1 I ' I 1 1 1 1 1 1 1 1 1 I 1 1 1 I 1 1 1 1 1 I I 1 1 1 I 1 1 1 1 1 Л I ill II .lift tit 1 1. 1 1 1 1 1 1 1 I 1 1 1 1 1 1 .11 J I. 1 1 1 1 1 I 1 1 i I I 1 1. 1 1 1 1 1 1 1 1 1 I 1 f I 1 1 1 1 1 1 1 1 I 1 1 1 L 1 l___L .1. I 1 Illi 1 1 1 1 1 1 I 1 L.l 1 1 1 1 1 1 I 1 1 1 I 1 1 1 1 1 1 1 1 I 1 f I 1 f 1 1 I 1 1 1 I f 1 1 I 1 1 1 1 I 1 1 1 1 I 1 1 1 1 1 1 1 1 1 till I 1 1 1 1 1 1 1 I L 1 I 1 1 1 I 1 1 1 I I L 1 I . J... 1 1 1 1 1 1 1 I I 1 I 1 1 1 I 1 1 1 1 1 1 1 1 I L 1 I 1 1 1 J 1 1 1 1 1 1 i 1 1 —Ll.J 1 . Ll. 1 1 1 1 1 1 1 1 1 1, 1 1 ,1, 1..J 1,1 1 1 1 1 L.l-l.,1 ,1 1 1 1 1 J 1, ,.I .,1,,., 1 , X,J.. I, Mill U-lJ LH „l.Lj JX.I 1 1 r 1’ 1 1 I,.. P и c. 12.1. Бланк программирования на Фортране.
410 Гл, 12. Введение в Фортран тем предложениям, на которые действительно есть ссылки в про- грамме. Вообще для записи каждого предложения на бланке отводится по одной строке, однако, если оно слишком длинное, то оно может быть продолжено в следующих строках. Продолжение должно занимать не более 19 строк, в каждой из которых в колонке 6 записывается символ, отличный от пробела. Поскольку в этой колонке может быть записан любой символ, обычно ставится номер строки продолжения. Комментарии могут находиться в любом месте исходной программы. Они отличаются от других предложений буквой С в колонке 1. Комментарии печатаются, если печатается исходная программа, никакой другой обработке они не подвергаются. Колонки 73—80 также не обрабатываются компилятором и обычно содержат название программы или последовательную нумерацию строк в программе. Каждая строка бланка для ввода в машину обычно перфорируется на перфокарту, хотя в принципе допускается использование любого другого способа ввода. Если предложение имеет продолжение, то метка, если она нужна, записывается в первой строке. Колонки 1—5 в строках продолжения должны быть пустыми. Различают пять типов предложений (операторов) Фортрана: 1. Операторы присваивания, которые соответствуют арифме- тическим и логическим командам машины. 2. Операторы ввода — вывода. 3. Операторы управления, которые соответствуют командам сравнения и условного перехода. 4. Предложения-спецификации, которые не порождают команд в объектной программе, однако служат информацией для компилятора каким образом и в каком месте памяти должны храниться данные, а также какой формат данных необходим при выполнении операций ввода — вывода. 5. Подпрограммы. Они обсуждаются в гл. 14. Приведем йример программы на Фортране: 234 FORMAT (514) 780 READ (1, 234) К, L, KJ, М, LOP IS == L + LOP + M IR = (KJ + 2)/IS WRITE (3,234) K, L, M, IS, IR GO TO 780 END Предложения FORMAT и END являются предложениями- спецификациями. Первое из них сообщает о порядке размещения
12.3. Константы и переменные 411 вводимых — выводимых данных, последнее сообщает о том, что в исходной программе предложений больше нет. Операторы READ и WRITE содержат символические имена данных и вызывают выполнение операций ввода — вывода. Предложения со знаками равенства носят название операторов присваивания; действие этих операторов заключается в том, что результаты вычисления выражений присваиваются переменным с символическими именами IR и IS. Предложение GO ТО представляет собой оператор управления, который определяет, что следующим должен выпол- няться оператор с меткой 780. 12.3. Константы и переменные Под целыми константами в Фортране понимается любое число, записанное без десятичной точки. Перед отрицательным числом должен стоять знак минус. Целое число, которому не предше- ствует знак, называется целым без знака и считается положитель- ным. Примеры целых констант: 87 -9872 0 +1 89765490 Следующие константы не являются допустимыми целыми константами: 87. (десятичная точка недопустима) —9,872 (запятая недопустима) 0.893 (десятичная точка недопустима) В объектной программе каждая целая константа хранится в двоичном виде в формате полного слова. Величина целой кон- станты не может превышать 231 — 1 = 2147483(547. В Фортране IV константы меньше 32768 хранятся в виде полуслов. Под вещественными константами в Фортране понимается любое число, записанное с десятичной точкой. Например, 87. —9872.0 0.0 +1. 3.4578 .00032456 При желании вещественные константы могут задаваться в экспоненциальной форме, т. е. с порядком. Буква «Е», за кото-
412 Гл. 12. Введение 9 ‘Фортран рой'следует целая константа из двух цифр, означает, что веще- ственное число должно быть умножено на определенную степень 10. Следовательно, запись вида 93.4Е —3 означает 93.4 X Ю-3 = = .0934. Приведем примеры вещественных констант, записанных в этой форме: —0.0123Е + 3 (= -.0123 X 103) 9.3Е07 (=9.3 X 107) 6.Е36 (=6. X 1086) 0.0Е + 0 (=0.) Вещественная константа может содержать максимум семь значащих цифр. В объектной программе каждая вещественная константа хранится в виде числа с плавающей точкой и занимает полное слово. В машине IBM-360 величина вещественных констант ограничивается допустимым порядком числа (около 1075). Константа с двойной точностью отличается от вещественной константы тем, что она занимает в объектной программе двойное слово. Константа с двойной точностью записывается либо как число с десятичной точкой, содержащее от 8 до 16 значащих цифр включительно, либо как константа в экспоненциальной форме с буквой D вместо Е. Приведем примеры: 1234567.890123456 13579135000. 13579123D + 11 0.0D0 9.3D07 —.012D — 3 Следующие константы являются недопустимыми константами с двойной точностью: 123,456.789 (присутствует запятая) 12345678901.2345678 (цифр больше 16). 9.27D + 4. (показатель степени не является целым) Любое число, заданное явным образом в предложении Фор- трана, является константой; величина, к которой обращаются, используя соответствующее имя, а не значение,— это переменная. Поэтому в операторе IR = (KJ + 2)/IS число 2 является константой, а величины IR, KJ и IS — пере- менными. Имена, присваиваемые переменным, могут содержать от одно- го до шести символов, причем первым должна быть буква, а по- следующими — либо буквы, либо цифры. В Фортране знак долла- ра рассматривается как элемент алфавита, увеличивающий число
12.3. Константы и переменные 413 букв до 27. Использование в именах специальных символов, включая пробелы, не разрешается. Если при отсутствии другой спецификации первой буквой имени будет I, J, К, L, М или N, то переменная представляет целую величину и ей отводится 4 байта в объектной программе. Если же первой буквой будет любая другая (А — Н, О — Z, $), то переменная представляет вещественную величину и ей будет отведено также 4 байта в объектной программе. В качестве при- меров целых переменных могут быть приведены следующие: М IBM360 KU7X Примеры вещественных переменных; GE635 X $78 Следующие записи не могут рассматриваться как имена переменных: IBM 18 (пробелы не разрешены) IBM1443 (символов более 6) 7АСН (первый символ не является буквой) R7.4 (содержится специальный символ) F (X) (содержатся специальные символы) Обычные соглашения о спецификации переменной по первой букве перестают действовать, если тип переменной задается с помощью предложения явной спецификации типа INTEGER vb va, . . ., vn REAL vi, v2, . • vn DOUBLE PRECISION vB . . ., vn Каждой из перечисленных переменных присваивается соот- ветствующий тип независимо от первой буквы имени. Например: INTEGER I87Y, ER REAL М7 DOUBLE PRECISION Y7, POI, K4 специфицируют переменные 187Y и ER как целые, М7 — как вещественную, a Y7, POI и К4 — как вещественные с двойной точностью. Заметим, что присутствие в списке переменной 187Y излишне, поскольку подразумеваемым типом для переменной является также целый тип. Значения переменных с двойной точностью хранятся в объект- ной программе как числа с плавающей точкой двойной длины.
414 Гл. 12. Введение в Фортран • В случае Фортрана IV допускается явная спецификация двухбайтовых целых переменных. Допустимы следующие предло- жения: INTEGER*2v1? . . . INTEGER*4V1, . . . REAL*4V1, . . . REAL*8vi, . . . Запись INTEGER*4 эквивалентна записи просто INTEGER, REAL*4 — просто REAL, REAL*8 - DOUBLE PRECISION. В Фортране IV разрешено также специфицировать общую длину для переменных в списке и специальную длину для каж- дой переменной в отдельности. Поэтому в предложении REAL ♦ 8 PR, PS, KL*4, KM переменные PR, PS и KM являются переменными с двойной точ- ностью, a KL — 4-байтовой вещественной переменной. Аналогич- но, предложение INTEGER М7*2, RT означает, что переменной М7 ставится в соответствие полуслово, а переменной RT — полное слово и обе они являются целыми. Напомним, что значение, присваиваемое целой переменной поло- винной длины, не может превышать число 32767. 12.4. Арифметические выражения Под арифметическим выражением понимается любая последо- вательность констант, переменных и функций, разделенных зна- ками операций («+», <—», и т. д.) и круглыми скобками таким образом, чтобы получилось имеющее смысл математическое выра- жение. Допускается использование следующих пяти операций: + сложение — вычитание * умножение / деление ** возведение в степень Символ «**», при записи которого на бланке используются две колонки, понимается всегда как знак одной операции. В каче- стве примеров арифметических выражений можно привести сле- дующие: 7 + К*4 В**2 — 4.*А*С (1.+ R/T)**(T*P)/R
12,4. Арифметические выражения 415 3. Х/4. АВС + DE7*UE7 Чтобы улучшить читабельность выражения, можно пользоваться пробелами, однако следует иметь в виду, что пробелы не должны попадаться внутри имен. При составлении выражений необхо- димо придерживаться следующих правил: 1. Два знака операции не могут стоять рядом, они должны быть разделены по крайней мере круглыми скобками. Следова- тельно, запись вида А/ — В неверна, а запись А/(—В) верна, 2. Если целое число возводится в целую степень (например, I**J), результатом операции является также целое число. Во всех других случаях возведение в степень дает вещественный результат. 3. Если хотя бы одна компонента выражения — веществен- ное число, результат также будет вещественным числом. Если длина компонент неодинакова, длина результата определяется максимальной из длин компонент. Поэтому, если имеем REAL U DOUBLE PRECISION Z, Y INTEGER К INTEGER*2 I то результат, полученный от перемножения Z*Y, будет веще- ственным числом длиной 8 байтов (т. е. числом с двойной точно- стью). От деления U/К получится вещественное число длиной 4 байта, при суммировании К + I — целое число длиной 4 байта и при возведении в степень К*ф2 — целое число длиной 4 байта. 4. Если в выражении отсутствуют круглые скобки, опреде- ляющие порядок выполнения операций, то операции выполняют- ся в следующей последовательности: а) вычисления функций, Ь) возведения в степень, с) умножения и деления, d) и, наконец, сложения и вычитания. Операции одного ранга выполняются последовательно слева направо. Исключение составляет лишь операция возведения в степень, которая выполняется справа налево. Поэтому выра- жение A*B/C**D**E + 7.0*F по своему результату эквивалентно выражению ((A*B)/(C**(D**E))) + (7.0Т)
416 Гл, 12. Введение в Фортран По существу, компилятор сначала «расставляет» скобки, а затем осуществляет компиляцию. Поэтому во всех сомнительных слу- чаях лучше «для надежности» поставить «лишние» скобки. 5. Если одно целое число делится на другое целое, сохраняет- ся только целая часть полученного частного. Никаких округле- ний не производится. Поэтому, если I = 3 и J = 8, то J/I = 2, поскольку 8/3 = 2.67, а остаток отбрасывается. Аналогично (—J)/I — —2. При вычислении такого выражения как J/I*A, где J - 8, 1=3 и А = 4.0, вычисляется значение (J/I) = 2 и затем 2*4.0 = 8.0. Заметим, что выражение A*J/I вычисля- лось бы как (A*J)/I; тогда имели бы 4.0*8 = 32.0 и 32.0/3 = = 10.66667 6. Возведение в целую степень (например, I**J, A**J) выпол- няется многократным умножением. Если показатель степени — вещественный (например, 1**А, В**А), то используются лога- рифмы. 7. Вообще говоря, объектная программа будет эффективнее, т. е. быстрее, если не будут перемешиваться вещественные и целые переменные (это не относится к целым показателям степени). Например, при вычислении суммы U + J компилятор сначала напишет команды, преобразующие значение J в форму числа с плавающей точкой. По мере возможности следует обходиться без таких преобразований. Поэтому запись выражения в виде X + 4.0 является предпочтительной по сравнению с записью X + 4, а Х*3 — менее удачной, чем Х*3.0. 8. В Фортране предусмотрены средства для включения в выра- жение различных функций, вычисляемых по подпрограммам. Список имен этих функций приводится в приложении F. В него, в частности, входят ЕХР (х) означает ех SQRT (х) означает J^x ALOG (х) означает loge (х) ALOG10 (х) означает log10 (х) DLOG (х) означает loge (х) Различие между подпрограммами DLOG и ALOG заключается в том. что при работе с первой из них аргумент задается с двой- ной точностью и таким же получается результат, в то время как вторая подпрограмма работает с обычной точностью. Функции делятся на два типа: внутренние и внешние. Вну- тренние функции вызывают генерирование необходимых команд каждый раз, когда встречается обращение к функции Внешняя функция включается в объектную программу только один раз; всякий раз, когда требуется вычислить функцию, объектная
12,5. Операторы присваивания 417 программа передает управление на нужную подпрограмму с после- дующим возвратом на основную программу. На практике про- граммист не ощущает никаких различий между обоими типами функций. Команды, необходимые для вычисления различных функций, составляют часть резидентной библиотеки Системы. Потребитель может исключить функции из этой библиотеки, а может добавить другие. Аргументы любой функции должны заключаться в круглые скобки. Сам аргумент функции может включать другие функции или даже ту же самую функцию. Поэтому допустима запись, например, такого вида: SQRT (ALOG (1.+ SQRT (Х**2 + Y**2))) 12.5. Операторы присваивания Арифметический оператор присваивания записывается в виде «а = Ь», где «а» — имя переменной, а «Ь» — выражение. Такой оператор заключает в себе приказ компилятору обеспечить гене- рирование группы команд, необходимых для вычисления значе- ния выражения в правой части, и засылку полученной величины в качестве текущего значения переменной, расположенной слева от знака равенства. Следовательно, знак равенства имеет смысл «необходимо заменить на...», и нельзя считать, что он определяет уравнение. Ниже приводятся примеры возможных операторов присваивания: Оператор Смысл А — 2.0 Присвоить переменной А значение констан- ты 2.0. В = С Присвоить переменной В текущее значение переменной С. D = 2.*С Присвоить переменной D удвоенное значе- ние переменной С. J = J + 1 Прибавить 1 к значению переменной J и взять результат в качестве нового значения J. После того как значение выражения в правой части вычисле- но, оно преобразуется, если это необходимо, в число соответ- ствующего типа (вещественное или целое, длиной в 2, 4 или 8 бай- тов) и запоминается в качестве нового значения переменной в левой части. Например, если А = 2.0, В — ЗД J = 9, К = —2 и Р = 4.8, то следующие операторы дадут такие результаты: 27 Зак. 15635
418'Гл. 12. Введение в Фортран c = В/A c получит значение 1.5. I = В/A I получит значение 1. D = J/К D получит значение -4.0. L = J/K L получит значение -4. M = P/B M получит значение 1. R - - P/B R получит значение 1.6. S = J/K/P S получит значение .8333333. Вообще говоря, чем меньше будет в программе лишних пре- образований величин из одного типа в другой, тем она будет эф- фективнее. Упражнения № 28 1. Определить, какие из представленных ниже чисел являют- ся целыми константами, вещественными константами или кон- стантами с удвоенной точностью, а какие не могут быть отнесены ни к одному из перечисленных типов: (а) -35 (Ь) 02468 (с) 7,329 (d) 3.14159 (е) 1234.56789012 (f) 3.E83 (g) 431.2D32 (h) .00000000000138Е — 12 (i) 0 (j) 9,368.894 (k) I.D 4- 45 (1) 3.D83 2. Определить, какие из приведенных записей могут рассма- триваться как целые или вещественные переменные и какие недопустимы: (a) D (b) TIME (с) N (d) R1230 (е) MIGHT (f) SAVINGS (g) C/O (h) JOB NO (i) 1.30 (j) $356 (k) 2RATE (1) G(Y)
12.5. Операторы присваивания 419 3. Написать выражения для проведения следующих вычисле- ний: (а) АХ2 + ВХ + С (Ь) А (В + С) (с) | + С (d) I X С (е) /В2 — 4АС (f) <11+^ W 7-N 4. Для случая А = —2.0, В = 0.4, С = 7, D = 2, 1=2 и К = —3 определить значения выражений в следующих опера- торах: (a) PA = J**K - K**J (b) PB = A**J + A**K (c) PC = A*C - EXP (2.5*B) (d) PD = SQRT (B*C + A) (e) PE = A/B*C (f) IF = A*C - EXP (2.5»B) (g) IG = J**K (h) IH = D**K*C/B (i) PI = A**J**K (j) PJ = (1.+ B/D)**(D*J)/B (k) PK = 7 + K*4 (1) IL = K/J*C + C*K/J 5. В записи каждого из приведенных ниже операторов допу- щена ошибка. Указать эти ошибки: (a) D = А**— К + J (b) Е + L = M*N/B (с) F (X) = G**2 + 7 (d) G = SQRT (-3.B + 9) (e) G = SQRT (—3./B**2) (f) X + 17.= Y (g) 8PQ = 7PQ + 3 (h) AMT = (((1 - R)/2.+ 7)»*0.26 (i) SR = (PQ*2 — PQ - PQ)**(—3) (j) EG = 7.2E - 4 + 8/96G 27*
420 Гл. 12. Введение в Фортран 6. Площадь треугольника со сторонами а, Ь, с может быть вычислена по формуле Площадь = Y s (s — a) (s — Ь) (з—с), где s = (а + b + с)/2. Написать операторы, необходимые для вычисления площади треугольника, длинам сторон которого даны имена SDA, SDB и SDC. 7. Написать операторы, необходимые для вычисления гипер- болического косинуса от (А 4- В)2. 12.6. Операторы управления Расположение команд в скомпилированной объектной про- грамме зависит исключительно от последовательности, в кото- рой перфокарты с исходными предложениями вводятся в вычи- слительную машину. Во всех программах управление сначала передается на первое предложение, а затем переходит последо- вательно от предложения к предложению до тех пор, пока неко- торое специальное предложение (оператор управления) не нару- шит эту последовательность. В этом разделе мы рассмотрим основные операторы управления GO ТО Оператор GO ТО обеспечивает безусловную передачу управления на некоторое предложение программы. Он записывается в виде GO ТО п где п — метка. Например, наличие в программе оператора GO ТО 1786 означает, что следующим должно выполняться предложение с меткой 1786. После того как произошла передача управления, операторы исполняются последовательно до тех пор, пока не встретится другой оператор управления. Оператор IF (арифметический) записывается в форме IF (а) П1, п2, п3 и обеспечивает условную передачу управления в зависимости от значения выражения «а». Если а < 0, управление программой передается на предложение с меткой п<; если а = 0, то управле- ние передается на предложение с меткой н2; если а > 0, то осуществляется передача управления на предложение с меткой п3. Оператор IF является одним из наиболее часто используемых операторов управления. В качестве примера можно рассмотреть
12.6. Операторы управления 421 работу оператора IF (X - 5.) 3, 6, 3 Этот оператор осуществляет передачу управления на предложе- ние с меткой 6, если X — 5 = 0, т. е. при X = 5; в противном случае управление передается на предложение с меткой 3. Оператор PAUSE встречается в следующих формах: PAUSE PAUSE n PAUSE 'сообщение' В случае любого из этих видов программа печатает сообщение и переходит в состояние ожидания. Если рассматриваемый опера- тор записан в виде просто PAUSE, то печатается 00000; если оператор записан в форме PAUSE п, где п — целое без знака, то п печатается в виде пятизначного числа; если задано сообще- ние в кавычках, то печатается сообщение (но без кавычек). Если с пультовой пишущей машинки приходит ЕОВ, то выполнение программы продолжается со следующего предложения. Оператор PAUSE должен использоваться только в тех слу- чаях, когда необходимо остановить выполнение программы, что может потребоваться оператору за пультом для выполнения таких действий, как, например, смена бобин с магнитной лентой. • Форма записи в виде PAUSE 'сообщение' допустима толь- ко в Фортране IV. Оператор STOP Последний оператор, выполняемый в любой программе на Фортране, должен иметь следующий вид: STOP STOP n Если задано п (целое без знака, состоящее не более, чем из 5 цифр), то оно печатается. В любом случае выполнение объект- ной программы прекращается и управление возвращается Опера- ционной Системе для перехода к следующей программе. Если п не задано, то ничего не печатается. Оператор STOP используется для возврата в супервизор. Если программа по ходу работы не выходит на STOP, то для возврата в супервизор потребуется ручное вмешательство со стороны опе- ратора. Это медленная и весьма нежелательная процедура. Поэтому следует особо заботиться о том, чтобы программа выхо- дила на STOP.
422 Гл. 12. Введение в Фортран Оператор END должен быть физически последним предложе- нием в исходной программе. Он сигнализирует компилятору о том, что в исходной программе предложений больше нет. Сам оператор END не порождает команд в объектной программе. Упражнения № 29 1. Какое значение ASIN будет получено следующей про- граммой? SUM = 0.0 Т = 1.0 7 F = l./(T**2 + Т) SUM = SUM + F IF (F - 1.0E — 6) 3,3,5 5 T = T + 1.0 GO TO 7 3 ASIN = SUM STOP END 2. Какая взаимосвязь наблюдается между Y и X в следующей программе? IF (X - 4.) 1,1,2 1 IF (X) 3,4,4 3 Y = X - 9. GO TO 789 4 Y = 4.*X - 9. GO TO 789 2 Y = 3.»X — 5. 789 Y = Y + 1 STOP END 3. Какой ответ получится в упр. 2, если оператор GO ТО 789, стоящий перед оператором с меткой 2, будет исключен? 4. Написать программу для вычисления Y = ЗХ2 + 7 при X > 8, Y = 2Х2 — 2 при X < 1 и Y = 2Х во всех других случаях. 5. Написать программу для вычисления Y, равного дробной части вещественной переменной X. Например, если X = 1.78, то Y = .78; если X = 56.02, то Y = .02. 6. Задавшись пятью числами Al, А2, АЗ, А4 и А5, написать программу, которая поместит наибольшее из пяти чисел в В1, наибольшее из остающихся четырех — в В2, . . ., наименьшее — в В5. Некоторые числа А могут быть равными.
12.7. Ввод — вывод данных 423 7. Даны X и Y, написать программу вычисления RHO = = КХ2 + Y2 и THETA = arctg (Y/X). 8. Написать программу, которая по заданным коэффициентам уравнения АХ2 + ВХ + С = 0 вычисляет значения корней ROOT1 и ROOT2 соответственно. Оба корня считать веществен- ными. 9. Написать программу, которая по коэффициентам уравнений аХ + bY = с dX + eY = f вычисляет значения X и Y. Если уравнения имеют несколько решений, взять любое из них; в случае отсутствия решения поло- жить и X и Y равными нулю. 10. Как называется величина, полученная в результате вы- полнения оператора Y = ATAN (X/SQRT (1.- Х*Х))? 11. Написать программу деления кубического полинома f (х) = ах3 + Ьх2 + сх + d на х — г, где г — корень уравнения f (х) = 0. Можно считать, что значения параметров а, b, с, d и г уже хранятся в основной памяти вычислительной машины. (Примечание: поскольку f (г) = 0, остаток равен нулю.) 12. Скомбинировать упр. 8 и 11 таким образом, чтобы полу- чить все три корня кубического полинома. 12.7. Ввод — вывод данных Для того чтобы выполнить операцию ввода — вывода на Фор- тране, обычно необходимо получить ответы на следующие вопросы. 1. Какое устройство ввода — вывода предполагается исполь- зовать? 2. Значения каких переменных надлежит прочитать или записать? 3. Каков формат данных (вещественный, целый и т. д.), под- лежащих вводу или выводу? 4. Где (например, в каких колонках перфокарты) содержатся данные во вводимой или выводимой записи? В Фортране для ответа на эти вопросы обычно задаются два предложения для каждой операции ввода — вывода. Так, опера- тор FORMAT специфицирует формат данных и их расположение в записи ввода — вывода, а оператор READ или WRITE специ- фицирует устройство и переменные. Обычно форма записи опера-
424 Гл. IS. Введение в Фортран тора READ выглядит так: READ (а, Ь) список, где а — либо целое без знака, либо переменная целого типа, являющаяся положительной величиной; Ь — метка соответ- ствующего оператора FORMAT, а список — последовательность имен переменных, разделенных запятыми. Каждый элемент списка соответствует читаемой числовой величине. Например: READ (5,345) А, В, К, G18 READ (1,36) С READ (8,89898) H7LP, LISTR Величина а определяет устройство ввода — вывода по сле- дующим правилам. TOS - DOS. Случай а = 1 соответствует SYSIPT, а = 2 — SYSPCH, а = = 3 - SYSLST, а = 15 - SYSLOG; а = 4, 5 . . ., 14 соответ- ствует SYSnnn, где ппп = а — 3, т. е. при а = 4 имеем SYS001, при а = 5 — SYS002 и т. д. Запись значений а свыше 15 не допу- скается. OS — уровень Е. Имя предложения DD, соответствующее а,— это FTnnFOOl, где пл = а и а принимает значения в диапазоне от 1 до 99 вклю- чительно. Наборы данных могут быть специфицированы пред- ложениями DD, однако по умолчанию предполагаются следующие спецификации (подробности, относящиеся к системе OS, можно посмотреть в гл. 19): а = 1 DDNAME = SYSIN, RECFM = F, BLKSIZE = 80. Обычно это устройство для чтения перфокарт, используемое для системного ввода. а - 2 UNIT = SYSCP, RECFM = F, BLKSIZE = 80. Обычно это карточный перфоратор. а = 3 SYSOUT = A, RECFM = UA, BLKSIZE = 136. Обычно это печатающее устройство, использующееся для системного вывода. а = 4, 5 ...» 99 RECFM = U, BLKSIZE = 800. Обычно это магнитные ленты или диски.
12.8. Предложения FORMAT 425 OS — уровень H. Все совпадает с OS уровня Е; исключение состоит лишь в том, что устройство для чтения перфокарт соответствует а = 5, кар- точный перфоратор — а = 7 и построчно печатающее устрой- ство — а = 6. Различие в стандартных присваиваниях объяс- няется желанием добиться совместимости с некоторыми другими компиляторами Фортрана. Оператор WRITE представляется в виде WRITE (а, Ь) список и отличается от оператора READ только тем, что определяет вывод, а не ввод данных. Обычно выполнение каждой операции ввода — вывода связа- но с чтением (или записью) одной карты, одной записи на ленте или печатью одной строки. • В Фортране IV оператор READ (но не WRITE) может иметь вид READ (a, b, END = с, ERR = d) список Параметры END = с и ERR = d являются необязательными, и любой из них либо оба могут быть опущены. Если же они при- сутствуют, то могут задаваться в любом порядке. Нужно помнить, что end — это метки предложений. После того, как последняя карта данных будет прочтена, в первом же операторе READ, если в него включена запись END = с, произойдет передача управле- ния на предложение с меткой с, если задан параметр ERR = d и при чтении обнаруживается ошибка, то произойдет передача управления на предложение с меткой d. Ниже приводятся типич- ные примеры записи оператора READ: READ (5,345, END = 789) А, В, К, G18 READ (5,345, ERR = 78, END = 789), А, В, СК, G18 READ (5,37 END = 41, ERR = 78), НК, PUR READ (5,37, END = 41) HK, PUR 12.8. Предложения FORMAT В этом разделе для конкретности мы будем говорить о перфо- рации карт, хотя наши замечания могут быть отнесены в равной мере ко всем операциям ввода — вывода. Список переменных в операторе WRITE включает имена переменных, значения которых должны быть отперфорированы, и также определяет порядок, в котором они появятся в карте
426 Гл. 12. Введение в Фортран вывода. Оператор FORMAT связан с той же самой картой, но он «рассматривает» ее «с точки зрения» имеющихся на ней 80 коло- нок. В простейшем случае предложение FORMAT выглядит следующим образом: FORMAT (cb с2, . . .) Здесь каждое Ci обозначает спецификатор поля. Каждой пере- менной в списке оператора WRITE соответствует один и только один спецификатор поля. Спецификатор поля карты задает общую структуру, или тип поля, его длину, т. е. количество занимаемых им колонок, и в случае необходимости число дробных десятичных разрядов, которые должны быть отперфорированы. В этом разделе мы ограничимся рассмотрением трех самых основных типов спе- цификации. Спецификация типа I. Спецификатор целых чисел, или спецификатор типа I, исполь- зуется только при перфорации целых переменных. Для каждой целой переменной в списке должен быть предусмотрен специфи- катор типа I, и наоборот, при отсутствии в списке целой пере- менной спецификатор типа I задавать нельзя. Спецификатор имеет форму Iw где w — длина поля карты. Например, 17 обозначает 7-символь- ное поле. Рассмотрим следующие примеры: Спецификатор Значение Выводимые переменной данные 18 +1234 ЬЬЬМ234 18 -1234 ЬЬЬ - 1234 18 -37 ЬЬЬЬЬ - 37 18 0 bbbbbbbO 13 —37 -37 13 +37 Ь37 13 768 768 13 -768 *** (ошибка) 13 +1234 *** (ошибка) 13 0 ЬЬО 13 +2 ЬЬ2 Правила использования спецификаций типа I сводятся к сле- дующему: 1. Число в поле вывода всегда располагается справа. 2. Если поле слишком велико, то левая часть заполняется пробелами.
12.8. Предложения FORMAT 427 3. Если число отрицательное, то знак минус записывается слева от старшей значащей цифры. 4. Все левые незначащие нули заменяются пробелами, за исключением разряда единиц. 5. Если выводимые данные не помещаются в заданное специ- фикатором поле, то выводимое поле заполняется звездочками, а в процессе выполнения программы выдается сообщение по ошиб- ке. Необходимо иметь в виду, что поле, которое достаточно по величине для одного значения переменной, может оказаться малым для другого и поэтому компилятор не может контроли- ровать правильность задания размеров поля в спецификаторе формата. Поэтому в сомнительных случаях для безопасности лучше дать поле несколько больших размеров, чем требуется. Допол- нительные пробелы между соседними полями только облегчают чтение выводимых данных. Спецификация типа Е. Спецификатор типа Е используется для перфорации значений вещественных переменных и имеет следующую форму: Ew.d где w определяет длину поля, ad- количество дробных десятич- ных разрядов. Необходимо выполнение следующего требования: w > d + 6; в противном случае во время компиляции будет заре- гистрирована ошибка. Рассмотрим примеры: Спецификатор Значение Вводимые данные Е15.8 +1234.567 Ь0.12345670ЕЬ04 Е15.8 -1234.567 —0.12345670ЕЬ04 Е15.8 .00087 Ь0.87000000Е - 03 Е15.8 +12345567 ЬЬЬЬЬ0.1235ЕЬ04 Е15.4 —.00087 bbbb - 0.8700Е - 03 Е15.4 0.0 bbbbbO.OOOOEbOO Е11.4 —.00087 -0.8700Е - 03 Правила использования спецификаций типа Е сводятся к сле- дующему: 1. Порядок числа всегда занимает четыре символа (Е, пробел или минус и две десятичные цифры экспоненты). 2. Данные располагаются в поле справа; в том случае, когда w > d + 7 левые свободные позиции заполняются пробелами. 3. В случае необходимости справа от числа вставляются нули. 4. Если задано недостаточное количество разрядов, число округляется.
428 Гл. 12. Введение в Фортран Спецификация типа D. Спецификатор типа D используется в случае чисел с двойной точностью. Вместо буквы Е перфорируется D; в остальном сов- падает со спецификатором Е. Примеры'. Спецификатор Значение D15.8 +1234.567 D15.8 -.00087 D15.6 9. Выводимые данные b0.12345670Db04 —0.87000000D — 03 bbb0.900000Db01 Спецификация типа F. Спецификатор десятичных чисел с фиксированной точкой, или спецификатор типа F представляет другую по сравнению с Е и D возможность для перфорации вещественных чисел и чисел с двойной точностью. Он записывается в форме Fw.d где w — длина поля, ad — количество дробных десятичных разрядов. Во всех случаях w > d для положительных чисел и w > d + 1 для отрицательных. Рассмотрим примеры: Спецификатор Значение Выводимые данные F15.8 1234.567 ЬМ234.56700000 F15.8 .000123876 bbbbbO.00012388 F8.6 .000123876 0.000124 F8.6 3.4 3.400000 F8.6 546.37 ********(ошибка) F8.6 -3.4 ♦* ******(ошибка) F10.6 3.4 ЬЬЗ.400000 Правила использования спецификаций типа F заключаются в следующем: 1. Число в оперативной памяти преобразуется в десятичное число с фиксированной точкой с d дробными и w — d — 1 целыми разрядами. 2. Если число отрицательное, знак минус ставится перед старшей значащей цифрой. 3. Незначащие нули левее разряда единиц заменяются про- белами. 4. В случае необходимости справа от числа добавляются нули. 5. Если поле слишком мало, то оно заполняется звездочками и при выполнении объектной программы вырабатывается сооб- щение об ошибке.
12.9. Форматы входных данных 429 Преимущество спецификатора типа F заключается в том, что он дает выходные данные, более удобные для чтения, и требует меньшего числа колонок на перфокарте. Недостатком специфи- катора этого типа является обязательность знания программи- стом максимальной величины чисел, которые встретятся. Рассмотрим пример. 128 FORMAT (15, F7.2, D17.8, 17) WRITE (6,128) К, A, Q, М где К = 345, А = -17.890022, Q = .0031416282 и М = -8. На карте вывода будет отперфорировано ЬЬ345Ь — 17.89,bbb0.31416283D — 02bbbbb — 8 а остальная часть карты останется пустой. Если же воспользо- ваться оператором WRITE (6,128) М, Q, А, К то выходные данные будут иметь такой вид: bbb - 8bbb0.00bb - 0.17890022Db02bbbb345 i Наконец, если задать команду WRITE (6,128) К, М, A, Q мы получим сообщение об ошибке, поскольку вторая и четвертая переменные в списке не согласуются с соответствующими специ- фикаторами полей. 12.9. Форматы входных данных Входные данные обычно перфорируются в той же самой форме, которую они имели бы, если бы были выданы программой на Фортране. Однако допускаются определенные отклонения, чтобы сделать более удобной подготовку входных данных. 1. В случае полей типа D и Е совсем необязательно выделять четыре колонки для записи экспоненты. Экспонента может быть отперфорирована как в обычной форме, например Е + 02, так и в виде Eb02, Е2, Е02, +02 или просто +2. Вместо записи Е — 02 допускается использование форм Е—2, —02,—2. Короче говоря, могут быть опущены нули в старших разрядах, знак плюс; могут опускаться также сами буквы D или Е, так чтобы оставался знак + или —. 2. Десятичная точка может быть опущена при перфорации чисел типа D, Е или F. Если она опускается, то вычислительная машина ориентируется на. то количество десятичных разрядов,
430 Гл. 12. Введение в Фортран которое было предварительно Например, в случае поля F7.4 Рис. 12.2. Логическая схема про- граммы погашения долга. описано в спецификаторе поля, число ЬЬЬ8734 будет обрабаты- ваться так же, как число bb.8734. 3. При любых полях знак ми- нус может перфорироваться в лю- бом месте слева от первой знача- щей цифры или десятичной точки. Поэтому число b — Ь78 будет об- рабатываться совершенно анало- гично числу bb — 78. 4. Пробелы в числе обрабаты- ваются как нули. Поэтому число, отперфорированное как ЬЬ667Ь, воспримется как число 006670. Поле, полностью состоящее из пробелов, воспримется как нуле- вое поле. 5. Десятичная точка в числе типа Е, D или F «главнее» ука- зания о положении точки в спе- цификаторе поля. Поэтому число ЬЬ7.4 в формате F5.3 обрабаты- вается так же, как если бы оно было взято в формате F5.1. 12.10. Пример В изложенном материале мы раскрыли наиболее существенные особенности языка Фортран. Зна- ний в объеме этих сведений вполне достаточно для того, что- бы суметь написать реальную программу. В качестве иллюстра- ции давайте рассмотрим задачу погашения долга. Пусть вы вво- дите в машину карту, содержа- щую три элемента информации: размер задолженности, ежегод- ную норму процента и размер еже- месячного платежа. Вам следует составить расписание, в кото- ром указывались бы ежемесячные платежи по процентам, а также фактическое уменьшение задол- женности и оставшаяся сумма долга. Мы начинаем, как обычно,
12.10. Пример 431 с составления блок-схемы программы, представленной на рис. 12.2, после чего записываем программу на Фортране, которая в нашем случае имеет следующий вид: 101 FORMAT (F10.2, F10.8, F10.2) 102 FORMAT (15, F10.2, F10.2, F10.2) READ (1,101) BAL, RATE, PMT N = 0 RATE = RATE/12 2 N = N + 1 XINT = RATE*BAL PRIN = PMT - XINT IF (PRIN) 3, 3, 4 3 STOP 4 BAL = BAL - PRIN IF (BAL) 5, 5, 6 6 WRITE (3, 102) N, XINT, PRIN, BAL GO TO 2 5 PRIN = PRIN + BAL BAL ~ 0.0 WRITE (3, 102) N, XINT, PRIN, BAL| STOP END Предположим, что первая, карта данных содержит такую запись: bbl2000.00b.06000000bbbM80.00 тогда первые строки выводимых данных будут иметь вид bbbblbbbbb60.00bbbM20.00bbll880.00 2 59.40 120.60 11759.40 а последние строки будут следующими: bbb81bbbbbbl.16bbbM78.84bbbbb52.90 bbb82bbbbbb0.26bbbbb52.90bbbbbb0.0b Упражнения № 30 1. Написать программу для вычисления ряда ар-_. / \ . 1 х3 . 1 3 х5 . 1 3 5 х7 . arcsm (x) = X4-_.-4-y._._4-_.T.-g. у+... для х =.00 (.05) 1.00. Напечатать таблицу, содержащую значе- ния х в первой колонке и значения arcsin (х) — во второй. Учесть, что arcsin (0) = 0 и arcsin (1) = 1.5708. Вести вычисления с таким количеством членов ряда, которое необходимо для обеспечения
432 Гл, 12, Введение в Фортран на выходе точности до четырех десятичных знаков. Краткое указание: _ (2п—3)х2 ап+1 —ап (2п—2) (2n—1)Ф 2. Написать программу для вычисления и перфорации в фор- мате F18.7 значений квадратного корня из целых чисел от 10 до 99 включительно (один корень на карту). Число N перфори- ровать в колонках 1—3, а число |/~N — в колонках 4—21. 3. Математическое ожидание совокупности чисел определяет- ся как сумма чисел, деленная на количество членов суммы, т. е. формулой где X — математическое ожидание, п — количество чисел, а 2 — знак суммы/ Дисперсия s2 совокупности чисел определяется как P2(X2)-Q]x)a ь — П(П —1) и среднее квадратичное отклонение s = Vs2. Написать програм- му ввода пакета карт, содержащих X в колонках 1—3, вычисле- ния и перфорации на выходе значений n, X и s. Последняя карта будет идентифицирована числом —30, отперфорированным в ко- лонках 4—6. У всех остальных карт в этих колонках будут про- белы. Предполагаем, что п < 10000. 4. Написать программу для вычисления значений Нп по фор- муле п к=1 где п =А, 2, . . ., 9, 10, 20, 30. Пары значений п и Нп перфо- рировать на одной карте. Для всех п выполняется соотношение Hn < 1. (Замечание: при проведении этого вычисления могут иметь место большие ошибки округления.) 5. Написать программу для ввода коэффициентов квадратного уравнения Ах2 + Вх + С = 0 и перфорации на выходе значений корней. Считать, что оба корня вещественные. Значения А, В и С перфорируются на картах ввода в формате Е18.8. 6. Метод Ньютона для определения значения корня уравне- ния связан с использованием соотношения х _х Xn+l-Xn f,(Xn)
12.10. Пример 433 где i' (xn) — производная функции f (х), вычисленная при х = хп. Принимая х0 = 1, вычисляем х<; используя xi, производим вычисление х2 и т. п. Процесс вычислений продолжается до тех пор, пока два соседних значения х станут отличаться друг от друга не более, чем на величину предварительно указанной допустимой ошибки. Запрограммировать ввод коэффициентов уравнения ах8 + Ьх’ 4- сх + d = 0, заданных в формате Е18.8, вычисление корня по методу Ньютона и перфорацию результата в формате Е18.8 (для данного полинома V (х) = Заха 4- 2Ьх 4- с). 7. Коэффициенты квадратного уравнения расположены на карте в формате Е12.6 следующим образом: колонки 1-12 вещественная часть А 13-24 мнимая часть А 25-36 вещественная часть В 37-48 мнимая часть В 49-60 вещественная часть С 61-72 мнимая часть С Само уравнение имеет вид Ах2 4* Вх 4- С = 0. Отперфориро- вать в формате Е12.6 корни уравнения следующим образом: колонки 1—12 вещественная часть 1-го корня 13—21 мнимая часть 1-го корня 25—36 вещественная часть 2-го корня 37—48 мнимая часть 2-го корня 8. Написать программу, которая вводит три целых числа с пишущей машинки и печатает периметр треугольника, считай введенные числа длинами его сторон. В случае, если три введен- ных величины не могут быть сторонами треугольника, программа печатает нуль. 9. Программу из упр. 8 изменить таким образом, чтобы отпе- чатать также величину площади треугольника. Напоминаем, что площадь = ]/s (s — а) (s — b) (s — с), где s =.5 (а 4- b 4- с). Если стороны не образуют треугольника, то вместо площади треугольника должен также печататься нуль. 10. Нужно решить систему уравнений Ах 4- By = С Dx 4- Еу = F (все коэффициенты заданы в форме Е12.6). Если система не имеет единственного решения, то вместо х и у напечатать нулевые значения. 28 Зак. 15635
434 Гл. 12. Введение в Фортран 11. Изменить упр. 10 таким образом, чтобы печатать значения х и (или) у в формате F12.6, если каждое из этих значений будет представляться в виде восьми значащих цифр, и в формате Е12.6 в противном случае. 12. Широко известна формула Симпсона для вычисления определенного интеграла а+2П j f(x)dx = 4-[f(a) + 4f(a4-h)+f(a+2h)] , а Воспользоваться этой формулой для вычисления 3 ( х4 dx 4 принимая, что h = 1 и а — 1. Чтобы обеспечить большую точ- ность вычислений, можно воспользоваться меньшими значениями h и разбить интервал фактически на меньшие участки. Эта же формула может быть представлена в более общем виде ь j f (x)dx=i[f (a) + 4f (a + h)4- 2f (a+2h)+4f(a+3h)+ a + 2f (a+ 4h)+ ... + 4f (b- 2h) + 2f (b - h)+ f (b)J где b = a + 2hn при делом n. При n = 1 получается первона- чальная формула. Вычислить интеграл от х4, пользуясь формулой с п = 2, 3 и 4 и, следовательно, h = 1/2, 1/3 и 1/4. Каким обра- зом увеличение п влияет на точность аппроксимации? (Истинное значение интеграла равно 48.4.) 13. В приложениях большую роль играет интеграл 2 j ехр( — t2/2)dt, где z — положительное число. Написать программу вычисления этого интеграла с точностью до третьего десятичного знака для z =.1, .2, .3, . . ., 2.0 и далее z = 2.5, 3.0, 3.5, 4.0, 5.0, 10.0, 20.0 и 40.0. Что можно сказать о значении интеграла при z оо? 14. Воспользоваться формулой Симпсона для вычисления интеграла оо f J X взяв такое количество членов, какое необходимо, пока последний член не окажется достаточно- малым.. Для каждого конечного
12.10. Пример 435 числа членов будет существовать ошибка (из-за отбрасывания членов). Вычисление интеграла проводить до тех пор, пока послед- ний член не окажется менее (а) 10“®, (Ь) 10"\ (с) 10“®. 15. Получить с точностью до двух десятичных знаков решение системы уравнений sin (у) = 3 + 4х cos (х) = 8 + 7у 16. Написать программу, которая вводит значения а и b и перфорирует или печатает эти величины и значение х, удовле- творяющее уравнению Ьх = а. 17, Написать программу для ввода значения Т и перфорации или печати значений Тих, причем X Т= J ехр( —t2/2)dt Вычислить х с точностью до двух десятичных знаков. 18. Изменить условия упр. 17 таким образом, чтобы вычислять значение х с той точностью, какая получается при п = 1, 2, 4, 8 и 16 в формуле Симпсона. Вывести значения х для каждого значе- ния п. Обратить внимание, как увеличится время выполнения рабочей программы с ростом п. * 28*
Глава 13 ДОПОЛНИТЕЛЬНЫЕ ОПЕРАТОРЫ ФОРТРАНА 13.1. Форматы буквенно-цифровых данных Помимо цифровых полей, в формате могут быть специфицирова- ны поля, содержащие буквенно-цифровую информацию. Эти поля используются для выдачи на печать заголовков и другой тексто- вой информации; они могут быть также объектами сравнений (условий) в операторах IF. Спецификация типа Н. Спецификаторы типа Н (холлеритовского типа) имеют вид wH За этим спецификатором следуют w буквенно-цифровых симво- лов. В IBM-360 величина w должна быть меньше 256. Эти w сим- волов, которые следуют сразу за буквой Н, включая пробелы и любые другие символы, используемые в системе 360, извлекают- ся из оператора FORMAT и помещаются в выходную запись. При вводе w символов из входной записи читаются вычислительной машиной и заменяют w символов, записанных в предложении FORMAT. Например, выполнение программы 10 FORMAT (ЗН X=,F12.6,4H Y=,F12.6) 11 FORMAT (F12.6, F12.6) 12 READ (1,11) X, Y X = X + Y WRITE (3,10) X, Y GO TO 12 END могло бы привести к выдаче следующих данных: ЬХ = bbbl2.673H2bbY =bb — 13.001477 X = 0.000000 Y = 0.000000 Однако, если заменить оператор READ на 12 READ (5.10) X, Y
13Л» Форматы буквенно-цифровых данных 437 а на вводимых картах задать bX==bbbbl.060000bbZ=bbb - 0.180000 Xb=bbbbbbbbbbbbbbY==bbbb 21870000 то при выводе данных получим bX=bbbbl.060000bbZ==bbb — 0.180000 Xb=bbb21.870000bbY=bbb 21.870000 Спецификации типа Н используются главным образом для выдачи на печать заголовков. Поля холлеритовского типа отличаются от числовых полей тем, что 1) пробелы, которые не учитываются в любом другом случае, воспринимаются здесь наравне с любыми другими символами; 2) в числовых полях конкретное значение, которое должно быть отперфорировано, определяется значением соответствую- щего элемента списка выводимых переменных; в случае полей холлеритовского типа подлежащее перфорации значение берется из предложения FORMAT; 3) поскольку в списке переменных нет элементов, соответ- ствующих холлеритовским полям, обращение к этим полям может выполняться только через то же предложение FORMAT. Спецификация типа X. Спецификатор типа X имеет вид wX где w < 256. При вводе пропускаются w последовательных коло- нок; при выводе в выходную запись вставляются w пробелов. Обычно спецификатор типа X задается для того, чтобы пропустить те из вводимых полей, которые не идут в счет, или же для того, чтобы разделить поля соответствующими интервалами. Спецификация типа литерал. Холлеритовские поля могут быть заданы простым заключени- ем цепочки символов в кавычки. Например: FORMAT ('ЬХ=', F12.6, 'bbY=', XF12.6) результат аналогичен тому, что мы получаем при написании спе- цификаций типа Н. Необходимо заметить, что в случае спецификации типа Н нУжно указывать количество символов, в то время как при спе- цификации типа литерал это не требуется. Для того чтобы включить в литерал сам символ кавычка, его надо написать дважды. Так, 'CAN'T' будет выдано на печать
438 Гл. 13, Дополнительные операторы Фортрана Управление кареткой. При использовании построчно печатающего устройства пер- вый байт выходной записи не печатается. Вместо этого он исполь- зуемся для управления движением бумаги. Как правило, этот байт (управляющий символ) задается спецификатором типа Н или типа литерал, хотя, вообще говоря, допустим любой другой способ задания. Управляющими символами являются пробел перевод одной строки перед печатью О перевод двух строк + печать без перевода строк 1 прогон до первой строки следующей страницы Если выходные данные, предназначенные для печати, записы- ваются на магнитную ленту или любое другое устройство, отлич- ное от печати, управляющий символ записывается точно так же, как любой другой символ данных. Спецификация типа А. В качестве средства задания буквенно-цифровых полей, под- лежащих обработке, используется спецификатор типа А. Он имеет вид Aw и обеспечивает чтение w символов из входной записи и передачу их (без каких-либо преобразований) в качестве значения соответ- ствующей переменной в списке ввода — вывода. Обычно w не пре- вышает количество байтов (2, 4 или 8), занятых переменной. Если w меньше количества байтов в поле переменной, буквенно- цифровые данные располагаются слева, а правая часть поля заполняется пробелами. Если w больше, чем длина поля пере- менной, то в поле размещаются только самые правые байты; левые символы входных данных теряются. При выводе, если w меньше длины переменной, выводятся только левые байты. Если w больше длины переменной, данные размещаются в поле выво- да справа, а слева дополняются пробелами. Если задана спецификация типа А, то данные хранятся в па- мяти машины в стандартном коде IBM-360, в коде EBCDIC. Если переменная используется далее в арифметическом предложении, арифметические действия выполняются таким образом, как если, бы данные хранились в двоичном формате. Поэтому, если при вводе символы С342 становятся значением переменной J, то J будет содержать в шестнадцатеричном виде значение C3F3F4F2; если это значение используется в арифметической операции, оно будет воспринято как —1007422222. Чаще всего арифметические операции над буквенно-цифровыми полями имеют целью сравне- ние этих полей и встречаются в операторах IF. В тех случаях,
13.2. Кратность спецификаторов формата 439 когда в операции участвуют и буквенно-цифровые и обычные числовые поля, следует проявлять особую внимательность. Чтобы проиллюстрировать обычное использование специфика- ций типа А, рассмотрим следующую программу: 13 FORMAT (АЗ. IX. АЗ, 15) 12 FORMAT (IX. АЗ, ' - 15) 4 READ (1,13) Р. Q. J IF (Q) 6. 7, 6 7 STOP 6 IF (Р - Q) 4, 5, 4 5 WRITE (3,12) P, J GO TO 4 END Предположим, что первые три вводимые карты содержат следую- щие данные: X71YX69b2174 X71YX70b8135 X71bX71b2143 После чтения первой карты переменные получат такие значения: Переменная Буквенно-цифровые Шестнадцатеричное данные число р Х71Ь E7F7F140 Q Х69Ь E7F6F940 J (2174) 0000087Е и, поскольку Р — Q ^=0, ничего не будет выведено. Единствен- ная строка будет выведена для третьей карты в виде Х71Ь = ЬЬ2143 Обратите внимание на то обстоятельство, что при вводе зна- чение переменной J преобразуется в двоичный вид, а при выводе снова преобразуется в десятичный. Это преобразование осу- ществляется даже в том случае, когда ничего не делается со зна- чением J в двоичной форме. Если бы переменная J была задана в формате А, то никаких преобразований не производилось бы. 13.2. Кратность спецификаторов формата Часто приходится сталкиваться с форматами, например, тако- го вида: FORMAT (F12.4, F12.4, F12.4, F18.7, F18.7)
440 Гл, 13, Дополнительные операторы Фортрана где за тремя формами F12.4 следуют два формата F18.7. В таких случаях допускается упрощение записи: FORMAT (3F12.4, 2F18.7) В общем случае любая из спецификаций типа D, Е, F, I или А может быть повторена любое необходимое количество раз про- стым указанием коэффициента кратности перед буквенным сим- волом. Нужно следить за тем, чтобы не указать более чем 145 символов для печатаемой строки или свыше 80 колонок для карты. Коэффициенты кратности не должны превышать 255. Иногда требуется отперфорировать пустую карту или про- пустить строку входных данных. Это можно сделать, задав в фор- мате косую черту /. Всякий раз, когда встречается косая черта, начинается новая входная или выходная запись. Рассмотрим пример 1234 FORMAT (/F12.4, F18.6) 1276 FORMAT (F12.4/F18.6) По формату 1234 будет выдана одна пустая карта, а на другой отперфорируются две переменные. По формату 1276 будет выдано две карты, содержащие по одной переменной. Если эти форматы использовать при вводе, то по формату 1234 одна карта будет пропущена и обе переменные взяты со второй. По формату 1276 с каждой из двух карт будет взято по одной переменной. При работе с форматами, переходящими с записи на запись, нужно особенно внимательно следить за тем, чтобы каждая пере- менная заканчивалась на своей записи. Если задана косая черта, то разделяющей запятой между спецификаторами ставить не нужно. Можно написать несколько косых черт подряд. На выводе в результате этого будет выдано несколько записей, состоящих из пробелов, а на вводе вызовет пропуск нескольких записей. В частности, по формату 1284 FORMAT (F12.4///F18.6) первая переменная прочитается с первой карты, две последующие карты будут пропущены, а вторая переменная прочитается с чет- вЬртой карты. В процессе ввода — вывода объектная программа просматри- вает формат и список переменных. Передача данных между вычи- слительной машиной и устройством ввода — вывода продолжает- ся до тех пор, пока не будут обработаны все элементы списка и при этом либо 1) будет достигнут конец формата, либо 2) встретится спецификатор числового типа (D, Е, F, G, I или А).
13.2. Кратность спецификаторов формата 441 Это означает, что любые спецификации типа Н, X или лите- рал, следующие тотчас же за последним элементом списка, будут переданы до окончания вывода. Предложения 2 FORMAT (3HI = Ь, 14, Е20.8/7Х, Е20.8) WRITE (7,2) I, А, В обеспечивают перфорацию таких данных: I = b - 234bbbbb - 0.78967832ЕЬ03 bbbbbbbbbbbbb0.34545656E - 01 Если бы последнее предложение было представлено в виде WRITE (7,2) I, А то при выводе получилось бы следующее: I = b - 234bbbbb - 0.78967832ЕЬ03 bbbbbbb поскольку просмотр формата продолжался бы до достижения спе- цификатора типа Е, несмотря на то, что все элементы списка переменных уже исчерпаны. Если бы предложение WRITE было представлено в форие WRITE (7,2) I, А, В, J формат исчерпался бы раньше, чем список переменных. В таких случаях форматы повторяются с самого начала, так что на выводе мы получили бы I = b - 234bbbbb - 0.78967832ЕЬ03 bbbbbbbbbbbbb0.34545656E - 01 I = ЬЬЬ35 Иногда возникает необходимость в повторении не одной, а це- лой группы спецификаций. Это достигается заключением этих спецификаций в круглые скобки и — если это необходимо — заданием коэффициента кратности перед скобками. Например,, предложения 3 FORMAT ('b', 215,2 (F18.6, 2F15.6)) WRITE (6,3) JL, IM, Al, А2, АЗ, Bl, В2, ВЗ обеспечат печать одной строки, содержащей JL 15 JM 15 Al F18.6 А2 F15.6 АЗ F15.6
442 Гл. 13. Дополнительные операторы Фортрана Bl F18.6 В2 F15.6 ВЗ F15.6 Если бы предложение WRITE было задано в виде WRITE (6,3) JL, JM, Al, А2, АЗ, Bl, В2, ВЗ, Cl, С2, СЗ повторение в формате началось бы с самой правой открывающей- ся скобки. Следовательно, С1 будет иметь формат F18.6 С2 F15.6 СЗ F15.6 Однако, если формат повторяется, начинается новая запись. В случае печатающего устройства при этом требуется новый управляющий символ. Поэтому С1 будет иметь фактически специ- фикацию F17.6. Общие правила относительно повторяемых спецификаций фор- матов в Basic-Фортране заключаются в следующем. 1. Текущая запись заканчивается первой косой чертой либо концом предложения FORMAT. 2. Если предложение FORMAT должно повторяться, оно повторяется с самой правой открывающейся скобки. Повторение всегда сопровождается переходом на начало новой записи. 3. Для каждой выводимой на печать строки требуется свой управляющий символ. • В Фортране IV допускается еще один уровень круглых скобок. Это делает возможным повторение блоков спецификаций. Если спецификации исчерпываются, то повторение начинается с самой правой открывающейся скобки, не считая скобок самого внутреннего уровня, если число уровней равно трем. Для иллю- страции рассмотрим пример 0 1 2 21 4 FORMAT (15/3 ('О', 2F7.2, 3 (14, F7.2)), 1 2 210 Х2 ('Ь', 14Х,3 (14, F7.2))) t уровни скобок отмечены цифрами 0, 1 и 2 (самые внутренние). Спецификации повторяются в случае необходимости с самой левой открывающейся скобки уровня 1, отмеченной стрелкой. Начинающему мы посоветуем пользоваться форматами попро- ще, пока не придется столкнуться с задачей, где без сложных форматов действительно не обойтись.
13.3. Еще некоторые сведения о форматах 443 13.3. Еще некоторые сведения о форматах Спецификация типа Т. Обычно предложение FORMAT задается для описания струк- туры вводной — выводной записи, которая начинается с первой слева позиции в записи. Спецификатор типа Т вида Tw где w < 256, описывает структуру вводной — выводной записи, которая начинается с позиции w внутри записи. Как правило, спецификации типа Т используются для заголовков. Рассмотрим такие примеры: 133 FORMAT (Т18,'HEADING',F8.2,T60, F8.4) 134 FORMAT (Тб,17,Tl,15) По формату 133 будет напечатано слово HEADING в позициях 17—23 (напомним, что позиция 1 в формате печати отводится для управляющего символа и не печатается), за ним последуют сразу же 8 символов переменной с фиксированной точкой, зани- мающие позиции 24—31. Начиная с позиции 59, в 8 байтах рас- положится другая переменная. Остальная часть печатаемой стро- ки заполнится пробелами. Формат 134 специфицирует поле 17 в колонках карты 6—12 и поле 15 — в колонках 1—5. Соответствующее предложение READ могло бы быть, например, таким: READ (5,134) VAR2, VARI где для переменной VAR1 отводятся колонки 1—5, а для перемен- ной VAR2 — колонки 6—12. Вместе с тем те же самые действия могут быть выполнены с помощью предложений 135 FORMAT (15,17) READ (5,135) VARI, VAR2 Как можно видеть на примере формата 133, спецификация Т упрощает описание заголовков. В других случаях она применяет- ся редко. Масштабный множитель Р. Перед спецификациями типа D. Е или F может быть записан масштабный множитель в форме sP При вводе масштабный множитель игнорируется, если во вво- димом поле пробито Е или D. Для полей F по нему вводимая
Гл. 13. Дополнительные операторы Фортрана величина умножается на 10 “s. При выводе выводимая величина умножается на 10s. При этом для чисел типа Е или D из порядка вычитается s, а для типа F подобной коррекции не производится. Отсутствие масштабного множителя по умолчанию означает задание спецификатора ОР в начале формата. Действие масштабного множителя распространяется на дан- ную операцию ввода — вывода для всех полей типа Е, D и F вплоть до появления другого масштабного множителя. На поля типа I его действие не распространяется. Масштабный множитель может быть как положительным, так и отрицательным. Пусть число, введенное первоначально как десятичное, должно быть выведено в виде процентной величины. Достаточно задать спецификацию формата 2PF17.3, и умножение на 102 произойдет без изменения значения, хранимого в памяти машины. При спецификациях типа D и Е использование масштабного множителя при выводе данных вызывает изменение местополо- жения десятичной точки. Поэтому, если спецификация Е18.8 в обычном случае обеспечивает получение выходных данных вида bbbb - 0.12345678Е + 09 то при масштабном множителе, равном 4, т. е. при спецификации 4РЕ18.8, мы получим b - 1234.56780000Е + 05, а при масштабном множителе, равном —4 (спецификация вида —4РЕ18.8), bbbb - 0.00001235Е + 13 Масштабные множители используются в двух наиболее харак- терных случаях: для корректировки положения разрядов числа относительно десятичной точки в полях типа F и для печати нужного числа цифр левее точки в полях типа D и Е. е Масштабный множитель ОР применяется в тех случаях, когда необходимо прекратить действие масштабного множителя, заданного ранее. Спецификация типа G. Спецификация типа G предусмотрена только в Фортране IV. Она имеет формы Gw.s Gw где w < 256 определяет длину поля, as — число значащих цифр. Подчеркнем, что указывается именно число значащих цифр, а не число дробных десятичных разрядов. Спецификация
13.3. Еще некоторые сведения о форматах 445 типа G может задаваться вместо спецификаций типа D, Е, F или I. Для переменных целого типа число s игнорируется, даже если оно задано, и спецификация обрабатывается как спецификация Iw. При вводе вещественных переменных спецификация типа G эквивалентна спецификации типа F Что же касается вывода, то правила обработки поля G зависят от значения N выводимой переменной. Значение N N<0.1 10k"1 2 *<N<10k для k=l, 2, ..., s 1P<N Эквивалентная спецификация поля Ew. d с масштабным мно- жителем F(w-4)-(s-k), 4Х Ew. d с масштабным мно- жителем Если число N заключено в пределах между .1 и 10s, то оно выводится как число с полем типа F, за которым следуют четыре пробела; при этом текущий масштабный множитель не играет роли. В другом случае число выводится как число типа Е, на которое действует текущий масштабный множитель. Сказанное может быть пояснено следующими примерами, где к заданным значениям переменных применяется спецификатор G18.8: J = 7 М = -81345 X = .00072 Y = .72 Z = 720. Т = 7200000.0 U = 72000000.0 V = 720000000.0 bbbbbbbbbbbbbbbbb7 bbbbbbbbbbbb - 81345 bbbb0.72000000 - Е - 03 bbbb0.72000000bbbb bbbbb720.00000bbbb bbbbb7200000.0bbbb bbbbb72000000.bbbb bbbbO.72OOOOOOE + 09 Упражнения № 31 1. На карте перфорируются переменные А, В и С в фор- мате F18.7. Написать программу чтения карт и выдачи на печать А = ...,В = ...иС = ..., т. е. повторение входной информации. В следующей строке напечатать одно из двух: «УРАВНЕНИЕ НЕ ИМЕЕТ ВЕЩЕСТВЕННЫХ КОРНЕЙ» «X = . . . ИЛИ X = . . .»
446 Гл. 13. Дополнительные операторы Фортрана где X — это значения корней квадратного уравнения Ах2 + Вх + + С = 0. Пропустить строку и повторить все для следующей карты. 2. Допустим, что в IBM-360 есть буквы русского алфавита. Составить программу погашения долга по закладной, позволяю- щую оператору указать на перфокарте величину задолженности, ежегодную норму процента и сумму ежемесячных платежей текстом. В программе предусмотреть печать заголовков и сроков платежей. Форма распечатки может быть, например, такой: ВЕЛИЧИНА ЗАДОЛЖЕННОСТИ = 10 тыс. долл. НОРМА ПРОЦЕНТА = .06 МЕСЯЦ ПЛАТЕЖ ПРОЦ. ПОГАШЕНИЕ ОСТАТОК 10000.00 1 200.00 50.00 150.00 9850.00 2 200.00 49.25 150.75 9699.25 3. Модифицировать программу упр. 2 таким образом, чтобы оставлять пустую строку через каждые пять строк. 4. Колода перфокарт содержит карты трех типов. Карты отпер- форированы следующим образом: Колонки 1—4 учетный номер, например, KL87 Колонка 10 тип карты Колонки 11—20 сумма, в форме F10.2 В картах тира 1 указывается предыдущий остаток, в картах типа 2 — депозиты (вклады), в картах типа 3 — изъятия. Карты сортируются в порядке учетных номеров, но для каждого учетно- го номера карты различных типов могут находиться в любом поряд- ке. Считается, что карта типа 1 с данным учетным номером долж- на быть в колоде только одна. За этим же учетным номером может быть любое число карт типа 2 и 3, в частности, их может не быть совсем. Отперфорировать новые карты типа 1 с новым остатком. 5. Изменить упр. 4 таким образом, чтобы в случае получения при расчете отрицательного остатка сообщение печаталось в фор- ме «РАСЧЕТ хххх ОСТАТОК = — ххх,ххх.хх». 6. Изменить упр. 5 таким образом, чтобы то же самое сооб- щение печаталось в правой половине страницы для случая поло- жительного остатка свыше 25 тысяч долларов. 7. Изменить упр. 4 таким образом, чтобы отрицательный оста- ток перфорировался в колонках 11—20, а знак минус — в колон- ке 21 (справа, а не слева от числа). 8. Написать программу чтения карт типа 1 и перфорации карт типа 4. Карта типа 4 должна содержать текущую норму
13.4. Индексы 447 процента г, поделенную на 12 и умноженную на расчетную вели- чину. Значение г читать с карты, размещенной перед картами типа 1, где оно отперфорировано в виде процентной величины, например 4.875 в случае 4 7/8 процента. Карта с г будет иметь О в колонке 10 и норму процента в колонках 11—20. г перфорирует- ся всегда с десятичной точкой. 13.4. Индексы Переменная в Фортране может иметь индексы. Индекс должен принимать положительные целые значения и может быть задан в виде v с V ± с c*v c*v ± d где v — целая переменная без индексов, а с и d — целые кон- станты без знака. Например, допустимы следующие индексы: К 7 К + 2 КАРРА — 3 8*MU 7*MU — 6 14*ВАН 4- 89 Индексы записываются после имени переменной, к которой они относятся. Они заключаются в круглые скобки и разделяют- ся запятыми, например X (7), Y (КАРРА, 5), SINGL (I, J — 2) Индексирование самого индекса не допускается. Поэтому нельзя написать X (К (3), 8), однако не запрещается написать: L = ] К (L, что приведет к желаемому результату. Максимально допустимое число индексов равно трем. • В Фортране IV допускается семь индексов. В момент использования индекса его значение должно быть положительным. Например, запись вида SINGL (I, J — 2) спра- ведлива только в том случае, когда I 1 и J 3.
448 Гл. 13. Дополнительные операторы Фортрана • В Basic-Фортране индексы не могут принимать значения большие 32767. Поэтому в приведенном выше примере необходимо потребовать, чтобы I 32767 и J 32769 в каждом случае, когда эти переменные используются в качестве индексов в записи SINGL (I, I - 2). Для каждой переменной с индексами в программе должен быть указан максимальный размер массива, т. е. максимальные значения, которые могут принимать индексы; это нужно для того, чтобы компилятор мог зарезервировать соответствующий объем памяти в объектной программе. Обычно информация о размерно- сти массива содержится в предложении DIMENSION, которое записывается в форме DIMENSION Vi, v2, . . . где каждое v — это переменная с индексом. Действие оператора DIMENSION А (10), В (5, 3), К (4), D (2, 2, 3) сводится к тому, что обеспечивается резервирование памяти для хранения 10 значений А, 5 X 3 = 15 значений В, 4 значений К и2х2хЗ = 12 значений D; всего же должно быть зарезерви- ровано (10 15 4- 4 + 12) х 4 = 164 байта памяти. Не накла- дывается никаких ограничений на число переменных в одном предложении DIMENSION и на число таких предложений в про- грамме. Однако требуется, чтобы размерность переменной была указана до того, как эта переменная будет задана в любом другом предложении Фортрана. Предложения DIMENSION не выполняются в том смысле, что они не порождают команд в программе. Они просто пропу- скаются в ходе вычислительного процесса. Если переменная имеет только один индекс, то ее значения хранятся в памяти друг за другом, например, К (1), К (2), К (3), К (4). Если же переменная имеет два индекса, то значения хра- нятся по столбцам, при этом первый индекс является первым изме- няющимся индексом. Например, элементы матрицы Ви Bj2 В13 Вц Big В21 В22 В2з В24 В25 ®32 ®83 В34 В35 хранятся в таком порядке: В (1,1), В (2,1), В (3,1), В (1,2), В (2,2), В (3,2), В (1,3)> . . . . . ., В (2,5), В (3,5). Тот же самый принцип сохраняется и в слу- чае массивов большей размерности: быстрее всего изменяется первый индекс, затем второй и т. д.; медленнее всего изменяется индекс, занимающий крайнее правое место. Например, элементы трехмерного массива будут храниться в такой последовательности:
13.5. Операторы DO 449 D (1,1,1), D (2,1,1), D (1,2,1), D (2,2,1), D (1,1,2), . . ., D (1,2,3), D (2,2,3). He разрешается обращаться к переменной с индексами без указания индексов; исключения составляют лишь строго опреде- ленные случаи, а также случаи списков ввода — вывода. • В Фортране IV разрешено включение информации о раз- мерности массивов в предложения явной спецификации типа, а именно предложения REAL, INTEGER и т. д. Максимальные значения индексов записываются в той же форме, что и в пред- ложении DIMENSION. Поэтому допустимы следующие записи: REAL*8 YR (12), В*4 (5,3) INTEGERS MKR (3), MKS (402), W*4 (48) В Basic-Фортране это записывается в несколько ином виде. Так, вместо предложения REAL*8 YR (12), В*4 (5,3) приходится написать пару предложений DOUBLE PRECISION YR DIMENSION YR (12), В (5,3). 13.5. Операторы DO Наиболее сложным и мощным из числа операторов управления является оператор цикла DO. Он записывается в виде DO n i = mi, m2, m3 или DO n i = mi, m2 где n — метка, i — целая переменная без индексов, am — целые константы без знака или целые переменные без индексов, прини- мающие положительные значения. Если величина т3 не задана, она принимается равной 1. Для иллюстрации рассмотрим следую- щие примеры: DO 3 I = 2, 10, 2 DO 4 J = 1, К Фактически оператор DO — это команда на многократное исполнение предложений, следующих за оператором DO до предложения с меткой п включительно. При первом исполнении 1 = mi, при втором i = mi + m3 и т. д. до тех пор, пока не удовлетворяется условие i т2. Если пи > т2. то операторы выполняются только один раз. Совокупность повторно выполняемых предложений образует область действия оператора DO, или иными словами образует 29 Зак. 15635
450 Гл. 13. Дополнительные операторы Фортрана цикл. После последнего исполнения цикла управление передается предложению, следующему за предложением с меткой п; это называется нормальным выходом из цикла. Значения параметра цикла i могут быть использованы при вычислениях точно таким же образом, как значения любой другой переменной целого типа. К тому же, если управление передается из цикла вовне, например, с помощью оператора IF или GO ТО, то текущее значение параметра i сохраняется и может использо- ваться в счете. Если же происходит нормальный выход из цикла, то значение параметра i становится неопределенным и не может быть использовано до тех пор, пока он снова не будет определен (т. е. либо появится в левой части арифметического оператора, либо в списке вводимых параметров, либо в качестве параметра другого цикла). Сказанное проиллюстрируем таким примером: Т = 6.5 DO 3 I = 1, 7 Т = Т - I IF (Т) 8, 3, 3 3 Т = Т + 2.0 8 XZW = Т*Т В процессе выполнения цикла переменная Т последовательно принимает значения 6.5, 5.5, 7.5, 5.5, 7.5, 4.5, 6.5, 2.5, 4.5, —0,5; в этот момент оператор IF передает управление на предложение с меткой 8, при этом Т = —0,5 и I = 5. Если же в качестве начального значения взять Т = 26.5, а не 6.5, то последователь- ные значения Т, вычисляемые оператором 3, будут равны 27.5, 27.5, 26.5, 25.5, 21.5, 17.5, 12.5. В этот момент произойдет нор- мальный выход из цикла, так как 1 = 7. Однако после выхода из цикла значение I становится неопределенным и им нельзя воспользоваться, если не присвоить ему новое значение. Для этого, например, можно вставить оператор .1 = 7 непосредственно перед предложением 8. Предложения, составляющие цикл, должны подчиняться сле- дующим правилам. Правило 1. Первое предложение цикла должно быть выпол- няемым*, это не может быть предложение типа DIMENSION, INTEGER, REAL и т. д. Правило 2. Последним предложением цикла не может быть оператор GO ТО или оператор IF. При необходимости обойти это ограничение можно воспользоваться предложением CONTINUE.
13.5. Операторы DO 451 Поэтому правомерна такая запись: 1 DO 5 J = 1, 25, 2 IF (X — Y (J)) 5, 4, 4 5 CONTINUE Предложение CONTINUE является фиктивным предложе- нием, которое не порождает команд в объектной программе. Его единственная функция заключается в том, чтобы выполнить роль последнего предложения цикла в тех случаях, когда по смыслу последним предложением оказывается передача управления. Правило 3. Внутри цикла не должно быть предложений, изме- няющих значения параметров цикла (i, ть т2, т3), другими словами, значения всех параметров цикла должны быть полностью определены до входа в цикл. Правило 4. Разрешается использование циклов в цикле. В этом случае область действия внутреннего цикла должна полностью находиться в области действия внешнего цикла. Совокупность циклов, удовлетворяющих этому правилу, называется вложен- ными циклами', при этом количество вложений не ограничивается. Рассмотрим случай вложения двух циклов: DIMENSION А (50,6) 10 DO 7 N = 1,50 DO 7 I = 2,6 ХК = I 7 A(N, I) = (l. + .01*XK)**N Эта программа вычисляет значения A (n, i) = (1 + i)n для i == == 0.01, 0.02, 0.03, . . ., 0.06 и n = 1, 2, . . ., 50. Следует заметить, что два цикла могут иметь одно и то же последнее предложение (но это, конечно, не обязательно). Правило 5. Не допускаются операторы IF и GO ТО, лежащие вне^ области действия цикла и передающие управление внутрь этой области. При таких передачах управления нарушается правильность индексации. Запрещая передачу управления из внешнего цикла во внутренний, это правило не запрещает переда- чу управления в обратном направлении, т. е. из внутреннего Цикла во внешний, поскольку такая передача по отношению к внешнему циклу является обычной передачей управления внутри цикла. В этом правиле имеется единственное исключение: выход из области действия оператора DO может быть разрешен, скажем, для выполнения некоторой стандартной подпрограммы, 29*
452 Гл. 13. Дополнительные операторы Фортрана но с последующим возвратом в тот же самый цикл DO, с тем чтобы отсутствовали какие-либо изменения в значениях любого параметра цикла. Варианты допустимых и недопустимых передач управления представлены на рис. 13.1. Упражнения № 32 1. Написать программу получения наименьшего значения из совокупности в 50 чисел (Аь А2, . . А50). Этот результат присвоить переменной с именем SMALL. 2. Составить программу генерирования целых чисел 1, 2, . . . . . ., 100 и полученные значения присвоить соответствующим пере- менным с именем J ь где i = 1, 2, . . ., 100. 3. Дополнить упр. 2 так, чтобы вычислялись (с плавающей точкой) значения квадратов целых чисел, присваиваемых пере- менным XQ (I).
13.5. Операторы DO 453 4. Какой результат даст приведенная ниже программа, при- мененная к массиву из 50 чисел А упр. 1? DIMENSION А (50), В (50) N = 50 DO 12 I = 1, N 12 B(I) = А (I) М = N - 1 DO 13 I = 1, М К = I + 1 DO 13 J = К, N IF (В (J) - В (I)) 14, 13, 13 13 CONTINUE STOP 14 С = В (J) В (J) = В (I) В (I) = С GO ТО 13 END 5. Две матрицы А и В отперфорированы следующим образом: колонки матрица А матрица В 1-8 аи = 3124. Ьи = 1616. 9-16 а21 = 7412. Ь21 = 8182. 17-24 а31 = 1314. Ь31 = - 7919. 25-32 а12 = —5329. Ь12 = 2516. 33-40 а22 = —4203. Ь22 = 1228. 41-48 а32 = —2031. Ъ32 = -8243. 49-56 а13 = —9122. Ь13 = —2432. 57-64 а23 = —3425. Ь23 === 4325. 65-72 а33 = 1444. Ь33 = 1334. где все числовые поля представлены в формате F8.0. Матрица С, состоящая из элементов cij == ajj 4- Ьф называется суммой матриц А и В. Написать программу на Фортране, обеспечивающую чтение Двух карт, содержащих значения элементов матриц А и В, и вывод на перфорацию значений элементов матрицы С.
454 Гл, 13. Дополнительные операторы Фортрана 6. Матрица D, состоящая из элементов з dij= S aikXbkj к=1 является произведением матриц А и В. Составить программу чте- ния матриц А и В и вывода на перфорацию матрицы D. 7. Написать программу чтения матриц 3-го порядка и вычи- сления детерминанта матриц. 8. Написать программу чтения матрицы 3-го порядка и печа- ти ее элементов в форме аИ а12 а13 а21 а22 а23 а31 а32 а33 т. е. в той форме, в которой обычно записываются матрицы. 9. Составить программу вычисления по формуле со S тпгп)для х = 0 00 (°л°) п=0 Вывод оформить как печать двух колонок данных, указывая в одной из них значения х, а в другой — значения суммы. 13.6. Дополнительные операторы В этом разделе мы познакомимся еще с несколькими опера- торами Фортрана. Вычисляемый GO ТО. Этот оператор имеет форму GO ТО (Hi, п2, . . ., nm), i где п — метки, a i — целая переменная без индексов. Если в мо- мент выполнения предложения значение i равно j и выполняется соотношение 1 j ш, то управление передается на предложе- ние с меткой nj. Следовательно, GO ТО (3, 7, 6, 6), К вызывает передачу управления на предложение с меткой 3, если К = 1, на предложение с меткой 7, если К = 2, и т. д. Если значение i лежит вне диапазона 1 <1 i ш, то выполняется следующее за GO ТО предложение.
13.6» Дополнительные операторы 455 EQUIVALENCE. Предложение EQUIVALENCE (а, b, . . .), (d, е, . ., где а, Ь, ... являются переменными без индексов либо с кон- стантами в качестве индексов, может быть использовано для управления распределением памяти в объектной программе. Вы- сказанное положение проиллюстрируем примером. Предложение EQUIVALENCE (AF, G), (J, К, 1(3)), где AF, G, J и К — переменные без индексов, а I — массив, имеющий размерность 6, «срабатывает» таким образом, что пере- менным AF и G будет отведено в памяти одно и то же поле; точно так же одно поле будет отведено переменным J, К и I (3). Поэтому выделены будут всего два поля, а не пять. Сопоставляемые таким образом переменные должны быть одинаковой длины. Предложе- ние EQUIVALENCE невыполняемое, 9 Если переменная имеет более одного индекса, то она может быть задана в предложении EQUIVALENCE со всеми своими индексами, либо записана только с одним. В последнем случае индекс определяет позицию переменной в массиве, располагаю- щемся в памяти машины по столбцам. Поэтому, если DIMENSION ЕХ (3,7), EY (4) EQUIVALENCE ЕХ (2), ВТ то значение переменной ЕХ (2,1) будет храниться в той же самой ячейке (адресе) памяти, что и значение переменной RT. Анало- гичным образом, предложение EQUIVALENCE ЕХ (8), RU обусловит отведение переменным RU и ЕХ (1,2) одной ячейки памяти. Допустимо предложение EQUIVALENCE ЕХ (1,2), EY (2) Оно ставит в соответствие переменным ЕХ (1,2) и EY (2) один и тот же адрес памяти, но при этом сопоставляет также другие элементы двух массивов ЕХ и EY. Фактически получается такое соответствие: ЕХ (6,1) ЕХ (7,1) EY ЕХ (1,2) EY ЕХ (2,2) EY
456 Гл. 13. Дополнительные операторы Фортрана ЕХ (3,2) EY (4) ЕХ (4,2) Пожалуй, чаще всего эквивалентностью пользуются для исправ- ления распространенной ошибки, связанной с присвоением двух имен для одной переменной. • Приводимые ниже два вида предложений употребляются только в Фортране IV. Опыт показал, что эти предложения употребляются достаточно редко. ASSIGN. Предложение ASSIGN i ТО m где i — метка, a m — целая переменная без индексов, присваи- вает переменной m значения i. Переменную m нельзя использо- вать ни в каком предложении, кроме другого предложения ASSIGN или ASSIGNED GO ТО. Хотя мы и говорим, что значение i «присваивается» ш, значение m в памяти вовсе не равно i. ASSIGNED GO ТО, Это предложение записывается в виде GO ТО m, (xi, . . ., Хц) где х — метки предложений. Управление передается на предло- жение с меткой ш; при этом значение m должно быть равно од- ному из х. • Приводимое ниже предложение допускается только в Фор- тране IV. IMPLICIT. Предложения явной спецификации типа REAL, INTEGER, DOUBLE PRECISION используются для спецификации типа и длины отдельных переменных. Предложение IMPLICIT упо- требляется для спецификации типа и длины всех переменных, начинающихся с задаваемой буквы или группы подряд идущих букв. Оно записывается в следующем виде: IMPLICIT тип* *з (аь а2, . . ., ад), . . ., тип*з (. . .) Здесь а обозначает либо букву, скажем, A, G и т. д., либо две буквы, соединенные дефисом, например, А-G; тип*з — это REAL*8, REAL4 INTEGERS или INTEGERS. Если <s> опускается, предполагается тип REAL*4 или INTEGER*4.
13.6. Дополнительные операторы 4ST Например, предложение вида IMPLICIT INTEGERS (A), INTEGERS (I - Р), XREAL*8 (В - Н, Q — R, W), REAL (S - V, $) специфицирует все переменные, начинающиеся с символа А, как полуслова целого типа, переменные, начинающиеся с симво- лов В, С, D, Е, F, G, Н, Q, R или W как двойные слова вещест- венного типа и т. д. Заметим, что переменные, начинающиеся с символов X — Z, не специфицируются и поэтому в соответствии со стандартными соглашениями сохраняют свой первоначальный тип, т. е. REAL*4. Приведенная здесь спецификация может быть отменена исполь- зованием предложения явной спецификации типа. Так, предло- жение вида INTEGER GYI отменяет указанную выше неявную спецификацию и сделает пере- менную GYI 4-байтовым целым числом.^ CALL EXIT. Это предложение записывается в форме CALL EXIT эквивалентно предложению STOP и включено в реализуемый на IBM-360 Фортран главным образом с целью обеспечить совме- стимость с компиляторами Фортрана II. CALL DUMP. Форма этого оператора такова: CALL DUMP (Аь В1? Fb . . ., An, Bn, Fn) По этому оператору прекращается выполнение объектной про- граммы и на печать выдается содержимое областей памяти между границами, определяемыми переменными At и Вь А2 и В2 и т. д. Какие именно переменные попадут в выдаваемые области, можно определить по листингу, полученному при компиляции. Значе- ния F определяют формат выводимых данных следующим образом: F = 0 шестнадцатеричный 1 LOGICAL*! 2 LOGICAL*4 3 INTEGERS 4 INTEGERS 5 REAL*4 6 REAL*8 7 COMPLEXES
458 Гл. 13. Дополнительные операторы Фортрана 8 C0MPLEX46 9 Литерал • В Basic-Фортране F может принимать значения только О, 4, 5 или 6. CALL PDUMP. По своему действию предложение CALL PDUMP аналогично предложению CALL DUMP. Различие заключается лишь в том, что после выдачи на печать выполнение объектной программы про- должается дальше. Использование предложений DUMP и PDUMP ускоряет про- цесс отладки программы и позволяет хорошему программисту спланировать отладку еще при написании программы. • Приводимые ниже три вида предложений применяются в Фортране IV главным образом для совместимости с Фортра- ном II. READ b, список. Эквивалентен READ (а, Ь) список, где а определяет устрой- ство чтения с перфокарт. PUNCH b, список. Эквивалентен WRITE (а, Ь) список, где а определяет карточ- ный перфоратор. PRINT Ь, список. Эквивалентен WRITE (а, Ь) список, где а определяет системное печатающее устройство. t Следующие четыре разновидности предложений применяются и в Фортране IV, и в Basic-Фортране. Основное назначение этих предложений заключается в том, чтобы облегчить преобразова- ние программ, написанных на языке Фортран II. CALL OVERFL (j). j — переменная целого типа. Устанавливается j = 1, если в машине возникла ситуация переполнения с плавающей точкой, j = 3, если налицо ситуация исчезновения порядка, и j = 2, если названные ситуации отсутствуют. Сигналы переполнения сбрасываются. CALL DVCHK (j). Целая переменная j устанавливается равной 1, если индикатор контроля деления (деление на нуль) равен 1; в противном случае j устанавливается равным 2 и индикатор сбрасывается.
13.7. Работа с лентами и дисками 459 CALL SLITE (i), Где i = О, 1, 2, 3 или 4. Если i =д4= О, соответствующий индикатор -«sense light» устанавливается равным 1. Если i = 0, все четыре индикатора сбрасываются. Индикаторы «sense light»— это неко- торые условные индикаторы, которые можно опрашивать с по- мощью следующего предложения. CALL SLITET (i, j). i должно равняться 1, 2, 3 или 4, a j должно быть переменной целого типа. Опрашивается индикатор «sense light» с номером i. Если он возбужден, то он сбрасывается и устанавливается j = 1. В противном случае устанавливается j = 2. 13.7. Работа с лентами и дисками Для организации работы печатающих и карточных устройств достаточно уже рассмотренных операторов READ и WRITE, что ж£ касается магнитных лент, то еще нужно уметь перематы- вать ленту, записывать EOF и т. д. Следующие три предложения используются при работе с файлами на ленте и с последователь- ными файлами на дисках. END FILE а. Значение а указывает номер набора данных и соответствует а в операторах WRITE (а, Ь) список или READ (а, Ъ) список. На ленте пишется марка ленты, обозначающая EOF. На диске пишется запись EOF. Последующее предложение WRITE начнет новый набор данных в том же самом устройстве. REWIND а. Лента перематывается к началу. В случае диска производятся необходимые установки, чтобы последующее предложение READ или WRITE работало с первой записью данных в наборе. BACKSPACE а. Для ленты выполняется физически шаг назад на одну запись. Если лента находилась на начале,, то ничего не делается. Для дисков шаг назад состоит скорее из логических, чем из физических действий. Так или иначе для последующих операторов READ и WRITE делается возможным снова обращаться к последней участвовавшей в работе записи. Часто лента или диски используются для временного запоми- нания информации, когда не хватает места в оперативной памяти. В этом случае информация после чтения должна иметь точно такой же вид, что и перед записью. Если начать выполнять
460 Гл. 13. Дополнительные операторы Фортрана форматные преобразования при чтении, то это будет чистой потерей времени, зачастую весьма ощутимой. Поэтому суще- ствуют варианты READ и WRITE, допускающие бесформатный ввод и вывод данных: READ (а) список WRITE (а) список Данные выводятся или вводятся в виде «образов оперативной памяти». Теоретически бесформатный ввод—вывод может выпол- няться на любом устройстве, однако практически он редко имеет смысл для устройств, отличных от лент и устройств с произволь- ным доступом. До сих пор мы вели речь только лишь о входных — выходных записях, которые читались или записывались в последовательном порядке. В случае дисков возможно, а иногда и желательно, уметь обрабатывать записи в произвольном порядке. Фортран предо- ставляет подобную возможность произвольной обработки данных; правда, она носит ограниченный характер. Каждый файл, который должен обрабатываться в произвольном порядке, необходимо определить, используя DEFINE FILE в форме DEFINE FILE af (mb h1? fb v^, a2 (m2, h2, f2, v2), . . . где каждый набор символов a (m, h, f, v) определяет свой файл. Оператор DEFINE FILE является специфицирующим и должен размещаться в исходной программе ранее всех выполняемых предложений. Символ а указывает набор данных. Этот символ совпадает с символом а, используемым в операторах READ и WRITE. Символ m указывает максимальное количество записей в набо- ре данных. Количество записей может быть меньше ш, но никогда не может превышать т. f указывает, как организованы записи. Здесь могут быть три возможности: f = Е показывает, что все записи являются форматными; f — U показывает, что все записи являются бесформат- ными; f = L показывает, что имеет место смесь форматных и бесформатных записей. Значение h указывает максимальную длину каждой записи. Если f = Е или L, эта длина указывается в байтах; если f = U, длина дается в словах, причем выдерживается такое соотношение: одно слово = четырем байтам.
13.1. Работа с лентами и дисками 461 Величина v — это целая переменная без индексов. Записи в наборе данных считаются пронумерованными от 1 до m включи- тельно. После каждого предложения READ или WRITE перемен- ная v получает значение, равное номеру следующей записи в набо- ре. Например, если читается запись 45, то v = 46 после выпол- нения предложения READ. Чтобы приллюстрировать сказанное, рассмотрим предложение DEFINE FILE 7 (256, 8, U, KW), 8 (66, 145, E, IQ), которое определяет два набора данных. Набор 7 включает 256 бесформатных 32-байтовых (по 8 слов) записей. Предполагается, что переменная KW будет принимать значения 2, 3, . . ., 257 после обработки записей с номерами 1,2,..., 256. Набор данных 8 включает 66 записей, причем длина каждой из них не превышает 145 байтов; записи — форматные. Набор данных 7 может быть использован, например, для хранения значений матрицы размер- ностью 16 X 16 на диске для последующего употребления. Набор данных 8 может соответствовать полной странице (66 строк), которая печатается с помощью печатающего устройства 1443. Предложения READ (а' г, Ь) список WRITE (а'г, Ь) список READ (а'г) список WRITE (а'г) список аналогичны обычным предложениям; разница лишь в том, что добавляются символы 'г. Присутствие апострофа обязательно. Под г понимается выражение, задающее относительный номер или местоположение нужной записи. Переменная v, заданная в предложении DEFINE FILE, обычно используется для этой же цели, но вместе с тем для этого может быть использовано любое выражение. Предложение READ (7'KW, 1234) SR обеспечивает чтение одной записи. Если KW = 7, то это будет седьмая запись. Предложение WRITE (8'7*JP - 4, 1235) LA, SP, WX заносит одну запись на диск. Значение выражения 7*JP — 4 Должно лежать в пределах от 1 до 66 включительно, поскольку набор данных 8 был определен как имеющий максимум 66 запи- сей. Заметим, что если JP = 3, так что 7* JP — 4 = 17, то в резуль- тате выполнения оператора WRITE переменная IQ получит зна- чение 18, хотя явно в этом предложении переменная IQ не при- сутствует. Причиной присвоения нового значения переменной IQ
462 Гл, 13. Дополнительные операторы Фортрана является тот факт, что эта переменная была описана в DEFINE FILE. Наконец, предложение FIND (а'г) может быть использовано для того, чтобы организовать поиск требуемой записи. Это предложение является необязательным, однако оно позволяет ускорить выборку следующей записи, кото- рая должна читаться или переписываться. Нет никакого смысла давать предложение FIND непосредственно перед оператором READ или WRITE, однако, если его выдать заранее, то в даль* нейшем при чтении или записи будет сэкономлено время на пере- мещение головок. Оператор FIND не может использоваться для последовательных файлов. Последовательно организованные файлы на магнитной ленте или диске могут быть прочтены с помощью любой другой програм- мы, предполагающей использование стандартных меток неза- висимо от того, написана ли она на Фортране, Коболе, языке Ассемблера, ВРОили PL/1. Файлы с произвольной организацией данных соответствуют относительным файлам в Коболе. 13.8. Индексирование в списках ввода — вывода В списках ввода — вывода Фортрана можно применять индек- сирование, аналогично тому, как это делается в циклах DO. Проиллюстрируем это несколькими примерами. Пусть имеем WRITE (6,13)А, В(1), В(2), В(3), В(4), В(5), В(6) Это предложение предполагает выдачу 7 чисел по некоторому формату. Эта же самая операция может быть выполнена с помощью следующего предложения: WRITE (6,13) А, (В (I), I = 1,6) где круглые скобки используются для того, чтобы указать индек- сируемые величины. Вместо предложения WRITE (6,13) А, В(1), В (2), В(3), В (4), D (1), D (2), X D (3), D (4) можно написать WRITE (6,13) А, (В (I), I = 1,4), (D (I), I = 1,4) А вместо WRITE (6,13) А, В (1), D (1), В (2), D (2), В (3), D (3), X В (4), D (4)
13.8. Индексирование в списках ввода — вывода 463 можно написать WRITE (6,13) А, (В (I), D (I), I = 1,4) Если число индексов более одного, то ситуация аналогичная, правда, при этом могут появиться дополнительные уровни скобок. Давайте предположим, что KBG — это целая переменная, опре- деленная в программе. Тогда вместо предложения WRITE (6,13) В (KBG), KBG, А, Е (1,1), Е(1,2), Е (1,3), . .. X . . ., Е (1, KBG) можно написать WRITE (6,13) В (KBG), KBG, А, (Е (1, J), J = 1, KBG) Аналогично вместо предложения WRITE (6,13) Е (1,1), Е (2,1), . . ., Е (6,1), U (1), X Е (1,2), Е (2,2),. . ., Е (6,2), U (2),. . ., Е (6, KBG), XU(KBG) можно написать WRITE (6,13), ((Е (I, J), I = 1,6), U (J) J = 1, KBG) Вместо предложения READ (5,13) Н (1,1), Н (2,1), Н (3,1), Н (1,2), Н (2,2), X Н (3,2) где Н — переменная размерностью 3x2, можно написать READ (5,13) ((Н (I, J), I = 1,3), J = 1,2) или даже более просто READ (5,13) Н и выполнение этих предложений обеспечит чтение всего массива.. Последняя форма записи может быть использована только в том случае, если переменная Н имеет размерность, указанную в опе- раторе DIMENSION. Наконец, следует сказать, что значение приращения при индексировании не обязательно должно равняться единице. Рас- смотрим предложение READ (5,13) А (1), А (4), А (7), А (10) Его можно записать так: READ (5,13) (A (I), I = 1, 10, 3)
464 Гл. 13. Дополнительные операторы Фортрана Одним из основных преимуществ индексирования в списках является то, что оно дает возможность программисту указать переменное число вводимых — выводимых значений, поскольку параметры индексирования могут быть переменными. Второе преимущество заключается в том, что индексная форма часто оказывается проще. Параметры индексирования в списках ввода — вывода обра- батываются компилятором точно так же, как в цикле DO. Поэтому те же самые ограничения действуют при организации вложе- ний и т. д. 13.9. Предложение NAMELIST • Рассматриваемые в этом разделе предложения имеются только в Фортране IV. В некоторых случаях хотелось бы иметь возможность проби- вать введенную информацию, например в такой форме: KL=4, AWR = 3.45Е-03, WR=5.6,1.4,1.3,2.4,3.4,6.7 где KL — целая переменная, AWR — вещественная переменная и WR — это массив размерностью 3x2 (описанный в програм- ме в соответствующем операторе DIMENSION). Для организации ввода — вывода в такой форме в Фортране используются пред- ложения NAMELIST /х/ а15 а2, . . ., ак/у/Ь±, . ..., bn /z/ . . . READ (а, х) WRITE (а, х) тде а, как обычно, характеризует набор данных; х, у их — имена списков имен переменных, заданных в предложении NAMELIST. Символы aj и bi обозначают имена переменных (или массивов), принадлежащих тому или иному списку имен. Имена списков имен — это обычные имена в Фортране, которые должны удов- летворять следующим условиям: 1) имя может появляться только в одном предложении NAMELIST; 2) имя не может появляться где-либо в программе, кроме- как -в предложениях ввода — вывода. В предложении NAMELIST имя списка заключается между косыми чертами. Имена переменных, принадлежащих этому списку, записываются после имени списка в произвольном поряд- ке и разделяются запятыми. В одном предложении NAMELIST может быть любое количество списков имен, однако каждое имя списка не должно появляться ни в одном другом предложении’
13.9. Предложение NAMELIST 465 NAMELIST. В то же время имена переменных могут появляться более, чем в одном списке, если это нужно. В предложениях READ и WRITE не задается ни списка переменных, ни метки предложения FORMAT. Вместо всего этого задается имя списка переменных, записанных в предложении NAMELIST. Ввод осуществляется по следующим правилам: 1. Имена переменных и значения записываются на ввод- ном носителе в форме имя переменной = константа Имя переменной может иметь индексы. 2. Вводимые массивы могут быть записаны в форме имя массива = кх* константа^ к2*константа2, . . . Здесь к — положительные целые числа, означающие, что значение константы должно быть повторено к раз. Общее число констант должно совпадать в точности с количеством элементов в мас- сиве. 3. Во всех входных записях колонка 1 игнорируется. 4. В первой входной записи в колонке 2 должен присутство- вать символ &. Имя списка из предложения NAMELIST должно перфорироваться, начиная с колонки 3. Ничего другого первая запись содержать не должна. 5. В последующих записях задаются значения переменных и массивов. Количество переменных и массивов может быть любым, но все они должны принадлежать заданному списку переменных. Между отдельными элементами цепочки ставятся запятые. Каждая запись может содержать одну или несколько переменных. Пробе- лами можно широко пользоваться, чтобы улучшить читабель- ность записей, однако пробелы не должны попадать внутрь имен переменных и внутрь констант. 6. Запятая не нужна после последнего элемента в последней карте данных. Однако присутствие здесь запятой не является ошибкой. 7. После последней карты данных должна идти карта, в колон- ках 1—5 которой должно содержаться b & END. 8. Переменные на вводных картах могут располагаться в любом порядке. При выводе данных сохраняется тот же самый основной фор- мат, что они имели при вводе, поэтому выведенные данные могут быть введены в дальнейшем без преобразований. Однако выдаются все переменные, указанные в предложении NAMELIST в соот- ветствующем списке. В качестве типичного примера выводимых 30 Зак. 15635
466 Гл. 13. Дополнительные операторы Фортрана данных может быть предложен следующий: b&XYZ ЬА = 4.567, 4.589, 3.45, 3.14, В = 567.13, I = 768 b&END Эти данные могут быть, например, результатом выполнения предложений DIMENSION А (4) NAMELIST /XYZ/ А, В, I WRITE (6, XYZ) Все данные вводятся в формате G с таким количеством цифр, чтобы не терялись значащие разряды. Следует быть осторожными и не путать предложение WRITE (а, х) с предложением WRITE (а, Ь) где список переменных опущен. В последнем случае значения переменных выданы не будут, а выводная запись либо будет состоять из пробелов, либо может содержать холлеритовскую информацию. Упражнения № 33 1. Пусть ап = П^): для n = 1, 2,.. . . . Пусть sn = ai + + а2 + . . . + ап- Составить программу печати таблицы значе- ний п, ап и sn для n = 1, 2, .... Вычисления закончить при ап<10-’. 2. Изменить условия упр. 1 таким образом, чтобы нечетные п, an, sn печатать в левой части строки, а четные — в правой. Бумаги потребуется вдвое меньше. 1 3. Написать программу вычисления суммы 1-т-т+т+5-^-т+ ••• 4. Пусть требуется вычислить значения ряда sin х , sin Зх sin 5х в “Г + 'уГ + 17Г+ для х = 1°, 2°, . . ., 180°. На выходе нужно напечатать значения х (в градусах), количество членов, необходимых, чтобы обеспечить точность до седьмого десятичного знака, и значение суммы.
13.9. Предложение NAMELIST 467 5. Что произойдет, если для условий упр. 4 воспользоваться таким рядом: sin х ) sin Зх ( sin 5х t 0 —3 I 5 Г •••• 6. Перепрограммировать упр. 32.5, пользуясь именами мае-’ сивов в списках ввода — вывода. 7. Перепрограммировать упр. 32.5, применяя индексирование в списках ввода — вывода. 8. Перепрограммировать упр. 31.4, используя вычисляемый оператор GO ТО. 9. Составить программу вычислений и печати значений х и g (х), где ч f 1 / 1-t \ dt _ 2 x2k-i nlogeH + t) t “ л 21 (2k—I)2 0 k=l для x = 0.00 (0.01)0.99. Напечатать значения x в форме О.хх и значений g (х) — в форме х.хххххх. 10. Проделать упр. 9 для функции hta-я 2 У 1-(2к-1)1оге(т+т) /1—х\2к—1 4 л 2l (2к-1)2 и+х/ к—1 Сравнить результаты с результатами упр. 9. 11. Используя результаты упр. 9 и 10, напечатать таблицу значений х и количества членов, необходимых для вычисления значений функции. 12. Написать программу вычислений J] [S(3j + ji)M]’ для m = 1, 2, 3, . . ., 20. Печатать значения т, а также резуль- таты суммирования в формате F до тех пор, пока результаты суммирования не превысят 1012; после этого для печати сумм перейти к формату Е 13. Перепрограммировать упр. 12, не пользуясь оператора- ми DO. 30*
Глава 14 БОЛЕЕ СЛОЖНЫЕ ЭЛЕМЕНТЫ ФОРТРАНА 14.1. Комплексные переменные • Этот раздел относится только к Фортрану IV. В Фортране комплексное число представляется в виде упоря- доченной пары вещественных чисел, подчиняющихся обычным правилам представления чисел в Фортране. Комплексная кон- станта записывается в виде (хг, Xi) где хг и Xi — вещественные константы Фортрана; при этом хг — вещественная часть комплексного числа, a Xi — его мнимая часть. Для представления хг и Xi можно воспользоваться любой формой, в которой записываются вещественные константы, при условии, что их длины совпадают. Если задан показатель степени с буквой D или если любая из двух констант содержит более. 7 значащих цифр, то и вещественная и мнимая части хранятся как константы типа REAL*8, образуя 16-байтовую комплексную константу. Переменные могут быть определены как комплексные величи- ны с помощью предложений явной спецификации типа, а именно: COMPLEXES v1? v2, . . . COMPLEX*16 Vi, v2, . . . Предложение COMPLEX без указания длины эквивалентно COMPLEX*8. Допускается также и неявная, спецификация типа с помощью оператора IMPLICIT. Например, два предложения IMPLICIT COMPLEX*16 (A), COMPLEX (В — С) COMPLEX*8 R5T. YT*16, К (5,6), А определяют переменные, начинающиеся с буквы А, как перемен- ные типа COMPLEX*16, и переменные, начинающиеся с букв В и С, как переменные типа COMPLEXES. Переменная R5T рас- сматривается как переменная типа COMPLEX*8, а переменная YT — как переменная типа COMPLEX*16. К — это имя масси- ва, состоящего из 30 элементов, каждый из которых имеет тип COMPLEX*8. Поскольку явная спецификация отменяет неяв-
14,1. Комплексные переменные 469 ную, переменная А получает спецификацию COMPLEX*8. Обра- тим внимание на то, что не следует смешивать понятия переменная А и совокупность переменных с именами, начинающимися с А. В арифметические выражения комплексные величины могут входить вместе с величинами вещественными и целыми. Результат всегда будет комплексным.. Он будет иметь тип COMPLEX*16, если в выражение входит хотя бы одна переменная или константа типа COMPLEX*16 или REAL*8; в противном случае результат будет иметь тип COMPLEXES. Например, если задано REAL* 8АН, В*4 COMPLEX* 8С, D*16 то АН + С дает комплексное значение с двойной точностью, В + С дает комплексное значение с обычной точностью, В + (3.4, 2.4D — 2) дает комплексное значение с двойной точностью. Выполнение оператора С = АН вызывает преобразование значения. переменной АН в форму комплексного числа с обычной точностью и с мнимой частью, рав- ной нулю. На использование комплексных переменных накладываются некоторые ограничения. Комплексную переменную можно воз- водить в целую степень, но нельзя возводить в вещественную; показатель степени никогда не мойсет быть комплексным числом. Поэтому запись вида С** J допустима, в то время как записи С**В, АН**С и К**С не допускаются. Комплексные выражения также не могут быть использованы в операторах IF. Для работы с комплексными числами существуют стандарт- ные подпрограммы, указанные в приложении F. При вводе — выводе каждая комплексная переменная рас- сматривается как две вещественные переменные. Поэтому пред- ложения COMPLEX С 123 FORMAT (2Е14.8) WRITE (6,123) С обеспечивают вывод сначала вещественной, а затем мнимой части. Второй уровень круглых скобок в предложении FORMAT (в Фор- тране IV) разрешается, в частности, потому, что дает возможность
470 Гл. 14. Более сложные элементы Фортрана формировать группы, состоящие из вещественной и мнимой пары значений. Поэтому предложение вида 124 FORMAT (17/(6 (F7.2'+\ F7.2T), 218)) может быть использовано с предложением WRITE (7,124) J, (CPLX (I), I =» 1,6), KR (J), KR (J + 1), (CPLH (I), I = l,6)t MR (J), MR (J + 1) чтобы напечатать три строки, первая из которых содержит значе- ние J, вторая — шесть комплексных чисел, за которыми следуют два целых значения, а формат третьей Совпадает с форматом второй строки. 14.2. Логические данные и операторы • Этот раздел относится только к Фортрану IV. Логическими переменными называются такие переменные, которые принимают только два значения: True (истина) и False (ложь). Логические константы записываются так: .TRUE. .FALSE. Точки являются обязательными элементами представления констант. Логические переменные специфицируются неявно или явно с помощью соответствующих предложений спецификации, содер- жащих слово LOGICAL, например: IMPLICIT LOGICAL (L), LOGICAL* 1 (M) LOGICAL*4 JRT, ERT*1 Длина логической переменной может равняться либо 4, либо 1 байту (если указано особо). Если длина не задана, она берется равной 4 бантам. Так, в соответствии с приведенными выше пред- ложениями JRT имеет длину 4 байта, ERT — 1 байт, LRYU 4 байта, a MI7 один байт. Шесть операций отношения изображаются следующим образом? .GT. означает > .GE. означает .LT. означает < .LE. означает .EQ. означает = .NE. означает
14.2. Логические данные и операторы 471 Точки входят в изображение операции. С помощью операций отношения изображаются арифметические отношения между веще- ственными или целыми (но не комплексными) числами; эти отно- шения могут быть либо истинными, либо ложными. Например отношение A.LT.B примет значение .TRUE, при А = 7;0 и В = 9.0, если же А = 9.0 и В = 3.0, то значение отношения будет .FALSE. . Предло- жение LWX = A.LT. В присвоит переменной LWX значение .TRUE, или .FALSE, в зави- симости от значения отношения. Во всех шести операциях отно- шения не могут участвовать логические или комплексные величи- ны, но вещественные и целые могут. Отношение представляет собой частный случай логического выражения. Существуют три логические операции .NOT. означает "] (НЕ) .AND. означает Д (И) .OR. означает V (ИЛИ) Операция EXCLUSIVE OR («исключающее ИЛИ», или «неэкви- валентность») отсутствует. Логические операции могут выпол- няться только над логическими значениями и логическими выра- жениями. Поэтому значение выражения LWX .AND. .NOT. L истинно, если LWX истинно, a L ложно. Две логические опера- ции не могут стоять рядом, если только вторая из них не есть .NOT., как в приведенном примере. Поскольку A .LT. В — логическое выражение, над ним можно выполнить логическую операцию. Следовательно, LWX .OR. (A .LT. В) также пред- ставляет собой допустимое логическое выражение. Предложение вида а.= b где а — логическая переменная, а Ь — логическое выражение, называется логическим оператором присваивания. С помощью круглых скобок можно задать любой желаемый порядок действий при вычислении логических выражений. Если скобки отсутствуют, то соблюдается следующий порядок действий: 1) вычисление функций, 2)
472 Гл. 14. Более сложные элементы Фортрана 3) * и /, 4) + и —, 5) .GT., .GE., .LT., .LE., .EQ., .NE., 6) .NOT., 7) .AND., 8) .OR. . Логические выражения не могут быть использованы в ариф- метическом операторе IF. Однако они могут быть использованы в специальном логическом IF, которое записывается в форме IF (b) s где b — логическое выражение, as — любое предложение, кроме предложения спецификации, цикла DO или другого логического оператора IF. Если значение выражения есть .TRUE., то оператор s выполняется; в противном случае он просто пропускается. Напри- мер, допустимо использование таких логических предложений с IF: IF (LWX .AND. .NOT. L) J = 0 IF (LRU) GO TO 1876 Подчеркнем, что ограничение, по которому арифметический оператор IF не может быть последним предложением в области действия цикла DO, не распространяется на логический опера- тор IF. Логические переменные, используемые в операциях ввода — вывода, должны специфицироваться в формате L вида Lw где w — длина поля. Если при просмотре вводимого поля слева направо первой встречается буква Т или F, то переменной при- сваивается значение .TRUE, или .FALSE, соответственно. Если же ни Т, ни F не встречаются, то переменной присваивается зна- чение .FALSE. . При выводе буква Т или F располагаются в пра- вом байте поля, остальная часть поля заполняется пробелами. Выполнение предложений LWR =.TRUE. LN =.FALSE. 14 FORMAT (3L4) WRITE (7,14) LWR, LN, LWR вызовет печать выходных данных в виде bbbTbbbFbbbT
14.2, Логические данные и операторы 413 Упражнения № 34 1. Написать программу, которая вводит карты, содержащие коэффициенты квадратного уравнения аХ2 + ЬХ + с — 0, и пер- форирует значение корней X. Исходные коэффициенты пред- ставляют собой комплексные числа в формате Е12.6; результаты выдать в том же формате. 2. Составить программу вычисления и печати значения корней n-й степени из единицы. Корни задаются по формуле cos t + i sin t, где t = 2лк/п ик = 0, 1,2, ...,п — 1. Значение п указывается во входных данных. 3. Пусть в качестве входных данных заданы комплексные числа а, Ь, с, d, е и f, отперфорированные в формате Е18.8. Для записи каждого набора из 6 чисел необходимы три карты. В колон- ках 1—4 записывается целое число — номер набора значений; в колонках 5—8 перфорируется 1, если на карте содержится а и Ь; 2, если па карте содержится с и d; 3, если на карте содержится е и f. Напечатать вводимые данные, а также целую часть и оста- ток, получающиеся при делении g (х) = ах3 + bx2 + сх + d на h (х) = ex -j- f. 4. Ввести карту, содержащую N и R, и напечатать таблицу значений функции (1 + iR)x Для х = 1, 2, ..., N, считая, что R — вещественное число в формате F8.6, N — положительное целое <100. 5. Составить программу чтения карт, содержащих два шести- буквенных слова в колонках 1—6 и 7—12, каждое из которых в отдельности не имеет повторяющихся букв. Вывести на печать число букв, которые встречаются в обоих словах. Например, в словах SYMBOL и VALUES встречаются две одинаковые буквы. 6. Изменить условия упр. 5 таким образом, чтобы проверить каждое слово на предмет наличия повторяющихся букв; если таковые встретятся, напечатать сообщение об ошибке. 7. При табличном способе задания логической функции пере- числяются все возможные комбинации значений аргументов и соответствующие значения функции. Напечатать таблицу для Функции A .OR. .NOT. В .AND. С = D. Таблица должна иметь такой вид А В С D Т Т Т Т Т Т F Т
474 Гл. 14, Более сложные элементы Фортрана F F Т Т F F F Т Всего должно быть 8 (=23) строк, поскольку функция зависит от трех аргументов. 8. Решить упр. 7 для функций a) A .OR. (В .AND. (С .OR. .NOT. D)) = Е b) A .OR. (В .AND. .NOT. С) = D c) A .AND. .NOT. В .OR. (C .AND. В) = C d) (A .OR. B) .AND. .NOT. В .OR. A .AND. В = C 9. Каждая десятичная цифра может быть представлена в дво- ично-десятичной форме как комбинация разрядов 8, 4, 2 и 1. Если мы присваиваем A (i) = True в случае, если двоично-деся- тичное представление числа содержит единицу в разряде со зна- чением 21-1 для i = 1, 2, 3 и 4, то каждую десятичную цифру можно выразить в этих значениях А. Например, для цифры 9 имеем: А (1) = Т, А (2) — А (3) = F и А (4) — Т. Составить программу ввода десятичной цифры (формат И) и получения в качестве выходных данных четырех значений А. 10. Изменить упр. 9 таким образом, чтобы получить пятое значение А, т. е. А (5), где А (5) полагается Т или F так, чтобы общее число Т среди всех A (i) было нечетным. И. Используя упр. 9, написать программу, которая вводит с карты (формат 4L1) четыре значения А и печатает в качестве выходных данных четыре значения В и значение С, где С и В суть значения, изображающие соответственно перенос и десятич- ную цифру, которые получаются, если к десятичной цифре, пред- ставленной значениями А, прибавить единицу. Электронная схема, реализующая такую функцию, носит название полусум- матора. 12. Изменить условия упр. 11 таким образом, чтобы добавить контрольный бит проверки на четность к входной и выходной цифре. 14.3. Оператор-функция Оператор-функция имеет форму имя (аргумент!, . . ., аргумент^ = выражение где п < 15, а выражение может быть любым логическим или ариф- метическим выражением. Именем может быть любое принятое в Фортране имя переменной; в качестве аргументов используются переменные без индексов. Имя будет иметь тип INTEGER*4 или.
14.3. Оператор-функция 475 REAL*4, т. е. так, как это имеет место в случае самой обычной переменной, если только тип имени не задан особо с помощью оператора явной спецификации типа или с помощью предложе- ния IMPLICIT. Функция должна определяться одним оператором. Даваемые аргументам имена Являются формальными параметрами в том смысле, что эти имена действуют только в, одном операторе и не имеют отношения к точно таким же именам, используемым в осталь- ной части программы. Выражение может содержать любые пере- менные при условии, что они могут быть определены к моменту вычисления функции. Примерами операторов - функций могут служить следующие: FIRSTF (Y) - 3.*Y + 7.4 SECFN (Y) = 8.**Y + AFR THD (X, Y) - SQRT (X*X + Y*Y) где во втором операторе переменная AFR должна быть определена прежде, чем может начаться вычисление функции. Операторы - функции должны размещаться в исходной про- грамме раньше каждого выполняемого предложения. К ним можно обращаться в основной программе, как и к библиотечным функциям. В приводимой ниже программе используются два оператора- функции. Она составлена для чтения карт, содержащих сведения о величине угла и двух сторонах треугольника, и печати значе- ний углов, размеров сторон и площади. Углам треугольника присвоены имена А, В и С, его площади — имя AREA и сторо- нам — имена SA, SB и SC. Вводимые и выводимые углы измеряют- ся в градусах, хотя стандартные подпрограммы Фортрана рабо- тают с углами в радианах. Переменная Т соответствует четырех- символьному полю, вводимому с карт и содержащему номер обра- батываемого треугольника. Операторы FORMAT написаны для вывода на печать и, следовательно, первый символ служит для управления движением бумаги. Если существует два решения, то второе решение печатается под первым, но при этом входные данные второй раз не печатаются. Программа выглядит следующим образом: SIND (А) = SIN (.01745329*А) ASIND (Y) = 57.29578*ATAN 1 (Y/SQRT (1.- Y*Y)) 101 FORMAT ('Г,'TRI.' ,4Х, ZAZ, 9Х, 1 'В', 9Х, 'С', 9Х, 'SIDE А', 8Х, 2 'SIDE В', 8Х, 'SIDE С', 9Х, 'AREA') 102 FORMAT (А4, F10.3, 2Е14.6)
476 Гл. 14. Более сложные элементы Фортрана 103 104 105 FORMAT (/'О', А4, 3F10.3, 4Е14.6) i FORMAT (IX, 14Х, 2F10.3, 28Х, 2Е14.6) FORMAT ('О', А4, 5Х, 'NO SOLUTION') WRITE (3,101) 201 READ (1,102) T, A, SA, SB G = SB*SIND (A)/SA IF (G - 1.) 205, 205, 203 205 В = ASIND (G) C = 180.- A - В SC = SA*SIND (C)/SIND (A) AREA =.5*SB*SC*SIND (A) WRITE (3,103), T, А, В, C, SA, SB, SC, AREA В = 180.- В С = 180.- A - В IF (С) 201, 201, 202 202 SC = SA*SIND (C)/SIND (A) ' AREA =.5*SB*SC*SIND (A) WRITE (3,104) В, C, SC, AREA GO TO 201 203 WRITE (3,'1O5) T GO TO 201 END Подчеркнем, что использующиеся в операторах-функциях пере- менные А и Y являются формальными параметрами и не имеют отношения к переменной А в основной программе. • Использование логических переменных и выражений в one- | раторах-функциях ограничивается Фортраном IV. f 14.4. Подпрограмма-функция Подпрограмма-функция отличается от оператора-функции дву- мя характерными особенностями: во-первых, в случае подпрограм- мы-функции для определения функции может быть использована несколько предложений, и, во-вторых, компиляция подпрограм- мы-функции может осуществляться либо совместно с основной программой, либо отдельно от нее. Общая форма записи подпро- граммы-функции следующая: FUNCTION имя (аргумент^ . . ., аргументц)
14.4. Подпрограмма-функция 477 имя = выражение RETURN END функции могут именоваться так же, как и обычные переменные, т. е. использование букв I — N в качестве первой буквы говорит о целОхМ типе переменной, в случае других букв мы имеем дело с вещественными переменными. Подпрограмма-функция может также записываться в форме тип FUNCTION имя (аргумент^ . . ., аргумент^ где в качестве типа может стоять REAL, INTEGER или DOUBLE PRECISION. • В Фортране IV явная спецификация типа принимает такую форму: тип FUNCTION имя*б (аргумент, . . ., аргумент^ где в качестве типа может стоять REAL, INTEGER или LOGICAL, а указание *s может опускаться. Наличие хотя бы одного аргумента обязательно. Аргументами могут быть переменные без индексов, массивы, либо имена функ- ций или же другие подпрограммы. Подпрограмма может состоять из любого количества предложений, но последним выполняемым предложением обязательно должно быть предложение RETURN. Это предложение обеспечивает возврат управления в основную программу. Последним в порядке написания должно быть пред- ложение END. Программа может содержать несколько предло- жений RETURN, но только одно предложение END. Обращение к подпрограмме-функции осуществляется точно таким же образом, как и к функции, определенной оператором-функцией. В качестве примера рассмотрим программу вычисления значе- ния вероятности Р по формуле Р (т; п, г) = = [С (n, т) х С (г — 1, п —т — 1)}: С (п + г — 1, г) для т = 0, 1, . . ., п. Функция С (х, у) — это число сочетаний из х элементов по у, например, С (52, 13) определяет количество возможных наборов из 13 карт, которые могут оказаться на руках У игрока при раздаче колоды в 52 карты. Функция Р (ш; п, г) указывает вероятность остаться пустыми m ячейкам, когда г неразличимых объектов размещаются по п ячейкам и все разли- чимые размещения равновероятны. В физике про частицы, обла-
478 Гл. 14. Более сложные элементы Фортрана дающие таким свойством, говорят, что они подчиняются стати- стике Бозе — Эйнштейна. Наша программа будет включать две подпрограммы-функ- ции, одна из которых вычисляет число сочетаний из х по у а другая вычисляет значения факториала, пользуясь соотноше- ниями О! = 1 х! = х х (х — 1)1 = = х х (х — 1) х (х — 2) х ... X 3 х 2 х 1 Эта программа такова: С MAIN PROGRAM 101 FORMAT (218) 102 FORMAT (///'N==', 15, 5X, 'R = ', 15 1//6X, 'M', 5X, 'PROB.') 103 FORMAT (18, F14.10) 201 READ (1,101) N, IR WRITE (3,102) N, IR IF (N) 202, 202, 203 202 STOP 203 IF (IR) 202, 202, 204 204 M = 0 P = COMBF (N, M)*COMBF (IR - 1, N - M - 1) 1/COMBF (N + IR - 1, IR) WRITE (3,103) M, P M = M 4- 1 IF (M - N) 205, 205, 201 END C FIRST SUBPROGRAM FUNCTION FACTF (N) IF (N) 11, 12, 13 11 FACTF = 0.0 RETURN 12 FACTF = 1.0 RETURN 13 X = 1.0 DO 14 I = 1, N
14.4, Подпрограмма-функция 479 14 X = X*I FACTF = X RETURN END C SECOND SUBPROGRAM FUNCTION COMBF (N, K) D = FACTF (N — K)*FACTF (K) IF (D) 11, 11, 12 11 COMBF = 0.0 RETURN 12 COMBF = FACTF (N)/D RETURN END Нетрудно видеть, что каждая подпрограмма-функция оформ- ляется как отдельная программа. Переменные являются формаль- ными параметрами; метки носят локальный характер, т. е. имеют силу только в пределах подпрограммы. Формальный параметр не может появляться в предложении EQUIVALENCE. Формаль- ный параметр может быть именем массива. В этом случае при обращении к функции фактический параметр также должен быть именем массива. Более того, если формальный параметр является именем массива, то он должен быть описан внутри подпрограммы с помощью предложения DIMENSION, а соответствующий ему фактический параметр также должен быть описан в главной про- грамме с помощью предложения DIMENSION. Размерности при этом должны совпадать. • В Фортране IV целые переменные могут быть использова- ны в подпрограммах (но не в основной программе) в качестве индексов в предложениях DIMENSION, например: основная программа: DIMENSION А (5,3) 1=5 А = 7.46 X = RTY (U, А, I, 3) подпрограмма: FUNCTION RTY (X, A, I, L) DIMENSION A (I, L) Всякий раз когда переменные размерности используются в подпрограмме, их значения должны определяться фактическими параметрами. Эта возможность облегчает использование програм- мы с массивами изменяющихся размеров.
480 Гл, 14, Более сложные элементы Фортрана • В системах DOS и TOS порядок карт в задании для выполне- ния компиляции и счета по приведенной выше программе должен быть следующим: // JOB EXAMPLE Карты ASSIGN, если требуется // OPTION LINK PHASE EXAMPLE,* // EXEC FORTRAN Основная программа /♦ // ЕХЕС FORTRAN Первая подпрограмма /♦ // ЕХЕС FORTRAN Вторая подпрограмма /♦ И ЕХЕС LNKEDT И ЕХЕС Карты с начальными данными /* /& Порядок, в котором компилируются три программы, не играет роли. Если необходимо включить также подпрограммы, входя- щие в библиотеку программ, то перед картой ЕХЕС LNKEDT следует добавить INCLUDE SIN INCLUDE SQRT и т. д. Если обращение к подпрограмме осуществляется в про- грамме неявным образом, то карты INCLUDE не нужны. Упражнения № 35 1. Размер ренты в расчете на 1 доллар определяется следую- щим выражением: g __ (14-Г)П-1 г где г — норма процента, ап — количество периодов времени. Одна из проблем капиталовложений связана с определением нор- мы процента г при задании S и п. Сначала находят два значения г, а именно ri и г2, таких, что S (ri) < S < S (г2). Затем производит- ся интерполяция г, т. е. определение г из соотношения S—Sj Г—Г1 S2—Si г2—rt *
14,5» Подпрограммы 481 После этого вычисляется значение S (г) и осуществляется замена либо Si, либо S2 в зависимости от выполнения неравенств S (г) > S или S (г) < S. Процесс продолжается до тех пор, пока значения S не станут достаточно близкими. Составить программу ввода п и S, а также печати г с точностью до шестого десятичного разряда. Вычисления S (г) оформить в виде оператора-функции. 2. Кумулятивные биномиальные вероятности вычисляются по формуле к В (к; П, р)=2 С(п, г)рг(1— р)п“г г=0 Написать программу чтения значений п и р и печати табли- цы В (к) для к = 0, 1, . . ., п. Для вычисления С (х, у) использовать подпрограмму-функцию. 3. Написать программу вычисления суммы ряда, n-й член которого равен 1 (1 + с) (1 + 2с)...(1+пс) 2 (2 + с) (2+2с) ... (2+nc) п где п = 1, 2, .... Представить в виде таблицы значения этого ряда для с = 1, 1/2, 2, 1/3, 3, . . .. Ряд может быть расходящимся для некоторых значений с. 4. Для аппроксимации п! известны две формулы Стирлинга: J/ 2лп (п/е)п и V2лп (n/e)n e1/(12n). С целью определения лучшей из этих формул провести вычисления по каждой из них и разде- лить результаты на п!. Напечатать таблицу, содержащую помимо пип! значения вычисленных отношений. Для печати п! исполь- зовать Е-формат, для печати значений частных F-форматы. 5. В бесконечном произведении оо П (n/z) sin (z/n) n=2 при z = О обычно полагают член равным 1. Написать программу вычисления произведения для вводимых значений z (одно значе- ние па карту). Произведение сходится для всех значений z, поэтому возможность переполнения исключена. 14.5. Подпрограммы Подпрограмма-функция может иметь большое количество аргументов, но она всегда дает один явный результат. Подпрограм- ма SUBROUTINE может быть применена в тех случаях, когда необходимо получение нескольких результатов. Она имеет такую 31 Зак 15635
482 Гл. 14. Более сложные элементы Фортрана форму: SUBROUTINE имя (аргумент!, . . аргумент^ RETURN END Как и в случае подпрограмм-функций, предложение RETURN должно быть последним выполняемым предложением. Оно возвращает управление той программе, которая обращалась к подпрограмме. Предложение END должно быть последним в порядке написания. Аналогично подпрограммам-функциям подпрограмма SUBROUTINE является самостоятельной програм- мой с переменными, локализованными по области действия только в этой подпрограмме и не имеющими никакого отношения к пере- менным в основной программе. Подпрограммы SUBROUTINE получают свои имена в соот- ветствии с общими правилами присваивания имен в Фортране. Имя подпрограммы не специфицируется по типу, поскольку при выполнении подпрограммы может быть получено несколько резуль- татов. Допустимо использование всех принятых в Фортране предложений, исключение составляют лишь предложения FUNCTION, SUBROUTINE и BLOCK DATA (см. разд. 14.7). Однако в отличие от подпрограмм-функций присутствие аргумен- тов не обязательно, и имя подпрограммы не обязательно встре- чается как имя переменной в подпрограмме. Аргументы подчи- няются тем же самым правилам, которые действуют и в случае подпрограмм-функций. Подпрограмма, с одной стороны, не дает ни одного явного результата; с другой стороны, она может давать любое число неявных результатов, например, в подпрограмме SUBROUTINE FNH (X, Y, Z, W) Z = X + Y W = X — Y RETURN END формальные параметры X и Y обозначают входные данные, a Z и W — величины, выдаваемые при возврате. В основной програм- ме переменные, с которыми работает подпрограмма (т. е. фактиче-, ские параметры), задаются с помощью предложения CALL. Оно имеет форму CALL имя (аргумент^ . . ., аргумент^
14.5. Подпрограммы 483 где имя — это имя подпрограммы. К приведенной выше подпро- грамме можно, например, обратиться следующим образом: X - 3.4 CALL FNH (7., X, Y, Р) В результате при выходе из подпрограммы получим Y = 10.4, Р - 3.6. Чтобы проиллюстрировать применение описанных средств более наглядно, составим программу решения следующей задачи: прочитать коэффициенты квадратного уравнения Ах2 + Вх + + С = 0 и отперфорировать корни. Все коэффициенты являются комплексными числами. В Фортране IV мы, естественно, рабо- тали бы с комплексными числами, но в данном случае решение задачи предполагается выполнить, пользуясь Basic-Фортраном. Операции умножения, деления и извлечения квадратного корня для комплексных чисел мы оформим как подпрограммы С MAIN PROGRAM 101 FORMAT (6Е12.6) 102 FORMAT (4E12.6) DIMENSION A (2), В (2), C (2), 1 R (4), D (2), E (2), F (2) 20 READ (1,101) А, В, C CALL CMUL (В, B, D) E (1) = 4.*A (1) E (2) = 4.*A (2) CALL CMUL (E, C, F) E (1) = D (1) — F (1) E (2) = D (2) - F (2) CALL CSQR (E, F) E (1) = —2.*A (1) E (2) = —2.*A (2) CALL CD IV (F, E, D) CALL CDIV (В, E, F) R (1) = F (1) + D (1) R (2) = F (2) + D (2) R (3) = F (1) - D (1) R (4) = F (2) - D (2) WRITE (3,102) R GO TO 20 END 31*
484 Гл. 14. Более сложные элементы Фортрана SUBROUTINE GMUL (А, В, С) DIMENSION А (2), В (2), С (2) С (1) = А (1)*В (1) - А (2)*В (2) С (2) = А (1)*В (2) + А (2)*В (1) RETURN END SUBROUTINE CDIV (А, В, С) DIMENSION A (2), В (2), С (2) D = В (1)*B (1) + В (2)*В (2) С (1) = (А (1)*В (1) + А (2)*В (2))/D С (2) = (А (2)*В (1) — А (1)*В (2))/D RETURN END SUBROUTINE CSQR (A, C) DIMENSION A (2), C (2) D = (A (1)»*2 4- A (2)**2)**.25 E = 0.0 IF (A (1)) 87, 77, 88 77 E =.7853982 IF (A (2)) 78, 89, 89 78 E = -.7853982 GO TO 89 87 88 89 E = 1.570796 E = E 4-.5*ATAN (A (2)/A (1)) G (1) = D*COS (E) C (2) = D*SIN (E) RETURN END Следует отметить, что если на машине используются стандартные подпрограммы, к ним могут обращаться любые программы на Фор- тране и, следовательно, программисту нет необходимости вдавать- ся в детали их работы. Когда требуется запрограммировать на Фортране большую задачу, обычно пишут небольшую основную программу, которая обращается к большому числу подпрограмм. Такой подход позво- ляет существенно упростить процесс отладки, поскольку каждая подпрограмма отлаживается независимо. Кроме того, сильно упрощается внесение изменений и дополнений. Для программ,
14.5. Подпрограммы 485 содержащих более тысячи операторов, выигрыш во времени отладки оказывается весьма ощутимым. Мы уже упоминали, чтолри обращении к подпрограмме в каче- стве аргумента может быть задано имя функции или другой подпрограммы. Например, подпрограмма может быть такой: SUBROUTINE ARTH (А, В, С) С = В (А) RETURN END а основная программа может обращаться к ней следующим образом: CALL ARTH (7.45 + 2*Х, SIN, Y) CALL ARTH (RU, COS, Z) Первое обращение приведет к вычислению Y = SIN (7.45 + 2*Х), второе — к вычислению Z = COS (RU). В качестве аргумента может фигурировать имя любой другой подпрограммы. Однако в основную программу при этом нужно включить оператор EXTERNAL SIN, COS чтобы идентифицировать имя каждой подпрограммы, которое может быть использовано в качестве аргумента. Общий вид опера- тора EXTERNAL таков: EXTERNAL имя!, имя2| . . . Если имя подпрограммы используется в CALL, само имя передается в подпрограмму; во всех других случаях производится передача адреса ячейки, в которой хранится переменная, кон- станта или выражение. • В Фортране IV допускается передача имени, но не значения, не только в случае имен подпрограмм. Для этого достаточно заключить в косые черточки соответствующий формальный пара- метр в операторе SUBROUTINE. Например, при наличии пред- ложения вида SUBROUTINE YPX (А,/В/,С) в подпрограмму будет передаваться текущее значение А, имя второго аргумента и текущее значение С. Обычно, когда происходит обращение к подпрограмме, она начинает выполняться с первого выполняемого предложения До первого встретившегося предложения RETURN, по которому происходит возврат в главную программу на предложение, идущее
486 Гл. 14. Более сложные элементы Фортрана вслед за CALL. В Фортране IV от этого правила можно отклонить- ся в двух направлениях. С помощью предложения ENTRY можно задать в качестве точки входа в подпрограмму не обязательно ее начало. Предложение имеет вид ENTRY имя (аргумент!, ...» аргумент^ его можно также использовать в подпрограммах-функциях. Имя в предложении ENTRY выполняет ту же роль, что и имя в предложении FUNCTION или SUBROUTINE. Аналогичным же образом аргументы подчиняются правилам, касающимся аргументов подпрограммы-функции или подпрограммы SUB- ROUTINE. Если обращение к подпрограмме осуществляется не по основному имени, а по имени, записанному в ENTRY, то управление передается первому выполняемому предложению, следующему за предложением ENTRY. Проиллюстрируем ска- занное примером: SUBROUTINE PECR (X, Y, Р) IF (Y), 11, И, 12 11 X = -X 12 Y = X + Y ENTRY РЕСТ (Y, Р) Р = 5.0*Y**.25 RETURN END и основная программа X = 78.0 . Y = 3.0 CALL PECR (X, Y, Z) CALL PECT (4.0, P) Результатом выполнения первого CALL будет Z = 15.0, результатом второго — Р = 7.071068. Список аргументов в пред- ложении CALL должен быть согласован со списком аргументов в соответствующем предложении ETRY. В то же время может отсутствовать какая бы то ни была связь между списками аргу- ментов в предложениях SUBROUTINE и ENTRY. Другая особенность, присущая Фортрану IV,— это наличие еще одной формы оператора RETURN: RETURN i где i — константа или переменная целого типа. Обычно выход из подпрограммы SUBROUTINE осуществляется на следующее
14,5. Подпрограммы 487 по порядку предложение в основной программе. Помещая одну или несколько звездочек в список аргументов в операторе SUB- ROUTINE, мы можем задать в качестве фактических параметров в предложении CALL метки предложений, предпослав им сим- вол &. Выполнение предложения RETURN i сведется к передаче управления на предложение, метка которого является i-й по по- рядку в списке аргументов. Для иллюстрации приведем следую- щий пример: SUBROUTINE RWY (Z, С, *, *, W, *) IF (Z) 1, 2, 2 1 W = 4 RETURN 1 2 IF (С) 3, 4, 5 3 W = 5. RETURN 4 W = 0.0 RETURN 3 5 W = C RETURN 2 END Если обращение будет иметь вид CALL RWY (А, 3.4, & 10, &20, 5.6, &30) 40 . . . то в случае отрицательного значения А возврат произойдет на мет- ку 10 с W = 4; в противном случае возврат произойдет на метку 20 с W = 3.4. В случае же отрицательного С произойдет нор- мальный возврат на метку 40. По существу форма RETURN i эквивалентна следующей: CALL RWY (Z, С, W, I) GO TO (10, 20, 30), I 40 . . . Форму RETURN i можно использовать только в подпрограм- мах SUBROUTINE, но не в подпрограммах-функциях. Использование предложений ENTRY и RETURN i упрощает составление сложных программ. В то же время неопытному про- граммисту они затрудняют отладку. Поэтому лучше обходиться без них, пока сложность задачи не приведет к необходимости Их использования.
488 Гл. 14. Более сложные элементы Фортрана 14.6. Предложение COMMON Подпрограммы сами по себе представляют собой миниатюрные программы, которые могут компилироваться либо вместе с основ- ной программой, либо отдельно от нее. В общем случае программа на Фортране состоит из основной программы, нескольких подпро- грамм, а также из супервизора и программ ввода — вывода Операционной Системы. Начиная с младших адресов памяти, оставшихся после размещения супервизора, Фортран помещает переменные и константы программы. Они располагаются в таком порядке, какой удобен компилятору, а не в порядке их появления в исходной программе. Сразу же после конца данных следует основная программа и затем подпрограммы. Памяти часто оказы- вается недостаточно для размещения всех подпрограмм сразу. В таком случае можно часть подпрограмм оставить на дисках или лентах, откуда они будут считываться по мере обращения к ним из основной программы. В равной мере возможна последо- вательная работа основных программ друг за другом. При смене программ в этом случае предыдущая информация в памяти про- падает, за исключением областей, задаваемых как COMMON. Область COMMON — это специальная область для хранения общих данных для двух или нескольких программ или же общих данных для основной программы и ее подпрограмм. В этой области размещаются только те переменные, которые описаны в предло- жениях COMMON. В области COMMON переменные распола- гаются в порядке, определяемом порядком их написания в пред- ложении COMMON. Форма этого предложения такова: COMMON Vi, v2, . . . где каждому v соответствует либо массив, либо переменная. Например, предложение COMMON А, В, К, Н в машине с супервизором на 8К приведет к выделению переменной А адресов 8192—95, переменной В — 8196—99, переменной К — 8200—03, переменной Н — 8204—07. Если из другой программы нужно обратиться к этим же самым данным, то достаточно (во второй программе) задать предложение COMMON А, В, KLU, RWT и переменные А и В станут теми же, что и в первой программе. Переменная KLU второй программы попадет в ячейку 8200, т. е. в ту же ячейку, где находится переменная К первой программы. Тем самым устанавливается некоторая эквивалентность между переменными К и KLU из разных программ. Аналогично, оказы- ваются эквивалентными Н и RWT.
14,6. Предложение COMMON 489 Однако предложение COMMON не может заменить предложе- ние EQUIVALENCE; иногда нужно установить эквивалентность между переменными одной программы. Одна и та же переменная может встретиться и в COMMON и в EQUIVALENCE, и в этом случае сначала будет отведено место в области COMMON, а затем установлено соответствие по EQUIVALENCE. Например, предложения: COMMON А, В, V EQUIVALENCE (В, Е(1)) DIMENSION Е(3) расположат переменные в области COMMON следующим образом: А В, Е(1) V, Е(2) Е(3) Не разрешается задавать предложение EQUIVALENCE, кото- рое потребовало бы выхода за начало области COMMON. Напри- мер, предложения COMMON А, В, V EQUIVALENCE (В, Е(3)) DIMENSION Е(3) недопустимы, поскольку они требуют установить следующее соответствие: Е(1) А, Е(2) В, Е(3) V и переменная Е(1) должна выйти за начало области COMMON, соответствующее переменной А. Начинающему программисту мы посоветуем не задавать одну и ту же переменную и в COMMON, и в EQUIVALENCE. Сопоставляемые переменные могут иметь любой тип (целый, вещественный, комплексный, логический), но они обязательно Должны иметь одинаковую длину в байтах и на это нужно обра- щать особое внимание. Для установления необходимого соответ- ствия между переменными в предложении COMMON можно зада- вать формальные параметры. Например, предложение COMMON A, DUMMY, К, Н
490 Гл. 14. Более сложные элементы Фортрана могло бы быть использовано совместно с предложением COMMON А, В, К, Н другой программы с целью установления соответствия перемен- ных. И совсем нет необходимости, чтобы переменная DUMMY использовалась в каких-либо других предложениях программы. Ответственность за соблюдение границ памяти при располо- жении переменных в области COMMON ложится на программиста. Адрес переменной с двойной точностью должен делиться на 8 и т. п. Самый верный и простейший способ обеспечения этого состоит в том, чтобы указывать первыми более длинные пере- менные. Тогда, если DOUBLE PRECISION А, Н REAL HU INTEGER KML то COMMON А, Н, HU, KML поставит более длинные переменные первыми. При этом будет гарантировано расположение слов в нужных границах. Информация о размерности может быть указана в предложе- нии COMMON, исключая тем самым необходимость в использо- вании отдельного предложения DIMENSION. Однако переменные размерности могут быть использованы только в Фортране IV. В качестве примера предположим, что Р является вектором из 67 элементов. Тогда мы могли бы написать COMMON HU, Р(67), KLM Информация о размерности должна содержаться в первом же предложении, где встречается переменная. Это может быть пред- ложение явной спецификации типа (INTEGER, REAL и т. д.), предложение COMMON или DIMENSION. Типичный способ написания длинных программ на Фортране связан с расчленением программы на небольшие части; при этом первая часть является основной программой. Каждая часть в свою очередь обращается к нескольким подпрограммам, и общие переменные снимают необходимость в задании аргументов в пред- ложениях CALL. Помимо преимущества, связанного с возмож- ностью обращаться к подпрограммам, не размещенным в опера- тивной памяти, это предоставляет даже более важное преиму- щество раздельной отладки каждой части программы, позволяя вместе с тем вносить изменения в одну часть без повторной ком- пиляции всей программы.
14,7. Задание начальных значений 491 • В Фортране IV область COMMON может быть разделена на несколько блоков. Один из блоков может быть непомеченным; всем остальным даются имена, удовлетворяющие обычным пра- вилам. В предложении COMMON имя блока, заключенное между наклонными черточками, предшествует списку переменных в этом блоке. Пробелы, заключенные между наклонными черточ- ками, указывают возобновление непомеченного блока COMMON. Поэтому предложение COMMON А, В / BKNM1 / С, G, К, Р / BKNM2 / F, EW / / RT обеспечивает размещение переменных А, Ви RT в непомечен- ном блоке, переменных С, G, К и Р — в блоке BKNM1, перемен- ных F и EW — в блоке BKNM2. Помеченные блоки могут быть полезны в тех случаях, когда общая область велика и некоторые программы обращаются только к небольшой части общих данных. 14.7. Задание начальных значении • Материал этого раздела относится только к Фортрану IV. Иногда оказывается удобным присвоить некоторым перемен- ным те или иные значения в момент загрузки программы. Это возможно только в Фортране IV и выполняется это тремя мето- дами. Предложения явной спецификации типа Предложения REAL, INTEGER, COMPLEX и LOGICAL могут быть использованы для задания начальных значений. Общая форма такого задания: тип *s Vi*Si (ki, . . ., kn) / ri*Xi, . . ., rm*xra/, v2 . . . где тип может быть REAL, INTEGER, COMPLEX или LOGICAL, a *s можно опускать. Каждое Si также можно опустить. Параметры к (п < 7) определяют размерность, если это необходимо. Пара- метры г — это коэффициенты кратности, указывающие, сколько раз должно быть повторено следующее за г значение х. Например, предложение REAL *8 RT, RU*4 (3,2)/4.5, 3.0, 2.0, 1.7, 90.2Е-03, 1.4/, RV/89./ приводит к тому, что переменной RT отводится поле в 8 байтов без определенного начального значения, переменной RU—6 полей по 4 байта со значениями RU(1, 1) = 4.5. RU(2,1) = 3.0 и т. д., а переменной RV — поле в 8 байтов с начальным значением 89.
492 Гл. 14. Более сложные элементы Фортрана Предложение DATA Предложение DATA очень похоже на предложение явной спецификации типа, но оно не определяет тип. Форма предложе- ния такова: DATA vlt . . ., vn /г!*хь . . rm*xm/, vn+i .... Переменным vi, v2, . . ., vn в последовательности ставятся в соот- ветствие значения: Tj значений х4, г2 значений х2 и т. д. Общее количество указанных в списке переменных должно быть согла- совано с общим числом заданных числовых значений. Под каж- дым v может пониматься переменная без индексов, переменная с постоянными индексами или имя массива. Например DATA RU/4.5, 3.0, 2.0, 1.7, .0902, 1.4/RV, KW/89.,78/ присваивает массиву RU те же самые значения, что и в предыду- щем примере. RV присваивается начальное значение 89., a KW — начальное значение 78. Информация о размерности не включается в предложение DATA, так что размерность массива RU должна быть описана отдельно: точно также переменную RV необходимо специфицировать как переменную с двойной точностью. Пере- менной, находящейся в непомеченном блоке COMMON, присвоить начальные значения нельзя. Переменным, находящимся в поме- ченных блоках COMMON, можно присвоить начальные значения только с помощью подпрограммы BLOCK DATA. BLOCK DATA Подпрограмма BLOCK DATA применяется для присвоения начальных значений переменным из помеченного блока COMMON. Форма записи подпрограммы такова: BLOCK DATA END С помощью одной подпрограммы можно присвоить начальные значения нескольким помеченным блокам. Подпрограмма не может содержать выполняемые предложения. Она будет содержать хотя бы одно предложение COMMON, которое должно специфи- цировать каждую переменную в общем блоке независимо от того, присваивается ей какое-либо значение или нет, и различные пред- ложения DIMENSION, IMPLICIT, а также предложения явной спецификации типа. Предложения DATA также разрешены, но они встречаются редко. В качестве примера рассмотрим сле- дующую подпрограмму: BLOCK DATA COMMON /BKNMl/С, G, К, P
14.7. Задание начальных значений 493 REAL*4 С/1.34/, Р/1.72/ INTEGER К /О/ END Заметьте, что переменная G должна указываться в списке даже в том случае, если ей не присваивается начальное значение. Подпрограммы BLOCK DATA не компилируются отдельно, они включаются в основную программу. Они могут быть вклю- чены в подпрограмму, и в этом случае переменные становятся определенными от момента обращения к подпрограмме и до выхода из подпрограммы по RETURN. Подчеркнем, что начальное значение переменной сохраняется только до тех пор, пока эта переменная не появится в списке вводимых величин, или в левой части оператора присваивания, или в качестве параметра цикла DO, или в качестве аргумента в опера- торе CALL, короче говоря, до тех пор, пока эта переменная не будет пересчитана по программе. Об этом следует помнить. Упражнения № 36 1. При игре в бридж вы и ваш партнер располагаете 26 кар- тами. Остальные 26 карт находятся у ваших двух противников. Если они вдвоем имеют К пик, то вероятность того, что один из двух ваших противников будет иметь N К пик, равна Р = С (К, N) X С (26 - К, 13 - N) + С (26, 13) Написать программу печати таблицы значений этой вероятности (с точностью до четвертого десятичного знака) для N = 1, 2, . . ., 13. 2. Обсуждение, проведенное в разд. 14.4, предполагало, что мы имели дело с неразличимыми объектами. Если же у нас имеют- ся различимые объекты, вероятность наличия пустых ячеек Р(т; п, г) может быть определена по следующей формуле: п-ш Р(т; п, г) = 2 (-iyC(m+j, n)C(n, m + j) (1 --Sil)1 j=o Составить программу вычислений, аналогичную программе, пред- ставленной в разд. 14.4, для вычисления этой функции. 3. Вероятность Р (j; п) получения суммы очков равной j + п при бросании п игральных костей вычисляется по формуле со Р (j; n) = 6'n 2(-l)J+78C(n,s)C(-n, j —6s) s=0 где мы определяем С (k, j) = 0, если j > к > 0, и с( —к, j) _ (-к)(-к-1) ...(-k-j + 1) j (j-1) ... (2){1)
494 Гл. 14. Более сложные элементы Фортрана Написать программу вычисления вероятности получения каждой из возможных сумм в случае бросания п игральных костей. Значе- ния п вводить с пишущей машинки. 4. Предположим, что имеется матрица A (i, j), (i = 1, . . . . . ., m; j = 1, . . ., n) и два вектора В (i) (i = 1, . . ., m) и C (j) (j = 1, . . ., n). Основная задача линейного программи- рования заключается в нахождении вектора X (j), такого, что 2 A(i, j) X(j)<B (i) для всех i j=i X(j)>0 для всех j и такого, что Z = S (j) X (j) принимает максимальное значе- ние. Написать программу для решения задачи в общем случае при п = 2ит^7. Значения переменных А, В и С вводить с пер- фокарт. Значения X и Z отперфорировать. Все значения входных данных :>0. 5. Составить программу чтения матрицы третьего порядка (т. е. матрицы с тремя строками и тремя столбцами) и вычисления ее определителя. 6. Используя программу упр. 5 как подпрограмму, написать программу чтения элементов матрицы четвертого порядка и вычис- ления ее определителя разложением по строке или по столбцу.
Глава 15 ВВЕДЕНИЕ В КОБОЛ 154. Программирование коммерческих задач Применение электронных вычислительных машин для реше- ния коммерческих задач и для выполнения научных расчетов характеризуется существенными различиями. Обычно для реше- ния научной задачи выполняются сложные и длительные вычис- ления над незначительным количеством входных данных и при не очень большом объеме выходных. В типичной коммерческой задаче вычислений меньше, чем всевозможных перемещений данных, выполняются они над большими входными массивами, соизмери- мыми с объемом выдаваемых результатов. При решении коммер- ческих задач формат вводимых и выводимых данных обычно предварительно определен во всех подробностях и программист должен организовывать вывод данных, строго следуя формату. И это еще не все: вводимые данные обычно представляют собой уже существующие файлы, хранимые либо на перфокартах, либо на магнитной ленте, и программисту необходимо приспосабли- ваться к их форме. С другой стороны, при решении научных и инженерных задач чаще формат данных подстраивается под нужды программы, так что программист может воспользоваться таким входным форматом, применение которого он считает в каждом конкретном случае наиболее целесообразным. Поскольку при организации вывода обычно требуется только удобство чтения полученных результа- тов, программист может не очень заботиться о их редактировании. Успешное применение Фортрана в конце 1950-х гг. для про- граммирования научных и инженерных задач привело многих к мысли о целесообразности подобного подхода к программиро- ванию коммерческих задач. В 1961 г. после проведения прибли- зительно двухлетних исследований комитет, созданный Министер- ством обороны США и включающий представителей наиболее крупных фирм, изготавливающих и использующих вычислитель- ные машины, опубликовал описания языка Кобол (COBOL — Common Business Oriented Language). Создание этого языка прес- ледовало три цели. 1. Облегчить процесс перепрограммирования (преобразования программ) при переносе программ с одного типа вычислитель- ных машин на другой.
496 Гл. 15. Введение в Кобол 2. Облегчить внесение в программу мелких изменений, необ- ходимых при обработке коммерческой информации. 3. Уменьшить затраты времени, необходимые на написание и отладку новых программ. В процессе разработки языка комитет взял многое из опыта работы своих представителей с другими языками программиро- вания. На сегодняшний день Кобол является единственным широко распространенным языком высокого уровня для про- граммирования коммерческих задач. В Коболе основной единицей ввода — вывода является файл данных. Каждый файл состоит из записей. Один и тот же файл часто используется в различных программах в зависимости от ха- рактера решаемых коммерческих задач. Описание файлов являет- ся очень строгим и не допускает изменений. Комитет предвидел, что каждый изготовитель вычислительных машин разработает для своей машины компилятор с Кобола, т. е. программу на машинном языке, для которой программа, написан- ная на Коболе, является исходной и подлежит трансляции в про- грамму на машинном языке. Затем эта оттранслированная программа (или как ее называют, объектная программа) выпол- няется. Специальные меры были приняты для того, чтобы исходная машина (на которой проводится компиляция) могла отличаться от объектной машины (на которой работает оттранслированная программа). Однако обычно исходная и объектная машины сов- падают. Для IBM-360 разработаны два варианта Кобола. Оба требуют наличия в машине операций десятичной арифметики. Арифметика с плавающей точкой требуется только в том случае, если в про- грамме используются числа с плавающей точкой. В случае одного из вариантов, а именно варианта уровня F, необходима опера- тивная память объемом 131 072 байта, а также магнитный диск или барабан. Применение другого варианта, варианта уровня Е, требует использования оперативной памяти в 32 768 байтов, а также магнитного диска или же четырех магнитных лент. Вари- ант уровня Е используется также дисковой и ленточной опера- ционными системами DOS и TOS (за исключением различия в спе- цифицировании устройств ввода — вывода). Оба компилятора в общем аналогичны. Компилятор уровня F отличается некоторы- ми дополнительными особенностями языка, которые отсутствуют в компиляторе уровня Е. В этой главе будет дано вполне достаточно сведений о языке, для того чтобы написать и выполнить не очень сложную про- грамму. В гл. 16 рассмотрены некоторые дополнительные эле- менты языка. Все, что будет сказано ниже, приложимо к обоим компиляторам Кобола; расхождения будут оговариваться особо.
15.2. Программа на Коболе 497 15.2. Программа на Коболе На рис. 15.1 приведена короткая программа на Коболе. Каж- дая программа, записанная на языке Кобол, состоит из четырех частей: Раздела идентификаций, Раздела оборудования, Раздела данных и Раздела процедур. В Разделе идентификаций программист присваивает имя про- грамме. Он может также указать и другую информацию, скажем, 001010 IDENTIFICATION DIVISION. 001020 PROGRAM-ID. 'CBL1'. 001030 ENVIRONMENT DIVISION. 001040 INPUT-OUTPUT SECTION. 001050 FILE-CONTROL. 001060 SELECT CD ASSIGN TO 'SYS010' UNIT-RECORD 2540R. 001070 SELECT TT ASSIGN TO 'SYS009' UTILITY 2400. 001080 DATA DIVISION. 001090 FILE SECTION. 001100 FD СО DATA RECORD IS С, 001110 LABEL RECORDS ARE OMITTED, RECORDING MODE IS F. 001120 01 С. 001130 02 С1 PICTURE 9(4). OO11U0 02 С2 PICTURE 9. 001150 02 СЗ PICTURE X(7O). 001160 02 CU PICTURE X(5). 001170 FD ТТ DATA RECORD IS T, 001180 LABEL RECORDS ARE OMITTED, RECORDING MODE IS F. 001190 01 т PICTURE X(160). 001200 WORKING-STORAGE SECTION. 001210 01 D. 001220 02 D2 PICTURE S9 COMPUTATIONAL. 001230 02 DI PICTURE 9(U). 0012U0 02 D3 PICTURE X(70). 001250 02 DU PICTURE X(70). 001260 02 D5 PICTURE X(6) VALUE '010167'. 001270 02 D6 PICTURE 9(7)V99 VALUE ZERO COMPUTATIONAL-3 001280 02 07 PICTURE XXX VALUE SPACE. 001290 PROCEDURE DIVISION. 001300 Pl. OPEN INPUT CD, OUTPUT TT. 001310 P2. READ CD, AT END GO TO P3. 001320 MOVE Cl TO 01. 001330 MOVE C2 TO D2. 001340 MOVE C3 TO D3. 001350 READ CD, AT END GO TO P3. 001360 MOVE C3 TO D4. 001370 WRITE T FROM D. 001380 GO TO P2. 001390 P3. CLOSE CD, TT. 001400 STOP RUN. P u c. 15.1. Программа на Коболе. Дату, которую необходимо внести в листинг. Раздел оборудования содержит сведения о том, какие магнитные ленты, устройства рТения карт и т. д. будут использованы объектной программой, аздел данных описывает структуру каждого файла и всех рабо- 32 Зак. 15635
IBM COBOL PROGRAM SHEET Fann No Х28И 444-1 Printed in U.S.A. ^System Punching Instructions Sheet of Program Graphic Card Form# * Identification Programmer | Date Punch I Д ill и L.J 73] [80
15,2. Программа на Коболе 499 чих областей, которые могут потребоваться. Раздел процедур включает собственно команды для обработки данных и организа- ции ввода — вывода. Все четыре раздела должны записываться в порядке, указан- ном на рис. 15.1. При изменении типа вычислительной машины обычно должен быть изменен только Раздел оборудования. В случае использова- ния одного и того же файла в нескольких программах его описание в Разделе данных целесообразно скопировать в другие программы, поскольку это позволит сэкономить время, необходимое для написания новых программ. Сама программа обычно записывается на специальных блан- ках; пример такого стандартного бланка приведен на рис. 15.2. Каждая строка затем перфорируется на карту. Допустимо исполь- зование карт со специальной разметкой, что облегчает чтение отперфорированных карт. Колонки 1—6 содержат.номер страницы и отроки. Это необ- ходимо, главным образом, для удобства программиста, хотя в случае надобности компилятор может проверить, что номера, указанные в этих колонках, располагаются в возрастающем поряд- ке. Обычно номера строк идут не подряд, а несколько разнесены, например: 010, 020 и т. д., что допускает возможность внесения вставок. Колонка 7 обычно пустая. Наличие в ней черточки (дефиса) сигнализирует компилятору о том, что данная строка является продолжением предыдущей. При этом продолжение необходимо показывать только в том случае, если нечисловые литералы (т. е. буквенно-цифровые константы, такие, как XYZ, 34 ELM ST и т. д.) продолжаются из колонки 72 предыдущей строки. При продолжении запись константы всегда начинается с колонки 12. Запись операторов Кобола всегда начинается с колонки 8 (поле А) или же с колонки 12 (поле В). Использование того или иного поля зависит от типа оператора. Колонки 73—80 компиля- тором не используются и обычно отводятся под имя программы. Кобол не использует полный набор символов, применяе- мых в IBM-360. Он ограничивается использованием только следующих (51) символов: 26 букв от А до Z 10 цифр от 0 до 9 15 специальных символов: + — * / = пробел $,.'();>< Исключая случай нечисловых литералов, два или большее число пробелов рассматриваются как один. Многократные пробе- лы могут быть использованы для того, чтобы сделать исходную 32*
500 Гл* 15, Введение в Кобол программу более читабельной, однако они не оказывают ника- кого влияния на объектную программу. При использовании знаков препинания необходимо придерживаться следующих правил. 1. Точке, точке с запятой или запятой не может предшество- вать пробел, но пробел должен следовать за ними. 2. Левой (открывающейся) скобке может предшествовать пробел, но пробел не может следовать за ней. 3. Правой (закрывающейся) скобке не может предшествовать пробел, но за ней должны следовать пробел, точка, запятая или точка с запятой. 4. Перед символом арифметической операции ( + , — и т. д.) или знаком равенства и после них должен ставиться пробел. Прежде чем начинать знакомиться с описанием языка Кобол, давайте рассмотрим кратко программу, приведенную на рис. 15.1. Из Раздела идентификаций видно, что программе присвоено имя CBLL Раздел оборудования определяет два файла, одному из кото- рых — файлу CD — выделяется устройство чтения карт (модель 2540), а другому — файлу ТТ — выделяется лентопротяжное устройство (модель 2400). Раздел данных определяет файл CD, как содержащий 80-байтовую запись С, которая включает четы- рехбайтовое поле С1, однобайтовое поле С2, 70-байтовое поле СЗ и пятибайтовое поле С4. Файл ТТ содержит занимающую 160 бай- тов запись Т, которая уже не подразделяется на составные части. В рабочую область включена только одна запись D. Она пред- ставляет собой совокупность полей DI, D2, D3, D4, D5, D6 и D7. Запись COMPUTATIONAL (ДЛЯ ВЫЧИСЛЕНИЙ) в D2 озна- чает, что это поле будет двоичным полусловом. Запись COMPU- TATIONAL—3 в D6 обозначает, что это поле — упакованное десятичное. Все другие поля D содержат по одной цифре или одному символу на байт. Для D5, D6 и D7 задаются постоянные значения. Эти значения присваиваются при загрузке объект- ной программы. Характер обработки данных определяется в Разделе про- цедур. При этом Р1 — это имя подраздела. Оператор OPEN (ОТКРЫТЬ) сообщает компилятору, что файл CD будет исполь- зован в качестве входного, а файл ТТ — в качестве выходного. В подразделе Р2 считывается карта и, когда встречается EOF (конецфайла), выполняется переход на подраздел РЗ. Затем произ- водится передача различных полей в D, чтение следующей карты и, в конце концов, формирование ленточной записи путем передачи записи D в запись Т с последующим внесением записи в выходной файл ТТ. Оператор GO ТО (ПЕРЕЙТИ) выполняет возврат на начало подраздела Р2 и продолжение обработки данных. Оператор CLOSE (ЗАКРЫТЬ) в РЗ выполнит запись ленточной марки и другой информации, которая должна быть записана для
15,3. Имена 501 того, чтобы при чтении магнитной ленты был распознан EOF. Оператор STOP RUN (КОНЕЦ ПРОГРАММЫ) закончит выпол- нение -объектной программы и возвратит управление супер- визору. Эта программа просто обеспечивала чтение двух карт и созда- ние одной ленточной записи. Если отперфорировать карты сле- дующим образом: Колонка Первая карта 1—4 порядковый номер 5 класс цен 6—40 имя покупателя 41—75 адрес, строка 1 76—80 пробел Вторая карта 1—5 пробел 6—40 адрес, строка 2 41—75 адрес, строка 3 76—80 пробел то ленточные записи будут выглядеть так: Байты 1-2 3-6 7-41 42-76 77-111 112-146 147-152 153-157 158-160 класс цен порядковый номер имя адрес, строка 1 адрес, строка 2 адрес, строка 3 дата (1—1—67) баланс ($ 0.00) пробелы 15.3. Имена Внешнее имя в Коболе может содержать от одного до восьми символов, первый из которых должен быть буквенным, а осталь- ные — буквенными или цифровыми. Приведем примеры: DDNAME12 К PROGNM SYS005
502 Гл. 15. Введение в Кобол Внешние имена используются со следующими целями. 1. Чтобы присвоить имя самой программе. 2. Чтобы обеспечить возможность обратиться к любой другой программе или подпрограмме независимо от того, записана она на Коболе или же на каком-нибудь другом языке. 3. Чтобы присвоить имя набору данных, используемому при выполнении операции ввода — вывода. Если выполняется программа, ранее скомпилированная и вклю- ченная в библиотеку, ее имя задается в карте ЕХЕС. Как и в слу- чае Фортрана и PL/1, программа может также вызвать другую программу из библиотеки по имени. При записи программы на Коболе ее имя указывается в Разделе идентификаций и по нему к ней всегда можно обратиться из другой программы. Имена, употребляемые при вводе — выводе,— это имена,- использован- ные в картах ASSGN или DD, например SYS006 и т. д. Все используемые в Коболе внешние имена заключаются в кавычки. Поэтому программа с именем CBL1 запишется как 'CBL1', а устройство ввода — вывода SYS006 будет указано в виде 'SYS006'. Слово в Коболе может состоять не более, чем из тридцати символов, и все они должны выбираться из символов: А — Z (буквы), 0—9 (цифры) и - (дефис). Дефис не может быть первым или последним символом. Примерами слов являются следующие: GROSS-PAY . P-O-BOX-NUMBER RUN789 34PW89 1-4-016PR 34598 Имя данных — это слово, которое содержит по меньшей мере один буквенный символ. Следовательно, в указанном выше перечне число 34598 — это слово, которое, однако, не может быть исполь- зовано в качестве имени данных. Литералом называют любое число или величину, к которой обращаются по значению, а не по имени. То есть, если мы имеем XYZ = 356, то к числу 356 можно обращаться по имени XYZ. Однако к величинам часто обращаются просто путем на- писания их значения. Например, в записи XJU = XYZ + 47
15.3, Имена 503 число 47 — литерал. Различают три типа литералов: Нечисловые Числовые С плавающей точкой Нечисловой литерал заключается в кавычки и содержит макси- мум 120 символов. В качестве такого символа может быть исполь- зован любой символ, включенный в алфавит IBM-360 (за исклю- чением кавычек). Укажем такие примеры: 'JULY И, 1967' '876' '$4.56 #' 'IS IT X' Нечисловые литералы записываются в объектной программе в коде EBCDIC по одному символу в одном байте. Числовые литералы образуются путем написания строки, состоящей не более чем из 18 цифр. Допускается запись десятич- ной точки; если точка не записана, то предполагается, что она располагается правее самой правой цифры. Числу может пред- шествовать знак плюс или минус. Приведем примеры: 4.56 3456 -89002. .0014 +17 Если перед числом отсутствует знак, то литерал считается положительным. Числовые литералы могут храниться в объектной программе в виде двоичных слов или полуслов; они могут хра- ниться также в виде упакованных десятичных чисел или деся- тичных чисел в формате с зоной в зависимости от того, как указано программистом. В случае отсутствия указаний компиля- тор выбирает такую форму, которая обеспечивает максимальную эффективность объектной программы. Литералы с плавающей точкой используются для задания чисел с плавающей точкой. Они записываются в виде числового литерала, за которым следует буква Е и показатель степени, например 12.45Е+3 12.45Е—3 12.45ЕЗ + .0012Е0 -.0012Е+3
504 Гл. 15. Введение в Кобол Внутри литерала с плавающей точкой не должно быть пробелов. Каждый литерал с плавающей точкой преобразуется в 4- или 8-байтовое число с плавающей точкой, хранящееся в объектной программе в виде, указанном программистом. При отсутствии какого-либо указания программа выбирает наиболее эффектив- ную форму. Фигуральная константа — это специальный тип литерала. Фактически это особая константа, которой присвоено имя. Ниже приведены примеры фигуральных констант: ZERO, ZEROS и ZEROES соответствует одному или несколь- ким нулям. SPACE и SPACES соответствует одному или нескольким пробелам. HIGH-VALUE и HIGH-VALUES соответствует одному или нескольким байтам, все разряды которых — единицы (шестнад- цатеричное FF). LOW-VALUE и LOW-VALUES соответствует одному или нескольким байтам, все разряды которых — нули (шестнадцате- ричное 00). QUOTE и QUOTES — соответствует одному или нескольким символам ' (кавычка). ALL'chmboh' — соответствует одному или нескольким повто- рениям символа, заключенного в кавычки после слова ALL. Например, запись вида ALL'9' соответствует одной или несколь- ким последовательным цифрам 9. Любой символ, за исключением кавычек, может быть указан таким образом. Резервированное слово в Коболе — это слово, которому при- дается специальный смысл. Резервированные слова нельзя исполь- зовать ни в каком другом смысле, кроме как в специальном. Список Резервированых слов приводится в приложении G. Заметим, что он включает такие слова, как ZERO, ZEROS, SPACE, QUOTE и т. д. 15.4. Раздел идентификаций При описании языка Кобол мы будем пользоваться специаль- ной системой обозначений. Если слово записывается прописными буквами, то это — Резервированное слово, которое должно быть записано в точности так, как оно указано. Слова, написан- ные строчными буквами, должны быть заменены собственными словами программиста. Слова, написанные прописными буквами п подчеркнутые, обязательны в тех случаях, когда выбрана опре- деленная альтернатива. Другие слова, написанные прописными буквами, могут быть опущены; если же они записаны, то они
15.4. Раздел идентификаций 505 не играют никакой роли при компиляции; назначение этих слов — просто сделать исходную программу более читабельной. Многие элементы Кобола являются необязательными. Все то, что заключается в квадратные скобки, необязательно и может быть опущено. Иногда программист имеет возможность сделать выбор. Это указывается написанием различных альтернатив в фигурных скобках. Фигурные скобки означают, что должна быть выбрана только одна из записанных альтернатив. Многоточие после выражения применяется с целью показать, что можно записать такое количество выражений данного типа, сколько необходимо. С учетом сказанного структуру Раздела идентификаций можно описать следующим образом: IDENTIFICATION DIVISION. PROGRAM-ID. имя-программы. [AUTHOR, предложение. . . .1 [INSTALLATION, предложение. . . .] [DATE-WRITTEN, предложение. . . .] [DATE-COMPILED, предложение. . . .] [SECURITY, предложение. . . .] [REMARKS, предложение. . . .] Первые две строки обязательны. Заметим, что наличие точек обязательно в конце каждого оператора Кобола. Как указывалось в предыдущем разделе, имя программы — это внешнее имя, под которым программа известна операционной системе. Все осталь- ные элементы необязательны. Предложения никоим образом не влияют на процесс компиляции; они воспроизводятся в листингах программы. Все подчеркнутые слова начинаются с границы поля А. Имя программы и предложения начинаются с границы поля В. Предложение, записываемое после DATE-GOMPILED, что означает дату компиляции, носит специальный характер. Если это предложение записано, то компилятор уровня F будет заме- нять его при каждой компиляции текущей датой. Другие компи- ляторы обрабатывают DATE-COMPILED аналогично другим элементам этого раздела. Типичный Раздел идентификаций может иметь такой вид: IDENTIFICATION PROGRAM-ID. AUTHOR. DATE-WRITTEN. DATE-COMPILED. DIVISION. 'CBL2'. C.B.G. MARCH 1966. AUGUST 5, 1966.
506 Гл. 15. Введение в Кобол REMARKS. THIS IS A SAMPLE. IT ILLUSTRATES THAT | A SERIES OF SENTENCES MAY BE CONTI- j NUED OVER SEVERAL LINES AS LONG I AS THEY ARE CONTAINED IN MARGIN B. | Каждый раз при повторной компиляции программы компиля- ! тор уровня F осуществит подстановку текущей даты вместо даты I 5 АВГУСТА 1966. 15.5. Раздел оборудования Раздел оборудования оформляется в виде: ENVIRONMENT DIVISION. | “CONFIGURATION SECTION. 1 ‘ [SOURCE-COMPUTER. IBM-360 [модель].] [OBJECT-COMPUTER. IBM-360 [модель].] Г INPUT-OUTPUT SECTION. 1 [ FILE-CONTROL, select-предложения. J ; 51 Вся секция конфигураций является необязательной. Если , она опущена, то предполагается, что исходная и объектная маши- j ны одна и та же ЭВМ. Модель обозначается как ЕЗО, G50, Н40 и т. д. В секции ввода — вывода описываются все входные — выходные файлы, используемые в программе, и для каждого файла записы- вается по одному предложению, начинающемуся со слова SELECT {выбрать). При этом в то время как все остальные элементы, указанные нами выше, записываются начиная с границы поля А, предложения со словом SELECT записываются начиная с гра- ницы поля В. Форма записи такова: ; SELECT имя-файла ASSIGN ТО внешнее-имя DIRECT-ACCESS номер-устройства UNIT[S]. 1 UTILITY UNIT-RECORD Следует иметь в виду, что употребление слова ТО, а также слов UNIT или UNITS является необязательным. Целесообраз- ность их включения определяется программистом. Имя-файла дол- жно удовлетворять правилам составления имен данных. Оно может включать до 30 символов, и по меньшей мере один из них должен * быть буквенным; из числа специальных символов допускается
15.5. Раздел оборудования 507 использование только дефисов, не стоящих в начале или конце имени. Внешнее-имя записывается в форме SYSnnn, где ппп — число, лежащее в пределах между 004 и 244 для DOS и TOS, или же имя управляющей карты DD для OS; внешнее-имя — это символическое имя устройства ввода — вывода. В качестве номе- ров-устройств должны задаваться следующие: DIRECT-ACCESS: 2301, 2302, 2303, 2311, 2321, 2314 UTILITY: 2400, 7340, любое имеющееся устройство с пря- мым доступом UNIT-RECORD: 1403, 1404, 1443, 1445, 1442R, 1442Р, 2501, 2520R, 2540R, 2540Р, где R обозначает читающее устройство и Р — перфоратор. • Для дисковых и ленточных операционных систем (DOS и TOS) обязательна запись номера устройства. • В случае операционной системы OS выделение устройства может быть произведено либо во время компиляции, либо во время выполнения. Если это делается во время компиляции и номер устройства указан, то устройство выделяется полностью. Можно просто указать DIRECT-ACCESS, или UTILITY, или UNIT- RECORD без уточнения устройства; в этом случае во время выполнения объектной программы в управляющей карте DD должно быть указано устройство. При работе с файлами с после- довательным доступом также можно избежать выделения опре- деленного типа устройства во время компиляции, написав UTI- LITY без указания номера устройства. В этом случае при выпол- нении объектной программы картой DD можно выделить файлу любое устройство, включая и тип UNIT-RECORD. Предложение SELECT должно записываться для каждого файла программы. В настоящий момент мы ограничимся рассмот- рением лишь последовательно организованных файлов. Файлы с прямым доступом будут разобраны в разд. 16.6. Типичный Раздел оборудования может иметь такой вид: ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION FILE-CONTROL. SELECT C ASSIGN TO 'SYS010' UNIT-RECORD 2540R. SELECT T ASSIGN TO 'SYS009' UTILITY 2400. SELECT M ASSIGN TO 'SYS008' UTILITY 2400. SELECT L ASSIGN TO 'SYS011' UNIT-RECORD 1403.
508 Гл, 15. Введение в Кобол Приведенный фрагмент программы на Коболе определяет четыре файла, в том числе: входной файл С для ввода с перфокарт, выходной файл L для выдачи на печать, а также два ленточных файла Т и М. В каждое предложение SELECT программист может (но это необязательно) включить следующую конструкцию: RESERVE |N0 1 ALTERNATE AREAIS] --------- (цел oe J Одна буферная область всегда автоматически резервируется в оперативной памяти машины для каждого файла. Такая кон- струкция используется для управления выделением дополнитель- ных областей. Применение дополнительных областей обычно уско- ряет выполнение операций ввода — вывода, однако также связано с использованием дополнительной оперативной памяти. В операционных системах DOS и TOS (если эта конструкция опущена) предполагается выделение одной дополнительной обла- сти. Если записывается целое, то допускается только значение!. В случае системы OS, когда эта конструкция опущена, для задания количества дополнительных областей можно восполь- зоваться управляющей картой DD. Целое не должно превышать числа 254. 15.6. Раздел данных В Коболе все вводимые (выводимые) данные представляют собой файлы. Раздел оборудования определяет файл так, как он появляется в операционной системе; Раздел данных определяет файл с точки зрения структуру входящих в него различных типов записей. В этом разделе также назначаются рабочие области. Общий вид раздела следующий: DATA DIVISION. FILE SECTION. Статьи описания файлов. Статьи описания записей. WORKING-STORAGE SECTION. Статьи описания записей. Секция рабочей памяти может быть опущена, если при выпол- нении программы надобность в каких-либо рабочих областях не возникает. Секция файлов должна быть записана перед секцией рабочей памяти.
15.6. Раздел данных 509 Статьи описания файлов имеют форму FD имя-файла т дт_т (RECORD IS LABEL<------- ------1 RECORDS ARE STANDARD) OMITTED кимя-данных^ dataIREC0RD IS 1 -----[RECORDS ARE J имя-записи ... [RECORDING MODE IS тип] [RECORD CONTAINS [целое! TO] целое2 CHARACTERS] (CHARACTERS! ~ BLOCK CONTAINS целое |RECORDS | * Имя-файла присваивается файлу в Разделе оборудования. После имени файла могут быть записаны пять статей (в произ-; вольном порядке). Статья LABEL обязательна. Слово OMITTED (ОПУЙ[ЕНО) задается для файлов на устройствах единичных записей и магнит- ных лент без меток или с нестандартными метками. Имя-данных указывается только в том случае, если используются стандартные метки вместе с головными метками пользователя. Имя-данных — это имя, присвоенное набору команд в Разделе процедур, пред- назначенных для обработки меток. (Сведения о метках изло- жены в разд. 8.7.) Статья DATA также обязательна. В нее включают имена каждой записи, описываемой в данном разделе. Элементы описа- ния записей указываются после описания файла. Если файл содержит записи нескольких типов, то имя записи указывается для каждого типа записи в файле. Статья RECORDING является необязательной. Можно ука- зать тип F, V или U. Если эта статья опущена, предполагается тип V. Поскольку большинство файлов имеют тип F, эту статью обычно приходится писать. Статья RECORD CONTAINS употребляется для задания максимального и минимального размеров записей переменного и не определенного форматов. Если речь идет о записях типа F, то целое2 — это длина записи и целое!, если оно указано, должно равняться цел ому 2. Для записей типа V и типа U целое!, если оно указано, игнорируется. Если эта статья опущена, то ком- пилятор определяет длину записи из элементов описания записи, та статья обычно опускается.
510 Гл. 15. Введение в Кобол Статья BLOCK CONTAINS применяется для указания коли- чества логических записей, содержащихся в физической записи. Если эта статья опущена, предполагаются несблокированные записи. В случае, если в этой статье задано CHARACTERS, то целое должно равняться максимальному количеству символов в блоке. Эту статью следует опустить для файлов на устройствах единичных записей. При подсчете символов необходимо вклю- чать управляющие слова в начале записей типа V и т. д., посколь- ку задаваемая здесь длина определяет величину области ввода — вывода. Если в этой статье не указано ни слово CHARACTERS, ни сло- во RECORDS, то предполагается CHARACTERS. В случае запи- сей типа F целое является результатом перемножения коэффи- циента блокирования на длину записи. Для записей типа V целое— это сумма (4 плюс максимальная длина записи в блоке), умно- женная на число записей. Целое не должно превышать 32 767. В качестве типичного примера описания файла можно при- вести следующий: FD CD DATA RECORD IS C, LABEL RECORDS ARE OMITTED, RECORDING MODE IS F. FD TT DATA RECORD IS T, LABEL RECORDS ARE STANDARD, RECORDING MODE IS F. Как видим, отдельные статьи можно разделять запятыми: последние не учитываются в процессе компиляции. • В операционных системах TOS и DOS форма LABEL RECORD IS ... не допускается. Можно использовать лишь форму LABEL RECORDS ARE .... 15.7. Описание записи Описания записей являются одними и теми же независимо от того, используются ли они в секции файлов или в секции рабо- чей памяти. Укажем общий формат: номер-уровня {имя-данных 1 FILLER J [статья REDEFINES] [статья PICTURE] [статья BLaNK] [статья OCCURS]
15.7. Описание записи 511 [статья VALUE] [статья JUSTIFIED] [статья USAGE] Номера уровней могут записываться либо с границы поля А, либо с границы поля В. В каждом описании записи первым элементом является имя- записи, которое указывалось в FD. Ему всегда ставится в соот- ветствие номер-уровня 01. Имена записей (также как и имена файлов) должны подчиняться правилам написания имен данных. Запись может состоять из подполей. В этом случае подполям ставятся в соответствие уровни с номерами в диапазоне от 02 до 50. (Нуль слева можно не записывать, поскольку компилятор обрабатывает числа 02 и 2 одинаковым образом.) Каждое подполе может быть разделено, но каждому из этих подразделений должен быть поставлен в соответствие уровень с номером, превышающим номер подполя. Например, шестисимвольное поле DATE (ДАТА) может быть подразделено следующим образом: 02 DATE (02 ДАТА 04 MONTH 04 МЕСЯЦ 04 DAY Q4 ДЕНЬ 04 YEAR 04 ГОД) С одинаковым успехом мы могли бы использовать в качестве номеров уровней число 03, а не 04; это не вносит никаких разли- чий, поскольку оба эти числа превышают 02. Следует отличать единицы данных, содержащие в себе более мелкие подразделения (в этом случае говорят о групповых единицах данных), от таких единиц данных, которые не содер- жат подразделений и которые носят название элементарных единиц данных. Иногда желательно включить единицу данных в иерархию подразделений, не предусматривая обращение к ней по имени. В этом случае достаточно записать слово FILLER (ЗАПОЛНИТЕЛЬ) вместо имени данных; при этом имя не будет занесено в таблицу имен данных, составляемую компилятором. Поскольку объем памяти, отводимой под такую таблицу имен Данных, ограничен, обычно предпочтительно пользоваться словом FILLER, а не именем данных, но только надо твердо знать, что не возникнет необходимость обратиться к единице данных по име- ни. Например, если в приведенном выше примере полностью отсут- ствует необходимость обращаться к подполю YEAR по имени, то можно было бы записать MONTH, DAY и FILLER в качестве имен данных подполей для поля DATE.
512 Гл. 15. Введение в Кобол На рис. 15.3 перечислены различные типы возможных единиц данных и показано, какие статьи используются для их описания. За исключением групповых единиц данных, все типы, перечислен- ные на рис. 15.3, являются элементарными единицами дан- ных. Обратите внимание на то обстоятельство, что статья PICTURE необходима для каждой элементарной единицы дан- ных и запрещена в случае групповых единиц данных. Групповая единица Единица отчета Р Р Буквенно-цифровая Р Р Внешняя десятичная Р Р Внутренняя десятичная Р Р Двоичная Р Р Внутренняя с плавающей точкой Р Р Внешняя с плавающей точкой Р Р R N D Р N R Р D N Р R Р D N N R Р R N N R Р R N N R Р R N N R N D N N Р — допускается, R — требуется, N — ge разрешается, D — допускается только форма USAGE DISPLAY Рис. 15.3. Описатели записей Единица отчета — это поле специального типа, такое, ска- жем, как $783.52, использующееся при выводе данных на печа- тающее устройство. В IBM-360 единица отчета занимает один символ на байт. Буквенно-цифровые поля могут содержать любые буквенные, цифровые или специальные символы. Внешние десятичные поля, аналогично буквенно-цифровым полям, зани- мают по одному символу на байт, однако могут содержать лишь цифры 0—9, представленные в формате с зоной. Внутренние десятичные поля хранятся в упакованной десятичной форме. Двоичные поля имеют длину, равную 2, 4 или 8 байтов и содержат двоичные данные с фиксированной точкой. Внутренние поля с плавающей точкой имеют длину, равную 4 или 8 байтам и содер- жат числа с плавающей точкой в формате IBM-360. Внешние поля с плавающей точкой содержат числа вида 34.5678Е+4, т. е. по существу в такой форме, которая может быть исполь- зована в Фортране или PL/1 для ввода или вывода поля с пла- вающей точкой.
15.7. Описание записи 513 Статья USAGE (ИСПОЛЬЗОВАНИЕ) имеет такую форму: USAGE IS DISPLAY ] COMPUTATIONAL • COMPUTATIONAL-nj где в = 1, 2 или 3. Если эта статья опущена, то предполагается DISPLAY. Альтернатива DISPLAY задает расположение данных по одному символу на байт; COMPUTATIONAL предполагает использование двоичных чисел с фиксированной, точкой; COMPUTATIONAL-1 — четырехбайтовых полей с плавающей точкой; COMPUTATIONAL-2 — восьмибайтовых полей с пла- вающей точкой; COMPUTATIONAL-3 — упакованных десятич- ных чисел. Если статья USAGE записывается для случая груп- повой единицы данных, она относится ко всем элементарным единицам данных в группе. Статья PICTURE (ШАБЛОН) применяется для описания каж- дого символа из элементарной единицы данных. Общий вид такой статьи следующий: PICTURE IS шаблон Различают пять разновидностей шаблона: Буквенный — поле содержит лишь пробелы и 26 букв алфа- вита. Буквенно-цифровой — поле включает любой допустимый в IBM-360 символ. Шаблон отчета — поле содержит некоторое число с возмож- ностью включения точек, запятых, знаков доллара и т. д. С плавающей точкой — поле содержит внешнее число с пла- вающей точкой. Цифровой — поле содержит обычное число. Форма записи буквенного шаблона такова: ААА . . . АА или (что эквивалентно) А(п), где п показывает, сколько раз повторено А. Например, шаблон 04 MONTH PICTURE А(8). Мпм^Вает MONTH как поле из 8 буквенных символов; vNTH будет занимать 8 байтов. 33 Зек. 15635
514 Гл. 15. Введение в Кобол Форма записи буквенно-цифрового шаблона такова: XX ... X или (что эквивалентно) Х(п), где в указывает, сколько раз повторено X. Поскольку буквенное поле не может содержать никаких чисел, буквенно-цифровые шаблоны являются гораздо более распространенными по сравне- нию с буквенными. В цифровом шаблоне допускается использование следующих четырех символов: 9 соответствует любой цифре от 0 до 9; V соответствует подразумеваемой десятичной точке; S соответствует знаку числа; Р соответствует подразумеваемому нулю. Символ V не занимает места в памяти машины; он исполь- зуется в процессе компиляции для установления места десятич- ной точки. Так, шаблон 999V99 определяет поле из пяти цифр с двумя дробными десятичными разрядами. Если в USAGE задано DISPLAY, поле займет пять байтов, а если COMPUTATIONAL-3 — только три байта. Символ S (если он записывается) должен быть первым символом шаблона. Этот символ необходимо использо- вать при работе с двоичными единицами данных, а также в слу- чае единиц данных иного типа, если описывается число со знаком. Если символ S не записан, то компилятор Кобола запишет число в память машины в виде числа без знака. При выполнении ариф- метических операций числа без знака считаются положительными. При выводе знак не перфорируется, а при вводе, даже если знак отперфорирован, число будет воспринято как число без знака. С помощью символа Р указывается положение десятичной точки, когда десятичная точка лежит за пределами поля. Например, шаблон 999PPPV определяет поле из трех цифр с деся- тичной точкой, располагающейся на три разряда вправо от самой правой цифры в поле. При вводе поля вида 678 оно будет обра- батываться при выполнении арифметических операций как число 678 000. При необходимости повторения символа шаблона достаточно указать соответствующий повторитель, заключенный в круглые скобки, после этого символа. Очевидно, что символы 9 и Р могут быть повторены, но символы V и S могут появиться в шаблоне
15.1. Описание ваписи 515 только один раз. Приведем примеры цифровых шаблонов: S9 S9(5)V S9(5) VP(2)9(3) Если символ V не записан, как это имеет место в случае S9(5), предполагается, что десятичная точка находится справа от самой правой цифры. Шаблоны с плавающей точкой имеют такую форму: 4- или — далее следует одна или несколько (до шестнадцати) девяток с символом V или с точкой далее следует буква Е далее следует знак 4* или — далее следуют две девятки (для показателя степени) Знак минус в шаблоне указывает, что для положительных значений ставится пробел, а для отрицательных — знак минус; плюс в шаблоне указывает, что для положительных значений ставится знак плюс. Допускается использование символа V или знака точка среди цифр мантиссы для указания положения десятичной точки. Символ V означает, что десятичная точка не отперфорирована на карте, а точка означает, что десятичная точка отперфо- рирована. Форма шаблона отчета рассматривается в разд. 15.8. Статья JUSTIFIED RIGHT может быть записана для буквенно-цифровых единиц данных. Обычно, когда числовые данные перемещаются из одного поля в другое, они выравниваются по положению деся- тичной точки. При перемещении буквенно-цифровых данных они обычно выравниваются по левому краю поля. Если задано JUSTIFIED RIGHT, то будут скомпилированы команды пере- сылок, выравнивающие данные по правому краю поля. Например, если имеем 03 XYZ PICTURE X (20). 03 ADDR PICTURE X (18). 03 ADDR2 PICTURE X (22). 03 ADDR3 PICTURE X (18) JUSTIFIED RIGHT. R AnnaT0₽ M0VE XYZ T0 ADDI* (ПЕРЕМЕСТИТЬ XYZ ADDR) обеспечивает перемещение ’ самых левых 18 байтов поля XYZ в поле ADDR; оператор MOVE XYZ ТО ADDR2 33»
516 Гл. 15. Введение в Кобол переместит 20 байтов из XYZ в ADDR2’, где они займут самое левое положение в поле из 22 байтов, и заполнит два правых байта пробелами; оператор MOVE XYZ ТО ADDR3 переместит самые правые 18 байтов из XYZ в ADDR3. Довольно часто файл включает два или более типов записей, которые идентифицируются с помощью некоторого кода; при этом иногда отличаются только одно или два поля. Рассмотрим описание записи: 01 REC. 02 COL1 PICTURE 9. 02 CUST-ACCT-NO PICTURE 9(6). 02 CUST-NAME PICTURE X(30). 02 CUST-TYPE PICTURE X(5). 02 AMT-PAID PICTURE 9(7)V99 COMPUTATIONAL-3 REDEFINES CUST-TYPE. 02 FILLER PICTURE X(38). Описание REC определяет запись, которая содержит 80 коло- нок. В колонке 1 может указываться код карты, в колонках 2—7 — порядковый номер покупателя (CUST-ACCT-NO), в колонках 8—37 — имя покупателя (CUST-NAME). В колонках 38—42 содержится либо 5-байтовое буквенно-цифровое поле, уточняющее ТИП-ПОКУПАТЕЛЯ (CUST-TYPE) (например, STORE (магазин), РЕТАЕ(розничный торговец)), либо поле долларов и центов (AMT-PAID). Статья REDEFINES (ПЕРЕОПРЕДЕЛЯЕТ) записывается в та- кой форме: имя-данныХ1 REDEFINES имя-данных2 В этом случае оба имени данных размещаются в таблице симво- лических имен. Если в программе используется имя CUST-TYPE (ТИП-ПОКУПАТЕЛЯ), то компилятор предполагает, что мы имеем в виду 5-байтовое буквенно-цифровое поле: если мы исполь- зуем имя AMT-PAID (ВЫПЛАЧЕННАЯ-СУММА), то компиля- тор воспринимает его как имя, которому ставится в соответствие упакованное десятичное поле. Статья BLANK (ПРОБЕЛ) рассматривается в разд. 15.8. Статья OCCURS (ВСТРЕЧАЕТСЯ) рассматривается в разд. 15.9. Статьи в описании записи располагаются в любом порядке. В Секции файлов статья REDEFINES на уровне 01 не исполь- зуется; на этом уровне достигается переопределение за счет статей описания FD. Однако переопределение уровней 01 допу- скается в секции рабочей памяти, где две различные записи могут быть помещены в одну и ту же область памяти. Когда переопре- деляются групповые или элементарные единицы данных,
15.7. Описание записи 517 необходимо, чтобы при различных определениях обеспечивалось получение записей одинакового размера. В секции рабочей памяти предусмотрен специальный уро- вень 77. Описание данных с уровнем 77 должно предшествовать всем элементам с уровнем 01, содержащимся в секции. Оно опре- деляет элементарное поле, которое не является частью записи. Такое поле удобно использовать для хранения промежуточных результатов. Статья VALUE не может быть использована в секции файлов. В секции рабочей памяти с ее помощью можно поместить константу в оперативную память как часть объектной программы. Форма статьи следующая: VALUE IS литерал Приведем примеры: VALUE IS ZERO. VALUE 76.32 VALUE 'JANUARY' На рис. 15.1 мы имели такие выражения: 02 D5 PICTURE Х(6) VALUE '010167'. 02 D6 PICTURE 9(7) V 99 VALUE ZERO. 02 D7 PICTURE XXX VALUE SPACE. Здесь переменной D5 соответствует буквенно-цифровое поле; переменная D6 будет иметь значение 0000000.00; переменная D7 — значение ЬЬЪ. Обратите внимание на то, что в D6 можно было бы записать VALUE 0, а не VALUE ZERO. Статья VALUE не мо- жет быть записана для единицы данных, для которой записано REDEFINED. Вместе с тем значения можно указать во время первого определения единицы данных. Упражнения № 37 1. Разделить приведенные ниже слова на: допустимые в Коболе имена данных, просто допустимые в Коболе слова (но не имена данных) и слова, которые не могут быть использованы в Коболе: (a) EMPL NO (b) -А21 (с) WORK-AREA-1 (d) HOLD-AREA.2 (е) RECORD-123 (f) 1765432 (g) 020120 (h) OSIZUV
518 Гл. 15. Введение в Кобол (i) 98-78 (j) 795CHR 2. Что из перечисленного ниже записывается в поле А? (а) имена разделов; (Ь) имена данных в статьях описания записей; (с) 03 перед именем данных в статье описания записи; (d) имя программы в подразделе PROGRAM-ID; (е) предложения SELECT. 3. Какие из приведенных слов могут быть использованы в качестве имен данных? (a) ENDOFJOB (Ь) 0.25 (с) ZEROS (d) DF # 3 (е) А-В-С 4. Подразделить приведенные ниже конструкции на: нечис- ловые литералы; числовые литералы; литералы с плавающей точкой; конструкции, не являющиеся литералами Кобола. (a) 1025 (е) HJKLM (i) 'Kt 9Q' (b) -76.32 (f) HU'JK (с) 2.4E-7 (g). 'HU'JK' (d) 'SPECKLI' (h) 'H 78' 5. Определить, какие из приведенных ниже конструкций описывают: групповые единицы данных; единицы отчета; единицы буквенно-цифровых данных; единицы буквенных данных; внешние десятичные числа; двоичные числа; внутренние числа с плаваю- щей точкой и внешние числа с плавающей точкой. (а) 01 MASTER-INPUT-RECORD. (Ь) 02 FILLER PICTURE Х(4). (с) 03 XYZ COMPUTATIONAL-1. (d) 04 IE6Y PICTURE +999V99E+99. (е) 05 Е PICTURE S9(5) COMPUTATIONAL-3. (f) 06 FILLER PICTURE 999 COMPUTATIONAL. (g) 07 DETAIL. (h) 08 ABC PICTURE AAAA. (i) 09 EDR PICTURE 999 USAGE DISPLAY. (j) 10 67NK COMPUTATIONAL-2.
IS.8. Шаблоны отчета 519 15.8. Шаблоны отчета Шаблоны отчета предназначены для получения отредактиро- ванных полей для печати. В дополнение к символам 9, V, Р и S шаблон отчета содержит*хотя бы один из следующих символов: . обозначает обычную десятичную точку, занимающую один байт в оперативной памяти. Z означает символ подавления нулей. Нули старших разрядов, соответствующие позициям Z, заменяются пробелами в поле. * означает символ защиты банковских чеков от припи- сок. Идентичен символу. Z; разница лишь в том, что нули старших разрядов заменяются звездочками, помещает запятую в поле. Если все значащие цифры слева от запятой были заменены пробелами или звездочками, то запятая также заменяется этими символами. В идентичен запятой; различие лишь в том, что в поле вставлятся пробел. О идентичен запятой; различие лишь в том, что в поле вставлятся нуль. CR может быть записан только в правой части поля. Если поле положительное или нулевое, символы CR заменяются двумя пробелами. DB то же самое, что и CR. + может быть записан в крайней левой или крайней правой части поля. Если поле положительное, то заменяется знаком плюс; если отрицательное — зна- ком минус. — аналогичен символу плюс; различие заключается в том, что в случае положительных полей заменяется пробелом, а не знаком плюс. $ может быть записан в крайней левой части шаблона. Этот символ всегда вставляется в поле. Символы Z и ♦ обычно образуют цепочку. Так, например, шаблон вида ZZZ,ZZ9.99 может быть отнесен к полю, содержа- щему 178,899.34, что позволит получить 178,899.34. В случае поля, содержащего 1,234.56, получается ЬЫ ,234.56. Если в поле содержится 78.34, то получается ЬЬЬЬЬ78.34, а если .01, то bbbbbbO.Ol, поскольку подавление нулей прекращается при появлении первой девятки в шаблоне. Символы Z и ♦ никогда не могут появиться в шаблоне правее 9. Символы $, + и — также Йогут быть плавающими. Это озна- чает, что они записываются вместо символов Z и обрабатываются аналогично Z; различие лишь в том, что для того, чтобы символ $,
520 Гл. 15. Введение в Кобол + или — был плавающим, он должен занимать крайнюю левую позицию шаблона и должен быть записан по меньшей мере дваж- ды перед любым другим символом. Это означает, что допустимо записать $$$$$$,$9.99, в то время как запись $,$$,$$9.99 не разрешается. Символы Z, *, $, + и — в своем обычном значении не должны появляться после десятичной точки. Например, шаблон отнесенный к числу 1.34, вызвал бы печать bbl.34; отнесенный к числу .02 печать ЬЬ]э.Ь2, а отнесенный к числу .56 печать bbb.56. Поэтому желательно, чтобы после десятичной точки шли цифры 9. Тогда шаблон ZZZ.99, отнесенный к числу .02, вызовет печать bbb.02, а отнесенный к числу .56 печать bbb.56. Однако в случае шаблона, отнесенного к числу 0.00, мы получим bbb.OO, что часто оказывается нежелательным. Поэтому для любого шаблона отчета можно задать BLANK WHEN ZERO и это приведет к тому, что при нулевом поле все поле будет заме- няться пробелами. Разрешается продолжать цепочку плавающих символов $, +, —, Z или * и после десятичной точки. В подобном случае компилятор проставляет девятки вместо каждой цифры после десятичной точки и подразумевает выражение BLANK WHEN ZERO. Следовательно, шаблон эквивалентен шаблону ZZZ.99 BLANK WHEN ZERO. Сказанное проиллюстрируем следующими примерами: Шаблон Поле Отредактированная единица данных 999.99 87.583 087.58 ZZZ.99 87.587 Ь87.58 ZZZ.99 .039 ЬЬЬ.ОЗ ZZZ.99 0.0 bbb.OO ZZZ.ZZ 0.0 bbbbbb ZZZ.ZZ 0.039 bbb.03 ZZ9.99 .039 ЬЬО.ОЗ ZZ,ZZ9 56787 56,787 ZZ,ZZ9 87 bbbb87 *♦ **g 87 ****87 $**,**9.99 87 $****87.00 СФС* ttQ QQ 87 bbbb$87.00 + + + , + +9.99 87 bbbb+87.00 , 9.99 87 bbbbb87.00 $ZZ9.99DB -4.56 $bb4.56DB $ZZ9.99DB 4.56 $bb4.56bb $ZZ9.99BGR -4.56 $bb4.56bCR
15.9. Индексы 521 15.9. Индексы Часто в программу на Коболе нужно внести таблицы. Напри- мер, предположим, что имеется какой-то товар, который выпу- скается шести, скажем, размеров, и требуется хранить таблицу с ценами по прейскуранту, указанными как функция кода раз- мера. Для получения таблицы можно воспользоваться следующим фрагментом программы: 01 PRICE-FILE 02 FILLER PICTURE 999V99 COMPUTATIONAL-3VALUE 9.00. 02 FILLER PICTURE 999V99 COMPUTATIONAL-3 VALUE 12.50. 02 FILLER PICTURE 999V99 COMPUTATIONAL-3 VALUE 16.00. 02 FILLER PICTURE 999V99 COMPUTATIONAL-3 VALUE 10.00. 02 FILLER PICTURE 999V99 COMPUTATIONAL-3 VALUE 14.00. 02 FILLER PICTURE 999V99 COMPUTATIONAL-3 VALUE 18.00. 01 FILLER REDEFINES PRICE-FILE. 02 UNIT-PRICE PICTURE 999V99 COMPUTATIONAL-3 OCCURS 6 TIMES Обратите внимание на то обстоятельство, что статьи VALUE записываются в первом определении, поскольку REDEFINES запрещает использование VALUE. То есть написать: 01 XYZ. 02 UNIT-PRICE . . . 01 PRICE-TABLE REDEFINES XYZ. 02 FILLER . . . VALUE . .. нельзя, поскольку статья VALUE не может быть исполь- зована во время переопределения. Статья OCCURS для компи- лятора означает, что имеется шесть идентичных полей, храни- мых последовательно друг за другом. Чтобы обратиться к Таблице, необходимо задать, какое поле из шести идентичных нолей мы отыскиваем. Это выполняется с помощью индекса. ндекс может быть положительным целым числом или перемен-
522 Гл. 15. Введение в Кобол ной, которая принимает положительные целые значения. Пред- положим, что в секции рабочей памяти имеется статья 77 SIZE PICTURE S9 COMPUTATIONAL. Чтобы обратиться к определенной цене, надо иметь некоторый оператор, который обеспечит присваивание значения переменной SIZE, например MOVE 2 ТО SIZE, и затем можно обратиться к UNIT-PRICE (SIZE). Индексы заключаются в круглые скобки и записываются после переменной, к которой они относятся. Напоминаем, что необходимо предусмотреть пробел перед от- крывающейся скобкой и пробел или знак препинания после закры- вающейся скобки. Статья OCCURS (ВСТРЕЧАЕТСЯ) имеет две формыз OCCURS целое TIMES OCCURS цел oeTIMES DEPENDING ON имя-данных В первой форме указывается целое число идентичных полей. Целое число должно быть положительным десятичным целым. Во второй форме целое число указывает максимальное количество идентичных полей, а имя-данных есть имя переменной, которая принимает положительное целое значение, равное числу иден- тичных полей в текущей записи, • В Коболе уровня F может быть использовано любое необ- ходимое количество конструкций DEPENDING ON (В ЗАВИСИ- МОСТИ ОТ). В Коболе уровня Е может указываться только одна конструкция DEPENDING ON на каждую логическую запись. Эта конструкция не может появляться в описании подполей групповой единицы, которая сама содержит OCCURS. Более того, конструк- ция должна относиться к элементарной единице данных, которая является последней единицей в записи, или же к группе, кото- рая содержит последнюю элементарную единицу записи. На использование индексов налагается целый ряд ограниче- ний. Никакое имя данных не может быть индексировано, если: 1) оно уже используется в качестве индекса; 2) оно определяется статей REDEFINES; 3) оно применяется в качестве имени данных в конструкции DEPENDING ON; 4) оно является именем данных в статье LABEL RECORDS; В Коболе допускается использование максимум трех индексов. Индексы записываются в круглых скобках и отделяются друг от друга запятыми. В оперативной памяти элементы хранятся так, что самый правый индекс меняется наиболее быстро (анало-
15.10. Раздел процедур 523 гично языку PL/1 и не так, как в Фортране). Самый правый индекс относится к наиболее элементарной единице данных, а самый левый индекс — к наибольшей групповой единице. На- пример, в случае 02 А. 03 В OCCURS 3 TIMES. 04 С OCCURS 5 TIMES. 07 D OCCURS 2 PICTURE XX. будет определена таблица с 30 элементами (3x5x2 = 30), каждый из которых занимает два байта. В памяти элементы рас- положатся в следующем порядке: D(l, 1, 1) D(l, 1, 2) D(l, 2, 1) D(3, 5, 1) D(3, 5, 2) 15.10. Раздел процедур Раздел процедур содержит операторы, описывающие пред- полагаемую в программе обработку данных. Процедуры записы- ваются в виде операторов; один или несколько операторов обра- зуют предложение. Одно или несколько предложений составляют параграф, а несколько параграфов в свою очередь образуют секцию. Каждому параграфу и каждой секции присваивается имя. Эти имена должны быть правильно написанными словами Кобола, но здесь не требуется обязательное включение хотя бы одного буквенного символа. Операторы в предложении могут разделяться запятыми или точкой с запятой в целях улучшения читабельности текста; вместе с тем знаки препинания не обяза- тельны, за исключением лишь точки в конце каждого предложе- ния. Имена параграфов и секций записываются в поле А. Все остальные компоненты раздела должны быть записаны в поле В. Общий вид Раздела процедур следующий: PROCEDURE DIVISION. имя-секция SECTION. имя-параграфа, оператор . . . операторы. . . . имя-параграфа. . . .
524 Гл. 15. Введение в Кобол Слово SECTION, следующее за словом в поле А, определяет это слово как имя секции, а не как имя параграфа. Программа не обязательно делится на секции и на практике в коротких про- граммах нет совершенно никакой необходимости использовать секции. Операторы подразделяются на повелительные и условные. К условным операторам относятся такие, как IF PRICE-CLASS IS 3, ADD .05 TO DISCOUNT. Этот оператор определяет действие, которое должно быть выпол- нено, если проверяемое условие выполняется. Повелительный опе- ратор вида MULTIPLY DISCOUNT BY GROSS GIVING TOTAL, определяет действие, которое должно выполняться, когда бы дан- ный оператор ни встретился. Подобно тому как Раздел данных определяет используемые в программе имена существительные, Раздел процедур преду- сматривает использование глаголов для определения действия. В этом разделе мы рассмотрим три повелительных оператора: MOVE (ПЕРЕМЕСТИТЬ), GO ТО (ПЕРЕЙТИ) и STOP (ОСТАНОВ). Оператор MOVE имеет форму MOVE ( литеРал 1 ТО имя-данных2 .... -----I имя-данных1 J -- Приведем примеры: MOVE PRODUCT ТО ITEM. MOVE 4.50 ТО NET. MOVE 'JOHN DOE' TO NAME. MOVE ZERO TO PQR, NET, B19. Если в операторе указывается несколько, а не одно резуль- тирующее поле, то оператор эквивалентен нескольким отдельным операторам MOVE. Следовательно, оператор MOVE ZERO ТО PQR, NET, В19. эквивалентен следующим трем операторам: MOVE ZERO ТО PQR. MOVE ZERO TO NET. MOVE ZERO TO B19. которые могут также быть записаны в виде: MOVE ZERO ТО PQR; MOVE ZERO TO NET; MOVE ZERO TO B19.
15.10. Раздел процедур 525 Здесь операторы разделяются точкой с запятой. Вместе с тем они могут разделяться просто запятыми или даже совсем не раз- деляться, как в случае MOVE ADF ТО Р15 MOVE АСН ТО 8Y. Для разделения операторов также может использоваться слово THEN, например: MOVE ADF ТО РТ6 THEN MOVE AWQ TO C3. Далеко не все возможные поля, из которых и в которые выполняется перемещение, логически совместимы. На рис. 15.4 указаны возможные сочетания полей. Как можно заметить, возможны два вида перемещений. Числовые перемещения Исходное поле Принимающее поле Групповая единица Буквенная Буквенно- Все осталь- цифровая ные Групповая единица; Буквенно-цифровая; Буквен- ная; SPACES; нечисловые ли- тералы; Да Да Да Нет Единица отчета; HIGH-VALU- ES; LOW-VALUES; QUOTES; ALL 'символ' Да Нет1) Да Нет Внешняя с плавающей точкой; Внутренняя с плавающей точ- кой; Да Нет Нет Да3) Внешняя десятичная; Внут- ренняя десятичная; Двоичная; ZEROS; числовые литералы; Да Нет Да 2) Да3) г) ALL 'символ' допускается, ^сли символ есть буква. 2) Допускается, если исходное поле содержит целое число. 3) Числовые перемещения. ,Все остальные допустимые перемещения являются групповыми. Рис. 15.4. Допустимые сочетания полей в операторе MOVE. предполагают выравнивание полей относительно десятичной точки и при необходимости проведение соответствующих преобразова- нии между двоичными и десятичными числами, числами с фикси- рованной и плавающей точкой, упакованными и зонными фор- матами, а также включение точки, запятой и т. д. При групповых перемещениях производится просто пересылка соответствую-
526 Гл. 15. Введение в Кобол щего количества байтов без каких-либо преобразований. В том случае, когда поле, в которое производится перемещение, оказы- вается слишком коротким, перемещение прекращается при запол- нении поля. Если же поле слишком длинно, то остающиеся сво- бодными байты поля заполняются пробелами. Групповые переме- щения всегда выполняются с выравниванием по левому краю, если только нет указания JUSTIFIED RIGHT для принимающего поля. Рассмотрим следующие примеры: 01 А. 02 В PICTURE XXX. 02 С PICTURE 999. 02 D PICTURE S999 COMPUTATIONAL-3. 02 Е REDEFINES D PICTURE XX. 02 F PICTURE TXLXL. где В = P7R С = 078 D = 123+ Тогда MOVE В ТО С — неверная запись. MOVE В TO E устанавливает P7 в E.- MOVE В TO F - неверная запись. MOVE C TO D устанавливает 078+ в D. MOVE C TO F устанавливает Ъ78.00 в F. MOVE D TO C устанавливает 123 (без знака) в С. MOVE D TO F устанавливает 123.00 в F. MOVE D TO В устанавливает шестнадцатеричное 12 ЗС 40 в В. Если также имеется 01 G. 02 Н PICTURE Х(6). 02 К PICTURE 9(8). и выполняется оператор MOVE А ТО G. то получается P7R078 в Н и в К то, что было в D и F.
15,10. Раздел процедур 527 Оператор GO ТО имеет форму: GO ТО имя-процедуры где под именем процедуры понимается имя параграфа или секции» Управление сразу же передается первому оператору в указанной процедуре, что соответствует безусловному переходу. Форма оператора STOP такова: STOP RUN или STOP literal Оператор STOP RUN (ЗАКОНЧИТЬ ВЫПОЛНЕНИЕ) пре- кращает выполнение объектной программы и передает управление супервизору. Оператор этого вида должен быть последним опера- тором, выполняемым в каждой программе на Коболе. Оператор, указанный в форме 'STOP литерал', вызывает выдачу на пишущую машинку пульта сообщения, за которым следует заданный лите- рал. Литерал не может содержать свыше 72 символов. После выдачи на печать литерала вычислительная машина переходит в состояние ожидания и находится в нем до тех пор, пока оператор не введет с пульта код ответа (как это предусмотрено в DOS или OS), сопровождаемый одним символом в кавычках. Выполнение объектной программы продолжится со следующего оператора. Упражнения № 38 1. Пусть выполняется оператор MOVE G ТО Н, где G имеет шаблон PICTURE S9(4)V999. Указать содержимое поля Н при следующих исходных значениях G и шаблона Н: G шаблон Н (а) 1234.567 Z(4).9(3) (Ь) 2332.000 *(4).9(3) (с) 1.45 Z(4).9(3) (d) 1.45 $(4).9(3) (е) 1.45 • *(4).9(3) (f) 1.45 Z(4).99O (g) .026 Z(4).9(2)0 (h) -.026 Z999.99 (i) -.026 (j) —.026 — .PPP99
528 Гл. 15. Введение в Кобол (k) -.026 -PPP99 (1) -.026 9999V99 (m) -.026 + .9(6)E+99 (n) —.026 $(5).99DB (o) -.026 Z(4).Z (p) 1234.567 Z,ZZZ.ZZCR (q) 1.45 Z,ZZZ.ZZCR (r) -.026 * *** (s) -.026 $*,*(3).99B— 2. Пусть выполняется оператор MOVE J ТО К, где К имеет шаблон Х(5). Дать содержимое К после выполнения оператора для каждого J. Если оператор недопустим, указать это. Шаблон J Значение J (a) X(4) ACF8 (b) X(7) A2C4E67 (c) X(3) QUOTES (d) —.9999E—99 b.0026E+01 (e) 9(4) 0024 (f) S9(4) -0024 (g) S9(4)V99 -0024.89 (h) S9(7) 000000 (i) Z(3).99 M2.89 (j) -.9999 -.0269 3. Массив данных определяется в памяти следующим образом: 01 L. 02 FILLER PICTURE 9(6) VALUE ZERO. 02 FILLER PICTURE 99 VALUE 77. 02 FILLER PICTURE 99 VALUE 0. 02 FILLER PICTURE 99 VALUE 8. 01 FILLER REDEFINES L. 02 M OCCURS 3 TIMES 03 N OCCURS 2 TIMES PICTURE 99. 01 FILLER REDEFINES L. 02 P OCCURS 3 PICTURE X(4). Дать значение L, если выполняется оператор: (a) MOVE ZERO ТО N(l,l). (b) MOVE N(l,2) TO N(3,2). (c) MOVE M(l) TO M(2).
15.11. Ввод — вывод 529 (d) MOVE Р(1) ТО Р(2). (е) MOVE ALL'2' ТО М(3). (f) MOVE М(2) ТО Р(2). (g) MOVE 78 ТО N(2, 2). (h) MOVE 678 TO N(2, 2). (i) MOVE N(3, 2) TO M(l). (j) MOVE N(l, 2) TO P(2). 15.11. Ввод — вывод При программировании на Коболе программист не касается физической стороны операций ввода — вывода. В Коболе опера- торы ввода — вывода определяют ввод и вывод логических записей. Фактически ввод — вывод осуществляется супервизором, который остается в оперативной памяти как при выполнении объектной программы, так и во время компиляции. Прежде чем какие-либо данные начнут перемещаться между оперативной памятью и внешней средой должен быть выполнен оператор OPEN (ОТКРЫТЬ). Он записывается в такой форме: OPEN INPUT имя-файла! [имя-файла2 ... 1 [OUTPUT имя-файла ... ] OUTPUT имя-файла! [имя-файла2 ... ] [INPUT имя-файла ...] Именами файлов являются имена, записанные в Разделе обо- рудования и Разделе данных. В программе может быть исполь- зовано любое необходимое количество операторов OPEN. Сле- дует иметь в виду, что набор операторов OPEN INPUT С. OPEN INPUT Т. OPEN OUTPUT M. OPEN OUTPUT L. может быть представлен в виде одного оператора OPEN INPUT С, Т, OUTPUT М, L. (ОТКРЫТЬ ВХОДНОЙ С,Т, ВЫХОДНОЙ M,L.) В тех случаях когда открытие файлов производится с помо- щью одного оператора, необходима меньшая оперативная память по сравнению с той, которая требуется при использовании несколь- ких операторов OPEN. *4 3«к 15635
530 Гл. 15. Введение в Кобол В случае файлов, записанных на магнитной ленте или диске, оператор OPEN выполняет чтение или запись и проверку меток файлов. При использовании устройств, работающих с единичными записями, ничего не пишется, не читается и не проверяется, вместо этого определенные байты признаков устанавливаются в нужное состояние так, что последующие операторы READ и WRITE будут выполнены правильно. Если речь идет о работе только с магнитными лентами, то после имени файла можно записать слово REVERSED (ОБРАТНЫЙ). Это показывает, что лента будет читаться в обратном на- правлении. Данное слово может указываться применительно только к входным файлам. Обычно в случае магнитных лент лента перематывается к точке загрузки до выполнения про- верки меток. Однако это может оказаться нежелательным, если лента содержит не один, а несколько файлов. Для любого ленточного файла после имени файла можно записать WITH NO REWIND Это предотвратит операцию обратной перемотки. Режим NO REWIND может быть указан как для входных, так и для выходных файлов. Оператор READ (ЧИТАТЬ) записывается в следующей форме: READ имя-файла RECORD [INTO имя-данных] AT END повелительные-операторы Именем файла является то имя, которое дается файлу в Разделе оборудования. Файл должен быть открыт до задания оператора READ. Если оператор записывается с 'INTO имя-данных', он по своему действию эквивалентен оператору MOVE, указанному после оператора READ. Например, пусть имеем FD A DATA RECORDS ARE В. 01 В PICTURE Х(80). 01 С PICTURE Х(80). Тогда оператор READ A INTO С AT END GO ТО Р17. по своему действию эквивалентен двум следующим операторам: READ A AT END GO ТО Р17. MOVE В ТО С. Конструкция AT END определяет, что должно быть сделано по достижении метки EOF. Когда встречается эта метка, ника-
15Л1. Ввод — вывод 531 кого чтения не происходит; вместо этого выполняются операторы, следующие за AT END. Заметим, что после операторов, следую- щих за AT END, ставится точка. Обычно эти операторы обеспе- чивают закрытие файлов и прекращение выполнения задания или передачу управления на нужный параграф. Оператор WRITE, имеющий форму WRITE имя-записи [FROM имя-данных11 [AFTER ADVANCING J целое I LINES] ------- I имя-данных2 I обеспечивает вывод данных. Имя записи является тем именем с уровнем 01 в Разделе данных, которое было указано в конструк- ции DATA RECORDS из соответствующей статьи описания файлов. Если в операторе записывается FROM, то компилятор формирует эквивалент оператора: MOVE имя-данных 1 ТО имя-записи который работает перед выполнением оператора WRITE. Конструкция AFTER используется для выбора приемного кармана устройства перфорации карт и для управления переводом строк печатающего устройства. Если записана эта конструкция, программист должен использовать ее для всех операций вывода на’данный файл. Один символ должен быть зарезервирован как первый байт каждой выводимой строки для использования объект- ной программой в качестве управляющего символа. Поэтому, чтобы напечатать 132-символьную строку, программист резерви- рует 133 символа в Разделе данных и размещает свою запись в позициях с 2 по 133. Если после AFTER записано целое, то это целое должно рав- няться 0, 1, 2 или 3. Числа 1, 2 или 3 означают, что 1, 2 или 3 строки соответственно должны быть пропущены перед началом печати. В Коболе не предусмотрено продвижение бумаги после того, как отпечатана строка. Если целое есть 0, это означает прогон бумаги до пробивки на дорожке 1 управляющей ленты, что обычно соответствует переходу к началу новой страницы. Если задано имя-данных^, то во время выполнения программы эти данные должны содержать любой из допустимых управляю- щих символов ASA. Все эти символы перечислены в Приложе- нии I. В Коболе программист обычно следит за тем, сколько строк напечатано на странице и когда она окажется заполненной До конца. Каждый файл, открытый перед использованием с помощью оператора OPEN, должен быть закрыт после использования с помощью оператора CLOSE. 34*
532 Гл. 15. Введение в Кобол Оператор CLOSE имеет следующую форму: CLOSE имя-файла} ~ REEL"! Г WITH NO REWIND' UNIT J L WITH LOCK имя-файла2 ... С помощью одного оператора CLOSE можно закрыть любое необходимое количество файлов. Когда файл на магнитной ленте закрывается, та после записи хвостовых меток лента обычно пере- матывается к точке загрузки. Если указана альтернатива LOCK, то выполняется перемотка и разгрузка; если задано NO REWIND, то лента не перематывается. Эти две возможности могут реали- зовываться применительно только к ленточным файлам. Если файл был. открыт как REVERSED, то он перематывается на метку EOF при условии, что не были указаны слова NO REWIND или LOCK. Если записаны слова REEL или UNIT (оба эти слова взаимо- заменяемы), то на ленте записывается метка EOV (конец тома), а не EOF (конец файла) и предусматриваются специальные меры, чтобы продолжить файл на следующую бобину. Указанная воз- можность может быть задана применительно только к лен- точным файлам. Когда выполняются операторы READ или WRITE, данные передаются в точности в том виде, в каком они находятся в опе- ративной памяти или же во внешнем запоминающем устройстве. При этом совершенно отсутствует какое-либо редактирование. Поэтому весьма существенно, чтобы описания данных правиль- но отражали их форму. Еще два оператора ввода — вывода предусматриваются в Ко- боле для облегчения общения человека с машиной. Первый из них DISPLAY (ВЫДАТЬ): TSPT AY J литеРал 1 'UPON CONSOLE D AY I имя-данных J ’ ” [UPON SYSPUNCH. Если ни UPON CONSOLE (НА ПУЛЬТ), ни UPON SYS- PUNCH (НА ПЕРФОРАТОР) не указаны, то предполагается системная печать (SYSLST). Вообще может быть выдано несколь- ко литералов или переменных. Если в описании данных с указан- ным именем в статье USAGE не задано DISPLAY, данные перед выводом преобразуются в требуемую для вывода форму. Про- белы между единицами данных не оставляются, так что при необ- ходимости иметь пробелы программист обязан предусмотреть это специально. Общее количество выдаваемых символов не должно
15.12. Арифметические операции 533 превышать 72 для пульта или перфоратора или же длину строки печатающего устройства для печати на SYSLST. Обычно оператор DISPLAY используется для того^ чтобы обратить внимание опе- ратора за пультом на ту или иную необычную ситуацию. Оператор АССЕРТ(ПРИНЯТЬ) имеет форму ACCEPT имя-данных [FROM CONSOLE] Если FROM CONSOLE (С ПУЛЬТА) не указано, то предпо- лагается использование SYSIPT — стандартного системного устройства ввода. Имя-данных в операторе может быть именем группы или именем элементарной буквенной, буквенно-цифровой, внешней десятичной или внешней с плавающей точкой единицы данных. Какое-либо редактирование или проверка ошибок вход- ных данных не производятся. Если в качестве вводного устройства используется пульт, то длина имени данных не может превышать 72 символа. Оператор ACCEPT обычно используется редко, поскольку его применение для ввода данных в вычислительную машину нецелесообразно из-за крайне низкой эффективности. 15.12. Арифметические операции Оператор ADD (СЛОЖИТЬ): (ТО ] ADD арг! [арг2 ...] { ? имя-данных V11N Lx J [ROUNDED] [ON SIZE ERROR повелительные-операторы... ] В качестве аргументов могут использоваться числовые лите- ралы, литералы с плавающей точкой или имена-данных, соответ- ствующие элементарным числовым единицам данных. Если ука- зывается альтернатива ТО, то каждый из аргументов прибавляется к Данным с указанным именем. В случае указания альтернативы GIVING производится сложение самих аргументов и замена предыдущего значения данных с указанным именем; следует иметь в ВИДУ, что имя данных может быть либо элементарной числовой единицей, либо элементарной единицей отчета. Никакие дан- ные или литералы не могут содержать свыше 18 десятичных Цифр. Компилятор выполняет правильное выравнивание деся- тичных точек, а также все необходимые преобразования двоичных и десятичных чисел и чисел с фиксированной и плавающей точкой, ели не указана альтернатива ROUNDED, то результат обре- вется до размера поля результата перед запоминанием в памяти.
и 534 Гл. 15. Введение в Кобол Если же эта альтернатива указана, то результат округляется. Приведем примеры: 77 A PICTURE 999V99. 77 В PICTURE 99V999 VALUE 8.624. 77 С PICTURE S99 VALUE 6 COMPUTATIONAL. ADD В, C, GIVING A. ADD С TO B. ADD В TO ROUNDED. 014.62 помещается в A. 14.624 помещается в В. 15 помещается в С. Оператор SUBTRACT (ВЫЧЕСТЬ) SUBTRACT аргДарг2 . . .] FROM j имя-данных 1 [GIVING] имя-данных 2 I литерал GIVING имя-данных2 обеспечивает сложение значений аргументов и вычитание полу- ченного результата из значения имени-данных! или литерала. Если альтернатива GIVING не указана, результат замещает зна- чение имени-данных i; в противном случае он замещает значение имени-данных2. Взяв данные из предыдущего примера, мы полу- чим SUBTRACT В FROM С. —2 помещается в С. SUBTRACT В FROM С ROUNDED. -3 помещается в С. SUBTRACT С, -17.3 FROM В GIVING А. 019.92 помещается в А. Приведенные нами примеры арифметических операций пред- ставляли собой повелительные операторы. Их можно превратить в условные, добавив ON SIZE ERROR повелительные-операторы В случае использования этой конструкции и при результате, слишком большом, чтобы быть помещенным в поле результата, это поле не изменяется, как это должно было бы быть, а вместо этого выполняются повелительные операторы, указанные после слов SIZE ERROR (ОШИБКА РАЗМЕРА). Если эта конструкция не записана, а возникла ошибка размера, то содержимое поля результата предсказать нельзя. В качестве примера рассмотрим оператор ADD 98.1 ТО В ON SIZE ERROR MOVE 99.999 TO В. Пусть В = 8.624; тогда 98.1 + 8.624 == 106.724. Этот резуль- тат не поместится в поле В. Поэтому выполняется специально предусмотренный повелительный оператор MOVE 99.999 ТО В.
It! . 15.12. Арифметические операции 535 Операторы MULTIPLY (УМНОЖИТЬ) и DIVIDE (РАЗДЕ- ЛИТЬ): MULTIPLY арг BY имя-данных! [GIVING имя-данных2] литерал GIVING имя-данных2 [ROUNDED] [ON SIZE ERROR повелительные-операторы ... J DIVIDE арг INTO имя-данных! [GIVING имя-данных2] литерал GIVING имя-данных2 [ROUNDED] [ON SIZE ERROR повелительные-операторы ... ] обеспечивают выполнение умножения и деления соответственно. Деление на нуль всегда приводит к возникновению ошибки раз- мера. Остаток после деления получить нельзя. Укажем такие примеры: MULTIPLY 3 BY В GIVING А. 025.87 помещается в А. MULTIPLY С BY — 2. —12 помещается в С. DIVIDE В INTO 87 GIVING А. 010.18 помещается в А. DIVIDE 87 INTO В. 00.099 помещается в В. Наконец, последним оператором, рассматриваемым в данном разделе, является оператор COMPUTE (ВЫЧИСЛИТЬ). Он имеет такую форму: COMPUTE имя-данных [ROUNDED] = выражение [ON SIZE ERROR повелительные-операторы . . .1 В качестве выражения может использоваться числовой лите- рал, литерал с плавающей точкой, имя числовых данных, или арифметическое выражение. Следует отметить, что арифметические выражения образуются точно так же, как в Фортране и PL/1. Оператор COMPUTE обычно используется для выполнения вычис- лений, например COMPUTE А = В/С+87.45*0**2 — 3000.00 Здесь производится вычисление выражения В/С + 87.45 х С2 — — 3000 с записью получающегося результата, равного 149.63, в поле А. Заметим, что результат должен поместиться в А, несмотря на то, что промежуточные результаты (87.45С2 = = 3148.29) могут превышать размер поля А.
536 Гл. 15. Введение в Кобол 15.13. Условные операторы Из числа условных операторов наиболее распространенным является оператор IF (ЕСЛИ). Он записывается в форме I операторь^ ... IF условие [THEN] |NEXT SENTENCE “ |ELSE I |операторы2 ... ( “ (OTHERWISE J (NEXT SENTENCE] Типичный оператор IF может выглядеть следующим образом: IF QTY = ZERO THEN COMPUTE PRICE = ZERO ELSE COMPUTE PRICE = QTY*UN IT-COST. Слова ELSE и OTHERWISE (В ПРОТИВНОМ СЛУЧАЕ) эквивалентны по смыслу и являются взаимозаменяемыми. Рас- смотрим, как работает оператор. Если условие истинно, то выпол- няются операторы! и управление передается следующему пред- ложению. Если же условие ложно, то все операторы, предшест- вующие слову ELSE или OTHERWISE, пропускаются и выпол- няются те операторы, которые следуют за этими словами. Огра- ничителем группы выполняемых операторов служит слово ELSE (или OTHERWISE) или же точка в конце всего предложения. Если необходимость в выполнении каких-либо действий отсут- ствует, то записывается NEXT SENTENCE (СЛЕДУЮЩЕЕ ПРЕДЛОЖЕНИЕ). Нужно иметь в виду и такое обстоятельство: если вся конструкция в квадратных скобках опущена, то ком- пилятор предполагает что имеет место ELSE NEXT SENTENCE. В операторе IF допустимо использование условий самых раз- личных типов. Более подробно эти условия предполагается рас- смотреть в разд. 1 следующей главы. Здесь же мы будем говорить об условиях проверки отношения выражение! IS [NOT] отношение выражение2 где под отношением подразумева!отся GREATER THAN (БОЛЬШЕ ЧЕМ) LESS THAN (МЕНЬШЕ ЧЕМ) EQUAL ТО (РАВНО)
15.13, Условные операторы 537 а выражениями могут быть любые литералы, любые фигуральные константы, имена данных или арифметические выражения. Ниже приведены примеры условий проверки отношения (срав- нений): QTY = 0 XYZ NOT = 67.2 АВС > XYZ & s . Л» S « а * - X щ Ф в « Й 2 “ я е л £ ^2 = ф S о S Я Я 5 о S в влч « я я 5 я ._ 2 а а 5 ? 3«« в ф ф 5 а 2 я ’в в ® « 3 в ьГ2 ° & & £ в5 § С- и И «§ а а£н Групповая еди- ница А А А А А А Буквенно-цифровая А А А AJ А — Буквенная А А А — А — Внешняя десятичная А At — N — N Внутренняя десятич- ная; Двоичная; Внутренняя с пла- вающей точкой; Внешняя с плаваю- щей точкой А — — N — N М SPACE; ALL 'буквенный сим- вол' А А А — А — ZERO А А — А А N QUOTE А А — — — — HIGH-VALUES; LOW-VALUES; ALL~ 'буквенно-циф- ровой символ'; Единица отчета А А — — А — вод^ циФРов°й сим- А А — А А — А — +тт^Равнение буквенно-цифровых символов, N — сравнение чисел. +Допускается, если внешнее десятичное поле содержит целое число. Рис. 15.5. Возможные типы сравнений.
538 Гл. 15. Введение в Кобол Сравнение числовых значений является алгебраической опе- рацией. В случае нечисловых значений сравнение выпол- няется над двоичными изображениями данных, а именно форми- руется команда CLC, позволяющая сравнить битовую кон- фигурацию первого поля с битовой конфигурацией вто- рого. Если оказывается, что поля имеют неодинаковую длину, то нечисловые поля дополняются справа пробелами. На рис. 15.5 показаны возможные типы сравнений. 15.14. Пример программы На рис. 15.7 представлена программа на Коболе, обеспечи- вающая составление накладных по типу, который приведен на рис. 15.6. Информация о покупателе содержится на магнитной THE DEW DROP WAX PRODUCTS COMPANY INVOICE In account with AXZ CO. 26 SOUTH ST. NEW YORK, N. Y. Invoice No. 000008 Date 09/05/67 Account No. 0026 Qty. Item Description U Unit $ Extension 80 31 CASE 12-1 PT. ANTI-YELLOW WAX 13.00 1,01*0.08 1,500 43 DRUM 5 GALS. FLOOR SEALER 26.00 39,000.00 1,000 42 CASE 6-2 QTS. FLOOR SEALER 20.25 20,250.00 7,314 41 CASE 12-1 PT. FLOOR SEALER 14.00 102,396.00 187,621 12 CASE 6-2 QTS. WAX REMOVER 12.50 2,345,262.50 7 13 DRUM 5 GALS. WAX REMOVER 16.00 112.00 30£ DISCOUNT .752,418.15 TOTAL Terms: Net 10 days. $1,755,6U2.35 P и c. 15.6. Накладная. ленте в таком же формате, как и в случае программы, приведенной на рис. 15.1. Карты читаются после заполнения их необходимой информацией о купле — продаже (одна карта на сделку). Карты перфорируются следующим образом: колонка 1—4 Порядковый номер 41-48 Элемент 4 5-16 Порядковый номер 49-56 Элемент 5 приобретения 57—64 Элемент 6 17-24 Элемент 1 65-72 Элемент 7 25-32 Элемент 2 73-80 Элемент 8 33-40 Элемент 3
15.14. Пример программы 539 001010 IDENTIFICATION DIVISION. 00102'0 PROGRAM-ID. *CBL2*. 001030 AUTHOR. С. B. G. OOIOUO DATE-WRITTEN MARCH 1966. 001050 DATE-COMPILED AUGUST 1966. 001060 ENVIRONMENT DIVISION. 001070 INPUT-OUTPUT SECTION. 001080 FILE-CONTROL. 001090 SELECT C -ASSIGN TO 'SYS010* UNIT-RECORD 2540R. 001100 SELECT T ASSIGN TO 'SYS009* UTILITY 2400. 001110 SELECT M ASSIGN TO 'SYS008' UTILITY 2400. 001120 SELECT L ASSIGN TO 'SYS011* UNIT-RECORD 1403. 002010 DATA DIVISION. 002020 FILE SECTION. 002030 FD C DATA RECORDS ARE TRANSACT ION-F1LE, FIRST-CD, 002040 002050 01 LABEL RECORDS ARE OMITTED, RECORDING MODE IS F. FIRST-CD. 002060 002070 002080 002090 002100 002110 002120 01 02 DTE. 03 MN PICTURE XX. 03 DA PICTURE XX. 03 YR PICTURE XX. 02 INVOICE PICTURE 9(6>. 02 FILLER PICTURE X(68). TRANSACTION-FILE. 002130 002140 002150 002160 002165 002170 002180 002190 002200 FD 02 ACCOUNT PICTURE 9(4). 02 PURCHASE-ORDER-NO PICTURE X(12). 02 ITEMS OCCURS 8 TIMES. 03 QTY PICTURE S9C6). 03 QTYA REDEFINES QTY PICTURE X(6). 03 PRDT. 04 PROD PICTURE 9. 04 SIZE PICTURE 9. T DATA RECORD IS MASTER-IN, 002210 002220 01 LABEL RECORDS ARE OMITTED, RECORDING MODE IS F. MASTER-IN. 002230 002240 002250 002260 002270 002280 002290 002300 02 PRICE-CLASS PICTURE S9, COMPUTATIONAL. 02 ACCT PICTURE 9(4). 02 CUST-NAME PICTURE X(35).- 02 ADDR-LINE-1 PICTURE X(35). 02 ADDR-LINE-2 PICTURE X(35). 02 ADDR-LINE-3 PICTURE X(35). 02 DATE-LAST-PURCHASE PICTURE X(6). 02 ACCT-BALANCE PICTURE S9(7)V99, COMPUTATIONAL-3 002310 002320 FD 02 FILLER PICTURE•X(3). M DATA RECORD IS MASTER-OUT, 002330 002340 01 LABEL RECORDS ARE OMITTED, RECORDING MODE IS F. MASTER-OUT PICTURE X(160). 002350 FD L DATA RECORD IS LIST, 002360 002370 01 LABEL RECORDS ARE OMITTED, RECORDING MODE IS F. LIST PICTURE X(66). оозою WORKING-STORAGE SECTION. 003020 77 J PICTURE S9 COMPUTATIONAL. 003030 77 К PICTURE $9 COMPUTATIONAL. 003040 77 KK PICTURE S9 COMPUTATIONAL. 003050 77 FGC PICTURE 9 VALUE 0. P и c. 15.7. Программа составления накладной (часть 1).
540 Гл, 15, Введение в Кобол 003060 77 INVOICE-NUMBER PICTURE 9(6). 003070 77 NET PICTURE S9(7)V99, COMPUTATIONAL-3 003080 77 DISCOUNT PICTURE S9(7)V99, COMPUTATIONAL-3 003090 77 EXTENSION PICTURE S9(7)V99, COMPUTATIONAL-3 003100 77 SP PICTURE X. 003110 77 CURRENT-DATE PICTURE X(6). 004010 01 HEADING. 004020 02 FILLER PICTURE X. 004030 02 FILLER PICTURE X(4), VALUE SPACES. 004040 02 ADDR PICTURE X(35). 004050 02 FILLER PICTURE X(14) VALUE SPACES. 004060 (J 2 ABCDE PICTURE X(12) JUSTIFIED RIGHT. 004070 01 LINE-ITEMS. 004080 02 FILLER PICTURE X. 004090 02 QUAN PICTURE ZZZ/ZZ9. 004100 02 FILLER PICTURE XX/ VALUE SPACES. 004110 02 ITEM. 004120 03 ITEMN PICTURE 99. 004125 02 FILLER PICTURE XX/ VALUE SPACES. i 004130 02 SIZE-DESCR PICTURE X(15). 004140 02 PROD-DESCR PICTURE X(15). 004150 02 UNIT-PRICE PICTURE BBZZZ.99. 004160 02 EXTENDED-PRICE PICTURE BBZ,ZZZ/ZZZ.99. 004170 01 DISCOUNT-LINE. 004180 02 FILLER PICTURE X(17) VALUE SPACES. 004190 02 DISC-PER-CENT PICTURE ZZ. 004200 02 FILLER PICTURE X(10) VALUE DISCOUNT1. 004210 02 FILLER PICTURE X(25) VALUE SPACES. 004220 02 DISC-AMT PICTURE Z,ZZZ,ZZZ.ZZ. 004230 01 TOTAL-LINE. 004240 02 FILLER PICTURE X(53) VALUE SPACES. 004250 02 NETS PICTURE H/MI/$$0.99. 004260 01 SIZE-NAMES. 004270 02 FILLER PICTURE XC15) VALUE 'CASE 12-1 PT. ’. 004280 02 FILLER PICTURE X(15) VALUE •CASE 6-2 QTS. *. 004290 02 FILLER PICTURE X(15) VALUE 'DRUM 5 GALS. '. 004300 01 FILLER REDEFINES SIZE-NAMES. 004310 02 SZE OCCURS 2 1 TIMES PICTURE X(15). 004320 01 PRODUCT-NAMES. 004330 02 FILLER PICTURE XC15) VALUE 'WAX REMOVER 004340 02 FILLER PICTURE XC15) VALUE 'NON-SLIP WAX 004350 02 FILLER PICTURE X(15) VALUE 'ANTI-YELLOW WAX'. 004360 02 FILLER PICTURE X(15) VALUE 'FLOOR SEALER 004370 01 FILLER REDEFINES PRODUCT-NAMES. 004380 02 PRO OCCURS A TIMES PICTURE X(15). 004390 01 PRICE-FILE. 004400 02 FILLER PICTURE 999V99 COMPUTATIONAL-3 VALUE 9.00. 004410 02 FILLER PICTURE 999V99 COMPUTATIONAL-3 VALUE 12.50. 004420 02 FILLER PICTURE 999V99 COMPUTATIONAL-3 VALUE 16.00. 004430 02 FILLER PICTURE 999V99 COMPUTATIONAL-3 VALUE 10.00. 004440 02 FILLER PICTURE 999V99 COMPUTATIONAL-3 VALUE 14.00. 004450 02 FILLER PICTURE 999V99 COMPUTATIONAL-3 VALUE 18.00. 004460 02 FILLER PICTURE 999V99 COMPUTATIONAL-3 VALUE 13.00. 004470 02 FILLER PICTURE 999V99 COMPUTATIONAL-3 VALUE 18.75. 004480 02 FILLER PICTURE 999V99 COMPUTATIONAL-3 VALUE 24.00. Рис, 15,7, Программа составления накладной (часть 2),
15.14. Пример программы 541 004490 02 FILLER PICTURE 999V99 COMPUTATIONAL-} VALUE 14.00. 004500 004510 004520 01 02 FILLER PICTURE 999V99 COMPUTATIONAL-3 VALUE 20.25. 02 FILLER PICTURE 999V99 COMPUTATIONAL-} VALUE 26.00. FILLER REDEFINES PRICE-FILE. 004530* 004540 Q04550 01 02 FILLER OCCURS 4 TIMES. 4? PRICE. OCCURS } TIMES PICTURE 999V99 COMPUTATIONAL-}. INVOICE-DATE. 004560 004570 004580 004590 004600 004610 01 02 MM PICTURE XX. 02 FILLER PICTURE X VALUE ’/'. 02 DD PICTURE XX. 02 FILLER PICTURE X VALUE 02 YY PICTURE.XX. DISCOUNT-PERCENTS. 004620 004630 004640 004650 004660 01 02 FILLER VALUE .00 COMPUTATIONAL-} PICTURE SV99. 02 FILLER VALUE .30 COMPUTATIONAL-} PICTURE SV99.' 02 FILLER VALUE .08 COMPUTATIONAL-} PICTURE SV99. 02 FILLER VALUE .25 COMPUTATIONAL-} PICTURE SV99. FILLER REDEFINES DISCOUNT-PERCENTS. 004670 02 DISC OCCURS 4 TIMES COMPUTATIONAL-} PICTURE SV99. 005010 PROCEDURE DIVISION. 005020 Pl. OPEN INPUT С, T, OUTPUT L,M. 005030 •005040 005050 005060 005070 P2. READ C, AT END GO TO Pll. MOVE DTE TO CURRENT-DATE. MOVE INVOICE TO INVOICE-NUMBER. MOVE MN TO MM; MOVE DA TO DD; MOVE YR TO YY. IF FGC NOT « ZERO/ GO TO P}. 005080 005090 005100 P3. MOVE 1 TO FGC. READ C, AT END MOVE 2 TO FGC, MOVE 9999 TO ACCOUNT. READ T, AT END GO TO Pl}. 005110 005120 P13 GO TO P5. . IF FGC = 2/ GO TO P12. 005130 P4. DISPLAY 'NO ACCOUNT NO. ACCOUNT UPON CONSOLE. 005140 005150 005160 P5. READ C, AT END GO TO P12. GO ТС P4. IF ACCT > ACCOUNT, GO TO P7. 005170 005175 005180 005190 005200 005210 005220 005230 005240 005250 005260 005270 005280 005290 P6. IF ACCT < ACCOUNT, GO TO P8. MOVE ZERO TO FGC. MOVE CUST-NAME TO ADDR; MOVE INVOICE-NUMBER TO ABCOE. WRITE LIST FROM HEADING AFTER 0. MOVE ADDR-LINE-1 TO ADDR; MOVE INVOICE-DATE TO ABCDE. WRITE LIST FROM HEADING AFTER 1. MOVE ADDR-LINE-2 TO ADDR; MOVE ACCOUNT TO ABCDE. WRITE LIST FROM HEADING AFTER 1. MOVE ADDR-LINE-} TO ADDR; MOVE PURCHASE-ORDER-NO TO ABCDE. WRITE LIST FROM HEADING AFTER 1. ADD 1 TO INVOICE-NUMBER. MOVE CURRENT-DATE TO DATE-LAST-PURCHASE. MOVE 8 TO J; MOVE 2 TO SP; MOVE ZERO TO NET. IF QTYA (J) SPACES, GO TO P9. 005300 005310 005320 005330 005340 005345 MOVE QTY (J) TO QUAN, MOVE PRDT (J) TO ITEM. MOVE PROD (J) TO K, MOVE PRO (K) TO PROD-DESCR. MOVE SIZE (J) TO KK, MOVE SZE (KK) TO SIZE-DESCR. MOVE PRICE (K,KK) TO UNIT-PRICE. MULTIPLY PRICE (K,KK) BY QTY (J) GIVING EXTENSION. MOVE EXTENSION TO EXTENDED-PRICE. I Рис. 15.7. Программа составления накладной (часть 3).
542 Гл. 15. Введение в Кобол 005350 ADO EXTENSION ТО NET. 005360 WRITE LIST FROM LINE-ITEMS AFTER SP. 005370 MOVE SPACE TO SP. 005380 GO TO P9. 005390 Р7. DISPLAY ’NO ACCOUNT NO. *, ACCOUNT UPON CONSOLE. 005400 READ C, AT ENO MOVE 2 TO FGC, MOVE 9999 TO ACCOUNT. 005410 GO TO P5. 005420 Р9. SUBTRACT 1 FROM J. 005430 IF J NOT « ZERO, GO TO P6. 005440 IF DISC (PRICE-CLASS) • ZERO, GO TO P10. 005450 MULTIPLY DISC (PRICE-CLASS) BY 100 GIVING DISC-PER-CENT. 005460 COMPUTE DISCOUNT « DISC (PRICE-CLASS) • NET. 005470 SUBTRACT DISCOUNT FROM NET. 005475 MOVE DISCOUNT TO DISC-AMT. 005480 WRITE LIST FROM DISCOUNT-LINE AFTER 2. 005490 РЮ . MOVE 3 TO SP; MOVE NET TO NETS. 005500 WRITE LIST FROM TOTAL-LINE AFTER SP. 005510 Р8. WRITE MASTER-OUT FROM MASTER-IN. 005520 GO TO P2. 005530 Р11 . DISPLAY 'NO DATE CARD' UPON CONSOLE. 005540 Р12 . CLOSE С T L M. 005550 STOP RUN. Рис. 15.7. Программа составления накладной (часть 4). Поле каждого элемента состоит из трех подполей: 6 кол. количество 1 кол. код изделия 1 кол. код размера Как можно видеть из Раздела данных программы, имеется четыре изделия, каждое из которых может иметь три размера. Определены четыре файла: С — карточный входной файл, Т — ленточный входной файл, М — ленточный выходной файл с внесенными коррективами и L — файл печатающего устройства. В секции рабочей памяти имеются несколько полей, имена кото- рых определяют их использование. FGC используется как инди- катор. Если FGC == 0, обработка карты в оперативной памяти уже закончена и должна быть прочитана новая карта. Если FGC = 1, то карта в оперативной памяти еще не обработана. Если FGC — 2, то закончена обработка последней карты. Пере- менная J используется в качестве индекса для перебора 8 воз- можных элементов на каждой входной карте. Поле SP содер-, жит символ, управляющий переводом строк при печати. Строки, выводимые на печать, формируются в рабочей памяти; при этом возможны четыре различных вида строк: для записи заголовка, данных об изделии, скидки (discount) и итога. Строка со скидкой не печатается, если скидка не предусматривается.
15.14. Пример программы 543 Обратите внимание на то, каким образом заполняется таблица цен и описаний. В Разделе процедур параграфам даны имена, которые начи- наются с буквы Р. Имена секций не используются. Упражнения Л? 39 1. Программа, приведенная в разд. 15.2, обеспечивает созда- ние ленточного файла, а программа из разд. 15.14 — печать накладных и коррекцию ленточного файла. Составить программу, которая предусматривала бы: (а) внесение добавлений на ленту и (Ь) регистрацию счетов по платежам с неподведенным балансом. Пусть карты перфорируются так же, как это делается в случае программы из разд. 15.2. Если производится вклад, то колонка 5 первой карты содержит 1, 2, 3 или 4, а колонка 5 второй карты содержит 8. Если производится выплата, то в колонке 5 содер- жится цифра 9, а суммы перфорируются в колонках 6—15 в шаб- лоне 9(7)V99. Входные карты упорядочены по номеру счета, кото- рый пробивается во всех картах в колонках 1—4. Программа должна обеспечить чтение этих карт и старой магнитной ленты и создание новой ленты с новыми сведениями о балансах и с новы- ми записями. 2. Используя ленточный файл разд. 15.14, написать программу которая могла бы выполняться ежемесячно, обеспечивая получе- ние ежемесячного отчета. В отчете должна быть проставлена дата (08/01/67), имя и адрес покупателя, а также номер покупа- теля и соответствующие сведения о балансе. После балансных данных предусмотреть печать CR, если покупатель переплачивает. В том случае, если покупатель недоплачивает, печать отчета не нужна. Текущую дату взять из карты, вводимой в начале программы. 3. Изменить программу, составленную в соответствии с усло- виями упр. 1, таким образом, чтобы при обработке карты с циф- рой 7 в колонке 5 соответствующий счет был стерт с ленты. Каж- дый раз при стирании счета печатать содержимое ленты для воз- можных будущих обращений. 4. Запрограммировать на Коболе упр. 31.2. 5. Запрограммировать на Коболе упр. 31.4, считая, что файл с картами первого типа хранится на ленте.
Глава 16 ДОПОЛНИТЕЛЬНЫЕ СВЕДЕНИЯ О КОБОЛЕ 16.1., Проверка условий В разд. 15.13 мы видели, что условия проверки отношения или сравнения записываются в форме выражение! IS [NOT] отношение выражение2 где шестью допустимыми отношениями являются GREATER [THAN], LESS [THAN], EQUAL TO, >, < и = . Возможны два типа сравнений: числовые и логические. О числовом сравне- нии говорят в том случае, когда оба выражения являются чис- ловыми; в противном случае речь идет о логическом Сравнении. Существуют также три других типа проверяемых условий \Форма проверки знака такова: ИМЯ-ДЗН.ЫХ J IS (N0T| арифметическое-выражение J ------- POSITIVE ZERO NEGATIVE Объект проверки должен быть числовым. Проверка класса записывается следующим образом: _ (NUMERIC имя-данных IS INOT1 !ALpHABETIC Проверяемые данные должны иметь буквенно-цифровой шаб- лон, т. е. в шаблоне допускается использование только буквы X. Поскольку обычно знак числа перфорируется в разряде единиц числового поля, буквы от А по R включительно рассматриваются и как цифровые и как буквенные символы в разряде единиц поля. Поэтому мы имеем результаты проверки класса (Т = TRUE — ис- тинно, F = FALSE — ложно), представленные на рис. 16.1. Проверка условной переменной задается в форме [NOT] условная-переменная Имя условной переменной присваивается программистом. Это присвоение может быть сделано двумя способами: с помощью
16.1. Проверка условий 545 конструкции APPLY в Разделе оборудования (ем.1 разд. 16.11) и с использованием уровня 88 в Разделе данных. Элемент с уровнем 88 может записываться после описания некоторой эле- ментарной единицы данных или же после другого элемента с уровнем 88. Укажем форму 88 условная-переменная VALUE IS литерал Элемент с уровнем 88 — это единственный случай, когда слово VALUE может быть использовано в Секции файлов Раздела данных. Условная переменная получает значение TRUE (ИСТИНА), Имя единицы Цифровое Буквенное Нецифровое Небуквенное данных 2345 Т F F Т 234J Т F F Т PU8Y F F Т Т 234S F F Т т R341 F F Т Т 7 Т F F Т Е Т Т F F S F Т Т F ——- F F Т Т ABCD F Т Т F Рис. 16.1. Результаты проверки класса. если соответствующая элементарная единица данных имеет значение, указанное значением литерала; в противном случае условная переменная получает значение FALSE (ЛОЖЬ), например 02 MONTH PICTURE 99. 88 JANUARY VALUE IS 1. 88 FEBRUARY VALUE IS 2. 88 DECEMBER VALUE IS 12. Далеко не все возможные значения элементарной единицы данных должны быть определены на уровне 88. В нашем примере, если MONTH = 03, то оператор IF FEBRUARY ADD PREV-BAL TO AMT GIVING NEW-BAL. (ЕСЛИ ФЕВРАЛЬ СЛОЖИТЬ ПРЕДЫДУЩИЙ-БАЛАНС С ДЕНЕЖНОЙ-СУММОЙ ПОЛУЧАЯ НОВЫЙ-БАЛАНС) не произведет никаких действий. Однако если MONTH = 2, то сложение будет выполнено. Обратите внимание на то, что провер- ка условной переменной всегда может быть заменена сравнения- ми элементарной единицы данных. Поэтому запись IF FEBRUARY ADD . . . 35 Зак. 15635
546 ________Гл. 16. Дополнительные сведения о Коболе_ эквивалентна такой: IF MONTH = 2 ADD . . . Условия могут быть записаны в более сложной форме, скажем так: [NOT] [(]условие (ттлтЛ 1(1 [NOT] [(] условие [)]... . . . условие [)) где условия разделяются связками AND (И) или OR (ИЛИ) Приведем примеры: IF FEBRUARY OR JANUARY OR DECEMBER ADD A TO B. IF MONTH GREATER THAN 6 OR (AMT = ZERO AND CDE = 3) ADD 17 TO WQY. Во втором примере сложение будет выполняться в том случае^, если MONTH больше 6 или же если MONTH меньше или равен 6, но при этом АМТ = 0, a CDE — 3. • В операторе IF MONTH = 2 OR MONTH = 3 OR MONTH = 12 ADD A TO В предусмотрены три отдельных условия. В Коболе уровня F напи- сание слова MONTH можно исключить во всех условиях, кроме первого. Тогда справедлива запись этого оператора в следующем виде: IF MONTH = 2 OR = 3 OR = 12 ADD A TO B. В этом случае можно сказать, что сравниваемая единица данных подразумевается. Можно пойти дальше и считать, что если подра- зумевается сравниваемая единица данных, то может также под- разумеваться и знак операции отношения. Тогда оператор при- нимает такой вид: IF MONTH = 2 OR 3 OR 12 ADD . . . Операция сравнения может подразумеваться только в том случае, если также подразумевается сравниваемая единица дан- ных. Эти небольшие сокращения в форме записи допустимы только в Коболе уровня F. Использование указанных сокращений позво- ляет более экономно записывать программу, однако начинающему программисту при составлении своих первых программ целе- сообразнее записывать все полностью. Оператор IF имеет форму IF условие оператор . . . ELSE оператор . . .
16.2. Уточнение имен 547 Операторы, входящие как составные части в оператор IF, сами могут быть операторами IF. Поэтому, например, можно записать следующее: IF JANUARY THEN IF А > В GO ТО Р18 ELSE ADD 17 TO AMT, GO TO P17, ELSE MOVE ZERO TO AMT Запись слова THEN улучшает читабельность условия, но ком- пилятором оно во внимание не принимается. В составном операторе IF каждое слово ELSE образует пару с предшествующим IF. Если слов IF оказывается больше, чем слов ELSE, то компилятор формирует слова ELSE NEXT SENTENCE, благодаря чему между словами IF и ELSE устанавливается парное соответствие. В приведенном выше примере мы имеем такие возможности: JANUARY Операция Да Да GO ТО Р18. Да Нет ADD 17 ТО АМТ, Нет Да MOVE 0 ТО АМТ. Нет Нет MOVE 0 ТО АМТ. GO ТО Р17. Составные операторы IF могут быть очень сложными. При необходимости проверки правильности составления оператора IF начинающий программист не должен полагаться на простое чте- ние оператора. Он обязан помнить, что тщательный анализ каж- дого составного условного оператора крайне полезен и позво- ляет сэкономить большое количество времени при отладке про- граммы. 16Г.2. Уточнение имен Предположим, что в Разделе данных записан следующий фраг- мент программы: 01 CUSTOMER-ACCOUNT. 02 NAME-ADDR PICTURE Х(80). 02 ACCT-BAL PICTURE S9(5)V99. 02 AMT-LAST-PURCHASE PICTURE S9(5)V99. 02 DATE-LAST-PURCHASE PICTURE X(5). 02 TOTAL-SALES PICTURE S9(5)V99. 01 CURRENT-TRANSACTION. 02 NAME-ADDR PICTURE X(80). 02 AMT-LAST-PURCHASE PICTURE S9(5)V99. 02 DATE-LAST-PURCHASE PICTURE X(5). 02 AMT-PAID PICTURE S9(5)V99. 35*
548 Гл. 16. Дополнительные сведения о Коболе (01 СЧЕТ-ПОКУПАТЕЛЯ 02 ИМЯ-АДРЕС ШАБЛОН Х(80) 02 СЧЕТ-БАЛАНС ШАБЛОН S9(5)V99. 02 СУММА-ПОСЛЕДНЕЙ-ПОКУПКИ ШАБЛОН S,9(5)V99. 02 ДАТА-ПОСЛЕДНЕЙ-ПОКУПКИ ШАБЛОН Х(5). 02 ОБЩАЯ-СУММА-ПРОДАЖ ШАБЛОН S9(5)V99. 01 ТЕКУЩИЕ-СДЕЛКИ. 02 ИМЯ-АДРЕС ШАБЛОН Х(80). 02 СУММА-ПОСЛЕДНЕЙ-ПОКУПКИ ШАБЛОН S9(5)V99. 02 ДАТА-ПОСЛЕДНЕЙ-ПОКУПКИ ШАБЛОН Х(5). 02 СУММА-ОПЛАТЫ ШАБЛОН S9(5)V99.) В Разделе процедур нам хотелось бы заменить поля AMT-LAST-PURCHASE и DATE-LAST-PURCHASE в записи CUSTOMER-ACCOUNT на текущие значения, взятые из записи с именем CURRENT-TRANSACTION. Нам также было бы жела- тельно сложить ACCT-BAL с AMT-LAST-PURCHASE и вычесть AMT-PAID. В приведенном фрагменте программы двум полям, входящим в различные записи, присвоено одинаковое имя (AMT-LAST- PURCHASE). Это допускается в Коболе, но при этом предпола- гается, что каждое обращение к имени уточняется, т. е. записы- вается в виде AMT-LAST-PURCHASE IN’ CUSTOMER-ACCOUNT, с добавлением слова IN (В) или OF (ИЗ), за которым следует имя данных более высокого уровня. В нашем примере для выполнения указанных операций можно было бы воспользоваться следую- щими операторами: COMPUTE ACCT-BAL-ACCT-BAL + AMT-LAST- PURCHASE IN CURRENT-TRANSACTION - AMT- PAID. MOVE AMT-LAST-PURCHASE IN CUSTOMER-TRANSACTION TO AMT-LAST-PURCHASE OF CUSTOMER-ACCOUNT. MOVE DATE-LAST- PURCHASE OF CURRENT-TRANSACTION TO DATE-LAST-PURCHASE IN CUSTOMER-ACCOUNT. (ВЫЧИСЛИТЬ СЧЕТ-БАЛАНС = СЧЕТ-БАЛАНС + + СУММА-ПОСЛЕДНЕЙ-ПОКУПКИ В ТЕКУЩИХ- СДЕЛКАХ — СУММА-ОПЛАТЫ. ПЕРЕМЕ- СТИТЬ СУММУ-ПОСЛЕДНЕЙ-ПОКУПКИ В ТЕКУ- ЩИХ-СДЕЛКАХ В СУММУ-ПОСЛЕДНЕЙ-ПОКУПКИ ИЗ СЧЕТА-ПОКУПАТЕЛЯ. ПЕРЕМЕСТИТЬ ДАТУ- ПОСЛЕДНЕЙ-ПОКУПКИ ИЗ ТЕКУЩИХ-СДЕЛОК В ДАТУ-ПОСЛЕДНЕЙ-ПОКУПКИ В СЧЕТЕ- ПОКУПАТЕЛЯ.)
16.3. Операторы PERFORM 549 Включение в программу составных имен, т. е. имен с уточне- ниями, может ее удлинить, но иногда спасает от необходимости переопределения файла, который ранее использовался в какой- нибудь другой программе. • В Коболе уровня F допускаются три операторша, которые упрощают работу с составными именами: MOVE CORRESPONDING ADD CORRESPONDING SUBTRACT CORRESPONDING Все эти операторы записываются точно так же, как и обычные операторы MOVE, ADD и SUBTRACT. Слово CORRESPONDING (СООТВЕТСТВЕННО) обеспечивает перемещение, сложение или вычитание тех элементарных единиц данных, которые имеют оди- наковые (несоставные) имена. На другие же единицы данных из нашего примера, такие, как AMT-PAID и TOTAL-SALES, операторы этого типа не действуют. Для данных, описанных в нашем примере, один оператор MOVE CORRESPONDING CURRENT-TRANSACTION ТО CUSTOMER-ACCOUNT в объектной программе был бы эквивалентен трем обычным командам MOVE: двум, которыми мы уже воспользовались в своем примере, и одной — для полей NAME-ADDR. Условие ON SIZE ERROR будет фиксироваться при возникновении ошибки размера хотя бы для одного складываемого или вычитаемого поля. Ука- зание ROUNDED будет относиться ко всем полям. Использованные в операторе CORRESPONDING имена долж- ны быть именами групповых данных, участвующие же в операциях элементарные единицы должны быть числовыми в случае сложе- ния или вычитания и должны удовлетворять требованиям, предъ- являемым к данным обычным оператором MOVE в случае опе- ратора MOVE CORRESPONDING. При уточнении имени данных следует помнить о том, что это можно сделать с помощью любого имени данных более высокого Уровня, но только так, чтобы при этом не возникло неоднознач- ности. ^6.3. Операторы PERFORM Начнем с оператора EXIT. (ВЫЙТИ)
§50 Гл. 16. Дополнительные сведения о Коболе который может оказаться единственным оператором в параг- рафе. Тогда соответствующему параграфу обязательно дается имя. Обычно данный оператор используется как последний опе- ратор в секции или группе параграфов, выполняемых под управ- лением оператора PERFORM (ВЫПОЛНИТЬ). При применении в любом другом месте программы оператор EXIT эквивалентен пустому оператору. Оператор PERFORM записывается в различных формах. Простейшая из них PERFORM процедура! [THRU процедура^ где процедура есть либо имя параграфа, либо имя секции. Управление передается на первый оператор в процедуре!, и программа выполняется обычным образом, пока не будет выполнен последний оператор в процедуре2, после чего управление возвращается оператору, который следует сразу же за оператором PERFORM. Если конструкция THRU не записана, компилятор предполагает, что процедура2 = процедура!. Работа группы операторов, вызванных оператором PERFORM, должна закончиться выполнением последнего оператора в процедуре^ В случае необходимости можно воспользоваться параграфом с оператором EXIT. В целях иллюстрации предположим, что N, X, Y и ERROR определены как единицы данных типа COMPUTATIONAL-1. Следующие операторы вычисляют значения квадратного корня из N и помещают результат в Y: SQRT SECTION. SQRT1. MOVE 1 TO X. SQRT2. COMPUTE Y = .5*X + N/(2*X). IF X > Y THEN COMPUTE ERROR = X - Y, ELSE COMPUTE ERROR = Y — X. IF ERROR >.005, MOVE Y TO X, GO TO SQRT2. (СЕКЦИЯ КОРЕНЬ. КОРЕНЫ. ПЕРЕМЕСТИТЬ 1 В X. КОРЕНЬ2. ВЫЧИСЛИТЬ Y = .5*Х + N/(2*X). ЕСЛИ X > Y ТО ВЫЧИСЛИТЬ ОШИБКУ = X - Y, ИНАЧЕ ВЫЧИСЛИТЬ ОШИБКУ = Y - X. ЕСЛИ ОШИБКА >.005, ПЕРЕМЕСТИТЬ Y В X, ПЕРЕЙТИ К КОРЕНБ2.) В том случае, если требуется вычислить значение квадрат- ного корня из Wl, W2 и W3, можно воспользоваться следующими операторами: MOVE Wl ТО N. PERFORM SQRT; MOVE Y TO WSQRT1.
16.3. Операторы PERFORM 551 MOVE W2 TO N. PERFORM SQRT. MOVE Y TO WSQRT2. MOVE W3 TO N. PERFORM SQRT. MOVE Y TO WSQRT3. Вычисленные значения квадратного корня будут помещены в WSQRT1, WSQRT2 и WSQRT3 Вторая форма оператора PERFORM такова: PERFORM процедура! [THRU процедура2) [ целое. | TIMES. I имя-данных J ----- где целое должно быть положительным и меньше 32768. При использовании имени данных оно должно иметь значение, кото- рое положительно и меньше 32768; в противном случае оператор PERFORM выполнен не будет. Указанные в операторе процедуры выполняются указанное число раз. Типичным приме- ром может служить сложение последовательностей чисел. Пусть Т определяется как 03 Т OCCURS 46 TIMES PICTURE S999. Если J определено в виде 77 J PICTURE S99 COMPUTATIONAL. то можно записать SUMMS. ADD T(J) ТО SUM, ADD 1 ТО J. Где-то в программе можно предусмотреть операторы: MOVE ZERO ТО SUM. MOVE 1 ТО J. PERFORM SUMMS 46 TIMES. MOVE SUM TO SUM-OF-T. я сумма 46 значений T окажется в SUM-OF-T. Теперь укажем третью форму оператора PERFORM: PERFORM процедура! [THRU процедура21 UNTIL условие В операторе PERFORM этого типа после выполнения процедур производится проверка условия, которое может быть составным. Если условие истинно, управление передается на оператор, следующий за оператором PERFORM; если условие ложно, процедуры выполняются еще раз. Далее производится повторная проверка условия и, пока оно ложно, процедуры выпол- няются снова и снова. Например, оператор PERFORM SUMMS UNTIL J > 46. был бы эквивалентен приведенному выше оператору PERFORM SUMMS 46 TIMES.
552 Гл. 16. Дополнительные сведения о Коболе Четвертая форма оператора PERFORM такова: PERFORM процедура! [THRU процедура2] VARYING имя-данных 1 FROM et BY е2 UNTIL условие, ' AFTER имя-данных2 FROM es BY 64 UNTIL' условие2 [AFTER имя-Данных8 FROM e5 BY ee UNTIL условие3] Проверяемые условия могут быть составными или простыми. Под et понимаются числовые литералы или имена цифровых данных. В процессе выполнения оператора PERFORM производится проверка условия!. Если условие истинно, управление передается оператору; следующему за оператором PERFORM. Если условие ложно, то процедуры выполняются при имя-данных 1 = еь ei 4- + е2» ei 2е2 и т. д. После каждого выполнения проверяется условие!. Как только оно становится истинным, управление пере- дается оператору, следующему за оператором PERFORM. Если записана конструкция AFTER, то после того, как имя-данных, устанавливается равным ei, проверяется условие2. Если оно ложно, то процедуры выполняются при имя-данных2 = е3, е3 4- + 64, е3 -|- 2е4 и т. д. После каждого выполнения проверяете? условие2. Как только оно оказывается истинным, имя-данных, получает приращение е2 и проверяется условие!. Цикл повто- ряется до тех пор, пока еще раз не станет истинным условие2. после чего имя-данных i снова получает приращение. В случае записи двух конструкций AFTER наибольшая частота изменений относится к внутренней (т. е. к той, которая записана последней) Если мы определяем 77 I COMPUTATIONAL PICTURE S9. 77 J COMPUTATIONAL PICTURE S9. 77 К COMPUTATIONAL PICTURE S9. 77 SM PICTURE S99999. 01 FILLER. 02 FILLER OCCURS 2 TIMES. 03 FILLER OCCURS 3 TIMES. 04 Q OCCURS 2 TIMES PICTURE S99. то использование операторов MOVE ZERO TO SM. PERFORM S VARYING I FROM 1 UNTIL I > 2 AFTER J FROM 3 BY - 1 UNTIL J < 0 AFTER К FROM 1 BY 1 UNTIL К > 2.
16.4 Дополнительные операторы Раздела процедур 553 где S. ADD Q (L J, К) ТО SM. обеспечит сложение элементов Q с SM в следующем порядке (читать по строкам): Q (1, 3, 1); Q (1, 3, 2); Q (1, 2, 1); Q (1, 2, 2); Q (1, 1, 1); Q (1, 1, 2); Q (2, 3, 1); Q (2, 3, 2); Q (2, 2, 1); Q (2, 2, 2); Q (2, 1, 1); Q (2, 1, 2) Вызов процедур с помощью оператора PERFORM не может служить причиной, по которой она не могла бы выполняться при нормальном ходе выполнения программы от параграфа к параграфу. По этой причине процедуры, вызываемые оператором PERFORM, обычно выписываются вне нормально выполняемого по- тока команд. Процедура, вызываемая оператором PERFORM, может включать в себя другие операторы PERFORM. Единствен- ное требование заключается в том, что конец одной совокупности вызванных операторов не может находиться посредине области действия другого оператора PERFORM, и эти операторы должны заканчиваться в порядке, обратном их заданию. Две процедуры могут заканчиваться в одном и том же месте. Поэтому можно записать PERFORM A THRU С. A. PERFORM В THRU С. В. . * * С. . . . D. . . . Однако А не может включать в себя оператор PERFORM В THRU D. поскольку в этом случае вызываемая последовательность операто- ров включала бы конечную точку оператора PERFORM А THRU С. 16 .4. Дополнительные операторы Раздела процедур Оператор GO ТО (ПЕРЕЙТИ К) имеет форму GO ТО имя-процедуры агт С этим оператором GO ТО может использоваться оператор AJjTER (ИЗМЕНИТЬ), что позволяет изменить то место в про- грамме, на которое передает управление оператор GO ТО. Подле- аЩий модификации оператор GO ТО должен представлять собой
554 Гл. 16. Дополнительные сведения о Коболе отдельный параграф, состоящий только из одного предложения. Форма оператора ALTER такова: ALTER имя-процедурыи ТО PROCEED ТО имя-проце- ДУРЫ2 . • - С помощью одного оператора ALTER может быть изменено любое необходимое количество операторов GO ТО. Рассмотрим пример Pl. GO ТО Р7. РЗ.’ GO ТО Р8. Р7. . . . Р8. . . . ALTER Pl ТО PROCEED ТО Р8, РЗ ТО PROCEED ТО Р7. После выполнения этого оператора ALTER программа будет выполняться так, как если бы было записано Pl. GO ТО Р8. РЗ. GO ТО Р7. Вместе с тем существует другая форма оператора GO ТО, которая не может быть модифицирована путем применения опера- тора ALTER, а именно GO ТО процедура! 1процедура2 . . .] DEPENDING ON имя-данных Здесь имя-данных — переменная, принимающая положительные целые значения. Если имя-данных = 1, управление передается на процедуру!; если имя-данных = 2, управление передается на процедуру2, и т. д. Если оказывается, что значение пере- менной больше, чем количество имен процедур в операторе, или же если переменная равна нулю или отрицательна, управление передается следующему оператору. Например, оператор GO ТО Р7, Р8, РЗ DEPENDING ON К. обеспечивает передачу управления на Р7, если К = 1, на Р8, бели К = 2, на РЗ, если К — 3; при других значениях К управ- ление передается оператору, следующему за GO ТО. Оператор EXAMINE (ПРОСМОТРЕТЬ) используется в двух формах ALL EXAMINE имя-данных TALLYING LEADING UNTIL FIRST С| (REPLACING BY c2]
16.4. Дополнительные операторы Раадела процедур 555 и EXAMINE имя-данных REPLACING ALL LEADING UNTIL FIRST FIRST BY С2 где Ci и с2 суть односимвольные нечисловые литералы (т. е. заключенные в кавычки) или, быть может, фигуральные кон- станты. И Ci и с2 должны быть символами, разрешенными в Коболе для единицы данных, заданной именем-данных. Имя-данных должно задавать единицу данных типа DISPLAY. Например, если шаблоном имени данных является 9(5), то в качестве Ci или с2 нельзя использовать ни букву, ни специальный символ. В случае применения формы с TALLYING осуществляет- ся подсчет числа вхождений Ci в поле данных, и этот резуль- тат помещается в специальное поле данных TALLY (СЧЕТЧИК), размером в пять десятичных цифр. Слово TALLY может исполь- зоваться в других операторах в качестве имени-данных. Если указано ALL, то подсчитывается общее число символов ci; если указано слово LEADING, то производится подсчет числа сим- волов ci, встречающихся начиная с левой границы поля и до пер- вого символа, который не является символом Ci; при указании альтернативы UNTIL FIRST осуществляется подсчет числа дру- гих символов, встречающихся до появления первого символа щ. Когда оператор записывается с REPLACING, тогда (1) по аль- тернативе ALL символ с2 подставляется на место каждого с2, имеющегося в поле данных; (2) по альтернативе LEADING под- становка символа с2 вместо Ci заканчивается при первом появле- нии символа, отличного от ct, или (если символ не встретился) при достижении конца поля; (3) по альтернативе UNTIL FIRST символ с2 подставляется вместо каждого символа до первого символа Ci или (если символ ct не появляется) до конца поля; (4) по альтернативе FIRST только первый символ Ci заменяется символом с2. Рассмотрим пример. Пусть поле данных А содержит DDL7D. Тогда при выполнении оператора EXAMINE A TALLYING ALL 'D' окажется, что TALLY=3. В случае оператора вида EXAMINE A TALLYING UNTIL FIRST 'D' получим TALLY = 0. В результате выполнения оператора EXAMINE A REPLACING ALL'D' BY 'Е' поле данных А будет содержать EEL7E. Выполне- ние оператора EXAMINE A REPLACING FIRST 'D' BY 'E' приводит к изменению содержания поля данных А на EDL7D.
556 Гл. 16. Дополнительные сведения о Коболе Оператор TRANSFORM (ПРЕОБРАЗОВАТЬ) имеет такую форму: TRANSFORM имя-данных CHARACTERS FROM ci ТО с2 где имя-данных — это либо групповая единица данных, либо элементарная буквенно-цифровая или буквенная единица данных, либо элементарная единица отчета (т. е. данные не могут быть цифровыми), a Ci и с2 — нечисловые литералы, фигуральные константы либо имена данных. Длина поля данных не может превышать 256 байтов. В этом операторе фигуральные константы ZERO (НУЛЬ), SPACE (ПРОБЕЛ), QUOTE (КАВЫЧКА), HIGH-VALUE (МАКСИМАЛЬНОЕ-ЗНАЧЕНИЕ) и LOW-VALUE (МИНИМАЛЬНОЕ-ЗНАЧЕНИЕ) (а также их другие формы, например, ZEROS (НУЛИ)) считаются эквива- лентными однобайтовому нечисловому литералу. Если с2 имеет единичную длину, то каждый символ в поле данных, который равен какому-либо символу в Ci, заменяется символом с2. Если длина с2 не является единичной, то длины сг и с2 должны совпадать и каждый символ в поле данных, который равен какому-либо символу в Ci, заменяется соответствующим символом в с2. Если и Ci и с2 являются именами данных, эти данные долж- ны иметь одинаковую длину. Рассмотрим примеры: До выполнения FROM ТО оператора После выполне- ния оператора 001790 ZERO SPACE 001790 '189' '264' 001790 '189' '5' 7,324. ЪМ79Ь 002740 005750 7.324, При использовании в качестве Ci и с2 имен данных правило преобразования может быть изменено объектной программой. И наконец, последним рассматриваемым здесь оператором является оператор NOTE (КОММЕНТАРИЙ); он имеет форму NOTE примечание. Использование оператора NOTE позволяет программисту вво- дить комментарии или примечания в листинг исходной программы. Это никоим образом не отражается на объектной программе. Если NOTE является первым словом параграфа, то весь параграф рассматривается как примечание. В противном случае NOTE должно быть первым словом предложения и тогда все, вклю- чая первую точку, сопровождаемую пробелом, считается при- мечанием.
16.5. Объявления 557 Упражнения № 40 1. Пусть выполняется оператор IF А > В IF А > С ADD В ТО С ELSE ADD А, В GIVING С ELSE IF В > С ADD А ТО С ELSE ADD А, В GIVING С Чему будет равняться результирующее значение С, если перво- начально задано: (а)А=1, В = 2, С = 4; (b) А = 1, В = 4, С = 2; (с) А =2, В=1, С = 4; (d)‘ А = 2, В = 4, С = 1; (е) А = 4, В=1, С = 2; (f) А = 4, В = 2, С = 1; (g) А = 2, В =2, С =2. 2. Выполняется оператор MOVE 4 ТО С; IF A ZERO THEN MOVE 2 ТО С IF В POSITIVE MOVE 3 ТО С ELSE MOVE 5 ТО С. Чему будет равняться результирующее значение С, если перво- начально задано: (а) А = О, В = 1; (Ь) А = О, В = —1; (с) А = 1, В = = -1; (d) А = 1, В = 0; (е) А — —1, В = 1. 3. Считана колода перфокарт, содержащих римские цифры в колонках 1—4. Используются только цифры I, V, X и L. Соста- вить программу печати входных данных и десятичных эквива- лентов. 4. Изменить программу упр. 3 таким образом, чтобы учесть возможность чтения числа, отперфорированного в колонках 1—8 (имея в виду, что в правой части числа возможны пробелы). В числе могут быть также использованы символы С, D и М. 5. Написать программу, обеспечивающую чтение (в качестве входных данных) даты, отперфорированной в колонках 1—6 карты в форме mmddyy (month — месяц, day — день, year — год). Если дата задана правильно, преобразовать ее в форму yyddd (year — год, day of year — день года (1—365 или 366)). Отпе- чатать входные данные и результат. 6. Добавить в программу упр. 5 выдачу на печать дня недели, если год задан в интервале между 1967 и 1978 гг. 16.5. Объявления Если в Разделе оборудования записано: LABEL RECORDS ARE имя-данных, то в Разделе процедур программист должен предусмотреть соответствующие команды для обработки меток
558 Гл. 16. Дополнительные сведения о Коболе пользователя. Эти команды необходимо записывать в секции DECLARATIVES (ОБЪЯВЛЕНИЯ) в Разделе процедур. Общая форма записи такова: PROCEDURE DIVISION. DECLARATIVES. имя-данных SECTION, предложение USE • • • > END DECLARATIVES. Предложение USE (ИСПОЛЬЗОВАТЬ) имеет две формы: Г BEGINNING! т USE FOR CREATING LENDING J LABELS ON OUTPUT имя-файлai [имя-файлаг . . .] USE FOR CHECKING LABELS ON INPUT имя-файла1 [имя-файла2 . . .] Слово INPUT записывается и для входных, и для входных — выходных файлов. Если не указаны ни слово BEGINNING, ни слово ENDING, то предложение USE относится и к головным и к хвостовым меткам. Поскольку обработка меток может производиться почти в лю- бой момент времени выполнения основной программы, не должно быть взаимосвязи между операторами в секции DECLARA- TIVES и в остальной части Раздела процедур. То есть нельзя использовать операторы GO ТО или PERFORM в основной программе для обращения к каким-либо операторам в DECLARA- TIVES так же, как нельзя из DECLARATIVES обращаться к операторам в основной программе. Если определены дополнительные метки пользователя, то, после того как стандартная метка обработана, супервизор пере- дает управление соответствующему предложению USE. Про- граммист может предусмотреть любую необходимую обработку меток, но она должна заканчиваться либо выходом на последний оператор перед END DECLARATIVES, либо выполнением спе- циального оператора GO ТО MORE-LABELS что означает перейти к следующим меткам. Оператор EXIT может быть использован в качестве отдельного параграфа непосред- ственно перед оператором END DECLARATIVES, что обеспе- чивает первый тип выхода. Если же выход обеспечивается с по- мощью оператора GO ТО MORE-LABELS, то управление снова пе- редается оператору USE, если прочитана еще одна метка пользой
16.6. Дисковые файлы 559 вателя. При выходе на оператор END DECLARATIVES все оставшиеся метки пропускаются. Для выводного файла про- граммист должен выйти на оператор END DECLARA- TIVES после того, как он сформировал последнюю метку пользователя. Если при работе с вводным файлом после окончания обработки последней метки выход осуществляется опять по оператору GO ТО MORE-LABELS, программа будет нормально выполняться дальше, поскольку супервизор может отличать метки от записей данных. При выводе метка пользова- теля записывается при каждом выходе из DECLARATIVES. При вводе метки пользователя считываются в область опе- ративной памяти, которая обычно недоступна программисту. В этой же области должны формироваться выходные метки. Эта область должна быть определена в Разделе данных. Для этого- после Секции файлов и Секции рабочей памяти требуется записать Секцию связей так: LINKAGE SECTION. После этого заголовка секции пишутся соответствующие описа- ния записей для меток. Статью с VALUE нельзя использо- вать в Секции связей; исключение составляют лишь единицы данных уровня 88. Укажем третью форму предложения USE: USE AFTER STANDARD ERROR PROCEDURES ON имя-файла. Выход из оператора USE этого типа происходит либо по последнему оператору секции, либо посредством операто- ра GO ТО, который передает управление главной части Раздела процедур. В секции USE употребление операторов вво- да — вывода, отличных от оператора CLOSE, не допускается. В случае стандартных последовательных файлов оператор CLOSE должен выполняться либо в секции USE, либо после возврата управления в основную программу. При работе с исполь- зованием операционной системы OS в управляющей карте DD можно задать специальные действия, которые должны выполнять- ся при обнаружении ошибки; это невозможно в случае DOS. • Применение формы USE AFTER ERROR оператора USE недопустимо в Коболе для операционных систем TOS и DOS. 16.6. Дисковые файлы Природа файлов с прямым доступом такова, что они допу- скают возможность выполнения определенных операций, недо- пустимых при других типах организации файлов. Две важней-
560 Гл. 16. Дополнительные сведения о Коболе ших особенности таких файлов сводятся к следующему. Во-пер- вых, обращение к записям может осуществляться произвольным образом, а во-вторых, возможно вписать запись вместо другой записи такого же размера без уничтожения соседних. Процесс чтения записи и затем перезаписи ее с изменением некоторых элементов информации называется корректированием или «обновле- нием» записи. При использовании стандартных последовательных файлов выполнение корректирования допускается только в тех случаях, если файл открывается как 1-0 файл, т. е. входной — выходной. Оператор OPEN приобретает такой вид: OPEN 1-0 имя-файлai [имя-файла2 . . .1 Конструкции с 1-0 могут быть перемешаны с конструкциями с INPUT и OUTPUT в любом операторе OPEN. Файлы, открытые как входные — выходные, допускают использование обычного оператора READ в форме READ имя-файла RECORD [INTO имя-данных] AT END повелительный-оператор а также оператора REWRITE (ПЕРЕПИСАТЬ) REWRITE имя-записи [FROM имя-данных] Оператор REWRITE всегда относится к записи, прочитанной из данного файла последним оператором READ. Он вызывает перезапись текущей записи (замену ее новой записью). Если содержимое записи не должно меняться, то оператор REWRITE задавать не нужно. 16.7. Индексно-последовательные файлы Кобол допускает использование индексно-последовательных файлов. При этом налагается лишь одно ограничение: даже для несблокированных записей ключ должен входить в поле данных как составная часть этого поля. Очевидно, вы помните, что в гл. 8 мы говорили о том, что сблокированные записи должны содержать ключ, но это требование не относилось к несб локированным за- писям. Следовательно, при использовании Кобола можно обраба- тывать большинство индексно-последовательных файлов (но не все). Определение файла как индексно-последовательного делается в Разделе оборудования. Для каждого предложения SELECT (ВЫБРАТЬ), определяющего индексно-последовательный файл, необходимо использовать следующие статьи: ORGANISATION IS INDEXED
16.7. Индексно-последовательны* файлы 561 ет {=T1AL} RECORD KEY IS имя-данных Иногда целесообразно воспользоваться и такими статьями: SYMBOLIC KEY IS имя-данных TRACK AREA IS имя-данных CHARACTERS Если альтернатива ORGANIZATION не записана, то компиля- тор предполагает, что файл является последовательным. Индекс- ный файл может быть создан (т. е. записан) только в последова- тельном порядке, но после этого его можно читать и подвергать корректированию как последовательно, так и в произвольном порядке. Если статья ACCESS не записана, компилятор пред- полагает, что ACCESS IS SEQUENTIAL (ДОСТУП ПОСЛЕДОВА- ТЕЛЬНЫЙ). Статья RECORD задает имя данных для поля в записи, которое содержит ключ. Заметьте, что это должно быть подполе самой записи. Статья SYMBOLIC должна задаваться в том случае, когда обращения к индексному файлу производятся в произвольном порядке. В ней указывается единица данных, которая содержит ключ для поиска нужной записи во входном файле и ключ, кото- рый записывается при обновлении или добавлении записей в вы- ходном файле. Единица данных, указанная в этой статье, может не быть частью самой вводимой или выводимой записи. Однако обычно она содержит то же значение, что и единица данных, указанная в статье RECORD. Применение статьи TRACK AREA является необязательным. Если добавление новых записей к существующему файлу произ- водится произвольным образом, то в статье указывается единица данных уровня 77 или 01 в рабочей памяти, которая достаточна велика по объему, чтобы обеспечить размещение всех записей одной дорожки диска, включая поля ключей плюс одну логиче- скую запись. Если эта статья задана, то это позволяет повысить эффективность функционирования IOCS при добавлении новых записей. Следует иметь в виду, что за это повышение эффектив- ности приходится расплачиваться частью оперативной памяти. • Кобол уровня F может быть использован для обработки индексно-последовательных файлов с записями не только типаЕ, но и типа V как сблокированными, так и несблокированными. При необходимости добавления в файл новых записей типа V требуется использование статьи TRACK AREA. В Коболе уровня F статья TRACK AREA может также принимать форму TRACK AREA IS целое CHARACTERS 36 Зак 15635
562 Гл. 16. Дополнительные сведения о Коболе где целое указывает количество байтов, которые должны быть зарезервированы. Целое не может превышать число 32767. В Коболе создание индексно-последовательных файлов воз- можно только при определении файла как ORGANIZATION IS INDEXED, ACCESS IS SEQUENTIAL и открытии файла как OUTPUT. Программист формирует записи, которые должны записываться в оперативной памяти, размещая поле ключа в поле, указанном с помощью статьи RECORD KEY. Оператор WRITE принимает форму WRITE имя-записи [FROM имя-данных] [INVALID KEY повелительные-операторы . . .] Если записана статья INVALID KEY (НЕПРАВИЛЬНЫЙ КЛЮЧ), повелительные-операторы будут выполняться в том случае, если делается попытка писать записи с полями ключей, заданными не в порядке возрастания. Если статья INVALID KEY не записана,' секция USE может быть записана 8 DECLARATIVES, но ее дей- ствие ограничивается закрытием файла. После того как файл создан, его можно определить как SEQUENTIAL или RANDOM; в любом случае файл можно открыть как INPUT или I-О. Последовательный (SEQUENTIAL) файл, открытый как INPUT, может обрабатываться только опера- тором READ в форме: READ имя-файла [INTO имя-данных] AT END повелительные-операторы ... Если файл открыт как 1-0, в дополнение к оператору READ можно использовать оператор REWRITE в форме REWRITE имя-файла [FROM имя-данных] Если файл определен как файл с прямым доступом (RANDOM) и открыт как INPUT, то допускается применение только оператора READ. Он записывается в следующей форме: READ имя-файла [INTO имя-данных] [INVALID KEY повелительные-операторы . . .] Операторы за INVALID KEY выполняются в том случае, если при проведении поиска по файлу не удается отыскать ключ, который оказался бы равным ключу, указанному в статье SYMBOLIC KEY. Если для файла записана секция USE, статью INVALID KEY задавать нельзя. Однако секция USE не обязана закрывать файл, поскольку в этом случае возможно продолже- ние обработки данных.
16.8. Пример 563 Если файл открывается как I-О, то в дополнение к READ допустимо использование операторов REWRITE и WRITE. В обоих этих операторах можно предусмотреть статью INVALID KEY, если не записана секция USE. При использова- нии оператора WRITE ситуация INVALID KEY возникает, когда запись с указанным ключом уже имеется. При использова- нии оператора REWRITE ситуация INVALID KEY возникает при отсутствии записи с указанным ключом. Оператор REWRITE применяется для корректировки имеющейся записи, в то время как оператор WRITE позволяет дополнять файл новыми запи- сями. 16.8. Пример Пожалуй, наилучшим способом иллюстрации использования индексно-последовательных файлов будет изменение программы, приведенной в разд. 15.14, путем переноса файла клиентов на 001100 SELECT Т ASSIGN TCH’SYSOOO1 DIRECT-ACCESS 2311 ACCESS RANDOM 001110 ORGANIZATION INDEXED SYMBOLIC KEY ACCOUNT RECORD KEY ACCT. 0Q2210 LABEL RECORDS STANDARD, RECORDING MODE F. 002320 002330 002340 005020 Pl. OPEN INPUT C, OUTPUT L, 1-0 T. 005070 P2. READ C, AT END GO TO P12. 005080 READ T, INVALID KEY GO TO P4. 005090 GO TO P5. 005100 005110 005120 005140 GO TO P2. 005150 005160 005170 005175 P5. 005390 005400 005410 005510 REWRITE MASTER-IN. 005540 CLOSE С T L. и c. 16.2. Часть программы, изменяемая при работе с индексно-после- довательным файлом. магнитный диск. Если считать, что файл является индексно- последовательным, то нет никакой необходимости каждый раз читать и переписывать весь файл. На рис. 16.2 показаны строки программы, которые будут изменяться. Фактическая емкость файла определяется размером области переполнения цилиндра и величиной коэффициента блокирования. Ьсли мы используем дисковое устройство 2311 с дорожкой 9, 36*
,564 Гл. 16. Дополнительные сведения о Коболе зарезервированной для записей переполнения (предполагается, что компания приобретает новых клиентов, что является вообще-то разумным предположением), и рассчитываем на обработку несбло- кированных записей; то мы будем иметь на каждом цилиндре следующее: Дорожка 0: 19 записей индекса дорожек + 7 записей клиентов Дорожки 1—8: По 14 записей клиентов каждая Дорожка 9: Зарезервирована для 13 записей переполнения При использовании коэффициента блокирования, равного 5, полу- чаем: Дорожка 0: 19 записей индекса дорожек + 10 записей клиентов Дорожки 1—8: По 20 записей клиентов каждая Дорожка 9: 43 записей переполнения (несблокированных) При использовании несблокированных записей мы получаем 119 записей на цилиндр. Если же используются сблокированные записи, то можно получить 200 записей на цилиндр. Если мы решили бы выделить две дорожки для записей переполнения (в связи с увеличением общего числа записей на цилиндре за счет блокирования), все равно мы получили бы лишь 180 записей на цилиндр. Обработка сблокированных записей требует использования небольшого дополнительного объема оперативной памяти, тем не менее в большинстве случаев это оказывается целесообразным, поскольку позволяет добиться некоторой экономии в памяти на дисках. (Мимоходом заметим, что увеличение коэффициента блокиро- вания, скажем, до десяти не позволит иметь большее количество записей в цилиндре, чем получается при коэффициенте блокиро- вания, равном пяти. Для записей рассматриваемого размера в обоих случаях будет получено 200 записей на цилиндр. Иначе обстоит дело с магнитной лентой, где при использовании стандартной бобины с лентой длиной 2400 футов может обрабаты- ваться до 36000 несблокированных записей, 90000 записей с коэффициентом блокирования, равным пяти, и 110770 записей с коэффициентом блокирования, равным десяти.) Упражнения № 41 1. Изменить программу, приведенную в разд. 15.2, так, чтобы она создавала индексно-последовательный файл для последующего использования программой, приведенной в разд. 16.8.
16.8. Пример 565 2. Изменить упр. 39.1, используя индексно-последовательные файлы. 3. Изменить упр. 39.2, используя индексно-последователь- ные файлы. 4. Изменить упр. 39.3, используя индексно-последователь- ные файлы. 5. Небольшой банк имеет машину IBM-360 с четырьмя диско- выми устройствами 2311, одно из которых используется для хра нения операционной системы, а остальные три — для хранения текущих записей о сбережениях, числящихся на банковских счетах. Всего должно храниться приблизительно 9000 счетов. Подлежащая записи информация имеет такой вид: Наименование счета 72 буквенных символа Адрес 72 буквенных символа Номер счета 6 цифр в форме упакованной Текущий баланс 11 цифр в форме упакованной Минимальный баланс, месяц 1 11 цифр в форме упакованной Минимальный баланс, месяц 2 11 цифр в форме' упакованной Минимальный баланс, месяц 3 11 цифр в форме упакованной Текущая информация о банковских операциях состоит из: Код банковской операции 1 цифра в формате с зоной Итоговая сумма 11 цифр в упакованной форме Для каждого счета допускается 9 необработанных банковских операций. Применяются следующие коды таких операций: 4 Внесение вклада 5 Снятие вклада 6 Учет процентов на капитал 7 Учет налога на оборот 8 Выдача сумм в кредит 9 Внесение Сумм в дебет Информация о банковских операциях наносится на перфо- карты так: номер счета перфорируется в колонках 2—7, код бан- ковской операции — в колонке 1 и итоговая сумма — в колон- ках 17—26. Если в коде банковской операции указывается 1, то это озна- чает, что счет новый. Наименование счета перфорируется в колонках 8—80, а его номер — в колонках 2—7. В случае кода операции, равного 2, речь идет о новом адресе, отперфорирован-
566 Гл. 16, Дополнительные сведения о Коболе ном в колонках 8—80. Код 3 означает замену указанной в записи величины текущего баланса содержимым колонок 17—26 карты. Написать программу, которая обеспечивала бы чтение карт с нанесенными на ней кодами банковских операций 1, 2 л 3 и созда- ние нужного индексно-последовательного файла. 6. Написать программу обработки банковских операций, счи- тая, что все данные содержатся в файле из упр. 5. Не принимать во внимание поля минимального баланса. Первая карта, вводимая в начале работы, должна содержать дату в колонках 8—20 (например, MAR. 17,1967). Все вводимые данные с кодами банков- ских операций от 4 до 9 включительно должны быть добавлены к файлу как данные о невыполненных банковских операциях; Если в колонке 1 карты стоит код 0, то все хранящиеся в настоя- щий момент в файле данные о невыполненных банковских опе- рациях (для соответствующего карте счета) должны быть выданы на печать и стерты из файла. 7. В соответствии с условиями упр. 6 на карте, содержащей дату, в колонке 1 перфорируются цифры 1, 2 или 3 в зависимости от того, какой сейчас месяц (первый, второй или третий) текущего квартала. В колонках 2—3 перфорируется день месяца. Если дата приходится на число месяца после 15-го, то всякий раз, когда бы ни проводилась операция, указываемая в счете, преду- смотреть заполнение минимального баланса для соответствующего месяца^ учитывая предыдущий и новый балансы и выбирая тот из них, который меньше. 8. Написать программу, которая в условиях упр. 6 обеспечи- вала бы чтение некоторой входной карты и автоматическое копи- рование поля текущего баланса в соответствующее поле мини- мального баланса по всем записям. Предполагается, что эта программа будет выполняться один раз в месяц. Карта для вы- полнения такой операции должна иметь нули в колонках 2—3 в качестве кода банковской операции. 9. Составить программу для квартального учета процентов, правильно предусмотрев обработку кода банковской операции 6, а также добавления процентов к текущему балансу. Считайте, что процент рассчитывается из 6 процентов годовых. (Это означает сложить три поля минимального баланса и умножить на .005 = = .06/12.) 16.9. Файлы с прямым доступом Применение в Коболе файла с прямым доступом требует от про- граммиста указания дорожки на диске, где должна храниться запись, а также ключа. Поиск проводится по указанной дорожке. При наличии записи она читается в оперативную память; в про-
16.9. Файлы с прямым доступом 567 тивном случае (при отсутствии записи) поиск продолжается на следующей дорожке. Поиск заканчивается при отыскании записи или же когда достигается конец файла. Если программист считает нужным, он может ограничить поиск указанием числа дорожек. Кобол требует, чтобы все файлы с прямым доступом состояли из несблокированных записей, хотя и допускает применение записей постоянной, переменной и неопределенной длины. Пред- ложение SELECT, определяющее файл, должно включать сле- дующие статьи: ORGANIZATION IS DIRECT ACCESS IS SEQUENTIAL RANDOM SYMBOLIC KEY IS имя-данных и в некоторых случаях такую статью: ACTUAL KEY IS имя-данных где SYMBOLIC KEY (СИМВОЛИЧЕСКИЙ КЛЮЧ) определяет поле, не являющееся частью самой входной — выходной записи и содержащее ключ, a ACTUAL KEY (ФАКТИЧЕСКИЙ КЛЮЧ) определяет поле данных, имеющее шаблон типа COMPUTATIONAL PICTURE S9(5) и не являющееся частью входной — выходной записи. Поле фактического ключа содержит относительный номер дорожки (взятый относительно первой дорожки файла). Статью ACCESS записывать не требуется, если речь идет о последователь- ном доступе; Файлы с прямым доступом могут создаваться только последо- вательно. Файл должен открываться как OUTPUT, а для внесе- ния записей необходимо использовать оператор WRITE. Допу- скаются любые ключи. IOCS пытается разместить запись и ее ключ (из поля SYMBOLIC KEY) на указанной дорожке. Если места на дорожке оказывается недостаточно, запись размещается на первой свободной дорожке, следующей за указанной. После того как файл сформирован, доступ может осуществлять- ся последовательно для файла, открытого как INPUT, или про- извольно для файла, открытого как INPUT или I-О. В первом случае статья ACTUAL KEY не записывается. Каждая запись питается в оперативную память в порядке ее физического разме- щения на диске. Поле ключа читается в поле символического ключа. В операторе READ должна быть предусмотрена конструк- ция AT END. Если фактичес доступ произвольный, то необходимо применение кого ключа. Для отыскания записи используются
568 Гл. 16. Дополнительные сведения о Коболе и фактический и символический ключи. Для входного файла (открытого как INPUT) разрешается использовать только опе- ратор READ. Можно задать статью INVALID KEY, и соответ- ствующая ситуация будет возникать в тех случаях, когда либо фактический ключ будет указывать на несуществующую дорожку, либо запись с заданным символическим ключом не будет найдена. Если файл с произвольным доступом открыт как входной — выходной, возможно задание операторов READ, REWRITE и WRITE. Ситуация по статье INVALID KEY будет возникать во время записи в том Случае, если либо указана несуществующая дорожка, либо самый левый байт поля ключа имеет значение HIGH-VALUES (шестнадцатеричное FF). При использовании оператора REWRITE необходимо, чтобы фактический и симво- лический ключи имели значения одинаковые с теми, которые использовались в последнем операторе READ. Если для файла записана секция USE, то статья INVALID KEY не допускается. При последовательном доступе секция USE должна предусматривать закрытие файла или передачу управле- ния на ту часть основной программы, которая закрывает файл. При произвольном доступе обработка может быть продолжена. Следует иметь в виду, что в случае файлов с прямым доступом можно столкнуться с фактом наличия двух или большего числа записей с одинаковым символическим ключом на различных дорожках. При обработке подобных записей требуется соблюдать осторожность. • В операционных системах DOS и TOS файлы с прямым доступом не могут быть открыты как выходные (OUTPUT). Поле ACTUAL KEY всегда необходимо и должно иметь 8-байтовую длину, обеспечивая хранение фактического дискового адреса — MBBCCHHR. • В Коболе уровня Е файлы с прямым доступом не могут быть открыты как выходные (OUTPUT). 16.10. Файлы с относительной адресацией В Коболе файл с относительной адресацией формируется из несблокированных записей фиксированной длины, которым присвоены последовательные номера (1, 2, 3, . . .). Доступ к записям может быть организован либо последовательно, либо произвольным образом. При произвольном доступе относитель- ный номер записи используется в качестве ключа. Файлы с отно- сительной адресацией могут создаваться только в Коболе уровня F, однако их чтение и корректирование возможны в Коболе уров- ней Е и F. Они не могут использоваться в TOS и DOS. Статьи,
16.11. Управление вводом—выводом 569 которые следует предусмотреть в предложении SELECT, следую- щие: ORGANIZATION IS RELATIVE ACCESS IS SEQUENTIAL RANDOM ив некоторых случаях SYMBOLIC KEY IS имя-данных Если статья ACCESS не записана, компилятор предполагает ACCESS IS SEQUENTIAL. Имя данных, указанное в статье SYMBOLIC KEY, не может являться частью входной — выходной записи и должно определяться как COMPUTATIONAL PICTURE S9(8). Оно будет содержать относительный номер записи. Файлы с относительной адресацией записываются последова- тельно, причем файл открывается как выходной. Добавление - каждой записи осуществляется с помощью оператора WRITE. Использование ключа не разрешается. Существующий файл, открытый как входной, может читаться последовательно с помо- щью оператора READ, в котором предусмотрено AT END. Файлы с относительной адресацией можно читать и коррек- тировать в произвольном порядке, задавая относительный номер записи в поле ключа. Если файл открыт как входной, то допу- скается использование только оператора READ. Если файл откры- вается как входной — выходной, возможно применение и опе- ратора READ, и оператора REWRITE. Можно воспользоваться указанием INVALID KEY; ситуация INVALID KEY возникает только в случае указания несуществующего ключа. Оператор REWRITE можно применять только для последней считанной записи. Если секция USE записана, то указание INVALID KEY недопустимо. Секция USE может разрешать продолжение обра- ботки данных, если только доступ не был последовательным и не произошел нормальный выход из секции USE. В этом случае файл закрывается. 16.11. Управление вводом — выводом После параграфа FILE-CONTROL программист может напи- Лт паРагРаФ I-O-CONTROL (УПРАВЛЕНИЕ-ВВОДОМ-ВЫВО- ДОМ), который имеет следующую форму: I-O-CONTROL. Различные статьи . . .
570 Гл. 16. Дополнительны сведения о Коболе Могут быть записаны следующие статьи: SAME AREA FOR имя-файла1 имя-файлаг . . . Эта статья определяет, что названным файлам должна выделяться одна и та же область основной памяти. Это позволяет достиг- нуть определенной экономии, если известно, что записи обоих файлов не будут храниться в оперативной памяти одновременно. RERUN ON внешнее-имя EVERY END OF [ REEL 1 । TTivTrp j OF имя-фаила RERUN ON внешнее-имя EVERY целое CLOCK-UNITS. Использование второй формы допустимо только в Коболе уровня F. Целое указывает время работы программы в минутах между двумя контрольными точками. Первая форма указывает, что записи контрольных точек необходимо делать на заданном устройстве каждый раз при окон- чании бобины с лентой. Запись контрольной точки регистрирует состояние вычисли- тельной машины в данный момент времени в такой форме, что возможен повторный пуск программы с этого места. Записи кон- трольных точек обычно не делаются в тех случаях, когда время выполнения программы не превышает двух часов. APPLY RESTRICTED SEARCH OF целое TRACKS ON [имя-файла i имя-файла2 . . .1 Для файлов с прямым доступом эта статья применяется для того, чтобы ограничить поиск заданным числом дорожек. Если статья не задана, то поиск продолжается до тех пор, пока не будет достиг- нут конец файла. Если указанная запись не найдена, возникает ситуация INVALID KEY. APPLY условная-переменная ТО FORM-OVERFLOW ON имя-файла. Условная переменная получает значение истина,^ когда обна- руживается пробивка на дорожке 12 управляющей ленты печа- тающего устройства, и значение ложь, когда обнаруживается пробивка на дорожке 1. Статья может задаваться только для файла печатающего устройства. Вместе с AFTER в операторе
16.12. Подпрограммы 571 WRITE эта статья может быть использована для управления форматом печати. APPLY WRITfe-ONLY ON имя-файла1 [имя-файла2 . • .] Использование этой статьи для файлов с записями типа V и U приводит к тому, что буфер, в котором накапливаются записи, выводится на ленту или диск только тогда, когда в нем не по- мещается очередная запись. Указание FROM должно входить во все операторы WRITE, относящиеся к перечисленным файлам. В статье могут перечисляться только файлы типа V, и U. Если данная статья опущена, вывод буфера производится уже тогда, когда в него не помещается запись максимальной длины. Статья позволяет более экономно расходовать внешнюю память. 16.12. Подпрограммы Иногда возникает необходимость в использовании стандарт- ной программы (т. е. набора команд для выполнения определен- ной операции) в большом количестве различных программ. Если стандартная программа включает лишь несколько простых опе- раторов, она может быть легко записана в каждой программе. В некоторых случаях стандартная программа предполагает использование большого числа команд или достаточно сложной логики вычислений. В подобных ситуациях простейший выход— это написать стандартную программу один раз и в тех местах, где нужно, включить в основную программу команды передачи управления на стандартную программу. Стандартная программа, окончив работу, снова возвращает управление основной программе. В Коболе в таких случаях основная программа должна включать операторы ENTER LINKAGE. CALL имя-входа [USING аргумент . . .]. ENTER COBOL. Имя-входа — это имя, присвоенное стандартной программе, которой должно передаваться управление (например, имя-фазы). Стандартную программу можно написать на Коболе или на Другом языке программирования (например, на Фортране, PL/1 или языке Ассемблера). В качестве аргументов могут исполь- зоваться имена данных, имена файлов или имена процедур. Однако ®сли подпрограмма записана на Коболе, аргументы ограничи- ваются именами данных.
572 Гл. 16. Дополнительные сведения о Коболе Основная программа поместит адрес первой команды вызы- ваемой стандартной программы в Регистр 15. Адрес следующей команды в основной программе будет указан в Регистре 14. Если аргументы заданы, программа на Коболе скомпонует группу четырехбайтовых двоичных полей, занимающих последовательные слова в оперативной памяти, и разместит адрес первого из этих слов в Регистре 1. Каждое слово содержит адрес соответствую- щего аргумента. После этого производится передача управления по адресу, указанному в Регистре 15. Те слова, которые содержат адреса, называют адресными кон- стантами. Первое слово включает адрес первого аргумента, второе слово — адрес второго аргумента и т. д. Знаковый разряд адреса последнего аргумента всегда делается равным 1. Написанные на Коболе подпрограммы могут вызываться основ- ной программой, написанной также на Коболе, либо на каком- нибудь другом языке. Внешняя процедура языка PL/1 или фор- трановская подпрограмма SUBROUTINE имеют такие же внешние связи, как и подпрограмма Кобола. Написание подпрограммы на Коболе и основной программы несколько отлично. Раздел идентификаций остается тем же с$мым. В Разделе оборудования секция Управления файлами может быть опущена, если подпрограмма не содержит никаких операторов ввода — вывода. В Разделе данных после секции рабочей памяти необходимо записывать Секцию связей, если предусматрива- лись какие-либо аргументы. Секция связей описывает аргументы в том порядке, в каком они указывались в операторе CALL в основ- ной программе. Заголовок секции LINKAGE SECTION. записывается на бланке в поле А. Элементы описания записей пишутся точно так же, как это делается в Секции файлов. Задание статьи VALUE допускается только для единиц данных уровня 88. В Разделе процедур программист указывает первую процедуру, которую необходимо выполнять, таким образомз ENTER LINKAGE. ENTRY имя-входа [USING имя-данных1 . . .]. ENTER COBOL. В подпрограмме может быть несколько входов; для каждого из них должно задаваться свое имя. Конструкция USING должна определять передаваемые данные указанием их имен (которые не обязательно должны совпадать с именами, присвоенными им в основной программе), как они определены в Секции связей.
16.12. Подпрограммы 573 Чтобы возвратить управление основной программе, нужно записать следующее: ENTER LINKAGE. RETURN. ENTER COBOL. Необходимо предусмотреть по меньшей мере один возврат; вообще же число возвратов может быть произвольным и определяется необходимостью. С целью иллюстрации применения подпрограммы на Коболе давайте предположим, что в примере, приведенном в разд. 15.14, нам хотелось бы проконтролировать номер счета, чтобы убедить- ся, что он удовлетворяет принятой в IBM проверке числа по модулю 10. Контрольная цифра получается следующим образом: Берется любое число, например 123752 Выделяется каждая вторая цифра справа налево: 13 5. Каждая из этих цифр умножается на 2; если получающийся результат больше девяти, то суммируются полученные цифры произведения: 2 6 1 (5 + 5 = 10; 1 + 0 = 1) Суммируются три полученные суммы: 2+64-1=9 Суммируются оставшиеся цифры исходного числа: 2 + 7 + 2 = И Складываются обе суммы: 9 + 11 =20. Если полученная итоговая сумма делится на десять, то счи- тается, что число удовлетворяет проверке по модулю 10. Часто счетам приписываются номера с учетом такой проверки. Если цифры в номере во время записи или перфорации будут иска- жены, то в большинстве случаев номер не пройдет проверки. Чтобы контролировать числа при перфорации, в большинстве перфораторов можно установить специальное средство. Если число не проходит проверку, клавиатура блокируется и об этом выдается сигнал оператору. Вернемся к нашей программе. В рабочей памяти мы зададим поле с уровнем 77 вида: 77 CHECK PICTURE 9(4).
574 Гл. 16. Дополнительные сведения о Коболе В Разделе процедур в конце параграфа Р2 добавим: MOVE ACCOUNT ТО CHECK. ENTER LINKAGE. CALL 'CHKDGT' USING CHECK. ENTER COBOL. IF ACCOUNT = CHECK GO TO P3. DISPLAY . . . и мы получим определенную реакцию на ошибку. Наша подпрограмма получит в качестве входных данных поле из четырех цифр и произведет замену разряда единиц точной контрольной цифрой. Вся программа приведена на рис. 16.3. IDENTIFICATION DIVISION. PROGRAM-ID. 'CHKDGT'. ENVIRONMENT DIVISION. DATA DIVISION. WORKING-STORAGE SECTION. 01 w. W1 PICTURE 9. W2 PICTURE 9. W3 PICTURE 9. W4 PICTURE 9. X PICTURE 99. Y REDEFINES X. Y1 PICTURE 9. Y2 PICTURE 9. 01 01 LINKAGE SECTION. 01 CODE. 02 Cl PICTURE 999. 02 C4 PICTURE 9. PROCEDURE DIVISION. ENTER LINKAGE. ENTRY CHKDGT' USING CODE. ENTER COBOL. MOVE CODE TO W. SUBTRACT W2 FROM 50, GIVING X. TRANSFORM W FROM '0123456789' TO '0246813579'. SUBTRACT Wl, W3 FROM X. MOVE Y2 TO C4. ENTER LINKAGE. RETURN. ENTER COBOL. P и c. 16.3. Подпрограмма CHKDGT. Заметьте, что Секция связей определяет только поле из четырех цифр, которое передается из основной программы. В подпро- грамме этому полю присвоено имя CODE, в то время как в основной
16.12. Подпрограмм» 575 программе оно носит имя CHECK. Имена в подпрограмме, за исключением имени входа CHKDGT, являются локализованными, т. е. действующими только в данной подпрограмме. Подпрограмма может компилироваться отдельно от основной программы с применением способов, описываемых в гл. 18 и 19. Если и основная программа и подпрограмма должны компилиро- ваться одновременно, то в случае использования операционных систем DOS и TOS необходимо поместить перфокарты в читающее устройство в следующем порядке: И JOB CBL2 Карты ASSGN, если требуется // OPTION |LINK PHASE CBL2,* // ЕХЕС COBOL Исходные операторы основной программы /• // ЕХЕС COBOL Исходные операторы подпрограммы /♦ //ЕХЕС LNKEDT Карты ASSGN, если требуется // ЕХЕС Карты данных /* /& При использовании операционной системы OS карты должны лежать в таком порядке: //CBL2 JOB // ЕХЕС СОБЕС //СОВ .SYSIN DD • Исходные операторы основной программы /* // ЕХЕС COBECLG //СОВ .SYSIN DD • Исходные операторы подпрограммы /*
576 Гл. 16. Дополнительные сведения о Коболе Карты DD, если необходимо //GO.SYSIN DD ♦ Карты данных /♦ // 16.13. Кобол уровня F Помимо уже рассмотренных нами общих возможностей, Кобол уровня F располагает четырьмя возможностями, которых нет в Коболе уровня Е и вариантах Кобола для операционных систем DOS и TOS. 1. Создание файлов с прямым доступом и относительной адре- сацией. В Коболе уровня F такие файлы могут быть записаны с помощью оператора WRITE аналогично индексно-последова- тельным файлам. 2. Асинхронная обработка данных. Во многих программах встречаются места, в которых дальнейшее выполнение программы не может продолжаться до тех пор, пока не завершится какая- нибудь операция ввода — вывода. Определяя отдельные проце- дуры как асинхронные, можно обеспечить их автоматические вызов и выполнение в то время, которое иначе оказалось бы време- нем ожидания для процессора. Это ускоряет выполнение про- граммы, требуя, однако, дополнительных усилий при программи- ровании. 3. Составление отчетов. Эта возможность по существу позво- ляет программисту записывать программы типа RPG на Коболе. 4. Сортировка. Эта возможность позволяет сортировать файлы на Коболе. В небольших системах при необходимости сортировки файлов программисту нужно обращаться к отдельной библио- течной программе сортировки. Кобол уровня F также предоставляет программисту несколько больший набор альтернатив (впрочем, не очень существенных) в некоторых описаниях. При использовании Кобола уровня F и в DOS можно при редак- тировании денежных данных пользоваться стерлинговыми еди- ницами наряду с долларовыми.
16.13. Кобол уровня F 577 Упражнения № 42 1. Изменить программу, составленную в соответствии с усло- виями упр. 40.5 таким образом, чтобы ее можно было исполь- зовать в качестве подпрограммы. 2. Объединить подпрограмму, составленную по условиям упр. 1, с программой, разработанной для чтения колоды карт, содержащих дату в форме mmddyy в колонках 1—6 и буквенно- цифровую информацию в колонках 7—80. Программа должна обеспечивать перфорацию входных данных, но в колонках 1—6 должна стоять в форме mmddyy дата, отстоящая ровно на неделю от даты во входной карте. Это означает, что если упоминаемая во входных данных дата представлена в виде 031267, то при выво- де будет получено число 031967; если входным данным соответ- ствует 022668, то при выводе окажется 030468. 3. Одно из наиболее распространенных применений файдов с прямым доступом связано с использованием их для хранения инвентарных ведомостей, когда учетные номера достаточно длин- ны. Предположим, что компания пользуется 8-значными учетными номерами, а количество хранящихся деталей составляет всего лишь 1500. Если мы получаем новый учетный номер, то делим его, скажем, на 1999 (любое простое число, которое должно быть несколько больше 1500) и используем получающийся остаток в качестве ключа. Если такой ключ уже есть, то к остатку прибавляется 1 и предпринимается новая попытка. В конце концов нам удастся найти такой ключ, который еще не употреблялся. Этот ключ присваивается детали, и информация о детали запи- сывается. Составить программу чтения карт с учетом того, что учетные номера пробиваются в колонках 1—8, и поиска соответствующей записи (о детали), если таковая имеется. Если запись о детали отсутствует, отпечатать сообщение об ошибке; в противном случае предусмотреть печать содержимого записи. Предполагается, что длина записей равна 80 байтам. 4. В программе, составляемой в соответствии с условиями упр. 3, использовать статью APPLY, чтобы контролировать заполнение страницы при печати. При заполнении страницы перейти на верхнюю строчку следующей страницы и продолжать печать. 5. Предположим, что у нас имеется файл с относительной адресацией, состоящий из N записей, каждая из которых имеет длину 60 байтов при шаблоне Х(60). Пусть N больше 70 и мень- ше 2000. Хотелось бы печатать записи на печатающем устройстве в Две колонки по 60 записей на странице. 37 Зак. 15635
578 Гл. 16. Дополнительные сведения о Коболе Например, первая страница могла бы содержать Запись 1 Запись 31 Запись 2 Запись 32 Запись 30 Запись 60 I На последней странице количество строк должно быть мини- I мальным, и если колонки имеют неравную длину, то пусть j левая колонка будет на одну строку длиннее правой. При боль- | шом объеме печати (например, при печати телефонного спра- j вочника) дополнительные усилия по Программированию для ор- ганизации печати в две колонки несомненно оправданы.
Глава 17 ЯЗЫК АССЕМБЛЕРА 17.1. Программирование в символических адресах Совершенно очевидно, что программируя на машинном языке большую задачу, человек должен выполнить громадный объем чисто технической кропотливой работы, выписывая (кодируя) сами команды. Поскольку на кропотливую работу большинство людей неспособно, естественно, что в программах возникают ошибки. Практически с первого раза почти невозможно безоши- бочно написать программу, объем которой превышает пятьдесят команд. Вплоть до 1951 года большую часть работы по програм- мированию представляло собой кодирование программ. Если учесть, что объем многих программ превышает тысячу команд, то совсем неудивительно, что лучшие программисты пытались отыскать способ облегчения своего труда. Под базовым языком вычислительной машины, или машинным языком, или абсолютным языком мы понимаем форму, в которой до сих пор писались программы для машины, иначе говоря, ту форму, в которой команды непосредственно воспринимаются машиной. Самым ценным инструментом при программировании такого типа оказалась резинка для стирания. Но к 1952 году стало очевидным, что если не писать программу в действительных (машинных) адресах до тех пор, пока она тщательно не проверена на бумаге, можно избежать большинства стираний, подчисток и исправлений. Ниже приведен пример программы на машинном языке и та же самая программа в символических адресах. На машинном языке В символических адресах 002000 BALR 05 ВО 05 ri 0 002002 L 58 50 В098 58 г2 а 002006 S 5В 50 В102 b 5В г2 с 00200А ВС 47 20 В 004 47 2 Ь 00200Е ST 50 50 В098 50 г2 а Кроме того, обнаружилось, что избавляясь от написания дей- ствительных адресов, нет необходимости писать адреса тех команд, к которым в программе нет обращений. Поэтому в приведенном выше примере имя (метка) присвоено лишь третьей команде, 37*
580 Гл. 17. Язык Ассемблера поскольку это единственная команда, адрес которой фигурирует в программе. После проверки — иными словами, исправления всех найден- ных ошиббк — программист подставляет действительные адреса. К этому времени уже стало ясно, что люди, работающие на пер- форационных устройствах, вполне могут справиться с подстанов- кой цифровых кодов операций вместо мнемонических. И тогда символическое, кодирование и операций и адресов стало обычным стилем работы. Символическая программа BALR L rl г2 0 а ь S г2 с ВС 2 b ST г2 а Писать программы в такой символической форме, а затем возвра- щаться и вставлять действительные адреса и коды операций не слишком трудно. В частности, совершенно обычным стало брать в качестве символических адресов такие названия или имена, которые отражают сущность самих величин, например, PAY, SUM, ТАХ и т. п. При написании длинных программ до того, как подставляются действительные адреса, программистом обычно составляется таблица имен, в которую помещается каждое имя вместе с соответствующим действительным адресом. И как только потом в программе встретится какое-нибудь имя, из таблицы берется и подставляется соответствующий действительный адрес. Естественно, что регистры и области памяти определяются отдельно. Адреса, как правило, определяются в терминах базы с тем, чтобы программу можно было переместить в любую часть памяти с минимальным количеством изменений. На программиста Можно было бы возложить и подстановку кодов операций, но довольно часто эта работа оставалась за людьми, работающими на перфорационных устройствах. Подстановка цифровых кодов операций вместо символических представляет собой весьма несложную работу. Это делается очень просто с помощью таблицы символических и соответствующих цифровых кодов. Тогда почему бы не запрограммировать вычис- лительную машину для выполнения такой подстановкиР И далее, если в программе не слишком много различных символических адресов, то нетрудно написать программу, считывающую симво- лические команды по одной и выделяющую им последовательно места в памяти в соответствии с числом байтов в каждой команде. Естественно, при этом предполагается составление таблицы экви- валентов, например, а = 002100, Ь = 002006 и т. д., где каждый
17.2. Пример 581 адрес должен выражаться относительно регистра базы. При каж- дом появлении имени вычислительная машина, согласно таблице, присваивает ему соответствующий адрес. Начало эпохи автоматического программирования приходится на 1953 год. Программа, написанная в символической форме, называемая исходной программой, вводилась по-командно в вычис- лительную машину, а программа в машине, называемая программ мой-ассемблером, для каждой считанной команды перфори- ровала команду на машинном языке. Полученная таким образом программа могла затем вводиться в машину и выполняться. Различие между ассемблером и компилятором заключается в том, что ассемблер для каждой команды исходной программы перфорирует только одну команду в объектной программе, тогда как при работе компилятора, такого, как компилятор для Фор- трана, Кобола, PL/1, из одного исходного предложения полу- чается несколько команд. Это означает, что одно предложение, например для компилятора Фортрана, порождает больше команд, чем одно предложение для ассемблера. Однако, пользуясь ком- пилятором, мы лишаемся возможности контролировать каждую отдельную команду объектной программы, что вполне допустимо при написании символических программ. Иными словами, при символическом программировании можно делать то, что совсем нелегко при работе с компилятором, и поэтому символическое программирование позволяет иногда получать более эффективные программы. На IBM-360 символическое программирование исполь- зуется всегда, когда требуется выполнить нестандартный ввод или вывод (например, чтение перфокарт с двоичной информацией в колонках, чтение документов оптическим читающим устройст- вом и т. п.), или когда имеющиеся в распоряжении компиляторы выдают программу, требующую либо слишком много памяти, либо слишком много времени на выполнение. Часто на символи- ческом языке пишутся подпрограммы, используемые при работе с компиляторами. 17.2. Пример Если начисляется 1 процентов через определенный промежуток времени, общая сумма для 1 доллара через п таких промежутков вычисляется по формуле А = 1 (1 + i)n. На рис. 17.1 представ- лена блок-схема программы чтения величин п и i и печати таб- лицы общей суммы для 1 доллара через 1, 2, 3, . . ., п — 1 интервалов времени, по прошествии которых начисляются про- центы. Печатающаяся на выходе информация будет иметь еле-
582 Гл. 17. Язык Ассемблера Рис. 17.1. Начисление сложных процентов. дующий вид: ЬЬМЬЬЬЫ .003500 2 1.007012 До того как приступить к написа- нию команд, давайте определим необходимые нам области памяти. Нам в качестве констант нужны исходная сумма $ 001.000000 и 001, начальное значение п. Не- обходим также и шаблон для ре- дактирования: EDT 40202020 22402020 214В2020 20202020 ONN 0014- ONE 001000000+ Программа-ассемблер легко осуществляет включение в про- грамму операций ввода — выво- да; позже мы займемся этим, но сейчас давайте возьмем прог- рамму-монитор из разд. 4.5. Если в колонках 1—3 перфорируется п, а в колонках 4—9 перфори- руется i, то под область ввода следует отвести 9 байтов. NMAX хх хх хх. I .хх хх хх хх хх хх Область вывода будет LINE длиной 16 байтов Нам необходимы рабочие об- ласти N хх х + А ххх.х хххх х + KN хх х + R ххх.х хххх х + MPY рабочая область Упакованная Упакованная NMAX, упакованная R — 1 + i, упакованная длиной 10 байтов
17.2. Пример 583 Используя в качестве регистра базы регистр 11, можно написать следующую последовательность команд: Адрес Код операции Операнды S0 BALR В,0 S1 A2,9,NMAX ВС 8,S2 AF,0 S2 РАСК KN.NMAX РАСК R,I АР R,ONE MVC A,ONE MVC N,ONN S3 AD,1,0 S4 ZAP MPY,A МР MPY,R MVN MPY+6(l),MPY4-9 MVC A.MPY+2 MVC LINE.EDT ED LINE,N АР N,ONN СР N,KN ВС 2 SI AA,16,LINE ВС 8,S4 ВС F,S3 Длины всех операндов, входящих в команды, определяются длинами соответствующих полей, за исключением команды MVN, где длина задана в скобках явно. На следующем этапе надо подставить действительные машин- ные адреса. Предположим, что наша программа начинается с адреса 1638410 = 004000te (BALR поместит в регистр 11 число 004002). В нашу таблицу имен будут входить и длины соответ- ствующих полей, и адреса. Разместим в таблице сначала команды, затем константы, затем области ввода — вывода и, наконец, рабочие области. Все области размещаются одна за другой, хотя это и не обязательно. SO 004000 команда SI 004002 В 000 команда S2 00400C B00A команда S3 00402A B028 команда S4 00402E B02C команда EDT 00406E B06C С 16 ONN 00407E B07C Р 2 ONE 004080 B07E Р 5
584 Гл, 17. Яеык Ассемблера NMAX 004085 В083 С 3 I 004088 В086 С 6 LINE 004091 B08F С 16 N 0040А1 B09F Р 2 А 0040АЗ В0А1 Р 5 KN 0040А8 В0А6 Р 2 R 0040АА В0А8 Р 5 МРУ 0040ВО ВОАЕ С 10 В таблице указывается тип данных: Р для упакованных десятич- ных, С для символьных. За исключением двух полей NMAX и I, которые должны занимать смежные участки памяти, порядок имен совершенно произвольный. После I перед LINE мы совер- шенно произвольно пропустили три байта. Это не было вызвано никакой конкретной необходимостью. Теперь, руководствуясь составленной таблицей имен, мы в состоянии расписать команды. Каждый адрес в таблице, кроме SO, имеет эквивалент в терминах регистра базы, так что можно приступить к написанию программы в действительных адресах. 004000 05 ВО 004002 А2 09 В083 47 80 B00A AF 00 00400С F2 12 В0А6 В083 F2 45 В0А8 В086 FA 44 В0А8 В07Е D2 04 В0А1 В07Е D2 01 BO9F В07С 00402А AD 01 0000 00402G F8 94 ВОАЕ В0А1 FC 94 ВОАЕ В0А8 D1 00 В0В4 В0В7 D2 04 В0А1 ВОВО D2 OF B08F B06G DE OF B08F B09F FA 11 B09F В07С F9 11 B09F В0А6 47 20 В000 АА 10 B08F 47 80 B02G 47 F0 В028 Можно написать и константы: 00406Е 4020 2020 2240 2020 214В 2020 2020 2020 00407Е 001G 004080 0010 0000 ОС
17.3. Язык Ассемблера IBM-360 585 17.3. Язык Ассемблера IBM-360 В данной главе мы остановимся на трех версиях языка Ассем- блера: 1. OS уровня Е и OS уровня F. 2. TOS и DOS. 3. BOS и BPS. Кроме того, существует специальная версия, относящаяся к кар- точному варианту BPS, который наиболее похож на язык Ассем- блера модели 20. Эту версию мы рассматривать не будем. Ассем- блеры OS совершенно идентичны и отличаются лишь размером программ, которые они могут обрабатывать. Две версии TOS и DOS, рассчитанные на 16К, идентичны, но в TOS отсутствуют возможности работы с диском. Идентичны и BOS 8К (Диск) и BPS (Лента) с той разницей, что в версии BPS не могут исполь- зоваться диски. Если не принимать во внимание ввод — вывод, который рас- сматривается в гл. 18 и 19, то между тремя уровнями — OS, 16К и 8К — различия лишь второстепенные. Мы будем оговаривать их по ходу изложения. В Приложении J приводится перечень всех различий. Программы на языке Ассемблера пишутся обычно на спе- циальных бланках, таких, как на рис. 17.2. Колонки 1—8 опре- деляют метку, т. е. имя, присвоенное команде, константе или области, описывающейся в строке бланка. Колонка 9 не запол- няется. В колонках 10—14 помещается мнемонический код опе- рации. Колонка 15 не заполняется. В колонках 16—71 пишутся операнды, которые отделяются друг от друга запятой. За послед- ним операндом остается незаполненное пространство. На бланке можно писать примечания, но при этом они должны отделяться от последнего операнда по крайней мере одним пробелом. Колон- ка 72 называется колонкой продолжения; обычно ее не заполняют, но если в ней стоит какой-либо символ, отличный от пробела^ то это означает, что предложение продолжается на следующую строку. В этом случае первые пятнадцать колонок на следующей строке не заполняются, а продолжение записывается, начиная с колонки 16. Колонки 73—80 ассемблер не считывает. Как пра- вило, колонки 73—76 отводятся под идентификатор программы, а колонки 77—80 служат для нумерации по порядку перфокарт. В OS для продолжения разрешается пользоваться двумя строками. В версиях 8К и 16К допускается лишь одна строка Для продолжения. Ассемблер может иметь дело с четырьмя типами предложений. 1. Комментарии. Если в колонке 1 поставлена звездочда, 10 это означает, что все предложение является комментарием.
Рис. 17.2. Бланк программирования на языке Ассемблера.
17.4. Продолжение примера 587 Это предложение не обрабатывается, но печатается в листинге программы. Комментариями и примечаниями можно пользо- ваться совершенно свободно, без каких-либо ограничений, с тем чтобы листинг программы был как можно более понятным и чита- бельным. 2. Машинные команды. Каждое предложение этого типа порож- дает в объектной программе одну команду. Этот тип предложений отличается тем, что в поле кода операции—колонки 10—15—содер- жится мнемонический код операции из набора команд IBM-360. 3 Предложения управления трансляцией. Эти предложения имеют в поле кода операции специальный мнемонический код и в объектной программе никаких команд не порождают. Их упо- требляют для определения точки в памяти, начиная с которой помещаются команды, для выделения пространства под рабочие области и области ввода — вывода, для занесения в объектную программу необходимых констант и т. д. 4. Макрокоманды. Макрокоманда — это псевдокоманда, кото- рая вызывает помещение в объектную программу ряда действи- тельных команд. Макрокоманды используются главным образом для организации ввода — вывода. Правда, существуют и другие их применения. Например, они могут обеспечивать связь между программой пользователя и соответствующей программой IOCS. Ограничение, накладываемое на число строк продолжения, к макрокомандам не относится. 17.4. Продолжение примера Давайте вернемся к примеру из разд. 17.2 и посмотрим, как его можно записать на языке Ассемблера. В последующих разде- лах мы детально рассмотрим правила написания каждого пред- ложения. Начать можно с команды ICTL. Если ее нет, ассемблер будет считать, что соблюдается стандартная структура исходных карт. Следующей должна идти команда START. Она информирует ассемблер о том, где в памяти мы хотим поместить свои команды. ICTL 1, 71, 16 START 16384 Затем мы пишем команды SO BALR 11,0 USING *,11 USING — это еще одна команда управления трансляцией. Она информирует ассемблер о том, что во время выполнения объектной программы в регистре 11 будет находиться адрес,
588 Гл. 17. Язык Ассемблера присваиваемый следующей по порядку команде, а именно 16386ю = 00400210. Продолжим: SI DG Х'А209' DC S(NMAX) ВС 8,S2 DC X'AFOO' Предложение DC сообщает, что в данной точке программы должна быть помещена константа. Под константой типа S пони- мается константа длиной в полуслово, содержащая адрес имени, заключенного в скобки, в форме база-смещение (BDDD). Кон- станта типа X означает, что операнд задан в шестнадцатеричной форме. Пойдем дальше: S2 PACK KN.NMAX S3 PACK R,I АР R.ONE MVC A,ONE MVC N,ONN DC X'ADOIOOOO' S4 ZAP MPY,A После MP MPY,R MVN MPY+6(l),MPY4-9 MVC A,MPY + 2 MVC LINE,EDT ED LINE,N AP N,ONN CP N,KN BC 2,SI DC X'AAIO' DC S(LINE) BC 8,S4 BC 15,S3 всех машинных команд мы добавляем предложения управления трансляцией для отведения памяти под рабочие области и константы: EDT DC X'4020202022402020214B X 202020202020' ONN DC PL2'1' ONE DC PL5'1000000' NMAX DS CL3 I DS CL6 DS CL3 LINE DS CL16 N DS PL2
17.5. Термы и выражения 589 А DS PL5 KN DS PL2 R DS PL5 МРУ DS CLIO Три байта между I и LINE оставлены, как было сделано в нашем первоначальном примере. Символ Р определяет, что в поле нахо- дится десятичное число в упакованном формате, а С указывает символьную величину, причем каждая цифра, буква или знак занимает один байт. Символ L с последующим десятичным целым определяет длину соответствующего поля. DS используется для резервирования области памяти в объектной программе без заполнения этой области какими-либо значениями. При выпол- нении объектной программы начальное состояние таких областей не определено. И наконец, последним предложением каждой транслируемой программы должно быть END SO единственный операнд которого указывает адрес команды, кото- рая должна выполняться первой. При трансляции исходной программы ассемблер, если это нужно, выдаст листинг, содержащий исходную программу вместе с присвоенными адресами памяти и записанными в шестнадцате- ричной форме командами и величинами констант. В конце про- граммы печатается таблица символических имен, расположенных в алфавитном порядке. В некоторых версиях ассемблера запрещается использовать символические имена, начинающиеся с SYS, а также имена, начинающиеся с I и содержащие шесть или более букв и цифр. Поэтому для «безопасности» лучше избегать употребления таких имен. 17.5. Термы и выражения Символические имена, или просто имена, можно использовать, как уже говорилось в предыдущем разделе, в качестве имени команды или области данных. Имена содержат по крайней мере один и не более восьми символов. Первым символом должна быть обязательно буква; остальными могут быть буквы или цифры. Пробелы и другие специальные символы в именах запрещаются. Три символа $, # и @ ассемблер воспринимает как буквы. Это дает возможность использовать некоторые не английские алфа- виты. Допустимыми являются все приведенные ниже имена: UX56R L
590 Гл. 17. Яанк Ассемблера #3450999 RYIOPTYK Следующие имена недопустимы: 4RT (начинается йе с буквы) TT+R8 (содержит специальный символ) ABCDEFGHI (более восьми символов) IN AREA (содержит пробел) Говорят, что имя определено, если оно встречается в поле метки предложения. Каждое используемое в программе имя должно быть определено в некотором месте, причем в одной программе никакое имя не может быть определено больше чем один раз. Самоопределенный терм — это такой терм, величина которого заключена в нем самом. Длина самоопределенных термов не может превышать трех байтов. Десятичный самоопределенный терм — это десятичное целое число без знака, например 9, 73, 0, 4096. Внутри терма не должно быть ни запятых, ни точек. Ассемблер преобразует десятичное число в двоичное. Шестнадцатеричный самоопределенный терм имеет вид X'шестнадцатеричные-цифры9, например, Х'8', X'4E56DF\ X'FFF6'. Каждые две шестнадцатеричные цифры составляют один байт. Двоичный самоопределенный терм имеет вид В'бшпы', напри- мер В'00101110' — терм, определяющий восемь битов, составляю- щих один байт, и эквивалентный X '2Е'. Слева к десятичным, двоичным, шестнадцатеричным термам приписываются нули в нуж- ном количестве. Символьный самоопределенный терм имеет вид С'символы'. Можно использовать все символы, кроме кавычки и амперсенда (&). Если же нужно задать один из этих двух символов, то их необходимо написать дважды. Например, С'9"6' определяет трех- байтовый терм 9'6, a C'Y&&#' определяет терм Y&#. В сим- вольный терм может входить любой символ кода EBCDIC. Самоопределенные термы используются для указания адресов, номеров регистров и т. д. Литерал — это просто константа, непосредственно перед кото- рой стоит знак = , например литералами являются =X'F1\ =С'9Х' и = В'ОИ'. Встречая литерал, ассемблер создает константу с величиной, определяемой литералом, а в то поле операнда, где записан литерал, помещает адрес константы.
17.5. Термы и выражения 591 Терм — это общий термин, применяемый к имени, литералу или самоопределенному терму. Выражение — это комбинация термов, связанных посредством знаков * (для умножения) и / (для деления). В выражении могут быть использованы скобки в соответствии с правилами алгебры. • В OS допускается до пяти уровней скобок; 16К разрешает использование трех уровней; 8К — только одного. • В OS выражение может содержать максимально до 16 тер- мов; 16К допускает в выражении до восьми термов; 8К — лишь три. Для составления выражений существуют следующие правила. 1. Выражение не может начинаться с символа операции. Недопустимым будет считаться выражение —7 + А, но выраже- ния 0 — 7 + А или А — 7 считаются допустимыми. 2. В выражении не могут стоять подряд два символа операций или два терма. Недопустимыми будут считаться выражения д (В — 2) и 5* — А. Обратите внимание на то, что выражение А (В — 2) совсем не означает, что два терма здесь перемножаются. Если необходимо выполнить умножение, следует записать: А* (В - 2). 3. Использование литералов в выражениях, содержащих более одного терма, запрещено. Таким образом, команда L 8,=X'0014F008' допускается, а L 8,==X'0014F008'+14 считается неверной. 4. При делении берется только частное, остаток отбрасы- вается и округления не производится. Деление на нуль ошибкой не считается, результатом такого деления будет нуль. 5. Результат вычисления выражения не может превышать 224 — 1, но промежуточные результаты могут достигать величины 231—1. Выражение называется абсолютным. если при перемещении программы в памяти его величина не меняется. Выражение назы- вается перемещаемым, если его величина при перемещении" про- граммы меняется. Например, если PD есть имя команды, то выра- жение PD + 7 будет перемещаемым, а выражение 876 будет абсо- лютным. Но если РЕ есть имя какой-либо другой команды из этой же программы, то выражение PD — РЕ + 86 будет абсолютным. Если в абсолютное выражение должны входить перемещаемые термы, то они должны в него входить попарно и таким образом,
592 Гл. 17. Язык Ассемблера чтобы погасить эффект перемещения. Операции умножения и деле- ния над перемещаемыми термами осуществляться не должны. В перемещаемых выражениях всегда содержится нечетное число перемещаемых термов. Для облегчения обращения к адресу текущей команды в каче- стве первого терма выражения пишется звездочка. Под ней пони- мают адрес самого левого байта команды. При этом условии звез- дочку как знак операции умножения невозможно спутать со звез- дочкой в указанном выше смысле. Например, в выражениях *+7, *+PD — РЕ и ♦—4 под звездочкой понимается содержи- мое счетчика адреса, а в выражении 7* (PD — РЕ) звездочка означает операцию умножения. При написании программ на языке Ассемблера выражения используются только для вычисления адресов. Обычно адреса очень просты. Например, в разобранном примере самыми слож- ными были выражения MPY + 6, MPY + 9 и MPY + 2. 17.6. Команда USING Первой командой в программе для IBM-360 стоит, как пра- вило, команда BALR г,О где г определяет регистр, который впоследствии должен исполь- зоваться в качестве регистра базы. При написании программы программист определяет адреса по отношению к этому базовому адресу. В длинных программах может понадобиться два или боль- ше регистров базы. Поскольку команда BALR иногда исполь- зуется для связи подпрограмм, а не для установки регистров базы, ассемблер не имеет способа определить, какие регистры являются базовыми и каково их содержимое. При желании про- граммист может вообще в каждом операнде указывать свой регистр базы, но при этом возникает очень много писанины. Предложение управления трансляцией вида USING v,rlv . .,гп информирует ассемблер о том, что в общем регистре содержится значение v, где v — абсолютное или перемещаемое выражение, что в регистре г2 содержится значение v + 4096, в г3 значение v + 8192 и т. д. • В 8К максимальное значение п равно 5; в 16К и OS макси- мальное значение п равно 16. Если в качестве операнда в USING определяется регистр 0, то он должен быть записан на месте гь a v должно быть переме-
17.6. Команда USING 593 щаемым выражением. Ассемблер в этом случае будет считать, что в регистре 0 находится 0, в регистре г2 находится 4096. Зна- чение v здесь не будет играть никакой роли. В примере из разд. 17.4 предложение USING *,11 сообщает ассемблеру, что в регистре И содержится текущее зна- чение счетчика адреса, иными словами, следующий по порядку незаполненный байт, и что регистр 11 можно использовать в каче- стве регистра базы. В том случае, когда используется несколько регистров базы, выбирается тот регистр, который содержит наименьшее из всех возможных значений. Последовательность предложений START 8192 BALR 11,0 USING *,11,10 LR 10,11 АН 1O,=H'4O96' сообщает, что в регистре 10 содержится 8194 4- 4096 = 12 290, а в регистре 11—8194. При формировании адреса перехода в следующих двух командах С ABC,DEF ВС 8,*4-8 будет использоваться регистр 11. Но если бы была написана команда ВС 8,♦4-4094 то в качестве регистра базы использовался бы регистр 10, так как *4*4094 = 8208 4* 4094 = 12302, а самым большим адресом памяти, который можно указать с помощью регистра 11, является 8194 4- 4095 = 12289. Разница между базовыми адресами исполь- зуемых регистров базы составляет обычно 4096, но это совсем необязательно, например следующая последовательность пред- ложений А1 START 8192 BALR 11,0 USING *,11 LA 9,4000 AR 9,11 USING 4000-j-Al ,9 означает, что в регистре И находится 8194, а в регистре 9—12 194. Для адресов памяти от 12 194 до 12 289 ассемблер всегда будет использовать в качестве регистра базы регистр 11 38 Зак. 15635
594 Глг. 17. Язык А ссемблера Можно запретить использовать регистр в качестве регистра базы с помощью предложения DROP ri, .. . гп где каждый указанный в поле операнда регистр считается запре- щенным к использованию до тех пор, пока он не встретится в поле операнда нового предложения USING. • В 8К максимальное значение п равно 5; в 16К и OS оно равно 16. Важно уяснить себе тот факт, что предложение USING ни в какой регистр ничего не помещает. Оно лишь информирует ассемблер о том, что к тому времени, когда объектная программа будет выполняться., программист уже позаботится, чтобы указан- ные регистры содержали определенные числа. 17.7. Машинные команды Все команды формата RR (за исключением команд SPM и SVC) имеют вид OP Ri,R2 На языке Ассемблера эти команды записываются так! Имя ОР г<,г2 где ri и г2 - абсолютные выражения, принимающие значения от 0 до 15 включительно. Ассемблер отыскивает такие ошибки, как указание регистра с плавающей точкой с нечетным номером или указание нечетного регистра п в команде умножения. Если обнаруживается ошибка, то в листинге программы печатается сообщение об ошибке. Для команды SPM, поскольку в ней R2 не используется, команда выглядит просто Имя SPM ri и для команды SVC Имя SVC I где j — абсолютное выражение со значением от 0 до 255 вклю- чительно. Все команды формата RX имеют такое машинное представ- ление: OP Ri, Х2, В2, D2 а соответствующая команда на языке Ассемблера выглядит сле« дующим образом: имя OP ri,D2 (Х2|В2)
17.7. Машинные команды 595 где ri — абсолютное выражение, a D2'(Х2,В2) определяет второй операнд. D2 должно быть абсолютным выражением. Если D2 = О, то 0 опускать нельзя, так как оператор вида ОР г1((Х2,В2) воспринимается как ошибочный. Если Х2 = 0, то на месте Х2 следует писать 0. Если и Х2 и В2 равны 0, то можно опустить все, что записывается в скобке: OP ri,D2 Когда ассемблеру посредством оператора USING указан регистр базы, программист может доверить ассемблеру расщепить адрес на две части D2 — В2 и Х2. В этом случае команда запишется так: имя • OP rt,S2(X2) или, если Х2 = 0, сокращается до вида имя OP rj,S2 Ассемблер вычислит значение выражения S2 и разобьет его на базу и смещение. В том случае, если адрес нельзя выразить, используя какой-либо из регистров базы, указанных в предло- жениях USING, появляется сообщение об ошибке. Команды ВХН, BXLE, LM и STM имеют вид OP Ri,R8,B2,D2 На языке Ассемблера они выражаются в виде имя OP r1,rs,D2(B2) или имя OP r!,r3,S2 В командах сдвига Rs не используется, поэтому соответствую- щие команды на языке Ассемблера пишутся так: имя OP ri,D2(B2) имя OP Ti,S2 Команды формата SI имеют следующий общий вид OP I2,Bi,Di во команды на языке Ассемблера пишутся так: имя OP Di(Bi),I2 имя OP Si,I2 Следует отметить, что в командах на языке Ассемблера операнды пишутся в своем логическом порядке, а не в том, в котором они 38*
596 Гл. 11. Язык Ассемблера оказываются в машинной команде. Для тех команд формата SI, в которых байт непосредственных данных не используется, команды пишутся следующим образом: имя OP Di(Bi) имя OP Si Команды формата SS, в которых указываются длины двух операн- дов, в машине имеют вид OP l1,l2,b1,d1,b2,d2 а на языке Ассемблера пишутся так имя OP Di(Li,Bi),D2(L2,B2) имя OP Di(Li,Bi),S2(L2) имя OP Si(Li),D2(L2,B2) имя OP Si(Li),S2(L2) Если длина операнда может быть определена по его имени, то ука- зание длины можно опустить и адрес сокращается до D (,В) или S Такой способ задания длины операнда будем называть неявным. Операнды длины в машинной команде заключены между 0 и 15 и на единицу меньше действительной длины поля. На языке Ассемблера в качестве длины указывается действительная длина поля, т. е. полное число байтов в поле, и значения длины заключе- ны между 1 и 16. Автоматическое вычитание единицы происходит при трансляции. Для тех команд формата SS, в которых задается только одна длина, машинный формат имеет вид: OP L,Bi,Di,B2,D2 Операнд длины на языке Ассемблера записывается как часть первого операнда: имя OP Di(L,Bi),D2(B2) имя OP Si(L),S2 ’ имя OP Di(L,Bi),S2 имя OP Si(L),D2(B2) Если длина опущена, то запись выглядит так: имя OP Di(,Bi),D2(B2) имя OP Si,S2 и т. д. При этом ассемблер будет использовать неявную длину первого операнда.
17.7. Машинные команды 597 Когда в операнде используется выражение, неявной длиной будет длина поля с первым именем в этом выражении. Таким образом, если XY7 — имя поля длиной в 8 байтов, a XY5 — имя поля длиной в 4 байта, то MVC XY5.XY7 имеет неявную длину 4 байта; при трансляции в машинной коман- де появится D2 03 . . . Команда MVG XY5—XY74-9000,XY7 также имеет неявную длину 4 байта, поскольку XY5 — это пер- вый терм в выражении для первого операнда. В Приложении J приводятся все сведения об операндах в ко- мандах на языке Ассемблера. Поскольку команда ВС употребляется довольно часто и про- граммисту приходится запоминать, какие биты маски следует установить, чтобы получить нужное условие перехода, суще- ствуют расширенные мнемонические коды операции. Ддя команды BCR имеется два мнемонических кода операции BR г2 NOPR г2 которые эквивалентны: BCR 15, г2 BCR 0,г2 В том случае, когда пишется расширенный мнемонический код, необходим лишь один операнд, тот, который на самом деле являет- ся вторым. Для команды ВС имеется четырнадцать расширенных мнемо- нических кодов. Список их приведен в Приложении J. В них входят ВН BNZ BE BNM которые эквивалентны ВС 2, ВС 7, ВС 8, ВС 11,
598 Гл. 17. Язык Ассемблера и употребляются обычно для. осуществления перехода при усло- вии: «больше», «не нуль», «равно», «не минус». Упражнения № 43 Что получится в поле Y в следующей программе? START 8192 S BALR 11,0 USING ♦,11 L 7,Х M 6,Х4-4 SR 6,7 ST 6.Y DC X'AFOO X DC F'3' DC F'7' Y DS F END S где F указывает константу или поле памяти длиной в слово. 2. Что произойдет, когда следующая программа будет рабо- тать на машине IBM-360 с объемом памяти 65536 байтов? START 8192 G BALR 11,0 USING •,11 LM 6,9,W SR 7,6 H ST 9,0(7) BXH 8,6,H DC X'AFOO' W DC F'—4' DC F'65536' DC F'16384' DC F'0' END G 3. Дано: X DS F Y DS F Написать ряд команд, необходимых для записи в поле Y величи- ны ЗХ2 — 7Х + 4. Считается, что | X | 3000. 4. Написать подпрограмму, которая в регистре 1 получает положительное целое число, а квадратный корень из этого числа помещает в регистр 0. Выход из подпрограммы осуществляется переходом по адресу, находящемуся в регистре 14. Для вычисле-
17.8. Константы 599 ния квадратного корня используйте метод Ньютона, положив Y _Xn N Лп+1— 2 2ХП где Хо = 1, a N — число, корень квадратный из которого вычи- сляется. Для вычисления используется итерационный процесс. По данной формуле вычисляется Xi, затем по полученному Xi вычисляется Х2 и т. д. Процесс продолжается до тех пор, пока полученные значения X не станут равными с точностью до уста- новленной заранее погрешности. Получить в дайной задаче ответ с точностью до ±1. 5. Изменить упр. 4 таким образом: поместить 0 в регистр О, если N не положительно, и восстановить все используемые в про- цессе вычисления регистры, за исключением регистров 0 и 15. (Указание: в качестве регистра базы использовать регистр 15.) 17.8. Константы В объектную программу константы вносятся с помощью предложения управления трансляцией DC. Формат ее такой: имя DC операнды Если в поле метки указано имя, то ему присваивается значение, равное адресу самого левого байта поля, занимаемого констан- той. Если предложение определяет более одной константы, то имя относится к первой из них. К простейшему виду констант относятся символьные констан- ты, которые имеют вид С* символы' Под эти константы отводится поле с числом байтов, равным числу написанных символов. Следовательно, константа C'EXAMPLE NO. Г займет поле длиной 13 байтов, и в это поле константа будет поме- щаться как часть объектной программы. Перед константой ста- вится буква С, указывающая тип. Сама константа заключена в одинарные кавычки. Для того чтобы записать символ 9 или &. в константе, пишут два таких символа подряд, считая их за один символ, например C'B&&D СО/ C'CAN' "Г определяют константы B&D СО. и CAN'T длиной соответственно ' и 5 байтов. Константу типа С можно записать и в форме CLn' символы'
600 Гл. 11. Яаык Ассемблера где Ln указывает длину поля, которое отводится константе. Если число записанных в константе символов превышает п, то использоваться будут лишь самые левые из них; если число записанных в константе символов меньше п, то справа от послед- него символа добавляются пробелы. Таким образом, C'B&&D СО.' определяет константу длиной 7 байтов, CL9*B&&D СО/ определяет константу длиной 9 байтов B&DbCO.bb, а CL5'B&&D СО/ определяет константу длиной 5 байтов B&DbC. Перед буквой С может стоять коэффициент кратности констан- ты, при этом общая форма записи такова: с1СЬп'символы' Данная запись порождает d идентичных констант в последова- тельных полях памяти. Когда d не задано, считается, что d — 1; если d = 0, никакой константы в программе не появится и память ей не отводится, например DC 3CL4'ABCDEF' определяет три константы, каждая длиной 4 байта. В памяти будет записано ABCDABCDABCD Аналогичным образом DC 3C'ABCDEF' определяет три константы длиной по 6 байтов. В памяти будет ABCDEFABCDEFABCDEF Константа типа X похожа на константу типа С, за исключением того, что программист записывает константу шестнадцатеричны- ми цифрами. Если необходимо добавление нулей, то нули добав- ляются слева, например DC XL3'0112' определяет константу длиной 3 байта 00 01 12, а DC 3XL2rC4' определяет три константы длиной по 2 байта каждая. При этом в памяти будет 00С400С400С4
17.8. Константы 601, Если длина не указывается, ассемблер пользуется той кратчайшей длиной, которая охватывает все записанные в константе шест- надцатеричные цифры, включая старшие нули. Максимальная длина констант типа С и X — 256 байтов. Константа типа В аналогична константе типа X, за исключением того, что записывается она двоичными, а не шестнадцатеричными цифрами. Следовательно, DC 2BL2'U000100' эквивалентно DC 2XL2'C4' Константы типа Z используются для определения десятичных констант в зонном формате. Определяются они следующим обра- зом: DC dZLn'±KOHCTaHTaif . . . ±константак. Если d не задано, считается, что оно равно 1. Если нет указа- ния длины, она считается равной числу цифр в константе. В зави- симости от того, положительна константа или отрицательна, она транслируется с зоной С или D в младшем разряде. Константа без знака считается положительной. В константы могут входить и десятичные точки, но ассемблером они игнорируются. Если определяется более одной константы, то их разделяют запятыми, и при этом все константы располагаются в смежных участках памяти. Если задана длина, она относится ко всем константам в предложении. Усечение или дополнение констант нулями производится слева. Дополнение нулями делается также в зонном формате, например DC 2ZL3'45,—3,4-7896' при трансляции порождает три константы, которые шестнадца- теричными цифрами записываются следующим образом: F0F4C5 F0F0D3 F8F9C6 Затем вступает в действие коэффициент кратности и в памяти будет шесть констант, занимающих 18 байтов: F0F4C5F0F0D3F8FF9C6F0F4C5 . . . Предложение DC Z'45,—3,4-7896' также порождает три константы, но длины они имеют различные: F4C5 D3 F7F8F9C6. Все вместе они занимают 7 байтов.
602 Гл, 17, Язык Ассемблера Константа типа Р аналогична константе типа Z, но эта кон- станта транслируется как десятичная в упакованном формате, а не в зонном. Максимальная длина констант типа Р и Z — 16 байтов. Если в константе типа Р или Z стоит десятичная точка, ее просто игнорируют. Следовательнд, DC Р'56.7' транслируется в двухбайтовую константу 56 7С Двоичные константы с фиксированной точкой определяются как константы типа Н и F. Если длина не задана явно, то константы типа Н транслируются как полуслова и в памяти помещаются, начиная с границы полуслова; константы типа F транслируются как слова и в памяти помещаются, начиная с границы слова. Если длина задана явно, то границы слов или полуслов не соблю- даются. Для выхода на границу пропускается нужное число бай- тов. В частности, запись вида DC OF'34' при трансляции не порождает никаких констант, но вызывает продвижение счетчика адреса к ближайшей границе полного слова. В кавычки заключается десятичная константа, которую ассем- блер переводит в двоичную. Например, DC Н'34' транслируется в двоичную константу, занимающую полуслово 00 22 Аналогичным образом DC 2F'19' транслируется в 0000 0013 0000 0013 Для констант типа Н и F, кроме длины, может указываться масштаб и экспонента. Масштаб имеет вид Ss, где s определяет число разрядов, представляющих дробную часть двоичного числа. Если масштаб не указан, константа транслируется как целое число. Экспонента задается в виде Ew и вызывает умножение константы на 10w перед переводом ее в двоичную. Общая форма определения констант типа Н и F представляет собой: DC dFLnSsEw'KOHCTaHTai, . . ., константа/
17.8. Константы 603 Все элементы определения константы записываются в указанном порядке. Если десятичной точки нет, число считается целым. Приведем примеры: Операнд FS2E1'1.25' FS2'12.5' F'12.5' FS1'12.5' FE—1'125' FE—1'120' FS—4'120' Оттранслированные константы 0000 0032 0000 0032 0000 000C (дробная часть отбрасывается) * 0000 0019 0000 ОООС 0000 ОООС 0000 0007 В большинстве случаев константы типа F и Н записываются без масштаба и экспоненты. Область значении масштаба заключена в интервале от —187 до +346. Экспонента должна заключаться в интервале от —85 до +75. Максимальная длина констант типа F и Н — 8 байтов. Константы с плавающей точкой определяются как константы типа Е и D. Константы типа Е определяют четырехбайтовые числа с плавающей точкой, а константы типа D определяют числа с плавающей точкой длиной в двойное слово. Если длина не ука- зывается явно, то происходит автоматическое размещение кон- станты с границы слова (Е) или двойного слова (D). Если длина задается явно, ее значение не должно превышать 8 байтов. Так же как и при определении констант типа Н и F, допускается задание экспоненты. Можно использовать и масштаб, но следует отличать его от масштаба, задаваемого при определении констант Типа Н и F. Допускается только положительный масштаб. После представления данных в виде чисел с плавающей точкой масштаб, значение которого заключено в интервале от 0 до 14, вызывает сдвиг мантиссы вправо на число шестнадцатеричных разрядов, равное значению масштаба. Следовательно, при наличии ненуле- вого масштаба ассемблер создает ненормализованное число. Иногда возникает необходимость в определении константы или ряда констант, которые не занимают целое число байтов. С помощью модификатора длины можно задать длину в битах. Если модификатор длины записан в форме L.n, то это означает, что длина указана не в байтах, а в битах. Если определяется несколько констант, то каждой константе отводится п двоичных разрядов, и размещаются они вплотную друг за другом. Первая константа записывается в память, начиная с границы байта. Если последняя константа полностью последний байт не занима- ет* остаток его заполняется нулями, например DC FL.12'83, — 3,7.2*
604 Гл. 17. Язык Ассемблера порождает следующие три константы (шестнадцатеричные цифры): 053 FFD 007 Поскольку каждая константа занимает 12 битов (3 шестнадца- теричные цифры), в памяти последний байт будет дополнен нулями: 05 3F FD 00 70 Длина в битах может указываться для констант типа Н, F, Е> D, Z, Р и В. Модификатор длины, масштаб и экспонента представляют собой либо десятичные самоопределенные термы, либо выраже- ния. Выражения заключаются в скобки. • В системе 8К для представления модификатора длины, масштаба и экспоненты выражения использовать нельзя. • Указание длины в битах допускается только в OS. • В OS в одном предложении DC можно записывать несколь- ко операндов. Это равносильно нескольким предложениям DC: например DC F'67' DC D'—456.78' можно объединить в DC F'67',D'—-456.78' 17.9. Адресные константы Константы типа А. Форма их представления: АЬп(выра- жение). Величина выражения вычисляется и запоминается как двоичное целое число. Если не указана длина, то константа запо- минается как слово, помещенное на границу слова. Значение выражения может быть как абсолютным, так и перемещаемым, но в последнем случае длина должна быть 3 или 4 байта. Если задан модификатор длины, граница не соблюдается. Если в выра- жении используется звездочка, она представляет первый из бай- тов, отведенных константе. Одним операндом может определять- ся несколько констант. В этом случае выражения отделяются запятыми. Если звездочка используется в одном из выражений, то она представляет самый левый байт данной константы. Следо- вательно, DC А(*4-4,*4-20) определяет две константы 0000 0604 и 00000 0618, если считать, что расположатся они начиная с 0000 0600 и с 0000 0604.
17.10. Определения данных 605 Константы типа V. Они похожи на константы типа А с той лишь разницей, что выражение обязательно должно быть пере- мещаемым. Константы типа V сочетают в себе константы типа А и неявное определение символического имени как внешнего, что дает возможность одним программам осуществлять переход к другим программам по адресу, задаваемому константой типа V. Константы типа Y. Аналогичны константам типа А с той разницей, что их неявная длина 2 байта, и помещаются они на границу полуслова. Если выражение перемещаемое, то длина должна быть 2 байта, а в общем случае так же, как для кон- станты типа А, длина может быть от .1 до 4 байтов, так и для кон- станты типа Y она может быть от .1 до 2 байтов. Константы типа S. Длина констант этого типа всегда 2 бай- та, а сама константа представляет собой адрес в форме база — смещение. Выражение имеет следующий вид: S (смещение (база)), например S(12 (1)) означает, что в качестве регистра базы взят регистр 1, а смещение равно 12. Транслироваться такая константа будет в 100С. Если в самой константе нет указания базы, то ассем- блер выбирает регистр базы таким же образом, как и в случае, когда адрес стоит в команде. Константы типа S могут быть и абсо- лютными, и перемещаемыми. • В 8К для констант типа S коэффициент кратности не дол- жен отличаться от 1. • В 8К в адресной константе не разрешено определение нескольких констант. Использование констант типа Y обычно ограничено машина- ми с объемом памяти, не превышающим 32К, поскольку полу- слово не может вместить больший адрес. Принципиальное исполь- зование констант типа S иллюстрируется в приведенных уже в этой главе примерах. Константы типа V используются при напи- сании подпрограмм, где они содержат адрес входа в программу. 17.10. Определения данных Кроме DC, которые помещают константы в программу, полез- но иметь возможность определить имя области памяти для ввода — вывода, рабочей области и т. п., не заботясь о первоначальном се содержимом. Предложение определить память, имеющее вид имя DS операнды аналогично предложению DC с той лишь разницей, что во время загрузки программы в указанную область никакие данные не загружаются. Операнды записываются так же, как и в пред-
606 Гл. 17. Язык Ассемблера ложении DC, но если задана длина операнда, то константу писать нет необходимости. Если длина не указана, то для определения количества резервируемых байтов ассемблер будет использовать константу. Если и длина не задана, и константа не задана, то резервируется 1 байт для констант типа С, X, В, Z и Р; 2 байта — для констант типа Н; 4 байта для констант типа F и Е и 8 бай- тов — для констант типа D. Адресные константы в предложе- ниях DS задавать нельзя. Типичными предложениями DS являются ABC DS F ACG DS 7Н ARD DS CL240 BRT DS С79&&80' АВС вызывает резервирование 4 байтов, начиная с границы слова. ACG резервирует 14 байтов, начиная с границы полуслова. Обратите внимание на то, что неявная длина ACG равна двум байтам. ARD резервирует 240 байтов без соблюдения границ. BRT резервирует 5 байтов. Ассемблер по предложениям DS только резервирует области памяти, не заполняя их какой-либо конкретной информацией. Поэтому программист не должен делать никаких предположений относительно того, что будет в этих областях при загрузке объект- ной программы в память. В частности, не следует думать, что зарезервированные области памяти будут содержать нули. Совер- шенно аналогично, ассемблер никаких данных не помещает в те байты, которые пропускаются при выходе на нужную границу. К важным случаям использования операторов DS относится употребление их только для выхода на требуемую границу: BRT KL KPR DS С'79&&80' DS 0D DS C'STS.' Поскольку константы типа D размещаются с границ двойного слова, поле KPR будет начинаться с границы двойного слова. Есть еще одно различие между операторами DC и DS. В опе- раторе DS для полей типа С и X максимально можно указывать длину до 65535 байтов, а в аналогичном операторе DC максимум не должен превышать 256 байтов. У читателя может возникнуть вопрос, зачем же писать кон станты в предложении DS. Причина здесь проста: программисту гораздо легче во многих случаях записать саму константу, а не считать количество байтов, которое надо зарезервировать для этой константы. Чаще DS состоит просто из коэффициента крат- ности, типа константы и — в случае типа С, X или В — из ука- зания длины.
11.10. Определения данных 607 Большое значение имеет восьмибайтовая константа CCW, для задания которой в языке Ассемблера предусмотрено специаль- ное предложение: имя CCW операция,адрес,признаки,счетчик Оно помещает команду канала (Channel Command Word) на гра- ницу двойного слова. Записанная в нем операция — это абсолют- ное выражение, определяющее байт кода операции команды канала; адрес — абсолютное или перемещаемое выражение, опре- деляющее в байтах,1, 2, 3 CCW адрес данных; признаки — абсо- лютное выражение, определяющее состояние битов признаков в байте 4; счетчик — абсолютное выражение, определяющее в байтах 6 и 7 общее число байтов данных. Например, предло- жение CCW NJK CCW X '20',RDINAR,0,80 можно использовать для считывания 80 колонок с карты в область памяти с адресом RDINAR. Метка (имя) оператора CCW используется при формировании адресного слова канала CAW: DC А(имя) В CCW байт 5 всегда нулевой. Упражнения № 44 1. Написать на машинном языке программу, порождаемую при трансляции исходной программы из упр. 43.1. 2. Написать программу на языке Ассемблера, которая по зна- чению целого неотрицательного числа N, помещенного в регистр 1, создает поле длиной 100 байтов, начиная с символического адреса LOC. Содержимое поля определяется следующим образом: если N 100, все поле состоит из пробелов, в противном случае туда заносится N пробелов, за ними ставится звездочка, и остаток поля заполняется 99 — N пробелами. Заканчивается программа переходом по адресу, содержащемуся в регистре 14. 3. В памяти находится следующая информация! 003400—05 Общий заработок 003406—0В Подоходный налог 00340С—11 Прочие налоги 003412—17 Удержания за госпитализацию Все данные представляют собой десятичные числа в упакован- ном формате. Написать программу вычисления получаемой на руки зарплаты. Результат поместить по адресу 003418—1D. 4. Приведенные ниже десятичные данные находятся в памяти в упакованном формате и каждая единица данных занимает шести-
608 Гл. 17. Язык Ассемблера байтовое поле. Если не оговорено специально, в каждом поле две цифры представляют собой дробную часть десятичного числа. 002500 Обычные часы работы 002506 Сверхурочные часы 00250С Обычная расценка (в дол/час; 4 цифры для дроб- ной части) 002512 Удержания за госпитализацию а 002518 Общий заработок Вычислить величину заработка, пользуясь всеми данными, и поме- стить его по адресу, указанному в упр. 3. Расценки за сверхуроч- ные часы выше обычных в 1.5 раза. 5. Написать программу, помещающую число N с плавающей точкой в регистр с плавающей точкой 0 (с обычной точностью), а в регистр 1 следующее: если | N | 109, то 0, а в противном случае целую часть N в формате с фиксированной точкой. 6. Изменить упр. 5 таким образом, чтобы целая часть N заня- ла восьмибайтовое поле и помещалась в регистры 0-— 1 как деся- тичное в упакованном формате. 7. Принято говорить, что А сравнимо с В по модулю С и записы- вать это в виде: A ss В (mod С), если А — В делится нацело на С, где А, В и С — целые числа. В математике доказано, что уравнение АХ В (modC) для X, удовлетворяющих условию 0 X С — 1, имеет един- ственное решение, если С — простое число. Написать на языке Ассемблера программу считывания чисел А, В и С и печати тех значений X в интервале 0 X С — 1, которые удовлетворяют уравнению. Первоначально, скажем, устанавливаем Т равным 1, а X = 0. Затем прибавляем к X единицу и умножаем Т на А; если произведение больше С, то вычитаем С из Т столько раз, чтобы остаток от вычитания стал меньше С. Заметьте, что это эквивалентно делению Т на С и отбрасыванию частного. В каче- стве числовых примеров взять: А = 3, В = 7, С = 13 и А = 13, В = 28, С = 69. 8. Написать на языке Ассемблера программу считывания карт, содержащих коэффициенты уравнения: ах2 + Ьх + С = 0 (mod m), и печати решений этого уравнения относительно х. Ограничиться трехзначными числами для а, Ъ, с и m и считать, что значения а, Ь, с находятся в интервале от 0 до m — 1 включительно. Все.
17.11. Предложения управления трансляцией 609 вычисления провести, используя двоичные числа с фиксирован- ной запятой. 9. Написать программу на языке Ассемблера, в которой из поля 003500—2 берется четырехзначное десятичное число в упакованном формате и делится на четырехзначное десятичное в упакованном формате из поля 003503—5. Частное помещается в поле 003506—8, а остаток — в поле 003509—13. 17.11. Предложения управления трансляцией В этом разделе мы рассмотрим ряд предложений управления трансляцией, иногда оказывающихся весьма полезными. . Эквивалентность (Equate). Формат оператора: имя EQU выражение Вычисляется выражение и полученное значение присваивается имени, заданному в поле метки. Имя будет абсолютным или пере- мещаемым в зависимости от выражения. Неявная длина имени считается такой же, как и у первого терма выражения. Ниже дан пример типичных случаев использования предложения REG3 EQU 5 ADCN EQU ABC+DEF—FHR USING *,REG3 MVI ADCN,X'56' Следующие четыре предложения предназначены для управления форматом печатного документа (листинга) ассемблера. Никакого влияния на объектную программу они не оказывают. Заголовок (Title). Формат предложения имя TITLE 'заголовок' В поле метки может быть до четырех букв или цифр, которые перфорируются в колонках 73—76 каждой выходной карты, исключая карты, полученные с помощью операторов REPRO или PUNCH. В поле"операнда можно записать до 100 символов, заключив их в кавычки. Содержимое поля операнда печатается в заголовке каждой страницы листинга до тех пор, пока не встре- тится другое предложение TITLE. С появлением каждого нового предложения TITLE листинг печатается с новой страницы. Новая страница (Eject). Формат предложения пробел EJECT пробел р появлением этого предложения следующая строка печатается, начиная с новой страницы. 39 Зак. 15635
610 Гл. 17. Язык Ассемблера Пропуск строк (Space). Формат предложения пробел SPACE пробел или десятичное целое С появлением этого предложения пропускается одна или более строк. Если в поле операнда стоит пробел, пропускается одна строка; если записано число, пропускается число строк, указан- ное этим операндом. Если предложение указывает число строк, превышающее количество строк, оставшихся до конца страницы, предложение SPACE равносильно предложению EJECT. Режим печати (Print Optional Data). Формат предложения пробел PRINT от одного до трех операндов Максимально можно записать три операнда, разделив их запя- тыми. Операнды выбираются из следующего списка: ON Печатается листинг программы OFF Листинг не печатается GEN Печатаются все команды, порождаемые макро- командами NOGEN Печатаются сами макрокоманды, а команды, порождаемые ими, не печатаются. DATA Печатаются полностью все константы NODATA Печатается только первая константа или толь- ко первые 8 шестнадцатеричных цифр констан- ты в зависимости от того, что из них короче. Предложение PRINT действует до тех пор, пока не встретится следующее предложение PRINT. Ассемблер всегда считает, что в начале программы стоит PRINT ON,NODATA,GEN Влияние предложений управления листингом распространяется только на листинг программы; объектная программа ими не затра- гивается. Существует девять предложений управления программой: Перфорация (Punch). Формат предложения: пробел PUNCH 'данные' Данные из поля операнда перфорируются на карту. • В 8К предложение PUNCH использовать не разрешается. Воспроизведение (Reproduce). Формат предложения пробел REPRO пробел С помощью этого предложения очередная входная карта воспро- изводится без изменения в объектной программе. Предложение
17.11. Предложения управления трансляцией 611 REPRO может стоять в любом месте программы, но, как правило, помещается оно в начале или в конце. Если объектная программа выводится на ленту или на диск, то в результате обработки предложений PUNCH и REPRO записи будут формироваться не на картах, а на ленте или диске. Основ- ное назначение этих предложений — вставить в определенные места в объектной колоде соответствующие управляющие карты для программы Редактора связей. При этом отпадает необходи- мость делать вставки карт вручную. Проверка порядка следования входных карт (Input Sequence Checking). Формат предложения пробел ISEQ пробел или L,R Номера колонок L,R определяют самую левую и самую правую колонки поля карты, которое следует просмотреть для того, чтобы убедиться, что карты расположены по порядку. Проверка порядка следования карт начинается с карты, следующей за предложением ISEQ и заканчивается после того, как встретилось предложение ISEQ с пробелами в поле операнда. Устанавливает- ся ограничение, что просматриваемые при проверке колонки не должны быть внутри поля предложения (обычно колонки 1—72). Проверяются, как правило, колонки 77—80. Управление форматом входных карт (Input Format Control). Формат предложения пробел ICTL Ь,е,с Ь указывает колонку, с которой начинается предложение исходной программы, обычно колонку 1. е указывает колонку конца предложения, обычно колонку 71. с указывает колонку продолжения, обычно колонку 16. Если с — пробел, ассемблер устанавливает, что карт продол- жения нет. Если е — пробел, ассемблер устанавливает, что колонкой конца является колонка 71. Если карты оператора ICTL нет, ассемблер как бы выполняет трансляцию такого пред- ложения: ICTL 1,71,16 Операнды предложения ICTL должны удовлетворять следующим условиям: 1 < Ь < 40 Ь < с < 40 41 < е < 80 Если е = 80, продолжать предложения уже нельзя. 39*
612 Гл. 17. Язык Ассемблера Копирование (Сору). Формат предложения пробел COPY имя Имя в поле операнда представляет собой имя набора данных из системной библиотеки. Данные с этим именем берутся из биб- лиотеки и помещаются в ту точку исходной программы, где написано предложение COPY. Это предложение позволяет хра- нить повторяющиеся куски программ в единственном экземпляре. • В 8К предложение COPY использовать нельзя. Последним предложением во всех программах на языке Ассем- блера должен быть END. Формат предложения пробел END пробел или перемещаемое выражение Если операнд задан, это означает, что после загрузки объектной программы первой будет выполняться команда с этим адресом. Основное назначение предложения END — информировать ассем- блер о том, что больше нет команд на языке Ассемблера, которые подлежат транслированию. В следующем разделе описаны еще три предложения управ- ления программой. 17.12. Счетчик адреса При трансляции программы делается два прохода по тексту исходной программы. Если имеется в распоряжении лента или диск, то когда в первый раз вводятся карты, они копируются на ленту или диск с тем, чтобы второй проход осуществлялся по тексту, взятому с ленты или диска. Это означает, что с картами придется иметь дело лишь один раз. Во время первого прохода ассемблер осуществляет анализ команд, констант и т. п., но не производит трансляции операндов машинных команд. В счетчик адреса устанавливается некоторое начальное значение — либо нуль, либо величина, указанная в карте START. Для каждого имени, входящего в поле метки предложения, определяется значе- ние по отношению к этой начальной величине, после чего имя вместе с найденным значением, длиной и пр. помещается в таблицу. С обра- боткой предложения содержимое счетчика адреса увеличивается на количество байтов команды, на длину константы или области памяти и т. п. Когда возникает необходимость пропустить какое-то количество байтов для выхода на нужную границу, соответствен- но изменяется и содержимое счетчика адреса. Счетчик адреса указывает всегда на первый свободный байт. С помощью предложения пробел ORG пробел или перемещаемое выражение
17.12 Счетчик адреса 613 можно задать новое значение счетчика адреса. Каково бы ни было значение перемещаемого выражения в поле операнда, оно не должно быть меньше начального адреса программы (иначе воз- никли бы затруднения с заданием значений базовых регистров). Примеры предложений: OBG *—240 ORG АВС+8 Если в поле операнда ничего не записано, значение счетчика адреса устанавливается равным величине, на единицу превышаю- щей наибольший адрес, отведенный программе до появления данного предложения. Таким образом, если после предложения ORG *-240 будет написано несколько команд, а потом появится ORG то произойдет восстановление счетчика адреса к тому состоянию, которое он имел перед предложением ORG *—240. • В 8К и 16К предложения ORG с пробелами в поле опе- ранда недопустимы. Во время обработки программы ассемблер накапливает встре- тившиеся литералы. Предложение имя LTORG пробел вызывает размещение массива литералов, встретившихся после предыдущего предложения LTORG или с самого начала про- граммы, начиная с первой доступной границы двойного слова. Если в поле метки задано имя, то оно запоминается в таблице имен вместе со значением, равным адресу первого байта массива литералов, и с характеристикой длины, равной единице. Литера- лы, встретившиеся после последнего предложения LTORG, раз- местятся в конце программы. Продвижение счетчика адреса можно проиллюстрировать на примере из разд. 17.4. Предложением START счетчик адреса устанавливается равным 16384, следовательно, S0 помещается в таблицу имен со значением 16384. С каждым предложением формата RR содержимое счетчика увеличивается на 2, поэтому в регистр базы 11 будет загружаться величина 16386. Содержимое счетчика увеличивается на 2 с оператором DC X'A209z и уве- личивается еще на 2 с константой типа S. Предложение ВС уве- личивает содержимое счетчика на 4, а затем' предложение DC — еще на 2. Следовательно, S2 помещается в таблицу имен со значением 16396 и т. д.
614 Гл. 17. Язык Ассемблера При втором проходе уже можно транслировать целиком всю команду, поскольку на этот р^з каждое имя в поле операнда уже определено. В том случае, когда вдруг встречается не опре- деленное имя, появляется сообщение об ошибке. Последнее предложение управления программой — Условное нет операции (CNOP — Conditional NO Operation). Формат пред- ложения пробел CNOP b,w где b,w = 0,4; 0,8; 2,4; 2,8; 4,8; 6,8. • В OS b и w должны быть абсолютными выражениями; • в 16К и 8К в b и w должны быть десятичными целыми числами. Если b,w = 0,4, то счетчик адреса устанавливается на первый байт слова; если b,w = 2,4, то на третий байт слова. Если w = 8, то счетчик адреса устанавливается на первый, третий, пятый или седьмой байт очередного двойного слова в соответствии со значе- нием Ь (Ь = 0, 2, 4, 6). Если содержимое счетчика адреса уже установлено на нужную границу, предложение CNOP ничего не меняет; в противном случае пропущенные байты заполняются командами NOPR, т. е. каждые два пропущенные байта запол- няются числом 0700. После предложений DG или DS может слу- читься так, что надо пропустить лишь один байт. В этом случае байт заполняется числом 00. Чтобы проиллюстрировать все сказанное, предположим, что содержимое счетчика адреса равно 8194. Тогда предложение CNOP 2,8 будет проигнорировано, поскольку счетчик адреса уже установ- лен на третий байт двойного слова. Но предложение CNOP 4,8 вызовет запоминание числа 0700 в поле 8194—5, а содержимое счетчика адреса станет равным 8196. Аналогично, предложение CNOP 0,8 вызовет запоминание трех чисел 0700, а содержимое счетчика адреса станет равным 8200, т. е. границе ближайшего двойного слова. Предложения CNOP используются главным образом для того, чтобы константы типа С или X, адреса которых встречаются в ко- мандах формата RX, при транслировании располагать на соответ- ствующих границах.
1У.13. Разделение программ на секции 615 17.13. Разделение программ на секции Чтобы минимизировать время, идущее на трансляцию боль- ших и сложных программ, желательно иметь возможность раз- бивать программу на секции и транслировать каждую секцию программы отдельно. Загрузка в память отдельных секций про- граммы и связывание их вместе для выполнения является функ- цией Редактора связей. Ассемблер дает возможность транслиро- вать и каждую секцию отдельно, и несколько секций программы вместе. Предложение START имеет вид имя START пробел или самоопределенный терм Операнд, если он написан, определяет предполагаемую (услов- ную) начальную точку программы или секции программы. Эта величина должна делиться на 8; в противном случае ассемблер будет пользоваться ближайшим большим адресом, делящимся на 8. Следовательно, предложение START 1802 будет рассматри- ваться как START 1808. Имя в поле метки команды указывает имя, под которым будет фигурировать программная секция. Если названия нет, значит у нас непоименованная программная секция. Если операнд опущен, ассемблер считает, что программа или программная секция начинается с адреса 0. Все адреса, опре- деляемые командой START, являются условными, так как Редак- тор связей может при необходимости переместить любую програм- му или секцию. Редактор связей может совершенно изменить ука- занный начальный адрес, хотя обычно такой необходимости не возникает, если адрес не нуль. А в том случае, когда в качестве начального адреса задан нуль, Редактор связей поместит про- грамму в память сразу за супервизором. Супервизор, который обладает возможностями обработки всех прерываний и всеми функ- циями ввода — вывода, занимает от 4000 до 15000 байтов памяти и более. Предложение START необязательно. Если его в программе нет, ассемблер считает, что действует предложение пробел START пробел иными словами, транслирует непоименованную программную секцию с началом отсчета в нуле. В каждой независимо трансли- руемой части программы может быть не более одного предложе- ния START, и перед ним не должно быть предложений, в кото- рых используется содержимое счетчика адреса. Предложение Определить программную секцию (Identify Control Section) имеет следующий формат: имя CSECT пробел
616 Гл. 17, Язык Ассемблера Если в поле метки ничего не написано, секция считается непо- именованной, в противном случае записанное имя присваивается всей секции, начинающейся с предложения CSECT. Команду START можно рассматривать как комбинацию предложений ORG и CSECT. Следовательно, предложение ABC START DEF эквивалентно двум предложениям ORG DEF ABC CSECT В программе может быть не более одной непоименованной секции. У всех остальных секций имена быть должны. Написав часть программной секции, программист имеет полное право прервать ее составление и вернуться к этой секции несколько позже. Для каждой программной секции ведется свой счетчик адреса. Все разбросанные в разных местах части одной программной секции должны начинаться предложением CSECT, имеющим одно и то же имя. Трансляция программы выполняется так, как будто каждая секция представляет собой единый кусок, независимо от того, на сколько кусков она фактически разбита. Несмотря на то, что имя секции может повторяться в пред- ложениях CSECT и START, это совсем не означает многократного определения имени. Это имя помещается в таблицу с характери- стикой длины единица и с адресом, равным адресу первого байта программной секции. Предложение Определить фиктивную секцию (Identify Dummy Section) имеет следующий формат: имя DSECT пробел Это предложение определяет написанную программистом секцию, которая рассматривается как обыкновенная программная секция с той лишь разницей, что в действительности она не занимает места в памяти. С помощью фиктивной секции удобно описывать структуру области памяти, а затем пользоваться описаниями, если возникнет необходимость обращений к этим областям. Пред- ложение DSECT всегда должно иметь имя. В начале фиктивной секции счетчик адреса устанавливается равным Нулю. Чтобы иметь возможность в какой-либо программной секции обращаться к предложениям фиктивной секции, программист должен опре- делить регистр базы USING х,регистр Где х _ имя DSECT, и позаботиться о томь чтобы в действитель- ности в регистр была загружена нужная величина. Рассмотрим
17.13. Разделение программ на секции 617 пример. Предположим, что при обработке файла используются попеременно две одинаковые области ввода. В основной програм- ме имеются определения этих областей. SCT1 START AR1 DS CL80 ПЕРВАЯ ОБЛАСТЬ ВВОДА AR2 DS CL80 ВТОРАЯ ОБЛАСТЬ ВВОДА SCT2 DSECT COL1 DS CL4 FLD2 DS CL17 FLD3 DS CL41 FLD4 DS CL18 Для того чтобы в основной программе SCT1 иметь возможность при желании обращаться к различным полям области ввода, пишется предложение USING SCT2,3 Если 3 есть номер регистра базы, то перед тем, как обращаться в область ввода, следует выполнить следующее: L 3,= A(AR1) или L 3,= A(AR2) в зависимости от того, какая из двух областей ввода нам нужна. Очень часто с введением фиктивных секций программирование значительно упрощается. В каждом сегменте программы с помощью предложения пробел СОМ пробел можно определить непоименованную общую секцию (Blank common control section). Предложение COM вызывает создание програм- мной секции таким образом, что это очень похоже на создание непоименованной фиктивной секции. Когда в память загружается объектная программа, Редактор связей помещает общую область, начиная с ближайшей границы двойного слова, после наиболь- шего адреса, используемого сегментами программы. Задавая предложение СОМ в каждом отдельно транслируемом сегменте программы, программист получает возможность обращаться к одним и тем же участкам памяти, используя в каждом сегмен- те свои имена. Объем общей области равен максимальному из объемов общих областей в каждом из сегментов программы. Когда сегменты программы транслируются отдельно, должна обеспечиваться возможность из одних сегментов обращаться
618 Гл. 17. Язик Ассемблера к именам, определенным в других сегментах. Делается это с помощью предложений ENTRY и EXTRN, имеющих форму пробел ENTRY vi, . . ., vn пробел EXTRN vi, . . ., vn где vi — перемещаемое имя. • В 8K n не должно быть больше единицы. Когда имя определяется в операторе ENTRY, то происходит следующее: ассемблер сообщает имя и его значение Редактору связей, а тот в свою очередь после перемещения сегмента пере- дает информацию о действительном значении любому другому сегменту программы, использующему это же имя в предложении EXTRN. Имена, указываемые в предложении ENTRY, не должны определяться ни в непоименованных программных секциях, ни в общих, ни в фиктивных секциях. Иными словами, все Vi можно определять только в поименованных программных секциях. • В OS и 16К общее число имен, упомянутых в предложе- ниях ENTRY, не должно превышать 100. В предложении EXTRN указываются имена, определенные в других сегментах программы, а используемые в качестве опе- ранда в данном сегменте. В предложении ENTRY указываются имена, определенные в этом сегменте, но используемые в качестве операндов в других сегментах. Наличие имени в адресной константе типа V эквивалентно записи этого имени в предложении EXTRN. Во всех остальных отношениях константа типа V по существу такая же, как и кон- станта типа А. Следует отметить тот факт, что большинство недлинных и не- сложных программ не требует разбиения на программные секции. Пишется одна секция и называть ее нет никакой необходимости. Те возможности языка, которые описаны в этом разделе, полезны при написании, главным образом, больших и сложных, программ. Упражнения № 45 1. Написать программу, которая осуществляет ввод (исполь- зуя программу-монитор из разд. 4.5) карты, содержащей четырех- значное целое х в колонках 1—4 и пятизначное целое у в колон- ках 5—9, и для каждой считываемой карты печатает строку, в которой находятся х, у и z, где z = р^х2 + у2, если у > 7х — 4 z = х + у, если у 7х — 4
17.13. Разделение программ на секции 619 z следует вычислять с точностью до целых. В качестве отдельной программной секции использовать программу упр. 43.4. 2. Указать ошибку, если она имеется, в каждом из приведен- ных ниже предложений: (a) ALPHA DS C8 (b) 2ВЕТА AP X,Y+2 (с) A x,x (d) GAMMA DS F'18000' (е) M 7,7*GAMMA+ 413 (f) DELTA DR 7,2 (g) SPIL@4 AW 2.XYR 3. Изменить упр. 1 таким образом, чтобы вычислять z для всех х и у с точностью до сотых. 4. В поле X три байта занимает двузначное десятичное число в упакованном формате. Его надо сложить с четырехзначным числом Y, а результат запомнить в поле Z. И Y, и Z — десятичные числа, занимающие по три байта, в упакованном формате. Если X + Y есть пятизначное число, то в поле Z следует запомнить лишь четыре старшие значащие цифры. Написать на языке Ассем- блера программу, производящую вычисления и передающую затем управление по символическому адресу PSTT. 5. Написать программную секцию для решения системы урав- нений Ах + By = С Dx + Еу = F Числа А, В, С, D, Е и F заданы в формате с плавающей точ- кой с обычной точностью. Решения системы (X и Y) представить также в формате с плавающей точкой с обычной точностью. Если АЕ = BD, a AF =/=CD, то решений не существует. Если АЕ = BD и AF = CD, то существует бесконечное множество решений. В обоих этих случаях положить X = Y = 0, а во всех осталь- ных отыскать единственное решение. 6. Написать программную секцию, в которой считываются карты, содержащие 6 десятизначных целых чисел; каждое число затем преобразовывается в нормализованное число с плавающей точкой с обычной точностью и запоминается в поле с адресами А, В, С, D, Е или F соответственна. 7. Пользуясь результатами упр. 44.5, написать програм- мную секцию,, в которой осуществляется печать строки, содержащей 8 полей для десятизначных целых чисел (между полями для удобства оставить некоторое пространство). После этого написать программную секцию, в которой считываются карты так, как описано в упр. 6, решается система уравнений
620 Гл. 17. Язык Ассемблера упр. 5 и печатаются ответы с использованием подпрограммы упр. 44.6. Все эти задачи скомпоновать в одной программе. 8. По адресу G имеется набор из 135 двоичных целых чисел длиной в слово, расположенных в порядке возрастания: G DC F'135' DC F'138' DC F'998764' DC X'FFFFFFFF' Написать программную секцию, в которой просматриваются последовательно с самого начала все записи таблицы до тех пор, пока не обнаружится число, превышающее аргумент поиска К, находящийся в регистре 2. Поместить в регистр 1 адрес макси- мального числа из таблицы, которое меньше К. 9. Переписать программу из упр. 8 так, чтобы поиск начи- нался с просмотра записи в середине таблицы, по которой опре- деляется, в какой половине таблицы находится отыскиваемое число. Затем проверяется запись в середине той половины, кото- рую мы выбрали для поиска. Процесс продолжается до тех пор, пока не будет получен ответ. Начертить сначала блок-схему программы. Такой метод поиска в таблице называется методом деления пополам. Для реализации его в программе требуется немного больше команд, но время, необходимое для поиска в боль- ших таблицах, при этом значительно сокращается. 10. Карта отперфорирована следующим образом: Поле 1 Колонки 1—10 Поле 2 Колонки 11—20 Поле 3 Колонки 21—30 Поле 8 Колонки 71—80 Каждое поле представляет собой следующее: х 4 колонки у следующие 5 колонок пробел последняя колонка в поле Написать фиктивную секцию, описывающую поле, а затем изме- нить упр. 1 так, чтобы осуществлялось считывание карт и после- дующая печать 8 строк для каждой считанной карты.
Глава 18 МАКРОКОМАНДЫ DOS 18.1. Программирование ввода — вывода Программирование любой операции ввода — вывода представ- ляет собой длинную и сложную задачу. Частично это относится и к составлению программ обработки ошибок ввода — вывода. Но в огромном множестве программ для ввода — вывода с любо- го конкретного устройства есть много общего. Отсюда следует, что работа программиста может быть значительно сокращена, если для осуществления всех операций ввода — вывода исполь- зовать стандартные программы. Чтобы в любую программу задачи поместить такую стандартную программу, необходимы три условия. 1. Соответствующая стандартная программа должна находить- ся в библиотеке программ. 2. Программист должен некоторым определенным образом указать характеристики набора данных с тем, чтобы CPU точно могло определить, какая нужна программа, какие значения присвоить параметрам и т. п. 3. Когда программисту понадобится осуществить операцию ввода — вывода, вместо обычного мнемонического кода операции ему надо будет написать код псевдооперации, по которому CPU определит, какую последовательность стандартных команд для этого надо поместить в рабочую программу. Эти коды являются кодами операций макрокоманд и представляют собой частные случаи использования средств макроязыка IBM-360, который кратко будет рассмотрен в разд. 18.19. К наиболее часто употребляемым макрокомандам относятся: OPEN, которая читает и проверяет или записывает метки на ленту/диск; CLOSE, которая обрабатывает хвостовые метки аналогично тому, как OPEN обрабатывает головные метки; GET, которая делает доступной программе следующую логи- ческую запись («дает» ее программе); PUT, которая вызывает вывод указанной логической записи;
622 Гл. 18. Макрокоманды DOS CNTRL, которая вызывает такие операции управления, как продвижение листа бумаги, выбор приемного кармана, перемотка ленты и т. п. В тех операциях ввода — вывода, которые мы здесь перечислили, программист не пишет CCW, поскольку они выдаются про- граммами IOCS (Input-Output Control System)—системы управления вводом — выводом. Эти программы занимаются блокиро- ванием и деблокированием записей, обработкой ошибочных ситуа- ций и вообще дают возможность программисту целиком сосредо- точить внимание на логических функциях своей программы, а не вдаваться в детали ввода — вывода. Эти программы состав- ляют логический уровень IOCS. Существует и другой уровень программ IOCS, который называется физическим уровнем IOCS. На физическом уровне IOCS программист сам пишет программу канала, и когда потребуется осуществить операцию ввода — вывода, в программе пишется макрокоманда, вызывающая выпол- нение программы канала. Программы физического уровня IOCS устанавливают CAW, если понадобится, имеют дело с ошибками и необычными ситуациями и даже обрабатывают метки. Вся ответ- ственность за детальность описания операций ввода — вывода ложится на плечи программиста. Физический уровень IOCS вообще большую часть работы возлагает на программиста. С другой стороны, именно физический уровень дает возможность делать такие вещи, которые невозможно осуществить на логиче- ском. Сюда относится такая обработка наборов данных, для которой нет стандартной программы на логическом уровне, здесь можно предусмотреть обработку некоторых типов ошибок и раз- ных необычных ситуаций. В IBM-360 используется как физиче- ский, так и логический уровень IOCS. Сначала мы познакомимся с логическим уровнем. 18.2. Определения файлов в DOS Для того чтобы можно было сгенерировать или включить в программу задачи стандартную программу IOCS для считыва- ния или записи какого-то файла, этот файл должен быть опреде- лен с помощью макрокоманды Определить файл (DTF — Define the File). Ниже дана типичная макрокоманда определения файла. CDIN DTFSR DEVICE=READ01, 1 BLKSIZE=80,WORKA=YES, 2 D EV ADDR == SYSRDR, 3 IOAREA1=XYZ, 4 RECFORM=FIXUNB, 5 TYPEFLE=INPUT, 6 EOFADDR=XWW
18.2. Макрокоманды для последовательных файлов 623 Для каждого набора данных пишется отдельная макрокоманда DTF. В BOS все определения файлов необходимо записывать перед командами' программы; перед макрокомандами DTF могут стоять лишь команды START, CSECT или ORG, а команды BALR и USING уже следует писать за ними. В TOS и DOS такого рода ограничений нет, но обычно ради удобства макрокоманды DTF группируются либо в начале, либо в конце программы. Макро- команда определения файла заставляет ассемблер вырабатывать константы и команды для связи программы пользователя со стандартной программой IOCS, которая может или генерировать- ся как часть программы пользователя, или подсоединяться к ней в процессе редактирования связей. Приведенная выше макрокоманда DTFSR определяет вход- ной файл на устройстве 2501 (READ01), где все 80 колонок (BLKSIZE = 80) каждой карты считываются с системного читаю- щего устройства (SYSRDR). Записи фиксированной длины, несбло- кированные (FIXUNB). В программе, написанной на языке Ассем- блера, программист резервирует 80-байтовую область с символи- ческим названием XYZ, которую IOCS будет использовать в качестве буфера. Каждая команда ввода будет указывать рабочую область (WORKA = YES) и вызывать пересылку (с помощью MVC) записи из буфера XYZ в рабочую область. IOCS будет автоматически считывать в буфер следующую карту и в случае необходимости переводить CPU в состояние ожидания, если следующая команда на ввод будет дана до того, как очередная карта полностью считается в буфер. Обнаружение признака конца файла заставит IOCS передать управление команде с адре- сом XWW, а не следующей по порядку команде программы. Существует несколько типов макрокоманд DTF. Так, макро- команду DTFSR можно использовать и в BOS, и в DOS, но, как правило, в DOS для считывания файла на картах употребляется другая макрокоманда, а именно, DTFCD. К описанному выше файлу можно обращаться с помощью следующих макрокоманд: OPEN GDIN GET CDIN, XUN CLOSE CDIN где XUN есть 80-байтовая область, в которой программист запла- нировал обработку входных данных. (Вопросы обработки данных в рабочей области рассматриваются в разд. 8.8.) 18.3. Макрокоманды для последовательных файлов Следующие разделы главы мы посвятим разбору нескольких макрокоманд DTF. Но сначала давайте обратимся я макрокоман- дам, имеющим дело с последовательно организованными файлами.
624 Гл. 18. Макрокоманды DOS Перед тем как выполнять какие-либо операции ввода — вывода, файл следует открыть. В случае ленты или диска это означает, что IOCS должна считать и проверить или записать метки. В случае других устройств IOCS просто заводит некоторые признаковые биты, которые будут характеризовать состояние файла в процессе работы с ним. Макрокоманда пишется следую- щим образом: метка OPEN имя-файла!, . . ., имя-файлап Метка необязательна, но если она есть, то указывает первый занимаемый макрокомандой байт. С помощью одной макро- команды OPEN можно открыть любое количество файлов. Записи становятся доступными для обработки (выдаются программе пользователя программами IOCS) в результате выпол- нения макрокоманды GET. Если рабочая область не используется, то макрокоманда имеет вид: метка GET имя-файла Если же рабочая область используется, то — метка GET имя-файла, имя-рабочей-области где имя-рабочей-области представляет собой имя области памяти, в которую будут передаваться вводимые записи. Когда рабочей области не предусмотрено, вся обработка будет вестись в самой области ввода — вывода и не сможет совмещаться с вводом — выводом, если только в макрокоманде DTF не указаны две области ввода — вывода. Записи записываются макрокомандами: метка PUT имя-файла метка PUT имя-файла,имя-рабочей-области Метка, как и в предыдущем случае, не обязательна и, как прави- ло, отсутствует. Макрокоманда CLOSE имеет вид: метка CLOSE имя-файла19 . . ., имя-файлап Она делает файл недоступным. Для каждого ранее открытого файла должна быть макрокоманда CLOSE. При обнаружении ее все оставшиеся в буферах записи выводятся на ленту или диск, считываются или записываются хвостовые метки, а супервизор устанавливает признаковый бит, означающий, что к файлу невоз- можны никакие обращения. Выполнение макрокоманды CLOSE перед концом задания вызывает завершение системой IOCS всех операций ввода — вывода. Если задание прекращается, а для некоторого файла не было макрокоманды CLOSE, может случить-
18.3. Макрокоманды для, последовательных файлов 625 ся так, что последняя выводимая запись будет написана непра- вильно, поскольку конец задания отменяет весь тот ввод — вывод, который не достиг этапа «канал кончил». Макрокоманда CNTRL имеет формат: метка CNTRL имя-файла,код,n,m Употребляется она для того, чтобы подвести ленту в нужное положение, продвинуть на печатающем устройстве бумагу и т. п. За исключением случая команд для печатающего устройства; управляющих движением бумаги, m и предшествующая ей запя- тая опускаются. Кроме случая команд для печатающего устройства и команд выбора приемного кармана, опускается и п вместе с предшествующей ей запятой. На рис. 18.1 приведены все допу- стимые операции управления. Для печатающих устройств пробивку в дорожке 9 или 12 управляющей ленты можно обнаружить с помощью макрокоманды метка PRTOV имя-файла,п,имя-подпрограммы где п = 9 или 12 в зависимости от того, какая необходима про- верка. Если проверяемый индикатор включен, в программе происходит переход по адресу, задаваемому операндом имя-под- программы] если он выключен, берется следующая по порядку команда. Опрашивать печатающее устройство нужно перед тем, как выдается очередная команда печати или перемещения бумаги. Делать опрос после команд печати или перемещения бумаги не имеет смысла, поскольку в момент опроса текущая операция должна быть завершена. Если опущен последний операнд, IOCS автоматически вызы- вает переход на начало страницы (прогон по дорожке 1). В подпрограмме, к которой переходит PRTOV, могут быть все команды, за исключением других макрокоманд PRTOV. В конце подпрограммы требуется предусмотреть переход на IOCS по адресу, помещенному в регистр 14. Этот адрес помещается в регистр до того, как передавать управление подпрограмме пользователя. Существует ряд макрокоманд, которые предназначены только для ленты или диска. Если требуется записать или проверить нестандартные метки или метки пользователя, то после проверки каждой метки пользователь должен вернуться к IOCS, используя макрокоманду метка LBRET п где n = 1, если больше никаких меток не надо ни писать, ни про- верять, а в противном случае п = 2. Макрокоманда метка RELSE имя-файла 40 Зак. 15635
Устройство М немонический код операции n m Назначение Магнитная лента REW Перемотать ленту RUN Перемотать и разгрузить ленту ERG Стереть интервал WTM Записать марку ленты BSR Возврат назад на блок (до IBG) BSF Возврат назад на файл (до марки ленты) FSR Шаг вперед на блок (до IBG) FSF Шаг вперед на файл (до марки ленты) Печатающие устройства SP a b Продвинуть бумагу сразу же на а строк, а после печати на b строк SK a b Прогнать бумагу сразу же до пробивки в дорожке а, а после печати очередной строки до пробивки в дорожке b 1403 с UCS (с уни- UCS ON Блокировать контроль данных версальным набо- ром символов) UCS OFF Разрешить контроль данных 2540 PS c Выбрать приемный карман с 1442, 2520 SS c Выбрать приемный карман с 1442 E Пропустить карту без считывания Устройства DASD SEEK Установить головки Только 2321 RESTR Вернуть магнитную карту в ячейку Рис, 18,1, Макрокоманда CNTRL.
18.3. Макрокоманды для последовательных файлов 627 используется лишь для сблокированных записей. При обнару- жении этой макрокоманды оставшиеся в текущем блоке записи пропускаются. Обработка возобновляется с первой записи сле- дующего блока. Обычно при объединении записей в блоки логическая IOCS блока не записывает, если он не полон. Макрокоманда метка TRUNC имя-файла позволяет записать частично заполненный блок. Команда TRUNC чаще всего используется при работе с запи- сями переменной длины, поскольку, как правило, с помощью макрокоманды PUT полного заполнения блока получить не удается. Обработка «конца тома» производится по макрокоманде метка FEOV имя-файла В случае входного файла осуществляется переход на следующий том. В случае выходного файла записывается последний блок записей, за которым ставится марка и хвостовые метки. FEOV перематывает ленту и автоматически переключается на следую- щий том. Эта процедура подобна действию, которое выполняется, когда обнаруживается физический конец ленты на выводном файле или марка ленты на вводном файле. Содержимое регистров 0, 1, 14 и 15 в процессе работы программ ввода — вывода изменяется. Следовательно, если какая-либо информация, находящаяся в регистрах, понадобится при даль- нейшей работе, то перед тем, как выдавать макрокоманду, следует позаботиться о сохранении этой информации. Кроме того, и регистр 13 используется макрокомандой SAVE (разд. 18.17), поэтому лишь регистрами 2—12 программист может пользоваться без всякого опасения. В данном разделе в качестве идентификатора вводного — выводного файла мы употребляли имя-файла. Имя-файла содержит не более семи символов и представляет собой символическое имя области памяти, в которой хранится символическое описание файла. Макрокоманды описания файла используют имена данных, начинающиеся с буквы I и содержащие восемь символов. Следо- вательно, программист в программе такого рода имена употреблять не имеет права. Далее, некоторые из программ описания файла используют в качестве имен данных заданное программистом имя-файла, но добавляют к нему еще одну букву. Например, если в качестве имени файла взять GUIOPER, то некоторой програм- мой описания файла будет создаваться и использоваться имя GUIOPERH. Совершенно аналогично, если T7R есть имя-файла, в программе может возникнуть поле с именем T7RC. Следова- тельно, на программиста накладывается еще и ограничение — 40е
628 Гл. 18. Макрокоманды DOS не употреблять имен, состоящих из имени файла, дополненного любым буквенно-цифровым символом. В тех макрокомандах, которые мы рассмотрели в этом раз- деле, слова имя-файла, имя-рабочей-области, имя-подпрограммы можно заменить обозначением (г), где г — выражение, значение которого находится в интервале с 2 по 12. Оно задает регистр, в котором хранится адрес имени файла, имени рабочей области или имени подпрограммы. В некоторых случаях допускается еще и третий вид описа- ния. Поскольку некоторые макрокоманды помещают адреса опе- рандов в регистры 0 и 1, то для того, чтобы показать, что програм- мист уже поместил адрес в нужный регистр, можно писать (1) или (0). Когда у нас используется данный вид описания, операнд представляет собой лишь три символа (1) или (0). В макрокоман- дах GET, PUT, RELSE, TRUNC, CNTRL, PRTOV и FEOV имя-файла может замещаться операндом (1). В макрокомандах OPEN и CLOSE такое описание не допускается. Операндом (0) можно заменить имя-рабочей-области в макрокомандах GET и PUT и имя-подпрограммы в макрокоманде PRTOV. В качестве примера рассмотрим девять эквивалентных макро- команд GET: GET OF,DR GET CF,(2) GET CF,(0) GET (5),DR GET (5),(2) GET (5),(0) GET (1),DR GET (1),(2) GET (i),(0) где, естественно, адрес CF должен быть помещен в регистр 5 или 1, а адрес DR — в регистр 0 или 2 в зависимости от того, каким вариантом мы пользуемся. В действительности DOS порождает следующие команды? L 1, = A(CF) L 0, = A(DR) L 15,16 (1) BAL 14,8(15) где последними двумя командами обеспечивается стандартная связь с программой логической IOCS. Первые две команды, если" в операндах используется (г), замещаются командами LR 1,5 LR 0,2
18.4. Макрокоманда DTFCD 629 Таким образом получается, что если брать (0) или (1), то такая команда LR совсем не нужна, и будет сэкономлена пара байтов памяти. 18.4. Макрокоманда DTFCD Макрокомандой DTFCD пользуются, как правило, для опре- деления файла на перфокартах. На рис. 18.2 приведены все допу- стимые операнды. Существует три типа файлов: входной, выход- ной и комбинированный. Комбинированным называется файл, карты которого читаются, а затем на только что считанную карту наносится информация. В DOS разрешаются следующие типы форматов записей: FIXUNB записи фиксированной длины несблокиро- ванные FIXBLK записи фиксированной длины сблокирован- ные VARUNB записи переменной длины несблокированные VARBLK записи переменной длины сблокированные UNDEF не определенные Во входных и комбинированных файлах на картах разрешен лишь формат FIXUNB. В выходных файлах допустимыми будут любые несблокированные записи. В DOS нет сблокированных файлов на картах. Операнд BLKSIZE=п используется для указания размера области ввода — вывода, той, которая будет доступна программе IOCS. Область ввода — вывода должна быть достаточно большой (такой, чтобы в случае записей переменной длины (UNDEF или VARUNB) в пей помещались самые длинные записи). Адрес области ввода — вывода указывается операндом 1ОАВЕА1=имя. Если у нас есть две области ввода — вывода (см. разд. 18.8), вторая указывается с помощью операнда 1ОАКЕА2=имя. Если задается лишь одна область, этот послед- ний операнд не пишется. Если мы указываем рабочую область, то должно быть записано W0RKA=YES. Действительный адрес рабочей области в этой макрокоманде не пишется, так как для одного файла различные макрокоманды GET и PUT могут исполь- зовать совершенно различные рабочие области. Когда нам необ- ходимы две области ввода — вывода, адрес используемой в данный момент области помещается в регистр (со 2 по 12), указанный в операнде IOREG—(г). Следовательно, IOREG=(4) означает, что во время выполнения GET адрес следующей логической записи будет помещаться в регистр 4. Совершенно аналогичным образом макрокоманда OPEN в регистр 4 поместит адрес, по которому программа сможет построить выходной файл, перфори- руемый впоследствии макрокомандами PUT.
Операнд Необходим для Замечания BLKSIZE^n CONTROL—YES CRDERR=RETRY CTLCHR=YES ASA DE VADDR= SYSnnn DEVICE-2540 1442 каждого файла использования макрокоманды CNTRL исправления ошибок перфорации указания, что первый символ управ- ляющий каждого файла всех устройств, кроме 2540 Длина области ввода — вывода 2520 и 2540 YES для символов 360, ASA для управ- ляющего символа ASA EOFADDR— имя I0AREA1=hmh I0AREA2—hmh IOREG=(r) OUBLKSZ=n RECFORM= FIXUNB UNDEF VARUNB RECSIZE=(r) SSELECT=n TYPEFLE= INPUT OUTPUT CMBND WORKA=YES входных и'комбинированных файлов каждого файла двух областей ввода — вывода, комби- нированных файлов двух областей ввода — вывода комбинированного файла с двумя обла- стями ввода — вывода всех не FIXUNB файлов UNDEF выбора приемного кармана всех не входных (INPUT) файлов указания в GET или PUT рабочей обла- сти имя = адресное выражение г = 2-12 п = размер выводимого блока для вводимого файла допустимо только FIXUNB г == 2—12, содержащий длину записи п = номеру приемного кармана Рис. 18.2. Операнды DTFCD.
18.4. Макрокоманда DTFCD 631 Для файлов с форматом записей UNDEF операнд RECSIZE = =:(г) указывает регистр, в котором будет находиться, когда выдается PUT, длина записи на выходе. Здесь можно указать любой регистр, за исключением 0, 1, 13, 14, 15. Операнд OUBLKSZ=n пишется лишь для комбинированных файлов, когда IOAREA1 используется для ввода, a IOAREA2 — для вывода. Операнд определяет размер IOAREA2. Если этот операнд для комбинированных файлов, которым нужны две области ввода — вывода, отсутствует, то считается, что длина обеих областей указана в операнде BLKSIZE=n. Для выходных и комбинированных файлов операнд EOFADDR =имя указывает адрес, по которому IOCS при появле- нии EOF будет передавать управление. IOCS считает, что появил- ся признак EOF, если считывается карта, в колонках 1—3 кото- рой стоит /*Ь. Если ввод производится с SYSRDR или с SYSIPT, то условием конца файла также считается /& Ь. Программист в свою программу должен для этого файла включить макро- команду CLOSE. Следует обратить внимание на то, что физический EOF (нет карт в устройстве) даже при включенной лампочке EOF воспри- нимается IOCS как конец набора данных. Это вызовет лишь сооб- щение оператору, что надо загрузить еще карты, но в конце входного потока должна все равно помещаться карта /* (или /&). Для всех карт файла выбор приемного кармана осуществляет- ся заданием операнда SSELECT=n, где п определяет карман. Выбор приемного кармана можно сделать и с помощью макро- команды CNTRL. Если мы хотим воспользоваться макрокоман- дой CNTRL, то следует записать операнд CONTROL=YES с тем, чтобы включаемые в программу пользователя модули IOCS имели возможность выполнять макрокоманды управления. Третий путь управления приемом карт заключается в том, что первым символом каждой выводимой записи ставится управляю- щий символ. Если задан операнд CTLCHR=YES, то в первый байт каждой выводимой записи файла помещается байт команды канала. Когда мы пользуемся управляющим символом, то для того, чтобы в запись входил и управляющий символ, и 80 байтов данных, длина ее может быть 81 байт. Управляющий символ не выводится, для операции вывода он служит командой канала. Если, скажем, задано CTLCHR=ASA, это означает, что для приемного кармана 1 управляющим символом будет V, а для кармана 2 — символ W, а не обычные коды команд канала. Операнд GTLCHR может задаваться лишь для выходных файлов. Операнд CRDERR=RETRY пишется только для перфора- торов с буфером (2520 и 2540). Обычно когда имеют место ошибки перфорации, на это никакого внимания не обращают, операция продолжается, а карты с ошибками поступают в первый прием-
632 Гл. 18. Макрокоманды DOS ный карман перфоратора. Если же задан этот операнд, то при появлении ошибки оператору выдается сообщение, CPU пере- водится в состояние ожидания, и только ответ оператора указы- вает IOCS, как поступить: либо перебить карту, либо ошибку проигнорировать. Операнды DTFCD можно писать в любом порядке, и можно использовать сколько угодно карт продолжения. На рис. 18.2 можно заметить, что некоторые записи подчеркнуты. Подчерки- вание означает, что в том случае, когда операнд опущен, прини- мается подчеркнутое значение. Следовательно, если операнд TYPEFLE =INPUT будет опущен, мы будем считать, что у нас входной файл (INPUT). Приведенное ниже DTFCD означает, что будет читаться колода карт с использованием области AR1 в качестве буфера CD DTFCD BLKSIZE =80,DEVADDR = X SYSIPT,DEVICE =2501, X EOFADDR=BR2, X IOAREA1=AR1,WORKA= X YES Рабочая область будет указана в макрокомандах GET; при обна- ружении EOF IOCS перейдет к программе, начинающейся с адреса BR2. Будут выдаваться следующие макрокоманды: OPEN CD GET CD ,имя-рабочей-обл асти CLOSE CD 18.5. Макрокоманды DTFPR и DTFMT Посредством макрокоманды DTFPR определяются обычно файлы на печатающем устройстве. Все возможные операнды приведены на рис. 18.3; в основном они совпадают с операндами макрокоманды DTFCD. Особо следует отметить, что если задано CONTROL=YES, то должен быть опущен операнд CTLCHR = . Верно и обратное, иными словами, пользоваться можно либо макрокомандой управ- ления, либо управляющим символом, но ни в коем случае не ими обоими вместе. Большей частью пользуются управляющим симво- лом. Фактически почти всегда файлы на печатающее устройство выдаются с использованием управляющих символов, тогда как другие файлы используют их очень редко. На рис. 18.4 приведены все операнды макрокоманды DTFMT (Определить файл на магнитной ленте). Большинство их совпа- дает с операндами определений файлов на картах и файлов на печатающем устройстве. Существует три типа файлов: вход-
Операнд Требуется для BLKSIZE=n CONTROL=YES CTLCHR=YES ASA DEVADDR=SYSnnn DEVICE=1403 1404 1443 1445 IOAREA1=hmh IOAREA2—имя IOREG=(r) PRINTOV—YES RECFORM=FIXUNB UNDEF VARUNB RECSIZE—(r) WORKA=YES UCS=OFF ON всех длин, кроме 121 использования макрокоманды CNTRL указания, что первый символ управ* ляющий каждого файла всех устройств, кроме 1403 каждого файла использования двух областей ввода — вывода использования двух областей ввода — вывода использования макрокоманды PRTOV всех не FIXUNB файлов файлов UNDEF указания в PUT рабочей области Замечания длина области ввода — вывода YES для символа в коде 360; ASA для управляющего символа в коде ASA имя = адресное выражение г = регистр 2—12 г = регистр 2—12» содержащий длину записи OFF разрешает контроль ошибок ON блокирует контроль ошибок Рис. 18.3 Операнды, DTFPR.
Операнд Требуется для Замечания ♦BLKSIZE=n ♦DEVADDR—SYSnnn ♦EOFADDR=hmh *ERROPT=IGNORE SKIP имя каждого файла каждого файла входных и рабочих файлов обработки записей с ошибками длина области ввода — вывода при IGNORE ошибки игнорируются, при SKIP запись пропускается, имя —- это адрес, по которому IOCS передает управление FI LAB L= STD NSTD NO I OAR E Al=имя каждого помеченного файла IOAREA2=hmh IQREG-(r) LABADDR=hmh ♦NOTEPNT=YES POINTS •READ=FORWARD BACK RECFORM=FIXUNB* FIXBLK VARUNB каждого файла двух областей ввода — вывода двух областей ввода — вывода или при обработке сблокированных записей в об- ласти ввода — вывода обработки меток пользователя использования NOTE, POINTR, POINTW, использования макрокоманды POINTS чтения в обратном порядке имя = адресное выражение г = регистр 2—12 имя = адрес программы пользователя YES разрешает использование и макро- команды POINTS всех не FIXUNB файлов
VARBLK UNDEF* RECSIZE-n (r) ♦REWIND= UNLOAD NORWD TYPEFLE= INPUT OUTP.UT WORK* TPMARK=NO VARBLD—(r) WLRERR—имя WORKA=YES FIXBLK UNDEF всех не INPUT файлов того, чтобы не записывалась марка лен- ты (ТМ) после нестандартной метки. ТМ также не запишется в качестве первой записи, если TPMARK = NO выходных файлов с записями VARBLK обработки неверной длины входных записей указания в GET или PUT рабочей области * Эти операнды разрешены для рабочих файлов Рис. 18.4. Операнды DTFMT. n ~ длина записи г = регистр 2—12, содержащий длину записи спецификации для перемотки ленты операнд недопустим для входных и ра- бочих файлов г = регистр 2—12 если операнд опущен, обработка ведет- ся так, как указано операндом ERR ОРТ, а если и он опущен, то , ошибка игнорируется
636 Гл. 18. Макрокоманды DOS ной, выходной и рабочий. Некоторое время рабочие файлы мы рассматривать не будем, обратимся к ним в разд. 18.9. Операнд ERROPT необязателен, но если он записан, то это означает, что запись, содержащая ошибку, должна быть: (а) обра- ботана так же, как и в случае, когда она безошибочна; (Ь) пропу- щена; (с) использована для передачи управления на написанную пользователем программу обработки ошибок. Если при чтении обнаруживается ошибка нарушение четности, программы IOCS возвращают ленту назад и 100 раз повторяют чтение, прежде чем будет установлено, что эта ошибка действительно имеет место. Если операнд не записан, то при появлении ошибок выполнение задания прекращается. Операнд FILABL указывает, стандартная ли метка, нестан- дартная или совсем метки нет. Если операнд опущен, считается, что метки нет. Операнд IOREG=(r) отличается от аналогичных операндов для карт и печатающего устройства. В том случае, когда мы пользуемся двумя областями ввода — вывода, он должен быть обязательно задан, но обязательно его задание и в том случае, когда область ввода — вывода одна и в ней обрабатываются сблокированные записи (FIXBLK или VARBLK). Необходимо задание IOREG еще в том случае, когда у нас производится чтение в обратном порядке записей формата VARUNB или UNDEF, а рабочей областью мы не пользуемся. LABADDR определяет адрес, по которому IOCS будет пере- давать управление, если окажется, что была прочитана запись метки или для вывода требуется создать пользовательскую метку. Программа пользователя должна заканчиваться выходом по мак- рокоманде LBRET. Свои метки пользователь обязан строить в обычной отведенной файлу области ввода — вывода. IOCS обычно записывает марку ленты или как первую запись данных, или, когда метками не пользуются вообще, как первую запись на ленте, или же как первую запись после нестандартных меток. Эта марка не будет записана, если задан операнд TPMARK=NO. При наличии стандартных меток марка запи- сывается всегда. Если файлы содержат записи не определенной длины, то в опе- ранде RECSIZE=(r) указывается регистр, в котором находится длина записи. Если файл содержит записи фиксированной длины (FIXBLK), то длина каждой указывается в операнде REGSIZE = =п (без скобок). Вместе с операндом BLKSIZE это дает возмож- ность определить коэффициент блокирования. Для выходных файлов с записями формата VARBLK операнд VARBLD указывает регистр, в котором всегда хранится число байтов памяти, остающихся свободными после занесения очеред- ной записи в области ввода — вывода. После каждой макро-
18.5, Макрокоманды DTFPR и DTFMT 637 команды PUT содержимое регистра корректируется. Макро- команда TRUNC будет заносить величину в этот регистр, указан- ную в операнде BLKSIZE=n. Перед очередной макрокомандой PUT программист сравнивает длину следующей записи с вели- чиной пространства, имеющегося в области ввода — вывода. В случае, если это пространство по размеру не подходит, выдает- ся макрокоманда TRUNC. Для входных файлов, чтобы указать программу пользователя для обработки ошибок неверной длины записи, можно пользо- ваться операндом WLRERR=hmh. При обнаружении неверной длины записи адрес этой записи помещается в регистр 1, а управ- ление передается на программу пользователя. В конце своей программы пользователь должен предусмотреть возврат в IOCS переходом по адресу в регистре 14 (чаще всего используется команда BR 14). Макрокоманда CLOSE вызывает обычно перемотку ленты к точке загрузки. Для того чтобы блокировать перемотку совсем или перемотать и разгрузить ленту, можно использовать операнд REWIND=NORWD или = UNLOAD. Операнд NOTEPNT пишется лишь для рабочих файлов. Упражнения № 46 1. Переписать программу упр. 45.1, используя макрокоманды ввода — вывода, DTFCD и DTFPR. 2. Переписать программу примера из разд. 17.3, используя макрокоманды ввода — вывода и соответствующие определения файлов (DTF). 3. Написать на языке Ассемблера программу для печати таблицы квадратов (SQ.) и кубов в форме N SQ. CUBE 10 0100 001000 11 0121 001331 99 9801 970299 4. Написать на языке Ассемблера программу для чтения карт, содержащих в колонках 1—5 число X, и печати на печа- тающем устройстве чисел X и 2Х + 1. 5. Написать программу для чтения карт, у которых в колон- ках 1—8 отперфорировано буквенно-цифровое слово. Обеспечить печать одного из следующих сообщений, где введенное слово представлено как хххххххх: (a) THE FIRST LETTER OF хххххххх IS A VOWEL, (первая буква в хххххххх гласная).
638 Гл. 18. Макрокоманды DOS (Ь) THE FIRST LETTER OF xxxxxxxx IS A CONSONANT, (первая буква в xxxxxxxx согласная). (c) THE FIRST CHARACTER OF xxxxxxxx IS NUMERIC, (первый символ в xxxxxxxx цифра). (d) xxxxxxxx BEGINS WITH A SPECIAL CHARACTER, (xxxxxxxx начинается co специального символа). 6. Что будет напечатано при работе приведенной ниже про- граммы, если в колонках 1—5 входных данных отперфорировано: а) 00000; (Ь) 00123; (с) 0012К; (d) 99999? START 8192 XIN DTFCD BLKSIZE=80,DEVADDR X =SYSRDR,EOFADDR=E, X IOAREA1=XU YOUT DTFPR BLKSIZE=7,DEVADDR = X SYSLST,IOAREA1=YU, X PRINTOV=YES R BALR 11,0 USING •,11 OPEN XIN,YOUT S GET XIN PACK X,XU(5) ZAP Y,ONE AP Y,X AP Y,X UNPK YU,Y PRTOV YOUT,12 PUT YOUT В S Е CLOSE EOJ XIN, YOUT хи DS CL80 YU DS CL7 X DS CL3 Y DS CL4 ONE DC PL1'-1' END R Макрокоманду EOJ мы не рассматривали. Используется она для того, чтобы по окончании задания передать управление супер- визору. Предполагается, что прерывания из-за переполнения замаскированы. 7. Изменить упр. 6 таким образом, чтобы на выводе было X,. два пробела, а потом Y.
18,6. Использование фиктивной секции 639 8. Изменить упр. 7 так, чтобы блокировать появление незна- чащих нулей и перед первой ненулевой цифрой печатать знак минус. 9. Написать программу чтения перфокарты, в колонках 1—10 которой содержится х, и перфорации карты с х и у (у в колон- ках 11—20). х должно быть в форме хх.хххххххх, а у в форме УУУ-УУУУУУУ- Значение у вычисляется по формуле !70 —х, если х^О 2х2—64, если 0 < х^ 90 х—100, если 90 < х Вычисление у вести с точностью до седьмого знака. На выходе десятичные точки не пробивать. 18.6. Использование фиктивной секции В этом разделе мы будем составлять программу задачи чтения колоды карт и записи их содержимого на магнитную ленту. Записываться карты на магнитную ленту будут как 80-байтовые записи, первые восемь байтов которых берутся из колонок 73— 80, а последние 72 байта — из колонок 1—72. При записи на ленту коэффициент блокирования примем равным 4. Сначала будем писать программу, пользуясь областью ввода, рабочей областью для ввода, областью вывода и рабочей обла- стью для вывода: « PROGRAM WITH WORK AREAS CDTE START 24576 CARDIN DTFCD TYPEFLE=INPUT, 1 DEVADDR=SYSRDR, 2 EOFADDR=E20,BLKSIZE=80, 3 IOAREA1 =E30,WORKA=YES TAPEOUT DTFMT TYPEFLE=OUTPUT, 1 DEVADDR=SYS004, 2 RECFORM=FIXBLK, 3 FILABL=NO,BLKSIZE=320, 4 RECSIZE =80, WORK A=YES, 5 IOAREA1=E40 ЕЮ BALR 11,0 USING *,11 OPEN CARD IN,TAPEOUT ЕН GET CARDIN,E31 MVC E51,E31+72 MVC E52,E31 PUT TAPEOUT,E50 В Ell
640 Гл. 18. Макрокоманды DOS Е20 CLOSE EOJ CARDIN, TAPEOUT ЕЗО DS CL80 INPUT BUFFER Е31 DS CL80 INPUT WORK Е50 DS 0CL80 OUTPUT WORK Е51 DS CL8 Е52 DS CL72 Е40 DS CL320 OUTPUT BUFFER END ЕЮ Заметьте, что в программе определяются две буферные области ЕЗО и Е40, которые должны соответствовать назначению, ука- занному для них в макрокомандах DTF. Но к содержимому этих областей программа задачи не обращается, поскольку буферные области принимают участие в операциях ввода — вывода, кото- рые идут параллельно с работой основной программы. Передача управления на Е20, где находится более или менее самостоятельная программа, осуществляется автоматически. Мак- рокоманда EOJ используется для того, чтобы прекратить выпол- нение программы, передав управление супервизору. Макро- командами супервизора мы займемся позже в разд. 18.16. Обратите внимание также и на то, как в предложении Е50 определяется 80-байтовое поле, которое затем подразделяется на 2 части: одну из 8 байтов и другую из 72. Это дает нам воз- можность не писать в командах MVC операндов, задающих длину. Если бы пришлось писать длину, то команды выглядели бы сле- дующим образом: MVC Е50 (8),Е31+72 MVC Е504-8(72),Е31 Рассмотрим теперь второй вариант этой же программы, в кото- ром рабочую область мы выделяем лишь для вывода, а всю обра- ботку, связанную с вводом, будем вести в области ввода. * PROGRAM2, NO WORK AREA * FOR INPUT. CDTE START 24576 CARDIN DTFCD TYPEFLE =INPUT, 1 DEVADDR=SYSRDR, 2 EOFADDR=E20, 3 BLKSIZE=80, 4 IO ARE Al =f=E 30 TAPEOUT DTFMT TYPEFLE=OUTPUT, 1 DEVADDR=SYS004, 2 RECFORM=FIXBLK, 3 FILABL=NO,BLKSIZE=320, 4 RECSIZE=80, WORKA=YES, 5 IOAREA1=E40
18.6. Использование фиктивной секции 641 ЕЮ BALR 11,0 Ell USING OPEN GET *,11 CARDIN,TAPEOUT CARDIN E20 MVC MVC PUT В CLOSE Е51,ЕЗО 4-72 Е52,Е30 TAPEOUT,Е50 Ell CARDIN,TAPEOUT E30 EOJ DS CL80 E50 DS 0CL80 E51 DS CL8 E52 DS CL72 E40 DS CL320 Из-за того END E10 что рабочей области для ввода не отведено, одно- временно может осуществляться только вывод и обработка. В первой программе в то время, как велась обработка^ IOCS считывала очередную карту в ЕЗО, и когда выдавалась следую- щая макрокоманда GET, для пересылки записи карты в область Е31 требовалась команда MVC. Во второй программе такое пере- крытие невозможно. Мы сэкономили 80 байтов памяти, но из-за отсутствия перекрытия скорость работы программы -снизилась. Выигрыш во времени, который нам дает наличие рабочей области для ленты, фактически очень невелик, поскольку опера- ция с лентой выполняется много быстрее чтения карты. Полу- чилось бы значительно быстрее, если бы мы выделили рабочую область для ввода и ликвидировали рабочую область для ленты. В третьем примере мы выделяем рабочую область для ввода, но отказываемся от рабочей области для вывода: * PROGRAMS, NO WORK AREA • FOR OUTPUT. CDTE START 24576 CARDIN DTFCD TYPEFLE=INPUT, DEVADDR=SYSRDR, EOFADDR=E20, BLKSIZE=80, IOAREA1=E30, WORKA=YES TAPEOUT DTFMT TYPEFLE=OUTPUT, DEVADDR=SYS004, RECFORM=FIXBLK, FILABL=NO,BLKSIZE=320, RECSIZE=80,IOREG=(3), IOAREA1=E40 СП CO bO rfs ОО M 41 Зак. 15635
642 Гл. 18. Макрокоманды DOS E10 BALR 11,0 USING *,11 OPEN CARDIN,TAPEOUT Ell GET CARDIN,E31 USING CDTF,3 MVC E51,E31+72 MVC E52.E31 PUT TAPEOUT В Ell E20 CLOSE CARDIN,TAPEOUT EOJ CDTF DSECT E50 DS 0CL80 E51 DS CL8 E52 DS CL72 CDTF CSECT E30 DS CL80 INPUT BUFFER E31 DS CL80 INPUT WORK E40 DS CL320 OUTPUT AREA END ЕЮ В третьей программе введенные данные пересылаются из обла- сти ввода с помощью макрокоманды GET, которая после этого — в то время как в рабочей области идет обработка — читает сле- дующую карту. Регистр 3 предназначается здесь для хранения начального адреса отправляемой на ленту текущей записи. Оператор PUT либо увеличивает этот адрес на 80, либо, если область ввода—вывода заполнена, записывает блок на ленту и вос- станавливает в регистре 3 начальный адрес области вывода Е40. Для обращения к регистру 3 мы пользуемся командой USING CDTF, 3, которая передает в основную программу информа- цию о том, что в регистре 3 хранится адрес первого байта CDTF, т. е. адрес области Е50. В действительности же IOCS будет помещать в регистр 3 следующие величины: А(Е40) А(Е40+80) А(Е40+160) А(Е40+240) Заметьте, что вывод на ленту и обработка не перекрываются. В заключение мы даем программу, где каждый файл поль- зуется двумя областями ввода — вывода. В этом случае рабочие области не используются. * PROGRAM 4, TWO I/O ♦ AREAS FOR EACH FILE.
18.6. Использование фиктивной секции 643 CDTE START 24576 CARDIN DTFCD TYPEFLE=INPUT, 1 DEVADDR=SYSRDR, 2 BLKSIZE=80,IOAREA1=E30, 3 EOFADDR=E20,IOREG=(2), 4 IOAREA2=E31 TAPEOUT DTFMT TYPEFLE=OUTPUT, 1 DEVADDR=SYS004, 2 RECFORM=FIXBLK, 3 FILABL=NO,BLKSIZE=320, 4 RECSIZE=80,IOREG=(3), 5 IOARE Al=E40, IOARE A2= E41 ЕЮ BALR 11,0 USING *,11 USING CDTF.3 USING CDTG,2 OPEN CARDIN,TAPEOUT Ell GET CARDIN MVC E51.E60+72 MVC E52,0(2) PUT TAPEOUT В Ell E20 CLOSE CARDIN,TAPEOUT EOJ E30 DS CL80 INPUT AREA1 E31 DS CL80 INPUT AREA2 E40 DS CL320 OUTPUT AREA1 E41 CDTG DS CL320 OUTPUT AREA2 DSECT E60 CDTF DS CL80 DSECT E50 DS 0CL80 E51 DS CL8 E52 DS CL72 END ЕЮ К области ввода при вводе с карт мы обращались двумя спо- собами; первый заключался в том, что мы использовали команду DSECT, чтобы иметь регистр базы с адресом области Е60; второй состоял в явном задании соответствующего регистра. Если бы Для обеих команд MVC мы пользовались этим вторым способом, то оператор CDTG DSECT был бы совсем не нужен. На практике 41*
644 Гл. 18. Макрокоманды DOS во множестве простых случаев гораздо удобнее не иметь дела с командой DSECT. Заметьте, что содержимое регистра 2 поочередно будет сле- дующим: А (ЕЗО) А (Е31) а в регистре 3 будут чередоваться восемь величин: сначала А (Е40 + п*80) при п = 0, 1, 2, 3, а потом А (Е41 + п*80) также при п = О, 1, 2 и 3, после чего цикл повторится. Когда ассемблер обрабатывает фиктивную секцию, всегда считается, что начинается она с нуля, а связанный с ней регистр загружается в основной программе. (В нашей программе содер- жимое регистров задается в макрокомандах GET и PUT.) Фик- тивным секциям в рабочей программе никакого места не отво- дится. Реальное место выделяется программой для областей ЕЗО, Е31, Е40 и Е41. Если нет серьезных причин поступать иначе, то проще всего пользоваться одной буферной областью и одной рабочей. Обычно это дает наибольшую скорость работы программы. 18.7. Макрокоманда DTFSD На рис. 18.5 приведены все операнды макрокоманды, опре- деляющей последовательный файл на DASD. Рабочие файлы рас- сматриваются в разд. 18.9. В целом все операнды DTFSD похожи на операнды макро- команды для магнитной ленты. Имеется всего три различия. Операнд VERIFY=YES означает, что все операции записи на диск будут контролироваться. Контроль включает в себя чтение (с блокировкой записи в память) каждой записи сразу же после того, как ее запишут на диск. При этом каждый раз затра- чивается лишний оборот диска. Вообще-то диски 2311 довольно надежны и контроль необходим лишь в тех случаях, когда нам нужно особо надежно записать информацию. В этом отношении накопитель на магнитных картах уступает диску, и там програм- мы IOCS осуществляют контроль записи всегда. Операнд UPDATE = YES позволяет пользоваться для вво- димых файлов макрокомандой PUT. Это присуще только устрой- ствам с прямым доступом. Когда информация на вводимом файле должна быть обновлена или откорректирована, сначала для каждой записи программист задает макрокоманду GET. Если данная запись на диске сохраняется неизменной, то программист просто задает другую макрокоманду GET и читается следующая по порядку запись. Если же программист в процессе работы своей программы вдруг пожелает изменить или совсем заменить
18.8. Макрокоманды DTFCN и DTFSR 645 запись, то сделать это он сможет, задавая для файла макро- команду PUT. Макрокоманда PUT, написанная для вводимого файла, просто заменит на диске текущую запись новой. Если происходит корректирование файла, то обработка ведется немного медленнее, и по этой причине операнд UPDATE = YES нужно задавать только в случае действительной необходимости. Операнд CONTROL=YES* разрешает задание макрокоманд CNTRL, формат которых следующий: CNTRL имя-файла,SEEK В результате этой макрокоманды головки дискового устройства устанавливаются для чтения следующей записи. Если записи сблокированы, макрокоманда не оказывает никакого действия, если текущая запись не является последней в блоке. Для послед- ней записи в блоке головки устанавливаются на следующий блок. Преимущества, которые дает макрокоманда CNTRL, связаны с тем, что она начинает перемещение головок, которое продол- жается параллельно с работой CPU. Таким образом, здесь у нас обработка и установка головок перекрываются. Команды уста- новки, вообще-то говоря, не обязательны. Каждая макрокоманда GET вызывает установку головок в нужное положение, если к этому моменту они еще не на месте. Следовательно, единствен- ное назначение макрокоманд CNTRL — экономить машинное время. 18.8. Макрокоманды DTFCN и DTFSR На рис. 18.6 приведены все операнды макрокоманды DTFCN, макрокоманды определения файла пультовой пишущей машинки. Необходимо заметить, что пультовая машинка не может высту- пать в роли SYSRES, SYSRDR, SYSIPT, SYSPCH, SYSLNK и SYSLST. Макрокоманды OPEN и CLOSE для файлов пульто- вой машинки не нужны. На рис. 18.7 приведены операнды макрокоманды DTFSR. Этой макрокомандой можно пользоваться для диска, ленты, кар- точного читающего устройства, перфоратора, построчно печатаю- щего устройства и пультовой пишущей машинки. В DOS и TOS макрокомандой пользуются гларным образом для того, чтобы обеспечить совместимость с BOS и BPS. Если не считать рабочие файлы, для которых макрокоманду DTFSR нельзя использовать, и комбинированные файлы, то мож- но сказать, что операнды совершенно аналогичны операндам всех остальных определений файлов, которые мы рассматривали. Для комбинированных файлов, которые разрешены лишь для 1442, при определении областей ввода и вывода используются четыре специальных операнда, INAREA1, INBLKSIZE, OUAREA
Операнд Требуется для Замечания ♦BLKSIZE=n каждого файла длина области ввода — вывода •CONTROL=YES использования макрокоманды CNTRL ♦DELETFL=NO того, чтобы файл не уничтожался разрешается только для рабочих файлов макрокомандой CLOSE ♦DEVICE=2311 2321 ♦EOFADDR=hmh устройства 2321 входных и рабочих файлов •ERROPT= IGNORE SKIP имя обработки записей с ошибками для выходных файлов SKIP не упо- требляется 10АЕБА1=имя каждого файла имя — адресное выражение I0AREA2=hmh двух областей ввода — вывода IOREG=(r) двух областей ввода — вывода или при г = регистр 2—12, содержащий адрес обработке сблокированных записей без записи рабочей области LABADDR=hmh обработки меток пользователя ♦NOTEPNT=YES использования макрокоманды POINTS только для рабочих файлов POINTR W использования макрокоманд NOTE, POINTW, POINTR RECFORM=FIXUNB* всех не FIXUNB файлов FIXBLK VARUNB
VARBLK UNDEF* RECSIZE=n (г) F1XBLK n= длина записи UNDEF r = 2—12, содержащий длину записи TRUNCS-YES использования макрокоманды TRUNC при выводе; входной файл с записями формата FIXBLK содержит короткие блоки *TYPEFLE= INPUT OUTPUT WORK всех не INPUT файлов UPDATE=YES использования макрокоманды PUT при вводе файла ♦VERIFY=YES контроля записи на диск для устройства 2321 VARBLD=(r) построения в области ввода — вывода г » регистр 2—12 записей для вывода в формате VARBLK WLRERR=hmh обработки во входном файле WLR (т. е. неверной длины записей) WORKA=YES использования рабочих областей мак- рокомандами GET и PUT * Операнды можно написать для рабочих файлов. Рис, 18.5, Операнды DTFSD.
Операнд Требуется для Замечания BLKSIZE=n каждого файла DEVADDR=SYSLOG SYSnnn каждого файла ппп = с ООО по 244 1ОАВЕА1=имя каждого файла R ECFORM— FIXUNB UNDEF файлов с форматом записей UNDEF RECSIZE-(r) файлов с форматом записей UNDEF г = регистр 2—12, содержащий длину записи TYPEFLE—INPUT OUTPUT выходных файлов tyORKA=YES использования рабочей области Рис. 18.6 Операнды DTFCN-
18,9. Рабочие файлы 649 и OUBLKSIZE. Обычный операнд BLKSIZE опускается. Когда для комбинированного файла используется только одна область ввода — вывода, то пишут лишь обычные операнды BLKSIZE и IOAREA1, а в специальных операндах уже нет необходимости. • В BOS и BPS не допускается использование ни одного из рассмотренных нами определений файла, кроме DTFSR. В BOS перед макрокомандами DTF обязательно должно быть записано DTFBG DISK а в обеих системах, BPS и BOS, за последней макрокомандой DTF следует написать DTFEN Эти два оператора необходимы лишь для отметки начала (BeGin- ning) и конца (ENd) макрокоманд определений файла. В результате использования макрокоманды DTFSR ввод — вывод будет полностью эквивалентен тому, который бы мы полу- чили, пользуясь другими определениями последовательного фай- ла, но команды, порожденные при этом в рабочей программе, будут, вообще говоря, менее эффективными и могут занимать больше места в памяти. Если макрокомандой DTFSR мы поль- зуемся в DOS или TOS, то ассемблер будет перерабатывать ее в соответствующую DTFCD, DTFMT и т. д., так что в результате увеличится время трансляции. 18.9. Рабочие файлы Файлы, определяемые операндом TYPEFLE = WORK в мак- рокомандах DTFMT и DTFSD, называются рабочими файлами. Рабочие файлы на дисках имеют всегда стандартные метки; рабочие файлы на ленте тоже могут иметь стандартные метки, но обычно у них меток нет. Метки пользователя не обрабатывают- ся. Хвостовые метки на рабочих файлах не пишутся и не обра- батываются. Назначение рабочих файлов — служить во время выполне- ния программы промежуточной памятью, а в силу этого они отличаются от файлов ввода — вывода. Чаще всего их рассма- тривают как расширение памяти CPU. Содержимое их служит лишь временно и по окончанию работы программы вообще отбра- сывается за ненадобностью. Рабочие файлы работают и на ввод, и на вывод. Макрокоманда OPEN необходима в том случае, когда надо обработать метки. Для ленты макрокоманда CLOSE не требует- ся, но она весьма полезна для того, чтобы вызвать перемотку ленты. Для диска обычное выполнение макрокоманды CLOSE
Операнд Требуется для Замечания BLKSIZE-n CONTROL=YES CRDERR=RETRY CTLCHR=YES DEVADDR=SYSnnn DEVICE=DISK11 TAPE READ01 READ20 READ40 READ42 PRINTER CONSOLE EOFADDR=HMfl ERROPT=IGNORE SKIP имя FILABL=STD NSTD NO INAREA1=hmh INBLKSIZE=n IOAREAl—имя I0AREA2=hmh IOREG=(r) каждого файла, кроме случая, когда задано INAREA1 использования макрокоманды CNTRL исправления ошибок перфорации печатающих устройств и перфораторов всех, кроме 2311 2311 магнитной ленты 2501 2520 2540 1442 любого печатающего устройства 1052 входных файлов длина области ввода — вывода не нужен для файлов 1052 только для 2520 и 2540 первый символ является управляющим допускается только для диска или ленты LABADDR=hmh OUAREA=HMH OUBLKSIZE==n PRINTOV=YES файлов ленты комбинированных файлов на 1442 с от- дельными областями для ввода и вывода когда используется INAREA1 когда не указана INAREA1 двух областей ввода — вывода двух областей ввода — вывода, когда нет рабочей области для блокированных записей обработки меток пользователя когда указана INAREA1 когда указана OUAREA использования макрокоманды PRTOV размер блока для области ввода только для ленты или диска размер блока для области вывода используется только для печатающих устройств
READ= FORWARD BACK R ECFORM=FIXUNB FIXBLK VARUNB VARBLK UNDEF RECSIZE=n (r) REWIND=UNLOAD NORWD TPMARK=NO TRUNCS=YES TYPEFLE= INPUT OUTPUT CMBND UPDATE=YES VARBLD=(r) VERIFY=YES WLRERR=hmh WORKA=YES чтения в обратном направлении всех не FIXUNB файлов файлов с записями формата FIXBLK файлов с записями формата UNDEF использования на 2311 макрокоманды TRUNC всех не INPUT файлов использования макрокоманды PUT для входного файла на 2311 выходного файла с записями VARBLK без рабочей области контроля записи на диск обработки неверной длины записи (WLR) указания рабочей области в GET или PUT используется только для ленты при вводе с карт должно быть FIXUNB сблокированы могут быть только на лен- те или на диске VARUNB разрешается для вывода на карты и печатающих устройств, а так- же и для ленты, и для диска UNDEF не разрешается при вводе с карт п = длина записи (максимальная длина) г == регистр 2—12, содержащий длину записи используется только для ленты используется только для ленты комбинированные файлы только для карт г = регистр 2—12 задается только для 2311 задается только для ленты или диска Рис. 18.7. Операнды DTFSR.
652 Гл. 18. Макрокоманды DOS влечет за собой уничтожение меток форматов 1 и 3, если в макро- команде DTFSD нет операнда DELETFL=NO. Открываются рабочие файлы как выходные, так что когда файл открывается, IOCS создает новый набор меток. Если в программе для этого файла окажется вторая макрокоманда OPEN, то лента устанав- ливается вновь для чтения первой записи, но метки в этом слу- чае не записываются. Для рабочих файлов не пишутся обычные макрокоманды GET и PUT. Вместо этого пользуются макрокомандами: READ f n,SQ, область!, длина] WRITE fn,SQ,область!,длина] WRITE fn, UPDATE, область!, длина] CHECK fn NOTE fn POINTR fn,адрес POINTW Ь,адре POINTS fn где под fn понимаем имя-файла. Четырьмя последними макро- командами нельзя пользоваться, если в определение файла не входит операнд NOTEPNT=. В качестве первого операнда может стоять а) имя-файла. Ь) (г), где г = 2—12. Означает, что адрес DTF содержится в регистре г. с) (1). Означает, что адрес DTF уже загружен в регистр 1. . Область определяет область памяти, в которую или из кото- рой будут пересылаться данные. На месте операнда область может стоять а) выражение, определяющее адрес области. Ь) (г), где г = 2—12. Означает, что адрес области содержится в регистре г. с) (0). Означает, что адрес области уже загружен в регистр 0. Адрес в макрокомандах POINTR и POINTW можно заменить указанием (г) или (0). Операнд длина в макрокомандах READ и WRITE задает длину области ввода — вывода. Требуется он для файлов с форматом записей UNDEF и не разрешается для файлов с форматом записей FIXUNB. Когда операндом поль- зуются, там может стоять длина области ввода — вывода (г)г где длина содержится в регистре г, или для макрокоманды READ может стоять S, означающее, что максимальный размер записи должен выбираться в зависимости от значения, заданного операн- дом BLKSIZE =п. Операнд, отличный от S, имеет смысл задавать „ тогда, когда требуется помешать вводу в память всего, кроме первой части записи (той, которая указана длиной).
18.9. Рабочие файлы 653 Работая с записями формата FIXUNB, программист имеет право изменить BLKSIZE — п, меняя полуслово в поле с именем fnL. Например, пусть файлу присвоено имя ОНКР;-если в реги- стре 8 хранится новая длина, то для того, чтобы поместить в набор параметров файла эту новую длину, можно воспользоваться командой STH 8,GHKRL Заметьте, что имя поля представляет собой имя файла, к которо- му добавлена буква L. Рассмотрим примеры макрокоманд READ. READ FLNJ,SQ,(3),80 READ KP78,SQ,AR45 В первой команде указан файл FLNJ с записями формата UNDEF, а во второй — файл с записями фиксированной длины. Вспомни- те, что для рабочих файлов IOAREA1 не задается, следовательно, во втором примере AR45 у нас фактически является областью ввода. Макрокоманда WRITE требует записи тех же операндов, что и READ, только в случае диска на месте второго операнда может стоять UPDATE. Когда задается SQ, новая запись пишется с использованием команды Запись счетчика, ключа и данных. Когда же задан операнд UPDATE, помещенное ранее содержимое записи заменяется с помощью команды Запись данных. В этом случае новая запись должна иметь длину, совпадающую с длиной записи, которую она замещает. Как правило, перед UPDATE стоит READ. В макрокоманде WRITE операнд длины S считает- ся недопустимым. Макрокоманды READ и WRITE запускают операцию ввода — вывода и тут же возвращают управление программе пользова- теля; т. е. они не заставляют программу ждать момента завер- шения операций ввода — вывода. Однако в конце концов насту- пает момент, когда программа не должна идти дальше, если операции не завершены. Макрокоманда CHECK имя-файла влечет за собой ожидание, если для указанного файла текущая операция не закончена. Когда же она заканчивается, выполняет- ся следующая по порядку команда, за исключением случая, когда обнаружена ошибка или имеет место EOF (конец файла) и управление передано соответствующей программе. При записи рабочего файла условие EOF появляется лишь по достижении физического конца ленты или конца экстента диска. Таким обра- зом для каждого рабочего файла в отличие от обычных должна
654 Гл. 18. Макрокоманды DOS быть указана программа обработки EOF. Макрокоманда NOTE имеет формат NOTE имя-файла Эта макрокоманда помещает идентификатор записи в регистр 1. Для ленты этот идентификатор представляет собой ОВВВ, где ВВВ — счетчик блоков, равный числу прочитанных или записан- ных блоков. Для диска в четырех байтах находится 0CHR, где С — цилиндр, Н — головка, a R — номер последней прочитан- ной или записанной записи. После записи на 2311 в регистр О заносится 00LL, где LL — число оставшихся на дорожке байтов. Макрокомандой POINTS пользуются для установки файла к его началу. Лента перематывается, а потом пропускается место, отведенное для меток. Диск устанавливается к началу первой записи в первом экстенте. В макрокомандах POINTR и POINTW второй операнд пред- ставляет собой четырехбайтовое поле адреса, в котором для ленты находится ОВВВ, а для диска 0GHR. Когда задается макрокоман- да POINTR, файл устанавливается в положение, соответствующее началу указанной записи с тем, чтобы последующая макро- команда READ читала именно эту запись. Когда задается макро- команда POINTW, файл устанавливается к началу следующей записи с тем, чтобы следующая за ней макрокоманда WRITE стала писать запись, которая идет за указанной в макрокоманде POINTW. Заметим, что на рабочих лентах разрешается перезапись внутри файла. Следует позаботиться лишь о том, чтобы и у старой и у новой записи совпадали длины. Это требование перестает быть обязательным, если запись на ленте последняя. Когда макрокоманда POINTW используется для «диска, то в шестибайтовом адресе, задаваемом вторым операндом, содержится 0CHRLL, где LL равно числу оставшихся на дорожке байтов. Макрокоманда READ, заданная после макрокоманды POINTW, будет на ленте читать следующую запись, а на диске в этих же условиях будет читаться сама указанная запись. Попытка записать на диск запись в форме UNDEF в усло- виях, когда запись не помещается в отведенное ей пространство, приводит к тому, что старая запись не заменяется, а новая будет первой записью на следующей дорожке. Упражнения № 47 1. Переписать программу упр. 46.6, используя для обоих файлов макрокоманду DTFSR. 2. Написать программу чтения колоды карт и переписать эти карты на ленту 80-байтовыми несблокированными записями со стандартными метками.
18.9. Рабочие файлы 655 3. Написать программу чтения описанной в упр. 2 ленты и записи на диск стандартного последовательного файла. 4. Изменить упр. 2 и 3 таким образом, чтобы получились блоки, число записей в которых на ленте равнялось бы 4, а на диске 5. 5. На ленте имеется файл с несблокированными записями, упорядоченными по номеру клиента, причем каждая запись несет следующую информацию. Строки: 1 1 2—9 Номер клиента 10—90 Фамилия и адрес клиента 91—100 Баланс или кредит клиента В случае кредита цифра центов отмечается пробивкой в пози- ции 11 (т. е. зона равна D). Колода карт, рассортированная в поряд- ке номеров клиентов, отперфорирована следующим образом» Колонки: 1 2 2—9 Номер клиента 10—19 Величина прихода или расхода 20 11, если приход; 12, если расход Для произвольного клиента может не быть ни одной, может быть одна или несколько карт. Написать программу чтения карт и корректирования информации на ленте согласно имеющимся на карте величинам. Расходы вычитаются, а приходы прибав- ляются. 6. Изменить упр. 5 таким образом, чтобы отперфорировать карту, дублирующую строки 1—70 и 91—100 записи на ленте, для каждого клиента, чей баланс превышает 10 тысяч долларов, и вывести на печать записи для тех клиентов, чей баланс превы- шает 50 тысяч долларов. 7. Предположим, что в упр. 5 имеется еще итоговая запись, у которой в строке 1 стоит 3, а в строке 89—100 стоит сумма всех балансов (запись эта сделана непосредственно перед EOF). Изменить программу таким образом, чтобы внести корректиров- ку и в эту итоговую запись. 8. Изменить упр. 6 так, чтобы не перфорировать карты, а записать все это на ленту, а потом после перемотки основной ленты вывести на печать всю ту информацию, которую надо было отперфорировать в упр. 6.
656 Гл. 18. Макрокоманды DOS 9. Изменить упр. 8 таким образом, чтобы вместо рабочей ленты можно было воспользоваться рабочим файлом на диске. 10. Изменить упр. 5 в предположении, что исходные записи сделаны на диске и программа должна их соответствующим образом откорректировать. 18.10. Макрокоманда DTFDA На рис. 18.8 приведены все операнды для файла с прямым доступом. Так же как и для последовательно организованных файлов, для файлов с прямым доступом используются макро- команды OPEN, CLOSE и LBRET, но кроме них можно поль- зоваться еще и другими макрокомандами. Сюда относятся READ fn,KEY READ fn,ID WRITE fn,KEY WRITE fn,ID WRITE fn,AFTER WRITE fn,AFTER, EOF WRITE fn,RZERO WAITF fn, CNTRL fn,SEEK CNTRL fn,RESTR Последняя макрокоманда служит для того, чтобы вернуть маг- нитную карту в ячейку на накопителе с магнитными картами 2321, и на диске 2311 использоваться не может. Первый операнд вместо имени файла может содержать (г) или (1). Если в какой-либо макрокоманде задано AFTER; AFTER, EOF или RZERO, то в определении файла следует указать AFTER = YES. Если в макрокоманде READ стоит KEY, то в DTF следует включить операнд READKEY=YES, а если KEY стоит в макрокоманде WRITE, то включить в DTF надо операнд WRITEKY. Когда в макрокоманде READ записан операнд ID, то в DTF входит READID, а если ID записан в мак- рокоманде WRITE, то в DTF входит WRITEID. Если же мы пользуемся макрокомандой CNTRL, то одним из операндов определения файла должен быть CONTROL=YES. Операнд TYPEFLE указывает на тип работы с метками. Если файл выходной, то создаются новые метки, а если файл входной, то метки читаются и проверяются. При любой спецификации разрешается использование макрокоманд READ и WRITE. Операнд XTNTXIT указывает программу пользователя для обработки информации на картах экстента. После того как IOCS прочитает и проверит карты экстента, создается 14-байтовое
18.10. Макрокоманда DTFDA 657 поле, в Байты: котором находятся: 0 1 2-5 6-9 10-11 12 13 Код типа Порядковый номер экстента ССНН, нижняя граница ССНН, верхняя граница Имя устройства Старый бин (bin) для магнитных карт (2321) Имеющийся бин (bin) (2321) Информация эта берется из карт экстента. Имя устройства пред- ставляет собой SYSRDR SYSIPT SYSPCH SYSLST SYSLOG SYSLNK SYSRES SYSOOO SYS001 SYS002 0000 0001 0002 0003 0004 0005 0006 0100 0101 0102 SYS244 01F4 При работе программы макрокоманда OPEN каждый раз, когда IOGS обработает очередную карту экстента, помещает адрес 14-байтового поля в регистр 1 и передает управление программе пользователя. В этой программе должна быть макрокоманда LBRET, возвращающая управление IOCS. Задание операнда RECFORM=FIXUNB возможно лишь в том случае, когда отсутствует операнд AFTER. В DOS тре- буется, чтобы все поля ключей в файле были одинаковой длины (KEYLEN=n), но длина данных, которые будут заполнять дорожку, может быть любой. Операнд UNDEF можно задать лишь тогда, когда имеется операнд AFTER=YES. Записи могут быть и с ключом, и без него. Если при выводе использовать ключи, то в операнде KEYARG=hmh необходимо указать символический адрес поля ключа, а в операнде KEYLEN—n задать длину ключа. Операнд BLKSIZE=п задает длину области ввода — вывода IOAREA1. Если задан операнд AFTER, то в этой области должно быть место для счетчика, ключа и данных одной записи. Если задан операнд ID, то в IOAREA1 должны помещаться поля ключа и данных. Если задается операнд IOAREA1, то непосредственно перед местом, отводимым в IOAREA1 для данных, будет отведено 42 Зак. 15635
Операнд Требуется для Замечания AFTER-YES задания в макрокоманде WRITE опе- рандов AFTER или RZERO BLKSIZE-n каждого файла длина области ввода — вывода CONTROL-YES использования макрокоманды CNTRL DEVICE—2314 2321 каждого файла ERRBYTE—имя каждого файла имя определяет двухбайтовое поле для кодов ошибок IDLOC—имя IOCS, чтобы работать с ID имя определяет пятибайтовое поле идентификатора (ID) IO ARE Al—имя каждого файла KEYARG-имя обращения к записи по ключу KEYLEN-n записей с ключом п — длина поля ключа LABADDR—имя обработки меток пользователя READID—YES задания в макрокоманде READ операн- да ID READKEY-YES задания в макрокоманде READ опе- ранда KEY
RECFORM—FIXUNB UNDEF каждого файла FIXUNB разрешается только тогда, когда не задан операнд AFTER—YES RECSIZE=(r) файдов с форматом записей UNDEF г = регистр 2—12, содержащий длину записи SEEK ADR—имя каждого файла восьмибайтовое поле указателя до- рожки SRCHM=YES поиска на нескольких дорожках в макрокоманде READ или WRITE должен быть операнд KEY TYPEFLE= INPUT каждого файла INPUT указывает на чтение и провер- ку меток OUTPUT OUTPUT записывает метки VERIFY=YES контроля записи на 2311 на 2321 контроль проводится всегда WRITEID=YES задания операнда ID в макрокоманде WRITE WRITEKY=YES задания операнда KEY в макрокоманде WRITE XTNTXIT=hmh обработки карт экстента § Рис. 18.8. Операнды DTFDA.
660 Гл, 18. Макрокоманды rDOS место для ключа. Если операнд KEY не указывается, то в IOAREA1 будет отводиться место только для данных. Когда задается операнд FIXUNB и между длиной, указанной операндом BLKSIZE, и физической длиной записей на диске вдруг обна- руживается противоречие, то будет зафиксирован признак невер- ной длины записи (WLR). В случае файлов с записями неопре- деленной длины признак WLR будет фиксироваться тогда, когда длина, указанная в регистре RECSIZE, не согласуется с длиной записи на диске. Если отсутствует операнд AFTER = YES, то Ro не исполь- зуется. Если этот операнд используется, то поле данных содержит запись COCR (восьмибайтовую запись CCHHRLLb), дающую ID последней записанной на дорожку записи, и счетчик LL, где LL — число байтов, оставшихся на дорожке. Последний байт поля не используется. В файлах с прямым доступом осуществить поиск имеющейся записи можно, либо использовав адрес дорожки и записи, MBBCCHHR, либо указав адрес дорожки и отыскивая запись по ключу. Когда задан операнд SRCHM=YES, поиск по ключу на равно распространяется в случае необходимости на следующие дорожки цилиндра. Если этот операнд отсутствует, поиск осуще- ствляется в пределах одной указанной дорожки, и если в этом случае равного ключа на дорожке не обнаружится, будет зафик- сирован признак Запись не найдена. Когда поиск распространяется на следующие дорожки и запись не обнаруживается, будет фикси- роваться не признак Запись не найдена, а признак Конец цилиндра. Если в файле ключей нет, выборка записи возможна только с использованием идентификатора ID. Заменить имеющуюся запись можно, просто воспользовав- шись макрокомандой WRITE, а прочитать ее с помощью анало- гичной по структуре макрокоманды READ. Задавая операнд AFTER, можно добавлять новые записи. Макрокоманда WRITE с указанием в поле операнда AFTER означает, что запись надо поместить вслед за последней имеющейся на указанной дорожке записью: Чтобы убедиться, имеется ли на этой дорожке достаточ- но места для новой записи, а если используются ключи, то и для ключа, проверяется Ro- Если места достаточно, производится запись, a Ro корректируется; если места нет, фиксируется признак Места нет. Требующийся в DTFDA операнд SEEK ADR=имя опре- деляет восьмибайтовое поле MBBCCHHR, которым -IOCS поль- зуется для поиска нужной дорожки. Когда команда обращается только к дорожке или когда для поиска нужной записи поль- зуются ключом, последний байт R этого поля не нужен. Необязательный операнд IDLOC=hmh указывает пятибай- товое поле. После очередной операции чтения или записи IOCS
18.10. Макрокоманда DTFDA 661 помещает в поле IDLOC величину CCHHR. Когда задан операнд SRCHM=YES, этой величиной будет ID последней прочитан- ной или записанной записи. Если SRCHM не задан, то это будет ID следующей по порядку записи в файле. ID не формируется, если обнаружено EOF или RZERO. Следует отметить еще, что когда задан операнд SRCHM=YES, во всех макрокомандах READ и WRITE должен указываться операнд KEY; обращение к запи- сям по ID или AFTER не разрешается. Необходимый в DTFDA операнд ERRBYTE =имя задает двухбайтовое поле, в которое IOCS заносит признаки ошибок. Поскольку макрокоманды READ и WRITE .только начинают операции ввода — вывода, нужно задавать макрокоманду WAITF, которая приостановит обработку до тех пор, пока не завершится операция. В начале каждой операции двухбайтовое поле уста- навливается равным нулю, по окончании девять битов этого поля будут содержать признаки, а остальные биты не используются. Сразу же за макрокомандой WAITF программа обычно прове- ряет содержимое этих битов с целью обнаружения признаков каких-либо ненормальностей. В битах этих находится: Байт Бит О 1 Неверная длина записи О 4 Места нет 1 0 Ошибка данных в области счетчика 1 1 Переполнение дорожки 1 2 Конец цилиндра 1 3 Ошибка данных в области ключа или данных 1 4 Запись не найдена 1 5 Конец файла 1 6 Конец тома Остановимся кратко на отдельных макрокомандах. CNTRL fn,SEEK. Головки устанавливаются на дорожку, указанную в SEEKADR. Установка головок происходит одно- временно со счетом. Задавая команду установки до того, как запись будет читаться или записываться, мы обеспечиваем совме- щение установки головок со счетом. Поскольку макрокоманды READ и WRITE сами вызывают установку головок, эта команда не является обязательной, однако без нее совмещения со счетом не получится. WAITFfn. Влечет за собой перевод CPU в состояние ожида- ния до тех пор, пока не завершится операция с файлом. READ fn,KEY. Головка устанавливается на дорожку, ука- занную в SEEKADR. После этого осуществляется поиск ключа,
662 Гл. 18. Макрокоманды DOS равного заданному в KEYARG. Если равный ключ найден, запись данных считывается в IOAREA1. Если задан операнд SRCHM=YES, поиск в случае необходимости продолжается по всем оставшимся дорожкам цилиндра, даже когда дорожки эти принадлежат другому файлу. READ fn,ID. Головки устанавливаются на дорожку, ука- занную в SEEKADR, и запись R, заданная в SEEKADR, считы- вается в IOAREA1. В IOAREA1 считываются и поле ключа, и поле данных. WRITE fn,KEY. Поиск осуществляется точно таким же образом, что и по команде READ fn,KEY. Как только обнару- жится нужное поле ключа, данные, находящиеся в IOAREA1, помещаются в поле данных на диске. Если запись в памяти (длина которой задана в BLKSIZE=n или RECSIZE) слишком корот- ка, справа она дополняется нулями; если запись слишком длинна, то она обрезается до нужного размера. Во всех случаях длина записи на диске остается неизменной, не изменяется и поле ключа на диске. IOAREA1 содержит лишь новое поле данных. WRITE fn,ID. Поиск осуществляется таким же образом, что и по команде READ fn,ID. Как только обнаружится нуж- ный ID, содержимое IOAREA1 помещается на диск, заполняя поле ключа и поле данных. В IOAREA1 сначала должно быть расположено поле ключа, а вслед за ним поле данных. В случае необходимости будет происходить либо дополнение нулями, либо обрезание записи, но ни в коем случае на диске не меняется длина поля ключа или поля данных. WRITE fn,AFTER. Головки устанавливаются на дорожку, указанную в SEEKADR, читается Ro. Если на дорожке остав- лено достаточно места для записи (определить длину можно с помощью операнда RECSIZE), то Ro корректируется, а запись помещается на дорожку вслед за последней имеющейся там записью. Если места на дорожке не хватает, вырабатывается признак Места нет и записи не происходит. В IOAREA1 сначала должно стоять восьмибайтовое поле счетчика, за ним поле ключа (если используются ключи), а потом поле данных. Здесь невоз- можна ошибка в задании длины записи, но операнд BLKSIZE в этом случае должен определять величину достаточно большую, чтобы она соответствовала записи максимального размера. WRITE fn,AFTER,EOF. Почти такая же команда, как Л просто с операндом AFTER, но здесь еще добавляется одна деталь. После того как на дорожку помещена последняя запись,
18.11. Макрокоманда DTFIS 663 будет записан конец файла (длина данных == 0). Заметьте, что при чтении обнаружение записи EOF будет вызывать возбужде- ние соответствующего бита в поле ERRBYTE. WRITE fn,RZERO. Головки устанавливаются на дорожку, указанную в SEEKADR. В поле Ro записывается CCHHRLLb, Где R = 0, a LL равно максимальной емкости дорожки (для 2311 этот максимум равен 3625). После этого остальная часть дорожки затирается. Макрокоманда нужна для подготовки области на диске. Для одного и того же файла разрешается перемешивать произ- вольным образом операции различных типов, операции с KEY и операции с ID. Допускается любая комбинация макрокоманд READ и WRITE. 18.11. Макрокоманда DTFIS На рис. 18.9 приведены все операнды определения индексно- последовательных файлов. Операнд IOROUT определяет тип обработки, причем LOAD означает, что файл должен быть создан или что существующий файл должен быть расширен добавлением записей в конце файла. Когда индексно-последовательный файл создается, записи на нем должны быть в возрастающей последо- вательности. Отсутствие такого рода организации записей порож- дает сигнал об ошибке в последовательности. Существование двух записей с одинаковыми ключами порождает сигнал Дублирова- ние записи. Задание операнда IOROUT=ADD означает, что к файлу будут добавляться новые записи; добавление к имеющимся в файле записям будет производиться без реорганизации всего файла. IOROUT=RETRVE означает, что записи из файла будут счи- тываться, и, может быть, как-то корректироваться, но новых записей добавляться не будет. Предусмотреть выполнение функ- ций ADD и RETRVE позволяет задание операнда IOROUT= =ADDRTR. Преимущество задания ADD или RETRVE заклю- чается в том, что в первом случае используется программа IOCS гораздо меньшего объема и таким образом экономится память. Поскольку при операции LOAD предполагается последова- тельная обработка, а при операции ADD подразумевается про- извольное добавление, то задание операнда TYPEFLE необхо- димо лишь для ADDRTR и для RETRVE. Если стоит операнд SEQNTL, то доступ к файлу будет последовательным и исполь- зоваться будут при этом макрокоманды GET и PUT; в этом случае Для программиста не будет никакой разницы между таким файлом и любым файлом с последовательной организацией. Если будет задано RANDOM, то будут использоваться макрокоманды READ
Операнд Требуется для Замечания CYLOFL=n DSKXTNT=n DEVICE=2311 2321 HINDEX—2311 2321 областей переполнения цилиндра каждого файла файлов на 2321 самого большого индекса на 2321 п — число дорожек для области пере- полнения п — максимальное число экстентов для файла IOAREAL=hmh IOAREAR—имя IOAREAS—имя IOREG=(r) IOROUT=LOAD ADD RETRVE ADDRTR K.EYARG=HMfl IORO.UT=?^ RETRVE TYPEFLE=^ SEQNTL TYPEFLE RANDOM обработки сблокированных записей в области ввода — вывода r= регистр 2—12, содержащий адрес записи каждого файла выборки по ключу создание или расширение файла добавление к файлу новых записей выборка записей (допускается их изме- нение) добавление и выборка записей
KEYLEN=d каждого файла KEYLOC-n сблокированных файлов п —• длина всех ключей п — номер байта в записи, где распо- ложен старший байт ключа MSTIND=YES использования мастер-индекса NRECDS=n каждого файла п = коэффициент блокирования (число записей в блоке); п = 1 — несблоки- рованные записи RECFORM=FIXUNB FIXBLK RECSIZE—n TYPEFLE—RANDOM SEQNTL RANSEQ каждого файла каждого файла IOROUT=RETRVE или ADDRTR VERIFY=YES WORK L= имя WORKR=hmh WORKSITES контроля при записи на 2311 задания IOAREAL задания IOAREAR и обработки запи- сей в рабочей области задания IOAREAS и обработки запи- сей в рабочей области п = длина записи обработка произвольная обработка последовательная обработка произвольная и последова- тельная на 2321 контроль проводится всегда IOREG игнорируется IOREG игнорируется Рис. 18.9- Операнды DTFIS.
666 Гл. 18. Макрокоманды DOS и WRITE; файл будет таким же, как и файл с прямым доступом с ключами. Когда же будет задано RANSEQ, можно пользоваться и макрокомандами GET, и макрокомандами READ, но писать и корректировать записи уже нельзя. Все индексно-последовательные файлы должны иметь ключи. Если файл несблокированный, ключ на диске представлен как поле ключа, а данные — как поле данных. Операнд KEYLEN указывает длину поля ключа, a RECSIZE длину поля данных. В DOS на индексных файлах разрешаются только записи фикси- рованной длины. Когда записи сблокированы, поле ключа должно повторяться в поле данных, причем положение поля ключа в поле данных задается операндом KEYLOC. Если записи удаляются из файла, то операнд KEYLOC=1 задавать нельзя, так как предназначенные для удаления записи получают отметку из всех единиц в первом байте. По этим же соображениям не разрешается, чтобы поле ключа имело все единицы в первом байте. В OS «отме- ченные на удаление» записи пользователю недоступны. В DOS доступны все записи, даже имеющие отметку об удалении. Операнд CYLOFL=n указывает число дорожек, отводимое под область переполнения цилиндра. Этот операнд должен быть написан всегда, когда задается операнд LOAD, ADD или ADDRTR и ожидается использование области переполнения. Если имеется операнд RETRVE, то этот операнд задавать не требуется. Очень важно знать еще два специальных поля в 'памяти. В однобайтовое поле с именем, получающимся добавлением буквы С к имени файла, заносится информация об ошибках и различных отклонениях от нормы. В случае IOROUT=LOAD биты в этом поле содержат следующую информацию: Бит О Ошибка на диске 1 Неверная длина записи 2 Основная область данных полна 3 Область индекса цилиндров полна 4 Мастер-индекс полон 5 Дублирование записи 6 Ошибка в последовательности 7 Не используется В случае IOROUT LOAD значения битов следующие: Бит О Ошибка на диске 1 Неверная длина записи 2 Конец файла 3 Запись не найдена 4 Указан запрещенный ID (макрокоманда SETL)
18.11. Макрокоманда DT FIS 667 5 Дублирование записи 6 Область переполнения полна 7 Переполнение. Обрабатываемая запись находится в области переполнения (не ошибка) Содержимое байта устанавливается с каждой макрокомандой GET, PUT или WAITF. Имя второго поля получается добавлением буквы Н к имени файла. Это восьмибайтовое поле, в которое IOCS помещает ID последней записи в форме MBBCCHHR. Если записи сблоки- рованные, то в этом поле будет находиться ID блока, если запись не в области переполнения. Байты поля имя-файлаН заполняют- ся одновременно с полем имя-файлаС. Прежде чем продолжать рассмотрение различных макро- команд, давайте обратимся к операндам IOAREA и WORK. Операнд IOAREAL используется, когда файл загружается. Он определяет область, которая должна быть достаточной для размещения: 1. восьмибайтового поля счетчика; 2. ключа блока; 3. каждой записи в блоке. Таким образом общий размер IOAREAL должен быть равен 8 + KL + RL*NRECDS, где KL — длина ключа, RL — длина записи, a NRECDS — коэффициент блокирования (для несблоки- рованных файлов он равен 1). Задавать WORKL необходимо, когда производится загрузка файла или добавление записей в файл. Для несблокированных файлов в области WORKL содержатся ключ и данные; для сблокированных в ней будут только данные. Во время выполнения макрокоманды WRITE содержимое WORKL будет меняться, так что если программист захочет сохранить запись, он должен где-нибудь еще иметь ее дубликат. Когда файл работает в режиме произвольных обращений, должен быть указан операнд IOAREAR. В определяемой им обла- сти следует выделить место для всех записей в блоке. Таким обра- зом, размер определяется как RL*NRECDS. Если записи будут обрабатываться в рабочей области, то задается также и WORKR (а операнд IOREG не используется). WORKR задает область длиной RL. Когда обращение к записям осуществляется последовательно, следует задать операнд IOAREAS. В определяемой им области Должно быть обеспечено место для ключа и данных в случае несблокированных записей; в случае сблокированных записей место нужно только для записей. Следовательно, длина обла- сти IOAREAS, определяется как KL + RL для несблокиро- ванных файлов и RL*NRECDS для сблокированных файлов.
Области ввода — вывода Рабочие области FIXUNB FIXBLK FIXUNB FIXBLK Загрузка файла 8 + KL+ RL 8 + KL + RL*NRECDS KL + RL RL Добавление новых записей 8 + KL + 10 + RL 8+ KL + 10+ RL 8+ KL + RL*NRECDS KL + RL RL Произвольная выборка 10+ RL 10+ RL RL*NRECDS RL RL Последовательная выборка 10 + KL + RL 10 + KL + RL 10+ KL + RL’NRECDS KL + RL RL Когда даны два размера, надо пользоваться большим. Рис. 18.10. Размеры рабочих областей и областей ввода — вывода для индексно-последовательного файла-
18.11. Макрокоманда DTFIS 669 Если записи будут обрабатываться в рабочей области, то операнд WORKS задает область длиной KL 4- RL для несблокирован- ных файлов и RL для сблокированных. Чтобы разрешить переполнение при добавлении записей, когда RL*NRECDS меньше 10 4* RL, общий размер, указанный в IOAREAL, должен быть 8 + KL + 10 4- RL. Аналогичным образом операнд IOAREAR должен задавать длину, равную по крайней мере 10 4- RL, a IOAREAS — длину 10 4- KL 4- RL для несблокированных файлов и 10 4* RL для сблокированных. На рис. 18.10 приведены все требования на размер областей ввода — вывода и рабочих областей. Макрокоманды OPEN и CLOSE для индексно-последователь- ных файлов используются точно так же, как и для всех других файлов. Чтобы загрузить файл или расширить существующий, используются макрокоманды SETFL fn WRITE fn.NEWKEY ENDFL fn Макрокоманда SETFL готовит файл для загрузки записей. Ее сле- дует выполнять после макрокоманды OPEN и до первой макро- команды WRITE. Макрокоманда ENDFL выполняет: запись конца файла вслед за последним блоком; если необходимо, то установку индексов фиктивных дорожек для последних дорожек в экстенте; в случае необходимости запись неполного блока. Макрокоманда может писаться только после всех макрокоманд WRITE и перед макрокомандой CLOSE. С помощью макрокоманды WRITE осу- ществляется запись, причем присутствие операнда NEWKEY указывает на то, что записываться будет новая запись, которую перед тем, как задавать команду записи, следует поместить в область WORKL. Если файл несблокирован, то в рабочей обла- сти самой записи должен предшествовать ключ. Во время процес- са записи содержимое WORKL может быть испорчено. При добавлении к файлу новых записей макрокоманды SETFL (задать режим загрузки файла) и ENDFL (прекратить режим загрузки файла) не требуются. Здесь используется лишь одна макрокоманда WRITE fn.NEWKEY Для произвольной выборки и корректирования записей исполь- зуются макрокоманды READ fn.KEY WRITE fn.KEY Операнд KEY будет расшифрован IOCS как чтение или замена существующей уже записи. Перед тем как задать макрокоманду чтения или записи, ключ надо поместить в KEYARG. Макро-
670 Гл. 18. Макрокоманды DOS команда READ будет помещать запись в WORKR, а если рабо- чей областью не пользуются и записи сблокированы, то будет устанавливать содержимое регистра, заданного в операнде IOREG. Если несблокированные записи обрабатываются в IOAREAR, то для того чтобы определить, находится ли запись в IOAREAR или в IOAREAR + 10, необходимо проверить бит переполнения в области имя-файлаС. Запись при осуществлении самого про- цесса записи должна быть помещена в рабочую область WORKR или в область, указанную содержимым IOREG, но может быть и так, что она помещается в области IOAREAL или в IOAREAL + 4- 10. Если сразу же за макрокомандой READ для некоторой записи стоит макрокоманда WRITE для этой же самой записи, то ключ будет находиться еще в KEYARG. Поскольку макрокоманды READ и WRITE только начинают операцию, следует пользоваться макрокомандой WAITF fn для того, чтобы заполнить поле имя-файлаС и поле имя-файлаН и дождаться окончания операции. CPU переводится в состояние ожидания до тех пор, пока операция над указанным файлом не завершится. При последовательной обработке после макрокоманды OPEN и перед тем, как писать или читать какие-либо записи, в програм- ме должна быть выполнена макрокоманда SETL 1п,операнд2 Эта макрокоманда (установить пределы) определяет, какая запись первой должна быть обработана программой. В качестве операнда2 могут быть: KEY BOF GKEY имя-ID W Если в поле операнда стоит KEY, то первой обрабатываемой записью будет запись с ключом, равным ключу в KEYARG. Если в поле операнда стоит GKEY, то первой будет запись с ключом, большим или равным ключу в KEYARG. Операнд GKEY позво- ляет осуществить обращение по всем ключам, находящимся в определенном интервале. Программист может и не знать ключей точно. Если в поле операнда стоит BOF, это означает, что первой обрабатываемой записью будет запись в начале файла, т. е. первая запись файла. Когда в операнде2 задается имя или (г), содержимое восьмибайтового поля с указанным адресом используется как ID блока, который должен быть обработан первым. Как правило,
18.12. Модули IOCS 671 ID будет указываться в поле имя-файлаН. Помните, однако, что когда мы имеем дело с записями, переполняющими файл, ID может измениться при добавлении записей и реорганизации файла. Обращение к записи становится возможным после того, как заданы макрокоманды GET fn GET £п,имя-рабочей-области Использование одной или другой макрокоманды зависит от того, задан ли операнд WORKS=YES. При работе с несбло- кированными записями читаются и ключ, и данные, а для сблоки- рованных файлов в рабочую область считывается только запись. Работая с макрокомандами GET и PUT, задавать макрокоманды WAITF нет необходимости, поскольку они не возвращают управ- ления программе до тех пор, пока не станет возможным обраще- ние к очередной записи. Заменить запись другой (или изменить существующую) можно с помощью макрокоманд PUT fn PUT 1п,имя-рабочей-области Использование одной или другой зависит от того, задан ли операнд WORKS=YES. Заменить можно только ту запись, которая перед этим была прочитана макрокомандой GET. Отметим, что при последовательной обработке допускается замещение записи, но не разрешается добавление новых. После всех макрокоманд PUT и GET, но перед макрокоман- дой CLOSE может стоять макрокоманда ESETL fn Ее действие заключается в том, что если для какой-либо записи в последнем прочитанном блоке задавалась макрокоманда PUT, то этот блок должен быть перезаписан. Когда имеется операнд TYPEFLE=RANSEQ, то перед каждой произвольной выбор- кой должна выдаваться макрокоманда ESETL, а при очередном переходе к последовательным выборкам пишется другая макро- команда SETL. • Вместо имени-файла в макрокомандах SETFL и ENDFL можно использовать (г) или (0), в макрокоманде SETL может быть (г), а в остальных макрокомандах GET, PUT, WRITE, READ,. WAITF и ESETL имя-файла можно заменить на (г) или (1). 18.12. Модули IOCS Мы уже рассмотрели восемь предложений определения файлов в DOS, которые используются на логическом уровне IOCS. Каж-
672 Гл. 18. Макрокоманды DOS дое определение вырабатывает для какого-то конкретного файла таблицу констант. Одной из этих констант будет адресная кон- станта типа V, содержащая название подпрограммы IOCS. Всего имеется несколько сот таких подпрограмм. Обычно для каждой конкретной установки выбирается ряд наиболее часто исполь- зуемых, и они включаются в библиотеку перемещаемых модулей. Поиск программы по названию, заданному константой типа V, осуществляется автоматически во время работы Редактора связей с помощью предусмотренных в DOS средств, обеспечивающих авто- матическое подключение модулей. Найденная программа авто- матически включается в редактируемую программу пользователя. Автоматический поиск начинается тогда, когда обнаруживается, что в редактируемом модуле невозможно разрешить какие-либо внешние ссылки. Может случиться так, что требуемого модуля в библиотеке перемещаемых модулей не окажется, и тогда Редактор связей выдаст сообщение об ошибке. В DOS пользователю разрешено вызывать подходящую под- программу IOCS и для включения ее в свою программу, и для использования ее совершенно независимо от какой бы то ни было программы. Если подпрограмма IOCS включается в программу и представляет вместе с ней единое целое, то поиск в библиотеке во время редактирования не нужен, а если ею будут неоднократно пользоваться как отдельной независимой программой, то объект- ный модуль должен быть отперфорирован и включен в библиоте- ку перемещаемых модулей. Когда используются определения DTFCN и DTFSR, подпрограммы IOCS всегда генерируются как часть той программы, которая порождена макрокомандой DTF. Это означает, что если два аналогичных файла определены макро- командами DTFSR, то одна подпрограмма IOCS будет генери- роваться дважды и дважды войдет в программу пользователя. Очевидно, что в этом случае и время трансляции возрастет, и памяти будет использоваться больше, чем на самом деле необ- ходимо. Другие определения порождают для конкретного файла только набор констант, в который входит константа типа V. Запросить подпрограмму IOCS программист тогда должен одним из трех способов: либо во время работы Редактора связей ввести ее с карт, выдав управляющую карту INCLUDE, либо взять ее из библиотеки перемещаемых модулей, либо записать в своей программе макрокоманду xxMOD. Для каждого типа определения файла существует своя макрокоманда, порождающая подпрограм- му IOCS. Всего макрокоманд шесть: CDMOD, PRMOD, MTMOD, SDMOD, DAMOD и ISMOD. Рассмотрим их по порядку. CDMOD. Операнды у нее следующие: RECFORM=FIXUNB
18.12. Модули IOCS 673 VARUNB UNDEF CTLCHR=YES ASA CONTROL=YES TYPEFLE=INPUT OUTPUT CMBND WORKA=YES IOAREA2=YES DEVICE=2540 1442 2501 2520 CRDERR=RETRY Выбрав соответствующие операнды, можно обеспечить генера- цию модуля для нужного DTFCD. Назван этот модуль будет IJCabcde, где а = F, V или U в зависимости от RECFORM; b = Y, если взят операнд CTLCHR=YES; А, если операнд CTLCHR=ASA; С, если есть операнд CONTROL=YES; Z, если нет ни одного из этих операндов; с = I, О или С в зависимости от TYPEFLE; d = W, если задан операнд WORKA; I, если есть IOAREA2; В, если есть и тот, и другой; Z, если не указан ни один из них; е = 0 для 2540; 1 для 1442; 2 для 2520; 3 для 2501; 4 для 2540 и CRDERR; 5 для 2520 и CRDERR. Таким образом, модуль IJCFZIW3 предназначен для DTFCD, определяющего чтение несблокированных записей фиксированной длины с 2501 в рабочую область. PRMOD. Операнды у нее следующие: RECFORM=FIXUNB VARUNB UNDEF CTLCHR=YES ASA CONTROL=YES PRINTOV=YES IOAREA2=YES WORKA=YES Название модуля IJDabcde, где a = F, V или U точно так же, как и в CDMOD; b = Y, А, С или Z так же, как и в CDMOD; с = Р, если задан PRINTOV, и Z, если его нет; 43 Зак. 15635
674 Гл. 18. Макрокоманды DOS d = I, если есть I0AREA2, и Z, если его нет; е = W, если .задан WORKA, и Z, если его нет. (Если операнд опущен, то считается, что задано то, что у нас подчеркнуто.) Полезно знать, что некоторые модули являются подмножеством других. Например, IJDFAZIW представляет собой подмножество модуля IJDFAPIW. Допускается использование модуля, включающего в себя тот, который в действительности необходим. В этом случае просто понадобится больше памяти, а результат получится тот же самый. Пользуются такими моду- лями, в которые входят подмножества, необходимые пользова- телю, для того, чтобы не писать другой макрокоманды xxMOD или в том случае, если это дает двум или нескольким файлам воз- можность использовать одну и ту же подпрограмму IOCS. MTMOD. Операнды у нее следующие: RECFM=FIXUNB FIXBLK VARUNB VARBLK UNDEF TYPEFLE=INPUT OUTPUT WORK READ =FOR WARD BACK CKPTREC=YES worka=Yes Название модуля IJFabcdZ, где a == F, V или U (блокирование игнорируется); b = В, если имеется операнд READ=BACK, и Z в против- ном случае; с = С, если задан CKPTREC, и Z в противном случае (тре- буется это для записей контрольных точек, которых мы не рас- сматривали); d = W, если имеется WORKA, и Z в противном случае. Для рабочих лент кроме операнда TYPEFLE указывается еще ERROPT=YES NOTEPNT=YES POINTS Название модуля IJFWbcZZ, где Ь Е, если есть ERROPT, и Z в противном случае; с = N, если указан операнд NOTEPNT=YES; S, если указан операнд NOTEPNT=POINTS; Z, если нет ни одного из них.
18.12. Модули IOCS 675 SDMOD. Для генерирования модулей SD (последовательная работа с устройствами прямого доступа) существует десять различных макрокоманд. Девять из них используются при гене- рировании подпрограмм IOCS для обычных файлов. Макро- команды имеют вид SDMODrt где г — F, V или U в зависимости от типа файла (с записями фик- сированной, переменной или неопределенной длины), a t — I, О или U в зависимости от того, вводится, выводится или коррек- тируется файл. Десятая макрокоманда выглядит следующим образом: SDMODW. Эта макрокоманда служит для генерирования подпрограммы IOCS для рабочих файлов. Поскольку мнемонический код этих макрокоманд состоит более чем из пяти символов, он не уместится в поле операции на стандартном бланке для программирования на языке Ассем- блера. Мнемонические коды операции записываются, начиная со стандартной позиции на бланке и захватывают поле операнда. Код операции от первого операнда отделяется по крайней мере одним пробелом. На картах продолжения продолжать можно предложение, начиная со стандартной колонки продолжения (т. е. колонки 16). В макрокомандах SDMOD указываются сле- дующие операнды: CONTROL-YES ERROPT=YES TRUNCS-YES NOTEPNT-POINTRW YES I PD ATE-YES Операнды CONTROL и ERROPT пишутся во всех макрокомандах SDMOD. Операнд TRUNCS применяется только к файлам с запи- сями фиксированной длины. Операнды NOTEPNT и UPDATE пишутся только для рабочих файлов. Для всех файлов, кроме рабочих, название модуля представ- ляет собой IJGabcde, где а — F, V или U; берется из названия макрокоманды; b — I, О или U; берется из названия макрокоманды; с — Е, если имеется операнд ERROPT, и Z в противном случае; d — Т, если задан операнд TRUNCS, и Z в противном случае; е — С, если есть операнд CONTROL, и Z в противном случае. 43*
676 Гл, 18. Макрокоманды DOS Для рабочих файлов название модуля построено следующим образом: IJGWcfeZ, где сие обозначают то же, что и для обыч- ных файлов, а f = R, если задан операнд NOTEPNT=POINTRW; N, если указывается YES, и Z, если ни один из них не присутствует. DAMOD. Операнды у нее следующие: RECFM=FIXUNB UNDEF AFTER=YES IDLOG=YES Название модуля IJIabcZZ, где a == F для файлов с записями FIXUNB; В для файлов с запи- сями UNDEF (модуль с В годится и для UNDEF, и для FIXUNB); b = А, если имеется AFTER=YES, и Z в противном случае; с = I, если задан операнд IDLOC=YES; и Z в противном случае. ISMOD. Операнды у нее следующие! i0R0UT=L0AD ADD RETRVE ADDRTR RECFORM=FIXUNB FIXBLK BOTH TYPEFLE=RANDOM SEQNTL RANSEQ Модуль имеет название IJHabcZZ, где a = U для FIXUNB, когда b = I или А; В для FIXBLK, когда b = I или А; А для BOTH, когда b = I или A; Z, когда заданы LOAD или RETRVE (это уже предполагает BOTH); b = L для LOAD; I для ADD; R для RETRVE; А для ADDRTR; c = R для RANDOM; S для SEQNTL; В для RANSEQ; Z, если опущен операнд TYPEFLE (этот операнд должен обязательно присутствовать, если в IOROUT задан операнд RETRVE или ADDRTR). SEPASMB=YES. Операнд такого вида можно добавить к любой из перечисленных выше макрокоманд xxMOD. Он ука- зывает, что DTF транслируются независимо (SEParate ASseMBly) и поэтому в программе должны быть предложения ENTRY с тем, чтобы модуль можно было вызвать другими программами.
18.13. Физический уровень IOCS 677 MODNAME=hmh. Этот операнд можно поставить в любое определение файла, за исключением DTFCN и DTFSR. Здесь имя — это имя модуля, который надо включить в программу. В том случае, когда одним и тем же модулем IOCS могут вос- пользоваться несколько файлов, программист во всех соответ- ствующих определениях файлов может указать этот модуль. Естественно, перед этим он должен убедиться, что модуль дей- ствительно обеспечит выполнение всех тех операций, которые он намерен осуществить. Но уж если он идет на экономию моду- лей, он действительно экономит место в памяти. В случае про- грамм для работы с диском эта экономия может превышать 2 000 байтов. Чтобы проиллюстрировать описанные возможности, разберем примеры разд. 18.6. В первом примере мы могли бы включить в свою программу CDMOD WORKA=YES,DEVICE=2540 MTMOD WORKA=YES и тогда автоматически в объектную программу были бы включе- ны модули IJCFZIW0 и IJFFZZWZ. Во второй программе макро- команду MTMOD можно было бы оставить такой же, a CDMOD изменить так: CDMOD DEVICE =2540 и тогда генерировался бы модуль IJCFZIZO. В третьей программе макрокоманда CDMOD остается такой же, как и в первой, но у MTMOD уже не надо писать операндов совсем. В этом случае будет вызываться модуль IJFFZZZZ. В четвертой программе происходила бы генерация модулей IJCFII3 и IJFFZZZZ, если были бы записаны макрокоманды CDMOD DEVICE=2540,IOAREA2=YES MTMOD 18.13. Физический уровень IOCS Чтобы определить файл для физического уровня IOCS, поль- зуются макрокомандой DTFPH. Эта макрокоманда требуется только тогда, когда IOCS должна либо проверять стандартные метки, либо их записывать. Во всех других случаях в ней нет необходимости. Операнды у нее следующие: DEVICE=ТАРЕ 2311 2321 DEVADDR=SYSnnn
678 Гл. 18. Макрокоманды DOS LAB ADDR =имя TYPEFLE=INPUT OUTPUT XTNTXIT=hmh MOUNTED=ALL SINGLE Операнд LABADDR пишется только в том случае, если надо вести обработку меток пользователя. Для передачи управления из программы пользователя на IOCS используется макрокоманда LBRET. Операнд XTNTXIT указывает программу для обработ- ки информации на картах экстента; если этой обработки не тре- буется, то операнд опускается. Операнд MOUNTED необходим для всех файлов на DASD. Операнд ALL указывает на то, что все экстенты файла станут после макрокоманды OPEN доступными; SINGLE означает, что доступен только первый экстент. В послед- нем случае пользователю придется каждый раз, как только для обработки понадобится еще один экстент, выдавать новую макро- команду OPEN. Макрокомандами OPEN, CLOSE, LBRET и FEOV можно пользоваться, когда файл определен в макрокоманде DTFPH. Макрокомандами EXCP, WAIT и ССВ физическая IOCS может пользоваться даже тогда, когда файл ни в одном DTF не определен. Макрокоманда ЕХСР (Выполнить программу канала) имеет следующие форматы: ЕХСР имя-блока ЕХСР (г) ЕХСР (1) Имя-блока — это символический адрес макрокоманды ССВ, а (г) или (1) указывает регистр, содержащий адрес блока ССВ. Будет выполняться программа канала, задаваемая в ССВ. Фактически операция только запускается и управление тут же возвращается в программу пользователя. Содержимое регистра 1 портится этой макрокомандой, если она не была записана в формате ЕХСР (1) Макрокоманда WAIT имя-блока WAIT (г) WAIT (1) переводит CPU в состояние ожидания до тех пор, пока не завер- шится указанная операция. Если макрокоманда записана не в по- следнем формате, то содержимое регистра 1 ею портится. Макрокоманда ССВ, которая имеет формат ССВ SYSnnn,aflpec-ccw,X'nnnn'
18.14. Пример 679 служит для создания Блока управления командами канала (Command Control Block). Последний операнд необязателен. Второй операнд задает адрес первого CCW программы канала. SYSnnn может определять любое имеющееся в комплекте маши- ны устройство. Макрокоманда ССВ порождает 16-байтовый блок, в котором находится следующая информация. Байты 0—1 Счетчик. Сюда IOCS помещает содержимое счетчика из последней операции канала. Это облегчает контроль длины записи. 2—3 Байты признаков. 4—5 Байты состояния из CSW в момент окончания работы канала. Если задано, что о сигнале УВВ кончило должно быть сообщено, то сюда же будут приформированы байты состояния CSW в момент окончания работы устройства (по операции логическое ИЛИ) 6—7 Имя устройства, взятое из спецификации SYS. 8 Нули 9—11 Адрес первого CCW 12 Нули 13—15 Адрес CCW из CSW, запоминающегося по сигналу Канал кончил. Если в макрокоманде имеется третий операнд, то эти четыре шестнадцатеричные цифры будут первоначальным содержимым байтов признаков. Содержимое этих байтов будет изменяться системой управления вводом — выводом (IOCS) по мере осуще- ствления операций. Пользователь может захотеть в какие-то моменты работы своей программы изменить их. Для этого он должен будет использовать адрес-ССВ + 2 или 3. Содержимое байтов признаков приведено на рис. 18.11. 18.14. Пример В качестве примера использования IOCS рассмотрим задачу поколонного считывания двоичных карт с читающего устрой- ства и помещения записей в индексно-последовательный файл, объединяя их по пять карт в блок. Колонками 4—5 карты мы будем пользоваться как полем ключа, а остальные колонки пере- ставим таким образом, чтобы на диске они оказались в следующем порядке: колонки 1—3, колонки 6—20, колонки 4—5 и затем колонки 21—80. Поскольку в DOS логическая IOCS занимается только чтением карт в режиме 1, мы для осуществления нужной нам операции Должны воспользоваться физической IOCS (PIOCS). Но для
Байт Бит Что (кто) сбрасывает Что (кто) возбуждает 2 0 Бит связи ЕХСР Канал кончил, если бит .5 в байте 2 сброшен. УВВ кончило, если бит 5 в байте 2 возбужден. 1 EOF (конец файла) ЕХСР /♦ или /& 2 Неустранимая ошибка ЕХСР Не выполнен ввод — вывод,. 3 Принять неустранимую ошибку Программист Программист. Отказ от выполнения команды канала, ошибка в программе, сбой в аппаратуре для ленты — все это будет прекращать выполнение програм- мы. Если бит возбужден, то в конце концов IOCS передает управление про- грамме пользователя; если бит сброшен, запрашивается вмешательство опера- тора. 4 Вернуть управление при ошибках в данных на DASD Программист Программист. Если бит возбужден, то IOCS в случае обнаружения ошибки в данных передает управление про- грамме; если бит сброшен, запраши- вается вмешательство оператора. 5 Сообщить о сигнале УВВ кончило Программист Программист. Если бит возбужден, то бит связи не возбуждается до.тех пор, пока не появится сигнал УВВ кончило. 6 Вернуть управление при ошибке, обнаруженной при контроле записи на ленту или диск, а также при Программист Программист. Если бит возбужден, IOCS передает управление в случае ошибки на программу; если бит сбро-
ошибке перфорации. шен, запрашивается вмешательство опе- ратора. 7 Программа пользователя обработки ошибок Программист Программист. Если бит возбужден, то ошибки в устройстве обрабатывает про- граммист; если бит сброшен, исполь- зуются программы IOCS. 0 Ошибка в данных на DASD в обла- сти счетчика ЕХСР Ошибка в области счетчика. Бит 2 в байте 2 возбуждается, бит 3 в бай- те 3 сбрасывается. 1 Переполнение дорожки ЕХСР Переполнение дорожки. 2 ЕОС (конец цилиндра) ЕХСР Конец цилиндра. 3 Сбой в аппаратуре перфоратора; ошибка чтения с ленты Ошибка чтения или контроля записи данных на DASD ЕХСР ЕХСР Невыполнившаяся операция. Бит 2 в байте 2 также возбуждается. Невыполнившаяся операция. Бит 2 в байте 2 также возбуждается. Это про- исходит, если бит 5 в байте 2 воз- бужден. 4 Сомнительная ситуация ЕХСР Карты: неверная последовательность команд. DASD: запись не найдена. 5 Не используется . . . Всегда нулевой. 6 Пробивка в дорожке 9 печатающего устройства Ошибка контроля записи на DASD ЕХСР ЕХСР Пробивка в дорожке 9. Возбуждается только, если бит 5 в байте 2 возбужден. Ошибка контроля. 7 Повторить цепочку команд Программист Если бит возбужден, повторяется по- следняя CCW; если бит сброшен, повто- ряется все с первого CCW. Рис. 18.11, Признаковые байты ССВ.
682 Гл. 18. Макрокоманды DOS того чтобы загрузить индексно-последовательный файл, мы возь- мем логическую IOCS. Поскольку мы для чтения карт собираемся писать свою соб- ственную программу канала, хорошо было бы использовать цепоч- ку данных, чтобы избавиться от ряда команд MVC, выполняющих переорганизацию данных. Ошибки, которые могут возникнуть, мы рассматривать не будем, а задания. Наша Р1 Р2 РЗ D2 D3 С1 С2 D1 в случае их появления просто остановим выполнение программа будет выглядеть следующим образом: PRINT NOGEN START BALR 10,0 USING *,10 OPEN DI SETFL DI EXCP Cl WAIT Cl CLC D3 (6),= X'OC0010220000' BE P3 WRITE D1,NEWKEY WAITF DI TM D1C,X'FB' BZ P2 ENDFL DI CLOSE DI EOJ DS CL812 DS CL160 CCB SYSRDR,C2,X'0000' CCW X'22',D3,X'80',6 CCW X'22',D3+36,X'80',4 CCW X'22',D3+6,X'30',30 CCW X'22',D3+40,X'00'.120 DTFIS IOROUT=LOAD,CYLOFL=1, 1 DSKXTNT=2,NRECDS=5, 2 RECSIZE=160,KEYLEN =4, 3 KEYLOC=37,IOAREAL=D2, 4 WORKL=D3,VERIFY=YES, 5 RECFORM=F1XBLK ISMOD IOROUT=LOAD END Pl Работа программы будет прекращаться в трех случаях. 1. Ошибка при чтении карт. Физическая IOCS будет запра- шивать вмешательство оператора.
18.14. Пример 683 2. Ошибка на диске. Наиболее вероятной ошибкой здесь будет нарушение последовательности за счет того, что на входе карты расположены не по порядку. 3. Признак конца файла. Так как мы работаем в режиме 2, ю карта /* сама по себе обнаружена не будет. Поэтому в нашей программе требуется двоичный эквивалент пробивок /♦, а имен- но, ОС0010220000. Во многих задачах программист дополняет свою программу разными вспомогательными программами для обработки различ- ных возможных ошибок. Упражнения № 48 1. Вернувшись к упр. 47.5, написать программу чтения коло- ды карт, которые отперфорированы следующим образом: колонки 1 4 2—9 Номер клиента 10—63 Фамилия и адрес (улица) 64—80 Пустые колонки 1 5 2—9 Номер клиента 10—36 Город, штат, ZIP (почтовый индекс) 37—46 Баланс клиента 47—80 Пустые Из каждых двух карт создать на ленте одну 100-байтовую запись. Предполагается, что входные карты рассортированы по колон- кам 2—9. 2. Изменить программу упр. 1 таким образом, чтобы созда- вался индексно-последовательный файл с записями, сблокиро- ванными по 3. В качестве ключа взять номер клиента. 3. Переписать упр. 47.5, используя файл, созданный в упр. 1. 4. Написать программу чтения карт с данными клиента, аналогичных картам упр. 1, и в индексно-последовательном файле либо осуществить замену существующей записи, либо добавить новую. 5. К наиболее важным случаям использования файлов с пря- мым доступом относится работа с большими матрицами. Написать программу, занимающуюся считыванием в память элементов
684 Гл. 18. Макрокоманды DOS матрицы, (^перфорированных следующим образом: колонки 1—2 i 3—4 j 5-12 AI(J где i 12, j 4, так что общее число элементов не превышает 48. Предположим, что первая считываемая карта содержит макси- мальные значения i и j, а уже на следующих картах помещаются элементы матрицы (всего i х j). Карты не рассортированы. Написать программу чтения этих карт, а после того, как они будут прочитаны, записать все элементы в порядке Ан, А12, • . - . . ., Aij_i, Ajj. Воспользуйтесь файлом с прямым доступом без ключей. 6. Написать программу выборки матрицы, описанной в упр. 5, с диска и расположения в памяти элементов в порядке Ац» Att,. . . . . Ai-ij, Aij. 7. В небольшом банке имеется система 360 с четырьмя диско- выми устройствами 2311. Устройство SYSRES хранит программы и не может хранить данных, но на устройствах SYS006, SYS007 и SYS008 помещаются текущие записи на несколько тысяч сче- тов. Информация, подлежащая хранению, представляет собой следующее: Номер счета Название счета Адрес Текущий баланс 6 цифр 72 буквенно-цифровых символа^ 72 буквенно-цифровых символа 10 цифр Банковские операции: одна цифра кода плюс поле для 10 цифр суммы для каждой операции. Отвести для каждого счета 500 бай- тов и накапливать в них столько банковских операций, на сколь- ко хватит места. Банковские операции закодированы следующим образом: 4 Вклад 5 Изъятие 6 Процент 7 Расходы на обслуживание 8 Разного рода кредиты 9 Разного рода дебеты Информация о банковской операции заносится на перфокарты так, что в колонках 2—7 стоит номер счета, в колонке 1 стоит код, а в колонках 17—26 помещается сумма. Если код банковской операции 1, то это означает новый счет. На этих картах в колонках 8—80 стоит название, а в колонках
18.15. Область семи 685 2—7 номер счета. Код 2 означает изменение адреса и перфори- руется с номером счета в колонках 2—7 и адресом в колонках 8—80. Фиктивный код 3 с суммой в колонках 17—26 используется для того, чтобы величину из колонок 17—26 взять в качестве нового баланса, а все зафиксированные операции отменить. Коды 3—9 могут быть отперфорированы вместе с данными в колон- ках 8—16. Процент выплачивается каждые три месяца из расче- та 5% в год. Если вклад произведен до 15-го числа месяца, то процент исчисляется с 1-го числа. Если вклад делается позже, то процент исчисляется с первого числа следующего месяца. Процент за период времени, не кратный целому числу месяцев, начисляется с округлением до целого месяца. Написать програм- му обработки информации о банковских операциях для индексно- последовательного файла. 8. Написать программу печати информации для корректиро- вания банковской расчетной книжки и одновременного стирания информации в списке банковских операций. 9. Сколько счетов может обрабатывать банк, имея три нако- пителя 2311, если записи несблокированные, а дорожка 9 остав- лена для переполнений? Предполагается, что индекс цилиндра и мастер-индекс находятся на SYSRES, a VTOC (таблица оглав- ления тома) располагается на цилиндре 0 каждого пакета. 18.15. Область связи В супервизоре имеется специальная 46-байтовая область, называемая областью связи. Содержимое ее представляет собой следующее. Байты 0—7 Дата в форме mm/dd/yy. При желании в момент гене- рации системы можно задать другую форму даты dd/mm/yy (d — день, m — месяц, у — год). Поле запол- няется управляющей картой DATE. Карта JOB вос- станавливает содержимое поля, занося туда дату, объяв- ленную во время IPL. 8—9 Минимальный адрес области, отведенной проблемной программе. Обычно это 6144 или 8192. Область памяти с адресами меньше этого числа принадлежит супер- визору. Ю—11 Резервируется для супервизора. 12—22 Область внутрипрограммной связи. Заполняется кар- той JOB двоичными нулями. 23 Индикаторы переключения программ пользователя (UPSI — User Programm Switch Indicators). Заполняет-
686 Гл. 18. Макрокоманды DOS ся картой JOB двоичными нулями. Содержимое меняет- ся картой UPSI. 24—31 Имя задания. Берется из карты JOB. 32—35 Максимальный адрес области, отведенной проблемной программе. Обычно это максимальный адрес памяти. 36—39 Максимальный адрес текущей фазы программы. 40—43 Максимальный адрес, используемый при загрузке лю- бой фазы программы. 44—45 Длина области, отведенной для меток проблемной про- граммы. Макрокоманда COMRG помещает в регистр 1 адрес самого левого байта области связи. Макрокоманда МУСОМ куда, длина, откуда используется для изменения содержимого области связи, причем меняться могут лишь байты 12—23. Любая попытка изменить что-либо кроме этих байтов приводит к ошибке. Операнд куда указывает положение самого левого байта (12—23) из тех, кото- рые должны быть изменены. Операнд длина указывает число изме- няемых байтов (1—12). Операнд откуда задает символический адрес поля, из которого берутся данные для замены указанных байтов в области связи. Третий операнд может задаваться еще в форме (г) или (Ю), где г определяет общий регистр (2—12), содержащий адрес данных, подлежащих использованию. Примеры макрокоманд: COMRG MVC DATA(5),20(l) МУСОМ 20,3,DATA LA 5,DATA+4 МУСОМ 18,1,(5) Если IBM-360 обладает средствами защиты, то супервизор поль- зуется, ключом защиты 0. Ключ 1 присваивается проблемной про- грамме. Защитой от выборки в DOS не пользуются. Следователь- но, проблемная программа вполне может что-либо прочитать в области супервизора, но записать в эту область она не сможет ничего. Макрокоманда МУСОМ порождает команду SVC для передачи управления программе супервизора, осуществляющей указанную пересылку данных. Областью внутрипрограммной связи пользуются в основном для того, чтобы дать возможность одному шагу задания переда- вать информацию последующим.
18.16» Макрокоманды супервизора 687 После карты JOB можно ввести дату, которая будет исполь- зоваться только для этого задания. Берется она из одной из двух управляющих карт И' DATE mm/dd/yy // DATE dd/mm/yy в зависимости от формы представления даты, выбранной при генерации системы. Байт UPSI можно изменить с помощью управляющей карты // UPSI пппппппп где каждое п может быть равно 0, 1 и X. Символ X показывает, что соответствующий бит изменять не надо; 0 и 1 устанавливают соответствующие биты равными 0 или 1. Если на карте задано менее восьми символов, то остаток поля заполняется справа символом X. Следовательно, карта // UPSI 0000X1 эквивалентна // UPSI 0000Х1ХХ и вызывает установку битов 0, 1, 2 и 3 равными нулю, бита 5 — единице, а остальные биты 4, 6 и 7 оставляет без изменения. В задании может быть несколько карт UPSI, причем каждая карта должна стоять перед картой ЕХЕС для того шага задания, которым эта UPSI управляет. 18.16. Макрокоманды супервизора Кроме COMRG и MVCOM, существует еще ряд других макро- команд, которые обеспечивают разного рода связи между супер- визором и проблемной программой. К ним относятся следующие. LOAD. Эта макрокоманда имеет формат LOAD имя-фазы[,адрес] где вместо имени-фазы может стоять (г) или (1) (г = 2—12), а вме- сто адреса может быть (г) или (0). Имя-фазы идентифицирует фазу, считываемую из библиотеки в память. Если второго операн- да нет, то данная фаза загружается в область памяти с адресом, определяемым при работе Редактора связей. Адрес точки входа в эту фазу (определяемый тоже в процессе работы Редактора свя- зей) помещается в регистр 1. Если во втором операнде задается адрес или указывается регистр, содержащий адрес, то этот адрес используется как началь- ный адрес области памяти, в которую будет загружена фаза.
688 Гл. 18. Макрокоманды DOS В этом случае настройки адресных констант не происходит, одна- ко точка входа меняется, а адрес ее по-прежнему помещается в регистр 1. Если на месте первого операнда стоит (г) или (1), то в регистр помещается адрес восьмибайтового поля, содержа- щего имя фазы. В фазе может не быть ни одной команды. Она может содержать, например, только таблицы и какие-нибудь данные. FETCH. Эта макрокоманда имеет формат FETCH имя-фазы [, имя-точки-входа] где вместо имени-фазы может быть написано (г) или (1), а вместо имени-точки-входа (г) или (0). Указанная первым операндом фаза считывается в память. (Имя-фазы объявляется в карте PHASE в момент внесения программы в каталог). Если второй операнд опущен, управление передается точке входа, определенной в пери- од работы Редактора связей. Если имя-точки-входа указано в макрокоманде, управление передается этой точке фазы (для этого во время составления программы нужно задать предло- жение ENTRY). Если на месте второго операнда стоит (г), то управление передается по адресу, заданному в этом регистре. Макрокоманда FETCH отличается от макрокоманды LOAD тем, что вторая просто считывает фазу в память, тогда как первая сразу после считывания выполняет ее. CANCEL. Формат этой макрокоманды очень прост: CANCEL Операндов нет. Макрокоманда вызывает прекращение выполне- ния всего задания (именно всего, а не шага задания). Дампинга не происходит. EOJ. Макрокоманда EOJ прекращает выполнение шага задания DUMP. Макрокоманда DUMP прекращает выполнение шага задания и осуществляет дампинг на SYSLST. Выдается состояние регистров и памяти в шестнад- цатеричной системе. PDUMP. Макрокоманда PDUMP адрес! ,адрес2
18,16. Макрокоманды, супервизора 689 вызывает дампинг регистров и участка памяти, начинающегося с адреса! и кончающегося адресом2. Операнды могут быть заданы еще в форме (г) или адресным выражением. После дампинга про- блемная программа возобновляет работу со следующей по по- рядку команды. Есть еще две макрокоманды, которые используются, когда в системе установлен таймер. SETTIME. Макрокоманда SETTIME секунды SETTIME (г) SETTIME (1) устанавливает в таймере величину, равную заданному числу секунд. Если в качестве операнда записан регистр, то в нем нахо- дится это число секунд. Максимально допустимым значением является 55 924 секунды, равное 15 часам, 32 минутам и 4 секун- дам (это максимальное значение таймера). Если время задается в регистре, то число секунд должно представляться двоичной величиной. GETTIME. Макрокоманда GETTIME STANDART GETTIME BINARY GETTIME TU служит для получения времени суток. Если указывается операнд ST AND ART, время в форме 0HHMMSS + передается в регистр 1. Это десятичное число в упакованном формате (S — секунды, М — минуты, Н — часы). Если записан операнд BINARY, то время передается в секундах как двоичное целое. Если операнд имеет вид TU, то в регистр 1 поступает время в единицах тайме- ра, равных 1/300 секунды. Три класса прерываний пользователь можёт обрабатывать с помощью собственных программ. Для этого имеется две макро- команды STXIT тип,адрес,область-сохранения Тип указывается в зависимости от рода обрабатываемого прерывания: PC (program check) для прерывания из-за ошибки в программе, IT (interval timer) для прерываний по таймеру и ОС (other check) для внешних прерываний (сигнал от клавиши прерывания на пульте и пр.). Операнд адрес указывает адрес, по которому в случае прерывания супервизор должен передать управление. Область сохранения — это область объемом в 18 слов, в которую супервизор помещает: а) старое PSW, а за ним Ь) содер- 44 Зак. 15635
690 Гл. 18 Макрокоманды DOS жимое регистров 0—15 по порядку. Область сохранения запол- няется перед тем, как управление передается программе поль- зователя. Операнд адрес может задаваться в форме (г) или (0), а на месте операнда областъ-сохранения может стоять (г) или (1). Указания относительно прерываний действуют в течение всего задания вплоть до его конца, если не будет выполнена дру- гая макрокоманда STXIT. Выполнение STXIT без указания адреса или области сохранения STXIT тип аннулирует предыдущие указания о том, как обрабатывать этот тип прерываний, и взамен ничего не предлагает. Если для обра- ботки программных ошибок не указывается специальная про- грамма, то при их обнаружении печатается сообщение об ошибке и запрашивается вмешательство оператора. Если же не указана программа для обработки прерываний по таймеру, то эти пре- рывания просто игнорируются. Если при выполнении программы для обработки прерываний типа PC вдруг обнаружится программная ошибка, это вызовет прекращение задания. Аналогично, выполнение задания прекра- тится, если произойдет прерывание по таймеру во время'работы программы обработки этого типа прерываний, а также если внеш- нее прерывание нарушит ход работы программы для обработки прерываний типа ОС. EXIT. Для того чтобы из программы, обрабатывающей преры- вания PC, IT или ОС, выйти на то место, где это прерывание произошло, выполняется макрокоманда EXIT тип При этом восстанавливаются регистры и вновь загружается PSW. Перед этим в нем сбрасывается бит ожидания. 18.17. Межпрограммные связи Составляя программу, иногда пользуются тем, что ее можно разделить на отдельные фазы. При этом одну часть можно написать на Коболе, а другую на языке Ассемблера, можно обе эти части написать на одном языке, но оттранслировать их независимо друг от друга.* В любом случае необходимо иметь возможность передавать управление от одной программы к другой при условии, что обе они в этот момент находятся в памяти. Для урегулирования всех таких передач управления были приняты Определенные стандартные соглашения о связях. Программа, которая передает управление какой-то другой программе, называется основной или вызывающей. Программа,
18.17. Межпрограммные связи 691 которой передается управление, называется вызываемой. Вызывае- мой программой является обычно подпрограмма, которая осу- ществляет определенный вид обработки, а затем возвращает управление вызывающей программе. Адрес в вызывающей про- грамме, по которому возвращается управление, называется адре- сом возврата. Обычно это адрес команды, следующей по порядку в вызывающей программе. Всевозможные команды и константы, используемые при пере- дачах управления, образуют то, что называется связью между двумя программами. При возврате вызываемой программой управления основной или вызывающей программе в большинстве случаев необходимо восстановить регистры, т. е. позаботиться о том, чтобы содер- жимое регистров было тем же, что и в тот момент, когда запра- шивалась вызываемая программа или, как ее еще называют, под- программа. Для этого пользуются областью сохранения. Вызы- вающая программа должна обеспечить вызываемую программу областью сохранения. Различные подпрограммы в разные момен- ты времени могут пользоваться одной и той же областью сохра- нения. Подпрограмма может сама запрашивадъ другие подпро- граммы, и в этом случае она становится вызывающей программой. При установлении связей в IBM-360 введен ряд стандартных соглашений об использовании регистров: 1. Регистр 15 содержит адрес точки входа в вызываемую программу. Регистр загружается вызывающей программой и может в вызываемой программе использоваться в качестве регистра базы. 2. Регистр 14 содержит адрес возврата. Загружается вызы- вающей программой. 3. Регистр 13 содержит адрес области сохранения. Загружается вызывающей программой. Как правило, ни для какой другой цели регистр 13 не используется. 4. В большинстве случаев от программы к программе пере- дается только один или два параметра. Иногда те величины, которые необходимо передать, помещаются в регистры 0 и 1. В Фортране и PL/1 функции, к которым происходит обращение, результат вычисления помещают в регистр 0. 5. Обычно, когда надо передать какие-то параметры, адреса всех используемых переменных формируются в последователь- ных словах некоторой области и адрес этой области помещается вызывающей программой в регистр 1. Бит знака в слове, содер- жащем последний адрес, можно установить равным 1 в качестве признака окончания списка переменных. При обращении к подпрограммам можно пользоваться тремя макрокомандами. Однако программист всегда при желании может и сам составить необходимую программу связи, не пользуясь этими макрокомандами. В вызывающей программе используется 44*
692 Гл. 18. Макрокоманд» DOS макрокоманда CALL, а в вызываемой программе — макрокоман- ды SAVE и RETURN: CALL имя-точки-входа [,(napaMeTplt . . . ,параметр^] SAVE (r„r2) SAVE (г() RETURN (гьг2) RETURN (Г1) Чтобы проследить связи, порождаемые макрокомандой GALL, давайте рассмотрим оператор LBL CALL SPR, (Рь ... Р7) В результате получается макрорасширение, которое мог бы напи- сать и программист: CNOP 2,4 LBL L 15,=V(SPR) LA 14,*4-64-4*7 BALR 1,15 DC A (P1,P2, . . . P7) Цифра 7 в команде LA означает число параметров. Когда никакие параметры не передаются, макрокоманда LHH CALL SPN порождает LHH L 15,= V (SPN) BALR 14, 15 Первое, что обычно делается в вызываемой программе, это сохраняется содержимое регистров. Область сохранения (адрес которой должен быть в регистре 13) состоит из 18 слов и имеет следующую структуру. Слово 1 Индикаторы. Нужны только в PL/1. 2 Адрес области сохранения, которой пользовалась вызы- вающая программа. 3 Адрес области сохранения, задаваемый вызываемой программой. 4 Регистр 14. Адрес возврата. 5 Регистр 15. Адрес точки входа. 6 Регистр 0. 7 Регистр 1. 18 Регистр 12.
18.17. Межпрограммные сеязи 693 Первое слово программист может использовать по своему усмотрению. Если вызываемая программа в свою очередь не вызы- вает другую программу, то слова 2 и 3 могут и не понадобиться. Слово 2 содержит адрес последней используемой области сохра- нения. Адрес области сохранения, используемой в настоящий момент, хранится в регистре 13. Слово 3 содержит адрес следую- щей области сохранения, которая будет выделена в случае необ- ходимости. Макрокоманда SAVE порождает команду STM, запо- минающую в соответствующих словах указанные в макрокоманде регистры. Операнды надо записать так, чтобы порядок регистров соответствовал структуре области сохранения. Например, макро- команда SAVE (15,7) порождает команду STM 15,7,16 (13) а SAVE (14,12) порождает STM 14,12,12 (13) Когда стоит только один операнд, запоминается содержимое лишь одного регистра: из SAVE (1) получаем STM 1,1,24(13) В конце подпрограммы макрокоманда RETURN порождает LM, которая соответствует STM, порожденной макрокомандой SAVE. Вообще-то говоря, не обязательно в макрокоманде RETURN указывать те же самые регистры, хотя обычно бывает именно так. Программист, конечно, может изменять содержимое слов в области сохранения. Необходимо отметить, что область сохранения, использующая- ся в макрокоманде STXIT, отличается от описанной здесь обла- сти, несмотря на то, что размеры у них одинаковые. В качестве примера связей между программами рассмотрим следующую задачу. Программист, работающий с языком Ассем- °лера, может менять текущую дату, которая хранится в области связи. Программист, работающий с Коболом, этого делать не может. Поэтому давайте попробуем написать коротенькую программу на Коболе, которая обращается к подпрограмме
694 Гл. 18. Макрокоманды DOS на языке Ассемблера, а эта подпрограмма будет обеспечивать основную программу датой, занимающей восьмибайтовое поле. Основная программа на Коболе: IDENTIFICATION DIVISION. PROGRAM-ID. 'DTEST'. ENVIRONMENT DIVISION. DATA DIVISION. WORKING-STORAGE SECTION. 77 DATES PICTURE X(8). PROCEDURE DIVISION. ENTER LINKAGE. CALL 'DATE' USING DATES. ENTER COBOL. DISPLAY 'DATE IS ', DATES. STOP RUN. Подпрограмма на языке Ассемблера: DATE START USING *,15 С SAVE (1,2) L 2,0 (1) COMRG MVC 0 (8,2),0 (1) RETURN (1,2) END C Если бы понадобилось, чтобы эта программа прошла все стадии .обработки вплоть до выполнения, то потребовался бы следующий набор управляющих карт: // JOB DATEST // OPTION LINK PHASE DATEST,* // EXEC COBOL Основная программа на Коболе /• // ЕХЕС ASSEMBLY Подпрограмма на языке Ассемблера /* // ЕХЕС LNKEDT // ЕХЕС /&
18.18. Рекурсивная программа 695 Тогда в результате выполнения объектной программы будет печа- таться только одна строка: DATE IS 01/31/68 \ Дата может оказаться, конечно, и совершенно другой. 18.18. Рекурсивная программа Чтобы продемонстрировать использование второго и третьего слов области сохранения, мы дадим в этом разделе пример под- программы, которая вызывает самое себя. О такой подпрограмме говорят, что она используется рекурсивно, т. е. рекурсивной будет программа, которая может войти в себя же и вернуть управление из себя опять на себя таким образом, что работать она будет так, как будто вызывалась совсем другая программа. Воспользуемся коротенькой программой чтения карт, содер- жащих в колонках 1—4 десятичное число хххх. Возьмем ее в ка- честве основной программы, но при этом она еще должна для каждой прочитанной карты печатать xxxxbddddd, где Ь означает пробел, a ddddd представляет функцию двойного факториала. Двойной факториал определяется следующим образом: х!! = х(х—2) (х—4)(х—6) ... (1 или 2) например 5!! = 5 X 3 X 1 = 15 7!! = 7 X 5 X 3 X 1 = 105 12!! = 12 X 10 X 8 X 6 X 4 X 2 = 46 080 В своем примере мы берем именно этот способ вычисления двой- ного факториала, хотя существуют пути гораздо более легкие. Наша основная программа выглядит следующим образом: MAIN START PRINT NOGEN IN CDMOD PRMOD ENTRY DTFCD WORKA=YES WORKA=YES D DEVADDR=SYSRDR, 1 OUT DTFPR BLKSIZE=80,EOFADDR=E, 2 WARE Al=Al, WORK A=YES DEVADDR=SYSLST, 1 Bl BALR USING OPEN BLKSIZE=15,WORKA=YES, 2 IOAREA1=A2 9,0 *,9 IN,OUT
696 Гл. IS. Макрокоманд» DOS В2 GET IN.Wl РАСК W3,W1(4) CVB 3,W3 ST 3,X LA 13,SA CALL DF,(X,D) ВЗ L 3,D CVD 3,W3 MVC W2X,W1 UNPK W2D,W3+3(5) PUT 0UT,W2 В B2 Е CLOSE IN,OUT EOJ А1 DS CL80 W1 DS CL80 А2 DS CL15 W2 DS 0CL15 W2X DS CL4 DC C' ' W2D DS CLIO W3 DS D X DS F D DS F • SAVEAREAS SA DC A (0,0,*+64) DS 15F DC 8A (0,*—76,*+64,0,0,0,0,1 0,0,0,0,0,0,0,0,0,0,0) DC A(0,*—76,0) DS 15F END Bl следующий вид: Подпрограмма имеет DF CSECT EXTRN D USING ♦,15 DF3 SAVE (14,7) LM 2,3,0 (1) L 5,0 (2) S 5,=F'2' BNP DF1 ST 5,Y L 13,8 (13) CALL DF,(Y,D)
18.18. Рекурсивная программа 697 DF2 А L MR 5,=F'2' 7,0(3) 6,5 DF1 ST L RETURN A 7,0(3) 13,4(13) (14,7) 5,=F'2' Y ST RETURN DS 5,0(3) (14,7) F END DF3 В своей основной программе мы выделили десять областей сохра- нения с адресами соответственно SA, SA + 72, SA + 144 и т. д. Следовательно, наша подпрограмма обращаться к самой себе может только девять раз., А это значит, что величина X у нас не должна превышать 20. Давайте проследим основные связи для случая X = 5. При выполнении макрокоманды CALL в основной программе у нас будет Регистр 1 = А (А (X), A (D)) Регистр 13 = A (SA) Регистр 14 = А (ВЗ) Регистр 15 = A (DF3) После запоминания необходимых регистров загрузим регистры 2, 3 и 5 Регистр 2 = А (X) Регистр 3 = A (D) Регистр 5 = X и потом Регистр 5 = X — 2 Если бы X было меньше 2, то мы бы перешли на DF1, но когда X = 5, X — 2 = 3, поэтому мы запоминаем Y = 3, записываем адрес следующей области сохранения из слова 3 имеющейся в этот момент области и осуществляем вызов подпрограммы, имея уже аргументом не X, a Y. У нас теперь будет Регистр 1 = A (A (Y), A (D)) Регистр 13 = A (SA + 72) Регистр 14 = A (DF2) Регистр 15 = A (DF3) Опять выполняются те же команды, вычисляющие теперь Y = 1, и вновь подпрограмма вызывает самое себя, имея на этот раз область сохранения SA + 144.
698 Гл. 18. Макрокоманды DOS Теперь Y у нас удовлетворяет условию Y 2, и поэтому мы переходим на DF1, которая присваивает D = Y = 1 и воз- вращает управление предыдущей программе, которая является этой же подпрограммой, по адресу DF2. Там происходит прибав- ление 2 к регистру 5, в котором до этого находилось Y = 1. Затем мы засылаем D в регистр 7 и умножаем на содержимое регистра 5. Результат D = 1 х 3 = 3 запоминается в D. Преды- дущую область сохранения мы использовали для того, чтобы вернуть управление все той же подпрограмме по адресу DF2. Теперь повторяем те же самые команды с той разницей, что в регист- ре 5 у нас содержится 5, a D=3, поэтому на этот раз запоминается D = 15. Выход происходит и в этом случае, но уже по адресу ВЗ, поскольку мы вернулись к своей первой области сохранения. В построении областей сохранения непосредственно друг за другом, как мы это делали, нет никакой необходимости и фак- тически в некоторых задачах это и сделать невозможно. Рекурсивные программы большей частью находят применение при обработке процессов, протекающих в реальном масштабе времени. 18.19. Язык макроопределений Ассемблеры IBM-360, кроме версий, рассчитанных на 8К, дают возможность программисту вводить свои собственные макро- команды. Записав соответствующее макроопределение, можно поместить его в системную библиотеку и потом использовать в любой программе на языке Ассемблера. Кроме этого есть воз- можность включать макроопределение в программу, написанную на языке Ассемблера, но в этом случае круг его применения огра- ничивается лишь одной этой программой. Рамки данной книги не позволяют нам полно и подробно рассмотреть язык макро- определений, поэтому мы ограничимся иллюстрацией его воз- можностей на двух конкретных примерах. Сначала мы определим макрокоманду, которая даст нам воз- можность выполнять операции двоичной арифметики над числами с фиксированной точкой с двойной точностью. Формально это означает, что мы хотим, чтобы макрокоманда DPAS ARD,KLT,PER,WEHY вычислила ARD + KLT — PER и запомнила результат в поле WEHY, где все переменные — двойные слова. Теперь запишем макроопределение MACRO DPAS &W,&X,&Y,&Z STM 0,l,IJK08 LM 0,1,&W
18.19. Язык макроопределений 699 AL 1.&X+4 ВС 12,*+8 А O.IJKOl А 0,<&X SL 1.&Y+4 ВС ЗЛ+8 S 0.IJK01 S 0,&Y STM 0,1,&Z ВС 15,*+16 IJKO1 DC F'l' IJK08 DS 2F LM 0,l,IJK08 MEND Первое предложение (MACRO) указывает на начало макроопре- деления. Следующее предложение — это его заголовок. Оно представляет собой прототип макрокоманды. DPAS — это ее назва- ние (мнемонический код операции), и она может иметь четыре операнда. Каждая псевдопеременная в макроопределении записы- вается, начиная с символа &. Это позволяет различать обычные переменные и псевдопеременные. Когда макроопределение исполь- зуется в конкретной программе, ассемблер вместо каждой пере- менной, имя которой начинается с символа &, подставляет соот- ветствующее имя переменной, взятое из поля операндов макро- команды. Сначала в нашем макроопределении запоминаются регистры 0 и 1, а затем в эти регистры загружается первый опе- ранд. Следующим шагом будет сложение со вторым операндом, а затем вычитание третьего операнда. Последнее — это запоми- нание результата в поле, которое задается четвертым операндом, и восстановление регистров. В программе есть команда, которая обходит 12 байтов, отведенных под константы и рабочие области, поскольку в исходной программе непосредственно за макро- командой будет стоять другая команда. В нашем макроопределении определены два конкретных име- ни, IJK01 и IJK08, которые будут помещаться в таблицу имен любой программы, пользующейся этим макроопределением. Вооб- ще-то говоря, нежелательно иметь в макроопределении конкрет- ные имена. Программы IOCS в тех случаях, когда им приходится пользоваться конкретными именами, всегда пользуются именами, начинающимися с I и состоящими из 6, 7 и 8 букв или цифр. Если ассемблер транслирует супервизор, то р некоторых предоставлен- ных фирмой IBM макроопределениях будут употребляться имена, начинающиеся с букв SYS. Осторожный программист поступит правильно, если будет избегать в своих программах имен, начи- нающихся с букв SYS, и длинных имен, начинающихся с буквы I.
700 Гл. 18. Макрокоманды DOS Рассмотрим программу, на примере которой можно увидеть применение макрокоманды DPAS: START 8192 PG BALR 11,0 USING Ml MVC ARD,=F'3' MVC ARD4-4,=F'4' DPAS ARD,KLT,PER,WEHY L 3,WEHY EOJ ARD DS 2F KLT DC F'O' DC F'67' PER DC F'2' DC F'7600' WEHY DS D END PG Порождаться будет следующая последовательность команд: 8192 BALR 11,0 8194 MVC ARD,=F'3' 8200 MVC ARD+4,=F'4‘ 8206 STM 0,l,IJK08 8210 LM 0,1, ARD 8214 AL 1,KLT 4-4 8218 BC 12,*4-8 8222 A 0.IJK01 8226 A 0.KLT 8230 SL 1,PER 4-4 Иными словами, ассемблер вместо макрокоманды в исходную программу подставляет команды из макроопределения, заменяя каждую псевдопеременную соответствующей переменной из поля операндов макрокоманды. На самом деле макроязык, конечно, гораздо более мощное средство, чем можно понять из приведенного примера. Предпо- ложим, что в нашей программе встретилась макрокоманда DPAS ARD ,PER ,WEHY в которой второй операнд опущен за ненадобностью. В этом случае было бы разумно опустить какие-то команды, связанные со вторым операндом. Однако, если опустить команды, непосредственно содержащие второй операнд (& X), то пропадут
18.19. Язык макроопределений 701 команды AL l,KLT+4 A 0,KLT но останутся команды: ВС 12,*+8 А 0,ПК01 и программа станет довольно бессмысленной. Для того чтобы иметь возможность выходить из положения в таких случаях, имеются специальные команды условной трансляции, которые очень часто используются в макроопределениях. Еще есть возможность писать макроопределения такого типа: MACRO SPAS &W,&C,&Y,&Z L 0,&W &C 0,&Y ST 0,&Z Если в исходной программе стоит макрокоманда SPAS ARD,S,PER,WEHY то вместо &С при работе макрогенератора подставляется S, и в программе пользователя будет порождена команда S 0,PER Среднему программисту знать язык макроопределений совер- шенно необязательно. Как правило, макроопределения, в кото- рых возникает необходимость в данном вычислительном центре, составляются и отлаживаются одним-двумя программистами высокой квалификации. Упражнения № 49 1. Написать программу чтения колоды перфокарт. Если бит 0 в байте UPSI возбужден, печатать содержимое карт на SYSLST: если бит 1 в UPSI возбужден, перфорировать содержимое коло- нок 1—76 на новых картах, помещая в колонки 77—80 порядко- вые номера карт 0001, 0002 и т. д. 2. Рассмотрим цикл: L 3,=F'1000000' А ’ 4,=F'l' ВСТ 3,*—4
702 Гл. 18. Макрокоманда DOS Написать программу, считывающую из таймера время (началь- ные показания таймера должны быть установлены в вашей про- грамме) непосредственно перед входом в цикл и сразу же после выхода из цикла. Следовательно, требуется подсчитать и напеча- тать в секундах время, которое понадобится для выполнения этих двух команд 1 000 000 раз. 3. Изменить упр. 2 таким образом, чтобы вместо одной выпол- нялось две команды сложения. Тогда подсчитывалось бы время, ушедшее на работу двух сложений и ВСТ. Включить в программу оба цикла и напечатать время, ушедшее на работу только коман- ды сложения, не принимая в расчет время, потраченное на ВСТ. 4. Используя макрокоманду PDUMP, написать программу, осуществляющую дампинг области, отведенной в памяти супер- визору. 5. Рассмотреть внимательно результаты упр. 4; затем написать программу дампинга области от начала пространства, отведенно- го проблемной программе, и до конца текущей фазы. Макро- командой PDUMP не пользоваться, надо написать свое собствен- ное SVC. 6. Изменить упр. 1 так, чтобы весь ввод и вывод осущест- влялся программой на Коболе, а для получения и передачи в программу на Коболе содержимого UPSI использовалась под- программа на языке Ассемблера. 7. Предположим, что требуется прочитать карты, содержащие в колонках 1—6 число i в форме .хххххх и в колонках 7—9 число N в форме ппп, а затем для каждой считанной карты отперфори- ровать новую, на которой остается прежнее i и N, а в колонках 10—20 пробивается А = (1 + i)N; число А перфорируется с точ- ностью до шестого знака. Для чтения и перфорации взять про- грамму на языке Ассемблера, а для вычисления воспользоваться подпрограммой на Фортране. 8. Изменить упр. 7 так, чтобы вместо подпрограммы на Фор- тране была использована подпрограмма на PL/1.
Глава 19 МАКРОКОМАНДЫ OS 19.1. Операционная система В DOS резидентная часть Супервизора занимает как минимум 6144 байта. Только в очень больших машинах область, занимае- мая супервизором, может превышать объем 8192 байта. В OS все функции супервизора DOS осуществляет с теми или иными незна- чительными изменениями Управляющая программа (СР). Первич- ная управляющая программа (РСР) занимает примерно 18 432 байта — объем памяти, в три раза превышающий размер области, занимаемый эквивалентной частью DOS. Исходя из этого, можно было бы предположить, что в OS заложено гораздо больше воз- можностей, чем в DOS; точно так же как DOS имеет гораздо больше средств, чем BOS со своим только 4096-байтовым супер- визором. Конкретный состав операционной системы задается при ее генерации, причем выбор делается из довольно большого числа различных вариантов. Совершенно реальной является, напри- мер, генерация резидентной управляющей программы, занимаю- щей свыше 65К памяти. Подробное полное обсуждение OS выхо- дит за рамки начального курса программирования, и поэтому здесь мы этого предпринимать не собираемся. Упомянем только о том, что некоторые варианты OS учитывают возможность муль- типрограммирования — присутствия в памяти одновременно не- скольких независимых программ и автоматического переключе- ния с одной на другую либо по истечении определенного интер- вала времени, либо из-за невозможности программы продолжать работу, когда она ожидает выполнения операций ввода — выво- да. В системе с мультипрограммированием программа может стать несколько сложнее. Но здесь мы об этом говорить также не будем. При рассмотрении OS мы ограничимся лишь простейшими и наиболее общими операциями ввода — вывода и несколькими основными макрокомандами супервизора. 19.2. Ввод — вывод Программа, предназначенная для работы под управлением операционной системы IBM-360, обладает независимостью от устройств. Это означает, что сегодня можно пользоваться вводом
704 Гл. 19. Макрокоманды OS с магнитной ленты и выводом на диск, а завтра безо всяких изме- нений в программе можно осуществить ввод с карт и вывод на ленту. Метод достижения независимости от устройств состоит в том, что в программе пользователя организуется управляющая таблица, или блок управления данными (DCB), который детально описывает набор данных. Блок управления данными создается пользователем при составлении программы, но при этом некото- рые поля блока не заполняются. Когда объектная программа готова к работе, оператор в набор управляющих карт помещает карты DD (Определить данные), которые доопределяют или меняют некоторые поля DCB. Объектная программа также обладает возможностью сама присваивать или изменять значения, ранее присвоенные различным полям блока управления данными. Изме- нения должны производиться до того, как набор данных откры- вается. Естественно, независимость от устройств не может быть абсо- лютной. Так, например, наборы данных с прямым доступом и индексно-последовательные наборы данных должны располагаться на DASD; команды перевода строк, или прогона бумаги имеет смысл задавать лишь для тех наборов данных, которые предназ- начены для печатающего устройства; указание размера блока 8 000 байтов исключает использование дисков 2311, если не пре- дусмотрены средства переполнения дорожек, и т. п. После того как блок управления данными создан, в програм- ме можно пользоваться макрокомандами, аналогичными макро- командам DOS. К ним относятся: OPEN, которая читает и проверяет или записывает метки на ленту или диск; CLOSE, которая обрабатывает хвостовые метки так же, как OPEN обрабатывает головные метки; GET, которая делает доступной программе следующую логи- ческую запись (дает запись программе); PUT, которая вызывает вывод указанной логической записи; CNTRL, которая влечет за собой выполнение таких управ- ляющих функций, как прогон бумаги, выбор приемного кармана, перемотка ленты и т. п.; READ, которая начинает передачу данных с устройства; WRITE, которая начинает передачу данных на устройство; CHECK, которая переводит CPU в состояние ожидания до тех пор, пока не завершится операция чтения или записи. Кроме этого существует еще ряд макрокоманд, назначение которых — предоставить программам IOCS буферы для ввода — вывода. Организация буферных областей в OS осуществляется совершенно иначе, чем в DOS.
19.3. Блок управления данными 705 Каждая операция ввода — вывода пользуется одним из не- скольких методов доступа. Мы ограничимся рассмотрением лишь шести из них: QSAM — последовательный метод доступа с очередями; BSAM — базисный последовательный метод доступа; QISAM — индексно-последовательный метод доступа с оче- редями; BISAM — базисный индексно-последовательный метод до- ступа с очередями; BDAM — базисный прямой метод доступа. В действительности существует две программы QISAM: одна для загрузки (режим загрузки) файла, а другая для добавления к файлу записей, для выборки и корректирования записей (режим сканирования). Методы доступа с очередями требуют задания макрокоманд типа GET — PUT, а базисные методы — макрокоманд типа READ — WRITE. О блоке управления данными мы будем говорить в разд. 19.3, о буферных областях — в разд. 19.4, операнды в предложении DD, относящиеся к блоку управления данными, обсудим в разд. 19.5, после чего последовательно рассмотрим все упомянутые методы доступа. OS так же, как и DOS, допускает работу на физическом уровне IOCS, но мы этого рассматривать не будем. 19.3. Блок управления данными В DOS для определения наборов данных разных типов исполь- зуются различные макрокоманды. В OS, поскольку объектная программа не должна зависеть от устройств, та часть программы IOCS, которая при трансляции включается в объектную программу, для всех устройств должна быть одной и той же. По этой причине в OS существует лишь одна макрокоманда определения файла, а именно DCB. На рис. 19.1 приведены все операнды DCB для тех шести методов доступа, которые мы будем рассматривать. Операнд DSORG указывает, какой описывается файл, последовательный (PS), индексно-последовательный (IS) или с прямым доступом (DA). Добавление буквы U означает, что набор данных непере- мещаемый. Таким образом, PSU, ISU и DAU указывают на непе- ремещаемость набора данных. Обычно OS размещает набор дан- ных в любом подходящем для этого набора участке внешней памяти, но в том случае, когда набор данных неперемещаемый, это средство OS не используется. В неперемещаемый набор может входить в качестве части поля ключа или данных, напри- мер, ID диска целиком или частично. 45 Зак. 15635
Операнд При отсутст- вии операнда принимается QSAM 1 2 3 DSORG= требуется PS[U] М A CRF= тип-мак рокоманды требуется X OPTCD= средства ничего X R Е CFM= формат ,U X DEVD=THn-ycTpoiicTBa DA X EROPT=ACC; SKP; ABE ABE X BFALN=F; D ничего X BFTEK=S; E требуется X DDNAME=hmh требуется X EXLST=hb ничего X BUFNO==ae < 255 2 или 3 X BUFL=ae < 32760 BLKSIZE X BUFCB=hb ничего X BLKSIZE=ae < 32760 требуется X LRECL=aB < 32760 требуется X SINAD=hb ERORT X EODAD=hb ABE X KEYLEN=ae < 255 нет ключа — NCP=ae <99 1 - RKP=0 или ав требуется — NTM=ae < 99 не будет мастер-индекса — CYLOFL=aB < 99 требуется — ЫМСТ=ав ничего — MSHI=ne ) л SMSI=aB< 32760 ) не будет в памяти MSWA=hb 1 SMSW=ae < 32760 J ничего - X Задание операнда допускается —- Для этого метода доступа операнд не используется [U] Если записано U, набор данных считается непереМещаемым пв Перемещаемое выражение ав Абсолютное выражение
BSAM QISAM BISAM BDAM Задается загрузка скани- рова- ние в про- грам- ме в DD 4 5 6 7 8 9 10 PS[U] IS[U] IS IS DA[U] нет нет X X X X X нет нет X X — — X да да X X — — X да да X — — — —— нет нет — — — — — Да да X X X X X да да -T- — — — — Да да X X X X X Да нет X X X X X да нет X X X X X да да X X X X X да Да X X X X X да нет X X — — X да Да X X — —- — да Да X X X — — да нет X — X — — да нет —— X —— — X да да X — — X — да Да — X — —- — да да — X — — — Да да — X —— — — да да — — — — X да да — — — X — да нет — — — X — Да нет
19.3. Блок управления данными 707 Рис. 19.1. Операнд» DCB Операнд MACRF указывает, какого типа макрокоманды, READ, WRITE, GET, PUT и т. д., будут использоваться. Опе- ранды DSORG и MACRF в совокупности определяют мето;, досту- па, которым нужно воспользоваться. Эти операнды необходимы в каждой макрокоманде DCB. Все остальные являются необяза- тельными, так как, если понадобится какая-то дополнительная информация, ее всегда можно получить или во время работы про- граммы с карт DD, или из самой программы до того, как откры- вается файл. Длина DCB меняется в зависимости от типа устройства, кото- рое будет использовано в объектной программе. Если имеется операнд DEVD, то объектная программа будет содержать блок, по размеру подходящий для указанного типа устройства; если операнд опущен, то считается, что используется устройство с прямым доступом (DA). Операнд DEVD можно задать одним из следующих способов: DEVD=DA[,KEYLEN=aB] DEVD=TA DEVD=PR[,PRTSP=0 | 1 | 2 | 3] DEVD=PC[,MODE=C | Е] [,STACK=1 | 2] DEVD=RD[,MODE=C | Е] [,STACK=1 | 2] Операнды перечислены в порядке уменьшения размера обла- сти памяти, необходимой для блока DCB. Операнды PC и RD требуют блоки одинакового размера. То, что указано в скобках, необязательно. Длина поля ключа (KEYLEN), задаваемая для устройств с прямым доступом (DA), равна значению абсолютного выражения (ав), которое не должно превышать 255. Если указана лента (ТА), то здесь не должно быть никаких дополнений, если только не используется специальная семидорожечная лента или девятидорожечная с двойной плотностью записи. Для печатающе- го устройства (PR) можно указать число пропусков между стро- ками; если этого не указано, то предполагается 1. Для карточного перфоратора (PC) и карточного читающего устройства (RD) можно указать либо режим EBCDIC (Е), либо режим поколонно-двоич- ный (С). Можно также указать и номер приемного кармана (1 или 2). Операнд RECFM указывает тип записей, находящихся в набо- ре данных. Здесь может быть задано: F — фиксированная длина v — переменная длина U — не определенная длина В — сблокированные записи А — управляющий символ в коде ASA М — управляющий символ в машинном коде S — стандартные блоки (нет усеченных блоков) Т — используется средство переполнения дорожек 45*
708 Гл. 19. Макрокоманды OS Можно указывать не только одну букву, т. е. можно записать, например, RECFM=FB или RECFM=UM. В операнде OPTCD указываются дополнительные характери- стики, касающиеся конкретного метода доступа. Операнд EROPT определяет действия при возникновении ошибок. Здесь может быть три варианта: принять ошибку (АСС), т. е. считать, что блок нормальный; пропустить плохой блок (SKP), т. е. считать, что его вообще не было; аварийно прекратить выполнение шага задания (АВЕ). Операнд BFALN можно использовать для указания, что буферы ввода — вывода должны помещаться в памяти, начиная с определенной границы, т. е., что непосредственно перед коман- дой DS, определяющей буферную область, должно быть вставле- но предложение CNOP 0,8 или CNOP 4,8 Операнд BFALN = D вызывает размещение области, начи- ная с границы двойного слова, a BFALN =F — начиная с гра- ницы слова, которая не совпадает с границей двойного слова. Там же, где задается операнд BFALN, для QSAM должен задаваться операнд BFTEK=S или BFTEK=E, указывающий либо про- стую (S), либо обменную (Е) буферизацию. В этой книге мы будем рассматривать лишь простую буферизацию. Операнд DDNAME указывает имя DD-предложения, которое служит для связи карты DD с DCB. Операнд EXLST определяет имя списка выходов, который представляет собой набор параметров, служащих для управления обработкой меток пользователя. Списки выходов мы здесь рассматривать не будем. Операнд BUFNO задает число буферных областей для кон- кретного устройства. Если операнд опущен, то считается, что для 2540 имеется 3 буферные области, а для всех остальных устройств — 2. Операнд BUFL указывает длину каждого буфера. Операнд BUFCB указывает адрес блока управления буферизацией, если такие блоки используются. Операнд BLKSIZE указывает размер блоков ввода — вывода для записей типа F. Для записей типа V в нем задается макси- мальный размер блока, куда включается четырехбайтовое поле в начале физического блока. Для записей типа U это будет макси- мальный размер записи. Операнд LRECL указывает длину логической записи. В случае записей типа F это должен быть делитель величины, заданной в BLKSIZE, а в случае записей типа U и V это должен быть мак- симальный размер записи.
19,3. Блок управления данными 709 Операнд SYNAD указывает адрес программы, которая вызы- вается в случае возникновения ошибки из-за ввода — вывода. Для QSAM, если нет операнда SYNAD, используется указание в EROPT. Для всех остальных методов доступа и для QSAM, если отсутствует EROPT, при возникновении ошибки выполнение шага задания аварийно прекращается. Операнд EODAD указывает адрес, по которому передается управление при обнаружении конца файла (EOF). Операнд KEYLEN задает длину ключей для BDAM и для загрузки индексно-последовательного файла. Заметьте, что длина ключа может также указываться в операнде DEVD. Операнд NCP указывает максимальное число операторов READ — WRITE, выполняющихся перед макрокомандой CHECK. Если операнд опущен, предполагается, что это максимальное число равно единице, а вообще оно не должно превышать числа буферов. NCP означает «Число программ канала» (Number of Channel Programs). Операнд RKP указывает относительное расположение поля ключа внутри поля данных. Этот операнд необходим при загруз- ке записей, организованных индексно-последовательно. Значение 0 в операнде означает, что внутри поля данных ключа нет. Операнд CYLOFL указывает число дорожек в каждом цилиндре отведенных для записей, переполняющих другие дорожки в этом цилиндре. NTM указывает число дорожек в индексе, используе- мое при автоматическом создании мастер-индекса высшего уров- ня. Если операнд опущен, считается, что мастер-индекс не будет создан. Операнд LIMCT указывает число записей или дорожек (в зави-* симости от операнда OPTCD), по которым будет отыскиваться запись с определенным ключом. Если этот операнд опущен, поиск будет производиться только на первоначально указанной дорожке. Операндами MSHI и SMSI можно воспользоваться для того, чтобы обеспечить во время обработки хранение мастер-индекса высшего уровня в основной памяти. MSHI указывает адрес индек- са в памяти, a SMSI задает его длину в байтах. Операнды MSWA и SMSW определяют адрес рабочей области (MSWA) и ее длину (SMSW). Эти операнды необходимы, когда записи типа V добавляются к индексно-последовательному файлу. Если эти операнды указаны, когда добавляются записи типа F, то результатом будет увеличение скорости работы объектной про- граммы. На размер области накладываются следующие ограни- чения. При использовании несблокированных записей область должна быть такой, чтобы в ней размещались счетчик, ключ и данные для всех записей на дорожке. При использовании сблокированных записей область должна содержать счетчик
710 Гл, 19. Макрокоманды OS и поля данных всех блоков на дорожке плюс одну логическую запись (только область данных). Заметьте, что это соответствует описанию области дорожки в Коболе. Детали каждого отдельного метода доступа мы рассмотрим позднее. 19.4. Спецификации DCB во время исполнения программы Для задания в DCB большинства операндов можно восполь- зоваться предложением DD, в котором к прочим операндам про- сто добавляется еще один: DCB = (имя,параметр!,. . .,параметрп) Имя записывается в виде (Ьимя *.ddnMH ♦ .шаг-задания^<1имя ♦.шаг-задания.шаг-процедуры^имя и указывается точно так же, как в операнде DSNAME предло- жения DD. Для текущего предложения DD параметры DGB копируются из набора данных с указанным именем. Когда копи- руемые параметры противоречат параметрам, заданным в опе- ранде DCB, преимущество отдается последним. Если имя опуще- но, то копироваться ничего не будет. Параметры отделяются запятыми и по форме совпадают с операндами макрокоманды DCB. Допустимыми считаются параметры BFALN BFTEK BLKSIZE BUFL BUFNO CYLOFL DSORG EROPT KEYLEN LIMCT LREGL MODE NGP NTM OPTCD PRTSP RECFM RKP STACK Спецификации в DD не должны противоречить указанным в макрокоманде DCB операндам. Необходимо особо отметить, что в DD все операнды пишутся независимо друг от друга, даже такие, которые в DCB находятся в прямой зависимости от дру- гого операнда, например STACK зависит от DEVD. Важность использования спецификаций DD относится в боль- шей степени к программам, написанным на Коболе, Фортране
19.4, Спецификации DCB во время исполнения программы 711 и PL/1, т. е. к тем программам, в которых на исходном языке программист не в состоянии указать средства, которыми он хочет воспользоваться. Поскольку во время исполнения программы DCB не участ- вует в работе до тех пор, пока не появится макрокоманда OPEN, к нему относящаяся, программа пользователя может менять любое поле DCB до того, как открывается файл. DCB порождает в объектной программе ряд констант. Размер этого блока кон- стант изменяется в зависимости от метода доступа и типа устрой- ства. Поэтому для того, чтобы иметь удобный способ обращения к различным полям DCB, имеется макрокоманда DCBD ВЗОВО=(тип-доступа),ПЕУП=(тип-устройства) В качестве типа-устройства пишется одно или несколько из следующих указаний: DA ТА PR RD или PC (но не оба вместе) Допускается любая комбинация типов устройств, за исключением одновременного указания RD и PC. В качестве типа-доступа можно записать LR PS или BS или QS IS DA где IS означает индексно-последовательный доступ, DA озна- чает прямой доступ, BS означает BSAM, QS означает QSAM и PS означает сочетание и BS, и QS. Под LR подразумевается логическая запись. Считается допустимой любая комбинация этих указаний, за исключением того, что разрешается записывать только одно из PS, BS и QS. Если указывается BS, PS или QS, а операнд DEVD опущен, то в расчет берутся все возможные устройства. Если указано LR, то операнд DEVD, если он есть, игно- рируется. Макрокоманда DCBD порождает DSECT (фиктивную секцию) с названием IHADCB. Имя каждого поля в DSECT представляет собой просто три буквы DCB, к которым добавляются первые пять букв названия операнда в DCB. Таким образом, имя DCBDSORG будет относиться к полю DSORG, имя DCBBLKSI будет относиться к полю BLKSIZE, а имя DCBLRECL будет относиться к полю LRECL. Длина фиктивной секции зависит от операндов макрокоманды. Если в поле операнда указано LR,
1\2 Гл. 19. Макрокоманд» OS то в фиктивной секции будет только одно поле DCBLRECL, поле длины записи. В любом программном модуле, подготавливаемом для обра- ботки ассемблером, разрешается использование лишь одной макрокоманды DCBD. Хотя начинающий программист для изменения полей DCB, как правило, макрокомандой DCBD не пользуется, мы упомя- нули здесь об этом способе, поскольку уверены, что он пригодит- ся более опытным программистам. G другой стороны, и нам еще понадобится уметь изменять поле DCBLRECL, когда мы займем- ся обработкой записей переменной длины. - 19.5. Буферизация для методов доступа е очередями В самых общих чертах операции ввода — вывода представляют собой обмен данными между устройствами и основной памятью вычислительной машины. Область основной памяти, используемая при передаче данных, называется буфером. В DOS программист просто определяет одну или две буферные области, указывая их в операндах IOAREA1 и IOAREA2. Эти буферные области нуж- ны только программам IOCS, и программист может с ними непо- средственно не работать. В OS методы доступа с очередями, из которых мы будем рассматривать только QSAM и QISAM, предусматривают три способа, посредством которых программист может определить буферы для наборов данных. В отношении буферных областей большое значение имеют четыре фактора. 1. Число буферов. 2. Длина каждого буфера. 3. Размещение в памяти на границе слова или двойного слова. 4. Адрес каждого буфера в памяти. В действительности программисту совершенно нет необходи- мости знать о том, где находятся буферы, поскольку он сам к ним не обращается, но тем не менее для программ IOCS необходимо каким-то образом указать место расположения буферных обла- стей для того, чтобы в случае необходимости они знали, где разы- скивать эти области. В. первом методе определения буферов используется макро- команда GETPOOL. Макрокоманду можно записать двумя спо- собами: GETPOOL deb,число .длина GETPOOL dcb,(O) deb — это либо адрес DCB, для которого создается буферный пул (т. е. совокупность буферных областей), либо там может
19.5, Буферизация для методов доступа с очередями 713 стоять (1), означающее, что адрес DCB помещен в регистр 1. В первом операнде нельзя указать никакой регистр, кроме пер- вого. Второй операнд определяет обычно число создаваемых буфе- ров, а третий указывает длину каждого буфера в байтах. Второй способ записи макрокоманды используется тогда, когда число буферов помещается в левую половину регистра О, а длина — в правую половину. В этом случае второй операнд будет записываться как (0). Во время исполнения программы по макрокоманде GETPOOL неиспользуемая область основной памяти отводится под буферный пул. Буферы, выделенные таким образом, могут использоваться только для набора данных, связанного с определенным DCB. Если пользуются макрокомандой GETPOOL, то операнды BUFNO и BUFL макрокоманды DCB игнорируются, так как макрокоманда GETPOOL сама определяет эти величины. Если в DCB имеется операнд BFALN, то его значение используется макрокомандой GETPOOL для того, чтобы разместить первый буфер либо на границе двойного слова (D), либо на границе слова, не совпадающей с границей двойного слова (F). Если при этом длина каждого буфера кратна 8, то все буферы окажутся разме- щенными точно таким же образом, что и первый. Поэтому обще- принято определять длину буфера кратной восьми, чтобы границы всех буферов автоматически устанавливались однотипно, хотя при этом вполне допускается, чтобы записи имели длину, не обя- зательно кратную восьми. Если в DCB записан операнд BUFCB, то он игнорируется. В это поле макрокоманда GETPOOL помещает адрес буферного пула. Макрокоманда GETPOOL должна задаваться перед тем, как открывается DCB. После того, как DCB закрывается, область памяти, занимаемая буферным пулом, может быть передана в распоряжение OS при помощи макрокоманды FREEPOOL deb где deb — либо адрес DGB, либо (1), где регистр 1 содержит адрес DGB. Область, освобожденная макрокомандой FREEPOOL, может вновь использоваться операционной системой, если обнаружится другая макрокоманда GETPOOL или какая-нибудь другая макро- команда выдаст запрос на память. Второй путь выделения буферов заключается в том, что просто ничего не делается. Если задана макрокоманда OPEN, а буферы выделены не были, то методы доступа QSAM и QISAM автомати- чески создают эквивалент макрокоманды GETPOOL. В этом слу- чае операнд BUFGB в макрокоманде DCB должен быть опущен. Для каждого набора данных выделяется два буфера. Исключение составляет устройство 2540, для которого, выделяется 3 буфера
714 Гл. 19. Макрокоманды OS но при условии, что в поле операнда BUFNO не стоит какое-то другое число. Первый буфер, если отсутствует операнд BFALN, размещается, начиная с границы двойного слова. Если отсут- ствует операнд BUFL, то QSAM устанавливает длину буфера равной числу байтов, указанному в поле операнда BLKSIZE; в методе QISAM независимо от значения, указанного в BUFL, длина буфера принимается равной BLKSIZE + KEYLEN. Когда буферы выделяются автоматически при появлении макрокоманды OPEN, результат получается почти такой же, как и в случае использования макрокоманды GETPOOL. Для того, чтобы осво- бодить область, занимаемую буферным пулом, т. е. передать ее в распоряжение операционной системы, необходимо еще до пре- кращения выполнения задания выдать макрокоманду FREEPOOL. Иными словами, в этой части второй метод ничем не отличается от первого. Третий метод выделения буферных областей используется лишь тогда, когда программист, составляя исходную программу, уже точно знает, сколько ему понадобится буферов и какого типа. Макрокоманда BUILD адрес-пул а,число, длина или BUILD адрес-пула ,(0) вызывает перестройку существующей области памяти таким обра- зом, чтобы ее можно было использовать в качестве буферного пула. На месте первого операнда ставится либо (1), что говорит о наличии в регистре 1 адреса области, либо сам символический адрес. Второй и третий операнды аналогичны операндам, записы- вающимся в макрокоманде GETPOOL. Область памяти, которая предназначается для использования в качестве буферного пула, будет иметь длину 8 + число фдлина Первые 8 байтов отводятся под блок управления буферным пулом. Когда используется макрокоманда BUILD, операнды BUFL и BFALN игнорируются, поскольку в BUILD указана конкретная область, а следовательно, и граница, с которой она начинается, и ее размер. Но операнды BUFNO и BUFCB в DCB должны присутствовать. BUFCB будет указывать адрес буферного пула, a BUFNO будет определять число буферов, выделяемых из пула в момент открытия определенного набора данных. Применяя макрокоманду BUILD, можно построить буферный пул, которым смогут воспользоваться несколько DCB. Для этого нужно позаботиться только о том, чтобы общее число буферов в пуле было достаточно большим, чтобы все поступающие запросы
19.6.QSAM 715 на буферы удовлетворялись. Когда набор данных закрывается, буферы возвращаются в пул. Если бы, скажем, программист точно знал, что в программе у него пять файлов, что одновременно у него будет открыто не бо- лее трех, то практически было бы гораздо удобнее воспользоваться макрокомандой BUILD. Программист смог бы тогда указать область, соответствующую по размеру максимальному блоку, ’требующемуся для каждого файла, и указать такое число буфе- ров, чтобы удовлетворялись запросы, по крайней мере, трех файлов. Когда используются методы доступа с очередями, то команды ввода — вывода для заполнения или опустошения буфера выдают- ся сразу, как только это возможно. Следовательно, для того, чтобы скорость ввода — вывода была близка к максимальной, обычно бывает достаточно двух буферов или же одного буфера и отдель- ной рабочей области. Однако в некоторых специальных приложе- ниях программист, если это необходимо, может затребовать дополнительные буферные области. Такая возможность преду- смотрена в OS, и в этом заключено еще одно из преимуществ OS над DOS. Заметим, что, если программа порождает информацию, подле- жащую выводу, относительно редкими, но большими порциями, скажем по 4 блока сразу, то имеет смысл выделить четыре буфера с тем, чтобы весь или почти весь вывод совмещался во времени со счетом. 19.6. QSAM Этот метод обычно используется для последовательной обра- ботки стандартного последовательного файла. Определяется метод доступа по операндам DCB DSORG=PS или PSU и MACRF= (GMIG]) (GLIC1) (РМ[С]) (PLIG1) (GM[G],PM[C]) (GM[C],PL[C]) (GL[G],PM[G]) (GL[C],PLIC1) Квадратные скобки означают, что указание С необязательно. Буквы в операнде MACRF означают следующее: G — используется макрокоманда GET; Р — используется макрокоманда PUT; М — режим пересылки; L — режим указания; С — используется макрокоманда CNTRL.
716 Гл. 19. Макрокоманды OS Операнды OPTCD записываются следующим образом: OPTCD=W OPTCD=С OPTCD=WC где буквы означают W — писать на DASD с контролем правильности, С — планировать использование цепочек. Если W указано нр для DASD, то она игнорируется. Буква С означает, что QSAM будет пользоваться цепочками данных всегда, когда это будет повышать скорость операции. Записи в операнде RECFM будут такие: F [В] [SI [Т] [А | М] V [В | Т] [А | М] U [Т] [А | М] В скобках указываются различные варианты, а вертикальная черта между двумя обозначениями говорит о том, что может указы- ваться либо одно, либо другое, но ни в коем случае не оба одновре- менно. Буквы F, V и U означают формат записей: фиксированной, переменной или неопределенной длины. Буква В указывает на то, что записи сблокированные, S указывает, что внутри набора данных нет усеченных блоков или незаполненных дорожек. Исключение могут составлять последний блок или дорожка. Буква Т говорит о том, что на DASD должно использоваться средство переполнения дорожек. Буква А означает, что первым символом каждой записи является управляющий символ в коде ASA, а буква М означает, что этот управляющий символ дается в машинном коде. Вместе с операндом BFALN должен задаваться и операнд BFTEK = S или BFTEK = Е. Мы будем рассматривать только случай, когда BFTEK = S, т. е. случай простой буферизации. Кроме макрокоманд буферизации GETPOOL, FREEPOOL, BUILD с методом доступа QSAM используются следующие макро- команды: OPEN (deb, [(метод [,дисп])], . . .) deb — это адрес DCB, а метод можно указать, написав один из следующих трех операндов: INPUT OUTPUT UPDATE (только для DASD) UPDATE указывает на то, что для замены или корректирования существующей записи будет использоваться макрокоманда PUTX-
19.6. QSAM 717 В качестве последнего операнда дисп берется одно из следующих трех указаний: DISP REREAD LEAVE Эти указания означают следующее: 1) когДа происходит переключение томов, следует воспользо- ваться параметром диспозиция (DISP) в операторе DD; 2) том следует установить в позицию, чтобы набор данных под- вергнуть повторной обработке; 3) при обнаружении конца тома (EOV) не делается никакая дополнительная установка в какую-либо позицию. Третий операнд макрокоманды можно указать лишь тогда, когда записан второй. Если третий операнд опущен, считается, что задано DISP. Если опущен второй операнд, берется значение INPUT. Посредством одной макрокоманды OPEN можно открыть сколько угодно наборов данных. Например, ниже даны макро- команды OPEN, которые открывают по два набора данных: OPEN (A,(INPUT),В,(OUTPUT)) OPEN (А„С,(OUTPUT,DISP)) Оператор CLOSE записывается следующим образом: CLOSE (dcbi, [дисщ], dcb2, . . .) deb — это адрес DCB, а дисп указывает на установку в позицию таким же образом, что и в OPEN, с той лишь разницей, что ука- занные действия производятся при обнаружении EOF, а не EOV. Посредством одного оператора CLOSE можно закрыть сколько угодно наборов данных, например CLOSE (А,,В) CLOSE (А,,С,DISP) Вызвать принудительное оформление конца тома (EOV) можно макрокомандой FEOV deb FEOV (1) Единственный операнд этой макрокоманды указывает адрес DCB. Если в качестве операнда записывается (1), то адрес DCB должен быть предварительно помещен в регистр 1. При вводе очередная запись переносится в заданную пользо- вателем рабочую область и становится доступной для обработки
718 Гл. 19. Макрокоманду. OS в результате исполнения макрокоманды GET deb,область GET dcb,(O) GET (1),область GET (l),(0) Первый операнд указывает адрес DCB, а второй — адрес рабочей области. Выполнение макрокоманды приведет к тому, что сле- дующая по порядку запись будет заслана в рабочую область. Запись в рабочей области, предназначенная для выводаг передается методу доступа QSAM в результате выполнения макро- команды PUT deb,область PUT dcb,(O) PUT (1),область PUT (l),(0) Задавать макрокоманду PUT можно лишь для файла, который был открыт с указанием параметра OUTPUT. Приведенные выше форматы макрокоманды GET и PUT назы- ваются форматами режима пересылки, поскольку при их выпол- нении производится пересылка записи либо из рабочей области в буферную область для ввода — вывода, либо наоборот — из буфера в рабочую область. Вообще говоря, это наиболее удоб- ная форма подготовки записей к операции ввода — вывода, но бывают случаи, когда это замедляет обработку, особенно если длина записи превышает 256 байтов. В режиме указания макрокоманда GET имеет следующий формат: GET deb GET (1) Единственный операнд здесь указывает адрес DCB. При выпол- нении макрокоманды в регистр 1 будет записан адрес очередной записи. Длина записи, точно так же, как и в режиме пересылки, помещается в поле DCBLRECL блока управления данными. Когда используется режим указания, новое заполнение буфера невозможно до тех пор, пока не будет обработана последняя запись блока, находящегося в буфере. Макрокоманда PUT в режиме указания имеет следующий формат: PUT deb PUT (1) В результате выполнения этой макрокоманды в регистре 1 задает- ся адрес области, достаточно большой по размеру, чтобы в ней
19.6.QSAM 719 помещалась запись длины, указанной в поле DCBLRECL. Когда в этом режиме выполняется первая макрокоманда PUT, на самом деле никакая запись не выводится, и лишь с каждой последующей макрокомандой PUT последняя запись в области освобождается для передачи. Самая последняя запись передается при выполне- нии макрокоманды CLOSE. Следует отметит^, что действие макрокоманды PUT в режиме указания отличается от действия GET. Различие заключается в том, что PUT обеспечивает программисту область, в которой он может начать строить запись, предназначаемую им для вывода. Если для файла, у которого в макрокоманде OPEN было ука- зано UPDATE, выдается макрокоманда PUTX deb PUTX (1) то ее выполнение влечет корректирование записи, полученной макрокомандой GET в режиме указания. Иными словами, запись на диске будет обновлена. Запись, считанная макрокомандой GET в режиме указания, будет записываться таким же образом, как это делается при зада- нии PUT в режиме пересылки, как только появится макрокоманда PUTX dcb-вывoд,dcb-ввoд PUTX dcb-BHBOff,(0) PUTX (1)ДсЬ-ввод PUTX (l),(0) Первый операнд указывает адрес DCB набора данных, предна- значенного для вывода, а второй — адрес DCB набора данных, работающего на ввод. Оба набора данных должны быть открыты, причем для выводного набора данных в макрокоманде DCB дол- жен быть записан операнд MACRF=(PM), а для вводного — операнд MACRF=(GL). Есть еще ряд макрокоманд, которые выполняют самые разно- образные функции. Макрокоманда RELSE deb RELSE (1) влечет за собой полное игнорирование всего, что осталось в буфере ввода. Последующая макрокоманда GET выберет первую запись из следующего буфера. Если записи несблокированные, то появ- ление RELSE не имеет никакого эффекта. Макрокоманда TRUNC deb TRUNC (1)
720 Гл. 19. Макрокоманды OS создает укороченный (усеченный) блок. В результате ее выполне- ния текущий буфер для вывода считается заполненным полно- стью. Макрокоманда TRUNC игнорируется в тех случаях, когда она задается следом за другой макрокомандой TRUNC, когда она используется при работе с несблокированными записями или когда буфер действительно полон. Макрокоманда CNTRL deb, действие,число вызывает осуществление одной из операций управления. Эту операцию определяет операнд действие. Здесь может быть записа- но что-либо одно из следующего перечня: SS Выбрать приемный карман 1 или 2 SP Продвинуть бумагу на 1, 2 или 3 строки SK Прогнать бумагу до пробивки в дорожке 1—12 на печатающем устройстве В операнде число задается либо номер приемного кармана, либо число строк, либо номер дорожки. Макрокоманду CNTRL нельзя использовать, если применяются управляющие символы (RECFM=A или М). При выборе приемного кармана DCBBUFNO должен равняться 1. Макрокоманда PRTOV deb,число,адрес проверяет наличие пробивки в дорожке 9 или 12 па печатающем устройстве. Чтобы указать, какую дорожку надо проверить, во втором операнде пишется 9 или 12. Если проверка дает поло- жительный результат и третий операнд опущен, происходит автоматический прогон бумаги до пробивки в дорожке 1. В том случае, когда имеется третий операнд, и проверка дает положи- тельный результат, будет осуществляться переход по адресу, указанному этим операндом. Если программист предусмотрел специальную программу, которая будет работать в описанном случае, то параметр DCBBUFNO должен равняться 1. В противном случае нельзя будет гарантировать, что к моменту проверки завершатся все ранее заданные операции печати. Про- верка пробивок в дорожках 9 или 12 срабатывает при печати строки, следующей за строкой, отмеченной пробивкой. Если макрокоманда PRTOV задается не для печатающего устройства, то она попросту игнорируется.
19.7. QISAM 721 19.7. QISAM В отличие от DOS, которая разрешает пользоваться индексно- последовательными наборами данных g записями только фикси- рованной длины OS допускает работу с записями переменной длины. Однако длина ключа должна быть постоянной; QISAM действует в двух режимах, режиме загрузки, и режиме сканиро- вания. Режимом загрузки пользуются тогда, когда либо создается новый набор данных, либо уже существующий набор расши- ряется. Сначала мы рассмотрим режим загрузки. В этом режиме должно быть указано MACRF=(PL) или (РМ), что означает использование макрокоманды PUT в режиме указа- ния или в режиме пересылки. В операнде OPTCD может быть задана любая комбинация следующих букв': W — осуществление контроля за правильностью записи; М — создание по мере необходимости мастер-индексов; Y — использование области переполнения цилиндра; I — использование независимой области переполнения; L — удаление записей. Можно удалить записи, маркиро- ванные в самом левом байте единицами; R — сбор информации для реорганизации набора данных. Указание буквы R вызывает заполнение следующих полей в DCB: DCBRORG1 — число заполненных областей переполнения цилиндра; DCBRORG2 — число дорожек, оставшихся в независимой области переполнения; DCBRORG3 — число команд READ и WRITE, которые обращались к записи переполнения, не яв- ляющейся первой записью в цепочке. Все три поля хранятся как двоичные полуслова. Операнд RECFM задается ‘как RECFM = V, VB, F или FB. Операнд BUFL заменяется при выполнении макрокоманды OPEN, которая вычисляет, какая минимальная длина блока необ- ходима, сравнивает ее с заданной длиной, и если заданная длина достаточно велика, заменяет ее вычисленной длиной. На рис. 19.2 даются минимальные размеры буферов для. индексно-последова- тельных файлов. При обработке в режиме загрузки могут использоваться сле- дующие макрокоманды: OPEN CLOSE GETPOOL FREEPOOL 46 Зак. 15635
RKP RECFM LRECL BLKSIZE В U FL (загрузка) BUFL (сканирование) 0 F D LRECL 8 + KEYLEN + BLKSIZE KEYLEN + 10 + BLKSIZE ♦ 0 V 4 + D 4+ LRECL 8 + KEYLEN 4- BLKSIZE KEYLEN + 10 + BLKSIZE ♦ =#о F[B] D n*LRECL 8+ BLKSIZE 6+ 10 4- BLKSIZE =/=0 V[B] 44- D 4+ n*LRECL 8+ BLKSIZE 2 4- 10 4- BLKSIZE D — длина поля данных п — 1 — для несблокпрованных данных п — коэффициент блокирования (число записей в блоке) для сблокирован- ных данных 8 — длина поля счетчика 10 — длина поля связи * число увеличивается до ближайшего значения, кратного 8. Рис. 19.2. Длины буферов для индексно-последовательных наборов данных.
19.7. QISAM 723 BUILD PUT в режиме пересылки PUT в режиме указания Открываться набор данных должен с указанием типа OUTPUT, форматы макрокоманд полностью совпадают с форматами, исполь- зуемыми для QSAM. В режиме сканирования операнд MACRF задается следую- щим образом: MACRF=(GM [,S (К | Ш) MACRF=(GL l,S [К 11]] I,PU]) Каждая буква несет следующую информацию: G — используется макрокоманда GET; М — режим пересылки; L — режим указания; S — используется макрокоманда SETL; К — в макрокоманде SETL используется ключ; I — в макрокоманде SETL используется ID; Р — используется макрокоманда PUTX; U — корректирование записей. На рис. 19.2 приведены размеры буферов для режима скани- рования. Эти размеры заметно отличаются от приведенных для режима загрузки. Когда RKP равно 0 (означает, что ключ не является частью поля данных), в буфер будут считываться и ключ, и данные; в противном случае считываться будут только данные. Если RKP равно 0, буфер должен иметь длину, кратную 8» в случае необходимости длина увеличивается до нужной вели- чины. Если RKP =#0, то для того, чтобы обеспечить размещение записи на границе слова или двойного слова (на границе того же типа, с которой начинается буфер), слева в буфере оставляется 2 или 6 не играющих никакой роли байтов. Макрокоманды OPEN CLOSE GETPOOL FREEPOOL BUILD в режиме сканирования имеют те же функции и форматы, что и в режиме загрузки (исключение составляет макрокоманда OPEN, в которой должно указываться INPUT или UPDATE, а не OUTPUT). В режиме сканирования можно употреблять, кроме указанных, макрокоманды SETL (установить начало после- 46ф
724 Гл. 19. Макрокоманды OS довательной выборки): SETL d$b,тип,граница SETL deb,тип,(0) SETL (1) ,тип,граница SETL (1),тип,(0) Первый операнд указывает адрес DCB, второй определяет тип начальной установки, а третий операнд указывает адрес или ключа записи, или общего ключа, или ID, по которым делается начальная установка. В качестве второго операнда можно взять одно из следующих значений: К [D] — ключ записи; КС [D] — общий ключ; I [D] — идентификатор файла (MBBCCHHR); В [D] — начало набора данных. D означает, что когда RKP — 04 ключ не должен считы- ваться в память. Если указан тип К [D], последовательная обработка начи- нается с записи, ключ которой равен заданному ключу. Если указан тип КС [D], последовательная обработка начинается с первой записи, ключ которой больше или равен заданному обще- му ключу. Если указан тип I [D], последовательная обработка начинается с первой записи в блоке с заданным адресом. Если указан тип В [D], третий операнд опускается и обработка начи- нается с первой записи в наборе данных. Третий операнд опре- деляет адрес ID, если в качестве второго операнда указано I, а если на месте второго операнда стоит К или КС, то, соответ- ственно, адрес ключа записи или общего ключа. Макрокоманда ESETL deb ESETL (1) указывает на окончание последовательной выборки для конкрет- ного DCB. Эта макрокоманда должна задаваться до того, как файл закрывается. Макрокоманды GET в режиме указания GET в режиме пересылки записываются точно таким же образом, как и для QSAM. Если перед макрокомандой GET после OPEN или последней выданной до этого ESETL не было макрокоманды SETL, то считается, что действовать будет макрокоманда SETL deb,В
19.1. QISAM 725 Макрокоманда PUTX deb PUTX (1) используется вместе с макрокомандой GET в режиме указания для того, Чтобы записать последнюю полученную макрокомандой GET запись в набор данных, замещая ту запись, которая там имеется. Запись, предназначенная для удаления, маркируется поме- щением в самый левый байт записи единиц (шестнадцатеричное FF). В наборах данных с записями типа V или VB шестнадцате- ричное FF помещается в пятый байт записи (т. е. в первый байт после четырехбайтового поля длины записи). Макрокоманда RELSE deb RELSE (1) действует точно так ясе, как и в QSAM. Во время выполнения операций с индексно-последовательными наборами данных могут возникать ситуации, при которых фик- сируются ошибки. Каждая отдельная ошибка указывается одним из битов в двухбайтовом поле, отведенном для этой цели в DCB. Все признаки ошибок, которые могут быть там указаны, пере- числены на рис. 19.3. Если имеет место ошибка, управление пере- дается программе SYNAD, адрес которой помещается в регистр 15, а адрес возврата помещается в регистр 14. При ошибках, воз- никающих при выполнении макрокоманд GET — PUT,' адрес буфера помещается в регистр 1, а адрес стандартной информации о состоянии помещается в регистр 0. При возникновении всех остальных ошибок содержимое регистров 1 и 0 может быть каким угодно. Особо следует отметить, что переполнение дорожки вызывает установку соответствующего бита, но передачи управ- ления на программу SYNAD Не происходит. Стандартная информация о состоянии, адрес которой при возникновении ошибок на командах GET — PUT помещается в регистр 0, имеет следующий формат: Байты: 0—1 Резерв 2—3 Байты уточненного состояния 1 и 2 4—7 Резерв 8-15 CSW Байты уточненного состояния заполняются только в случае ошибки в устройстве.
726 Гл. 19. Макрокоманды OS Байт DCBEXCD1 Бит У станавливается макрокомандой 0 Нужная граница по ключу не най- дена SETL 1 Неверный ID SETL 2 Не обнаружено места для добав- ления записи PUT (режим загрузки) 3 Неверная команда: (а) слишком мало значение BUFL (b) подряд 2 SETL, между которыми нет ESETL (с) некорректно задано по- ле типа в SETL SETL 4 Неустранимая ошибка ввода GET 5 Неустранимая ошибка вывода PUT или CLOSE (загрузка) 6 Нет такого входного блока GET 7 Байт Нет такого выходного блока DCBEXCD2 PUT или CLOSE (загрузка) 0 Ошибка в последовательности. Записи, которые должны загру- жаться, не упорядочены. Дублирование записи PUT (режим загрузки) 1 PUT (режим загрузки) 2 Неустранимая ошибка, обнару- женная при выполнении CLOSE CLOSE 3 Запись переполняет дорожку (не GET ошибка) Рис. 19.3. Поле признаков ошибок в QISAM. 19.8. Несколько примеров В этом разделе мы предлагаем вашему вниманию четыре программы, осуществляющие ту же самую функцию, что и про- граммы в разд. 18.6: считывание колоды карт и запись образов карт на ленту с колонками 9—80 перед колонками 1—8. Про- граммы подобраны так, чтобы проиллюстрировать работу как в режиме пересылки, так и в режиме указания. Заметим, что DCB не может занимать первые 16 байтов программной секции. * PROGRAM WITH WORK ♦ AREAS CDTE START 24576 ЕЮ BALR USING GETPOOL OPEN 11,0 •,11 CARDIN,2,80 (CARDIN,(INPUT), X TAPEOUT,(OUTPUT)) Ell GET MVC CARDIN,E31 E51.E314-72
19.8. Несколько примеров 727 MVC E52.E31 PUT в E20 CLOSE FREEPOOL FREEPOOL RETURN CARDIN DCB TAPEOUT, E50 Ell (CARDIN,,TAPEOUT) CARDIN TAPEOUT RC=0 DSORG=PS,MACRF=(GM), 1 TAPEOUT DCB DDNAME=CDIN, 2 DEVD=RD, 3 MODE=E,STACK=1, 4 RECFM=F, 5 LRECL=80, BLKSIZE=80, 6 BFTEK=S, EODAD = E20, 7 EROPT=ABE DSORG=PS,MACRF=(PM), 1 E31 DS E50 DS DDNAME=TPUT, 2 DEVD=TA, 3 RECFM=FB,LRECL=80, 4 BLKSIZE=320, 5 BUFNO=2, 6 BFALN=F,BUFL=320, 7 BFTEK=S,EROPT=ABE CL80 INPUT WORK AREA 0CL80 OUTPUT WORK AREA E51 DS E52 DS END CL8 CL72 ЕЮ В первой программе, чтобы предоставить буферы для ввод- ного карточного файла, мы пользуемся макрокомандой GETPOOL, но обеспечение буферами для выводного ленточного файла возлагается на макрокоманду OPEN. Макрокоманда FREEPOOL нужна для обоих файлов. Макрокоманда RETURN RC=0 эквивалентна макрокоманде EOJ, использующейся в DOS. Она возвращает управление OS, помещая при этом в регистр 15 вели- чину 0. Эта величина представляет собой код возврата (RC), который проверяется (если указано в управляющей карте ЕХЕС) для того, чтобы определить, должны ли выполняться последую- щие шаги задания. PROGRAM USING LOCATE MODE FOR INPUT
728 Гл. 19. Макрокоманды OS CDTE START 24576 ЕЮ BALR USING GETPOOL 11,0 Ml CARDIN,2,80 OPEN (CARDIN,(INPUT), X TAPEOUT,(OUTPUT)) EH GET MVC MVC PUT В CARDIN E51,72(l) E52,0(l) TAPEOUT,E50 Ell E20 CLOSE FREEPOOL FREEPOOL RETURN (CARD IN „TAPEOUT) CARDIN TAPEOUT RC=0 CARDIN DCB DSORG=PS,MACRF=(GL), 1 DDNAME=CDIN, 2 DEVD=RD, 3 MODE=E, STACK=1, 4 RECFM=F, 5 LRECL=80,BLKSIZE=80, 6 BFTEK=S, EODAD = E20, 7 EROPT=ABE TAPEOUT DCB DSORG=PS,MACRF=(PM), 1 DDNAME=TPUT, 2 DEVD=TA, 3 RECFM=FB.LRECL=80, 4 BLKSIZE=320, 5 BUFNO=2, 6 BFALN=F,BUFL=320, 7 BFTEK=S,EROPT=ABE E50 DS 0CL80 OUTPUT WORK AREA E51 DS CL8 E52 DS END CL72 E10 Во втором примере для ввода используется режим указания, тогда как для вывода сохраняется режим пересылки. Заметьте, что при обработке в качестве регистра базы мы можем взять регистр 1. Макрокоманда PUT портит содержимое регистра 1, но к этому моменту он уже не содержит нужной информации. * PROGRAM USING LOCATE * MODE FOR OUTPUT CDTE START 24576 ЕЮ BALR 11,0
19.8. Несколько примеров 729 USING *,11 GETPOOL CARDIN,2,80 OPEN (CARDIN,(INPUT), X TAPEOUT,(OUTPUT)) Ell GET PUT USING MVC MVC В CARDIN,E31 TAPEOUT CDTF,1 Е51.ЕЗЦ-72 E52.E31 Ell E20 CLOSE FREEPOOL FREEPOOL RETURN (CARDIN „TAPEOUT) CARDIN TAPEOUT RC=0 CARDIN DCB DSORG=PS,MACRF=(GM), 1 DDNAME=CDIN, 2 DEVD—RD, 3 MODE=E,STACK=1, 4 RECFM=F, 5 LRECL=80,BLKSIZE=80, 6 BFTEK=S,EODAD=E20, 7 EROPT=ABE TAPEOUT DCB DSORG=PS,MACRF=(PL), 1 DDNAME=TPUT, 2 DEVD=TA, 3 RECFM=FB,LRECL=80, 4 BLKSIZE =320, 5 CDTF DSECT BUFNO=2, 6 BFALN=F,BUFL=320, 7 BFTEK=S,EROPT=ABE E50 DS 0CL80 E51 DS CL8 E52 DS CDTE CSECT CL72 E31 DS END CL80 INPUT WORK AREA ЕЮ В третьей программе для вывода используется режим указа- ния. Заметьте, что макрокоманда PUT здесь задается до начала обработки, заключающейся в создании выходной записи. Для того чтобы указать структуру области вывода, мы воспользо- вались фиктивной секцией и взяли в качестве регистра базы регистр 1. Осуществляя свою простую обработку, мы, конечно, вполне обошлись бы и без фиктивной секции, но мы здесь хотели проиллюстрировать те приемы, которые наиболее употребительны.
730 Гл. 19. Макрокоманды OS * PROGRAM USING ONLY CDTE ЕЮ Е11 Е20 CARDIN START BALR USING GETPOOL OPEN GET LR PUT USING MVC MVC В CLOSE FREEPOOL FREEPOOL RETURN DCB LOCATE MODE 24576 11,0 •,11 CARDIN,2,80 (CARDIN,(INPUT), TAPEOUT,(OUTPUT)) CARDIN 2,1 TAPEOUT CDTF,1 E51,72(2) E52,0(2) Ell (CARDIN„TAPEOUT) CARDIN TAPEOUT RC=0 DSORG=PS,MACRF=(GL), X 1 TAPEOUT DCB DDNAME=CDIN, DEVD=RD, MODE=E,STACK=1, RECFM=F, LRECL=80, BLKSIZE=80, BFTEK=S,EODAD=E20, EROPT=ABE DSORG=PS,MACRF=(PL), 2 3 4 5 6 7 1 CDTF DSECT E50 DS E51 DS E52 DS END Ситуация, представленная в DDNAME=TPUT, 2 DEVD=TA, 3 RECFM=FB,LRECL=80, 4 BLKSIZE =320,BUFNO=2, 5 BFALN=F,BUFL=320, 6 BFTEK=S,EROPT=ABE 0CL80 CL8 CL72 E10 । последней программе, типична для больших программ. Режим указания используется здесь для ввода и для вывода. Для ввода в качестве регистра базы мы берем регистр 2, а для вывода — регистр 1. Команда LR 2,1
19.8. Несколько примеров 731 должна задаваться перед макрокомандой PUT, поскольку извест- но, что при выполнении макрокоманды PUT содержимое регист- ров 0 и 1 портится. Упражнения № 50 1. Переписать программу упр. 45.1, используя DCB. 2. Переписать программу примера в разд. 17.3, используя DCB и макрокоманды ввода — вывода. 3. Переделать упр. 46.3 применительно к OS. 4. Переделать упр. 46.4 применительно к OS. 5. Переделать упр. 46.5 применительно к OS. 6. Что будет напечатано в результате выполнения приведен- ной ниже программы, если входная информация в колонках 1—5 представляет собой (а) 00000; (Ь) 00123; (с) 0012К; (d) 99999? START R BALR 11,0 USING •,11 OPEN (XIN„YOUT,(OUTPUT)) S GET XIN PACK X,0 (5,1) ZAP Y,ONE AP Y,X AP Y,X UNPK YU,Y PRTOV YOUT,12 PUT YOUT,YU В S E CLOSE (XIN„YOUT) RETURN RC=0 XIN DCB DSORG=PS,MACRF=(GL), DDNAME=SYSIN,DEVD=RD, RECFM=F,LRECL=80 BLKSIZE=80„ BFTEK=S,BUFNO=2, BFALN=D,BUFL=80, EODAD=E YOUT DCB DSORG=PS,DEVD=PR, MACRF=(PM),BUFL=7, DDNAME=SYSOUT, PRTSP=1,RECFM=F, BLKSIZE=7,BUFNO = 2, LRECL =7, BFTEK=S, BFALN=D YU DS CL7 О СП ОО ЬЭ I-* О СП 4S Q0 ЬО и*
732 Гл. 19. Макрокоманды OS X DS CL3 Y DS CL4 ONE DC PL1'-1 END R 7. Изменить упр. 6 таким образом, чтобы выводилось X, два пробела, а затем уже Y. 8. Изменить упр. 7 так, чтобы первые нули числа не печа- тались, а перед первой ненулевой цифрой ставился бы знак минус. 9. Запрограммировать упр. 45.9. 10. Написать программу чтения колоды карт, считая их 80-байтовыми записями, и занесения этих несблокированных 80-байтовых записей на ленту. Использовать стандартные метки. 11. Написать программу чтения ленты из упр. 10 и записи стандартного последовательного файла на диск. 12. Изменить упр. 10 и 11 таким образом, чтобы записи стали сблокированными. Коэффициент блокирования на ленте равен 4, а на диске — 3. 13. Изменить упр. 11 так, чтобы получить индексно-последо- вательный файл. В качестве ключа записи взять содержимое колонок 3—5. 19.9. Буферизация для базисного метода доступа Базисные методы доступа предназначаются главным образом для произвольного, а не для последовательного доступа к данным. Следовательно, базисные методы не могут считывать данные с упреждением из расчета на то, что они понадобятся в программе. Возможна такая ситуация. Программа получит запись А, несколько позднее получит запись В, полностью обработает запись В, но еще не закончит все операции с записью А. Таким образом, базисные методы доступа должны не только предостав- лять буферы в каком-то буферном пуле, но также должны предо- ставлять программе возможность управлять процессом выделения и освобождения буферов. В базисных методах BSAM, BISAM и BDAM макрокоманды OPEN и CLOSE используются для тех же целей, что и в методах с очередями, а макрокоманды READ и WRITE — для того, чтобы начать операцию ввода — вывода. Для ожидания завершения операции, начатой командами READ и WRITE, используется макрокоманда CHECK. Создание буферного пула можно обеспечить, задав макрокоман- ду BUILD или GETPOOL до того, как открывается набор данных,
19.9. Буферизация для базисного метода доступа 733 связанный с конкретным DCB. Кроме того, буферный пул может быть образован при выполнении макрокоманды OPEN. Макрокоманды GETPOOL и BUILD имеют дело с теми же четырьмя связанными с буферизацией операндами DCB, как и в случае QSAM и QISAM. Когда буферный пул порождается макрокомандой OPEN, существует несколько незначительных различий. Операнд BUFNO считается необязательным, за исклю- чением BSAM, где он необходим. Операнд BUFCB должен быть опущен, за исключением BDAM, где его можно записать, но он игнорируется. Операнд BFALN необязателен; если он отсут- ствует, берется его значение BFALN — D. Операнд BUFL для BSAM необязателен, для BDAM он необходим, для BISAM он игнорируется. Требования на размеры буфера для BISAM абсо- лютно совпадают с требованиями, предъявляемыми к буферу для режима сканирования в QISAM. Однако при работе с базисными методами доступа у програм- миста есть еще четвертый путь управления буферизацией. Он может просто обеспечить каждую задаваемую им макрокоманду READ или WRITE своим собственным буфером. В этом случае необходимость в каком-либо буферном пуле отпадает, а' четыре связанные с буферизацией операнда DCB будут попросту игно- рироваться. (Исключение: в BSAM операнд BUFNO при этом должен быть опущен.) Когда буферный пул существует, программа может запросить буфер с помощью макрокоманды: GETBUF deb,регистр GETBUF (1),регистр Первый операнд этой макрокоманды указывает адрес DCB, а второй (регистр со 2 по 12) — регистр, в который будет поме- щаться адрес буфера. В некоторых случаях для автоматического выделения буфера из пула можно воспользоваться макрокоман- дой READ, но во всех остальных случаях, когда используются буферные пулы, программист должен запрашивать буфер с помо- щью макрокоманды GETBUF. В некоторых случаях макрокоманда WRITE может автомати- чески возвратить буфер, в котором больше нет необходимости. Во всех остальных случаях буфер возвращается по макрокоманде FREEBUF deb,регистр FREEBUF (1),регистр Операнды этой макрокоманды полностью идентичны операндам GETBUF. С помощью FREEBUF в буферный пул можно вернуть .лишь тот буфер, который брался из этого пула.
734 Гл. 19. Макрокоманды OS 19.10. BSAM BSAM Используется для обработки стандартных последова- тельных наборов данных. Употребляется он и для создания таких наборов данных, обращение к которым позднее будет осущест- вляться с использованием BDAM. В макрокоманде OPEN задается одно из следующих значений: INPUT OUTPUT INOUT OUTIN RDBACK (только для магнитной ленты) UPDAT (только для DASD) Если указывается INPUT, запрещены макрокоманды WRITE. Если указывается OUTPUT, запрещены макрокоманды READ. Задание INOUT означает, что набор данных открывается как входной, но позднее может использоваться и как выходной, причем закрывать и потом вновь открывать его нет необходимости. Аналогичным образом OUTIN определяет набор данных, откры- тый как выходной, но впоследствии используемый как входной. RDBACK означает что входной набор данных считывается с маг- нитной ленты в обратном направлении. UPDAT обозначает вход- ной файл на DASD, для которого будет использоваться макро- команда WRITE для корректирования некоторых записей. Когда набор данных открыт с указанием UPDAT, макрокоманда WRITE корректирует запись, а во всех остальных случаях она создает новую запись. В DCB операнд MACRF принимает одно из значений: MACRF = (R) (RC) (RP) (W) (WC) (WP) (WL) (R IC1,W (Cl) (R [P1,W [Pl) Под буквами в скобках подразумевается следующее: R — используется макрокоманда READ; W — используется макрокоманда WRITE; — используется макрокоманда CNTRL; Р — используется макрокоманда POINT или NOTE; — в режиме загрузки для набора данных с прямым доступом используется макрокоманда WRITE. С L
19.10. BSAM 735 В операнде OPTCD может быть записано OPTCD = W OPTCD = С OPTCD = WC где W означает контроль правильности при записи, а С — что нужно планировать работу с цепочками. В операнде RECFM может быть записано F[B][S][T][A | М] V[B I TH А | Ml umiA । mi Буквы имеют тот же самый смысл, что и в QSAM. Макрокоманды FEOV и CLOSE сохраняют свой обычный формат, причем в макро- команде CLOSE можно добавить операнд TYPE = T: CLOSE (ИсЬ,дисп,(1сЬ2,дисп2 . . .),TYPE=T Эта макрокоманда имеет те же функции, что и обычная макро- команда CLOSE с той лишь разницей, что набор данных остается открытым. Операнд дисп может принимать только два значения: REREAD и LEAVE. Эта разновидность макрокоманды CLOSE как обычно записывает метки и пр. и поэтому большей частью находит применение для наборов данных, открытых с указанием OUTIN или INOUT. Операцию ввода начинает макрокоманда READ. Она имеет следующий формат: READ decb,тип,deb,область,длина Операнд decb указывает адрес управляющего блока или таб- лицы событий (DECB — Data Event Control Block); тип задается одним из двух значений: либо SF — для последовательного счи- тывания в прямом направлении, либо SB — для последователь- ного считывания в обратном направлении; область представляет собой адрес буфера для ввода (возможно полученного посредством GETBUF), а длина — это число байтов, которое должно считы- ваться из записи формата U. Если во втором операнде указано SB, то операнд область представляет собой адрес самого правого байта буфера. Если макрокоманда выдается для записей типа F или V, операнд длина игнорируется, и записывать его нет ника- кой необходимости. Если макрокоманда задана для записей типа U, а в операнде длина записано 'S', считываться будет вся запись целиком. Операнды область или длина можно заменять указанием (г), где г — 2—12 и определяет регистр, содержащий нужную информацию. В частности, операнд область, как пра- вило, записывается именно в такой форме, например READ DE2,SF,DC5,(4)
736 Гл. 19. Макрокоманды OS задает считывание в область, определяемую регистром 4, набора данных с DCB, размещенным по адресу DC5, и DECB, размещен- ным по адресу DE2. Для BSAM блок DECB представляет собой 20-байтовое поле, создаваемое макрокомандой READ. Оно содержит Байты 0—3 Блок событий 4—5 SF или SB 6—7 Поле длины 8—11 Адрес DCB 12—15 Адрес области 16—19 Адрес блока состояния Блок состояния представляет собой 16-байтовое поле, содер- жащее байты уточненного состояния и байты CSW. Этот блок был описан в разделе, посвященном QISAM. Блок событий представляет собой полное слово. Бит 0 в этом слове возбуждает- ся, когда выдается макрокоманда CHECK, и сбрасывается, когда операция завершается. Бит 1 возбуждается по завершению опе- рации и сбрасывается, когда операция начата. Все оставшиеся биты слова используются программами IOCS. По окончании работы программы IOCS в самом левом байте слова (биты 0—7) будет содержаться следующая информация: 7F — нормальное завершение операции; 41 — постоянная ошибка; 42 — границы экстента на DASD нарушены, операция не завершена; 44 — операция не завершена, так как в предыдущей опера- ции была обнаружена постоянная ошибка в момент окончания работы устройства; 48 — запрашивались несуществующие данные; 4F — на DASD нельзя прочитать НА (собственный адрес) или Ro. Обычно программист не работает с содержимым DECB. Макрокоманда READ только начинает операцию и сразу же возвращает управление программе. Поэтому макрокоманда CHECK decb осуществляет проверку операции, указанной в управляющем блоке событий. Выполнение этой макрокоманды приводит к тому, что CPU переводится в состояние ожидания до тех пор, пока не завершится операция. Обратите внимание, что блоком DECB можно поль- зоваться неоднократно, причем его можно использовать не только
19.10. BSAM 737 для одного файла. Естественно при этом должно соблюдаться условие, что блок находится в распоряжении только одной опе- рации весь тот период времени, в течение которого она выпол- няется. Может также возникнуть такая ситуация, когда для одного DCB желательно воспользоваться несколькими DECB, скажем для того, чтобы обеспечить одновременное считывание нескольких записей, и хотя для BSAM практически это не имеет смысла, в принципе это вполне возможно. Макрокоманда WRITE имеет следующий формат: WRITE decb,SF,deb,область,длина Операнды этой макрокоманды совершенно идентичны опе- рандам READ. Если набор данных открывался с указанием UPDAT, выполнение макрокоманды приведет к корректированию записи на DASD. Если набор данных открывался с указанием OUTPUT, OUTIN или INOUT, то в наборе данных будет создана новая запись. Если содержимое буфера больше не нужно, то по- сле макрокоманды CHECK необходимо задать макрокоманду FREEBUF. Если происходит обращение к программе, определяемой опе- рандом SYNAD, то регистр 15 содержит адрес точки входа в эту программу, регистр 14 содержит адрес возврата, регистр 0 — адрес DECB, а регистр 1 — адрес DCB. В регистре 1 кроме этого устанавливаются (в зависимости от характера ошибки) некоторые биты. Бит 0 возбуждается, если ошибка вызвана макрокомандой READ; бит 1 возбуждается, если ошибка вызвана макрокомандой WRITE; бит 2 — если ошибка вызвана макрокомандой CNTRL, POINT или BSP; бит 3 — если ошибка при выполнении макро- команды READ не помешала считыванию блока или если ошибка произошла при корректировании записи; бит 4 возбуждается, если имел место некорректный запрос, например если обнаружи- лось, что POINT указывает несуществующий блок. Используя макрокоманду WRITE decb,тип,deb,область,длина можно создавать наборы данных с прямым доступом. При этом в операнде MACRF должно быть указано L. Операнды макрокоман- ды не отличаются от операндов WRITE, используемых в BSAM, за исключением операнда типа, который может быть указан одним из следующих способов: SF — новая запись данных; SD — фиктивный блок данных; SZ — управляющая запись, содержащая емкость дорож- ки (Ro). 47 Зак. 15635
738 Гл. 19. Макрокоманды OS SD можно задавать только для записей типа F. В результате возникает запись с шестнадцатеричными FF в первом байте и по- рядковым номером блока в остальной части записи. Когда впослед- ствии к набору данных будут добавляться какие-то записи, эти фиктивные записи будут ими замещаться. Поскольку порядковый номер блока занимает только один байт, указанная в макрокоман- де область должна иметь объем, достаточный для того, чтобы там поместился ключ и плюс один байт. Если же ключи не исполь- зуются, SD указывать нельзя. Относительно третьего типа SZ можно сказать, что записывать Ro необходимо до того, как на дорожку будут заноситься какие-то записи. В результате выполнения макрокоманды WRITE в регистр 15 будут помещены следующие коды: О SZ: имеется в распоряжении другая дорожка; Ro будет записана на следующей дорожке; SF, SD: блок будет записан; на дорожке остается еще место; 4 записи типа F: блок будет записан; дорожка после этого будет полна; записи типа V, U: для того, чтобы записать блок, места недостаточно. Перед тем, как записывать блок, на сле- дующую дорожку необходимо записать Ro; 8 блок или запись Ro будет записана. Прежде чем делать новые записи, нужно задать макрокоманду CHECK с тем, чтобы вызвать выполнение процедуры, оформляю- щей «конец тома» (EOV); 18(12}6) блок не будет записан. Для предыдущей макроко- манды WRITE следует выдать макрокоманду CHECK. Для того чтобы определить, записан ли блок, должна выда- ваться макрокоманда CHECK, и обычно это делается для каждой макрокоманды WRITE. Существует еще несколько макрокоманд самого разного назна- чения; среди них BSP deb BSP (1) PRTOV <1сЬ,канал[,адрес-программы] CNTRL deb, действие!,число] Макрокоманда BSP вызывает возвращение ленты назад на один блок. Макрокоманда PRTOV работает так же, как и в QSAM. Макрокоманда CNTRL тоже аналогична используемой в QSAM, но здесь для магнитной ленты предлагаются еще дополнительные функции. В операнде действие разрешается указывать следую-
19.10. BSAM 739 щие операции: BSR — вернуться назад на заданное число блоков- BSM — вернуться назад за марку ленты, потом сделать шаг вперед, чтобы «перешагнуть» эту марку; FSR — продвинуться вперед на заданное число блоков; FSM — продвинуться вперед до первой марки ленты, потом сделать шаг назад «через» марку. Третий операнд запрещается записывать для BSM и FSM. Если третий операнд отсутствует при указании действия BSR или FSR, принимается число 1. Макрокоманда NOTE deb NOTE (1) помещает в регистр 1 идентификатор блока. Для ленты этот идентификатор представляет собой номер в двоичном представле- нии последнего считанного или записанного блока. Для диска идентификатор является четырехбайтовым шестнадцатеричным числом TTRz, где ТТ представляет номер дорожки относительно первой дорожки в наборе данных (номер первой дорожки = 00), R — номер записи на дорожке (номер первой записи данных = 1), a z = 00 (шестнадцатеричные). При работе с диском в том случае, когда последней операцией была WRITE, в регистре 0 будет находиться zzLL, где LL пред- ставляет собой двоичное число байтов, оставшихся на дорожке. Макрокоманда POINT deb,место POINT (1),место POINT dcb,(O) POINT (l),(0) изменяет обычный порядок последовательной обработки, задавая идентификатор очередной записи, которую надо прочитать или записать. Во втором операнде макрокоманды указывается адрес полного слова, содержащего zzCC для магнитной ленты и TTRz для DASD. Первый блок в любом наборе данных, будь он на ленте или на диске, имеет идентификатор 0000 0001. На диске иденти- фикатор в форме TTR1, где последний байт представляет собой шестнадцатеричное 01, определяет запись, идущую непосред- ственно за записью с идентификатором TTRz. Такого рода указа- ние записи позволяет обратиться к следующей записи на ленте или на диске добавлением 1 к идентификатору текущей записи. Макрокоманды POINT и NOTE используются главным обра- зом для рабочих файлов. 47*
740 Гл. 19. Макрокоманды OS 19.11. BISAM При работе с этим методом доступа операнд MACRF в макро- команде DCB задается следующим образом: MACRF = (RIS1) ([R[U][S]J W{U|A|UA}) Буквы обозначают следующее: R — используется и макрокоманда READ; W — используется макрокоманда WRITE; U корректирование; А — добавление новых записей; S — обеспечивается динамическая буферизация. Буква S означает, что выделение буфера будет происходить автоматически ио макрокоманде READ и программисту нет не- обходимости запрашивать буфер с помощью макрокоманды GETBUF. Операнд NCP в DCB определяет число программ канала, т. е. максимальное число программ, которые могут работать одновре- менно. Если этот операнд не задан, считается, что программа канала одна, т. е. NCP = 1. Возможность параллельной работы нескольких программ канала играет важную роль при чтении или записи на разные устройства. Если мы захотим, чтобы мастер-индекс высшего уровня хра- нился в памяти, нужно воспользоваться операндами MSHI и SMSI. Длина этого индекса берется, когда набор данных создан, из поля DCBNCRHL Длина не может превышать 32767 байтов. Если к существующему файлу будут добавляться записи пере- менной длины, то необходимо задание операндов MSWA и SMSW, определяющих рабочую область для мастер-индекса. Если эти операнды заданы для записей фиксированной длины, то процесс помещения записи заметно ускорится. Определяемая этими опе- рандами область должна иметь объем, достаточный для размеще- ния всех записей на дорожке (только полей данных) плюс место для счетчика, ключа и данных одной записи. В BISAM макрокоманды GETPOOL, FREEPOOL и BUILD используются в своем обычном значении. Макрокоманды GETBUF и FREEBUF можно использовать, когда имеется буферный пул, созданный макрокомандой GETPOOL или BUILD. В макрокоман- де OPEN должно указываться либо INPUT, либо OUTPUT, либо UPDAT. Макрокоманда CLOSE имеет свой обычный вид. Кроме уже названных макрокоманд, в BISAM можно использовать макрокоманды READ, WRITE, WAIT и FREEDBUF. Требо- вания, предъявляемые в BISAM к буферам, совпадают с тре- бованиями для режима сканирования в QISAM.
19.11. BISAM 741 Макрокоманда READ decb ,K [ U ] ,dcb,область, длина ,ключ похожа на READ в BSAM. Тип К определяет обычное чтение, а тип KU указывает, что считывание будет производиться для последующего корректирования, иными словами, будет произ- ведена перезапись считанной записи. Если операнд область представлен буквой 'S', то управляющая программа автоматиче- ски запросит буфер для записи, которая должна считываться. Адрес этой области будет находиться в DECB. Операнд длина задает максимальный размер, который может иметь считываемая запись. Если величина, указанная операндом, окажется меньше длины физической записи, то считывания в память той части записи, которая не входит в заданные пределы, не происходит. В этом отношении задание величины 'S' наиболее надежно, поскольку 'S' обеспечивает считывание записи полностью. В слу- чае работы со сблокированными наборами данных значение 'S' является единственным корректным указанием. Последний опе- ранд определяет адрес поля, содержащего ключ для нужной нам записи. Первый операнд представляет собой адрес управляющего блока событий. В BISAM блок DECB — это 26-байтовое поле, имеющее следующую структуру: Байты 0—3 блок событий 4—5 тип 6—7 длина 8—11 адрес DCB 12—15 адрес области 16—19 адрес записи 20—23 адрес ключа записи 24—25 байты с кодами ошибок Байт 25 резервируется для управляющей программы, и про- блемная программа им пользоваться не должна. Все биты 24-го байта сбрасываются, когда начинается операция, а затем в этом байте будут указываться определенные признаки ошибок. Макро- команда READ устанавливает биты следующим образом: Бит О запись не обнаружена 1 запись с неверной длиной 4 неустранимая ошибка ввода — вывода 5 незафиксированный блок 6 запись переполнения
14% Гл. 19. Макрокоманд» OS Макрокоманда WRITE устанавливает биты несколько по-иному: Бит О запись не обнаружена (только при корректировании) 1 запись с неверной длиной 2 нет места для добавления записи (только при добав- лении) 3 при корректировании записи буфер, используемый макрокомандой READ, был освобожден до выполнения WRITE (только при корректировании) 4 неустранимая ошибка ввода — вывода 5 незафиксированный блок 6 дублирование записи (только при добавлении) Незафиксированный блок — это блок, не указанный в индек- сах. Если макрокоманда READ прекращает работу в ситуации, когда имеет место ошибка, то полученный динамически буфер сохраняется. Для того чтобы этот буфер освободить, необходимо выдать макрокоманду FREEDBUF. Макрокоманды READ и WRITE, как уже неоднократно говорилось, просто начинают операцию и сразу же передают управление следующей команде. Для того чтобы программа могла подождать завершения операции, проверить затем байты с при- знаками ошибок и в соответствии с их значением обработать за- пись, выдается макрокоманда WAIT, имеющая следующий формат; WAIT ЕСВ=адрес WAIT ЕСВ=(1) Единственный операнд этой макрокоманды определяет адрес блока событий, т. е. просто адрес DECB. Для того чтобы откорректировать (заменить) существующую запись и добавить новые записи, применяется макрокоманда WRITE decb, K[N], deb, область, длина, ключ Буква К в операнде тип означает, что будет осуществляться корректирование, буквы KN означают добавление. Если в соот- ветствующей макрокоманде READ в качестве операнда область было взято 'S', то и в WRITE в качестве этого операнда можно тоже взять 'S'; это вызовет автоматическое освобождение буфера по окончанию процесса записи. В тех случаях, когда работа идет со сблокированными записями или когда к набору данных добав- ляются новые записи, операнд длина может и не задаваться. Когда же длина указывается, следует позаботиться о том, чтобы не возникали какие-нибудь нежелательные ситуации. Например,
19.12. BDAM 743 может получиться, что часть записи потеряется, если, скажем, задана длина меньше, чем та, которую имеет физическая запись. В этом отношении надежнее всего пользоваться заданием 'S', что означает, что запись должна быть записана полностью. Макрокоманда FREEDBUF FREEDBUF FREEDBUF FREEDBUF decb,К,deb (O),K,dcb decb,К,(1) (0),К,(1) вызывает освобождение буфера, полученного автоматически при выполнении макрокоманды READ. Для буферов, полученных в результате выполнения макрокоманды GETBUF, эта макро- команда не используется; в этих случаях применяется макро- команда FREEBUF. 19.12. ’BDAM Наборы данных, обращение к которым осуществляется посред- ством BDAM, должны открываться с указанием либо INPUT, либо OUTPUT, либо UPDAT. Если набор данных открыт как входной, то нельзя пользоваться макрокомандой WRITE. Осталь- ные два варианта (выходной и для корректирования) допускают употребление всех макрокоманд, включая и READ. Между открытием набора как выходного и открытием набора как тре- бующего корректирования не существует никакой разницы. В DCB операнд MACRF задается следующим образом: MACRF=(R {К |I |KI} [X] [S]) (IR {К |I |KI} [X][S1J W {[А][К][I]}) Вместе с W должна указываться по крайней мере одна из букв, указанных в фигурных скобках: А, К или I. Буквы означают следующее: R — используется макрокоманда READ; W — используется макрокоманда WRITE; К — блоки выбираются по ключу; I — блоки выбираются по идентификатору ID; А — к набору данных добавляются блоки; X — монопольное управление; S — возможна динамическая буферизация. Монопольное управление означает, что с того момента, как программа обратилась к записи, запрещено любое другое обра- щение к этой записи как со стороны этой же программы, так и со стороны других программ до тех пор, пока программа не сни-
744 Гл, 19, Макрокоманды OS мет монопольного управления. Аналогично методу BISAM, дина- мическая буферизация здесь означает, что макрокоманда READ по желанию программиста может получить собственный буфер. Операнд RECFM может задаваться следующим образом: RECFM=F[T] RECFM=V REGFM=U Буква Т означает, что используется переполнение дорожки. Важную роль в методе BDAM играет операнд OPTCD, в кото- ром можно указать [WHE][F][R|A] Буквы означают: W — контроль правильности записи; Е — расширенный поиск; F — обратная связь; R — относительная адресация блоков; А — абсолютная адресация. В том случае, когда задан расширенный поиск, операнд LIMCT определяет число блоков или дорожек (в зависимости от того, задана или нет в операнде OPTCD буква R), по которым будет производиться поиск. Если величина, указанная в этом операнде, превышает объем набора данных, то поиск ведется по всему набо- ру. Если задано OPTCD = R, то число, задаваемое в LIMCT, относится к блокам; в противном случае оно указывает число дорожек, на которых ведется поиск. Для указания записи в BDAM задается одно из трех: MBBCCHHR — абсолютный адрес TTR — относительный адрес на дорожке NNN — относительный номер блока (только если RECFM=F) Когда пользуются абсолютными адресами, М означает номер экстента в томе, к которому осуществляется обращение. Иден- тификация BBCCHHR определяет бин (для магнитных карт), цилиндр, дорожку или головку и номер записи. Абсолютная адресация приводит к тому, что набор данных становится непере- мещаемым (DSORG = DAU). Относительный адрес на дорожке состоит из ТТ, относительного номера дорожки, и R, действи- тельного номера записи на дорожке. Для первой дорожки в наборе данных ТТ = 00. Следовательно, первая запись в наборе данных имеет адрес TTR = 001. Относительная адресация блоков раз- решается только для записей типа F; операнд NNN представляет
19.12. BDAM 745 собой номер блока внутри набора данных; наименьший номер блока, относительно которого ведется счет, равен ООО. В процессе чтения или записи программист должен указы- вать дорожку и запись на дорожке. Пользуясь абсолютной или относительной адресацией на дорожке, он может обеспечить два варианта поиска записи. Первый вариант заключается в том, что в случае абсолютной адресации он пользуется только левыми семью байтами адреса, а в случае относительной адресации на дорожке берет только левые два байта. Положение записи на дорожке не указывается, поэтому для поиска программист задает ключ. Второй вариант состоит в том, что поиск ведется без ключей, и следовательно, в этом случае программист должен задавать адрес с точностью до номера записи на дорожке. При использовании относительной адресации блоков поиск по ключу не ведется ни в каких случаях. Макрокоманда READ имеет формат R Е AD decb ,тип ,dcb, об л асть, длина, к люч ,бл ок Операнд decb определяет адрес DECB, операнд deb указывает адрес DCB, операнд область — адрес буфера, ключ — адрес поля, ключа (если имеется ключ), а блок — адрес поля с указателем блока. Блок событий с набором данных (DECB) содержит 24 байта и имеет следующую структуру: Байты 0—3 Блок событий 4—5 Тип 6—7 Длина 8—11 Адрес DCB 12—15 Адрес области 16—19 Адрес указателя блока 20—23 Адрес ключа Байты 1 и 2 в блоке событий содержат информацию об ошибках, если операция должным образом не завершилась. В этих байтах фиксируются следующие особые случаи: Байт 1 Бит 0 Нет блока в границах поиска Бит 1 Указанная длина не совпадает с длиной физиче- ской записи Бит 2 В границах поиска нет места, чтобы добавить блок (только для WRITE) Бит 3 В байте 2 есть ненулевые биты Бит 4 Непредусмотренная ошибка ввода — вывода
746 Гл. 19. Макрокоманды OS Бит 5 Конец файла EOF (длина данных = 0) Бит 6 Неисправимая ошибка Бит 7 Корректируемого блока нет в списке блоков, нахо- дящихся под монопольным управлением (только для WRITE с типом X) Байт 2 Бит 0 Не используется Бит 1 Макрокоманда WRITE; файл открыт с указанием INPUT Бит 2 Выдан запрос на расширенный поиск, а ЫМСТ=0 Бит 3 Указатель блока (адрес блока) не попадает в гра- ницы набора данных. Бит 4 Нарушение защиты при обращении к управляю- щей записи Ro учета места на дорожке (только для WRITE) Бит 5 (а) Задан ключ в то время, как в DGB указывается, что набор данных организован без ключей, (Ь) не задан адрес ключа Бит 6 Операнд типа в макрокоманде READ или WRITE противоречит содержимому полю DGBOPTCD Бит 7 Попытка добавить новый блок с ключом, начи- нающимся с шестнадцатеричного FF (RECFM=F, только для макрокоманды WRITE) В макрокоманде READ допустимы следующие значения опе- ранда тип: D{I|K}[F][X] где буква I означает, что адрес задан с точностью до блока; К — что адрес задан с точностью до дорожки и дальнейший поиск ведется по ключу; буква X означает монопольное управление и включает в себя F, a F означает обратную связь. Обратная связь вызывает запись в указатель блока (поле блок, заданное в макрокоманде READ) абсолютного или относительного адреса блока. Если в операнде тип записывается и F, и X, то это равно- сильно заданию одной буквы X. Если операнд область задается как 'S', то буфер выделяется динамически. Если операнд длина задан как 'S', то длина берется из поля DCBBLKSI. Если в макрокоманде задан тип К, то в операнде ключ указы- вается адрес поля того ключа, который будет использован при поиске нужной записи. Если же задан тип I, то ключ будет счи- тываться в это поле после того, как будет найдена запись. Когда задается тип I и область 'S', указание в операнде ключ символа 'S' приведет к тому, что ключ будет (Считываться в буфер и раз-
19.12. BDAM 747 мещаться непосредственно перед записью данных, а указание в операнде ключ при тех же условиях символа 0 приведет к подав- лению чтения ключа вообще. Если в поле DCBKEYLE стоит О, то поле это игнорируется, а указание типа К считается неверным. Операнд блок определяет или восьмибайтовое, или трехбайтовое поле (в восьмибайтовом поле берутся три левых байта), содержи- мое которого зависит от вида OPTCD: OPTCD Блок Обратная связь пробел TTR MBBCCHHR R NNN MBBCCHHR А MBBCCHHR MBBCCHHR F TTR TTR FR NNN NNN FA MBBCCHHR MBBCCHHR Обратная связь будет осуществляться только в том случае, когда в операнде тип макрокоманды READ записана буква F или X. Когда задано тип=К, читаются только данные, если типфК, поиск ведется только на указанной дорожке. Когда задан тип I, читаются и ключ, и данные. Область поиска всегда ограничивается указанной дорожкой. Макрокоманда WRITE имеет следующий формат: WRITE decb,тип,deb,область,длина,ключ,блок операнды этой макрокоманды почти полностью совпадают с опе- рандами макрокоманды READ. Небольшие различия заключаются в следующем: операнд тип может также принимать значения DA или DAF, указывающие на добавление нового блока. В операнде область можно указать 'S' только при условии, что и в соответ- ствующей макрокоманде READ было указано 'S': такое указание вызовет освобождение буфера после завершения операции записи. Задав 'S* в операнде длина, можно быть уверенным, что пол- ностью запишутся блоки максимального размера (берется длина из операнда BLKSIZE макрокоманды DCB). Длина 0 определяет запись конца файла (EOF) и считается верной только для типа DA или DAF. Если в макрокоманде READ в операнде ключ было задано 'S', то здесь можно задать то же самое для того, чтобы вызвать последующее освобождение буфера. Если задается тип=К, то ключ не записывается. Если задается тип I, то ключ не записывается при условии, что в операнде ключ стоит 0, а в про- тивном случае ключ записывается. Если задано тип=Х, то монопольное управление снимается, как только будет произведена запись. При указании X или F, когда задан тип I, подразумевается, что в операнде блок? стоит адрес поля основной памяти, в котором находится адрес, полу- ченный посредством обратной связи при выполнении предыдущей
748 Гл. 19. Макрокоманды OS макрокоманды READ. Когда задан тип К, обеспечить обратную связь можно, указав букву F. В отличие от макрокоманды READ указание буквы X обратной связи не вызывает (X снимает моно- польное управление). Обратите внимание, что если при добавле- нии новых записей используется расширенный поиск, то запись может попасть на дорожку, отличную от указываемой в макро- команде. Поле, задаваемое операндом блок, представляет собой то же самое, что и используемое в READ. Макрокоманда RELEX D,deb,блок RELEX О,(1),блок RELEX D,dcb,(0) RELEX D,(l),(0) снимает монопольное управление над введенной посредством READ записью. Запись остается в буфере, который не освобож- дается. Заметьте, что операнды deb и блок должны быть теми же, что и в соответствующей макрокоманде READ, указывающей на установку монопольного управления. Макрокоманда FREEDBUF FREEDBUF FREEDBUF FREEDBUF decb,D,deb (O),D,dcb decb,D,(l) (O),D,(1) освобождает динамический буфер, т. е. буфер, который был полу- чен автоматически при выполнении макрокоманды READ, в опе- ранде область которой стоял символ 'S'. Заметьте, что буфер можно освободить, либо задав макрокоманду FREEDBUF, либо указав в макрокоманде WRITE в операнде область символ 'S'. Макрокоманды GETBUF и FREEBUF наряду с GETPOOL, FREEPOOL и BUILD употребляются в BDAM точно так же, как и в других методах доступа. Макрокоманда CLOSE в BDAM употребляется с единственным ограничением: запрещается указывать TYPE==T. Обычно для создания наборов данных, которые впоследствии будут обрабатываться с использованием BDAM, берется базис- ный последовательный метод доступа (BSAM). Упражнения № 51 1. Переделать упр. 47.5, используя QSAM для записи на ленту. 2. Переделать упр. 47.5, используя BSAM для записи на ленту. 3. Изменить упр. 2 таким образом, чтобы вместо ленты рабо- тать с диском.
19.13» Макрокоманды супервизора 749 4. Изменить упр. 2 таким образом, чтобы файл поместить в индексно-последовательный набор данных, а потом соответ- ствующим образом откорректировать записи. 5. Переделать упр. 48.1, используя QSAM для записи на ленту. 6. Сделайте упр. 48.2. 7. Переделать упр. 48.5, используя BSAM для создания файла на диске. 8. Переделать упр. 48.6, используя BDAM для обращения к записям. 9. Сделать упр. 48.7, используя BISAM. 10. Написать на фортране программу создания файла, описан- ного в упр. 7, а затем сделать упр. 48.6, составив на языке Ассем- блера программу чтения записей, в которой используется BDAM. (Предупреждение: диск, прежде чем его будет использовать программа на Фортране, должен быть «размечен» с помощью си- стемной обслуживающей программы.) 19.13. Макрокоманды супервизора В этом разделе мы рассмотрим ряд служебных макрокоманд, не затрагивающих межпрограммных связей. При выполнении макрокоманды GETPOOL программе выде- ляется область памяти и в ней организуется буферный пул. Есть еще путь получения области памяти. Когда программисту потре- буется какая-то область, он может запросить ее, выдав макро- команду GETM AIN R,LV= длина GETMAIN R,LV=(0) Длина этой области в байтах задается во втором операнде. Длину можно предварительно поместить в регистр 0, и тогда во втором операнде указать (0). Длина всегда округляется в сторону увели- чения до величины, кратной 8. После выполнения макрокоманды адрес полученной области передается программе в регистре 1. Если окажется, что область памяти необходимого объема не может быть предоставлена, задача будет аварийно закончена. Вернуть освободившуюся область памяти супервизору можно с помощью макрокоманды FREEMAIN R,LV=длина, А—адрес FREEMAIN В,ЬУ=длина,А=(1) FREEMAIN R,LV=(0),A—адрес FREEMAIN R,LV=(0),A=(l) Второй операнд здесь определяет длину области, а третий — адрес области. Если в третьем операнде записано А=(1), то в регистре 1 уже должен находиться адрес области.
750 Гл. 19. Макрокоманды OS Макрокоманда SPIE адрес,(х,(у,z),...) впределяет адрес, по которому будет передаваться управление о случае, когда возникнет программное прерывание с кодом прерывания х или с кодом прерывания, лежащим в интервале от у до z включительно. В поле операнда этой макрокоманды можно указывать сколько угодно значений х, у и z. Следовательноt макрокоманда SPIE ARS,((1,3),6,(8,11),4) вызовет передачу управления некоторой программе по адресу ARS в случае прерывания с кодом 1, 2, 3, 4, 6, 8, 9, 10 или 11. Отменить все предыдущие указания относительно передачи управления по прерыванию можно с помощью макрокоманды SPIE без операндов. Действие ее продолжается до тех пор, пока не будет задана какая-нибудь другая SPIE. Если в этой макрокоманде указаны коды прерывания 8, 10, 13 или 14, то биты маски программы в PSW изменяются таким образом, чтобы соот- ветствующие прерывания были разрешены. Для всех остальных прерываний биты маски программы устанавливаются равными 0. При выполнении каждой макрокоманды SPIE создается 32-байтовая область. Байт 0 этой области используется супер- визором. Байты 1—3 содержат адрес области управления про- граммными прерываниями (PICA — Program Interrupt Control Area) для макрокоманды SPIE. Байты 4—11 содержат старое PSW. Байты 12—31 используются для сохранения регистров по команде STM 14,2. Первая макрокоманда SPIE передает в регистре 1 величину 0, а каждая последующая будет передавать в регистре 1 адрес PICA для последней перед этим выданной макрокоманды SPIE. Такая организация работы позволяет стандартной программе контроля ошибок выдавать свои SPIE, а потом при возврате восстановить ситуацию. PICA — это шестибайтовая область. Байт 0 этой области содержит шестнадцатеричный 0 и маску программы. Байты 1—3 содержат адрес программы выхода. Байты 4—5 содержат маску прерываний. Макрокоманда ABEND значение,DUMP ABEND (1),DUMP вызывает аварийное прекращение шага задания. Заданное значение рассматривается как код завершения. Значение этого кода должно быть кратно 4 и не превышать 4096. Код может проверяться
19,13. Макрокоманды супервизора 751 в карте ЕХЕС для последующего шага задания. Если второй операнд этой макрокоманды опущен, то прекращение шага зада- ния не вызывает дампинга памяти. Если же в поле второго опе- ранда стоит DUMP, то содержимое памяти выводится на устрой- ство, указанное картой DD с именем, равным SYSABEND. Для вывода на печать в этой карте должно быть указано SYSOUT=A. Макрокоманда WTO 'сообщение' вызывает печать указанного в поле операнда сообщения на пишу- щую машинку пульта. Длина сообщения ограничивается длиной строки машинки. Макрокоманда WTOR 'сообщение',адрес, длина ,ecb вызывает, как и предыдущая макрокоманда, выдачу сообщения оператору за пультом, но кроме этого оператор получает возмож- ность ввести ответ на сообщение по адресу, заданному вторым операндом. Длина ответа должна равняться величине, указанной в поле третьего операнда. Последний операнд представляет собой адрес блока событий (ЕСВ), который имеет длину в полное слово. Программист, перед тем как выдавать эту макрокоманду, должен сбросить бит 1 (бит завершения). При выполнении макрокоманды (по окончании ввода ответа оператора) этот бит будет возбужден. Макрокоманда WAIT ЕСВ=адрес WAIT ЕСВ=(1) переводит CPU в состояние ожидания до тех пор, пока не будет закончена операция, связанная с указанным в поле операнда блоком событий. Макрокоманда POST есЬ,код POST (1),код POST ecb,(0) POST (1),(0) делает в указанном ЕСВ отметку о том, что событие произошло, независимо от того, произошло оно фактически или нет. Заданный код засылается в ЕСВ. Длина кода не должна превышать 30 битов. Время дня можно опросить макрокомандой TIME единица
752 Гл. 19. Макрокоманды OS Операнд единица указывает, в каких единицах должно выдаваться время. Его значением может быть DEC, BIN или TU. Если задает- ся операнд DEC, то в регистр 0 передается время HHMMSSth в часах, минутах, секундах и сотых долях секунды. Считается, что часы имеют цикл 24 часа. Число передается в регистр 0 в упа- кованном десятичном формате. Если задается операнд BIN, то в регистр 0 передается время в сотых долях секунды. Если задается операнд TU, то время передается в единицах таймера: одна единица таймера равна приблизительно 26 микросекундам. Во всех случаях в регистр 1 передается дата в упакованном фор- мате в виде 00YYDDDF, где самой правой цифрой будет всегда шестнадцатеричное F. Прерывание по истечению указанного времени можно вызвать, записав макрокоманду STIMER RE AL[,адрес],интервал STIMER WAIT,интервал Если задается операнд WAIT, то CPU переводится в состояние ожидания до тех пор, пока не произойдет прерывание. Если задается операнд REAL, то CPU продолжает работать, а при прерывании производится переход по адресу, указанному в поле операнда. Если указание адреса отсутствует, то после прерывания программа продолжает работу. В качестве операнда интервал можно взять: DINTVL = адрес, где адрес указывает двойное слово, содер- жащее HHMMSSth как распакованное десятичное число; BINTVL = адрес, где адрес указывает на слово, содержащее интервал времени в сотых долях секунды; TUINTVL = адрес, где адрес указывает на слово, содержащее интервал времени в единицах таймера; TOD = адрес, где адрес определяет двойное слово, содержа- щее HHMMSSth, время дня, которое будет считаться концом интервала. При обращении к программе для обработки прерывания по таймеру регистры 2—12 не изменяются; регистр 13 содержит адрес области сохранения, обеспеченной супервизором; регистр 14 содержит адрес возврата (для возврата к супервизору), а регистр 15 содержит адрес программы для обработки прерывания (для возможного использования в качестве регистра базы). Программа обработки прерывания должна заканчиваться переходом по адре- су в регистре 14 для того, чтобы впоследствии можно было вер- нуться в прерванную программу: Макрокоманда TTIMER [CANCEL]
19.14. Простейшие межпрограммные связи 753 выдает в регистр 0 время, оставшееся от интервала, указанного в макрокоманде STIMER. Время выдается всегда в единицах таймера. Если в поле операнда записано CANCEL, то величина времени, остающегося еще от интервала, сокращается до 0. Если же к моменту выполнения макрокоманды интервал времени уже истек, то в регистр 0 передается 0, а операнд CANCEL не играет никакой роли. 19.14. Простейшие межпрограммные связи Когда программа состоит из нескольких сегментов, естественно возникает необходимость в передаче управления от одного сег- мента к другому. Простейшим путем передачи управления являет- ся макрокоманда CALL имя-точки-входа[,(параметр^ . . ., параметрп) [,VL]] [,ID = ав] Первый операнд макрокоманды определяет внешнее имя, кото- рому будет передаваться управление. При желании в качестве первого операнда можно написать (15), но для этого программист предварительно должен в регистр 15 поместить адрес точки входа. Если в вызываемую программу необходимо передать какие-то параметры, то адреса этих параметров, разделенные запятыми, заключаются в круглые скобки и записываются в качестве вто- рого операнда. Макрокоманда образует список адресов парамет- ров и помещает адрес списка в регистр 1. Если имеется третий операнд VL, то в бите знака последнего адреса в списке адресов указывается знак минус. Этим средством нужно пользоваться, когда число аргументов является величиной переменной, для того, чтобы легко обнаружить конец списка. Если в поле опе- ранда записано ID = ав, то после всех команд и констант, порож- денных макрокомандой GALL, генерируется команда NOP, кото- рая в последних двух байтах содержит значение абсолютного выражения (ав) в виде двоичного полуслова. В OS для макрокоманды CALL порождаются те же самые команды, что и в DOS.: CNOP 2,4 метка L 15=, V (имя-точки-входа) LA 14,*4-64-4*n BALR 1,15 DC А (параметр!, . . параметр^ DC XL4'4700eeee' В последней команде ееее представляет значение абсолютного выражения, указанного в операнде ID = ав. Если этого опе- ранда нет, то команда NOP не генерируется. Заметьте, что для 48 Зак. 15635
764 Гл* 19' Макрокоманды OS передачи управления из вызываемой программы предусматри- вается адрес возврата, равный адресу команды NOP (*+6+4*п). В DOS вызываемая программа должна находиться в памяти. В OS, как правило, она тоже располагается в памяти, но в тех случаях, когда программы в памяти нет, управляющая программа отыскивает ее в одной из библиотек OS и загружает в память. Если происходит обращение к программе, по окончании работы которой необходимо вернуться в вызывающую программу, то обычно возникает необходимость в сохранении содержимого регистров. Для этой цели пользуются макрокомандой SAVE: SAVE (Г1,г2) [,Т] SAVE (Г1) [,Т] Если г2 опущено, то предполагается, что ft = г2. Область сохра- нения полностью идентична описанной в разд. 18.7 области сохранения. Макрорасширение SAVE в OS почти совпадает с макрорасширением для SAVE в DOS. Имеется лишь одно исклю- чение, которое касается операнда Т. Если в поле операнда запи- сано Т, а Г1 = 14, 15, 0, 1 или 2, то сохраняется содержимое всех регистров от 14 до г2. Если записано Т, a rj > г2, то регистры 14 и 15 сохраняются посредством дополнительной команды. Если г2 не записан, то сохраняются лишь регистры 14, 15 и rt. Для восстановления регистров и выхода из вызываемой про- граммы используется макрокоманда RETURN [(rj ,г2])] [ ,Т1 [ ,RG=as] RETURN [(r1[,ral)][,Tn,RC=(15)l Выполнение этой макрокоманды вызывает восстановление регист- ров от Г1 до г2 из области сохранения, адрес которой хранится в регистре 13. Если в поле операнда указано Т, то после того, как все регистры восстановлены, самый левый байт четвертого слова в области сохранения (в этом слове хранится содержимое регистра 14) заполняется единицами, что означает, что возврат осуществлен. Если в поле операнда указано RG, то после того, как все регистры восстановлены, значение абсолютного выраже- ния ав, которое не должно превышать 4096, помещается в ре- гистр 15. Это значение является кодом возврата, который может проверяться оператором ЕХЕС, если RETURN вызывает выход из шага задания. Макрокоманда RETURN восстанавливает регистры и передает управление по адресу в регистре 14. В OS в отличие от DOS мак- рокоманда RETURN, во-первых, может передать в регистр 15 код возврата и, во-вторых, используется в конце задания для передачи управления супервизору. Если RETURN выдается основной программой, то управление переходит к программе управления
19.15. Динамические связи программ 755 заданием, которая сравнивает код возврата с параметром кода условия в соответствующей карте JOB или ЕХЕС. Макрокоманда RETURN используется также для организации выхода из программ обработки прерываний. Вообще-то говоря, программист может и не пользоваться макрокомандами CALL, SAVE и RETURN, поскольку в расши- рение этих макрокоманд не входит ни одной привилегированной команды. Однако гораздо проще запомнить эти макрокоманды и пользоваться ими, чем каждый раз писать в программах экви- валентную им последовательность команд. Обсуждение рекурсивных программ разд. 18.18 можно отнести также и к OS, учитывая единственно, что вместо DTF в OS исполь- зуются макрокоманды DCB. Все, что в разд. 18.19 говорилось о макроязыке, в равной мере относится и к OS. 19.15. Динамические связи программ Макрокоманда LOAD ЕР=имя LOAD EPLOC=адрес LOAD EPLOC=(0) используется для загрузки программного сегмента в память. Операнд ЕР определяет имя точки входа в сегмент. Если в каче- стве операнда взято EPLOC, то указывается адрес двойного слова, содержащего символическое имя точки входа. Макрокоманда LOAD помещает определенный программный сегмент в память и помещает адрес точки входа в регистр 0. Если понадобится передать управление указанному сегменту, то запи- сывается команда LR 15, 0, а следом за ней — макрокоманда GALL. С того момента, как макрокоманда LOAD загрузила в память какой-то модуль (сегмент), этот модуль остается в памяти либо до конца шага задания, либо до тех пор, пока не будет задана макрокоманда DELETE ЕР=имя DELETE ЕРЕОС=адрес DELETE EPLOC=(0) Эта макрокоманда передает в супервизор информацию о том, что держать указанный модуль в памяти больше необходимости нет. Макрокоманда передает в регистр 15 величину, характери- зующую результат работы: 0000 0000 модуль в памяти затерт 0000 0004 модуль в памяти не обнаружен 48*
756 Гл. 19. Макрокоманды OS Для того чтобы считать модуль и сразу же передать ему управ- ление, используется макрокоманда LINK операнд^операндз^перандз В поле первого операнда записывается ЕР=имя или EPLOC=адрес Назначение этого операнда то же самое, что и в макрокоманде LOAD. Второй операнд необязателен. Он имеет форму PARAM = (параметр^ . . ., параметр^ [,VL == 1] Этот операнд определяет символические адреса параметров, кото- рые должны быть переданы в вызываемую программу. Если имеется запись VL = 1, то знаковый бит последнего адреса устанавливается равным 1. Для каждого параметра вырабаты- вается адресная константа аналогично оператору GALL и адрес полученного списка адресов помещается в регистр 1. Если нет ни одного параметра, который необходимо передать, то содержи- мое регистра 1 непредсказуемо. Третий операнд также необязателен. Он имеет вид ID = ав, где ав — абсолютное выражение, значение которого будет зани- мать полуслово. Если этот операнд задан, то так же, как и в мак- рокоманде CALL, это вызовет выработку команды NOP. Как легко заметить, макрокоманда LINK объединяет в себе макрокоманды LOAD и CALL, относящиеся к одному и тому же модулю. В OS имеется еще несколько макрокоманд, служащих вспомо- гательным средством для установления связей между отдельными программными модулями. Все они имеют тот же самый общий характер, как и макрокоманды CALL, LINK и LOAD, отличаясь от них использованием некоторых дополнительных средств OS, например таких, как мультипрограммирование. Во всех макрокомандах связи используются регистры 0, 1, 14 и 15, и все они изменяют значение кода условия. Макрокоманда SAVE использует еще и регистр 13, который содержит адрес текущей области сохранения. Большая программа обычно разбивается на много сегментов, один из которых (небольшой по объему) находится в памяти на протяжении всего времени работы программы. Этот сегмент называется корневым (ROOT). Все другие сегменты вызываются в память по мере надобности.
19Л5Л Динамические связи программ 757 Упражнения^ 52 1. Переделать упр. 49.2 применительно к OS. 2. Переделать упр. 49.3 применительно к OS. 3. Изменить упр. 2, установив интервал времени, например 1 минуту, и подсчитав, сколько раз в течение этого периода вре- мени будет выполнен цикл. 4. Сделайте упр. 49.7, используя Фортран, но программируя ввод — вывод для OS. 5. Сделать упр. 4, используя PL/1, но программируя ввод — вывод для OS. 6. Напишите на языке Ассемблера подпрограмму получения текущей даты, учитывая, что эта подпрограмма будет вызываться основной программой, написанной на Коболе и имеющей один параметр. В этот параметр ваша подпрограмма должна помещать дату в форме YYDDD. В программе на Коболе то поле, в которое помещается дата, называется PICTURE 9(5) COMPUTATIONAL-3. 7. Изменить упр. 6 таким образом, чтобы дату в форме MMDDYY поместить в поле PICTURE 9(6) DISPLAY.
Приложение А КОДЫ ТАБЛИЦА КОДОВ ASCII-8 Вторая шестнадцатеричная цифра Первая шестнадцатеричная цифрА 0 1 2 3 4 5 6 7 8 9 A В c D E F 0 NUL DLE SP 0 @ P P 1 SOH DC1 ! 1 A Q a q 2 STX DC2 я 2 В R b г 3 ЕТХ DC3 # 3 c S c s 4 EOT DC4 $ 4 D T d t 5 ENQ NAK % 5 E и e u . 6 АСК SYN & 6 F V f V 7 BEL ETB 7 G w g w 8 BS CAN ( 8 H X h X 9 НТ EM ) 9 I Y i У А LF SS * • J Z j z В VT ESC + » К [ к { С FF FS L \ 1 1 1 D CR GS — = M ] m } Е SO RS > N n F SI US / ? 0 — 0 DEL
NUL Пусто 1) Null LF Перевод строки Line feed DC4 Останов устройст- ва ESC Авторегистр 2 Escape SOH Начало заголовка VT Вертикальная та- Device stop FS Разделитель файла &tart oi neaaing буляция NAK Отрицание File separator STX Начало текста Vertical tabulati- Negative acknow- Start of text on ledge GS Разделитель груп- ЕТХ Конец текста FF Перевод формата SYN Синхронизация пы Group separator ль no oi text Form feed Synchronous idle EOT Конец передачи RS Разделитель запи- End of transmissi- CR Возврат каретки ETB Конец блока си on Carrier return End of transmissi- Record separator on block ENQ Кто там? SO Национальный ре- US Разделитель эле- Enquiry гистр CAN Аннулирование мента записи АСК Подтверждение Shift out Cancel Unit separator Acknowledge SI Латинский ре- EM Конец носителя SP Пропуск BEL Звонок гистр End of medium Space Audible signal Shift in BS Возврат на шаг SS Начало специаль- DEL Вычеркивание/ BacksnacA DLE Авторегистр 1 ной последователь- ожидание Data link escape ности Delete/Idle НТ Горизонтальная Start of special se- табуляция DC 1—3 Управление уст- quence Horizontal tabula- ройством tion Device control 1) Русские названия служебных символов взяты в соответствии с ГОСТ 13052—67. — Прим, перее. Приложение А, Коды
НАБОРЫ СИМВОЛОВ Символы Клавишный перфоратор Печатающее устройство 1443 Печатающее устройство 1403 Клавишное пе- чатное устрой- ство 1052 13 39 52 63 AN HN PN от 0 до 9 и. X X X X X X X X X от А до Z $ , X X X X X X X X от а до z X ♦ X X X X X X X X + / & X X X X X X X = ' ( ) X X X X X X # @ % X X X X X X П 1 ? X X X X 1 с X X X и X X пробел 0-8-2 X X Приложение А. Коды, Замечания: 1. В набор QN на 1403 входят те же символы, что и в набор PN. 2. При наличии на 1403 набора AN вместо печатается вместо = печатается @, вместо (печатается %, а вместо) печата- ется П. 3. При наличии на 1403 набора HN вместо # печатается ', вместо @ печатается =, вместо % печатается (, а вместо □ печа- тается ) 4. Символы 0-8-2 на этих устройствах не печатаются, просто оставляется пробел. 5. Возможна замена символа ! на [, а символа £ на]. 6. Символ П соответствует коду перфокарты 12-8-4 или в коде EBCDIC шестнадцатеричному 4С»
Приложение А. Коды 761 ШЕСТНАДЦАТЕРИЧНЫЕ КОДЫ Цифра 0 1 2 3 Двоичное В позиции знака представление трактуется как 0000 0001 0010 ООН 4 5 6 7 0100 0101 ОНО 0111 8 9 А В 1000 1001 1010 + 1011 — С D Е F 1100 + 1101 — 1110 + 1111 + В расширенном двоично-кодированном десятичном коде (EBCDIC) для знака плюс используется код С, для знака минус — код D, а в каче- стве зонной цифры берется F. В коде ASCI 1-8 (американском стандартном коде для обмена информа- цией, расширенном до 8 битов) для знака плюс используется код А, для знака минус — код В, а в качестве зонной цифры берется код 5.
762 Приложение А. Коды ТАБЛИЦА КОДОВ EBCDIC Первая ирирра (шестм)
Приложение А. Коды 763 Пояснения к таблице кодов EBCDIC • BS Возврат на шаг Backspace BYP Блокировка (обход) Bypass DEL Вычеркивание Delete DS Выбор цифры Digit select ЕОВ Конец блока End of block EOT Конец передачи End of transmission PS Разделитель поля Field separator НТ Горизонтальная табуляция Horisontal tab IL Ожидание Idle LC Строчная буква Lower case LF Перевод строки Line feed NL Новая строка New line NUL Пусто Null PF Выключение перфоратора Punch off PN Включение перфоратора Punch on PRE Префикс Prefix RES Восстановление Restore RS Останов устройства чтения Reader stop SM Установление режима Set mode SOS Начало значимости Start of significance SP Пропуск Space ТМ Маркер ленты Tape mark UC Прописная буква Upper case (?) 12-0-1-8-9 ® 12-11-1-8-9 ® 11-0-1-8-9 ® 12-11-0-1-8-9 ©Нет пробивок • ©12 ® 11 © 12-11-0 ©12-0 @ 11-0 ® 0-2-8 ® 0 @ 0-1 ® 11-0-1-9 ® 12-11
Приложение В НАБОР КОМАНД Сред- Код опера- ции Мне- мони- ка Название команды Значе- ния СС Особые случаи ства 1 2 3 4s 4f 5 6 7 8 9 A В C D E F 0 RR 04 SPM He определенные коды опера- ций Undefined OP codes Установить маску программы Set Program Mask 0123 S S S 0 RR 05 BALR Переход с возвратом Branch and Link 0 RR 06 BCTR Переход по счетчику Branch on Count 0 RR 07 BCR Условный переход Branch on Condition 1 RR 08 SSK Установить ключ памяти Set Storage Key S S S s 1 RR 09 ISK Прочитать ключ памяти Insert Storage Key S S S s 0 RR 0А SVC Обращение к супервизору Supervisor Call 4 RR 0D BASR Переход с записью в память Branch and Store 0 RR 10 LPR Загрузка положительная Load Positive 023 c
0 RR 11 LNR Загрузка отрицательная Load Negative 0 RR 12 LTR Загрузка и проверка Load and Test 0 RR 13 LGR Загрузка дополнения Load Complement 0 RR 14 NR И And 0 RR 15 CLR Сравнение кодов Compare Logical 0 RR 16 OR ИЛИ Or 0 RR 17 XR Исключающее ИЛИ Exclusive Or 0 RR 18 LR Загрузка Load 0 RR 19 OR Сравнение Compare 0 RR 1A AR Сложение Add 0 RR IB SR Вычитание Subtract 0 RR 1G MR Умножение Multiply 0 RR ID DR Деление Divide 0 RR IE ALR Сложение кодов Add Logical 0 RR IF SLR Вычитание кодов Subtract Logical
01 012 0123 01 012 01 01 012 0123 0123 0123 123 С с с Приложение В. Набор команд s s
С] с ред- :тва Код опера- ции Мне- мони- ка Название команды Значе- ния СС 3 RR 20 LPDR Загрузка положительная (длинная) Load Positive Long 02 3 RR 21 LNDR Загрузка отрицательная (длинная) Load Negative Long 01 3 RR 22 LTDR Загрузка и проверка (длинная) Load and Test Long 012 3 RR 23 LCDR Загрузка дополнения (длинная) Load Complement Long 012 3 RR 24 HDR Пополам (длинное) Halve Long 3 RR 28 LDR Загрузка (длинная) Load Long 3 RR 29 CDR Сравнение (длинное) Compare Long 012 3 RR 2А ADR Сложение с нормализацией (длинное) Add Normalized Long 0123 3 RR 2В SDR Вычитание с нормализацией (длинное) Subtract Normalized Long 0123
Особые случаи 1 2 3 4s 4f 5 6 7 8 9 A В C D E F S s S s £ S s i к § S s to • Й5 S s ft S s S s S s c c c S s c c c
3 RR 2C MDR Умножение (длинное) Multiply Long 3 RR 2D DDR Деление (длинное) Divide Long 3 RR 2Б AWR Сложение без нормализации (длинное) Add Unnormalized Long 0123 3 RR 2F SWR Вычитание без нормализации (длинное) Subtract Unnormalized Long 0123 3 RR 30 LPER Загрузка положительная (короткая) Load Positive Short 02 3 RR 31 LNER Загрузка отрицательная (короткая) Load Negative Short 01 3 RR 32 LTER Загрузка и проверка (корот- кая) Load and Test Short 012 3 RR 33 LCER Загрузка дополнения (корот- кая) Load Complement Short 012 3 RR 34 HER Пополам (короткая) Halve Short 3 RR 38 LER Загрузка (короткая) Load Short 3 RR 39 CER Сравнение (короткое) Compare Short 012 3 RR ЗА AER Сложение с нормализацией (короткое) 0123 Short
s s s s s s s s s s s s s s s s s s s s s s s s T c T c s T c T c T c c Приложение В. Набор команд 767
Сред- ства Код опера- ции Мне- мони- ка Название команды Значе- ния СС 3 RR ЗВ SER Вычитание с нормализацией (короткое) Subtract Normalized Short 0123 3 RR ЗС MER Умножение (короткое) Multiply Short 3 RR 3D DER Деление (короткое) Divide Short 3 RR ЗЕ AUR Сложение без нормализации (короткое) Add Unnormalized Short 0123 3 RR 3F SUR Вычитание без нормализации (короткое) Subtract Unnormalized Short 0123 7 RR 25 LRDR Загрузка с округлением (длинная) Load Rounded Long 7 RR 26 MXR Умножение сверхдлинное *) Multiply Extended 7 RR 27 MXDR Умножение длинных со сверх- длинным результатом Multiply to Extend 7 RR 35 LRER Загрузка с округлением (короткая) Load Rounded Short 7 RR 36 AXR Сложение с нормализацией сверхдлинное Ada Normalized Extended 012 L
Особые случаи 1 2 3 4s 4f 5 6 7 8 9 A В C D E F S S TCC S S T c S S T c s S S T G S s T c S s c c c S s c c c S s c c c S s c c c S s G С C Приложение В. Набор команд
49 Зак. 7 RR 37 SXR Вычитание с нормализацией сверхдлинное Subtract Normalized Extended 7 RX 67 MXD Умножение длинных co сверх- длинным результатом Multiply to Extend 0 RX 40 STH Запись в память полуслова Store Halfword 0 RX 41 LA Загрузка адреса Load Address 0 RX 42 STC Запись в память символа Store Character 0 RX 43 IC Прочитать символ Insert Character 0 RX 44 EX Выполнить Execute 0 RX 45 BAL Переход с возвратом Branch and Link 0 RX 46 BCT Переход по счетчику Branch on Count 0 RX 47 BC Условный переход Branch on Condition 0 RX 48 LH Загрузка полуслова Load Halfword 0 RX 49 CH Сравнение полуслова Compare Halfword 0 RX 4A AH Сложение полуслова Add Halfword 0 RX 4B SH Вычитание полуслова Subtract Halfword 012 012 0123 0123
6 S S с с с S т т S с с с S S S S S т т S S S S т т S т т S т т S с т т S с co Приложение В. Набор команд
Сред- ства Код опера- ции Мне- мони- ка Название команды Значе- ния СС 0 RX 4C MH Умножение полуслова Multiply Halfword 4 RX 4D BAS Переход с записью в память Branch and Store 0 RX 4E CVD Преобразование в десятичную Convert to Decimal 0 RX 4F CVB Преобразование в двоичную Convert to Binary 0 RX 50 ST Запись в память Store 0 RX 54 N И And 01 0 RX 55 CL Сравнение кодов Compare Logical 012 0 RX 56 0 ИЛИ Or 01 0 RX 57 X Исключающее ИЛИ Exclusive Or 01 0 RX 58 L Загрузка Load 0 RX 59 C Сравнение Compare 012 0 RX 5A A Сложение Add 0123 0 RX 5B S Вычитание Subtract 0123
Особые случаи 1 2 3 4е 4f 5 6 7 8 9 А В CDEF т т S S т т S S т т т т т т т т т т т т т т т т S S S т S S 8 S S S S S с S с с Приложение В. Набор
0 RX 5C M Умножение Multiply 0 RX 5D D Деление Divide 0 RX 5E AL Сложение кодов 0123 Add Logical 0 RX 5F SL Вычитание кодов 123 Subtract Logical 3 RX 60 STD Запись в память (длинная) Store Long 3 RX 68 LD Загрузка (длинная) Load Long 3 RX 69 CD Сравнение (длинное) 012 Compare Long 3 RX 6A AD Сложение (длинное) 0123 Add Long 3 RX 6B SD Вычитание (длинное) 0123 Subtract Long 3 RX 6C MD Умножение (длинное) Multiply Long 3 RX 6D DD Деление (длинное) Divide Long 3 RX 6E AW Сложение без нормализации 0123 (длинное) Add Unnormalized Long 3 RX 6F sw Вычитание без нормализации 0123 (длинное) Subtract Unnormalized Long
т т S т т S S т т S т т S * S S S S S т т S S т т S S т т S тсс S т т S тсс S т т S т с S т т S ТС S S т т S т с S т т S т с Приложение В. Набор команд
с рея- ива Код опера- ции Мне- мони- ка Название команды Значе- ния CC 3 RX 70 STE Запись в память (короткая) Store Short 3 RX 78 LE Загрузка (короткая) Load Short 3 RX 79 СЕ Сравнение (короткое) Compare Short 012 3 RX 7А АЕ Сложение с нормализацией (короткое) Ada Normalized Short 0123 3 RX 7В SE Вычитание с нормализацией (короткое) Subtract Normalized Short 0123 3 RX 7С МБ Умножение (короткое) Multiply Short 3 RX 7D DE Деление (короткое) Divide Short 3 RX 7Е AU Сложение без нормализации (короткое) Ada Unnormalized Short 0123 3 RX 7F SU Вычитание без нормализации (короткое) Subtract Unnormalized Short 0123 0 SI 80 SSM Установить маску системы Set System Mask 5 SI 81 SPSW Установить PSW Set Program Status Word 0123
Особые случав 12 3 4l U S 6 7 8 9 А В CD Е F S S S S S т т S S т т S S т т S тсс S т т S тсс S т т S т с S т т S ТС S S т т S т с S т т S т с. S Т т Приложение В. Набор команд
0 SI 82 LPSW Загрузка PSW Load Program Status Word 0123 0 SI 83 Диагностика Diagnose 0123 6 SI 84 WRD Прямая запись Write Direct S 6 SI 85 RDD Прямое чтение Read Direct S 0 RS 86 • BXH Переход по индексу больше Branch on Index High 0 RS 87 BXLE Переход по индексу меньше или равно Branch on Index Low or Equal 0 RS 88 SRL Сдвиг вправо кода Shift Right Single Logical 0 RS 89 SLL Сдвиг влево кода Shift Left Single Logical 0 RS 8A SRA Сдвиг вправо арифметический Shift Right Single Arithmetic 012 0 RS 8B SLA Сдвиг влево арифметический Shift Left Single Arithmetic 0123 0 RS 8C SRDL Сдвиг вправо двойной кода Shift Right Double Logical 0 RS 8D SLDL Сдвиг влево двойной кода Shift Left Double Logical 0 RS 8E SRDA Сдвиг вправо двойной ариф- метический Shift Right Double Arithmetic 012 0 RS 8F SLDA Сдвиг влево двойной ариф- метический Shift Left Double Arithmetic 0123
s s s s T T ? ? s T T T T s s s s s s c Приложение В. Набор команд______773
Сред- ства Код опера- ции Мне- мони- ка Название команды Значе- ния СС 0 RS 90 STM Запись в память групповая Store Multiple 0 SI 91 ТМ Проверить по маске Test under Mask 013 0 SI 92 MVI Пересылка непосредственная Move Immediate 0 SI 93 TS Проверить и установить Test and Set 01 0 SI 94 NI И непосредственное And Immediate 01 0 SI 95 CLI Сравнение непосредственное Compare Logical Immediate 012 0 SI 96 01 ИЛИ непосредственное Or Immediate 01 0 SI 97 . XI Исключающее ИЛИ непоср. Exclusive OR Immediate 01 0 RS 98 LM Загрузка групповая Load Multiple 5 SI 99 HPR Остановить и продолжить Halt and Proceed 5 SI 9A TIOB Остановить ввод — вывод и перейти Test I/O and Branch 5 SI 9B CIO Управление вводом — выводом 013
Приложение В. Набор команд
0 SI 9C SIO Начать ввод — вывод Start I/O 0123 0 SI 9D TIO Опросить ввод —. вывод Test I/O 0123 0 SI 9E HIO Остановить ввод — вывод Halt I/O 0123 0 SI 9F TCH Опросить канал Test Channel 0123 4 RS BO STMC Запись в память групповая ре- гистров управления Store Multiple Control 4 RX Bl LRA Загрузка действительного адреса Load Real Address 4 RS B8 LMC Загрузка групповая регистров управления Load Multiple Control 5 SS DO XIO Передача ввода—вывода Transfer I/O 013 0 SS DI MVN Пересылка цифр Move Numerics 0 SS D2 MVC Пересылка символов Move Characters 0 SS D3 MVZ Пересылка зон Move Zones 0 SS D4 NC И And 01 0 SS D5 CLC Сравнение кодов Compare Logical 012
S S S S S S т т т т т т т т т т т т т т т т т т S S S Приложение В. Набор команд______775
Сред- ства Код опера- ции Мне- мони- ка Название команды Значе- ния CC 0 SS D6 ОС ИЛИ Or 01 0 SS D7 XC Исключающее ИЛИ Exclusive Or 01 0 SS DC TR Перекодировать Translate 0 ss DD TRT Перекодировать и проверить Translate and Test 012 2 SS DE ED Отредактировать Edit 012 2 SS DF EDMK Отредактировать и отметить Edit and Mark 012 0 SS Fl MVO Пересылка co сдвигом Move with Offset 0 SS F2 PACK Упаковать Pack 0 SS F3 UNPK Распаковать Unpack 2 SS F8 ZAP Сложение с очисткой Zero and Add 0123 2 SS F9 CP Сравнение десятичное Compare Decimal 012 2 SS FA AP Сложение десятичное Add Decimal 0123 2 SS FB SP Вычитание десятичное Subtract Decimal 0123
Особые случаи 1 2 3 48 4f 5 6 7 8 в А В С DBF т т т т т т т т т т т S т т т Т S т т т т т т т т т т т т т S т т т т С S т т т S т т т т с S т т т т с Приложение В. Набор команд
2 SS FC 2 SS FD MP Умножение десятичное Multiply Decimal DP Деление десятичное Divide Decimal S S T T T ST T T T S T s Принятые сокращения означают: В колонке «Средства* О Стандартный набор 1 Средства защиты памяти 2 Средства обработки десятичных данных 3 Средства обработки данных с плавающей точкой 4 Только для модели 67 5 Только для модели 20 6 Средства прямого управления 7 Средства обработки сверхдлинных чисел с пл В колонках «Особые случаи* Колонка 4s указывает Защиту от записи, а ко- лонка 4f — Защиту от выборки. S Подавление операции (операция не выпол- няется) Т Прекращение операции (операция начинает- ся, а затем прекращается) С Завершение операции )й точкой1) При выполнении команд, связанных с выборкой из памяти, могут обнаруживаться следующие особые случаи, вызывающие прерывание программы: Неправильная адресация Неправильная спецификация Нарушение Защиты от выборки х) Сверхдлинными называются числа с плавающей точкой, представленные двумя двойными словами, т. е. числа, мантиссы которых состоят из 28 шестнадцатеричных цифр.— Прим. ред. Приложение В. Набор команд__ _____777
Приложение С ВВОД - ВЫВОД Команды ввода-вывода I Л-pg муяфш Bi I Dj ~l О 7 8 1516 19 20 31 Адрес устройства, _________________ К Устройство О 2021 23 24 31 32 Цепочка данных 33 Цепочка команд 34 Блокировка неправильной длины 35 Блокировка записи в основную память 36 П ро граммно-у прав л яемое прерывание Слово состояния канала (CSW) [Основная память 64) Ключ 0000 Адрес команды 0 34 7 • 31 Адресное слово канала (CAW) {Основная память 72) Ключ 0000 Адрес команды О 34 7 8 31 Команда канала (CCW) Команда Адрес данных 0 78 31 Признаки 000 ШЛ Счетчик 32 3637 3940 47 48 63 Устройство Канал Счетчик 32 ' 3940 4748 63 32 Внимание 33 Модификатор состояния 34 Контроллер кончил 35 Занято 36 Канал кончил 37 УВВ кончило 38 Ошибка в устройстве 39 Особый случай в устройстве 40 Программно-управляемое прерывание 41 Неправильная длина 42 Ошибка в программе 43 Нарушение защиты 44 Ошибка в канале (в данных) 45 Ошибка в канале (в управлении) 46 Ошибка в интерфейсе (в управлении) 47 Ошибка в цепочке
КОДЫ КОМАНД 2501 Чтение 00D0 0010 D = 0 режим 1 Нет операции 0000 ООН D = 1 режим 2 Уточнить состояние 0000 0100 2520 Чтение, подача и выбор кармана АА+ 0SD0 0010 S = 0 карман 1 Чтение, подача АВ+ 11D0 0010 S = 1 карман 2 Выбор кармана ВА+ 0S10 ООН D = 0 режим 1 Запись и выбор кармана ВА+ 0SD0 1001 D = 1 режим 2 Запись, подача и выбор кармана ВВ 0SD0 0001 Нет операции — 0000 ООН Уточнить состояние — 0000 0100 ♦только для модели В1 2540 Чтение, подача и выбор кармана АА SSD0 0010 SS = 00 карман R1 (ввод) Чтение АВ 11D0 0010 SS — 01 карман R2 Подача и выбор кармана ВА SS10 ООН SS = 10 карман RP3 Нет операции — 0000 ООН D = 0 режим 1 Уточнить состояние — 0000 0100 D = 1 режим 2 2540 Чтение АВ 1100 0010 SS = 00 карман Р4 (вывод) PFR, запись, подача, выбор кар- ВА SSD0 1001 SS = 01 карман Р2 мана Запись, подача и выбор кармана ВВ SSD0 0001 SS = 10 карман RP3 Нет операции — 0000 ООН D = 0 режим 1 Уточнить состояние — 0000 0100 D = 1 режим 2 1442 Чтение + 0SD0 0010 S = 0 карман 1 Запись 0SD0 0001 8=1 карман 2 Запись и подача ISD0 0001 * только для модели № 1 Выбор кармана Подача 0S00 IS00 ООН ООН (для модели № 2 можно задавать только S = 0) Уточнить состояние 0000 0100 Звуковая сигнализация 0000 1011 + отсутствует в модели 30 Приложение С. Ввод — вывод
1052 Чтение Запись с возвратом каретки Запись без возврата каретки Нет операции Уточнить состояние 1403 и Запись и перевод строк 1443 Перевод строк Запись и прогон бумаги Прогон бумаги Уточнить состояния Установить блокировку ошибки в данных Сбросить блокировку ошибки в данных Лента Чтение Обратное чтение Запись Управление движением ленты Установить режим 1600 байтов на дюйм Установить режим 800 байтов на дюйм Запросить TIE Уточнить состояния
0000 1010 0000 1001 0000 0001 0000 ООН 0000 0100 OOOL L001 LL — 00, 01,10,11 количество строк 000L L011 ICCC С001 СС = 0001 до 11000 — номер дорожки 1CCG СОН 0000 0100 ОШ ООН + для 1403 с UCS 0111 1011 Лриложехш С. Ввод 0000 0010 ССС = ООО перемотка i 0000 1100 ССС = 001 перемотка с разгрузкой S 0000 0001 ССС = 010 протереть интервал чЭ оосс СН1 ССС = он записать маркер ленты 1100 ООН ССС = 100 шаг назад на блок 1100 1011 ССС = 101 шаг назад па файл 1101 1011 ССС = 110 шаг вперед на блок 0000 0100 ССС = ш шаг вперед на файл
КОДЫ КОМАНД ДЛЯ УСТРОЙСТВ ПАМЯТИ С ПРЯМЫМ ДОСТУПОМ Счетчик в CCW Установка цилиндра и головки Установка цилиндра Установка головки 6 0000 0111 6 0000 1010 6 0001 1010 Поиск по собственному адресу 4 МОН 1001 СС = 01 равно Поиск по идентификатору 5 МСС1 0001 СС = 10 больше Поиск по ключу X МССО 1001 СС = 11 больше или равно Поиск по ключу и данным X мссо 1101 М = 0 однодорожечный режим Пропустить запись Установить маску файла - 0000 1111 1 0001 1111 Стереть Чтение X 0001 M00D 1111 DD10 М = 1 многодорожечный режим DDD = 001 данные Чтение счетчика 8 М001 0010 DDD = ОН ключ и данные Чтение IPL 24 0000 0010 DDD == 101 Ro Запись X 000D DD01 DDD = НО собственный адрес Запись счетчика, ключа и данных (спе- X 0000 0001 DDD = 111 счетчик, ключ циальная) и данные Установка головок в начало 0001 ООН Возврат магнитной карты — 0001 0111 Нет операции 0000 ООН Переход в канале хххх 1000 Уточнить состояние 4 0000 0100 Резервировать устройство — 1011 0100 Освободить устройство — 1001 0100 Приложение С. Веод — выеод
Приложение D ОСНОВНЫЕ СВЕДЕНИЯ О ПРОЦЕССОРЕ ФОРМАТЫ ДАННЫХ Двоичные числа с фиксированной точкой Полуслово ± целое 0 1 15 Полное слово ± целое 0 1 31 Двойное слово ± целое 0 1 63 Двоичные числа с плавающей точкой Короткое ± Характе- ристика Дробная часть 01. 78 31 Длинное ± Характе- ристика Дробная часть 0 1 7 8 63 Логические данные Полное слово о 31 Поле переменной длины Символ Символ Символ 0 70 7~ 0 7 Десятичные данные Формат с зоной Зона Цифра Зона Цифра Зона Цифра Знак Цифра 0 34 70 34 7 0 34 70 34 7 Упакованный формат Цифра Цифра Цифра Цифра Цифра Цифра Цифра Знак О 34 70 34 7 0 34 70 34 7
ЗНАЧЕНИЯ ПРИЗНАКА РЕЗУЛЬТАТА 0 1 2 3 Команды сравнения Равны Первый операнд меньше Первый операнд больше — AL, ALR 0, нет переноса =^=0, нет переноса 0, перенос ^=0, перенос SL, SLR 0 ч&О, нет переноса 0, перенос 4^0, перенос Все остальные команды сло- жения и вычитания <0 >0 переполнение Все AND, OR и EXCLUSIVE OR 0 ¥=0 —- — LPR 0 — >0 переполнение LPDR, LPER 0 — >0 LNR,LNDR,LNER 0 <0 — LTR, LTDR, LTER, LCDR, LCER 0 <0 >0 я»* LCR 0 <0 >0 переполнение SRA, SRDA 0 <0 >0 — SLA, SLDA 0 <0 >0 переполнение TM нули смесь единицы TS Бит 0 = 0 Бит 0=1 — — TRT нули не завершена завершена —~ ED,EDMK 0 <0 >0 — SIO, TIO Доступно заполнилось CSW занято неработоспособно HIO не работает запомнилось CSW остановлено неработоспособно TCH не работает необработанное прерывание занят неработоспособен SPM, LPSW, диагностика Устанавливается из программной маски PSW Лриложекве D. Основные сведения о процессоре $
Индекс модели Объем памяти В С D о 4,096 8,192 16,384 Е F G Н I J 32,768 65,536 131,072 262,144 524,288 1,048,576 К L 2,097,152 4,194,304 2361 2361 1,048,576 2,097,152 CD DE 24,576 49,152 Цикл памяти (мксек) Число байтов, пересылае- мых за цикл МОДЕЛИ СИСТЕМЫ 360 25 30 40 50 65 75 85 91-95 44 67 20 X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X к X 9 1.5 2.5 2.0 .75 .75 1.04 .75—.125 1.0 .75 3.6 2 1 2 4 8 8 16 8 4 8 1 Приложение Р» Основные сведения о процессоре
Приложение D. Основные сведения о процессоре 785 СЛОВО СОСТОЯНИЯ ПРОГРАММЫ (PSW) Маска системы Ключ AMWP Код прерывания 0 7 8 И 12 15 16 31 ILG GG Маска программы Адрес команды 32 34 36 39 40 63 0—7 Маска системы 0 Мультиплексный канал 1 Селекторный канал 1 2 Селекторный канал 2 3 Селекторный канал 3 4 Селекторный канал 4 5 Селекторный канал 5 6 Селекторный канал 6 7 Внешние прерывания 8 —.11 Ключ защиты 12 Режим работы с ASCI 1-8 13 Маска прерываний от схем контроля машины 14 Состояние ожидания 15 Состояние «задача» 16-31 Код прерывания 32—33 Код длины команды (ILC) 34-35 Признак результата (СС) 36-39 Маска программы 36 Переполнение с фиксированной точкой 37 Десятичное переполнение 38 Исчезновение порядка 39 Потеря значимости 40-63 Адрес команды Нулевой бит в маске запрещает прерывание, единичный разрешает его. Единичные биты в AMWP задают указанные в таблице режимы, при нулевых битах CPU работает с кодом EBCDIC, прерывания от схем конт- роля игнорируются, состояния «счет» и «супервизор». 50 Зак. 15635
786 Приложение D. Основные сведения о процессоре РЕДАКТИРОВАНИЕ Код шести. 20 Символ выбора цифры (DS) 21 Символ начала значимости GSOS) 22 Символ разделения полей (FS) КОДЫ ПРОГРАММНЫХ ПРЕРЫВАНИЙ Код шести. Причина 0001 Операция 0002 Привилегированная операция 0003 Команда Execute 0004 Защита памяти 0005 Адресация 0006 Спецификация 0007 Данные 0008 Переполнение с фиксированной точкой 0009 Деление с фиксированной точкой 000А Десятичное переполнение 000В Десятичное деление ОООС Переполнение порядка 000D Исчезновение порядка 000Е Потеря значимости 000F Деление с плавающей точкой 0010 ♦Особый случай при перемещении сегмента ООН ♦Особый случай при перемещении страницы ♦Только для модали 67
ПОСТОЯННО РАСПРЕДЕЛЕННЫЕ ЯЧЕЙКИ Десятичный адрес Шести, адрес Длина Назначение 0 00 двойное слово IPL PSW 8 08 двойное слово IPL CCW1 16 10 двойное слово IPL GCW2 24 18 двойное слово Старое PSW для внешних прерываний 32 20 двойное слово Старое PSW для обращения к супервизору 40 28 двойное слово Старое PSW для программных прерываний 48 30 двойное слово Старое PSW для прерываний от схем контроля машины 56 38 двойное слово Старое PSW для прерываний от ввода — вывода 64 40 двойное слово Слово состояния канала (CSW) 72 48 слово Адресное слово канала (CAW) 76 4С слово Не используется 80 50 слово Таймер 84 54 слово Не используется 88 58 двойное слово Новое PSW для внешних прерываний 96 60 двойное слово Новое PSW для обращения к супервизору 104 68 двойное слово Новое PSW для программных прерываний Л12 70 двойное слово Новое PSW для прерываний от схем контроля машины 120 78 двойное слово Новое PSW для прерываний от ввода — вывода 128 80 12-256 байтов Область памяти для информации о состоянии машины при диагностике Приложение D. Основные сведения о процессоре § 1
Приложение Е ОСНОВНЫЕ СВЕДЕНИЯ О ЯЗЫКЕ PL/1 ОПЕРАТОРЫ ЯЗЫКА PL/1 1. метка: PROCEDURE [(параметр!, . . .)] [OPTIONS (MAIN)] [описатели-данных]; 2. BEGIN; 3. END [метка]; 4. ENTRY [(параметр!, . . .)] [описатели-данных]; 5. DO (WHILE (скалярное-выражение)]; {псевдопеременная 1 . прпамрнняя Г = описатель* [, описатель2, . . .]; Каждый описатель есть: f скалярная-переменная *] г 7- t псевдопеременная )(.•••) = скалярное-выражение; {массив 'I (выражение-над-массивами [, BY NAME] 1 псевдомассив J [ скалярное-выражение J ’ 9- {псевдоструктура} h ‘ ’ ’= вы₽аженив на« структурами [, BY NAME]; _ f константа-типа-метка 1 10. скалярная-переменная-типа-метка | скалярная.переменная-типа-метка j - {константа-типа-метка 1 скалярная-переменная-типа-метка > ; массив-типа-метка J 12» переменная-типа-указатель [, . . .] = выражение-над-указателями; л r _ f выражение-над-указателями 1 13. массив-типа-указатель (,...] = -[ массив.типа-указатель J ’
j GO TO *| Г константа-типа-метка 1 1 * I GOTO J t скалярная-переменная-типа-метка J ’ 15. IF скалярпое-выражение THEN элемент! [ELSE элемент2] Элемент — это обычный блок, группа DO или один оператор. Элемент всегда закапчивается точкой с занятой. 16. CALL имя-входа [(аргумент!, . . .)]; 17. RETURN [(выражение)],' 18. [Пустой оператор] [метка:]; 19. STOP; {[SNAP] элемент 1 SYSTEM I ’ Элемент — это простой оператор или непомеченный обычный блок. 21. SIGNAL ситуация; 22. REVERT ситуация; 23. DECLARE [уровень] имя [описатели} [, [уровень] имя [описатели]] . . . ; 24. OPEN FILE имя-файла [TITLE (выражение)] [KEYED (десятичная-целая-константа)] INPUT i I OUTPUT1 rSTREAM l ("BUFFERED 1 ["SEQUENTIAL 1 [update! LrecordJ Lunbufferedj Ldirect J [BACKWARDS] [PRINT [ LINESIZE (выражение)] [PAGESIZE (выражение)]] [, . . .]; 25. CLOSE FILE (имя-файла) [, . . .]; z fDATA 1 26 GET I FILE (им*’Файла> I { LIST (данные!, . . .) J- [COPY]; 1 STRING (имя-строки-символов) J ( EDIT (данные!, . . 3 (формат», . . .) J Приложение E. Основные сведения о языке PL/1
27 PUT i FILE 4/. ui STRING (имя-строки-символов DATA LIST (данныеь . . .) EDIT (данные!, . . (формат!, . . . [PAGE] [SKIP [(выражение)]] [LINE (выражение)]; 28. FORMAT (формат!, . . .); 29. f INTO (переменная) READ FILE (имя-файла) < SET (переменная-типа-указатель) I IGNORE KEYTO (переменная-типа-строка-символов) KEY (выражение): 30. WRITE FILE (имя-файла) FROM (переменная) [KEYFROM (выражение)]; 31. REWRITE FILE (им файла) [FROM (переменная)] [KEY (выражение)]; 32. LOCATE переменная FILE (имя-файла) SET (переменная-типа-указатель) [KEYFROM (выражение)]; 33. DISPLAY (скалярное-выражение) [REPLY (символьная-переменная)]; Ограничения для Subset-PL/1. 1. Не допускается многократное присваивание в операторах присваивания. 2. Элемент в операторе ON должен быть оператором GO ТО или пустым оператором. 3. В операторах GET или PUT не предусмотрен вариант DATA. 4. Нельзя использовать COPY в операторе GET. 5. Нельзя использовать IGNORE в операторе READ. 6. Нельзя использовать KEYTO в операторе READ. Приложение Е. Основные сведения о языке PL/1 ОПИСАТЕЛИ, ИСПОЛЬЗУЕМЫЕ В ОПЕРАТОРАХ DECLARE Уровень: от 1 до 255. Уровень по умолчанию равен 1. Указание размерности: ([нижняя-граница:] верхняя-граница [,[нижняя-граница:] верхняя-граница] . . .
ate____ Арифметические данные: Строковые данные: [“REAL “I [-DECIMALS [“FLOAT (р) -| [COMPLEX] [BINARY J [FIXED (p, q)j PICTURE 'числовой-шаблон' (в шаблоне не могут использоваться буквы А или X) рТТ/п\ TALIGNEDl BIT(n) [packed J CHARACTER (n) PICTURE 'символьный-шаблон' (в шаблоне должна присутствовать хотя бы одна буква А или X) Если описатели не указаны, то по умолчанию данным приписывается тип FIXED BINARY (15,0), когда первой буквой имени является какая-либо из букв I — N; в противном случае приписывается тип FLOAT DECIMAL (6). Если хотя бы один описатель указан, по умолчанию принимается REAL, DECIMAL, FLOAT. Данные-типа-метка: Данные-типа-указатель: Имена входов: Имена файлов: Возможная разрядность: По умолчанию Максимальная FLOAT DEC ( [6) (16) FLOAT BIN 4 21) (53) FIXED DEC 5,0) (15,q) FIXED BIN 15,0) (31,q) CHAR 1) (32767) BIT - 1) (32767) LABEL (метка-константа!, . . •) POINTER ENTRY [(параметра . . .)] RETURNS [(описатели)] STREAM | RECORD INPUT | OUTPUT | UPDATE SEQUENTIAL | DIRECT BUFFERED | UNBUFFERED ENVIRONMENT (F (размер-блока [,размер-записи])) ENVIRONMENT (V (максимальный-размер-блока [, [максимальный-размер-записи])) ENVIRONMENT (U (максимальный-размер-блока)) PRINT BACKWARDS KEYED (десятичная-целая-константа) Приложение E. Основные сведения о языке PL/1
Описатели, допустимые при любых именах данных: INTERNAL|EXTERNAL STATIC | AUTOMATIC | CONTROLLED (переменная-типа-указатель) INITIAL DEFINED LIKE ПРЕОБРАЗОВАНИЕ ДАННЫХ ПРИ ОБРАБОТКЕ СМЕШАННЫХ ВЫРАЖЕНИЙ Строковые и арифметические арифметические Комплексные и вещественные -> комплексные С фиксированной и плавающей точкой —> с плавающей точкой Двоичные и десятичные -► двоичные Битовые и символьные символьные Subset-PL/1 не допускает преобразование символьных данных в арифметические и наоборот. ТРЕБОВАНИЯ К ОПЕРАТИВНОЙ ПАМЯТИ REAL FIXED DECIMAL (р, q) занимает [(р + 1)/2] байтов в упакованной десятичной форме; р < 15. REAL FIXED BINARY (р, q) занимает полное слово; р 31. REAL FLOAT DECIMAL (р) занимает полное слово, если р < 6; занимает двойное слово, если 6 < р < 16. REAL FLOAT BINARY (р) занимает полное слово, если р <21; занимает двойное слово, если 21 < р <53. CHAR (п) занимает п байтов. BIT (п) занимает [(п + 7)/8] байтов. LABEL занимает два смежных полных слова. ФОРМАТЫ Фиксированная точка Плавающая точка F (w) F (w, d) F (w, d, p) E (w, d) E ffr, d, s) Приложение Е. Основные сведения о языке PL/1 Битовый В (w) Символьный A (w) Косвенный элемент формата R (константа-типа-метка) R (переменная-типа-метка)
Комплексный Шаблон С (вещественный-описатель [ .вещественный-описатель]) Р 'шаблон' Управление X (w) PAGE SKIP [(w)] LINE (w) Примеры Переменная = -27.443 Формат Выводимые данные F (4) Ь- 27 F (8) bbbbb-27 F (8, 0) bbbb-27. F (8, 2) bb—27.44 F (8, 2, 1) b—274.43 Е (12, 2) bbb-2.74E+01 Е (12, 2, 3) bbb- 2.74E+01 Формат Е (12, 2, 4) Е (12, 2, 6) P'ZZZV.99T' Р'------V.999' Р'------V999' P'9V.99TE+99' Р'-9V.999K+99' Выводимые данные bb-27.44Е+00 -2744 .ЗОЕ—02 bb27.44L b—27.443 Ь-27443 2.74МЕ+01 -2.744+01 w — ширина поля d — количество десятичных позиций правее точки s — количество значащих цифр р — масштабный множитель. Умножение внутреннего значения на ЮР перед выводом. При вводе (перед записью в память) деление внешнего значения на ЮР. СОКРАЩЕННОЕ НАПИСАНИЕ КЛЮЧЕВЫХ СЛОВ BIN BINARY FOFL FIXEDOVERFLOW CHAR CHARACTER INIT INITIAL CPLX COMPLEX x) INT INTERNAL CTL CONTROLLED OFL OVERFLOW CONV CONVERSION PIC PICTURE DEC DECIMAL PTR POINTER DCL DECLARE PREC PRECISION DEF DEFINED PROC PROCEDURE ENV ENVIRONMENT SUBRG SUBSCRIPTRANGE UFL UNDERFLOW ZDIV ZERODIVIDE х) В Subset-PL/1 не используется. Приложение Е. Основные сведения о языке PL/1 w
ВСТРОЕННЫЕ ФУНКЦИИ Имя Аргументы Определение Результат, вид и т. д. ABS (х) REAL 1 xj Совпадает с аргументом. ABS (х) COMPLEX (р, q) уга8+ Ь2, где х = а + bi REAL (р+ 1, q) MIN (xlt . . .) REAL Минимальное значение х Разрядность аргументов по максимальному. МАХ (хъ . . .) REAL Максимальное значение Разрядность аргументов по максимальному. MOD (х, у) REAL х = а + by, где 'а' и 'Ь' — целые, и 0 < а < у bREAL. Остальное совпадает с 'х' и 'у'. SIGN (х) REAL FLOAT +1, если х > 0; 0, если х = 0; —1, если х < 0 REAL FIXED BIN FIXED (х, р, q) FLOAT х преобразуется в FIXED (р, q). Если ни р, ни q не записаны по умолчанию. Если q не записано, то q = 0. , используется разрядность FLOAT (х, р) FIXED х преобразуется в FLOAT (р) Если р опущено, используется разрядность по умолчанию. FLOOR (х) REAL (p, q) Максимальное целое <х REAL (р- q+ 1, 0) CEIL (х) REAL (p, q) Минимальное целое >х REAL (р- q+ 1, 0) TRUNC (х) REAL (p, q) Если х > 0, то FLOOR (х); если х<0, то CEIL(x) REAL (р - q + 1, 0) / BINARY (х, р (, q]) не двоичный х преобразуется в BIN (р, q) Если FLOAT, то q опускается. DECIMAL (х, р [, ql) не десятичный х преобразуется в DEC (р, q) Если FLOAT, то q опускается. PRECISION (х, р [, ql) любой х преобразуется в (р, q) Если FLOAT, то q опускается. ADD (х, у, р [, ql) числовой х + у с разрядностью (р, q) Если х или у имеют тип FLOAT, то q опускается. MULTIPLY (х, у, р, (, ql) числовой х * у _с разрядностью (р, q) Если х или у имеют тип FLOAT, то q опускается. Приложение Е. Основные сведения о яеыке PL/1
DIVIDE (x, у, p, (qj) числовой fCOMPLEX (a, b) REAL fREAL (x) COMPLEX fIMAG (x) COMPLEX jCONJG(x) COMPLEX EXP (x) FLOAT LOG (x) FLOAT LOCIO (x) REAL FLOAT LOG2 (x) REAL FLOAT ATAND (x) REAL FLOAT ATAN (x) FLOAT TAND (x) REAL FLOAT TAN (x) REAL FLOAT SIND (x) REAL FLOAT SIN (x) FLOAT COSD (x) REAL FLOAT COS (x) FLOAT TANH (x) REAL FLOAT SINH(x) FLOAT COSH (x) FLOAT ATANH (x) FLOAT ATAN (y, x) REAL FLOAT ATAND (y, x) REAL FLOAT SQRT (x) FLOAT ERF (x) REAL FLOAT
х у с разрядностью (р, q) х = а + bi Если х или у имеют тип FLOAT, то q опускается. COMPLEX а, где х = а + bi Ь, где х = а + Ы а — bi, где х = а + hi REAL REAL COMPLEX ех Совпадает с аргументом. bge (х) Совпадает с аргументом. logio (х) Совпадает с аргументом. log2 (х) Совпадает с аргументом. арктангенс Xе Совпадает с аргументом. арктангенс х радиан Совпадает с аргументом. тангенс х® Совпадает с аргументом. тангенс х радиан Совпадает с аргументом. sin х® Совпадает с аргументом. sin х радиан Совпадает с аргументом. cos х® Совпадает с аргументом. cos х радиан Совпадает с аргументом. th (х) Совпадает с аргументом. sh (х) Совпадает с аргументом. ch (х) Совпадает с аргументом. Arth (х). Ошибка, если х > 1 Совпадает с аргументом. arc tg(y/x)l+n* SIGN (у), если х < 0]. Ошибка, если х= у= 0. 180®/л умножить на ATAN (у, х) Совпадает с аргументом. Vх* Ошибка, если х<0 X Совпадает с аргументом. -L f e-wdt Совпадает с аргументом. сл
ERFC (x) BIT (x [, p]) CHAR (x[, p]) SUBSTR (x, i, j) INDEX (x, y) HIGH (d) LOW (d) REPEAT (x, n) UNSPEC (x) BOOL (x, y, z) SUM (x) PROD(x) ALL (x) REAL FLOAT 1 — ERF (x) Совпадает с аргументом. строка x преобразуется в тип В 1Т(р) Если р опущено, то р выби- строка х преобразуется в тип CHAR(p) рается из размера х. х — это строка длиной к. Второй и третий аргументы являются выражениями, кото- рые после преобразования в целые получают значения i и j. Результатом является подстрока, начинающаяся с i-ro символа или бита х и состоящая из j символов или битов. Если i > к, то результатом является пустая строка. строка Номер такого самого левого элемента х, что начиная с него у входит в х в качестве под- строки. FIXED BIN (15,0) FIXED DEC (р, 0) Каждый байт в значении функ- ции есть шестнадцатеричное FF. CHAR (d) FIXED DEC (р, 0) Каждый байт в значении функ- ции есть шестнадцатеричное 00. CHAR (d) х сцепляется сам с собой п раз. х есть строка п есть FIXED DEC(p, 0) скалярная пере- менная х, у суть BIT z преобразуется в BIT (4) массив массив массив Значение функции равно строке битов, являющейся изображе- нием аргумента х во внутреннем коде. Если z = 'п1П2п3п4'В, то функция определяется как х 0 0 1 1 у 0 1 0 1 значение функции щпгПзщ Результат — это строка битов, длина которой равна макси- мальной из длин х и у (более короткое значение дополняет- ся справа нулями) Приложение Е» Основные сведения о язике PL/1 Сумма всех элементов х. FLOAT скаляр Произведение всех элемен- FLOAT скаляр тов х. Каждый элемент х преобра- зуется в строку битов. Результат есть логическое И всех строк.
ANY (х) POLY (а, х) массив Аналогично случаю ALL (х), но используется логическое ИЛИ. ♦ “-т / 1-1 \ а (т : n), х (р : q) а (т) + У la (m+j) П х (р + i)) j= 1 ' i = о ' ONFILE Результат: CHAR (7), содержащий имя файла, для которого был выполнен последний ввод или вывод. fONLOC Результат: CHAR (7), содержащий входное имя процедуры, в которой возникло последнее прерывание. ONSOURCE Результат: CHAR (255), включающий содержимое поля, обрабатываемого при воз- никновении последнего прерывания. t ONCHAR Результат: CHAR (1), содержащий символ, который вызвал прерывание при опе- раторе CONVERSION. ONKEY Результат: CHAR (255), содержащий ключ записи, которая вызвала прерывание. fONCODE Результат: FIX BIN (15, 0), описывающий характер последнего прерывания. Неко- торые получающиеся значения таковы: FINISH = 0; 70 = ENDFILE; 1000 == попыт- ка прочитать выходной файд; 3 = ошибка исходной программы. DATAFIELD Результат: CHAR (255), содержащий поле данных, вызвавших прерывание по ситуации NAME. ADDR (x) х, любая переменная. Результат: Указатель для х. NULL Пустой указатель. (Ничего не указывает.) DATE CHAR (6), содержащий YYMMDD. TIME CHAR (9), содержащий hhmmssttt: часы — hours, минуты — minutes, секунды — seconds, миллисекунды — milliseconds. LINENO (имя-файла) FIXED BIN (15, 0), содержащий номер текущей строчки файла для печати. fCOUNT (имя-файла) FIXED BIN (15, 0). Число скалярных элементов, переданных последним опера- тором GET/PUT. ROUND (выражение, d) d есть FIXED DECIMAL (р, 0). Результат вычисления выражения округляется с точностью до d-ro десятичного разряда справа от десятичной точки. Если d<0, то речь идет об округлении слева от десятичной точки. Если результат вычисления выражения имеет тип BIN, то d — это количество битов. f STRING (имя-структуры) Результат: строка, сформированная сцеплением всех элементов в структуре. t В Subset-PL/1 не используется. Для комплексных функций используются главные значения. Приложение Е. Основные сведения о языке PL/1
СИТУАЦИИ ПРЕРЫВАНИЯ Ситуации ввода — вывода ENDFILE (имя-файла) ENDPAGE (имя-файла) TRANSMIT (имя-файла) UNDEFINEDFILE (имя-файла) NAME (имя-файла) KEY (имя-файла) RECORD (имя-файла) Условия возникновения Чтение после того, как прочитана последняя запись. Печать за последней строкой на странице Постоянная ошибка ввода — вывода. Попытка открыть файл, который не уста- новлен В процессе ввода, управляемого данными, обнаружено нераспознаваемое имя данных. При выполнении операторов READ или REWRITE, заданный ключ не обнаружен или же в операторах WRITE и LOCATE задан уже существующий ключ. Длины внешних и внутренних записей отли- чаются для операторов READ или REW- RITE. (Читается первая часть записи.) Стандартная реакция системы Сигнализация, ситуация ERROR. Начинается новая страница. Сигнализация, ситуация ERROR. Сигнализация, ситуация ERROR. Сигнализация, поле игнори- руется. Сигнализация, ситуация ERROR. Сигнализация, ситуация ERROR. 1 ж § Ситуации контроля программы •SUBSCRIPTRANGE •CHECK (элемент^, . . .) § I Ситуации^ задаваемые программистом CONDITION (идентификатор) Индекс лежит.вне заданных границ. Резуль- тат не определен. Каждый элемент может быть неиндексирован- ными скаляром, массивом, именем структуры, константой типа операторная метка или мет- кой входа. Ситуация возникает каждый раз, когда выполняется помеченный оператор или изменяется названная переменная. Сигнализация, ситуация ERROR. Печатаются элемент и его новое значение (в случае переменной) Возбуждается только оператором SIGNAL: Сигнализация, счета» продолжение
Вычислительные ситуации ♦♦CONVERSION Строка символов, подлежащая преобразова- нию, содержит недопустимые данные. Резуль- тат не определен. Сигнализация, ситуация ERROR. ♦♦FIXEDOVERFLOW Результат выполнения арифметической опе- рации над числами тица FIXED DECIMAL превышает 15 разрядов; результат выполне- ния арифметической операции типа FIXED BINARY превышает 31 бит. Результат усе- кается слева. Сигнализация, продолжение счета. ♦♦OVERFLOW Переполнение порядка. Результат не опре- делен. Сигнализация, ситуации ERROR. ♦♦SIZE Значение, полученное при вводе или в ре- зультате выполнения оператора присваивания, не помещается в отведенное ему поле. Резуль- тат не определен. Сигнализация, ситуация ERROR* ♦UNDERFLOW Исчезновение порядка. Результат равен 0. Сигнализация, продолжение счета. •ZERODIVIDE Ситуации реакции системы Попытка разделить на нуль (с фиксированной или с плавающей точкой). Результат не опре- делен. Сигнализация, ситуации ERROR. ERROR Программа заканчивается необычным образом Ситуация FINISH. FINISH Программа заканчивается. Передача управления суперви- зору. Приложение Е. Основные сведения о языке PL/1 * Реакция на эти ситуации нормально «выключена». ♦♦ Реакция на эти ситуации нормально «включена». Реакция на остальные ситуации включена всегда.
Приложение F ОСНОВНЫЕ СВЕДЕНИЯ О ФОРТРАНЕ ВЫРАЖЕНИЯ 1. Правила выполнения операций над величинами разного типа. а. Операция возведения в целую степень выполняется как многократ- ное умножение. Возведение в вещественную степень выполняется через логарифмы. Показатель степени не может быть комплексным числом. Ь. Если типы смешанные, то целые переменные преобразуются в вещест- венные, а вещественные — в комплексные; при этом переменная с одинарной точностью преобразуется в переменную с двойной точ- ностью. Преобразования существенно замедляют выполнение объект- ной программы. 2. Правила соседства операций. а. Ни при каких обстоятельствах две арифметические операции не могут стоять рядом. Ь. Логическое .NOT. может следовать за символом другой логической операции; ни в каком другом случае два символа логических операций не могут стоять рядом. 3. Правила употребления скобок. а. Круглые скобки в выражениях употребляются в обычном математи- ческом смысле. Ь. Круглые скобки применяются для группировки членов; наличие скобок не предполагает выполнение умножения. с. Лишние круглые скобки, если они использованы без нарушения правил, не играют никакой роли. 4. Правила старшинства операций^ а. Если очередность выполнения операций не установлена явным обра- зом с помощью круглых скобок, то операции выполняются в следую- щем порядке: i. Вычисление значений функций ii. Возведение в степень iii. Умножение и/или деление iv. Сложение и/или вычитание v. Логические операции: .LE., .LT., .EQ., .NE., .GT., .GE. vi. Логическая операция .NOT. vii. Логическая операция .AND. viii. Логическая операция .OR* b. Операции одного ранга выполняются слева направо. Исключение составляет лишь операция возведения в степень, которая выпол- няется справа налево.
Приложение F. Основные сведения о Фортране 801 СПИСКИ ВВОДА — ВЫВОДА 1. Запись констант в любом списке не допускается. 2. Элементы списка должны отделяться друг от друга запятыми. 3. В списках допускается индексация типа циклов DO. 4. Допускаются вложения типа вложенных циклов DO. Каждый уровень индексации должен заключаться в круглые скобки и- выделяться запя- тыми. 5. Можно передать весь массив целиком, указав в списке лишь имя массива. ИНДЕКСЫ Индексы должны записываться в форме п, к, о + к, п — к, к* и, к* п + с, к* п — с, где к и с — целые константы, ап— целая перемен- ная. УПРАВЛЕНИЕ КАРЕТКОЙ Ь Один интервал перед печатью следующей строки 0 Двойной интервал перед печатью следующей строки + Интервал отсутствует перед печатью следующей строки 1 Прогон на начало следующей страницы перед печатью следую- щей строки (прогон до пробивки в дорожке 1) 513ак, 15635
СПЕЦИФИКАЦИЯ ФОРМАТОВ Спецификация Форма в onepam. памяти Форма на внешн. носит. Пример Iw integer целое 17 bb—4567 Lw. d real*4 с плавающей точкой Е9.2 —45Е+02 Fw. d real с фиксированной точкой F9.3 bb—45.789 Dw. d real *8 с плавающей точкой D9.2 —0.45D+02 wH буквенно-цифровые сим- волы буквенно-цифровые сим- волы ' ЗНЕХР EXP wX пробелы пробелы ЗХ bbb Aw real или integer буквенно-цифровые сим- волы АЗ EXP +Gw integer целое * 17 bb—4557 +Gw. d real с плавающей или фикси- рованной точкой G9.3 bb—45.789 logical Т или F L3 bbF Комплексные переменные эквивалентны паре вещественных переменных. Только в Фортране IV Приложение F. Основные сведения о Фортране
Приложение F. Основные сведения о Фортране 803 ПРЕДЛОЖЕНИЯ ФОРТРАНА Операторы присваивания 1. Арифметический оператор присваивания: а = b а — целая, вещественная или комплексная переменная; b — арифмети- ческое выражение. *2. Логический оператор присваивания: а = Ь а — логическая переменная; Ь — логическое выражение. Операторы управления 3. GO ТО п. п — метка выполняемого предложения. Управление передается на пред- ложение с меткой п. 4. GO ТО (nt, п2, . . ., nm), i i — целая переменная без индексов; п — метки выполняемых предложе- ний. Если 1 i <Cm, то управление передается на предложение с меткой nf, в противном случае выполняется следующее по порядку предложение. +5. ASSIGN i ТО п i —*метка; п — переменная, которая используется только в предложениях ASSIGN и в GO ТО, описанном в следующем пункте. Значение i присваи- вается переменной п. +6 . GO ТО п, (шь т2, . . тк) т— метки; п— переменная, определенная в предложении ASSIGN. Зна- чение п должно равняться mi, т2, . . ., тк_! или т^. Управление пере- дается на предложение с меткой п. 7. IF (a) ni, п2, пз а — арифметическое выражение; п — метки выполняемых предложений. Управление передается на предложение с меткой щ, если а < 0, на пред- ложение с меткой п2, если а = 0, и на предложение с меткой пз, если а > 0. +8. IF (a) s а — логическое выражение; s — любое предложение, не являющееся спе- цификацией, оператором DO или другим логическим IF. Если значение а истинно, то выполняется предложение s; в противном случае предложение в не выполняется. 9. DO n i = mi, т2, тз DO n i = mi, т2 п— метка предложения, которое не может быть GO ТО, арифметическим IF или другим DO и которое расположено ниже DO в исходной программе, i — целая переменная; m — целые константы без знака или положительны* целые переменные без индексов. Если тз опущено, то оно принимается равным единице. Выполнение предложений, предшествующих предложению с меткой п, а также самого предложения с меткой п циклически повторяется, начиная с i = mi; после каждого повторения значение i увеличивается натз. Послед- нее повторение происходит для максимального значения i, не превышаю- щего т2, после чего управление программой передается на предложение» следующее за предложением с меткой п. 10. CONTINUE Это — пустое предложение, используемое для того, чтобы обойти ограни- чение, по которому последнее предложение в области действия цикла DO не может быть IF или GO ТО. 51*
804 Приложение F. Основные сведения о Фортране 11. PAUSE п PAUSE +PAUSE 'сообщение' п — целое число без знака, состоящее из пяти цифр. Если ни п, ни 'сооб- щение' не задано, то предполагается, что п = 00000. При выполнении пред- ложения печатается пятизначное целое число или сообщение. Программа останавливается. Выполнение программы может быть продолжено только после вмешательства оператора машины. Он должен нажать на Ключ запро- са (Request key) и набрать REPLYyy,'z', где уу — двузначный цифровой код, напечатанный перед выданным сообщением, az — любой символ. После набора сообщения оператор машины нажимает цифру 5 вместе с клавишей ALTN CODING. 12. STOP n STOP п — пятизначное целое число без знака. Если п не указано, то предпола- гается, что п = 00000. STOP п печатается, и затем управление передается на программу управ- ления заданиями. 13. END Предложение END указывает на окончание исходной программы или под- программы. Предложения ввода — вывода 14. READ (а, Ь) список +READ (а, Ь, END = с, ERR = d) список WRITE (а, b) список а определяет номер набора данных (т. е. устройство); Ъ — метка пред- ложения FORMAT.. 15. READ (а) список WRITE (а) список а — номер набора данных. Данные вводятся или выводятся в виде образов оперативной памяти. +16. READ (а, х) WRITE (а, х) а — номер набора данных; х — имя списка в предложение NAMELIST. 17. DEFINE FILE at (mb rlf f4, v^, . . . С помощью одного предложения можно описать любое число файлов, а — номер набора данных; m — максимальное количество записей й наборе данных; г — максимальная длина записи; v — имя связанной переменной. После выполнения любого из READ, WRITE или FIND значение v равно номеру следующей записи в наборе данных. В случае f — L предполагается, что записи будут записываться в форматном или неформатном виде; в слу- чае f = Е речь идет только о форматных записях, в случае f = U — только о неформатных. 18. FIND(a, v) а — номер набора данных; v — номер записи в наборе данных. +19. READ b, список PUNCH b, список PRINT b, список Эти предложения эквивалентны предложениям READ (5, Ь) список, WRITE (7, b) список и WRITE (6, b) список. 20. END FILE а REWIND а BACKSPACE а а — номер ленточного набора данных.
Приложение F. Основные сведения о Фортране 805 Подпрограммы 21. a (vt, . . vn) = b а — имя функции; vj — аргументы, которые должны быть различающи- мися переменными без индексов; b — выражение, не содержащее перемен- ных с индексами. 22. FUNCTION a (vb . . ., vn) тип FUNCTION a (V1, . . ., vn) В качестве типа может быть INTEGER, REAL, COMPLEX или LOGICAL; если тип не специфицирован, то он определяется по первой букве имени функции a; v — аргументы. Это предложение должно быть первым в под- программе-функции . 23. SUBROUTINE a (vb . . ., vn) а — имя подпрограммы; v — аргументы, которые могут быть константами, переменными или массивами. +24. BLOCK DATA Это предложение должно быть первым предложением каждой подпрограм- мы, задающей значения в помеченном блоке COMMON. *25. DATA vi, . . ., v^*^, . . ., rm*dm/, . . . v — переменные, которые могут содержать постоянные индексы или имена массивов. Если значения г не указаны, они предполагаются равными 1. Число значений, указанных между наклонными черточками, и число пере- менных перед ними должны быть равны. Предложение DATA обеспечивает присваивание переменным начальных значений. 26. CALL a (vi, . . ., vn) а — имя подпрограммы, к которой обращаются; v — аргументы (фактиче- ские параметры), которые могут быть константами, переменными или мас- сивами, но должны согласовываться по типу и порядку с аргументами в пред- ложении SUBROUTINE. Управление передается подпрограмме, и значе- ния аргументов сообщаются ей. 27. RETURN ♦RETURN i i — целая константа или переменная. Значения i — номера меток в списке аргументов предложения SUBROUTINE. Если i опущено, то управление возвращается следующему предложению вызывающей программы. Выполне- ние любой подпрограммы должно заканчиваться предложениями RETURN или RETURN i. 28. ENTRY a (vt, . . ., vm) Выполняет те же функции, что и SUBROUTINE. Предложения ENTRY позволяют задавать дополнительные входы в подпрограмму. 29. EXTERNAL а, b, . . . а, Ь, ... — это имена подпрограмм, которые используются в качестве аргументов других подпрограмм, но к которым нет явных обращений в про- грамме. Предложения-спецификации 30. DIMENSION vt, v2, . . . Каждое v — это имя массива, содержащее от одного до семи индексов, кото- рыми могут быть положительные целые константы. Их значения опреде- ляют максимально возможные значения индексов у данной переменной.
806 Приложение F> Основные сведения о Фортране 31. EQUIVALENCE (а, Ь, . . .), (с, d, ...),.. . а, Ь, ... — это переменные, которые могут иметь либо свой обычный набор индексов, либо только один индекс, указывающий на относительное положение элемента в массиве. Каждая группа круглых скобок выделяет группу переменных, которым ставится в соответствие один и тот же адрес оперативной памяти. 321 COMMON vb . . vn/r/ub . . ., um/s/ . . . Каждое v — это переменная, которая может содержать информацию о раз- мерности, как в случае оператора DIMENSION; г и з (+) — имена блоков COMMON. Блоки COMMON без имени считаются непомеченными. 33. FORMAT (S1, s2, . . ., Зщ) Каждое s специфицирует тип преобразования и формат данных, содержа- щихся в списке ввода — вывода. +34. NAMELIST/х/а, Ь, . . ., c/y/d, . . .* Каждое имя, заключенное между наклонными черточками, является именем списка имен. Все последующие переменные являются элементами этого списка. Любое число списков может быть определено в одном предложении. +35. IMPLICIT thh*s (ai, . . ап), типфз (. . . Тип может быть INTEGER, REAL COMPLEX или LOGICAL; наличие s не обязательно; значение s может равняться 2, 4, 8 или 16 байтам; если s не указано, то предполагается INTEGER*4, REAL*4, COMPLEXES и LOGICAL*4. Все aj — это буквы, разделенные запятыми, или пары раз- деленных знаком минус букв, задающие диапазон букв в алфавите. Задан- ная спецификация распространяется на все имена, начинающиеся с буквы или с букв, попадающих в соответствующий диапазон; если только тип этих имен не специфицирован явно. 36. типшз a^si (ki)/xi/, . . . Тип может быть REAL, INTEGER, LOGICAL или COMPLEX. Запись s не обязательна (так же, кат^и в случае IMPLICIT). Каждое aj —- имя пере- менной; к—информация о размерности, как и в случае DIMENSION. Значение s относится ко всем переменным, для которых Sj не задано. Если значение s не задано, то оно предполагается таким, какое получается в слу- чае IMPLICIT. Если задано /х/ (+), то переменной а присваивается началь- ное значение х. * 37. DOUBLE PRECISION at (kt), . . . Значения k несут в себе информацию о размерностях, как и в случае DIMENSION. Каждое а —- это переменная, которая получает тип REALe8. ♦Только для Фортрана IV и Фортрана Модели 44
ВНУТРЕННИЕ (IN LINE) ФУНКЦИИ ФОРТРАНА Функция Имя К-во аргу- Тип ар- Тип функ- ментов гументов ции Абсолютное значение 1 X 1 IABS 1 14 14 ABS R4 R4 tq DABS R8 R8 1 Модуль "|/а2+ Ь2, где х = а + bi CABS 1 + С8 R8 м Плавающая точка Преобр. х в форму с FLOAT 1 14 R4 Л * плав, точкой DFLOAT 14 R8 £ Фиксированная точка Преоб. х в форму с IFIX 1 R4 14 41 фикс, точкой HFIX + R4 12 О Присвоение знака sgn (х2) * I X* 1 SIGN 2 R4 R4 1 ISIGN 14 14 DSIGN R8 R8 г © Положительная разность Xi — min (хь х2) DIM 2 R4 R4 § ID IM 14 14 ©> Одинарная точность SNGL 1 R8 R4 5 Двойная точность DB^E 1 R4 R8 JQ Вещественная часть комплексно- REAL 1 + С8 R4 © А. го числа © Мнимая часть комплексного числа AIMAG 1 + С8 R4 3 Комплексное число Xf + x2i CMPLX 2 + R4 С8 - ft DCMPLX + R8 С16 § Сопряженное комплексное число а — bi, где х = а + bi CONJG 1 + С8 С8 DCONJG С16 С16 [ +1, если у > 0 sgn (у) “ { 0, если у = 0 оо ( —1, если у < 0 + Только для Фортрана IV о
Функция ВНЕШНИЕ (OUT OF LINE) ФУНКЦИИ ФОРТРАНА i К-во аргу- Тип ар- Типфунк- ментов гументов ции Экспонента ех EXP 1 R4 R4 DEXP R8 R8 CEXP + C8 C8 CDEXP + C16 C16 Натуральный логарифм loge (х) ALOG 1 R4 R4 DLOG R8 R8 CLOG + C8 C8 CDLOG + C16 C16 Десятичный логарифм logio (х) ALOGIO 1 R4 R4 DLOGIO R8 R8 CLOGIO + C8 C8 CDLG10 + C16 C16 Арктангенс arctg (х) ATAN 1 R4 R4 .DATAN R8 R8 Арктангенс arctg (х/хг) DATAN2 2 + R8 R8 Синус sin (х) SIN 1 R4 R4 DSIN R8 R8 CSIN + C8 C8 CDSIN + C16 C16 Коринус cos (х) COS 1 R4 R4 DCOS R8 R8 CCOS + C8 C8 CDCOS + C16 C16 Корень квадратный Vx SQRT 1 R4 R4 DSQRT R8 R8 CSQRT + C8 C8 CDSQRT + C16 C16 Гиперболический тангенс th (x) TANK 1 R4 R4 DTANH R8 R8 Приложение F. Основные сведения о Фортране
Остаток Xi — [xi/x2]* x2 Максимальное значение max (xi, х2, . . Минимальное значение min (xi, х2, . . Усечение sgn (х)* [| X |] [у] означает наибольшее целое <у Xi первый аргумент х2 второй аргумент + Только для Фортрана IV
MOD 2 14 14 AMOD R4 R4 DMOD R8 R8 АМАХО >2 14 R4 АМАХ1 R4 R4 МАХО 14 14 МАХ1 R4 14 DMAX1 R8 R8 AMINO >2 14 R4 AMIN1 R4 R4 MINO 14 14 MINI R4 14 DMIN1 R8 R8 INT 1 R4 14 A1NT R4 R4 IDINT R8 14 12 целое, длина 14 целое, длина R4 вещественная 2 байта 4 байта переменная, 4 байта R8 вещественная переменная, 8 байтов С8 комплексная переменная, 8 байтов С16 комплексная переменная, 16 байтов Приложение F. Основное сведения о Фортране i
Приложение G ОСНОВНЫЕ СВЕДЕНИЯ О КОБОЛЕ IDENTIFICATION DIVISION (РАЗДЕЛ ИДЕНТИФИ- КАЦИЙ) PROGRAM-ID. имя-программы [AUTHOR, предложение . . .] [INSTALLATION. предложение • . •] [DATE-WRITTEN, предложение . . .] [DATE-COMPILED, предложение . . .] [SECURITY, предложение . . .] [REMARKS, предложение . . .] ENVIRONMENT DIVISION (РАЗДЕЛ ОБОРУДОВАНИЯ) "CONFIGURATION SECTION. [SOURCE-COMPUTER. IBM-360 номер-модели] [OBJECT-COMPUTER. IBM-360 номер-модели] p INPUT-OUTPUT SECTION» FILE-CONTROL, select-предложения . . . [I-O-CONTROL. [статья SAME.] [статья RERUN] [статья APPLY] . . .] Управление файлами SELECT имя-файла ASSIGN TO внешнее-имя ( SEQUENTIAL 1 IACCESS IS | r^50M~ {INDEXED DIRECT I] RELATIVE J UTILITY DIRECT-ACCESS UNIT-RECORD > [номер устройства UNIT [S]] [SYMBOLIC KEY IS имя-данных] [ACTUAL KEY IS имя-данных] [RECORD KEY IS имя-данных]
{TRACK-AREA IS j CHARACTERS] [FILE-LIMIT IS целое TRACKS] {NO ) — ^ALTERNATE TRACK[S]] целое ) У правление вводом-выводом [SAME AREA FOR имя-файла1 имя-файла2 . . .] {END OF REEL OF имя-файла ’ END OF UNIT OF имя-файла .] целое CLOCK-UNITS [APPLY RESTRICTED SEARCH OF целое TRACKS ON имя-файла . . .[ [APPLY условная-переменная TO FORM-OVERFLOW ON имя-файла.] [APPLY WRITE-ONLY ON имя-файла . . .] [APPLY RECORD PROTECTION ON имя-файла . . .] [APPLY имя-секции TO имя-области-сохранения имя-файла . . . FOR целое CYCLES].] DATA DIVISION (РАЗДЕЛ ДАННЫХ) FILE SECTION (СЕКЦИЯ ФАЙЛОВ) Статьи описания файлов. Статьи описания записей. WORKING-STORAGE SECTION (СЕКЦИЯ РАБОЧЕЙ ПАМЯТИ) Статьи описания записей. LINKAGE SECTION (СЕКЦИЯ СВЯЗЕЙ) Статьи описания записей. При отсутствии статей любая из вышеуказанных секций может быть исключена, но хотя бы одна из трех должна быть написана в программе. Приложение G. Основные сведения о Коболе
Статьи описания файлов FD имя-файла [BLOCK CONTAINS целое {RECORDS }] [RECORDING MODE IS тип] [RECORD CONTAINS [целое! TO целоег CHARACTERS] | RECORD IS I LABEL I RECORDS ARE J STANDARD ' < OMITTED имя-данных (RECORD IS ] DATA | RECORDS ARE | имя"записи Статьи описания записей ! имя-данных) FILLER | 1статья [REDEFINES] [другие статьи . . .] [PICTURE. IS 4 фор ма-буквенных-данных форма-бук венно-цифровых-даниых форма-цифровых-данных форма-отчета , форма-с-плавающей-точкой [OCCURS целое TIMES [DEPENDING ON имя-данных]] [JUSTIFIED RIGHT] [BLANK WHEN ZERO] [VALUE IS литерал] 00 ю Приложение G. Основные сведения о Коболе
{DISPLAY COMPUTATIONAL COMPUTATIONAL-n >] (n=l,2 или 3) PROCEDURE DIVISION (РАЗДЕЛ ПРОЦЕДУР) -DECLARATIVES. имя-секции SECTION, предложение USE. . .] END DECLARATIVES. Предложения USE (BEGINNING) USE FOR CREATING < EN5fNG-----f LABELS ON OUTPUT имя-файла . . . (REGINNING) USE FOR CHECKING < ENEINq----->LABELS ON INPUT имя-файла . . . USE FOR RANDOM PROCESSING. USE AFTER STANDARD ERROR PROCEDURE ON имя-файла. Условные операторы f оператор} . . . NEXT SENTENCE ELSE OTHERWISE оператор2 . . . NEXT SENTENCE Приложение G. Основные сведения о Коболе Условия имя-данных арифметическое-выражение {POSITIVE ZERO > NEGATIVE
f NUMERIC имя-данных IS [NOT] < ALPHABETIC ' > имя-данных i < [имя-данных2 арифметическое-выражение! [NOT] фигуральная-константа! = арифметическое-выражение2 GREATER THAN фигуральная-константа2 литерал! Глаголы Кобола LESS THAN ' EQUAL TO литерал2 OPEN [статьи INPUT] [статьи OUTPUT] [статьи I-O] Статьи могут записываться в любом порядке, но должна быть написана хотя бы одна. INPUT имя-файла [WITH NO REWIND] [REVERSED] OUTPUT имя-файла [WITH NO REWIND] 1-0 имя-файла READ имя-файла RECORD [INTO имя-данных] AT END 1 INVALID KEY I повелительиый-°ператор WRITE имя-записи [FROM имя-данных^ "INVALID KEY повелительный-оператор AFTER ADVANCING /имя’Данных21 LINES ------ 1пелое I REWRITE имя-записи [FROM имя-данных] [INVALID KEY повелительный-оператор . . . ] CLOSE имя-файла REEL] Г (NO REWIND UNIT WITH ) LOCK Приложение G. Основные сведения о Коболе
ACCEPT имя-данных Г FROM CONSOLE I FROM мнемоническое-имя DISPLAY I ямя-давтпа --------1 литерал UPON CONSOLE UPON SYSPUNCH . UPON мнемоническое-имя . f имя-данных i MOVE < литерал > TO имя-данных2 . . I фигуральная-константа J MOVE CORRESPONDING имя-данных! TO имя-данных2 . . . числовой-литерал литерал-с-плавающей-точкой > имя-данных j J TO GIVING | НМЯ ДаННЫХ“ [ROUNDED] [ON SIZE ERROR новелительный-оператор . . .] ADD CORRESPONDING имя-данных! TO имя-данных2 [ROUNDED] [ON SIZE ERROR новелительный-оператор . . .] f имя-данных i 'I SUBTRACT < числовой-литерал >... FROM ( литерал-с-плавающей-точкой J имя-данныхп [GIVING имя-данныхт] V < числовой-литералп GIVING имя-данныхт > литерал-с-плавающей точкой GIVING имя-данныхт J Приложение бг. Основные сведения о Коболе [ROUNDED] [ON SIZE ERROR новелительный-оператор] SUBTRACT CORRESPONDING имя-данных! FROM имя-данных2 [ROUNDED] [ON SIZE ERROR новелительный-оператор ..J
имя-данных j MULTIPLY < числовой-литерал! литерал-с-плаваюгцей-точкоЙ! DIVIDE имя-данныХ1 чис ловой-литер ал j литерал-с-плавающей-точкоЙ! COMPUTE имя-данных! [ROUNDED] = < имя-данных2 [GIVING имя-данных3] > BY числовой-литерал2 GIVING имя-данных3 > литерал-оплавающей-точкой2 GIVING имя-данных3 [ROUNDED] [ON SIZE ERROR повелительный-оператор.,.] {имя-данных2 [GIVING имя-данных3] Л числовой-литерал2 GIVING имя-данных3 I литерал-с-плавающей-точкой2 GIVING имя-данных3 I [ROUNDED] [ON SIZE ERROR* повелительный-оператор...] имя-данных2 числовой-литерал I литерал-с-плавающей-точкой | арифметическое-выражение ) [ON SIZE ERROR повелительный-оператор...] EXAMINE имя-данных REPLACING ALL LEADING UNTIL FIRST 'символ^ BY 'символа FIRST ALL EXAMINE имя-данных TALLYING < LEADING UNTIL FIRST ► 'символ^ [REPLACING BY 'символ^] Приложение G. Основные сведения, о Коболе f имя-данных2 'j (имя-данных3 TRANSFORM имя-данныХ1 CHARACTERS FROM 4 нечисловой-литерал2 > ТО < нечисловой-литерал3 > I фигуральная-константа2 J ( фигуральная-константа3| , STOP да ----- (литерал
52 Зак. GO ТО имя-процедуры ALTER имя-процедурЫ1 ТО PROCEED ТО имя-процедуры2 ... GO ТО имя-процедурЫ} [имя-процедуры2 ... ] DEPENDING ON имя-данных PERFORM имя-процедуры1 [THRU имя-процедуры2] Г I Целое 1 TIMES i имя-данных ) имя-процедуры! [THRU имя-процедуры2] UNTIL условие PERFORM имя-процедуры1 [THRU имя-процедуры2] VARYING ИД1 FROM идл< BY идл2 UNTIL условие! [AFTER ид2 FROM идл3 BY идл4 UNTIL условие^ [AFTER идз FROM идл5 BY идл6 UNTIL условие3] Г имя данных *1 где ид-имя-данных, а идл- |тасловой.литерал| EXIT. NOTE комментарий. Операторы для связей с подпрограммами В вызывающей про- грамме, уже нахо- дящейся в опера- тивной памяти: В начале подпрограммы ENTER LINKAGE. ENTER LINKAGE. CALL имя-входа. ENTRY имя-входа^ [USING аргу- — [USING имя-данных...]. мент... ]. ENTER COBOL. ENTER COBOL. Для возврата из подпрограммы в вызывающую программу ENTER LINKAGE. RETURN. ENTER COBOL. Приложение G. Основные сведения о Коболе
Приложение Н ПРОГРАММА-МОНИТОР PRINT NOGEN START 8192 CNS DTFCN BLKSIZE»72,OEVADDR=SYSLOG,RECFORM-UNOEF, LOG 1OAREA1-A1,RECS1ZE-(2), TYPEFLE-1NPUT DTFCN BLKSIZE-72,DEVADDR-SYSLOG,RECFORM-UNDEF,WORKA-YES, RDR 1OAREA1-A2,RECS1ZE-(2),TYPEFLE-OUTPUT DTFCD BLKS1ZE-8O,DEVAODR-SYSRDR,DEV1CE-2590,RECFORM-F1XUNB РСН 1OAREA1-A3,WORKA-YES,TYPEFLE-1NPUT,EOFAODR-P8 DTFCD BLKSIZE“80,DEVADDR-SYSPCH,DEVICE-2590,RECFORM-UNDEF, LST IOAREA1-A9,WORKA-YES,TYPEFLE-OUTPUT,RECSIZE-(2) DTFPR BLKSIZE-199,C0NTR0L-Y£S,0EVADDR-SYSLST,0EVICE-1903, * Q1 IOAREA1-A5,PRINTOV-YES,RECFORM-UNOEF,RECSIZE-(2), WORKA-YES CDMOD DEVICE-2590,WORKA-YES CDMOD DEVICE-2590,WORKA-YES,RECFORM-UNDEF,TYPEFLE-0UTPUT PRMOD PRINTOV-YES,RECFORM*UNDEF,WORKA-YES,CONTROL-YES STXIT PC ROUTINE BALR 11,0 * * USING «,11 TEST FOR PGM CHECK CLI B3*3,X'O1’ BNE Q2 L 9,B3+9 N 9,-X’OOFFFFFF' SH 9,-H'9' CLI 0(9),X'A0' BL Q2 CLI 0(9),X'AF' BH Q2 Nl B3+9,X'CF' SET CC-0 REG 9-ADOR. OF PROBLEM INSTR. * * LOOK UP ROUTINE TABLE SR 5,5 IC 5,0(9) MH 5,-H'12' A 5,-A(C2-1920) LM 8,9,0(5) LH 10,10(5) REG 8 -A(R.) * REG 9-A(S.) • REGIO-SHIFT AMOUNT 1 1 1 1 1 2 REG 5’ -ADDR. OF TABLE ENTRY CONVERT BDDD LH LR N N SRL L N AR REG 7 7,2(9) 6/7 7,-X'OOOOOFFF' 6,=X'OOOOFOOO' 6,10 6,83+8(6) 6,-X’OOFFFFFF' 7,6 -STARTING CORE AOOR. LENGTH CHECKS CLC 1(1,9),8(5)
Приложение Н. Программа-монитор 819 BL Q5 CLC 1(1,4),9(5) ВН Q5 SR 2/2 IC 2,1(4) LR 3/2 BCTR 3/0 SLL 2/0(10) * REG 2 «LENGTH FOR I/O REG 3 «LENGTH - 1 FOR MVC ADDRESS CHECKS CL 1 0(4),X*AC* BCR 10/8 CL 7/C3 BL Q6 LR 6/7 AR 6/3 CL 6,C4 BH Q6 BR 8 * PROGRAM CHECK Q2 L 14,B5 BR 14 * STANDARD PC ROUTINE Q3 LA 2/13 PUT LOG/D1 Q4 PDUMP B3,B3*71 Q41 MVC 83*52(4),«A(Q1*2) MVC B3*5(3),C5*1 EXIT PC * LENGTH CHECK Q5 LA 2/16 PUT L0G,D2 В Q4 * ADDRESS CHECK Q6 LA 2/17 PUT L0G/D3 В Q4 • READ CNS R1 GET CNS MVC 81(72),Al BALR 14,9 EX 3/E2 EXIT PC Е2 MVC 0(0,7),B2 * READ RDR R2 GET RDR/A6 CLC A6(2) , «С1 “*&& ’ BE P41 CLC A6(2), »C1 ’ BE R21 TO RDR EOF CLI A6/C,<R* BE R22 INVALID DATA MVC 81(80),A6 BALR 14,9 EX 3,E2 EXIT PC * RDR EOF R21 01 B3*4,X’1O' EXIT PC 52*
820 Приложение Н. Проврамма-монитор • INVALID DATA IN RDR R22 LA 2/20 МУС A7(I8)/D7 MVC A7*18(2),A6 PUT L0G/A7 В QU * LOG R3 ЕХ 3/E3 BALR 14/9 PUT LOG/Bl EXIT PC ЕЗ MVC B2(0)/0(7) * PCH R4 EX 3/E3 BALR 14/9 PUT PCH/B1 EXIT PC • LST R5 EX з,ез BALR 14/9 CNTRL LST/SP//O LTR 10/10 BNM R51 CNTRL LST/SP//1 R51 PRTOV LST/12/R53 R52 PUT LST/Bl EXIT PC R53 01 ВЗ+4/Х*10’ В R52 • SP LST R6 LA 0/3 OR 0,2 L 1/«A(LST) L 15/16(1) BALR 14/15 EXIT PC * SK LST R7 LA 0/131 В R6*4 * CR LOG R8 LTR 9/2 BE R51 LA 2/1 MVI A7/C’ ’ R81 PUT LOG/A7 BCT 9/R81 EXIT PC * EOJ R9 LA 2/3 PUT L0G/D6 В Q41 * PACKING ROUTINES S1 MVC B2(144)/B1 BR 14 S2 TR Bl/Cl PACK B2(8)/B1(15) PACK B2*7(8)/B1*14(15) PACK B2+14(8)/B1*28(15) PACK B2*21(8)/В1+42(15)
Приложение Н. Программа-монитора 821 РАСК B2+28C8),61*56(15) РАСК B2*35(8),81*70(15) РАСК B2*42(8),B1*84(15) РАСК B2*49(8),B1*98(15) РАСК B2*56(8),81*112(15) РАСК 82*63(8),61*126(15) РАСК 82*70(3),81*140(5) BR 14 S3 MVC B1(144),B2 BR 14 S4 UNPK 81(15),B2(8) UNPK 81*14(15),82*7(8) UNPK Bl*28(15),B2*14(8) UNPK 81*42(15),B2*21(8) UNPK 81*56(15),B2*28(8) UNPK Bl*70(15),B2*35(8) UNPK 81*84(15),B2*42(8) UNPK Bl*98(15)>B2*49(8) UNPK 81*112(15),B2+56(8) UNPK 81+126(15),82*63(8) UNPK 81*140(5),B2*70(3) TR 81,Cl BR 14 • INITIALIZATION Р1 BALR 9,0 USING *,9 L 11,-A(Q1*2) USING Ql*2,ll DROP 9 OPEN RDR,PCH,LST * CLEAR CORE L 3,C4 Р2 BCTR 3/0 MVI 0(3),X'00’ C 3,C3 BH P2 * START NEW JOB РЗ GET RDR,A6 Р31 CLC A6(2), •C,-'&&' BE P41 CLC A6(2), C'"’"’1 BNE PS « JOB CARD LA 2,8 SPM 2 PUT LOG,A6 CNTRL LST,SK,1 PUT LST,A6 • PROGRAM CARD Р4 GET RDR/A6 Р41 MVC Bl(8Cf),A6 BAL 14,S2 Nl B2,X'OO’ LM 9,10,82 SRL 10,8 CLC A6(2),=C,"'&&’ BE P7 CLC A6( 2), -C BE P6 CLI A6,C’9’
822 Приложение Н. П рограмма-монитор вн P5 CLI Аб/С'О1 BNL *♦12 CLI A6,C* ’ BNE P5 CLI A6*1,C'9' ВН P5 CLI Аб + ЪС'О’ BL P5 РАСК BU,A6(2) CVB 3,BU СН 3Z=H'36' ВН P5 BCTR 3/0 LTR 10,3 ВМ P5 AR 10,9 С 9,C3 BL P5 С 10, cu BNL P5 EX 3,E1 В P4 Е1 MVC 0(0,9),B2+U * PROGRAM CARO INVALID Р5 LA 2,29 MVC A7(21),D4 MVC A7+21(8),B1 PUT LOG,A7 В P31 * EXECUTE CARD Р6 MVC B5(U),C6 STXIT PC,Q1,B3 LTR 10,10 BCR 3,9 ST 10,B5 BR 9 « DUMP CARD Р7 STM 9,10,BL PDUMP B3,B3+71 LA 1,-CL8'SSBPDUMP1 LA 0,B4 $VC 2 LA 2,U PUT L0G,D5 В P3 * EOF ROUTINE Р8 CLOSE RDR,PCH,LST EOJ LTORG А1 DS CL72 CNS IOAREA1 А2 DS CL72 LOG IOAREA1 АЗ DS CL80 RDR IOAREAl А4 DS CL80 PCH IOAREA1 А5 DS CL1UU LST IOAREAl А6 DS CL80 RDR HORKA А7 DS CL72 LOG HORKA В1 DS CL145 UNPACKED AREA CNOP o,u В2 DS CL145 PACKED AREA ВЗ DS 18F SAVE AREA
Приложение Н. Программа-монитор 823 В4 DS D CVB-CVD В5 DS F USER PC ADDR. * TRANSLATION TABLE С1 DC 193X’OO' DC DC X'FAFBFCFDFEFF' UIX'OO' * DC C*O123U56789ABCDEF* ROUTINE TABLE С2 DC DC A(R1,S1) CNS FLl'1,72,0,0' DC DC A(R1,S2) CNS PACK FL1*1,36,0,1' DC DC A(R2,S1) RDR FL1*1,80,0,0' DC DC A(R2,S2) RDR PACK FL1'1,UO,0,1' DC DC A(R3,S3) LOG FLl'1,72,0,0' DC DC A(R3,SU) UNPK LOG FLl’1,36,0,1' DC DC A(R4,S3) PCH FLl’1,80,0,0' DC DC A(RU,S4) UNPK PCE FL1'1,UO,O,1* DC DC A(R5,S3) LST XL4*01900000* DC DC A(R5,SU) UNPK LST FLl'1,72,0,1' DC DC A(R5,S3) LST SP XLU*01908000' DC DC A(R5,SU) UNPK SP XLU'01U88001' DC DC DC A(R6) SP LST F'O' FLl'O,3,0,3' DC DC DC A(R7) SK LST F'O' FLl'1,12,0,3' DC DC DC A(R8) CR LOG F'O' FLl'O,3,0,O' DC DC DC A(R9) EOJ F'O' XLU'OOFFOOOO* СЗ DC F'12288* LOW CORE AODR CU DC F'65536' HIGH CORE ADDR С5 DC A(P31) EOJ ADDRESS Сб DC A(Q3) STD PC ROUTINE D1 DC CPROGRAM CHECK' D2 DC CI/O LENGTH CHECK' D3 DC C'l/O ADDRESS CHECK' DU DC CPROGRAM CARD INVALID ' D5 DC C'DUMP' D6 DC C'EOJ* D7 DC END CINVALID DATA CARD ' Pl
824 Приложение Н. Программа-монитор Пользователь в программе-мониторе должен задать границы области,' выделяемой для монитора. Для этого в поля СЗ и С4, которые содержат соот- ветственно самый маленький и самый большой адреса области, он должен поместить свои значения. Сама программа-монитор занимает немного мень- ше 4К. Все определения файлов (DTF) написаны для устройств 2540 и 1403. Работать программа может под управлением TOS или DOS. Для того чтобы ее можно было использовать при наличии только В OS, в ней следует изме- нить макрокоманду STXIT и определения файлов. Управляющие карты для монитора Карта JOB Колонки 1—2 -| 3—8 Название задания 9—80 Игнорируются Программные карты Колонки 1—2 Счетчик (десятичный) Число байтов на этой карте (01-36) 3—8 Начальный адрес памяти (шести.) 9—80 Команды и данные (шести.) Карта EXECUTE Колонки 1—2 ~1 = 3—8 Начальный адрес памяти (шести.) 9—14 Начальный адрес отладоч- ной программы (необязате- лен) 15—80 Игнорируются Карта EOJ Колонки 1—2 “1 * 3—80 Игнорируются Карта DUMP Колонки 1—2 и & 3—8 Начальный адрес памяти (шести.) 9—14 Конечный адрес (шести.) 15—80 Игнорируются Команд», моделируемые монитором Формат [SI] Aw хх BDDD w — шестнадцатеричная цифра, определяющая конкретную операцию хх — число байтов памяти (шести.), которые будут считываться или записываться BDDD — адрес в памяти первого байта в стандартной форме база-смещение В операциях управления BDDD игнорируется, a w принимает следую- щие значения: w = С Перевести на печатающем устройстве хх строк. 00 < хх 03 w = D Прогнать бумагу до пробивки в дорожке хх. 01 хх < 12 w = Е Возвратить каретку пультовой пишущей машинки, переведя хх строк. 00 < хх < 03 w = F Нормальное завершение задания, хх игнорируется. *4*-
Приложение Н. Программа-монитор 825 Таблица значений для w Операция Ввод с пишущей машинки Ввод с перфокарт Вывод на пишущую машинку Вывод на перфокарты Вывод на печатающее устройство без перевода строки Вывод на печатающее устройство с переводом одной строки Без упаковки Упаковать/Распаковать 0 1 2+ 3+ 4 5 6 7 8* 9+ А* В+ + Признак результата для указания конца страницы или конца файла принимает значение 1.
Приложение I УПРАВЛЯЮЩИЕ СИМВОЛЫ Печатающее устройство Ь Перевести перед печатью одну строку О Перевести перед печатью две строки — Перевести перед печатью три строки 4- Блокировать перевод строк перед печатью 1 Прогнать бумагу до пробивки в дорожке 1 2 Прогнать бумагу до пробивки в дорожке 2 3 Прогнать бумагу до пробивки в дорожке 3 4 Прогнать бумагу до пробивки в дорожке 4 5 Прогнать бумагу до пробивки в дорожке 5 6 Прогнать бумагу до пробивки в дорожке 6 7 Прогнать бумагу до пробивки в дорожке 7 8 Прогнать бумагу до пробивки в дорожке 8 9 Прогнать бумагу до пробивки в дорожке 9 А Прогнать бумагу до пробивки в дорожке 10 В Прогнать бумагу до пробивки в дорожке 11 С Прогнать бумагу до пробивки в дорожке 12 Карточные перфораторы V Выбрать приемный карман № 1 W Выбрать приемный карман № 2
Приложение J ОСНОВНЫЕ СВЕДЕНИЯ О ЯЗЫКЕ АССЕМБЛЕРА ФОРМАТЫ КОМАНД Машинный Ассемблера Команды Все команды RR, Код операции «1 J_*L_ кроме SPM и SNG I I 1 RR \Код операции | L"l it SPM операции I X SVC I Ri. Dz(Xi.Bt) Все команды RX RX Код операции R1 I хг _ed_ Ri,StO<a I RbRj^CW BXH, BXLE, STM и Код операции «1 I R3 8» I 01 Ri, R* S2 LM RS I I I Rn Все команды сдвига Код операции] I R1 W * °* 1 | Ri, s2 1 1г Si, 12 NI, CLI, OI, XI, TM, MVI, RDD, WRD Код операции It в< 1 D1 SI I J I I I I I Dt(Bt) SIO, НЮ, ТЮ, TCH, \Код операции] шш 1 * 1 О, I 1 «• SSM, LPSW, TS 1 d 1 Код операции L1 [ к Bi 1 Di В2 | Da SS 1 1 1 MLi. В,), SiCLa) 5,(ц),ад.2,вд AP, SP, MP, DP, CP, ZAP, MVO, PACK, UNPK \код операции\ 1- 1 * L °, 1 1 8« 1 1 D2(B9 ЦО-, ВД SfW, S^ NC, CLC, ОС, XC, MVC, MVN, MVZ, TR, TRT, EDMK, ED Обозначения к форматам команд Ri, R2, R3: Абсолютные выражения, определяющие регистры. Df, D2: Абсолютные выражения, не превышающие 4096, определяю- щие смещения. Bi, В2: Абсолютные выражения, определяющие регистры базы. Х2: Абсолютное выражение, определяющее регистр индекса. L, Li, Ь2: Абсолютные выражения, определяющие длины полей. I, 12: Абсолютные выражения, представляющие непосредственные данные, от 0 до 255. Sb S2: Абсолютные или перемещаемые выражения, определяющие адреса памяти.
КОНСТАНТЫ Тип Неявная длина (в байтах) Границы размещения в памяти Максимальная длина (в байтах) Задается Опреде- ление несколь- ких констант Усечение- дополнение 1 2 3 4 5 6 7 С по потребности байт DC: .1-256 DS: .1-65536 символами нет справа В по потребности байт .1-256 двоичными цифрами нет слева X по потребности байт DC: .1-256 DS: .1-65536 шестнадцатеричными цифрами нет слева н 2 полуслово .1—8 десятичными цифрами да слева F 4 слово .1—8 десятичными цибрами да слева Е 4 слово .1-8 десятичными цибрами да справа D 8 двойное слово .1—8 десятичными циорами да справа Z по потребности байт .1—16 десятичными цибрами да слева Р по потребности байт .1—16 десятичными цифрами Да слева А 4 слово см. замеч. любым выражением да слева Y 2 полуслово см. замеч. любым выражением Да слева V 4 слово см. замеч. перемещаемым именем Да слева S 2 полуслово 2 абсолютным выражением; перемещаемым выраже- нием; двумя абсолютными выражениями в форме выражение (выражение) да не делается оо £ Приложение J. Основные сведения о языке Ассемблера Замечания: Перемещаемые константы типа Y должны иметь длину 2 байта; перемещаемые константы типа А должны иметь длину 3 или 4 байта. Абсолютные константы типа Y имеют длину от 1 до 2 байтов| абсолютные константы типа А имеют длину от 1 до 4 байтов. Константы типа V должны иметь длину 3 или 4 байта. Область значений порядка: от —85 до 4-75 (только для констант типа Ht F, Ви D) Область значений масштаба: от —187 до 4-346 для констант типа Н и F, от 0 до 14 для констант типа D и Е.
Приложение J, Основные 'Сведения о языке Ассемблера 829 РАСШИРЕНИЕ МНЕМОНИЧЕСКИХ КОДОВ ДЛЯ КОМАНД УСЛОВНОГО ПЕРЕХОДА (ВС) Расширенная Название Машинная мнемоника команда BR Безусловный переход BCR 15, R2 NOPR Нет операции BCR o,r2 В NOP Безусловный переход Нет операции вс ВС 15,8 0,8 Используются обычно после сравнения: ВН Переход, если больше ВС 2,s BL Переход, если меньше ВС 4,8 BE Переход, если равно ВС 8,s BNH Переход, если не больше ВС 13,8 BNL Переход, если не меньше ВС 11,8 BNE Переход, если не равно ВС 7,8 Используются обычно после команд арифметических операций: во Переход, если переполнение ВС 1,8 ВР Переход, если плюс ВС 2,8 ВМ Переход, если минус ВС 4,8 BZ Переход, если нуль ВС 8,8 BNO Переход, если не переполнение ВС 14,8 BNP Переход, если не плюс ВС 13,8 BNM Переход, если не минус ВС 11,S BNZ Переход, если не нуль ВС 7,8 Используются обычно после команды Проверить по маске (ТМ): во Переход, если единицы ВС 1,8 ВМ Переход, если смесь ВС 4,8 BZ Переход, если нули ВС 8,з BNO Переход, если не единицы ВС 14,8 BNM Переход, если не смесь ВС 11,8 BNZ Переход, если не нули ВС 7,8 В командах с расширенной мнемоникой записывается только один операнд; этот операнд становится вторым операндом оттранслированной команды.
830________Приложение J. Основные сведения о языке Ассемблера КОМАНДЫ УПРАВЛЕНИЯ ТРАНСЛЯЦИЕЙ Метка ОР Операнды [имя] START абсолютный адрес пробел СОМ пробел [имя] CSECT пробел имя DSECT пробел пробел ENTRY гь . . . пробел EXTRN Г1, . . . пробел USUJIG v,rj, . . . пробел DROP Г1, . . . пробел ORG [перемещаемое-выражение] [имя] LTORG пробел пробел COPY имя [имя] DC [кратность] тип [L длина] [S мас- штаб] (Е экспонента] константа . . . [имя] DS [кратность] тип [L длина] [S мас- штаб] [Е экспонента] [константа] . . . [имя] CCW операция,адрес данных,признаки, счетчик имя EQU выражение пробел CNOP b,w пробел END [перемещаемое-выражение] • пробел ICTL начало,конец,продолжение (номера колонок) [имя] TITLE 'символы' пробел PUNCH 'символы' пробел REPRO пробел пробел EJECT пробел пробел SPACE [число пропусков] пробел ISEQ [ левая-колонка ,правая-колонка] пробел PRINT по крайней мере одно из: ON | OFF; GEN | NOGEN; DATA | NODATA
Приложение J. Основные сведения о языке Ассемблера_831 ТАБЛИЦА СРАВНЕНИЯ ЯЗЫКОВ АССЕМБЛЕРА 8K 16К OS Число карт продолжения (к макрокомандам не отно- сится) 1 1 2 Число уровней скобок в выражениях 1 3 5 Число термов в выражении DC и DS: 3 8 16 Задание модификаторов длины, масштаба и экс- < поненты в виде выраже- ний нет да да Коэффициент кратно- сти, не равный 1 Исключая S да да Указание длины в битах нет нет Да Задание в операнде не- скольких констант Исключая A, S, V, Y Да да Задание нескольких опе- рандов нет нет Да Максимальная длина в DS 256 65536 65536 Разрешается использова- ние оператора COPY нет да Да Разрешается использова- ние оператора СОМ нет да да Число операндов в USING 6 17 17 Число операндов в DROP 5 16 16 Допустимое число опе- рандов в ENTRY 1 100 100 Допустимое число опе- рандов в EXTRN 1 не ограни- чено не ограни- чено Разрешается использова- ние PUNCH нет Да да Разрешается использова- ние выражений в CNOP нет да Да DTFSR, DTFIS, DTFDA, DTFPH да да нет DTFCD, DTFPR, DTFMT, dtfcn, dtfsd нет да нет DCB нет нет да
Приложение К ОСНОВНЫЕ СВЕДЕНИЯ О DOS ЗАГРУЗКА НАЧАЛЬНОЙ ПРОГРАММЫ (IPL) 1. Включить CPU. На модели 30 включить также устройство 1051. Все остальные контроллеры обычно получают питание от CPU. 2. Установить пакет дисков SYSRES — резидент системы. Если исполь- зуется отдельный рабочий пакет, установить и его. 3. В системное читающее устройство (SYSRDR) поместить следую- щие карты: ADD (необязательная) DEL (необязательная) * SET (необходимая) карты управления заданием 4. На переключателях блока загрузки набрать адрес резидента SYSRES. 5. После того как загорятся индикаторы готовности на дисковых меха- низмах, нажать клавишу загрузки. 6. Если SYSRDR перейдет в состояние готовности после операции загрузки, то прерывание от SYSRDR вызовет считывание первых карт и начало обработки. Если SYSRDR окажется готовым до того, как завер- шится операция загрузки, надо нажать клавишу прерывания и тем самым вызвать начало обработки. Управляющая команда ADD имеет вид ADD X'cun',тип, где тип задается следующим образом: 2400Т9 (9-дорожечная лента) 1442N1 1442N2 2501 2520В1 2520В2 2520ВЗ 2540R (читающее устройство) 2540Р (перфоратор) 1050А (для пультовой пишущей машинки 1052) 1403 1404 1443 1445 2311 2321 2671 UNSP (нестандартное устройство) UNSPB (нестандартное устройство, монопольный режим)
Приложение К. Основные сведения о DOS 833 Команда ADD служит для того, чтобы добавить указанное устройство к таб- лице всех работоспособных устройств, составляемой во время генерации супервизора. Управляющая команда DEL имеет вид DEL X'cuu' и служит для того, чтобы из таблицы работоспособных устройств указанное устройство удалить. Команда SET записывается в виде SET DATE = mm/dd/yy,CLOCK = hh/mm/ss или SET DATE = dd/mm/yy,CLOCK = hh/mm/ss в зависимости от того, какой вид даты был выбран при генерации системы. Операнд CLOCK опускается в том случае, когда в системе не установлен таймер. Если же таймер установлен, то даже тогда, когда он отключен, этот операнд писать совершенно необходимо. Карты ADD и DEL должны всегда подаваться перед картой SET, а сами могут ставиться в любом порядке. Карты ADD и DEL используются только в период загрузки начальной программы. УПРАВЛЯЮЩИЕ КОМАНДЫ ОПЕРАТОРА ЗА ПУЛЬТОМ (выдаются между заданиями) ASSGN SYSnnn,X'cuu'[,ALT][,TEMP]. Операнд ALT указывает, что устройство должно использоваться как альтернативная лента. Операнд TEMP означает, что сделанное распределение устройств действует только до того момента, когда считывается очередная карта JOB, а после этого имеет место стандартное распределение для системы. Если операнд TEMP отсутствует, все сделанное распределение считается действительным до сле- дующей IPL или другой команды ASSGN. Вместо ALT можно указать: Х'СО' определяет ленту с плотностью записи 1600 байт/дюйм Х'С8' определяет ленту с плотностью записи 800 байт/дюйм UА определяет устройство, которое не должно выделяться при распределении устройств IGN определяет устройство, все обращения к которому должны . игнорироваться CLOSE SYSnnn [,X'cuu'[,X'Cx']] CLOSE SYSnnn [,UA или IGN или ALT]. Указанный файл на ленте или диске закрывается. Если имеется операнд X'cuu', то SYSnnn назначается вновь точно так же, как и по команде ASSGN. Если имеется UA или IGN, то действие точно такое же, как и при употреблении команды ASSGN. Указание ALT закрывает файл и открывает файл на альтернативной ленте. DVCDN X'cuu'. Устройство объявляется недоступным. DVCUP X'cuu'. Устройство объявляется доступным. RESET устройство. Распределение устройств, сделанное с указанием TEMP, отменяется. В качестве операнда устройство можно указать: 53 Зак. 15635
834 Приложение К. Основные сведения о DOS SYS Все системные устройства (все, кроме SYS000 — 244) PROG Все устройства программиста (SYS000 — 244) ALL Все устройства SYSnnn Отмена касается только указанного устройства LIST 10 устройство. Печатается действующее в данный момент распре- деление устройств. В качестве операнда устройство можно указать: SYS PROG ALL SYSnnn DOWN Печатаются недоступные устройства, исключенные коман- дой DVCDN UA Печатаются устройства, которые при распределении не должны выделяться UNITS Печатаются логические устройства, выделенные каждому SYSnnn X'cuu' Печатаются системные имена, присвоенные данному физи- ческому устройству SET. Можно указать от одного до шести операндов: DATE — mm/dd/yy или DATE = dd/mm/yy CLOCK = hh/mm/ss UPSI = хххххххх LINECT = nn, где 30 < nn < 99 RCLST = n, где n — десятичное целое RCPCH = n, где n — десятичное целое Операнды разделяются запятыми. Указание DATE вызывает смену даты, установленной во время загрузки начальной программы. CLOCK изменяет таймер. UPSI устанавливает байт UPSI. Если при записи байта указано в одной из позиций X, то соответствующий этой позиции бит не изме- няется. Указание 1 или 0 заставляет установить соответствующий бит в 1 или вО. Если будет указано менее 8 символов, то считается, что в допол- няющих до 8 позициях справа стоят X. Операнд LINECT определяет число строк на Странице для SYSLST. Операнды RCLST и RCPCH используются только в том случае, когда для SYSLST (RCLST) или SYSPCH (RCPCH) отведен диск, п обозначает число записей, которые можно записать на экс- тент до того момента, как оператору выдается сообщение о том, что область близка к заполнению. PAUSE (комментарии]. Печатается комментарий, если он задан, и затем выдается сообщение 1С00А READY FOR COMMUNICATION (готова для связи с оператором) В качестве ответа может быть послана любая команда оператора или любой оператор управления заданием. Самым последним должно быть выдано ЕОВ (Сигнал подается одновременным нажатием клавиши ALTN CODING и клавиши с цифрой 5),
Приложение К. Основные сведения о DOS 835 что вызывает возобновление обработки. CANCEL [BG]. Команда вызывает прекращение работы фоновой про- граммы/ Все карты, включая первую карту/&, читаются и игнорируются. LOG. Команда вызывает печать на SYSLOG всех карт управления заданием. NOLOG. Команда прекращает дальнейшую печать управляющих карт на SYSLOG. ЕОВ (одновременное нажатие клавиши ALTN CODING и клавиши 5). Команда прекращает ввод команд оператора с машинки пульта. Это просто дополнение к обычному употреблению ЕОВ для прекращения любого ввода с машинки пульта. МАР. Команда вызывает распечатку областей памяти, выделенных для каждой программы. МТС операция,X'cuu'[,nn] МТС операция,SYSnnn [,пп]. Команда вызывает осуществление опе- рации управления пп раз. Если пп не указано, предполагается, что пп = 01. В качестве операции указываются операции, аналогичные осуществляемым макрокомандой CNTRL. Здесь можно задать BSP, BSR, ERG, FSF, FSR, RUN, REW или WTM. TIMER программа. Команда выделяет таймер для использования ука- занной программой. Программа задается указанием: BG (фоновая про- грамма), F1 (высокоприоритетная программа 1), F2 (высокоприоритетная программа 2). FETCH имя-фазы[, имя-точки-в хода]. FETCH имя-фазы[,(г)]. Команда вызывает считывание указанной фазы из библиотеки готовых программ и выполнение ее. Если записано (г), то выполнение фазы начинается с адреса, хранящегося в регистре г. Если в команде записывается имя-точки-входа, то выполнение фазы начинается с этой точки. Во всех остальных случаях используется обычный вход в фазу. LOAD имя-фазы[,адрес] LOAD имя-фазы[,(г)]. Эта команда вызывает только загрузку фазы без ее выполнения. Адрес точки входа помещается в регистр 1. В осталь- ном аналогична FETCH. ЯЗЫК УПРАВЛЕНИЯ ЗАДАНИЯМИ // JOB имя-задания. В имя-задания входит от одного до восьми симво- лов. Сбрасываются байт UPSI, область связи и временное распределение устройств. И ASSGN SYSnnn,X'cuu'[, спецификация]. Спецификация может быть любой допустимой в команде оператора ASSGN, кроме TEMP. Все карты ASSGN в задании задают временное распределение. И RESET устройства. Отменяет распределение таким же образом, как и команда оператора с пульта. И DATE mm/dd/yy, // DATE dd/mm/yy. Очередная карта JOB сбрасы- вает заданную этой картой дату, восстанавливая дату, определенную при IPL. 53*
836 Приложение К, Основные сведения о DOS И UPSI хххххххх. Байт устанавливается точно так же, как и коман- дой SET UPSI. И LIST 10 устройства. Устройства указываются так же, как и в ко- манде оператора за пультом LIST 10. И МТС операция, SYSnn[,nn]. Действие такое же, как и по команде оператора за пультом МТС. /♦ Конец данных. /& Конец задания. ♦ Комментарии. И PAUSE [комментарии]. Аналогична команде оператора за пультом PAUSE. И ЕХЕС [имя-фазы]. Вызывает выполнение указанной фазы. Имя-фазы опускается, когда фаза по окончании работы Редактора связей помещается (пусть даже временно) в библиотеку готовых программ. К стандартным име- нам фаз для компиляторов и ассемблера относятся ASSEMBLY, COBOL, FORTRAN, RPG, PL/1 и LINKEDT. 11 LBLTYP TAPE[nn]. I I LBLTYP NSD[nn]. Для ленты nn игнорируется. Для диска пп озна- чает число помеченных файлов, не являющихся последовательными, метки которых должны быть проверены. Если встречаются и файлы на диске, и файлы на ленте, то в команде используется операнд NSD. И VOL SYSnnn,имя-файла. Команда нужна для помеченных файлов. И DLAB 'поля метки 1—3'xxxx,yyddd,yyddd,'K0fl системы' [,тип]. хххх обозначает порядковый номер тома. Пара yyddd указывает дату созда- ния и срок хранения данных. Код системы при вводе игнорируется, но при выводе записывается. Тип может задаваться следующим образом: SD (после- довательный), DA (прямой), ISC (создаваемый индексно-последовательный файл) или ISE (существующий IS файл). В том случае, когда тип опущен, он принимается равным SD, если тома, содержащие экстенты файла, уста- новлены не все сразу. Если же установлены сразу все экстенты, то тип принимается равным DA. И TPLAB 'поля метки 3—10'. Поля метки берутся из головной метки ленты. И XTENT тип,порядковый-номер,нижняя-граница,верхняя-граница, 'серийный-номер',8У8ххх [,В2]. В качестве операнда тип берется 1 для. областей данных, 128 для областей данных, коллективно использующих группу цилиндров; 2 берется для областей переполнения при индексно- последовательной организации, а 4 — для областей индекса. Операнд поряд- ковый-номер указывает порядковый номер этого экстента. Два операнда нижняя-граница и верхняя-граница задают границы экстента в виде BCGCGCHHH (шести.). Операнд серийный-номер определяет серийный номер тома (шестизначный). В2 — это текущий номер ячейки на 2321. Для 2311 (накопителя на дисках) В2 == 0.
Приложение К. Основные сведения о DOS 837 Некоторый набор функциональных возможностей (стандартный набор) определяется вовремя генерации системы. Изменения в этом наборе можно указать с помощью карты OPTION. Если перед названием возможности ставится NO, это означает, что возможность не нужна для данной работы. Следовательно, запись NOLOG отменяет ранее указанное LOG. Оператор OPTION имеет следующий вид: // OPTION возможность],возможности, . . . Можно указать следующие возможности: LOG Все управляющие карты печатаются на SYSLST. DUMP В случае аварийного окончания программы предусматри- вается дампинг памяти. LINK Выход после работы ассемблера или компилятора записы- вается на SYSLNK, чтобы впоследствии он мог использо- ваться Редактором связей. DECK Выход после работы ассемблера или компилятора перфо- рируется на картах. DECK и LINK несовместимы, т. е. если указывается DECK, то предполагается NOLINK, и, наоборот, указание LINK предполагает NODECK. LIST Исходная программа записывается на SYSLST. LISTX Компилятор с Кобола записывает объектную программу на SYSLST. SYM Если указано NODECK, то ассемблер печатает таблицу имен на SYSLST, а если указано DECK, то эта таблица перфорируется на SYSPCH. SYMX Компилятор с Кобола записывается на SYSLST или пер- форирует на SYSPCH адреса данных. XREF Ассемблер записывает на SYSLST таблицу перекрестных ссылок. ERRS Компиляторы Кобол и Фортран выдают сводку ошибок на SYSLST. 48С Для PL/1 принимается набор из 48 символов. 60С Для PL/1 принимается набор из 60 символов. CATAL Объектная программа должна каталогизироваться в библио- теке готовых программ. CATAL включает в себя LINK.
Приложение L ОСНОВНЫЕ СВЕДЕНИЯ ОБ OS ЗАГРУЗКА НАЧАЛЬНОЙ ПРОГРАММЫ 1. Установить резидентный(е) пакет(ы) и нужное количество рабочих пакетов. 2. Привести карточное читающее устройство и печатающее устройство или же устройства, используемые для осуществления этих функций, в состояние готовности. 3. На переключателях блока загрузки набрать адрес резидентного пакета системы. 4. После того как загорится индикатор готовности устройства с рези- дентным пакетом, нажать клавишу загрузки. 5. Через несколько мгновений будет напечатано сообщение READY. Нажать на консоли клавишу запроса и набрать SET DATE = yy.dddf, CLOCK = hh.mm.ss] Если операнд CLOCK опущен, будет считаться, что действует операнд CLOCK — 00.00.00. Для того чтобы сообщить об окончании набора, подайте сигнал ЕОВ, нажав для этого одновременно клавишу 5 и клавишу ALTN CODING. При наборе команды пробелы должны быть только после слова SET. 6. Если стандартные SYSIN и SYSOUT = А были определены во время генерации системы, то на пульте будут печататься сообщения START RDR,cuu START WTR,cuu где cuu является адресом канала-устройства. Если эти сообщения не появят- ся, их следует напечатать, когда будет выдано очередное сообщение READY. 7. Если необходимо отключить или подключить к системе какие-то устройства, вводится команда VARY cuu,OFFLINE или VARY cuu,ONLINE 8, Самой последней командой вводится команда START без параметров. Перед вводом каждой команды должна нажиматься клавиша запроса (Request). Каждая команда для системы должна заканчиваться подачей сигнала ЕОВ. КОМАНДЫ ОПЕРАТОРА ЗА ПУЛЬТОМ Обычная процедура выдачи команды заключается в следующем: сна- чала для того, чтобы привлечь внимание управляющей программы, нажи- мается клавиша запроса, а затем выдается команда. Каждая команда для системы заканчивается выдачей сигнала ЕОВ (нажатие клавиши ALTN
Приложение L. Основные сведения об OS 839 CODING и клавиши с цифрой 5). Для управляющей программы РСР используются обычно следующие команды оператора: CANCEL имя-задания!, DUMP] Если указывается операнд DUMP, то при аварийном прекращении задания осуществляется дампинг. DISPLAY JOBNAMES Имя каждого задания печатается на пульте в начале и конце его выполнения. STOP JOBNAMES Отменяет печать имен заданий. UNLOAD cuu Подготавливает устройство uu в канале с для разгрузки (снятия лент ит. п.). Когда устройство готово для разгрузки, выдается сообщение оператору. MOUNT cuu[,VOL= ШЕ,серийный-номер)] Команда MOUNT может выдаваться только для таких устройств, которые были разгружены системой. После выдачи команды требуе- мое устройство становится доступным без последующих разгрузок. Второй операнд задается только для непомеченных лент. Определяет он шестизначный серийный псевдономер тома. REPLY ид, 'текст* Операнд ид представляет собой двузначный печатаемый системой идентифицирующий код. В команде этот код повторяется для того, чтобы информировать систему о том, на какое ее сообщение выдается ответ. REQ Запрос к управляющей программе дать сообщение READY при пер- вой возможности. Команды SET и START не могут вводиться в систе- му иначе, чем в ответ на сообщение READY. SET IDATE=yy.ddd],(CLOCK=hh.mm.ss],[Q=cuu],[P=cuu] Операнды отделяются запятыми. Вводить их можно в любом поряд- ке. Р и Q могут вводиться только во время загрузки начальной про- граммы. Р и Q определяют устройства с прямым доступом, содер- жащие библиотеку процедур (Р) и рабочие очереди (Q). START RDR,cuu[,VOL = cepnHHbifi-HOMep][,DSN = имя-набора-данных] [,FILESEQ = порядковый-номер-файла] Если указывается операнд VOL, то проверяется серийный номер тома. Если задается DSN, то используется указанное имя набора данных, в противном случае используется SYSIN. Если задается FILESEQ, то для ленты используется четырехзначный порядковый номер файла. START WTR [,УОЬ=серийный-номер] Если задается операнд VOL, то проверяется серийный номер тома. Эта команда определяет устройство SYSOUT = А.
840 Приложение L. Основные сведения об OS START Операндов нет. Эта команда должна быть последней среди выдавае- мых оператором в ответ на сообщение READY. Она вызывает возоб- новление работы системы. VARY cuu, OFFLINE VARY cuu, ONLINE OFFLINE означает, что устройство отключается от системы и ника- кие наборы данных в дальнейшем не должны размещаться системой на этом устройстве. В тот момент, когда пользователи закончат работу с устройством, оператору будет послано соответствующее сообщение. ONLINE означает, что устройство снова стало доступным для раз- мещения на нем наборов данных. ЯЗЫК УПРАВЛЕНИЯ ЗАДАНИЯМИ Карта JOB //имя-задания J ОВ (учетный-номер,дополнительная-учетная-информация), программист, ключевые-параметры Все операнды необязательны. Если имя программиста, указываемое в операнде программист, содержит пробелы или запятые, то его надо поставить в кавычки. Первые два позиционных операнда и все клю- чевые операнды отделяются запятыми. Если оба первых операнда опущены, то опускаются и стоящие за ними запятые. В предложении могут задаваться следующие ключевые параметры: MSGLEVEL= {0 | 1} Уровень 1 означает, что выдаваться будут все управляющие карты. Уровень 0 означает, что выдаваться будут только диагностические сообщения об ошибках. Если параметр опущен, то предполагается, что задано MSGLEVEL = 0. GOND = ((кодоперация), (код,операция), . . .) Код— это любое число из диапазона 0—4095. В качестве операции указывается какая-либо операция отношения из следующего перечня: GT (>), GE (», EQ (=), LE (<), NE (=/;). Если выдаваемый в про- цессе выполнения задания код возврата удовлетворяет отношению: код операция код-возврата (например, если задано (код, операция) — = (13, LT), а код возврата = 16, то отношение 13 < 16 верно), то оставшиеся шаги задания обходятся. Карта ЕХЕС //[имя-шага] ЕХЕС процедура-или-программа,ключевые-параметры Имя-шага задается только в том случае, если впоследствии на него будут ссылки. В качестве первого операнда может быть: имя-процедуры PROC = имя-процедуры PGM = имя-программы PGM = *. шаг-задания.[шаг-процедуры.](1(1имя
Приложение L. Основные сведения об OS 841 Ключевые параметры представляют собой следующее: СО ND[. имя-шага] = ((код, операция[, имя-шага]), . . .) Имя-шага можно задавать только для процедуры. Оно определяет шаг, для которого требуется проверить код возврата. Проверка осу- ществляется точно так же, как и при указании параметра COND в операторе JOB. Единственное различие заключается в том, что- здесь при выполнении условия обходиться будет только этот шаг задания. АССТ [.имя-шага] = (учетная-информация) Имя-шага указывается только для процедур. Форма дополнительной учетной информации зависит от имеющихся в установке учетных программ. PARAM [.имя-шага] =(...) Имя-шага указывается только для процедур. В круглых скобках записываются разделяемые запятыми параметры. Эти параметры передаются шагу задания. См. ниже о стандартных параметрах. Карта DD //[имя]. DD по з и ционный-опе ранд, ключевые -one ранды В качестве имени задается либо (Мимя, либо таг-процедуры.(1с1имя. Они определяют имя предложения DD. Если задан шаг-процедуры, то определение имени распространяется только на указанный шаг. В качестве позиционного операнда можно указать: * Следом во входном потоке идут данные. Появление- в колонках 1—2 данных символов // считается ошибкой.. DATA Имеет тот же смысл, что и ♦, но символы И в колонках 1—2 допускаются. DUMMY Все обращения к этому набору данных должны игно- рироваться. Все ключевые операнды являются необязательными. Они отделяются друг от друга запятой. DSNAME = ааимя Определяется псевдонабор данных для того, чтобы последующие кар- ты DD могли свои параметры просто копировать. DSNAME = dsHMa[ (элемент)] DSNAME = *.[шаг-задания.[щаг-процедуры.]]ааимя DSNAME = & имя[ (элемент)] дгимя определяет имя набора данных, которым пользуется обраба- тывающая программа. Элемент определяет конкретное поколение набора данных (номер поколения). Указание dd имени означает, что- параметры должны скопироваться из предыдущего предложения DD. &имя определяет имя временного набора данных, который исчезает одновременно с концом задания. DCB = (dsHMH, [список подпараметров]) DCB = (♦.[шаг-задания. [шаг-процедуры.]] ddnMH, [список-подпараметров]> 55 Зак. 15635
842 Приложение L. Основные сведения об OS DCB = (,[ список-под параметров]) Если задается йзимя или dduMa, то параметры копируются из соот- ветствующего предложения DD. Подпараметры, указанные в списке подпараметров, заменяют скопированные значения. Здесь можно указать любые операнды макрокоманды DCB, которые разрешается определять в картах DD (см. рис. 19.1). 1Ш1Т=имя,п[,DEFER][,SEP=(ddHMH, . . .)][,AFF=ddnMH] В качестве имени можно указывать: (а) спи или (Ь) класс устройств (например, SYSDA, SYSSQ, SYSCP). Набору данных выделяется п устройств. Если п опущено, считается, что n= 1. Если записы- вается DEFER, то это означает, что том можно не устанавливать до открытия набора данных. Задавая SEP, можно указывать не более восьми наборов данных. При наличии SEP набор данных, к которому относится DD, помещается на устройство, отличающееся от тех, где находятся указанные в круглых скобках наборы данных. Указа- ние AFF означает, что набору данных должно (должны) отводиться то (те) же устройство (а), что и для набора данных с заданным ddименем. SPACE = TRK,(ochobh [, до поля]) SPACE = CYL,(ochobh [, дополн]) SPACE — с редня я-длина-за писи, (основы [, дополн]) SPACE = ABSTR, (число-дорожек, начальный-адрес) Основн определяет основное пространство, т. е. число дорожек, цилиндров или длин записи, которые отводятся для набора данных на устройстве с прямым доступом. Дополн определяет дополнитель- ное пространство, которое будет отведено набору данных в том слу- чае, если исчерпается основное. ABSTR означает, что набор данных на DASD неперемещаемый. Начальный-адрес представляет собой относительный номер дорожки (дорожка 0 цилиндра 0 считается рав- ной 0). Если операнд SPACE задается для выделения памяти на устройствах не DASD, то он просто игнорируется. VOLUME = SER = (серийный-номер, . . .) VOLUME = REF = бзимя VOLUME = REF = ♦. [шаг-задания. [шаг-процедуры.]] ббимя Указание SER означает, что должны быть проверены заданные в скоб- ках серийные номера томов. REF означает, что для данного набора данных должен использоваться тот же том, который используется набором данных, определенным деименем или ддименем. LABEL = ([порядковый-номер-набора-данных],тип-метки,[срок-хранения]) Первая запись задает относительное расположение набора данных на ленте. Если этой записи нет, то считается, что на ленте только один набор данных. Тип-метки можно указать следующим образом: NL (набор данных без меток), SL (стандартные метки), NSL (нестан- дартные метки), SUL (стандартные метки и метки пользователя).
Приложение L. Основное сведения об OS 843 Если тип не указан, принимается SL. Срок хранения может зада- ваться в форме EXPDT = yyddd (дата, до которой нужно хранить) или в форме RETPD = хххх, где хххх равно числу дней, в течение которых нужно хранить набор данных. SYSOUT = А Набор данных должен быть записан на устройстве, определенном в команде SET WTR. DISP = (тип, диспозиция) Этот операнд описывает статус набора данных и определяет действия, которые нужно предпринять с набором данных по окончании шага задания, содержащего описание этого набора. Тип может быть NEW, OLD или MOD. Если тип не указан, принимается NEW. Тип MOD означает, что набор существует и к нему будут добавляться записи. В качестве диспозиции можно задать DELETE, KEEP, PASS, CATAL или UNCATAL. Диспозиция CATAL включает в себя KEEP и вызы- вает каталогизацию набора данных и соответствующую запись в ин- дексе наборов. Указание KEEP служит для того, чтобы набор данных хранился нетронутым до тех пор, пока не будет задано DELETE. Указание DELETE вызывает затирание памяти, занимаемой набо- ром данных, одновременно с концом шага задания. Передача набора данных от одного шага задания следующему обеспечивается указа- нием PASS. Диспозиция UNCATAL означает, что набор данных выводится из каталога, т. е.' просто удаляется индексная запись, а набор данных не затирается. Для одного и того же набора данных нельзя одновременно указы- вать и DISP, и SYSOUT. ПАРАМЕТРЫ КАРТЫ ЕХЕС ДЛЯ КАТАЛОГИЗИРОВАННЫХ ПРОЦЕДУР Язык Ассемблера DECK |NODECK LOAD|NOLOAD LIST | NOLIST TEST |NOTEST XREF|NOXREF LINECNT = nn Объектный модуль выдается на пер- фокарты. Объектный модуль записывается для Редактора связей. Выдается ассемблером листинг. В объектный модуль включаются программы TESTRAN. Выдается таблица перекрестных ссылок. Число строк на странице. 01 < пп < <99. При отсутствии параметра пп = 56.
844 Приложение L. Основные сведения об OS Фортран DECK | NODECK Объектный модуль выдается на пер- фокарты. LOAD | NOLOAD Объектный модуль записывается для Редактора связей. MAP|NOMAP Печатается распределение памяти объектной программы. SOURCE | NOSOURCE Выдается распечатка исходной про- граммы. BCD | EBCDIC Код, в котором написана исходная программа. SIZE = yyyyyyy Объем памяти в распоряжении ком- пилятора. При отсутствии парамет- ра считается 15360 байтов. LINELNG= zzz Число позиций при печати на стро- ке. При отсутствии параметра счи- тается равным 132. Максимально до- пустимое число 255. NAME = xxxxxx Имя-программы. При отсутствии па- раметра берется MAIN. Кобол DECK |NODECK Объектный модуль выдается на пер- фокарты. LIST | NOLIST Выдается распечатка исходной про- граммы. DMAP | NODMAP Печатается список адресов названий данных. PMAP | N OPMAP Распечатывается объектная програм- ма. MAPS | NOMAPS DMAP и РМАР. DISPCK | NODISPCK В объектной программе будет осу- ществляться проверка длины полей в DISPLAY. FLA GW | FLA GE Печатаются только сообщения об ошибках (Е) или включается также и печать предостережений (W). LINECNT = nn Число строк на странице. BUFSIZE = nn Размер буферов для компилятора. Максимально допустимо 32760 бай- тов. PL/1 DECK |NODECK Объектный модуль выдается на пер- фокарты.
Приложение L. Основные сведения об OS 845 LOAD |NOLOAD Объектный модуль записывается для LIST | NOLIST Редактора связей. Выдается распечатка объектной про- SOURCE|NOSOURCE граммы. Выдается распечатка исходной про- EXTREF|NOEXTREF граммы. Распечатывается Словарь внешних ATR |NOATR XREF|NOXREF BCD |EBCDIC имен. Выдается перечень атрибутов иден- тификаторов. Выдается таблица перекрестных ссылок для идентификаторов. Код, в котором пишется исходная CHAR60 | CHAR48 программа. Набор символов для исходных опе- FLA GW | FLAGE | FLAGS раторов. Печатаются только серьезные ошиб- SIZE = yyyyyy LINECNT = nnn OPT = nn SORMGIN = (mmm, nnn) ки (S), серьезные и все остальные (Е) или вообще все диагностические сообщения (W). Объем памяти в распоряжении ком- пилятора. При отсутствии парамет- ра считается 45056 байтов. Число строк на странице. При от- сутствии параметра ппп — 50. Уровень оптимизации объектной программы. При отсутствии пара- метра пп=00 (без оптимизации). Границы поля исходных операторов на карте. При отсутствии параметра считается (2, 72). Самыми крайними значениями могут быть (1,100). При отсутствии параметра берется его подчеркнутое значение.
ОТВЕТЫ К УПРАЖНЕНИЯМ Упражнения № 1 1. (a) 4J5J2 (Ь) »41 (с) RIZR@P (d) fHHfH + означает не определенный символ. 2. (а) # + : = ' (Ь) $ # = (с) Hf | H$Y (d) (ff;f f означает не определенный символ. 3. (а) , (b) _ (с) f (d) f (е) ' (f) недопустимый код карты (g) г j- означает не определенный символ. Упражнения № 2 1. (а) 670/5 (Ь) 0, Т/Г (с) нет (d) 670/5 2. (а) —4 (Ь) 6 (с) 1444 (d) 301 3. (а) 7 (Ь) 39 (с) 29.4 (d) —72 (е) 51.6096 4. (а) 111 (Ь) 11010 (с) -НО (d) 110.011 (е) .000 000 001100 011 100 111 ОН 001 111 .. . 5. (а) 45 (Ь) 57 (с) 168 (d) 3.75 (е) .203125 6. (а) 2D (Ь) 39 (с) А8 (d) З.С (е) .34 7. (а) 8001 (b) 2ВС0 (с) FA1.44B (d) 4D.E (е) 1.63D,70A,3D7,0A .... (f) .492,492 ... (g) 22B.70E,579,D . . . (h) 7,5BC,D15.0329 ... 8. (a) 1,221,588 (b) 2,236 (c) .0969375 (d) 69.332,030,625 (e) 206,697 (f) 1,193,046.4711 ... (g) 1,048,574 (h) 16,856,883,201.795,898,43 . . . Упражнения .№ 3 1. (a) ,23456 X 10» (b) .1 X 101 (c) .258375 X 10s 6 7 8 9 (d) .57 X 10"» (e) .1 X 104 (f) .1875 X 10~l 2. (a) .1774BC X 162 (b) .1 х 161 (c) .1026 X 16» (d) .155B03 X 16'2 (e) .3E8 X 16» (f) .3 X 16° 3. (a) .23456E + 2 (b) .IE + 1 (с) .258375E + 3 (d) ,57E - 3 (e) .IE + 4 (f) .1875E — 1 4. (a) (1) 0, (2, 3, 4) 1 (b) (2) 0, (1, 3, 4) 1 (d) (1, 2, 3, 4) 1 5. (a) 322,096 (b) 009,910 (c) 946,850 6. (a) 322,095 (b) 009,909 (c) 946,849 (c) (2)0, (1,3,4)! (d) 999,918 (d) 999,917 7. (a) BA,48B,CBF (b) BC,923,FOO (c) FF,FFF,FFF (d) El,5FF,0ED 8. (a) BA,48B,CC0 (b) BC,923,F01 (с) нуль (d) El,5FF,0EE 9. 89,250,43F 11. 17658
Ответы к упражнениям 847 Упражнения № 4 1. Х=60 8» =9 s=3 MD = 2.4 2. X = 888.4 s* = 62 s = 7.874 MD = 6.664 3. r=—.65 b=—1.3 a= 168.9 Упражнения № 5 1. (a) 9/41 (b) 41/40 (c) 40/41 (d) 40/41 (e) 9/40 (f) 1 2. (a) (2) (b) 5/3 (c) —2 (d) 4.6052 3. (a) 256 (b) 4 (с) 1 (d) 1/16 4. (a) —4—12i (b) -ll-68i (c) 43/65-(68/65)i (d) -U-2i Упражнения № 6 1. с 8 4 2 1 2. 6 3 2 1 0 0 1 0 0 1 1 0 0 0 1 1 0 1 0 0 1 0 0 1 0 0 0 1 1 2 1 0 1 0 1 2 0 0 1 0 1 3 1 0 1 1 0 3 0 1 0 0 1 4 0 0 1 1 1 4 0 1 0 1 0 5 0 1 0 0 0 5 0 1 1 0 0 6 1 1 0 0 1 6 1 0 0 0 1 7 1 1 0 1 0 7 1 0 0 1 0 8 0 1 0 1 1 8 1 0 1 0 0 9 1 1 1 0 0 9 1 1 0 0 0 Из двух возможных представлений числа нуль вычислительные машины IBM 650 и 7070 используют приведенное здесь представление. 3. 0 0000 0001 ООН 0010 4 5 6 7 оно 0111 0101 0100 8 9 10 11 1100 1101 1111 1110 12 13 14 15 1010 1011 1001 1000 1 2 3 4. 7 4 2 1 7 4 2 1 0 0 0 0 0 5 0 1 0 1 1 0 0 0 1 6 0 1 1 0 2 0 0 1 0 7 1 0 0 0 3 0 0 1 1 8 1 0 0 1 4 0 1 0 0 9 1 0 1 0 5. (a) J (Ь, с) символ не присвоен (d) г (е) z (f) I 6. (а) 1010 1010 (d) 1111 0010 (е) 1111 1010 (f) 1010 1001 Упражнения № 7 1. (a) 3 (b) 32 2. (a) NOW IS THE TIME (b) E PLURIBUS UNUM (c) All Gaul is divided into 3 parts 3. (a) E3C1E4C7C8E340E3D640E3C8C540E3E4D5C540D6C640E3C8C540C8C9- C3D2D6D9E840E2E3C9C3D2 (b) C98640F7404E40E761F5407E40F96B40A388859540E7407E40F1F04B
348 Ответы к упражнениям 4. (a), (b), (d) 5. О, 4, 8, С 7. 54.5 8. .75 Упражнения № 8 1. (a) FFFF 17А0 (b) ОООО 000F (с) 0000 0008 (d) FFE8 7D02 (е) FFFF F008 (f) 0000 0010 (g) 0000 0000 (h) 0000 0000 (i) 0015 B764 (j) 0000 001A (k) 0000 0000 (1) 0000 0008 2. (a) SR IB BB (b) LR 18 BD (e) AR 1A CC (f) MR 1C CD Упражнения № 9 1. (a) 2 (b) 0 (с) 1 (d) 2 (e) 1 (f) 2 (g) 2 (h) 3 (i) 0 (j) 3 2. (a) 002006 (b) 002006 (c) 001100 (d) 001100 6. &THIS IS A PROBLEM Упражнения № 10 1. (a) $123,456.78 (b) $001,345.98 (c) $000,006.78 (d) $000,000.00 3. (a) 0000 000 691B (b) 0000 000 461A (c) 0000 000 067H (d) 0000 000 000 4. To же, что в предыдущей задаче. Упражнения № 11 1. (а) Счетчик = 0. (Ь) Значение счетчика больше числа колонок на кар- те. (с) Бит 38^=0. (d) Во второй .CCW счетчик = 0. 3. EOF 5. В CCW установлен признак PCI Упражнения № 12 1. (а) Указывает 89 колонок на карте. (Ь) Первая CCW — Переход в канале. (с) Биты 4—7 CCW =0. (d) Команда Переход в канале указывает на 1804, не являющуюся адресом двойного слова. (е) Послед- няя CCW не будет выполнена, поскольку третья CCW обнаружит запись неправильной длины. > Упражнения № 13 1. (a) ABCD, zzzz (z = 00le) (b) ABCD, zzzz (с) ABCD, zzzz 2. Ключ 00 Адрес 0С40 0000 5. 001в 6. (а) Команда отвергнута. Содержимое памяти не изменится. (Ь) 2400 2200fe, 0000 000016 (с) 2400 22001в, 0000 00001б Упражнения №14 6. (а) 25 (Ь) 13 (с) 51
Ответы к упражнениям ' 849 7. (а) 34 (Ь) 18 (с) 71 8. (а) 12 (Ь) 7 (с) 21 Упражнения №, 15 1. (а) 44100400 40100000 (b) C3FFG004 01000000 (с) 45400001 00400000 (d) 437D9A6F 395760CG (е) 41800000 00000000 (f) 00000000 01234567 (g) ВЕ4138А 0091А2ВЗ (h) 40800000 00000000 (i) 400F7D8E 01234567 (j) F7D8EB 01234567 Упражнения № 16 1. (а) 3, 00000031 (с) 2, 00000048 (е) 3, FFFF33F7 (g) 3, 0031F721 (i) 1, 0031F721 (к) 0 , 00000000 (m) 1, 003IF721 (о) 1, 00001817 (q) 1, 0031F710 (s) 1, 0031F721 (Ь) 3, FFFFF721 (d) 1, FFFFFF1A (f) 1, 00000017 (h) 3 , 0031F721 (j) 1, 0031F721 (1) 1, 0031F721 (n) 1, 0031F721 (p) 1, 00001817 (r) 1, 0031F721 (t) 1, 0031F721 Упражнения № 17 2. (а) 00130Е00 (с) 00005000 (b) OOFFOEOO (d) 00001002 Упражнения № 18 1. (а) не изменяется (b) (d) xxxx 0007 xx 001006 няется хххх 0001 хх 001002 (с) не изменяется (е) хххх 000В хх 001006 (f) не изме- 4. (a) bbbbbbbbb4.45b (с) bbbbbbbl31.19— (е) bbbbbbbbbbbbOb (b) ЬЬЬЫ2,987.80Ь (d) Ь2,233,877.70b Упражнения № 20 4. (а) 3571 (Ь) 6250 (с) 8331 (d) 10,000 (е) 16,664 ' (I) 18,176 6. 126 7. 1 8. 13 9. 2 10. 4 И. 5 Упражнения № 21 1. (а), (Ь), (с), (е), (g), (i), (j), (к) 2. Внутренние (операторов) метки: как и в задаче 1; внешние (процедуры) метки: (а), (Ь). 3. (a) AIN'T (b) 0010 (с) 0010 (d) J8J8J8J8 (е) 0001100001Ю000110000110000110
850 Отееты к упражнениям 4. (а) 5 (Ь) 4 (с) 1 7. (а) 20 (b) -1 (с) 0 Упражнения № 24 Сумма = 11/30 = .366667 Упражнения № 26 1. Л = Ь.23456000Е + 03 J2 = Б2.3456000 + 02 J3 = +2.345600Е02 J4 = 0234.5600b J5 = Ъ234.5600b J6 = 23,456.00 J7 = ЬЬЬЬЬЬ234. 3. LY (d) 8 (е) 4 (d) -243 (е) О J8 = Ь234.56 J9 = Ъ234.5600b 110 = ЬЬ234.5600Ь И1 = ♦♦*♦♦♦♦234+ 112= **234,5600b ИЗ = 000Ь234 Л4 = bb + 23,456 Упражнения № 28 1. Целое (a), (b), (i) Действительное (d), (f), (h) С двойной точностью (е), (g), (h), (f) 2. Целое (с), (е) Действительное (a), (b), (d), (j) 4. (а) -9.0 (Ь) 3.875 (с) -130.7183 (d) .8944 (е) -35.0 (f) -130 (i) 1.0 (j) 5.209 (к) -5.0 (1) -17 Упражнения № 29 1. .999001 2. Y = X —8 4Х — 8 ЗХ —4 Х<0 0<Х< 4< 4. Arcsin (х) Упражнения № 30 4. Щ = 1.000000 Н2 = .806853 Нз = .734721 Н4= .697039 Н5 = .673895 Нв = .658241 Н7 = .646947 Н8 = .638416 Н9 = .631744 Ню = .626383 Н20 = .602007 Изо = .593790 Ню =- .577216 Упражнения № 32 4. Рассортировывает все А по порядку: самым маленьким из А будет В(1)« а самым большим — В (50).
Ответы к упражнениям 851 9. .00 .10 .20 .000000 .051755 .107426 1’.Ь6 1.000000 Упражнения № 37 1. Допустимые имена данных: (е), (h), (j) Допустимые слова: (е), (f), (g), (h), (i), (j) 2. (а); (с) необязательно 3. (a), (c), (e) 4. (i) (d), (h), (i) (ii) (a), (b) (iii) (c) (iv) (e), (f), (g) 5. (i) (a), (g) (ii) нет ни одного (iii) (b) (iv)’-(h) (v) (i) (vi) (е) (vii) (f) Упражнения № 38 1. (a) 1234.567 (c) bbbl.450 (e) ♦♦*1.450 (g) ’bbbb.020 (i) bbb$.O2— (k) —00 (m) — .260000E-01 (o) bbbb.O (q) bbbbl.45bb (s) $*****.02b— (viii) (c), (j) (ix) (d) (b) 2332.000 (d) bb$1.450 (f) bbbl.450 (h) b000.02 (j) —00 (1) 000002 (n) bbbb$02DB (p) l,234.56bb (r) ♦♦♦♦♦.02CR Упражнения № 40 1. (a) 3 (b) 3 (c) 3 2. (a) 3 (b) 5 (c) 4 (d) 3 (e) 3 (f) 3 (g) 4 (d) 4 (e) 4 Упражнения № 43 1. X'FFFFFFEB' 2. При попытке выполнить в первый раз команду с меткой Н произойдет прерывание из-за неверной адресации. Упражнения № 45 2. (а) Должен быть операнд CL8. (b) 2ВЕТА не допускается. (с) Верно. (d) Верно. (е) Неверно задан регистр; запрещается умножение на перемещаемое имя. (f) Неверно задан регистр, (g) Верно. Упражнения № 46 6. (а) 000000J (Ь) 0000245 (с) 000024N (d) 0199997 Упражнения № 48 9 . 29850 (Предполагается, что VTOC на цилиндре 0.) Упражнения № 50 6. (а) 0000001 (Ь) 0000245 (с) 000024N (d) 0199997
БИБЛИОГРАФИЯ Материалы фирмы IBM Кроме фирменных руководств по системе 360, для начинающих могут оказаться полезными следующие материалы: 1. Flowcharting Techniques, Form С20-8152. 2. Introduction to IBM Data Processing Systems, Form F22-6517. Статьи 3. IBM Journal of Research and Development, 8, № 2 (April 1964), 86—140. Содержит четыре статьи, посвященных разработке систе- мы 360. 4. IBM Systems Journal, 3, № 2 (1964). Содержит пять статей под общим заголовком The Structure of System/360, посвященных развитию систем 360. 5. American Standards Association, Fortran vs. Basic Fortran, Com- munications of the ACM, 7, № 10 (October 1964), 591—625. 6. Falkoff A. D., Iverson К. E., Sussenguth E. H., A Formal Description of System/360, IBM Systems Journal, 3, № 3 (1964), 198—263. Книги x) 7. Bates F., Douglas M. L. Programming Language/One, Prentice-Hall, 1968. 8. Farina M. V., Fortran IV: Self Taught, Prentice-Hall, 1966 9. Golden J. T., Fortran IV Programming and Computing, Pren- tice-Hall, 1965. 10. McCracken D. D., A Guide to Fortran IV Programming, Wiley, 1965. 11. О p 1 e r A. (Ed.), Programming the IBM System 360, Wiley, 1966. 12. Organick E. I., A Fortran IV Primer, Addison-Wesley, 1966. 13. Pollacks. V., A Guide to Fortran IV, Columbia Univ. Press, 1965. 14. S a x о n J. A., COBOL: A Self-Instructional Programmed Manual, Prentice-Hall, 1963. 15ф. Вычислительная система IBM/360. Принципы работы, изд-во «Советское радио», М., 1968. 16*. Мили Г. и др., Функциональная структура OS/360, изд-во «Совет- ское радио», М., 1971. 17ф. Универсальный язык программирования PL/1, изд-во «Мир», М., 1968. 1) Звездочкой отмечены издания, добавленные при переводе. — Прим. ред.
СЛОВАРЬ Для удобства читателя здесь собраны те английские слова, которые наиболее часто используются в тексте. В словарь включены лишь слу- жебные слова языков программирования, расшифровки основных сокра- щений, а также некоторые слова, встречающиеся в примерах программ. В некоторых случаях указано только специфическое значение слова (напри- мер, BY — шаг). ACCEPT — принять ACTUAL — фактический ADD — прибавить, сложить, сложе- ние ADVANCING — продвижение AFTER — после ALIGNED — выравненный ALL — все ALPHABETIC — буквенный ALTER — изменить APPLY — применить ARE — суть (от глагола быть) AREA — область ASSIGN — присвоить, назначить AUTHOR — автор AUTOMATIC — автоматический BACKSPACE — шаг назад BACKWARDS — назад, в обратном направлении BEGIN — начало BINARY — двоичный BIT — бит, двоичный разряд BLANK — пробел BUFFERED — буферизованный, с буфером BY — шаг BY NAME — по имени BYTE - байт CALL — вызов, вызвать, обратиться CANCEL — отменить, аннулировать CAW (Channel Address Word) — адресное слово канала СС (Condition Code) — признак ре- зультата — (Chain Command) — цепочка команд CCW (Channel Command Word) — команда канала CD (Chain Data) — цепочка данных CHARACTER — символ CHECK — проверка, контроль CHECKING — проверяя CLOCK — часы, время CLOSE — закрыть COCR (Cylinder Overflow Control Re- cord) — управляющая запись пе- реполнения цилиндра COMMON — общий COMPLEX — комплексный COMPUTATIONAL — подлежащий вычислению, для вычисления COMPUTE — вычислить CONDITION — условие, состояние CONFIGURATION SECTION - сек- ция конфигураций CONTAIN — содержать CONTINUE — продолжать CONTROL — управление CONTROLLED — управляемый CONVERSION — преобразование COPY — копировать CORRESPONDING — соответствен- но CPU (Central Processing Unit) — центральный процессор CREATING — создавая, образуя CYCLE — цикл CYL (CYLinder) — цилиндр
854 Словарь DASD (Direct Access Storage De- vice) — устройства с прямым до- ступом DATA — данные DATA DIVISION — раздел данных DATE — дата DATE-COMPILED — дата компи- ляции DATE-WRITTEN — дата написания DCB (Data Control Block) — блок управления данными DD (Data Definition) — определение данных DECIMAL — десятичный. DECK — колода (перфокарт) DECLARATIVES — объявления DECLARE — объявить DEFINE — определить DEFINED — определенный DELETE — исключать, удалять DEPENDING ON — в зависимости от DIMENTION — размерность DIRECT — прямой DIRECT-ACCESS — прямой доступ DISP (Disposition) — диспозиция DISPLAY — показывать, выстав- лять, индицировать DIVIDE — делить, деление DLAB (Disk LABel) — метка на ди- ске DO — выполнить (цикл) DOUBLE PRECISION — двойная точность DSNAME (Data Set NAME) — имя набора данных DUMP — дампинг (выдача состояния памяти) EDIT — редактировать ELSE — иначе, в противном случае END — конец ENTER — войти ENTRY — вход ENVIRONMENT — окружение, об- становка, оборудование ENVIRONMENT DIVISION - раз- дел оборудования ЕОВ (Ena Of Block) — конец блока EOF (End Of File) — конец файла EOJ (End Of Job) — конец задания EQUAL TO — равный EQUIVALENCE — эквивалентность ERROR — ошибка EVERY — каждый EXAMINE — проверить EXEC (EXECute) — выполнить EXIT — выход EXTERNAL — внешний FD (File Define) — определение фай- ла FETCH — выбрать, выборка FILE — файл FILLER — заполнитель FIND — найти FINISH — финиш, конец FIRST — первый FIXED — фиксированный FLOAT — плавающий FOR — для FORMAT — формат FROM — из, от GET — дать, достать, добыть GIVING — давая GO ТО — перейти на, перейти к GREATER THAN — больше чем HIGH-VALUE — наибольшее зна- чение ID — идентификатор IDENTIFICATION DIVISION — раздел идентификаций IF — если IGNORE — игнорировать ILC (Instruction Length Code) — код длины команды IMPLICIT — неявный INDEXED — индексированный, ин- дексный INITIAL — первоначальный, на- чальный, исходный IN LINE — внутренний INPUT - ввод INSTALLATION — установка INTEGER — целое INTERNAL — внутренний INTO — в (внутрь) INVALID — неправильный 1-0 (Input-Output) — ввод — вывод IOCS (Input-Output Control Sys- tem) — система управления вво- дом — выводом IPL (Initial Program Loading) — за- грузка начальной программы IS — есть (от глагола быть) JOB — задание JUSTIFIED (RIGHT, LEFT) — вы- равненный по (правому, левому) краю
Словарь 855 KEEP — хранить KEY — ключ KEYED — с ключом KEYFROM — ключ из KEYTO — ключ и LABEL — метка LBLTYP (LaBeL ТуРе) — тип метки LEADING — ведущие, левые LESS THEN —- меньше чем LIKE —- подобно LIMIT — предел, граница LINE — строка, линия LINECT (LINE CounT) — число строк (на странице) LINESIZE — размер строки LINK — связь, связать LINKAGE SECTION — секция свя- зей LIST — список LOAD — загрузить, загрузка LOCATE — разместить, располо- жить LOCK — блокировка LOG — системный журнал LOGICAL — логический LOW-VALUE — наименьшее значе- ние МАР — распределение, план (памяти) MESSAGE — сообщение MOD (MODified) — изменяемый, об- новляемый, модифицируемый MODE — режим MOUNT — установить (ленту, пакет дисков на устройство) MOVE — переместить, переслать МТС (MultiTrack Commands) — мно- годорожечные операции MULTIPLY — умножить, умноже- ние NAME — имя NAMELIST — список имен NEGATIVE — отрицательный NEW — новый NEXT — следующий NO — нет NOT — не NOTE — замечание, примечание NUMERIC — числовой OMITTED — опущенный ON — при, на ONLY — только OPEN — открыть OTHERWISE — в противном случае OUT OF-LINE — внешний OUTPUT — вывод OVERFLOW-— переполнение PACKED — упакованный PAGE — страница PAGESIZE — размер страницы PASS — передавать PAUSE — пауза, приостановка PICTURE — шаблон POINTER — указатель POSITIVE — положительный PRECISION — точность PRINT — печатать, печать PROCEDURE — процедура PROCESSING — обработка PSW (Program Status Word) — слово состояния программы PUNCH — перфорировать PUT — положить, послать QUOTE(S) — кавычка(и) RANDOM — произвольный, случай- ный READ — читать, чтение REAL — вещественный RECORD — запись REDEFINE — переопределять REEL — катушка, бобина RELATIVE — относительный REMARKS — замечания, коммен- тарий REPLACING — заменяя REPLY — ответ RESERVE — резервировать RESET — установить заново, сбро- сить, отменить RESTRICTED — ограниченный RETURN — вернуться, возврат REVERT — отменить REWIND — перемотка в обратном направлении REWRITE — переписать ROOT — корень ROUNDED — округленный RUN — счет, прогон OCCURS — встречается, случается OLD — старый SAME — тот же самый SEARCH — поиск
856 Словарь SECURITY — секретность SEEK — установка (головок) SELECT — выбрать SENTENCE — предложение SEQUENTIAL — последовательный SER (SERial) — серийный (номер) SET — установить SIGNAL — сигнал, сигнализировать SKIP — пропустить, прогнать (бу- магу), табулировать SLI — индикатор неправильной дли- ны SNAP — моментальный снимок, сфо- тографировать (состояние про- граммы) SOURCE — исходный SPACE — пробел STATIC — статический STOP — стоп, останов STREAM — поток STRING — строка, цепочка SUBROUTINE — подпрограмма SUBSCRIPTRANGE — диапазон из- менения индекса SUBSET — подмножество SUBTRACT — вычесть, вычитание SUM — сумма SYMBOLIC — символический SYSTEM — система TRANSFORM — преобразовать TRANSMIT — передавать (через ка- нал) TRK (TRacK) — дорожка UCS (Universal Character Set) — универсальный набор символов UNBUFFERED — небуферизован- ный, без буфера UNIT — единица, устройство UNLOAD — разгрузить (ленту) UNTIL — пока, до тех пор UNTIL FIRST — до первого UPDATE — обновить, корректиро- вать UPSI (User Program Switch Indica- tor) — индикатор переключения программ пользователя USAGE — использование USE — использовать VALUE — величина, значение VARY — изменять VOLUME — том VTOC (Volume Table Of Contents) — оглавление тома TALLING — подсчитывая THEN — то, затем THRU (THROUGH) — через TIC (Transfer In Channel) — переход в канале WHEN — когда WHILE — пока, в то время как WORKING STORAGE SECTION — секция рабочей памяти WRITE — записать TIMER — таймер TIME(S) — раз(а) TITLE — заголовок ТО — до ТО PROCEED ТО — в дальнейшем XTENT (eXTENT) — экстент на TPLAB (ТаРе LABel) — метка на ленте ZERO — нуль ZEROS — нули
ПРЕДМЕТНЫЙ УКАЗАТЕЛЬ Абсолютная адресация блоков 744— 745 Абсолютное выражение 591 Абсолютный терм 591 — язык*579 Адрес возврата 691 — непосредственный 210 — памяти 59 Адресное слово канала 106 Адресный маркер 183, 185, 188—190, 192-193, 197 Алфавит устройства 54, 760 Альтернативная дорожка 182—185 Американский стандартный код для обмена информацией 55 Арифметические данные 314 Асинхронная обработка данных 576 Ассемблер 581 Базисный метод доступа 732 Базовый адрес 66, 592, 593 — регистр 66 Байт 53 — состояния канала 111, 122 ---устройства 112 — уточненного состояния 136—137 Бит 52 — проверки на четность 53 Битовая строка 313 Блок событий 751 — состояния 736 Блок-схема 51 — управления буферизацией 708 ---буферным пулом 714 — — данными 704, 705—712 ---командами канала 679 Буквенно-цифровая информация 54 Булева переменная 35 Буфер 103, 508, 708 Буферизация динамическая 740, 744 — обменная 708 — простая 708 Буферизованный ввод — вывод 385 Буферный пул 712—714, 732—733 Ввод 98 Ввод — вывод буферизованный 385 — — потока 373 Воспроизведение (REPRO) 610 Время поиска (доступа) 181 Входная информационная шина 134, 135 Вывод 98 Вызываемая программа 691 Вызывающая программа 690 Выполнить 234 Выражение абсолютное 591 — арифметическое 319, 414, 535 — перемещаемое 591 Выходная информационная шина 134, 135 Вычислительная машина 51 Вычитание 69 — без нормализации 205 — десятичное 89 — кодов 219 — полуслова 208 — с нормализацией 205 Двоично-кодированное десятичное представление 53 Двоичные числа 31, 53 Двоичный индикатор 52 — терм 590 Двойное слово 60 Деление 71 — десятичное 90 — с плавающей точкой 205 Десятично-двоичные преобразования 87 Десятичный терм 590 Диагностика 220 Динамическая буферизация 740, 744 Дисковый ввод — вывод 402, 459, 559 54 Зак. 15635
858 Предметный указатель Длина константы в битах 603 Дополнение 36 Заголовок (TITLE) 609 Загрузка 68 — адреса 218 — групповая 209 — длинная 204 — дополнения 75, 206 — и проверка 74, 206 — отрицательная 75, 206 — положительная 75 — полуслова 208 — PSW 220 Запасная (альтернативная) дорожка 182—185 Записи 373 — не определенной длины 259 — несблокированные 257 — переменной длины 259 — сблокированные 257 — фиксированной длины 258 Запись в память 70, 205 -------групповая 209 --- — полуслова 208 ------ — символа 218 Запоминающее устройство на маг- нитном барабане 199 -------магнитных картах 198 ---с прямым доступом 179 Зонная часть числа 54 Защита памяти 291 И (лог.) 35, 211 Идентификатор 311 ИЛИ (лог.) 35, 211 Имя 589, 590 — внешнее 501 — данных 502 — подпрограммы 628 — рабочей области 629 — составное 370, 549 — файла 627 Индекс 29, 66, 261, 351, 447, 521 дорожки 270 — цилиндра 271 Индикаторы переключения программ пользователя (UPSI) 685, 687 Интерфейс 134 Исключающее ИЛИ (лог.) 35, 212 Исполнительный адрес 66 Исходная машина 496 — программа 308, 407, 496, 581 Канал 99 — мультиплексный 99 Канал селекторный 99 Карта ASSGN 284 - DD 301 — ЕХЕС 286, 296, 299 — JOB 286, 289 Карточный перфоратор 1442 136 Каталогизированные процедуры 298 Клавишный перфоратор IBM/029 12 Ключ записи 184, 268 — памяти 221 Ключевые слова 350 Код возврата 754—755 — завершения 750 Колонка продолжения 585, 611 Кольцо защиты файла 167—169 Команда CPU 62 — ввода — вывода 79, 107 — канала (CCW) 104, 119, 607 Команды десятичной арифметики 89 — логические 211 — над полусловами 208 — перекодировки 228 — перехода 73, 214 — привилегированные 220 — редактирования 230 — сдвига 216 — с плавающей точкой 67 фиксированной точкой 67 — условной трансляции 701 — формата RR 65 ----RS 209 ----RX 66 ----SI 210 ----SS 83 Комбинированный файл 629, 645*, 649 Коммутационная доска 21 Компилятор 277, 307, 407, 496 Комплексные числа 48, 315, 317, 468 Константа 599—605 — адресная 604, 572 — двоичная с фиксированной точкой 602 — символьная 599 — с плавающей точкой 603 — типа А 604 ----В 601 ----С 599 ----D 603 ----Е 603 ----F 602 ----Н 602 ----Р 602 ----S 605 ----V 605, 6*18, 672 ----X 600 ----Y 605 ----Z 601 Контроллер 98, 134—137, 149, 167,
Предметный указатель 859 172-176, 182—184, 186, 188, 192— 196, 198-199 Копирование (COPY) 612 Корневой сегмент 756 Коэффициент блокирования 257, 636 — краткости 600, 601, 605, 606 Лента управления кареткой 160, 163 Лентопротяжные устройства 165— 178 Лентопротяжный механизм 172—173 Линии селекции 134 — сопровождающих сигналов 134 — счетчиков 134 Листинг 589, 609, 610 Литерал 502, 503, 590, 613 Логическая схема программы 51, 240 — — системы 238 Логические операции 35, 211 Логический уровень IOCS 622, 679 Макрогенератор 701 Макрокоманда 587, 621 — ввода — вывода BSP 738 ------BUILD 714, 733, 740 ------ССВ 678 ------CHECK 652, 653, 704 ------CLOSE 621, 624, 704, 717, 735 ------CNTRL 622, 625, 645, 656, 661, 704, 720, 738 ------DCB 704, 705-712 ------DCBD 711 ------DTFBG 649 ------DTFCD 629 ------DTFCN 645 ------DTFDA 656 ------DTFEN 649 ------DTFIS 663 ------DTFMT 632 ------DTFPH 677 ------DTFPR 632 ------DTFSD 644 ------DTFSR 622, 645 ------ENDFL 669 ------ESETL 671, 724 ------EXCP 678 ------FEOV 627, 717, 735 ------FREEBUF 733, 740 ------FREEDBUF 742, 743, 748 ------FREEPOOL 713, 740 ------GET 621, 624, 671, 704, 718, 724 ------GETBUF 733, 740 ------GETPOOL 712-713, 733, 740 Макрокоманда ввода — вывода LBRET 624 ------NOTE 652, 654, 739 ------OPEN 621, 624, 704, 716 ------POINT 739 ------POINTR 652, 654 ------POINTS 652, 654 ------POINTW 652, 654 ------PRTOV 720, 738 ------PUT 621, 624, 671, 704, 718 ------PUTX 719, 725 ------READ 652-653, 656, 661 — 662, 669, 704, 735, 741, 745 ------RELEX 748 ------RELSE 625, 719, 725 ------SETFL 669 ------SETL 670, 724 ------TRUNC 627, 719 ------WAIT 678, 742 ------WAITF 656, 661, 670 ------WRITE 652-653, 656, 662-663, 669, 704, 737, 742, 747 — вызова модулей IOCS CDMOD 672 ---------DAMOD 676 ---------ISMOD 676 ---------MTMOD 674 ---------PRMOD 673 ---------SDMOD 675 — супервизора ABEND 750 ----CALL 692, 753 ----CANCEL 688 ----COMRG 686 ----DELETE 755 ----DUMP 688 ----EXIT 690 ----EOJ 688 ----FETCH 688 ----FREEMAIN 749 ----GETMAIN 749 ----GETTIME 689 ----LINK 756 ----LOAD 687, 755 ----PDUMP 688 ----POST 751 ----RETURN 692, 693, 727, 754 ----SAVE 692, 693, 754 ----SETTIME 689 ---- SPIE 750 ----STIMER 752 ----STXIT 689, 690 ----TIME 751 ----TTIMER 752 ----WAIT 751 ----WTO 751 ----WTOR 751 Макроопределение 280, 698 Макроязык 621 Мантисса 34
860 Предметный указатель Марка ленты 166, 175, 177 Маркер 166, 168, 177 — начала оборота 180, 187—189, 191—193, 197 Маска программы 94 — системы 94 — файла Л 94 Маскирование прерываний 109 Масштаб 602—604 Машинная команда 587, 594—598 Машинный язык 579 Межблочный промежуток (IBG) 166, 174—175 Межпрограммные связи 690 Метка 324, 408, 579, 585 — на магнитной ленте 252—253 — — устройствах прямого доступа 262—265 Метод доступа 705 — — базисный 732 ----с очередями 712, 715 ----BDAM 705, 743 ----BISAM 705, 740 ----BSAM 705, 734 ----QISAM 705, 712 ----QSAM 705, 715 Младшая структура 368 Мнемонический код операции 585, 597 Многодорожечные операции 189—192 Модификатор доршы 603, 604 Монопольное управление 743, 746, 747, 748 Монопольный режим 99 Мультиплексный режим 99 Мультипрограммирование 703 Набор данных 252 — — библиотечный 261 ----индексно-последовательный 261, 268 — — последовательный 260, 266 ----с прямым доступом 261, 266 Начальная загрузка программ 118, 279 Начать ввод — вывод 107, 108, 124 Независимость от устройств 703—704 Непоименованная общая секция 617 — программная секция 615, 616 Непосредственный адрес 210 Неявная длина 596, 597, 602, 605 Новая страница (EJECT) 609 Область внутрипрограммной связи 685-686 — общая (COMMON) 488, 617 Область переполнения 269 — связи 685 — сохранения 689—690,691—693, 752 — управления программными пре- рываниями (PICA) 750 Обменная буферизация 708 Обращение к супервизору 218 Объектная машина 496 — программа 308, 407, 496, 581, 599 Оглавление тома 262 Операнд 65 Оператор повелительный 524 — условный 524 — DO 362, 449 Операционная система, определение 281 ---BOS 292 ---DOS 283 ---OS 295 ---TOS 292 Операция двуместная 319 — одноместная 319 Описатель дорожки 183 Определение данных (DC) 588, 599— 605 — памяти (DS) 605 — по наложению 370 ---соответствию 370 — файла 622—623 Определить программную секцию (CSECT) 615 — фиктивную секцию (DSECT) 616 Опросить ввод — вывод 107, 109, 128 — канал 107, 109, 127 Основная дорожка 182, 185 — программа 690 Остановить ввод — вывод 107, 108, 127 Открытие файла 376, 529, 624, 704 Относительная адресация блоков 744-745 Отредактировать 230 — и проверить 230 Память на дисках 2311 179—182 ---магнитных сердечниках 57 Перекодировать 228 — и проверить 229 Переменная* типа метка 357 Перемещаемое выражение 591—592 Перемещаемый терм 591, .592 Переполнение 74 . Пересылка 83, 210 — зон 84 — со сдвигом 91 — цифр 84
Предметный указатель 861 Переход индекс больше 215 — — меньше или равно 215 — по счетчику 214 — с возвратом 214 — условный 73, 76 Перфокарта 10 Перфорация (PUNCH) 610 Печатающее устройство 1403 136 Плавающие символы (в шаблоне) 383, 519 Повелительный оператор 524 Повторное определение 370 Подканалы 99 — разделенные 101 Подпрограммы 245, 400, 481, 476, 571, 691 Поле в памяти 60 — карты 10 Полуслово 60 Пополам 206 Последовательный файл 260, 266, 644 Построчно печатающее устройство 158-163 Предложение 585 Преобразование в двоичную 87 — в десятичную 87 Прерывания 92, 109 — внешние 227 — от ввода — вывода 130 — при обращении к супервизору 227 — программные 227 Привилегированные команды 220 Признак результата 73 Присвоение символических имен УВВ 283 Пробивки зонные 10 — цифровые 10 Проверить и установить 219 — по маске 210 Проверка избыточности 166—167 — порядка следования входных карт (ISEQ) 611 Программа, определение 50, 237 — канала 102 — монитор 77 Программная секция 615—618 Пропуск строк (SPACE) 610 Простая буферизация 708 Прочитать ключ памяти 221 — символ 218 Прямая запись 220 Прямое управление 220 — чтение 220 Псевдопеременная 699, 700 Пульт управления 249 Пультовая пишущая машинка 1052 155—158 Пустая строка 313 Рабочий файл 636, 649 Разделенные цилиндры 263 Распаковать 86 Расширенный двоично-кодированный десятичный код для обмена инфор- мацией (EBCDIC) 55 — мнемонический код 5С7 — поиск 268 Регистр базы 592—594 Регистры 61 — общего назначения 61 — с плавающей точкой 61 — управления 66 Редактор связей 280 Рекурсивная программа 695—698 Режим загрузки 705, 712 — пересылки 718 — печати (PRINT) 610 — сканирования 705, 712 — указания 390, 718, 719 — работы канала монопольный 99 — — — мультиплексный 99 Самоопределенный терм 590 Секция 615—618, 523 — непоименованная общая 617 — — программная 615, 616 — связей 559, 572 — фиктивная 616, 617, 639—644 Сервисные программы 280 Сечение массива 353 Символическая программа 580 Символический адрес 579 — ключ 567, 569 Символьная строка 313 Символьный терм 590 Символы 10 Система управления вводом — вы- водом (IOCS) 622 Системное резидентное устройство 199 Системы счислениц^ЗО Слово 60, 502 — резервированное 311, 504 — состояния канала 107 — — программы 93 Сложение 69 — без нормализации 205 — кодов 212 — полуслов 208 — десятичное 89 — с нормализацией 204 — — очисткой 89 Смещение 66 Собственный адрес 182—185, 187, 191—194, 197 Составное имя 370, 549
862 Предметный указатель Состояние задача 95 — ожидания 94 —. супервизор 95 — счет 94 Специальные символы 54, 310 Список выходов 708 Сравнение 74 — десятичное 90 — кодов 212 — полуслов 208 — с плавающей точкой 204 Средства защиты 221 Средство переполнения дорожки 184, 193 сканирования файла 188—189, Старшая структура 368 Статические символы (в шаблоне) 383 Структура 367 Сумматор 61 Супервизор 279 Счетчик адреса 592, 593, 602, 612— 614, 616 Таймер 228 Терм 590—592 — двоичный 590 — десятичный 590 — перемещаемый 591, 592 — самоопределении!! 590 — символьный 590 — шестнадцатеричный 590 Том 252 Точка загрузки 166, 168—169, 174— 175, 178 Точность 317 Умножение 70 — десятичное 90 — полуслов 208 — с плавающей точкой 205 Универсальный набор символов 159, 161—162 Упакованные данные 85 Упаковать 85 Управление заданиями 370, 279, 285, 295 — кареткой 438 — форматом входных карт (ICTL) 611 Управляющая запись переполнения цилиндра (COCR) 269 — программа 278 Управляющий блок событий (DECB) 735—737 Условие 536, 544 Условие перехода 73 Условное нет операции 614 Условный оператор 524 — переход 73, 76 Установить ключ памяти 211 — маску программы 218 — — системы 220 Устройства для единичных записей Устройство ввода — вывода 98 — чтения перфокарт 2501 135, 137. 141 — чтения — перфорации карт 2540 149-155 ---------- 1442 145-148 ---------- 2520 141-145 Уточнение имен 370, 547 Файл библиотечный 261 — индексно-последовательный 261, 268 — последовательный 260, 266 — с прямым доступом 261, 266 Файлы 253 — на магнитной ленте 252 — на устройствах с прямым доступом 260 Фактический ключ 567 Фигуральная константа 504 Физический уровень IOCS 622, 677 Фиктивная секция 616, 617, 639—644 Формальный параметр 475, 396 Формат буквенно-цифровых данных 436 Функция 341, 384, 395, 476 Характеристика 34 Центральный процессор 63 Цикл 215 — памяти 59 Циклическая проверка 183—185 Цилиндр 181—191, 193—197, 198— 200 Число двоичное 31, 53 — двоично-кодированное десятичное 53 — восьмеричное 31 — ненормализованное 34 — нормализованное 34 — с плавающей точкой 33, 202 — — фиксированной точкой 66 — шестнадцатеричное 31
Предметный указатель 863 Шаблон 380, 513 Шестнадцатеричный терм 590 Эквивалентность (EQU) 609 Экспонента 602, 603, 604 Экстент 262 Язык Ассемблера 585 ASCII код 55 ASSGN карта 284 CAW 106 CCW 104, 119, 607 COCR запись 269 CPU 63 DASD 179 DCB 704-712 DD карта 301 DUMP карта 688 ENTRY 291, 400, 486, 618 EXEC 286, 296, 299 PAUSE 291, 421 PDUMP 457, 688 PHASE 288, 295 PSW 93 SET DATA 285, 295 START 295 SYSIN 283, 326 SYSIPT 283 SYSLNK 283 SYSLOG 283 SYSLST 283 SYSOUT 283 SYSPCH 283 SYSPRINT 283, 327 SYSRDR 283 SYSRES 290 FILLER 510 TPLAB 290 IOCS 622 IPL 118, 279 JOB 286, 296 UCS 159, 161-162 UPSI 685, 687 LBLTYP 291 LOG 286 VOL 289 VTOC 262 OPTION 286 XTENT 290
ОГЛАВЛЕНИЕ Предисловие редактора перевода.................................. 5 Предисловие .................................................... 7 Глава I. Перфокарта .......................................... 9 1.1. Герман Холлерит ................................. 9 1.2. Перфокарта IBM.................................. 10 1.3. Клавишный перфоратор IBM-029 12 1.4. Устройства для единичных записей ............... 19 1.5. Коммутационная доска............................ 21 Упражнения № 1 .....................’......... 26 Глава 2. Математические понятия................................ 28 2.1. Вещественные числа........................... 2.2. Индексы ..................................... 2.3. Системы счисления . . . ,.................... Упражнения №2.................................. 2.4. Плавающая точка.............................. 2.5. Булева алгебра............................... 2.6. Дополнение................................... 2.7. Ошибки округления............................ Упражнения Кг 3................................ 2.8. Статистика................................... 2.9. Матрицы...................................... Упражнения № 4................................. 2.10. Логарифмы.................................... 2.11. Тригонометрия ............................... 2.12. Комплексные числа............................ Упражнения № 5................................. 28 29 30 33 33 35 36 37 38 39 41 44 45 47 48 49 Глава 3. Вычислительные машины................................ 50 3.1. Программы и блок-схемы ......................... 50 3.2. Байты .......................................... 52 3.3. Буквенно-цифровая информация.................... 54 3.4. Код ASCII .................................... 55 Упражнения № 6................................... 56 3.5. Память на магнитных сердечниках ................ 57 3.6. Поля и слова ................................... 60 3.7. Регистры . . ................................... 61 3.8. Управление...................................... 62 3.9. Система 360 .................................... 63 Упражнения № 7................................... 64
Оглавление 865 Глава 4. Команды........................................ 65 4.1. Команды IBM-360 .............................. 4.2. Числа с фиксированной точкой.................. 4.3. Команды с фиксированной точкой................ Упражнения № 8................................. 4.4. Переходы...................................... 4.5. Программа-монитор............................. Упражнения №9.................................. 4.6. Формат SS (память — память)................... 4.7. Упакованные данные ........................... 4.8. Десятично-двоичные преобразования............. 4.9. Десятичная арифметика......................... 4.10. Прерывания.................................... 4.11. PSW........................................... Упражнения № 10................................ 65 66 67 72 72 77 82 83 85 87 89 92 94 95 Глава 5. Программирование ввода — вывода...................... 98 5.1. Основные понятия ввода — вывода................. 98 5.2. Скорость передачи данных ...................... 101 5.3. Программа канала .............................. 102 5.4. Связь между CPU и каналом...................... 106 5.5. Прерывания .................................... 109 5.6. } Байты состояния и уточненного состояния...... 111 5.7J Пример......................................... 114 Упражнения №11 117 5.8. Начальная загрузка программ.................... 118 5.9. CCW............................................ 119 5.10. Байт состояния канала.......................... 122 5.11. Начать ввод — вывод............................ 124 5.12. Остановить ввод — вывод........................ 127 5.13. Опросить канал (ТСН) .......................... 127 5.14. Опросить ввод — вывод (TIO).................... 128 5.15. Прерывания от ввода — вывода................... 130 Упражнения № 12................................. 132 Глава 6. Устройства ввода — вывода...................... . . . 134 6.1. Интерфейс .................................... 6.2. Устройство чтения перфокарт 2501 ............. 6.3. Устройство чтения — перфорации карт 2520 .... 6.4. Устройство чтения — перфорации карт 1442 .... 6.5. Устройство чтения — перфорации карт 2540 .... 6.6. Пультовая пишущая машинка 1052 ............... 6.7. Построчно печатающее устройство............... Упражнения № 13 ........................ 6.8. Лентопротяжные устройства ’................... 6.9. Функционирование лентопротяжных устройств . . . 6.10. Память на дисках 2311 ........................ 6.11. Организация данных в запоминающих устройствах с прямым доступом..................................... 6.12. Коды команд для DASD ..................... . . . 6.13. Байты состояния и уточненного состояния для DASD 6.14. Другие запоминающие устройства с прямым доступом Упражнения №14 ............................ 134 137 141 145 149 155 158 163 165 172 179 182 186 195 198 200
866 Оглавление Глава 7. Дополнительные команды............................. 202 7.1. Числа с плавающей точкой............,.......... 202 7.2. Команды с плавающей точкой..................... 203 Упражнения № 15 ............................... 206 7.3. Команды, выполняющие действия над полусловами 208 7.4. Команды формата RS ............................ 209 7.5. Команды формата SI ............................ 210 7.6. Логические команды ............................ 211 Упражнения № 16................................ 212 7.7. Команды переходов.............................. 214 7.8. Команды сдвига................................. 216 7.9. Некоторые дополнительные команды .............. 218 7.10. Привилегированные команды .................... 220 7.11. Средства защиты .............................. 221 Упражнения № 17 222 7.12. Программные прерывания........................ 224 7.13. Другие типы прерываний........................ 227 7.14. Команды перекодировки......................... 228 7.15. Редактирование................................ 230 7.16. Команда выполнить............................. 234 Упражнения № 18 235 Глава 8. Некоторые вопросы программирования................... 237 8.1. Назначение программирования.................... 237 8.2. Логические схемы системы....................... 238 8.3. Логические схемы программ...................... 240 8.4. Подпрограммы .................................. 244 8.5. Десятичные точки............................... 246 Упражнения №19 249 8.6. Работа с пультом управления.................... 249 8.7. Файлы на магнитной ленте....................... 252 8.8. Группировка записей в блоки.................... 256 8.9. Файлы на устройствах с прямым доступом .... 260 8.10. Индексно-последовательные наборы данных......... 268 8.11. Языки программирования.......................... 275 8.12. Управляющие программы........................... 278 8.13. Системные сервисные программы................... 279 8.14. Операционные системы .......................... 281 8.15. DOS. Присвоение символических имен устройствам ввода — вывода........................................ 283 8.16. Управление заданиями в DOS...................... 285 8.17. Системы TOS и BOS ............................. 292 8.18. Управляюкцие карты OS......................... 295 8.19. Каталогизированные процедуры.................. 298 8.20. Определение данных ........................... 301 Упражнения № 20 ............................... 305 Глава 9. Введение в PL/1 ....................................... 307 9.1. PL/1........................................... 9.2. Синтаксис...................................... 9.3. Исходные данные................................ 9.4. Константы и переменные ........................ 9.5. Данные, управляющие программой................. 307 310 312 315 318
Оглавление 867 9.6. Арифметические выражения....................... 319 9.7. Операторы присваивания ........................ 322 Упражнения № 21 323 9.8. Управление программой.......................... 324 9.9. Ввод — вывод, управляемый списком 326 9.10. Пример программы............................... 327 9.11. Операции сравнения ............................ 329 9.12. Ввод — вывод, управляемый данными ........331 9.13. Оператор DISPLAY .............................. 333 9.14. Ввод — вывод, управляемый редактированием . . . 333 9.15. Печать файлов ................................. 338 Упражнения № 22 ................................ 339 Глава 10. Как писать программу на языке PL/1................. 341 10.1. Встроенные функции............................ 341 10.2. Оператор ON ................................. 342 10.3. Логические операции.......................... 347 10.4. Ключевые слова............................... 350 10.5. Индексы....................................... 351 10.6. Начальные значения............................ 354 10.7. Переменные типа метка ........................ 357 Упражнения № 23 ............................... 358 10.8. Группы ....................................... 360 10.9. Оператор DO................................... 362 Упражнения № 24 ............................... 365 10.10. Индексирование в списках ввода — вывода .... 366 10.11. Структуры..................................... 367 10.12. Повторные определения...........:............. 370 10.13. Ввод — вывод записей.......................... 373 10.14. Вынесение описателей за скобки ............... 377 Упражнения № 25 ............................... 378 Глава 11. Более сложные элементы языка PL/1.................. 380 11.1. Шаблоны ...................................... 380 11.2. Псевдопеременные ............................ 384 11.3. Ввод — вывод с буфером........................ 385 11.4. Операторы GET и PUT STRING ................... 391 11.5. Обычные блоки ................................ 392 Упражнения № 26 ............................... 394 11.6. Функции....................................... 395 11.7. Процедуры-подпрограммы........................ 398 11.8. Операторы ENTRY .............................. 400 11.9. Дисковый ввод — вывод ......................... 402 . 11.10. Классы памяти ................................ 404 Упражнения № 27 ............................... 406 Глава 12. Введение в Фортран................................. 407 12.1. Фортран....................................... 407 12.2. Написание программ на Фортране................ 408 12.3. Константы и переменные........................ 411 12.4. Арифметические выражения...................... 414 12.5. Операторы присваивания......................... 417 . Упражнения № 28................................ 418
868 Оглавление 12.6. Операторы управления......................... 420 Упражнения № 29................................ 422 12.7. Ввод — вывод данных.......................... 423 12.8. Предложения FORMAT .......................... 425 12.9. Форматы входных данных....................... 429 12.10. Пример ...................................... 430 Упражнения № 30 ............................... 431 Глава 13. Дополнительные операторы Фортрана................. 436 13.1. Форматы буквенно-цифровых данных ....... 436 13.2. Кратность спецификаторов формата............. 439 13.3. Еще некоторые сведения о форматах............ 443 Упражнения № 31............................... 445 13.4. Индексы...................................... 447 13.5. Операторы DO................................. 449 Упражнения № 32 .............................. 452 13.6. Дополнительные операторы..................... 454 13.7. Работа с лентами и дисками................... 459 13.8. Индексирование в списках ввода — вывода .... 462 13.9. Предложение NAMELIST......................... 464 Упражнения № 33 .............................. 466 Глава 14. Более сложные элементы Фортрана................... 468 14.1. Комплексные переменные....................... 468 14.2. Логические данные и операторы................ 470 Упражнения № 34 473 14.3. Оператор-функция.............*............... 474 14.4. Подпрограмма-функция......................... 476 Упражнения № 35 ............................... 480 14.5. Подпрограммы................................. 481 14.6. Предложение COMMON........................... 488 14.7. Задание начальных значений................... 491 Упражнения № 36 ............................... 493 Глава 15. Введение в Кобол................................... 495 15.1. Программирование коммерческих задач.......... 495 15.2. Программа на‘Коболе.......................... 497 15.3. Имена ....................................... 501 15.4. Раздел идентификаций ........................ 504 15.5. Раздел оборудования ......................... 506 15.6. Раздел данных................................ 508 15.7. Описание записи ........-.................... 510 Упражнения № 37............................... 517 15.8. Шаблоны отчета............................... 519 15.9. Индексы ..................................... 521 15.10. Раздел процедур ............................. 523 Упражнения №38 ............................... 527 15.11. Ввод — вывод................................. 529 15.12. Арифметические операции...................... 533 15.13. Условные операторы........................... 536 15.14. Пример программы............................. 538 Упражнения № 39 .............................. 543
Оглавление 869 Глава 16. Дополнительные сведения о Коболе..................... 544 16.1. Проверка условии............................... 544 16.2. Уточнение имен................................. 547 16.3. Операторы PERFORM.............................. 549 16.4. Дополнительные операторы Раздела процедур . . . 553 Упражнения № 40 ................................ 557 16.5. Объявления..................................... 557 16.6. Дисковые файлы ................................ 559 16.7. Индексно-последовательные файлы........ 560 16.8. Пример......................................... 563 Упражнения № 41................................. 564 16.9. Файлы с прямым доступом........................ 566 16.10. Файлы с относительной адресацией............... 568 16.11. Управление вводом — выводом.................... 569 16.12. Подпрограммы .................................. 571 16.13. Кобол уровня F................................ 576 Упражнения № 42 ................................ 577 Глава 17. Язык Ассемблера..................................... 579 17.1. Программирование в символических адресах .... 579 17.2. Пример........................................ 581 17.3. Язык Ассемблера IBM-360 ...................... 585 17.4. Продолжение примера........................... 587 17.5. Термы и выражения............................. 589 17.6. Команда USING ................................ 592 17.7. Машинные команды.............................. 594 Упражнения № 43 ................................ 598 17.8. Константы .................................... 599 17.9. Адресные константы............................ 604 17.10. Определения данных . . ...................... 605 Упражнения № 44 ................................ 607 17.11. Предложения управления трансляцией............ 609 17.12. Счетчик адреса................................ 612 17.13. Разделение программ на секции................. 615 Упражнения № 45................................. 618 Глава 18. Макрокоманды DOS.................................... 621 18.1. Программирование ввода — вывода .............. 621 18.2. Определения файлов в DOS...................... 622 18.3. Макрокоманды для последовательных файлов . . . 623 18.4. Макрокоманда DTFCD............................ 629 18.5. Макрокоманды DTFPR и DTFMT ................... 632 Упражнения № 46 ................................ 637 18.6. Использование фиктивной секции................ 639 18.7. Макрокоманда DTFSD............................ 644 18.8. Макрокоманды DTFCN и DTFSR.................... 645 18.9. Рабочие файлы . . . . ’....................... 649 Упражнения № 47 ................................ 654 18.10. Макрокоманда DTFDA............................ 656 18.11. Макрокоманда DTFIS............................ 663 18.12. Модули IOCS................................... 671 18.13. Физический уровень IOCS....................... 677 18.14. Пример ....................................... 679 Упражнения № 48 ............................... 683 18.15. Область связи................................. 685
870 Оглавление 18.16. Макрокоманды супервизора....................... 687 18.17. Межпрограммные связи........................... 690 18.18. Рекурсивная программа.......................... 695 18.19. Язык макроопределений.......................... 698 Упражнения № 49 ................................ 701 Глава 19. Макрокоманды OS....................................... 703 19.1. Операционная система........................... 703 19.2. Ввод — вывод.................................. 703 19.3. Блок управления данными...................... 705 19.4. Спецификации DCB во время исполнения программы 710 19.5. Буферизация для методов доступа с очередями ... 712 19.6. QSAM .......................................... 715 19.7. QISAM.......................................... 721 19.8. Несколько примеров............................. 726 Упражнения № 50 ................................ 731 19.9. Буферизация для базисного метода доступа .... 732 19.10. BSAM .......................................... 734 19.11. BISAM.......................................... 740 19.12. BDAM .......................................... 743 Упражнения № 51................................. 748 19.13. Макрокоманды супервизора ......... 749 19.14. Простейшие межпрограммные связи................ 753 19.15. Динамические связи программ.................... 755 Упражнения № 52 ................................ 757 Приложение А. Коды.......................................... 758 . Приложение В. Набор команд........................ * * * ^64 Приложение С. Ввод — вывод................................ 778 Приложение D. Основные сведения о процессоре................ 782 Приложение Е. Основные сведения о языке PL/1................ 788 Приложение F. Основные сведения о Фортране.................. 800 Приложение О. Основные сведения о Коболе.................... 810 Приложение Н. Программа-монитор ............................ 818 Приложение I. Управляющие символы........................... 826 Приложение I. Основные сведения о языке Ассемблера.......... 827 Приложение К. Основные сведения о DOS....................... 832 Приложение L. Основные сведения об OS....................... 838 Ответы к упражнениям........................................ 846 Библиография................................................ 852 Словарь..................................................... 858 Предметный указатель........................................ 857
УВАЖАЕМЫЙ ЧИТАТЕЛЬ! Ваши замечания о содержании книги, ее оформлении, качестве перевода и другие просим присылать по адресу: 129820* Москва, И-110, ГСП, 1-й Риж- ский пер., д. 2, издательство «Мир».
ИБ № 1237 К. Джермейн ПРОГРАММИРОВАНИЕ НА IBM/360 Издание третье, стереотипное Редакторы Н. Н. Щербиновская и Г. М. Ильичева Художник А. Э. Казаченко Художественный редактор В. И. Шаповалов Технический редактор Е. С. Потапенкова Подписано к печати 4/XII-77 г. Бум. офсет. 60Х90’/1в— 27,25 бум. л. Печ. л. 54,50. Уч.-изд. л. 48,66. Изд. № 1/9595. Цена 3 р. 70 к. Зак. 15635 ИЗДАТЕЛЬСТВО «МИР» Москва, 1-й Рижский пер., 2 Типография издательства «Калининградская прав- да», г. Калининград (обл.), ул. Карла Маркса, 18.
Зп.70«.