Home - GawinGowin/libasm GitHub Wiki

Welcome to the libasm wiki!

64-bit アセンブリ習得ロードマップ

概要

64-bit アセンブリ言語を NASM (Intel構文) で習得するための段階的学習計画

学習要件

  • 64-bit アセンブリ
  • 呼び出し規約の理解必須
  • .s ファイル形式(インラインASM禁止)
  • NASM コンパイラ使用
  • Intel 構文(AT&T構文禁止)
  • -no-pie フラグ使用禁止

学習ステップ

フェーズ1: 基礎知識(1-2週間)

目標: アセンブリの基本概念とツールの理解

学習内容

  • レジスタの種類と役割(RAX, RBX, RCX, RDX, RSI, RDI, RSP, RBP等)
  • メモリアドレッシング
  • NASM の基本構文
  • リンカとアセンブラの動作

練習問題

  1. Hello World を出力するプログラム
  2. 2つの数値を加算するプログラム
  3. レジスタ間でのデータ移動
; practice1.s - Hello World
section .data
    msg db 'Hello, World!', 0xA
    len equ $ - msg

section .text
    global _start

_start:
    ; write システムコール
    mov rax, 1
    mov rdi, 1
    mov rsi, msg
    mov rdx, len
    syscall
    
    ; exit システムコール
    mov rax, 60
    mov rdi, 0
    syscall

フェーズ2: 基本命令とデータ操作(2-3週間)

目標: 基本的な算術・論理演算の習得

学習内容

  • 算術命令(ADD, SUB, MUL, DIV)
  • 論理命令(AND, OR, XOR, NOT)
  • ビットシフト(SHL, SHR)
  • 条件フラグの理解

練習問題

  1. 階乗計算プログラム
  2. ビット操作(奇数/偶数判定)
  3. 簡単な数学関数(べき乗計算)
; practice2.s - 階乗計算
section .text
    global factorial

factorial:
    ; 引数: rdi (n)
    ; 戻り値: rax
    cmp rdi, 1
    jle .base_case
    
    push rdi
    dec rdi
    call factorial
    pop rdi
    
    mul rdi
    ret

.base_case:
    mov rax, 1
    ret

フェーズ3: 制御構造(2週間)

目標: 分岐とループの実装

学習内容

  • 条件分岐(JMP, JE, JNE, JL, JG等)
  • ループ構造の実装
  • ラベルの使用方法

練習問題

  1. フィボナッチ数列
  2. 配列の最大値検索
  3. バブルソート実装
; practice3.s - フィボナッチ数列
section .text
    global fibonacci

fibonacci:
    ; 引数: rdi (n)
    ; 戻り値: rax
    cmp rdi, 2
    jl .base_case
    
    push rdi
    dec rdi
    call fibonacci
    mov rbx, rax
    
    pop rdi
    sub rdi, 2
    call fibonacci
    add rax, rbx
    ret

.base_case:
    mov rax, rdi
    ret

フェーズ4: 呼び出し規約とスタック管理(3週間)

目標: System V AMD64 ABI の完全理解

学習内容

  • System V AMD64 呼び出し規約
  • スタックフレームの構造
  • 引数渡し(レジスタ vs スタック)
  • 戻り値の処理
  • callee-saved vs caller-saved レジスタ

練習問題

  1. 複数引数を持つ関数
  2. 構造体を引数とする関数
  3. 可変長引数関数の実装
; practice4.s - 複数引数関数
section .text
    global sum_six_numbers

sum_six_numbers:
    ; 引数: rdi, rsi, rdx, rcx, r8, r9
    ; 戻り値: rax
    mov rax, rdi
    add rax, rsi
    add rax, rdx
    add rax, rcx
    add rax, r8
    add rax, r9
    ret

フェーズ5: メモリ管理と配列(2週間)

目標: メモリ操作の習得

学習内容

  • アドレッシングモード
  • 配列とポインタ操作
  • 文字列処理命令(MOVS, SCAS等)

練習問題

  1. 文字列長計算(strlen 実装)
  2. 文字列コピー(strcpy 実装)
  3. 2次元配列操作
; practice5.s - strlen 実装
section .text
    global my_strlen

my_strlen:
    ; 引数: rdi (文字列ポインタ)
    ; 戻り値: rax (長さ)
    mov rax, 0
    
.loop:
    cmp byte [rdi + rax], 0
    je .done
    inc rax
    jmp .loop
    
.done:
    ret

フェーズ6: 実践プロジェクト(3-4週間)

目標: 実用的なライブラリ関数の実装

学習内容

  • C標準ライブラリ関数の実装
  • エラーハンドリング
  • パフォーマンス最適化

練習問題

  1. libc関数の再実装(memcpy, memset, strcmp等)
  2. 簡単なアルゴリズム(クイックソート)
  3. 数値変換関数(atoi, itoa)
; practice6.s - memcpy 実装
section .text
    global my_memcpy

my_memcpy:
    ; 引数: rdi (dst), rsi (src), rdx (size)
    ; 戻り値: rax (dst)
    mov rax, rdi
    mov rcx, rdx
    
    cld
    rep movsb
    
    ret

学習ツールとリソース

必要なツール

# NASM インストール
sudo apt-get install nasm

# コンパイルとリンク
nasm -f elf64 program.s -o program.o
ld program.o -o program

デバッグツール

  • GDB での アセンブリデバッグ
  • objdump でのディスアセンブリ

学習スケジュール(合計12-15週間)

フェーズ 内容 時間/日
1-2 基礎 レジスタ・構文 1-2時間
3-5 基本命令 算術・論理演算 1-2時間
6-7 制御構造 分岐・ループ 1-2時間
8-10 呼び出し規約 ABI理解 2-3時間
11-12 メモリ管理 配列・ポインタ 2時間
13-16 実践 プロジェクト実装 2-3時間

成功の指標

  • システムコールを使用したプログラム作成
  • 複雑な呼び出し規約を持つ関数実装
  • C言語との相互運用プログラム作成
  • 最適化されたライブラリ関数実装

このロードマップに従って段階的に学習することで、要件を満たす64-bitアセンブリプログラミングを習得できます。