【入門】アセンブリ言語の命令を一覧でご紹介!データ移動命令や算術演算命令などサンプルコードを用いて簡単に解説!

アセンブリ言語はコンピュータの歴史とともに存在し、初期のコンピュータシステムでは広く使用されていました。そして、現代でも特定の用途や環境で使われています。

アセンブリ言語は機械語に直接対応するため、ハードウェアに近いレベルでのプログラミングが可能であり、パフォーマンスの最適化やリソースの効率的な利用が求められる場面で使用されることがあります。

近年では、組み込みシステムデバイスセキュリティ関連のプログラミングなどでアセンブリ言語が活用されています。

数あるプログラミング言語の中でも難易度が高いとされるアセンブリ言語ですが、その仕組みを理解すれば意外と面白いと思えるかもしれません。

本記事では、アセンブリ言語の命令一覧をサンプルコードを見ながらわかりやすく解説していきます。

アバター画像
監修者 serio

新卒でデジタル機器等を取り扱うCanon系の代理店にエンジニアとして就職。その後、ネットワークエンジニアとして、ネットワーク環境の構築・セキュリティ対策強化・社内システム、ソフトウェア導入案件等に多数携わる。現在は6年目に入り、DX推進を含む幅広い分野での挑戦を計画。

\エキスパートが回答!/
この記事に関する質問はこちら
記事に関するご質問以外にも、システム開発の依頼やAIの導入相談なども受け付けております。

    会社名必須
    必須
    必須
    Eメール必須
    電話番号必須
    ご依頼内容必須

    データ移動命令

    データ移動命令は、アセンブリ言語でデータをある場所から別の場所へ転送するための基本的な命令です。

    これらの命令により、データを効率よく必要なレジスタやメモリに配置することができ、プログラムの構築において重要な役割を果たします。

    データの転送方法には、レジスタからレジスタへのコピーや、メモリからレジスタへのロードアキュムレータの内容をメモリに保存する操作など、複数の種類があります。

    以下では、アセンブリ言語におけるデータ移動の基礎を構成し、それぞれ異なる役割を持っている代表的な命令について、実際のコード例を交えながら詳しく解説していきます。

    • MOV(Move)
    • LDA(Load Accumulator)
    • STA(Store Accumulator)
    • LD(Load)
    • ST(Store)

    MOV(Move)

    MOV命令は、データをレジスタ間やメモリとレジスタの間で転送するための命令であり、レジスタやメモリ内のデータを別のレジスタやメモリにコピーする際に使用されます。

    ここでは「転送」という言葉が使われますが、実際には移動元のデータは残ったままになるのでコピー格納という認識で良いです。

    (レジスタBXの内容をレジスタAXにコピー)

    MOV AX, BX

    (レジスタALの内容をメモリアドレスがSIの場所にコピー)

    MOV [SI], AL

    MOV命令を使って、データの転送やコピーを簡単に行うことができます。

    LDA(Load Accumulator)

    LDA命令は、アキュムレータ(計算結果や一時的なデータを保持するレジスタ)にデータをロードするための命令であり、メモリアドレスからデータを取得してアキュムレータに格納する際に使用されます。

    (メモリアドレス200からデータをロードしてアキュムレータに格納)

    LDA 200

    (レジスタAXの値をアキュムレータにロード)

    LDA AX

    LDA命令を使用することで、簡単にデータをアキュムレータにロードすることができます。

    STA(Store Accumulator)

    STA命令は、アキュムレータ(計算結果や一時的なデータを保持するレジスタ)の内容をメモリに格納するための命令であり、アキュムレータのデータを指定されたメモリアドレスに保存する際に使用されます。

    (アキュムレータの内容をメモリアドレス200に格納)

    STA 200

    (アキュムレータの内容をDIレジスタが示すメモリアドレスに格納)

    STA [DI]

    STA命令を使うことで、アキュムレータのデータをメモリに保存することができます。

    LD(Load)

    LD命令は、指定されたメモリアドレスからデータをロードしてレジスタに格納する命令であり、メモリアドレスからデータを取得して指定されたレジスタにロードする際に使用されます。

    (メモリアドレス300からデータをロードしてレジスタAXに格納)

    LD AX, 300

    (メモリアドレスがBXの内容を取得してレジスタCXに格納)

    LD CX, [BX]

    LD命令を使用することで、効率的にメモリからデータをロードしてレジスタに格納することができます。

    ST(Store)

    ST命令は、レジスタの内容を指定されたメモリアドレスに保存するための命令であり、レジスタのデータを指定されたメモリアドレスに格納する際に使用されます。

    (レジスタALの内容をメモリアドレスがSIの場所に保存)

    ST [SI], AL

    (レジスタCXの内容をメモリアドレスがBXの場所に保存)

    ST [BX], CX

    ST命令を使用することで、レジスタのデータをメモリに保存することができます。

    算術演算命令

    算術演算命令は、アセンブリ言語において数値の計算を行うための基本的な命令です。これらの命令を使用することで、加算や減算、乗算、除算といった基本的な演算を効率的に行うことができます。

    算術演算命令は、プログラム内でのデータ処理に欠かせない要素であり、各演算結果を必要なレジスタやメモリに保存して、他の計算や処理に活用できます。

    ここでは、以下のような四則演算(加算、減算、乗算、除算)について詳しく説明していきます。

    • AND(Bitwise AND)
    • OR(Bitwise OR)
    • XOR(Bitwise XOR)
    • NOT(Bitwise NOT)

    ADD(Addition)

    ADD命令は、指定された2つのオペランド(データ)を加算するために使用されます。例えば、レジスタやメモリ上のデータを加算して結果を別のレジスタに格納する際に使用されます。

    MOV AX, 10     ; AX = 10
    ADD AX, 5        ; AX = AX + 5 = 15

    上記のコードでは、MOV命令でAXレジスタに「10」を代入し、次にADD命令でAXレジスタの値に5を加算して結果「15」を、再度AXレジスタに代入しています。

    SUB(Subtraction)

    SUB命令は、指定された2つのオペランド(データ)を減算するために使用されます。例えば、レジスタやメモリ上のデータを減算して結果を別のレジスタに格納する際に使用されます。

    MOV AX, 20    ; AX = 20
    SUB AX, 8        ; AX = AX – 8 = 12

    上記のコードでは、MOV命令でAXレジスタに「20」を代入し、次にSUB命令でAXレジスタの値から8を減算して結果「12」を、再度AXレジスタに代入しています。

    MUL(Multiplication)

    MUL命令は、指定された2つのオペランド(データ)を乗算するために使用されます。例えば、レジスタやメモリ上のデータを乗算して結果を別のレジスタに格納する際に使用されます。

    MOV AX, 6         ; AX = 6
    MOV BX, 3         ; BX = 3
    MUL BX              ; AX = AX * BX = 6 * 3 = 18

    上記のコードでは、MOV命令でAXレジスタに「6」を代入し、さらにBXレジスタに「3」を代入します。その後、MUL命令でAXレジスタの値とBXレジスタの値を乗算して結果「18」を、再度AXレジスタに格納しています。

    DIV(Division)

    DIV命令は、指定された2つのオペランド(データ)を除算するために使用されます。例えば、レジスタやメモリ上のデータを除算して商と余りを別々のレジスタに格納する際に使用されます。

    MOV AX, 25                      ; AX = 25
    MOV BX, 4                        ; BX = 4
    DIV BX                               ; AX = AX / BX = 25 / 4 = 6 (商), DX = AX % BX = 1 (余り)

    上記のコードでは、AXレジスタに「25」を、BXレジスタに「4」を格納します。その後、DIV命令を使用してAXレジスタの値をBXレジスタの値で除算します。結果として、AXレジスタに商である6が、DXレジスタに余りである1が格納されます。

    ビット演算命令

    ビットとは、コンピュータにおける最小単位であり、2つの状態(0または1)を表します。一方、10進数は通常の数値表現であり、0から9までの10個の数字を用いて数を表します。

    例えば、10進数の数値「42」は以下のように表現されます。

    • 42 (10進数)

    同じ数値をビットで表現する場合、2進数を使用します。例えば、数値「42」を8ビットの2進数で表現すると以下のようになります。

    • 00101010 (2進数)

    ビットは2進数として表現されるため、コンピュータ内で情報を処理する際に使用されます。10進数と比較すると、ビットは2進数表現であり、0または1の値を持つ点が異なります。

    ビット演算命令は、アセンブリ言語プログラミングにおいてビットレベルの操作を行う際に使用されます。ビット演算は、データの特定のビットを操作したり、ビットマスクを作成したりするために役立ちます。

    AND(Bitwise AND)

    AND命令は、2つのビット列を論理積(AND演算)を取るために使用されます。つまり、対応するビットが両方とも1の場合にのみ結果が1となり、それ以外の場合は結果が0となります。ビットごとのAND演算は、ビットの特定の位置でのみ1を維持し、他のビットを0に変更します。

    (AND:ビットごとのAND演算)

    MOV AX, 1100b                   ; AX = 0000 1100
    MOV BX, 1010b                   ; BX = 0000 1010
    AND AX, BX                         ; AX = 0000 1000

    上記は、AXに「0000 1100」BXに「0000 1010」を代入後、AXとBXをAND演算しています。その結果がAXに「0000 1000」の値が代入されます。この値は2進数なので10進数にすると8になります。

    OR(Bitwise OR)

    OR命令は、2つのビット列を論理和(OR演算)を取るために使用されます。つまり、対応するビットがどちらかが1であれば結果が1となり、両方とも0の場合にのみ結果が0となります。ビットごとのOR演算は、ビットの特定の位置で1があれば結果も1となります。

    (OR:ビットごとのOR演算)

    MOV AX, 1100b               ; AX = 0000 1100
    MOV BX, 1010b               ; BX = 0000 1010
    OR AX, BX                        ; AX = 0000 1110

    上記は、AXに「0000 1100」BXに「0000 1010」を代入後、AXとBXをOR演算しています。その結果がAXに「0000 1110」の値が代入されます。この値は2進数なので10進数にすると14になります。

    XOR(Bitwise XOR)

    XOR命令は、2つのビット列を排他的論理和(XOR演算)を取るために使用されます。つまり、対応するビットが異なる場合にのみ結果が1となり、同じ場合は結果が0となります。ビットごとのXOR演算は、ビットの特定の位置で異なる場合に1を、同じ場合に0を生成します。

    (XOR:ビットごとのXOR演算)

    MOV AX, 1100b               ; AX = 0000 1100
    MOV BX, 1010b               ; BX = 0000 1010
    XOR AX, BX                     ; AX = 0000 0110

    上記は、AXに「0000 1100」BXに「0000 1010」を代入後、AXとBXをXOR演算しています。その結果がAXに「0000 0110」の値が代入されます。この値は2進数なので10進数にすると6になります。

    NOT(Bitwise NOT)

    NOT命令は、ビット列の各ビットを反転させるために使用されます。つまり、0は1に、1は0に反転されます。ビットごとのNOT演算は、ビットの値を反転させることで新しいビット列を生成します。

    (NOT:ビットごとのNOT演算)

    MOV AX, 1100b               ; AX = 0000 1100
    NOT AX                             ; AX = 0000 0011

    上記は、AXに「0000 1100」を代入後、AXをNOT演算しています。その結果がAXに「0000 0011」の値が代入されます。この値は2進数なので10進数にすると6になります。

    制御命令

    制御命令は、アセンブリ言語においてプログラムの実行順序を変更するために使用される命令です。

    特定の条件に応じて命令の実行を制御することで、プログラムの柔軟な動作を実現します。これにより、条件分岐ループのような制御構造を実装することができ、複雑な処理の実現が可能になります。

    以下で紹介する命令は、特定の条件下でジャンプや比較を行う基本的な制御命令です。これらの命令を理解し活用することで、アセンブリ言語でのプログラム制御が効率化されます。

    • JMP(Jump)
    • CALL(Call Subroutine)
    • RET(Return)
    • CMP(Compare)
    • JZ(Jump if Zero)
    • JNZ(Jump if Not Zero)
    • JE(Jump if Equal)
    • JNE(Jump if Not Equal)
    • JL(Jump if Less Than)
    • JG(Jump if Greater Than)

    <H3> JMP(Jump)

    JMP命令は、プログラム内で指定されたアドレスにジャンプするために使用されます。ジャンプ命令は、プログラムの実行を指定されたアドレスに移動させることができます。

    start:
    ; 何らかの処理
    JMP end_label

    end_label:
    ; 終了処理

    上記のコードでは、`JMP end_label` の部分で`end_label` ラベルにジャンプしています。

    CALL(Call Subroutine)

    CALL命令は、サブルーチン(サブプログラム)を呼び出すために使用されます。サブルーチンは、特定の処理を実行するために定義された一連の命令です。CALL命令を使用すると、サブルーチンが実行され、その終了時には元の場所に戻ります。

    main:
    ; メインプログラムの処理
    CALL subroutine

    subroutine:
    ; サブルーチンの処理
    RET

    上記のコードでは、`CALL subroutine` の部分で`subroutine` ラベルにジャンプしています。サブルーチンを呼び出すために使用されるCALL命令が実行され、サブルーチン内の処理が実行されます。

    RET(Return)

    RET命令は、サブルーチンからメインプログラムに戻るために使用されます。サブルーチン内で処理が終了した後、RET命令を使用することでサブルーチンの呼び出し元に戻ります。

    main:
    ; メインプログラムの処理
    CALL subroutine

    subroutine:
    ; サブルーチンの処理
    RET

    上記のコードでは、`RET` 命令が実行され、サブルーチンからメインプログラムに戻ることが示されています。サブルーチン内の処理が完了した後にRET命令が実行され、呼び出し元に戻ります。

    CMP(Compare)

    CMP命令は、2つのデータを比較するために使用されます。具体的には、2つのデータを減算して結果を状態フラグに設定しますが、実際にはデータの値を変更しません。比較後、他の条件付きジャンプ命令と組み合わせて条件分岐を行うことができます。

    data1 DB 10
    data2 DB 20
    CMP data1, data2

    上記のコードでは、`CMP data1, data2` の部分で`data1` `data2` のデータを比較しています。比較結果に基づいて条件分岐命令を使用してプログラムのフローを制御します。

    JZ(Jump if Zero)

    JZ命令は、ゼロフラグがセットされている場合に指定されたアドレスにジャンプするために使用されます。通常、直前の演算結果がゼロである場合に条件分岐を行う際に使用されます。

    data DB 0

    CMP data, 0
    JZ zero_case

    non_zero_case:
    ; data がゼロでない場合の処理
    JMP end_label

    zero_case:
    ; data がゼロの場合の処理

    end_label

    上記のコードでは、`CMP data, 0` の部分で`data` とゼロを比較し、その結果がゼロの場合に`JZ zero_case` の部分で`zero_case` ラベルにジャンプしています。比較結果がゼロの場合に指定されたアドレスにジャンプします。

    JNZ(Jump if Not Zero)

    JNZ命令は、ゼロフラグがセットされていない場合に指定されたアドレスにジャンプするために使用されます。通常、直前の演算結果がゼロでない場合に条件分岐を行う際に使用されます。

    data DB 0

    CMP data, 0
    JNZ non_zero_case

    zero_case:
    ; data がゼロの場合の処理
    JMP end_label

    non_zero_case:
    ; data がゼロでない場合の処理

    end_label:

    上記のコードでは、`CMP data, 0` の部分で`data` とゼロを比較し、その結果がゼロでない場合に`JNZ non_zero_case` の部分で`non_zero_case` ラベルにジャンプしています。比較結果がゼロでない場合に指定されたアドレスにジャンプします。

    JE(Jump if Equal)

    JE命令は、等しい場合に指定されたアドレスにジャンプするために使用されます。CMP命令と組み合わせて等しいかどうかを比較し、条件に応じてジャンプすることができます。

    data1 DB 10
    data2 DB 10

    CMP data1, data2
    JE equal_case

    not_equal_case:
    ; data1 と data2 が等しくない場合の処理
    JMP end_label

    equal_case:
    ; data1 と data2 が等しい場合の処理

    end_label:

    上記のコードでは、`CMP data1, data2` の部分で`data1` `data2` のデータを比較し、その結果が等しい場合に`JE equal_case` の部分で`equal_case` ラベルにジャンプしています。比較結果が等しい場合に指定されたアドレスにジャンプします。

    JNE(Jump if Not Equal)

    JNE命令は、等しくない場合に指定されたアドレスにジャンプするために使用されます。CMP命令と組み合わせて等しくないかどうかを比較し、条件に応じてジャンプすることができます。

    data1 DB 10
    data2 DB 20

    CMP data1, data2
    JNE not_equal_case

    equal_case:
    ; data1 と data2 が等しい場合の処理
    JMP end_label

    not_equal_case:
    ; data1 と data2 が等しくない場合の処理

    end_label:

    上記のコードでは、`CMP data1, data2` の部分で`data1` `data2` のデータを比較し、その結果が等しくない場合に`JNE not_equal_case` の部分で`not_equal_case` ラベルにジャンプしています。比較結果が等しくない場合に指定されたアドレスにジャンプします。

    JL(Jump if Less Than)

    JL命令は、指定されたアドレスにジャンプするために使用されます。通常、直前の比較結果が「未満」の場合に条件分岐を行う際に使用されます。

    data1 DB 5
    data2 DB 10

    CMP data1, data2
    JL less_than_case

    greater_than_or_equal_case:
    ; data1 が data2 より大きいか等しい場合の処理
    JMP end_label

    less_than_case:
    ; data1 が data2 より小さい場合の処理

    end_label:

    上記のコードでは、`CMP data1, data2` の部分で`data1` `data2` のデータを比較し、その結果が指定された値より小さい場合に`JL less_than_case` の部分で`less_than_case` ラベルにジャンプしています。比較結果が指定された値より小さい場合に指定されたアドレスにジャンプします。

    JG(Jump if Greater Than)

    JG命令は、指定されたアドレスにジャンプするために使用されます。通常、直前の比較結果が「より大きい」場合に条件分岐を行う際に使用されます。

    data1 DB 15
    data2 DB 10

    CMP data1, data2
    JG greater_than_case

    less_than_or_equal_case:
    ; data1 が data2 より小さいか等しい場合の処理
    JMP end_label

    greater_than_case:
    ; data1 が data2 より大きい場合の処理

    end_label:

    上記のコードでは、`CMP data1, data2` の部分で`data1` `data2` のデータを比較し、その結果が指定された値より大きい場合に`JG greater_than_case` の部分で`greater_than_case` ラベルにジャンプしています。比較結果が指定された値より大きい場合に指定されたアドレスにジャンプします。

    メモリ操作命令

    メモリ操作命令は、アセンブリ言語においてデータを増減したり、スタック領域にデータを追加・取り出したりするために使用されます。

    これらの命令は、プログラムの実行やデータ管理を効率的に行うために必要不可欠です。特に、データの操作やスタックを利用した一時的なデータ保存は、複雑な計算や処理の管理に役立ちます。

    以下に紹介する命令は、メモリ内のデータの増減やスタック操作に関する基本的な命令です。各命令の使い方とコード例を見て、メモリ操作の基本を学びましょう。

    • INC(Increment)
    • DEC(Decrement)
    • PUSH(Push Data onto Stack)
    • POP(Pop Data from Stack)

    INC(Increment)

    INC命令は、指定されたメモリやレジスタの値を1増やすために使用されます。具体的には、INC命令を実行すると、指定されたデータの値が1増加します。

    data DB 5

    INC data

    上記のコードでは、`data` というメモリ領域に格納されている値を1増やすために `INC` 命令が使用されています。`data` の値が1増加し、結果として `data` には新しい値 6が格納されます。

    DEC(Decrement)

    DEC命令は、指定されたメモリやレジスタの値を1減らすために使用されます。DEC命令を実行すると、指定されたデータの値が1減少します。

    data DB 10

    DEC data

    上記のコードでは、`data` というメモリ領域に格納されている値を1減らすために `DEC` 命令が使用されています。`data` の値が1減少し、結果として `data` には新しい値 9が格納されます。

    PUSH(Push Data onto Stack)

    PUSH命令は、スタック(一時的なメモリ領域)にデータをプッシュ(積む)するために使用されます。スタックは後入れ先出し(LIFO)のデータ構造であり、PUSH命令を使用するとデータがスタックのトップに追加されます。

    data DB 20

    PUSH data

    上記のコードでは、`data` というデータをスタックにプッシュ(積む)するために `PUSH` 命令が使用されています。`data` がスタックのトップに追加され、スタックのサイズが増えます。

    POP(Pop Data from Stack)

    POP命令は、スタックからデータをポップ(取り出す)するために使用されます。スタックのトップからデータを取り出し、スタックからそのデータを削除します。POP命令を使用すると、スタックから最後に追加されたデータが取得されます。

    POP data

    上記のコードでは、スタックからデータをポップ(取り出す)するために `POP` 命令が使用されています。スタックのトップからデータが取り出され、`data` に格納されます。また、スタックから取り出したデータはスタックから削除されます。

    データ変換命令

    データ変換命令は、アセンブリ言語において異なる形式のデータを相互に変換するための命令です。

    これにより、数値や文字データをさまざまなフォーマットで扱うことができ、データの処理や表示が効率化されます。

    データを適切な形式に変換することで、アセンブリプログラムの処理能力が向上し、特定の要件にも柔軟に対応可能です。

    文字、10進数、16進数の関係は以下のASCIIコード表を参考にして下さい。

    [ASCIIコード表]

    (出典:IT用語辞典 e-Words

    以下に紹介する命令は、それぞれデータをASCIIコード2進化10進数(BCD)16進数に変換するための基本命令です。これらの命令を理解しておくことで、データの形式変換が容易になり、実用的なデータ操作が可能になります。

    • ASCII(Convert to ASCII)
    • BCD(Convert to Binary Coded Decimal)
    • HEX(Convert to Hexadecimal)

    ASCII(Convert to ASCII)

    ASCII命令は、データをASCIIコード(American Standard Code for Information Interchange)に変換するために使用されます。

    ASCIIは、文字や記号を表現するための標準的な文字コードであり、各文字や記号に対応する数値が割り当てられています。ASCII命令を使用すると、数値や文字をASCIIコードに変換することができます。

    data DB ‘A’                   ; 文字 ‘A’ を表すASCIIコードをdataに格納

    ASCII data                    ; dataをASCIIコードに変換

    data には文字 ‘A’ のASCIIコードである数値 65 が格納されているとします。ASCII data 命令を実行すると、data の値がASCIIコードに変換されます。

    BCD(Convert to Binary Coded Decimal)

    BCD命令は、10進数を2進数で表現する方式の一つです。BCDは、各10進数の桁を4ビットのバイナリで表現し、1桁を4ビットで表現します。これにより、1バイト(8ビット)で2桁の10進数を表現することができます。

    data DB 25            ; 10進数の25を表すデータ

    BCD data               ; dataをBCD形式に変換

    dataには10進数の25を格納されています。BCDに変換すると、10進数の2はBCD形式で 0010 、10進数の5はBCD形式で 0101 となります。よって、10進数の25をBCD形式に変換すると、0010 0101となります。したがって、上記のコードの最終的な値は「0010 0101」となります。

    HEX(Convert to Hexadecimal)

    HEX命令は、データを16進数(Hexadecimal)に変換するために使用されます。

    16進数は、0から9までの数字とAからFまでのアルファベットを使用して表現される数値の体系であり、2進数や10進数よりもコンパクトに表現できます。HEX命令を使用すると、数値を16進数に変換することができます。

    data DB 42            ; 10進数の42を表すデータ

    HEX data              ; dataを16進数に変換

    dataには10進数の42が格納されています。HEXに変換すると、dataには16進数の「2a」が格納されます。

    アセンブリ言語の文法

    アセンブリ言語の文法を理解することは、コンピュータをハードウェアレベルで制御する基礎となります。

    アセンブリ言語は、CPUが理解できる機械語に近い形式で記述され、各命令やオペランド(命令が操作する対象)を用いて、コンピュータに具体的な指示を行います。

    代表的な構成要素には、以下が含まれます。

    • 命令(Instruction):コンピュータに実行させたい操作を表し、例えばMOV命令はデータ転送、ADDは加算を行います。
    • レジスタ(Register):データを一時的に保持するための小さな記憶装置で、CPUの動作に直結しています。
    • 即値(Immediate Value):プログラム内に直接記述される具体的な数値を指し、処理を単純化します。
    • アドレッシングモード(Addressing Mode):データにアクセスする方法で、レジスタアドレッシングやメモリアドレッシングなどが用いられます。
    • コメント:セミコロン(;)を使ってコードにメモを追加し、理解を助けます。

    アセンブリ言語の基本的な文法をマスターすることで、CPUの動作をより深く理解し、より効果的なプログラム作成の基礎が築かれるでしょう。

    関連記事
    【入門】 アセンブリ言語の基本から種類や特徴、C言語との関係や初心者向けの参考書をご紹介!
    【入門】 アセンブリ言語の基本から種類や特徴、C言語との関係や初心者向けの参考書をご紹介!

    アセンブリ言語の書き方と例

    アセンブリ言語のプログラムを作成するには、基本的な書き方や構文の理解が必要です。

    アセンブリ言語では、レジスタやメモリを使用してデータを操作し、制御構造を用いて処理の流れを管理します。また、正確な文法に基づき、効率よくCPUに指示を与えることが求められます。

    以下では、「アセンブリ言語の基本構文」と「実践的な例題」を順に紹介します。基本的な構文を学び、サンプルコードを実行することで、アセンブリ言語でのプログラム作成の基礎を習得しやすくなります。

    アセンブリ言語の基本構文

    ここまで、様々なアセンブリ言語の命令をご紹介してきましたが、アセンブリ言語の基本構文を覚えておくことで、プログラムを理解しやすくなります。サンプルコードを見ながら確認していきましょう。

    要素 説明
    ラベル 命令やデータに名前を付けるための識別子。例えば、LOOP_START:というラベルは、LOOP_STARTという名前で位置を示します。
    命令(オペコード) コンピュータが実行する操作を指定するキーワードやニーモニック。例えば、MOVはデータを移動する命令を示します。
    オペランド 命令の対象や操作に必要なデータやアドレス。例えば、MOV AX, 5の場合、AXはレジスタを示し、5は即値を示します。
    コメント コードの説明や補足を追加するための記述。コメントは通常、セミコロン(;)で始まります。

    以下のサンプルコードを見てみましょう。

    section .text
    :   global _start
    :
    _start:
    :   ; レジスタAXに値5をロードする
    :   MOV ax, 5
    :
    :   ; レジスタAXに値3を加算する
    :   ADD ax, 3
    :
    :   ; レジスタAXの値を10と比較する
    :   CMP ax, 10
    :
    :   ; 等しい場合はラベルENDにジャンプする
    :   JE end_label
    :
    :   ; 等しくない場合は、処理を続けてAXの値をBXに移動する
    :   MOV bx, ax
    :
    end_label:
    :   ; プログラムを終了する
    :   MOV eax, 1
    :   int 0x80

    このサンプルコードでは、グレーはラベル(end_label)ピンクは命令(MOV、ADD、CMP、JE)青はオペランド(レジスタや即値)緑はコメントが含まれています。

    数値をロードし、算術演算を行い、値を比較して条件付きジャンプを行うプログラムを示しています。

    最後に、int 0x80命令を使用してプログラムを終了しています。これらの要素を組み合わせて、アセンブリ言語のプログラムを構築します。

    アセンブリ言語の実践的な例題

    ここでは、アセンブリ言語で実際にコードを書いてみましょう。まずは1ステップごとに何をしているのかを考えることが大切です。

    <例題>

    2つの数値を入力し、それらの数値を足した結果を計算して表示するアセンブリ言語のプログラムを作成する。

    section .data
    :   num1 db 5       ; 最初の数値
    :   num2 db 3       ; 2番目の数値
    :   result db 0       ; 結果を格納する変数
    :
    section .text
    :   global _start
    :
    _start:
    :   ; num1とnum2をレジスタにロード
    :   MOV al, byte [num1]
    :   MOV bl, byte [num2]
    :
    :   ; num1とnum2を足して結果を計算
    :   ADD al, bl
    :
    :   ; 結果をresultに格納
    :   MOV byte [result], al
    :
    :   ; 結果を表示
    :   MOV eax, 4               ; システムコール番号 (sys_write)
    :   MOV ebx, 1                ; 標準出力 (STDOUT)
    :   MOV ecx, result       ; 表示するデータのアドレス
    :   MOV edx, 1               ; データの長さ
    :   int 0x80                    ; システムコール実行
    :
    :   ; プログラムを終了
    :   MOV eax, 1               ; システムコール番号 (sys_exit)
    :   XOR ebx, ebx           ; 終了コード
    :   int 0x80                    ; システムコール実行

    このプログラムは、提供された2つの数値を足して結果を計算し、その結果を標準出力に表示するアセンブリ言語のサンプルコードです。このプログラムを実行すると「8」が表示されます。

    アセンブリ言語の命令一覧のまとめ


    アセンブリ言語は歴史のあるプログラミング言語ですが、現在も特定の分野で広く利用されています。これは、コンピュータの動作原理に直接対応し、高度な制御や最適化が可能であるためです。

    アセンブリ言語を理解することで、プログラムの効率パフォーマンスを向上させることができます。アセンブリ言語の命令一覧を活用すれば、さまざまな操作やプログラムの制御を細かく指定でき、プログラミングの精度を高められます。

    命令一覧に関するご質問や相談があれば、Jiteraにお気軽にお問い合わせください。

    Jiteraでは要件定義からAIが生成するツールで柔軟にアプリやシステムの開発が可能です。

    Jiteraへの問い合わせはこちらから

    例:開発手順、ツール、プロンプト

    メルマガ登録

    社内で話題になった「生成AIに関するニュース」をどこよりも早くお届けします。