Парадигма | язык ассемблера |
---|---|
Разработчик | ИБМ |
Впервые появился | 1964 |
ОС | Базовая поддержка программирования IBM , базовая операционная система/360 |
Лицензия | бесплатно |
Парадигма | макро язык ассемблера |
---|---|
Разработчик | ИБМ |
Впервые появился | 1966 |
ОС | IBM OS/VS , DOS/VS , VM/370 и связанные с ними |
Лицензия | разнообразный |
Парадигма | макро язык ассемблера |
---|---|
Разработчик | ИБМ |
Впервые появился | 1992 |
Стабильный релиз | Версия 1 Выпуск 6 |
ОС | IBM MVS/ESA и преемники, VM/ESA и преемники, VSE/ESA и преемники |
Лицензия | запатентованный |
Веб-сайт | https://www.ibm.com/products/high-level-assembler-and-toolkit-feature |
Основные внедрения | |
Ассемблер высокого уровня |
Язык ассемблера IBM Basic и его последователи — это серия языков ассемблера и ассемблеров, созданных для мэйнфреймовой системы IBM System/360 и ее последователей вплоть до IBM Z.
Первый из них, Basic Assembly Language ( BAL ), является крайне ограниченным языком ассемблера , представленным в 1964 году и использовавшимся в системах 360 с всего лишь 8 КБ основной памяти и только с картридером , перфоратором и принтером для ввода/вывода , как часть IBM Basic Programming Support (BPS/360). Basic Assembler для BAL также был доступен как часть Basic Operating System/360 (BOS/360).
Впоследствии для System/360 появился язык ассемблера, который имел более мощные функции и удобство использования, такие как поддержка макросов . Этот язык и линейка ассемблеров, которые его реализовали, продолжали развиваться для System/370 и последующих архитектур, наследуя и расширяя его синтаксис. Некоторые в компьютерной индустрии называли их общим термином «Basic Assembly Language» или «BAL». [1] Однако многие этого не делали, и сама IBM обычно называла их просто «System/360 Assembler Language», [2] как «Assembler» для данной операционной системы или платформы, [3] или подобными именами. Конкретные ассемблеры были известны под такими именами [a] , как Assembler E, Assembler F, Assembler H и т. д. Программисты, использующие этот язык и это семейство ассемблеров, также называют их ALC (Assembler Language Coding) или просто «ассемблер».
Последний производный язык известен как IBM High-Level Assembler ( HLASM ).
Поскольку BAL является языком ассемблера , он использует собственный набор инструкций архитектуры мэйнфрейма IBM, на которой он работает, System/360 .
Преемники BAL используют собственные наборы инструкций архитектур мэйнфреймов IBM, на которых они работают, включая System/360 , System/370 , System/370-XA , ESA/370 , ESA/390 и z/Architecture .
Простота машинных инструкций означает, что исходный код программы, написанной на ассемблере, обычно будет намного длиннее, чем эквивалентная программа, скажем, на COBOL или Fortran . В прошлом скорость написанных вручную ассемблерных программ часто считалась компенсатором этого недостатка, но с появлением оптимизирующих компиляторов, C для мэйнфреймов и других достижений ассемблер утратил большую часть своей привлекательности. Однако IBM продолжает совершенствовать ассемблер, и он по-прежнему используется, когда первостепенное значение имеет скорость или очень точное управление. Однако все последователи BAL от IBM включили сложную функцию макросов, которая позволяет писать гораздо более компактный исходный код.
Другая причина использования ассемблера заключается в том, что не все функции операционной системы могут быть доступны на языках высокого уровня. Интерфейсы прикладных программ мэйнфреймовых операционных систем IBM определяются как набор инструкций языка ассемблера «макро», которые обычно вызывают инструкции Supervisor Call ( SVC
) [например, на z/OS] или Diagnose ( DIAG
) [например, на z/VM] для вызова подпрограмм операционной системы. Возможно использовать службы операционной системы из программ, написанных на языках высокого уровня, с помощью подпрограмм ассемблера.
Формат операторов языка ассемблера отражает структуру 80-колоночной перфокарты, хотя последующие версии смягчили большинство ограничений.
Базовый язык ассемблера также допускает альтернативный формат оператора, начинающийся со столбца 25, что позволяет вставлять собранную инструкцию в ту же карту, начиная со столбца 1. Эта возможность не была продолжена в более поздних версиях ассемблера.
В исходном коде программы, написанной на ассемблере, встречаются три основных типа инструкций.
Инструкции ассемблера, иногда называемые директивами , псевдооперациями или псевдооперациями в других системах, являются запросами к ассемблеру для выполнения различных операций в процессе генерации кода. Например, CSECT
означает «начать раздел кода здесь»; DSECT
предоставляет определения данных для структуры, но не генерирует код; DC
определяет константу для размещения в объектном коде.
Одной из наиболее важных инструкций ассемблера является USING
, которая поддерживает адресацию смещения базы архитектуры S/360. Она направляет ассемблер в определении того, какой регистр базы и смещение он должен использовать для относительного адреса. В BAL она была ограничена формой
ИСПОЛЬЗОВАНИЕ база,рег-1,...,рег-n
Адреса машинных инструкций на S/360 указывают смещение (0–4095 байт) от значения в базовом регистре ; хотя более поздние версии архитектуры добавили форматы относительного адреса, старые форматы все еще используются многими инструкциями. USING
позволяет программисту сообщить ассемблеру, что указанные базовые регистры предположительно содержат адрес «базы», база+4096 (если указано несколько регистров) и т. д. Это только обеспечивает сокращение для программиста, которому в противном случае пришлось бы указывать базовый регистр в каждой инструкции. Программисты по-прежнему несут ответственность за фактическую загрузку адреса «базы» в регистр перед написанием кода, который зависит от этого значения.
Соответствующая DROP
ассемблерная инструкция отменяет предыдущую USING
.
Существует связь один к одному с машинными инструкциями . Полный набор мнемонических инструкций описан в руководстве Principles of Operation [4] для каждого набора инструкций. Примеры:
* Это строка комментария * Загрузить целое число, хранящееся в * местоположение с меткой «ZIGGY» в общем регистре 3: Л 3,ЗИГГИ SLA 4,5 сдвигает значение в общем регистре 4 влево на 5 бит MVC TARGET,SOURCE перемещает символы из местоположения «SOURCE» в «TARGET» AP COUNT,=P'1' добавить 1 к значению в ячейке памяти 'COUNT' (упакованный десятичный формат) B NEXT безусловный переход к метке «NEXT» ЗДЕСЬ EQU * Это этикетка CLC TARGET,=C'ADDRESS' Сравнить ячейку памяти 'TARGET' со строкой 'ADDRESS' Ветвь BE THERE, если она равна метке программы «THERE»
Общепринятые стандарты, хотя и не обязательные, включают идентификацию регистров общего назначения с мнемоникой. В отличие от ассемблеров для некоторых других систем, таких как язык ассемблера X86 , мнемоники регистров не являются зарезервированными символами, а определяются через EQU
операторы в другом месте программы. Это улучшает читаемость программ на языке ассемблера и обеспечивает перекрестную ссылку использования регистров. Таким образом, обычно вы можете увидеть следующее в программе на ассемблере:
R3 EQU 3 ... Л Р3,ЗИГГИ
Некоторые известные мнемоники инструкций: BALR
[b] для вызова, сохраняющего адрес возврата и код условия в регистре, SVC
[ c] DIAG
, [d] и ZAP
. [5]
Машинные инструкции System/360 имеют длину в одно, два или три полуслова (от двух до 6 байт). Первоначально существовало четыре формата инструкций, обозначенных первыми двумя битами поля кода операции; z/Architecture добавила дополнительные форматы.
Ассемблер Basic Programming Support не поддерживал макросы . Более поздние версии ассемблера, начиная с Assembler D [6], позволяют программисту группировать инструкции в макросы и добавлять их в библиотеку, которую затем можно вызывать в других программах, обычно с параметрами, такими как возможности препроцессора в C и родственных языках. Макросы могут включать условные инструкции ассемблера, такие как AIF
(конструкция 'if'), используемые для генерации различного кода в соответствии с выбранными параметрами. Это делает макрокоманды этого ассемблера очень мощными. Хотя многострочные макросы в C являются исключением, определения макросов в ассемблере могут легко состоять из сотен строк.
Большинству программ потребуются службы от операционной системы , и ОС предоставляет стандартные макросы для запроса этих служб. Они аналогичны системным вызовам Unix . Например, в MVS (позже z/OS), (с параметром) динамически выделяет блок памяти и извлекает следующую логическую запись из файла.STORAGE
OBTAIN
GET
Эти макросы зависят от операционной системы; в отличие от нескольких языков более высокого уровня, языки ассемблера мэйнфреймов IBM не предоставляют независимые от операционной системы операторы или библиотеки для выделения памяти, выполнения операций ввода-вывода и т. д., а различные операционные системы мэйнфреймов IBM несовместимы на уровне системных служб. Например, запись последовательного файла будет кодироваться по-разному в z/OS и z/VSE.
Следующий фрагмент показывает, как логика «Если ПОЛ = 'М', добавить 1 к МУЖСКОМУ; в противном случае добавить 1 к ЖЕНСКОМУ» будет выполняться на ассемблере.
CLI SEX,C'M' Мужчина? BNE IS_FEM Если нет, выполните переход L 7,MALES Загрузить текущее значение MALES в регистр 7 LA 7,1(7) добавить 1 ST 7,MALES сохранить результат B GO_ON Закончил с этой частью IS_FEM EQU * Метка L 7,FEMALES Загрузить текущее значение в FEMALES в регистр 7 LA 7,1(7) добавить 1 ST 7,FEMALES сохранить результат GO_ON EQU * - остальная часть программы - * MALES DC F'0' Счетчик для MALES (изначально=0) ЖЕНЩИНЫ DC F'0' Счетчик для ЖЕНЩИН (изначально=0)
Ниже приведена широко распространенная программа «Hello, World!» , которая при запуске в операционной системе IBM, такой как OS/VS1 или MVS , выводит на пульте оператора слова «Hello, World!»:
HELLO CSECT Название этой программы — «HELLO» * Зарегистрируйтесь здесь и получите 15 баллов при входе от OPSYS или звонящего. STM 14,12,12(13) Сохранение регистров 14,15 и 0–12 в области сохранения вызывающего абонента LR 12,15 Установить базовый регистр с адресом точки входа программы ИСПОЛЬЗОВАНИЕ HELLO,12 Сообщите ассемблеру, какой регистр мы используем для pgm. base LA 15,СОХРАНИТЬ сейчас Укажите на нашу собственную зону сохранения ST 15,8(13) Установить переднюю цепь ST 13,4(15) Смещенная назад цепь LR 13,15 Установить R13 на адрес новой области сохранения * - конец уборки (аналогично для большинства программ) - WTO «Привет, мир!» Запись оператору (макрос операционной системы) * L 13,4(13) восстановить адрес в области сохранения, предоставленной вызывающим абонентом XC 8(4,13),8(13) Очистить прямую цепочку LM 14,12,12(13) Восстановить регистры как на момент ввода DROP 12 Противоположность «ИСПОЛЬЗОВАНИЯ» SR 15,15 Установить регистр 15 в 0, чтобы код возврата (R15) был равен нулю. BR 14 Вернуться к звонящему * СОХРАНИТЬ DS 18F Определить 18 полных слов для сохранения регистров вызывающей программы КОНЕЦ ПРИВЕТ Это конец программы
WTO
это макрос ассемблера, который генерирует вызов операционной системы. Благодаря сохранению регистров и последующему восстановлению и возврату эта небольшая программа может использоваться как пакетная программа, вызываемая непосредственно языком управления заданиями операционной системы (JCL) следующим образом:
// EXEC PGM=ПРИВЕТ
или, в качестве альтернативы, его можно ВЫЗВАТЬ как подпрограмму из такой программы:
ЗВОНИТЕ «ПРИВЕТ»
За исключением ассемблеров для IBM System/360 Model 20 , ассемблеры IBM были в значительной степени совместимы снизу вверх. Различия были в основном в сложности разрешенных выражений и в обработке макросов. Ассемблеры OS/360 изначально обозначались в соответствии с их требованиями к памяти.
Ассемблер для BPS — это настоящий «базовый ассемблер». Он был предназначен для загрузки с карт и мог работать на 8 КБ System/360 (кроме Model 20). Он не поддерживает макрокоманды или расширенные мнемоники (такие как BH вместо BC 2 для перехода, если код условия 2 указывает на высокое сравнение). Он может собирать только одну секцию управления и не допускает фиктивных секций (определений структур). Выражения в скобках не допускаются, а выражения ограничены тремя терминами, причем единственными операторами являются «+», «-» и «*». [7] : 59–61
Базовая операционная система имеет две версии ассемблера. Обе требуют 16 КБ памяти, одна из них находится на ленте, а другая на диске. [8] : 7–8
Ассемблер D был ассемблером DOS/360 для машин с объемом памяти 16 КБ. Он выпускался в двух версиях: 10-КБ вариант для машин с минимальным объемом памяти 16 КБ и 14-КБ вариант для машин с 24 КБ. Ассемблер F-уровня также был доступен для машин DOS с объемом памяти 64 КБ и более. Ассемблеры D предлагали почти все возможности более высоких версий. [9] : 7
Ассемблер E был разработан для работы в системе OS/360 с минимальным объемом оперативной памяти 32 КБ, при этом самому ассемблеру требовалось 15 КБ. [10] : 2 Ассемблер F может работать как под DOS/360, так и под OS/360 в системе с объемом памяти 64 КБ, при этом самому ассемблеру требовалось 44 КБ. [11] [12] [13] Эти ассемблеры являются стандартной частью OS/360; сгенерированная версия была указана при генерации системы (SYSGEN).
Assembler H работает на OS/360 и более поздних версиях ; он был быстрее и мощнее Assembler F, но макроязык не был полностью совместим.
Assembler H Version 2 был анонсирован в 1981 году и включает поддержку Extended Architecture (XA), включая директивы AMODE
и RMODE
. [14] : 3-28 Он был снят с продажи в 1994 году, а поддержка закончилась в 1995 году. Он был заменен High Level Assembler. [15]
Assembler XF — это в основном совместимое обновление Assembler F, включающее новые инструкции архитектуры System/370. Эта версия предоставляет общий ассемблер для систем OS/VS, DOS/VS и VM. Другие изменения включают ослабление ограничений на выражения и обработку макросов. Assembler XF требует минимальный размер раздела/региона 64 КБ (виртуальный). Рекомендуемый размер — 128 КБ. [16] : 73
High Level Assembler или HLASM был выпущен в июне 1992 года, заменив IBM Assembler H Version 2. [17] [18] Он был транслятором по умолчанию для System/370 и System/390 и поддерживал операционные системы MVS, VSE и VM. По состоянию на 2023 год это текущий язык программирования ассемблера IBM для ее операционных систем z/OS , z/VSE , z/VM и z/TPF на мэйнфреймах z/Architecture . Выпуск 6 и более поздние версии также работают на Linux и генерируют объектные файлы ELF или GOFF (эту среду иногда называют Linux на IBM Z ). [19] Работая в IBM, Джон Роберт Эрман создал и был ведущим разработчиком HLASM [e] и считается «отцом высокоуровневого ассемблера». [21]
Несмотря на название, HLASM сам по себе не обладает многими функциями, обычно ассоциируемыми с ассемблером высокого уровня . Название может происходить от дополнительных возможностей макроязыка, таких как возможность писать определяемые пользователем функции. Ассемблер в основном похож на Assembler H и Assembler(XF), включая модификации SLAC (Stanford Linear Accelerator). Среди добавленных функций были указание CSECT
/ DSECT
для счетчика местоположения, зависимые [f] и помеченные [g] USING
операторы, список USING
активных в данный момент операторов, указание того, считывается или записывается переменная в перекрестной ссылке, и разрешение имен символов со смешанным регистром. [22] Директива RSECT
(Read-only Control Section) позволяет ассемблеру проверять реентерабельность на основе раздела. RSECT
ранее была «недокументирована и непоследовательно реализована в Assembler H». [23] : 41
High Level Assembler Toolkit — это отдельное дополнение к High Level Assembler. Набор инструментов содержит: [24]
Пакет поддержки IBM 7090/7094, известный как SUPPAK, «состоит из трех программ, разработанных для того, чтобы программы, написанные для System 360, можно было собирать, тестировать и запускать на IBM 709, 7090, 7094 или 7094 II».
Этот кросс-ассемблер работает на системах 7090 или 7094 и использовался во время разработки System/360. [7] [25] Этот ассемблер поддерживает шестибитный набор символов BCD , а также восьмибитный EBCDIC .
IBM поставляла два ассемблера для Model 20: Model 20 Basic Assembler и Model 20 DPS/TPS Assembler. Оба поддерживали только инструкции, доступные в Model 20, включая уникальные инструкции CIO
, TIO
, XIOB
, SPSW
, BAS
, BASR
, и HPR
. [26] : 110 Basic Assembler — это немного более ограниченная версия System/360 Basic Assembler; [27] в частности, символы ограничены четырьмя символами в длину. Эта версия способна работать в системе с 4 КБ памяти, а поддержка макросов ограничена макросами IOCS . Версии для карт — это двухпроходные ассемблеры, которые поддерживают только ввод/вывод с карты. Версии, резидентные на ленте, являются однопроходными, использующими магнитную ленту для промежуточного хранения. Программы, собранные с помощью CPS Assembler, могут адресовать максимум 16 КБ. [27] : 7–8
Ассемблер DPS/TPS представляет собой несколько ограниченную версию ассемблера System/360 BPS/BOS. [26] : 132–134
Системный ассемблер программирования IBM System/360 Model 44 обрабатывает язык, который является «избранным подмножеством» языка ассемблера OS/360 и DOS/360.
Наиболее существенно, что ассемблер Model 44 не поддерживает макросы и операторы продолжения. С другой стороны, у него есть ряд функций, которых нет в других ассемблерах System/360, в частности, инструкции по обновлению исходного набора данных изображения карты , названные common, и неявное определение SETA
переменных ассемблера. [28]
Он не поддерживает инструкции хранения-в-хранилище (SS) или инструкции преобразования в двоичный формат ( CVB
), преобразования в десятичный формат ( CVD
), прямого чтения ( RDD
) и прямой записи ( WRD
). [29] Он включает четыре инструкции, уникальные для модели 44: изменение маски приоритета ( CHPM
), загрузка специального PSW ( LPSX
), прямое чтение слова ( RDDW
) и прямая запись слова ( WRDW
).
Он также включает директивы для обновления исходной программы, функции, выполняемой служебными программами в других системах ( SKPTO
, REWND
, NUM
, OMIT
и ENDUP
). [29] : 53, 73
Ассемблер для System/360 Model 67 Time Sharing System имеет ряд отличий в директивах для поддержки уникальных функций TSS. PSECT
Директива генерирует Prototype Control Section, содержащий перемещаемые адресные константы и изменяемые данные, используемые программой. [30] : 143
«Assembler G» — это набор модификаций, внесенных в Assembler F в 1970-х годах Университетом Ватерлоо (Assembler F был/есть с открытым исходным кодом). Улучшения в основном касаются лучшей обработки ввода/вывода и улучшенной буферизации, что значительно ускоряет сборку. [31] «Assembler G» никогда не был продуктом IBM.
Для специальных сред существовало несколько IBM-совместимых ассемблеров. [32]
Первоначально все операционные системы System/360 были написаны на языке ассемблера, и все системные интерфейсы были определены макроопределениями. Доступ из языков высокого уровня (HLL) был ограничен тем, что предоставлял этот язык, и другие системные вызовы должны были быть закодированы как подпрограммы ассемблера, вызываемые из программ HLL. Кроме того, IBM разрешила настройку функций ОС путем установки через то, что было известно как Exits — пользовательские процедуры, которые могли расширять или изменять обычные функции ОС. Эти выходы должны были быть закодированы на языке ассемблера. Позже IBM перекодировала OS/360 на системный язык программирования PL/S , но, за исключением короткого пробного периода, решила не выпускать компилятор PL/S для пользователей. В результате этих факторов язык ассемблера широко использовался в системах IBM в течение многих лет.
BASR
аналогичными инструкциями.SVC
были заменены инструкцией PC
.DIAG
как HVC
инструкция.USING
называется тот, который указывает перемещаемое выражение вместо списка регистров: ИСПОЛЬЗОВАНИЕ IHADCB,SYSPRINT ... TM DCBOPTCD,DCBOPTC Тест OPTCD в SYSPRINT ...
USING
— это тот, который влияет только на инструкции, которые явно ссылаются на него, квалифицируя выражение с помощью метки: LA R4,СИСИН LA R5, СИСТЕМНЫЙ ПРИНТПРИ ИСПОЛЬЗОВАНИИ IHADCB,R4ИСПОЛЬЗУЯ IHADCB,R5 ... TM IN.DCBOFLGS,DCBOFTM Тест OFLGS в SYSIN ... TM OUT.DCBOPTCD,DCBOPTC Тест OPTCD в SYSPRINT ...