プログラミング言語としての機械コード。アセンブラ言語

コンピュータ

アセンブリ言語(またはアセンブラ)は言語またはアーキテクチャのマシンコードの命令の間に相関関係がある、コンピュータまたは他のファームウェアのための低レベルプログラミング言語。それぞれの機械語(専門用語では「コレクター」)は特定のコンピューターアーキテクチャーを指します。対照的に、ほとんどの高級プログラミング言語はクロスプラットフォームですが、解釈またはコンパイルが必要です。

プラットフォーム指向のコードもコンピュータの中央処理装置によって直接実行される記号言語または一連の命令を呼び出す。プロセッサによって実行される各プログラムは一連の命令からなる。機械語は、定義上、プログラマに見える最低レベルのプログラミングです。

機械コード

使用

多くの操作は1つ以上を必要とします完全な命令を構成することができるオペランド、および多くのアセンブラは、オペランドとしてレジスタおよびラベルだけでなく、数値式および定数を受け入れることができます。これにより、機械コードの言語によるプログラミングの専門家は、面倒な反復計算から解放されます。アーキテクチャによっては、これらの要素を特定の命令またはオフセットまたは他のデータを使用したアドレッシングモード、および固定アドレス用に組み合わせることもできます。多くの「コレクター」は、プログラム開発を容易にし、ビルドプロセスを制御し、そしてデバッグサポートをするための追加のメカニズムを提供します。

歴史的展望

最初のアセンブリ言語は1947年に開発されましたロンドンのバークベック大学のARC2でKathleen Booth、高等研究所でJohn von NeumannとHerman Goldstinと共に働いています。 SOAP(Symbolic Optimal Assembly Program)は、1955年にStan Poulieによって作成された、IBM 650用のアセンブラ言語です。

歴史的に、多くのソフトウェアソリューションがありましたアセンブラでのみ書かれています。 OSは、エグゼクティブシステム問題指向言語(ESPOL)で書かれたBurroughs MCP(1961)の導入以前は、この言語で排他的に書かれていました。多くの商用アプリケーションは、IT大手によって作成された多数のIBMメインフレームソフトウェアを含む、機械指向言語で書かれていました。 1990年代には多くの大企業がアセンブラー・アプリケーション・インフラストラクチャーを保持していましたが、COBOLとFORTRANは結局大部分の作業を圧倒しました。

バイナリコードとは

初期のマイクロコンピュータのほとんどはほとんどのオペレーティングシステムおよび大規模アプリケーションを含む、手動エンコードによるアセンブリ言語での使用。これは、これらのマシンには深刻なリソース制限があり、個々のメモリとディスプレイアーキテクチャに負荷がかかり、限られたシステムサービスにエラーが発生したためです。おそらくもっと重要なのは、コンピューターコードの学習を困難にしている、マイクロコンピューターでの使用に適した一流の高水準言語コンパイラーの欠如でした。

適用範囲

アセンブリ言語は問題の大部分を排除します、最古のコンピュータで必要な、第一世代のアセンブラでの面倒で時間のかかるプログラミング。これにより、プログラマは数値コードを記憶したりアドレスを計算したりする作業から解放されます。初期段階では、「アセンブラ」はあらゆる種類のプログラミングに広く使用されていました。しかし、1980年代の終わりまでには。それらの使用は、改善されたプログラミング性能を求めて、より高水準の言語によって主に取って代わられてきた。今日でも、アセンブラ言語は直接のハードウェア操作、特殊なプロセッサ命令へのアクセス、または重大なパフォーマンス問題の解決に使用されています。典型的なアプリケーションには、デバイスドライバ、低レベルの組み込みシステム、およびリアルタイムパラメータがあります。

アプリケーション例

アセンブリ言語での大きなプログラムの典型的な例は、IBM PC DOSオペレーティングシステム、Turbo Pascalコンパイラ、およびLotus 1-2-3スプレッドシートプログラムなどの初期のアプリケーションです。

オペコード

機械指向言語 - 第一言語1980年代と1990年代の多くの一般的な家庭用PC(MSX、Sinclair ZX Spectrum、Commodore 64、Commodore Amiga、Atari STなど)の開発これは、これらのシステムに関する解釈されたBASIC対話が低い実行速度を提供しただけでなく、既存の機器を完全に使用する機会が限られていたためです。いくつかのシステムは高度に開発されたデバッグツールとマクロオブジェクトを持つ統合開発環境(IDE)さえ持っています。 Radio Shack TRS-80とその後継モデルで利用可能なコンパイラの中には、組み込みのビルドソースを高レベルのプログラムと組み合わせる機会を得たものがあります。コンパイル後、インラインアセンブラはインラインバイナリコードを生成しました。

ダミー用のマシンコード。専門用語

アセンブラー・プログラムは、次のようにして命令コードを作成します。操作およびアドレッシングモードのニーモニックおよび構文規則の、それと等価な数値への変換。この表現は典型的にはオペレーションコード、ならびに他の制御ビットおよびデータを含む。アセンブラはまた、定数式を計算し、メモリ位置と他のオブジェクトのシンボル名を定義します。

組立機械の命令コードもコマンドセットに応じていくつかの単純なタイプの最適化を実行します。これの1つの特定の例は異なったベンダーから人気のあるx86「コレクター」かもしれません。それらのほとんどは、要求に応じて、任意の数のパスで遷移コマンドの置き換えを実行できます。 RISCアーキテクチャー用のアセンブラーなど、命令の単純な再グループ化または挿入を実行することもできます。これにより、インテリジェントなコマンドスケジューリングを最適化して、CPUパイプラインの使用を最大化できます。

のような初期のプログラミング言語のようにFortran、Algol、Cobol、Lispといったアセンブラは、1950年代以降、テキストベースのコンピュータインタフェースの最初の世代のように利用可能になっています。しかし、コレクターが登場したのは、高水準言語用のコンパイラーよりも書きやすいからです。これは、各ニーモニックだけでなく、アドレッシングモードや命令のオペランドも、大規模なコンテキストや分析なしに各特定の命令の数値表現に変換されるためです。アセンブリと高水準言語の両方に似た特性を持つトランスレータと半自動コードジェネレータのクラスもいくつかあり、スピードコードはおそらく最も有名な例の1つです。

パス数

オブジェクトファイルを作成するためにソースを通過する回数(読み取りの試行回数による)に基づいて、アセンブラには2種類のプログラミングがあります。

機械語
シングルパスアセンブラは、一度ソースコードを調べます。定義前に使用されていた文字は、オブジェクトコードの最後に正誤表が必要になります。
マルチパスアセンブラは、最初のパスですべての文字とその値を使ってテーブルを作成し、その後のパスでそのテーブルを使用してコードを生成します。

最初の使用理由ワンパスコレクターは、アセンブリ速度を持っていました - しばしば2番目のパスは、テープにプログラムソースを巻き戻して、再び読むことを必要としました。 (特にディスクを格納するための)はるかに大容量のメモリを備えた後のコンピュータは、再読み込みなしに必要なすべての処理を実行するためのスペースを持っていました。マルチパスアセンブラの利点は、エラーがないためにバインディングプロセス(またはアセンブラが直接実行可能コードを直接作成する場合はプログラムのロード)が高速になるということです。

バイナリコードとは

アセンブリ言語で書かれたプログラム一連のプロセッサニーモニック命令とメタ演算子(ディレクティブ、疑似命令、疑似命令と呼ばれる)、コメント、およびデータで構成されます。アセンブリ言語の命令は通常、オペコードニーモニックで構成されています。それにデータ、引数、またはパラメータのリストが続きます。これらはアセンブラによって機械語命令に変換され、メモリにロードされて実行されます。

例えば、以下の命令はx86 / IA-32プロセッサは8ビット値をレジスタに移動します。このコマンドのバイナリコードは10110で、その後にレジスタが使用される3ビットの識別子が続きます。 AL識別子は000なので、次のコードはALレジスタにデータ01100001をロードします。

問題が発生します:バイナリコードとは何ですか? これは、コンピュータまたは他の電子装置上の文字、数字または他の記号を表すために2進数字「0」および「1」を使用するコーディングシステムである。

機械コード例:10110000 01100001。

技術的特徴

アセンブリ言語を機械語に変換することは組立作業逆の工程は逆アセンブラを用いて行われる。高水準言語とは異なり、単純なアセンブリ演算子と機械語命令の間には1対1の対応関係があります。ただし、場合によっては、アセンブラが疑似命令(マクロ)を提供することがあります。彼らは一般的に必要な機能を提供するためにいくつかの機械語命令をカバーします。ほとんどのフル機能のアセンブラは、ベンダやプログラマがより複雑なコードやデータシーケンスを生成するために使用する豊富なマクロ言語も提供します。

アセンブラでのプログラミング

各コンピュータアーキテクチャには独自のものがあります自分の機械語。コンピュータは、サポートする操作の数と種類、サイズ、レジスタの数、リポジトリ内のデータ表現が異なります。ほとんどの汎用PCはほぼ同じ機能を実行できますが、その方法は異なります。それぞれのアセンブリ言語はこれらの違いを反映しています。

多くのニーモニックまたは構文アセンブラは、通常は異なるプログラムで作成された単一のコマンドセットに対して存在できます。このような場合、最も一般的なものは、原則として、製造元から提供され、その資料で使用されているものです。

デザイン言語

大規模な多様性があります著者として、コレクターは彼らが使用するアプリケーションと命名法を分類します。特に、擬似操作のように、マシンや拡張ニーモニックとは異なるものすべてを記述しているものもあります。基本アセンブリ辞書は、一連のコマンド(ソフトウェア操作の定義に使用される3つの主な種類の命令)で構成されています。

  • オペコードニーモニック。
  • データ定義
  • コレクタディレクティブ

オペコードニーモニックと拡張ニーモニック

アセンブリ言語で書かれた命令高級言語とは異なり、小学校。原則として、ニーモニック(任意の文字)は単一の実行可能コード命令のシンボルです。各命令は通常、オペコードと0個以上のオペランドで構成されています。ほとんどのコマンドは1つまたは2つの値を参照します。

拡張ニーモニックはよく使用されます。説明書の特殊操作 - 説明書の名前からは明らかではない目的のため。たとえば、多くのプロセッサには明示的なNOP命令はありませんが、この目的のために使用される組み込みアルゴリズムがあります。

プラットフォーム指向のコード

多くのコレクターは、2つ以上の機械語命令を生成できる基本組み込みマクロをサポートしています。

データディレクティブ

に使用される指示がありますデータと変数を格納するためのアイテム定義。これらはデータ型、長さ、および配置を定義します。これらの命令は、外部プログラム(個別に収集される)またはデータセクションが定義されているプログラムについてのみ情報の可用性を判断することもできます。一部のアセンブラはそれらを疑似演算子として定義します。

アセンブリ指令

擬似コードとも呼ばれるコレクターディレクティブ疑似命令は、アセンブラに提供され、アセンブリ命令以外の操作を実行するように指示するコマンドです。指令はアセンブラの動作に影響を与え、オブジェクトコード、シンボルテーブル、リストファイル、および内部アセンブラパラメータの値に影響を与える可能性があります。擬似コードという用語は、オブジェクトコードを生成する指令のために予約されていることがあります。

疑似操作名はしばしばドットで始まります。マシンコマンドとは異なります。疑似命令のもう1つの一般的な用途は、ランタイムデータ用の記憶領域を予約し、その内容を既知の値に初期化することです。

コマンドシステム

自己文書化コード

文字アセンブラによるプログラマの許可任意の名前(ラベルや文字)をメモリセルやさまざまな定数に関連付けます。多くの場合、各定数値および変数には固有の名前が割り当てられているため、命令はこれらの場所を名前で参照することができ、それによって自己文書化コードに貢献します。実行可能コードでは、サブルーチンの名前はそのエントリポイントに対応しているため、サブルーチンを呼び出すときにその名前を使用できます。ルーチン内にはラベルGOTOが割り当てられています。多くのコレクターは、通常の文字と字句的に異なるローカル文字をサポートしています。

NASMアセンブラは柔軟性を提供プログラマが異なる名前空間を管理し、データ構造内のオフセットを自動的に計算し、リテラル値またはアセンブラによって実行された単純な計算結果を参照するラベルを割り当てることを可能にする文字管理ショートカットを使用して、再配置可能アドレスを使用して定数や変数を初期化することもできます。

他のほとんどの言語と同様に、アセンブリ言語コンピュータでは、プログラムのソースコードにコメントを追加できます。ビルドプロセスでは無視されます。バイナリ言語の一連の命令の定義と目的を判断するのは難しいため、アセンブリ言語プログラムでは司法のコメントが重要です。変更を加える必要がある場合、コンパイラや逆アセンブラによって作成された「コメントなしの」未処理のアセンブリ言語は読むのが非常に困難です。