アセンブリ言語の命令の種類:完全ガイド

最終更新: 月7 2025
  • アセンブリ言語は、転送、計算、フロー制御などの目的別に命令を編成します。
  • 各命令はオペコードとオペランドで構成され、アーキテクチャに応じて形式が異なります。
  • データにアクセスするためのアドレス指定モードには、即時、直接、間接などいくつかあります。

アセンブラ機械語と命令形式

アセンブリ言語は、コンピューティングの始まり以来、ソフトウェア開発の基本的な柱の 1 つです。現在では高級言語が主流となっていますが、ハードウェア制御、最適化、リソース制約が優先される環境では、アセンブラも依然として広く使用され、関連性があります。

この記事では、アセンブリ言語命令の種類について詳しく解説し、その構造、目的、アドレッシングモード、そして様々なアーキテクチャにおける命令の構成方法を分析します。また、命令の例、フォーマット、そして包括的な概要も掲載しており、ハードウェアと密接に連携して動作するこれらの命令の背後にあるロジックを完全に理解できるようになります。

アセンブリ言語の命令とは何ですか?

アセンブリ命令とは、CPUが直接理解できるコマンドのことです(アセンブラプログラムによって機械語に変換された後)。各命令には特定の目的があり、通常は操作を表すニーモニックと、データの取得先や結果の格納場所を示す1つ以上のオペランドで構成されます。

これらの命令はプロセッサ アーキテクチャに大きく依存するため、CPU の種類 (x86、ARM、MIPS など) ごとに、特定の構文と機能を持つ独自の命令セットがあります。

命令の構造

指示は通常、次の 2 つの部分で構成されます。

  • オペレーションコード(オペコード): 実行するアクションを示します。 データの追加、移動、比較など。

オペランドは演算を実行するために必要な情報を提供し、レジスタ、メモリ、または定数に格納できます。すべての命令にオペランドが必要なわけではなく、場合によっては、オペランドは命令に暗黙的に含まれているか、定義済みのレジスタに格納されていることがあります。

アセンブリ言語の命令の種類

プログラム内で実行する機能に応じて、アセンブリ言語命令はいくつかのグループに分類できます。最も関連性の高いものの詳細は以下のとおりです。

1. データ転送手順

これらの命令を使用すると、ソースのデータの内容を変更することなく、ある場所から別の場所にデータをコピーできます。これらは、レジスタ、メモリ、周辺機器間で情報を移動するために不可欠です。

  プログラミングにおけるブルートフォースアルゴリズム: ブルートフォースアルゴリズムとは何か、例、バックトラッキングとの違い。

このグループで最も一般的な指示は次のとおりです。

  • MOV: あるオペランドの内容を別のオペランドにコピーします。例えば、 MOV AX, BX BX の内容を AX にコピーします。
  • MOVS / MOVSB / MOVSW: 文字列を送信元アドレス (SI) から宛先アドレス (DI) に移動し、転送プロセスを自動化します。
  • LODS / LODSB / LODSW: SI レジスタによって示されたアドレスからアキュムレータ (AL または AX) に値をロードします。
  • 読む: 値の代わりに有効なアドレスを読み込みます。変数または構造体のアドレスを取得するのに役立ちます。

2. 電池の説明書

スタックは、データを一時的に保存したり、パラメータを渡したり、実行コンテキストを保存したりするために使用されるLIFO(後入れ先出し)構造です。

  • 押す: SP ポインタを減算して、スタックに値を格納します。
  • POP: スタックに保存されている最新の値を取得し、SP を増分します。
  • プッシュ/ポップ: スタック上の CPU フラグの状態を保存および取得します。

3. 算術および論理命令

これらの命令は、ビットに対する計算や演算を実行することを可能にする。これらの命令は、数値データの操作やプログラムの流れにおける意思決定を行う上で不可欠である。

最もよく使用されるものは次のとおりです。

  • 追加/削除: 足し算と引き算。
  • MUL / IMUL: 2進数の乗算。
  • DIV / IDIV: 除算(整数または符号付き)。
  • AND / OR / XOR / NOT: ビット単位の論理演算。
  • SHL / SHR / ROL / ROR: ビットシフトと回転。

4. フロー制御命令

これらを使用すると、プログラムの実行順序を変更したり、ジャンプ命令や条件付き・無条件の呼び出しを導入したりすることができます。

  • ジャンプ: プログラム内の別のアドレスに無条件にジャンプします。
  • コール/リターン: サブルーチンを呼び出して戻ります。
  • JE/JNE/JG/JL/JZ/JNZ: 条件ジャンプは、特定の条件が満たされた場合に実行されます (比較後)。

5. 入出力(I/O)命令

これらはプロセッサと外部デバイス間の通信を可能にする命令です。これらの命令により、ポート(ハードウェア)との間でデータの読み書きが可能になります。

  • IN: 入力ポートからデータを読み取ります。
  • でる: データを出力ポートに送信します。

6. 浮動小数点命令

多くのCPUには、10進数(浮動小数点数)を扱うための専用の数学コプロセッサ(または特殊命令)が搭載されています。これらの命令により、次のような演算が可能になります。

  • 実数の加算、減算、乗算、除算。
  • 三角関数の演算(正弦、余弦、正接)。
  • 対数、指数、およびルートの演算。
  PC上でAIモデルを実行するためにOllamaをインストールおよび設定する方法

これらの命令は通常、数値精度に関するIEEE 754規格に準拠しています。

アドレッシングモード

命令設計の基本的な要素の一つは、オペランドの位置をどのように特定するかである。アドレッシングモードは、 CPUがデータにアクセスする方法を定義する。

1. 即時の対処

データは命令に直接含まれているため、処理速度は速いものの、命令を変更せずに値を変更することはできません。

MOV AX, 5

2. 直接的なアドレス指定

データを含むメモリ アドレスが明示的に指定されます。

MOV AX, 

3. 間接アドレッシング

実効アドレスはレコードの内容から取得されます。非常に柔軟性が高く、構造体やリンクリストに使用されます。

MOV AX, 

4. インデックスアドレス指定

アドレスは、ベースとインデックスを加算して計算されます(例えば、配列を走査する場合など)。これには、SI、DI、またはベース+オフセットレジスタなどの特殊レジスタが使用されます。

MOV AX, 

命令フォーマット: アーキテクチャに応じて異なるタイプ

命令の構造はアーキテクチャによって異なる場合があります。一般的な形式は次のとおりです。

4ウェイフォーマット

これには、2つのオペランド、結果格納場所、および次の命令のアドレスが含まれます。その複雑さゆえに、現在では廃止されています。

3ウェイフォーマット

これは2つのオペランドと宛先アドレスを指定します。現代のRISCアーキテクチャでは一般的です。

2ウェイフォーマット

ソースオペランドとデスティネーションオペランドを使用します(デスティネーションも値を与えることができます)。x86やその他のCISCアーキテクチャでよく使用されます。

一方向形式

オペランドは1つだけ指定され、もう1つはアキュムレータであるとみなされます。古いプロセッサやシンプルなシステムでよく見られます。

0アドレス形式(スタックベース)

これらの演算は、スタックを使用してオペランドと結果を取得および格納します。一部のプログラム電卓など、スタックベースのマシンでは非常に効率的です。

マクロ命令と疑似オペコード

生産性を向上させるため、多くのアセンブラはマクロ命令を提供しています。マクロ命令は、1行の命令を複数の実際の命令に展開するものです。これは、複雑なパターンを繰り返すことを避けたり、ループや条件分岐などの高度な構造を作成したりするのに役立ちます。

たくさん 疑似オペコード これらは、アセンブラが内部的に実際の命令シーケンスに変換する命令です。例えば、 NOP (操作なし)は次のように翻訳できます XCHG AX, AX x86 CPU 上。

  C++ 言語入門: 究極のガイド

アセンブラディレクティブ

ディレクティブ(擬似操作とも呼ばれる)は、厳密な意味での命令ではありません。アセンブリ処理の制御、データ、コードセクション、マクロ、コンパイル条件などの定義に用いられます。

一般的な例としては次のようなものがあります。

  • .data / .code: これらはデータまたはコード セクションを示します。
  • .org: アセンブリが開始されるアドレスを設定します。
  • .equ: 記号定数を定義します。

アセンブリ言語の使用例

高級言語の台頭にもかかわらず、アセンブリ言語はいくつかの分野で依然として重要な役割を果たしている。

  • 組み込みシステムおよびマイクロコントローラの開発。
  • ドライバー、ブートローダー、BIOS のプログラミング。
  • ビデオゲームや暗号化などのアプリケーションにおける極端な最適化。
  • リバースエンジニアリング、デバッグ、低レベルのハッキング。

さらに、アセンブリ言語の学習は、プロセッサの動作原理、データの保存と操作方法、命令のバイナリレベルでの実行方法などを深く理解できるため、コンピュータサイエンスや電子工学の学位取得において依然として重要な位置を占めている。

あらゆる種類のアセンブリ命令、その構造、機能、およびアドレス指定モードを理解することは、低レベルのプログラミングを詳しく知りたい、または高水準言語が最終的にどのようにマシンコードに変換されるかを理解したいプログラマーにとって強固な基盤となります。その用途はより特殊になりましたが、ソフトウェアおよびシステム開発の複数の重要な領域では依然として不可欠なツールです。

アセンブリ言語
関連記事:
アセンブリ言語のすべて: アセンブリ言語とは何か、どのように機能するか