IBM Basic アセンブリ言語とその後継言語は、 IBM System/360メインフレーム システムと、 IBM Zまでのその後継システム向けに作成された一連のアセンブリ言語とアセンブラです。
これらのうち最初のもの、Basic Assembly Language ( BAL ) は、非常に制限されたアセンブリ言語で、1964 年に導入され、IBM Basic Programming Support (BPS/360)の一部として、 メインメモリが 8 KB しかない最小限の 360 システム、入出力用のカード リーダー、カード パンチ、プリンターで使用されました。Basic Assembler は、 Basic Operating System/360 (BOS/360)の一部としても利用可能でした。
その後、System/360 用のアセンブリ言語が登場し、マクロのサポートなど、より強力な機能と使いやすさを備えました。この言語と、それを実装したアセンブラ群は、System/370とその後のアーキテクチャ向けに進化を続け、その構文を継承および拡張しました。コンピュータ業界の一部では、これらを時代錯誤的な用語「基本アセンブリ言語」または「BAL」で呼ぶこともありました。[ 1 ]しかし、多くの人はそうは呼ばず、IBM 自身は通常、単に「System/360 アセンブラ言語」[ 2 ] 、特定のオペレーティングシステムまたはプラットフォームの「アセンブラ」[ 3 ]、または同様の名前で呼んでいました。特定のアセンブラは、アセンブラ E、アセンブラ F、アセンブラ H などの名前で知られていました。 [ a ]この言語とこのアセンブラ群を使用するプログラマは、これらを ALC (Assembly Language Coding の略) または単に「アセンブラ」と呼ぶこともあります。
最新の派生言語は、IBM高水準アセンブラ(HLASM)として知られています。
アセンブリ言語であるBAL は、動作するIBM メインフレームアーキテクチャSystem/360のネイティブ命令セットを使用します。これは、BAL の後継バージョンが、System/ 360、System/370、System/370-XA、ESA/370、ESA/390、z/Architectureなど、動作する IBM メインフレーム アーキテクチャのネイティブ命令セットを使用するのと同様です。
ほとんどの機械語命令が単純であるため、アセンブラで書かれたプログラムのソースコードは、 COBOLやFortranなどの同等のプログラムよりもはるかに長くなるのが一般的です。かつては、手書きのアセンブラプログラムの速度がこの欠点を補うと考えられていましたが、最適化コンパイラ、メインフレーム向けのC言語、その他の進歩により、アセンブラの魅力は大きく低下しました。しかし、IBMはアセンブラの改良を続けており、速度や非常に細かい制御が最優先される場合は今でも使用されています。ただし、IBMのBALの後継システムはすべて、よりコンパクトなソースコードを記述できる高度なマクロ機能を備えています。
アセンブラを使用するもう1つの理由は、すべてのオペレーティングシステム機能が高級言語でアクセスできるわけではないからです。IBMのメインフレームオペレーティングシステムのアプリケーションプログラミングインターフェースは、アセンブリ言語のマクロ命令のセットとして定義されており、通常は[ c ]、例えばz/OSではSupervisor Call命令( )を呼び出し、例えばz/VMではDiagnose [ d ]を呼び出します。アセンブラサブルーチンを使用することで、高級言語で記述されたプログラムからオペレーティングシステムサービスを利用することが可能です。SVC


アセンブリ言語のステートメントの形式は、80桁のパンチカードのレイアウトを反映しているが、後継バージョンではほとんどの制約が緩和されている。
基本アセンブリ言語では、ステートメントを25列目から開始する別のステートメント形式も許可されており、アセンブルされた命令を同じカードの1列目からパンチすることができました。このオプションは、後のバージョンのアセンブラでは引き継がれませんでした。
アセンブラで書かれたプログラムのソースコードには、主に3種類の命令が含まれています。
アセンブラ命令は、他のシステムではディレクティブ、擬似操作、擬似オペレーションなどと呼ばれることもあり、コード生成プロセス中にアセンブラに対して様々な操作を実行するよう要求するものです。例えば、CSECTは「ここからコードセクションを開始する」という意味です。 はDSECT構造体のデータ定義を提供しますが、コードは生成しません。 はオブジェクトコードDCに配置する定数を定義します。
より重要なアセンブラ命令の 1 つはUSING、S/360 アーキテクチャのベース変位アドレッシングをサポートする です。これは、相対アドレスに使用するベースレジスタとオフセットを決定する際にアセンブラをガイドします。BAL では、 の形式に限定されていました。
ベース、reg-1、...、reg-n を使用します。 S/360 のマシン命令アドレスは、ベースレジスタの値からの変位(0 ~ 4095 バイト) を指定します。アーキテクチャの後のバージョンでは相対アドレス形式が追加されましたが、古い形式は多くの命令でまだ使用されています。 を使用すると、プログラマは、指定されたベースレジスタに「base」のアドレス、base+4096 (複数のレジスタが指定されている場合) などが格納されていると想定することをアセンブラに伝えることができます。これは、そうでなければ各命令でベースレジスタを指定する必要があるプログラマにとってのショートカットにすぎません。プログラマは、この値に依存するコードを記述する前に、「base」のアドレスを実際にレジスタにロードする責任があります。USING
関連するDROPアセンブラ命令は、以前の命令を無効にしますUSING。
機械語命令と1対1の関係があります。完全なニーモニック命令セットは、各命令セットの操作原理[ 4 ]マニュアルに記載されています。例:[ e ]
* これはコメント行です L 3,ZIGGY ラベル「ZIGGY」の場所に格納されているフルワード整数を汎用レジスタ3にロードします。 SLA 4,5は、汎用レジスタ4の値を5ビット左にシフトします。 MVC TARGET、SOURCE は、位置 'SOURCE' から 'TARGET' へ文字を移動します。 AP COUNT,=P'1' は、メモリ位置 'COUNT' の値に 1 を加算します (パック 10 形式)。 B NEXT ラベル「NEXT」への無条件分岐 HERE EQU * これはラベルです CLC TARGET,=C'ADDRESS' メモリ位置 'TARGET' を文字列 'ADDRESS' と比較します プログラムラベルが「THERE」と等しい場合は、BE THERE分岐を実行する。 一般的に受け入れられている標準では、必須ではありませんが、汎用レジスタをニーモニックで識別することが含まれます。X86アセンブリ言語などの他のシステムのアセンブラとは異なり、レジスタのニーモニックは予約シンボルではなく、EQUプログラム内の別の場所にあるステートメントによって定義されます。これにより、アセンブラ言語プログラムの可読性が向上し、レジスタの使用状況の相互参照が可能になります。[ f ]したがって、アセンブラプログラムでは、通常、次のような記述が見られます。
R3 EQU 3 ... L R3、ジギー 注目すべき命令ニーモニックには、レジスタにリターンアドレスと条件コードを格納する呼び出しのためのBALR[ g ]SVC、[ h ]DIAG、[ i ]、およびがありますZAP。[ 5 ]
System/360のマシン命令は、1、2、または3ハーフワード(2~6バイト)の長さです。当初は、操作コードフィールドの最初の2ビットで指定される4つの命令フォーマットがありましたが、z/Architectureでさらにフォーマットが追加されました。
基本プログラミングサポートアセンブラはマクロをサポートしていませんでした。アセンブラ D [ 6 ]以降のアセンブラバージョンでは、プログラマが命令をまとめてマクロを作成し、ライブラリに追加できるようになりました。ライブラリは、C 言語や関連言語のプリプロセッサ機能のように、通常はパラメータを指定して他のプログラムから呼び出すことができます。マクロには、AIF選択したパラメータに応じて異なるコードを生成するために使用される条件付きアセンブラ命令 (if 構文など) を含めることができます。これにより、このアセンブラのマクロ機能は非常に強力になります。C 言語の複数行マクロは例外ですが、アセンブラのマクロ定義は簡単に数百行になることがあります。
ほとんどのプログラムはオペレーティングシステムからのサービスを必要とし、OSはそれらのサービスを要求するための標準マクロを提供しています。これらはUnixのシステムコールに相当します。例えば、MVS(後のz/OS)では、STORAGE(OBTAINパラメータを指定して)動的にメモリブロックを割り当て、GETファイルから次の論理レコードを取得します。
これらのマクロはオペレーティングシステムに依存します。いくつかの高水準言語とは異なり、IBMメインフレームアセンブリ言語は、メモリの割り当て、I/O操作の実行などを行うためのオペレーティングシステムに依存しないステートメントやライブラリを提供していません。また、異なるIBMメインフレームオペレーティングシステム間では、システムサービスレベルでの互換性がありません。たとえば、順次ファイルへの書き込みは、z/OSとz/VSEでは異なる方法でコーディングされます。
以下の断片は、「SEX = 'M' の場合、MALES に 1 を加算する。そうでない場合、FEMALES に 1 を加算する」というロジックがアセンブラでどのように実行されるかを示しています。
CLI SEX、C'M'男性? BNE IS_FEM そうでない場合は、分岐します L 7,MALES MALESの現在の値をレジスタ7にロードします LA 7,1(7) 1を追加 ST 7、男性は結果を返品します B GO_ON この部分は終了しました IS_FEM EQU * ラベル L 7、FEMALES FEMALES レジスタ 7 に現在の値をロードします LA 7,1(7) 1を追加 ST 7、女性用ストアで結果を返します GO_ON EQU * - プログラムの残りの部分 - * 男性用DC F'0'カウンター(初期値=0) 女性用DC F'0'カウンター(初期値=0) 以下は、広く知られている「Hello, World!」プログラムです。このプログラムは、 OS/VS1やMVSなどのIBMオペレーティングシステム上で実行すると、オペレーターのコンソールに「Hello, World!」という文字を表示します。
こんにちはCSECT このプログラムの名前は「HELLO」です * OPSYSまたは呼び出し元からの入力時に、ここに15ポイントを登録します。 STM 14,12,12(13) 呼び出し元の保存領域にレジスタ14、15、および0~12を保存する LR 12,15 プログラムのエントリポイントアドレスでベースレジスタを設定します USING HELLO,12 アセンブラに、プログラムベースに使用するレジスタを指示します。 LA 15、今すぐセーブ セーブエリアを指差してください ST 15,8(13) 前方チェーンを設定する ST 13,4(15) チェーンを後ろに引く LR 13,15 R13を新しい保存領域のアドレスに設定します * -ハウスキーピング終了(ほとんどのプログラムで同様)- WTO「Hello, World!」オペレーターへの書き込み(オペレーティングシステムマクロ) * L 13,4(13) 発信者指定の保存領域にアドレスを復元する XC 8(4,13),8(13) 前方チェーンをクリア LM 14,12,12(13) エントリ時のレジスタを復元する ドロップ12 「使用」の反対 SR 15,15 レジスタ15を0に設定して、戻りコード(R15)がゼロになるようにします。 BR 14 発信者へ戻る * SAVE DS 18F 呼び出し元プログラムのレジスタを保存するために18フルワードを定義します 終了 こんにちは これで番組は終了です WTOこれは、オペレーティングシステム呼び出しを生成するアセンブラマクロです。レジスタを保存し、後で復元して返すため、この小さなプログラムは、次のようにオペレーティングシステムのジョブ制御言語(JCL)から直接呼び出されるバッチプログラムとして使用できます。
// EXEC PGM=HELLOあるいは、別の方法として、そのようなプログラムからサブルーチンとして呼び出すこともできます。
電話してください 展開すると
L R15,=V(こんにちは) BALR R14、R15 
IBM System/360 Model 20用のアセンブラを除き、IBM のアセンブラは概ね上位互換性がありました。主な違いは、使用可能な式の複雑さとマクロ処理の点でした。OS /360 のアセンブラは、当初はメモリ要件に応じて分類されていました。
BPSのアセンブラは、真の「ベーシックアセンブラ」です。カードからロードすることを想定しており、8KBの System/360(モデル20を除く)で動作するように設計されていました。マクロ命令や拡張ニーモニック(条件コード2がハイ比較を示す場合に分岐するためにBC 2の代わりにBHを使用するなど)はサポートされていません。単一の制御セクションしかアセンブルできず、ダミーセクション(構造体定義)は許可されていません。括弧で囲まれた式は許可されておらず、式は3項までに制限され、使用できる演算子は「+」、「-」、「*」のみです。[ 7 ]: 59-61
基本オペレーティングシステムには2つのアセンブラ版がある。どちらも16KB のメモリを必要とし、一方はテープ常駐型、もう一方はディスク常駐型である。[ 8 ]: 7-8
アセンブラDは、メモリサイズ16KBのマシン向けのDOS/360 アセンブラでした。2つのバージョンがあり、 最小 メモリ16KBのマシン向けの10KB版と、 24KBのマシン向けの14KB版がありました 。64KB以上のメモリを搭載したDOSマシン向けには、Fレベルのアセンブラも利用可能でした 。Dアセンブラは、上位バージョンのほぼすべての機能を提供していました。[ 9 ] : 7
アセンブラ E は、メイン ストレージが最低 32 KB の OS/360 システムで動作するように設計されており、アセンブラ自体には 15 KB が必要です。[ 10 ] : 2アセンブラ F は、64 KB のメモリを持つシステムで DOS/360 または OS/360 のどちらでも動作し 、アセンブラには 44 KB が必要です。[ 11 ] [ 12 ] [ 13 ]これらのアセンブラは OS/360 の標準の一部であり、生成されたバージョンはシステム生成(SYSGEN) で指定されました。
アセンブラHはOS/360とその後継OS上で動作し、アセンブラFよりも高速かつ強力でしたが、マクロ言語との完全な互換性はありませんでした。
アセンブラHバージョン2は1981年に発表され、拡張アーキテクチャ(XA)のサポート、AMODEおよびRMODEディレクティブが含まれています。[ 14 ]: 3-28 1994年に販売が中止され、1995年にサポートが終了しました。High Level Assemblerに置き換えられました。[ 15 ]
アセンブラXFは、新しいSystem/370アーキテクチャ命令を含む、アセンブラFのほぼ互換性のあるアップグレード版です。このバージョンは、OS/VS、DOS/VS、およびVMシステム用の共通アセンブラを提供します。その他の変更点としては、式とマクロ処理に関する制限の緩和が挙げられます。アセンブラXFには、最小64KB (仮想)のパーティション/領域サイズが必要です。推奨サイズは128KBです 。[ 16 ] : 73
ハイレベルアセンブラ( HLASM ) は 1992 年 6 月にリリースされ、IBM の Assembler H バージョン 2 に取って代わりました。[ 17 ] [ 18 ]これは System/370 および System/390 のデフォルトのトランスレータであり、MVS、VSE、および VM オペレーティング システムをサポートしていました。2023 年現在、これはz / Architectureメインフレームコンピュータ上のz/OS、z/VSE、z/VM、およびz/TPFオペレーティング システム用の IBM の現在のアセンブラ プログラミング言語です。リリース 6 以降はLinuxでも実行され、ELFまたはGOFFオブジェクト ファイルを生成します (この環境は、IBM Z 上の Linuxと呼ばれることもあります)。[ 19 ] IBM で働いていたジョン ロバート アーマンはHLASM を作成し、リード開発者でした[ j ]「ハイレベル アセンブラの父」と考えられています。[ 21 ]
名前とは裏腹に、HLASM単体では、高水準アセンブラに通常関連付けられる多くの機能は備えていません。この名前は、ユーザー定義関数を記述する機能など、追加のマクロ言語機能に由来している可能性があります。このアセンブラは、SLAC国立加速器研究所(旧スタンフォード線形加速器センター)のグレッグ・ムシアルによって開発された修正を組み込んだAssembler HおよびAssembler(XF)とほぼ同様です。追加された機能には、位置カウンタを示すCSECT/ 、依存[ k ]およびラベル付き[ l ]ステートメント、現在アクティブなステートメントのリスト、クロスリファレンスで変数が読み書きされているかどうかを示す表示、および大文字と小文字を混在させたシンボル名の使用などがありました。[ 18 ] ディレクティブ(読み取り専用制御セクション)により、アセンブラはセクションごとに再入可能性をチェックできます。これは以前は「Assembler Hでは文書化されておらず、一貫性のない実装」でした。[ 22 ] : 41DSECTUSINGUSINGRSECTRSECT
ハイレベルアセンブラツールキットは、ハイレベルアセンブラの別売りの付属品です。ツールキットには以下が含まれます。[ 23 ]
IBM 7090/7094サポートパッケージ(SUPPAKとして知られる)は、「System 360用に作成されたプログラムをIBM 709、7090、7094、または7094 II上でアセンブル、テスト、および実行できるように設計された3つのプログラムで構成されています。」
このクロスアセンブラは7090または7094システム上で動作し、System/360の開発中に使用されました。[ 7 ] [ 24 ]このアセンブラは6ビットBCD文字セットと8ビットEBCDICをサポートしています。
IBMはModel 20向けに2つのアセンブラを提供しました。Model 20 Basic AssemblerとModel 20 DPS/TPS Assemblerです。どちらもModel 20で使用可能な命令のみをサポートしており、固有の命令、、、、、、、およびが含まれます。CIO[ 25 ] : 110 Basic AssemblerはSystem /360 Basic Assemblerの若干制限されたバージョンです。[ 26 ]特に、シンボルは4文字の長さに制限されています。このバージョンは4KBメモリのシステムで実行可能で、マクロのサポートはIOCSマクロに限定されています。カードバージョンは2パスアセンブラで、カード入出力のみをサポートします。テープ常駐バージョンは1パスで、中間ストレージに磁気テープを使用します。CPS Assemblerでアセンブルされたプログラムは最大16KBのアドレス空間をカバーできます。[ 26 ] : 7-8TIOXIOBSPSWBASBASRHPR
DPS/TPSアセンブラは、System/360 BPS/BOSアセンブラの機能をやや制限したバージョンである。[ 25 ]: 132-134
IBM System/360 モデル44プログラミングシステムアセンブラは、OS/360 および DOS/360 アセンブラ言語の「選択されたサブセット」である言語を処理します。
最も重要な点として、Model 44 アセンブラはマクロと継続文をサポートしていません。一方で、他の System/360 アセンブラには見られない多くの機能を備えています。特に、 common という名前のカードイメージソースデータセットを更新する命令や、SETAアセンブラ変数の暗黙的な定義などがあります。[ 27 ]
ストレージ間 (SS) 命令や、バイナリへの変換( CVB)、10 進数への変換( CVD)、直接読み取り( RDD)、直接書き込み( WRD) 命令はサポートされていません。[ 28 ]ただし、モデル 44 に固有の 4 つの命令が含まれています。優先度マスクの変更( CHPM)、PSW スペシャルのロード( LPSX)、直接ワードの読み取り( RDDW)、直接ワードの書き込み( WRDW)。
また、ソースプログラムを更新するための指示も含まれており、これは他のシステム(、、、および)SKPTOのユーティリティプログラムによって実行される機能である。[ 28 ]: 53、73REWNDNUMOMITENDUP
System/360 Model 67タイムシェアリングシステムのアセンブラは、TSS独自の機能をサポートするために、ディレクティブにいくつかの違いがあります。このディレクティブは、プログラムで使用される再配置可能なアドレス定数と変更可能なデータを含むプロトタイプ制御セクションPSECTを生成します。 [ 29 ] : 143
「Assembler G」は、1970年代にウォータールー大学によってAssembler Fに加えられた一連の改良版です(Assembler Fはオープンソースでした/です)。改良点は主に、入出力の処理の改善とバッファリングの強化であり、アセンブリの速度が大幅に向上しています。[ 30 ]「Assembler G」はIBM製品ではありませんでした。
特殊な環境向けに、IBM互換のアセンブラがいくつか存在した。[ 31 ]
当初、System/360オペレーティングシステムはすべてアセンブリ言語で記述され、すべてのシステムインターフェースはマクロ定義によって定義されていました。高水準言語(HLL)からのアクセスは、その言語が提供する機能に限定され、その他のシステムコールは、HLLプログラムから呼び出されるアセンブリサブルーチンとしてコーディングする必要がありました。また、IBMは、インストール時に「出口」と呼ばれる、通常のOS機能を拡張または変更できるユーザー提供ルーチンを通じて、OS機能をカスタマイズできるようにしていました。これらの出口はアセンブリ言語でコーディングする必要がありました。その後、IBMはOS/360をシステムプログラミング言語であるPL/Sで再コーディングしましたが、短期間の試用期間を除いて、PL/Sコンパイラをユーザーに公開しないことを決定しました。これらの要因により、アセンブリ言語は長年にわたりIBMシステムで広く使用されることになりました。
PCDIAG。元々ベアマシンHVCでのDIAGはモデル固有であり、VMの使用とは互換性がありませんでした。BASRSVCに置き換えられましたPC。DIAGとしてHVC。USINGとは、レジスタのリストではなく、再配置可能な式を指定するレジスタのことです。 IHADCB、SYSPRINT を使用します ... TM DCBOPTCD、DCBOPTC SYSPRINT で OPTCD をテストする ... USINGとは、式をラベルで修飾することによって明示的に参照する命令にのみ影響を与えるラベルのことです。 LA R4、SYSIN LA R5、SYSPRINT IHADCB、R4を使用する際 IHADCB,R5 を使用して出力 ... TM IN.DCBOFLGS、DCBOFTM SYSIN での OFLGS のテスト ... TM OUT.DCBOPTCD、DCBOPTC SYSPRINT で OPTCD をテストします ...