コンテンツにスキップ

プログラミング/アセンブリ言語

出典: フリー教科書『ウィキブックス(Wikibooks)』

アセンブリ言語とは

[編集]

アセンブリ言語は、コンピュータのプロセッサに直接命令を与える低レベルプログラミング言語です。機械語と人間が読み書きできる形式の中間に位置し、各命令が直接的にCPUの動作に対応しています。高級言語とは異なり、アセンブリ言語はハードウェアの構造と密接に関連しており、プロセッサのアーキテクチャごとに大きく異なります。

アーキテクチャの基本

[編集]

代表的なアーキテクチャには、Intel x86とARM、RISC-Vなどがあります。ここではx86アーキテクチャを中心に説明します。

レジスタ

[編集]

x86アーキテクチャの主要なレジスタ:

; 汎用レジスタ
eax    ; 算術演算用の主要レジスタ
ebx    ; ベースアドレス用
ecx    ; カウンタ用
edx    ; データレジスタ

; インデックスレジスタ
esi    ; ソースインデックス
edi    ; デスティネーションインデックス

; スタックとベースポインタ
esp    ; スタックポインタ
ebp    ; ベースポインタ

基本的な命令

[編集]

データ移動命令

[編集]
; 即値の代入
mov eax, 42        ; eaxレジスタに42を代入
mov ebx, [address] ; メモリアドレスからデータを読み込む

; レジスタ間でのデータ移動
mov ecx, eax       ; eaxの値をecxにコピー

算術演算命令

[編集]
; 加算
add eax, 10        ; eaxに10を加算
inc ebx            ; ebxをインクリメント

; 減算
sub eax, 5         ; eaxから5を減算
dec ecx            ; ebxをデクリメント

; 乗算と除算
mul ebx            ; eaxとebxを乗算
div ecx            ; eaxをecxで除算

比較と条件分岐

[編集]
; 比較命令
cmp eax, ebx       ; eaxとebxを比較

; 条件ジャンプ
je label_equal     ; 等しい場合にジャンプ
jne label_notequal ; 等しくない場合にジャンプ
jg label_greater   ; より大きい場合にジャンプ
jl label_less      ; より小さい場合にジャンプ

簡単なプログラム例

[編集]

hello worldを表示するシンプルなアセンブリプログラム(Linux/i686):

section .data
    message db 'Hello, World!', 0ah  ; メッセージと改行

section .text
    global _start

_start:
    ; システムコールでメッセージを出力
    mov eax, 4      ; システムコール番号(write)
    mov ebx, 1      ; ファイルディスクリプタ(標準出力)
    mov ecx, message ; メッセージのアドレス
    mov edx, 14     ; メッセージの長さ
    int 0x80        ; システムコール呼び出し

    ; プログラム終了
    mov eax, 1      ; システムコール番号(exit)
    xor ebx, ebx    ; 終了ステータス0
    int 0x80        ; システムコール呼び出し

注意点と学習のポイント

[編集]

アセンブリ言語は非常に強力ですが、同時に複雑で扱いにくい言語です。主に以下のシーンで使用されます:

  • ハードウェアに近い最適化が必要な場合
  • デバイスドライバの開発
  • セキュリティリサーチ
  • エミュレータやシミュレータの開発

初学者は、アセンブリ言語を完全に習得するよりも、その基本的な概念と仕組みを理解することに重点を置くべきです。

まとめ

[編集]

アセンブリ言語は、コンピュータのハードウェアと直接対話する言語であり、プログラマに最下層でのシステム制御を提供します。しかし、その複雑さゆえに、日常的なアプリケーション開発には使用されません。それでも、コンピュータサイエンスを深く理解する上で、アセンブリ言語の知識は非常に重要です。