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 の基本構文
- リンカとアセンブラの動作
練習問題
- Hello World を出力するプログラム
- 2つの数値を加算するプログラム
- レジスタ間でのデータ移動
; 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)
- 条件フラグの理解
練習問題
- 階乗計算プログラム
- ビット操作(奇数/偶数判定)
- 簡単な数学関数(べき乗計算)
; 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等)
- ループ構造の実装
- ラベルの使用方法
練習問題
- フィボナッチ数列
- 配列の最大値検索
- バブルソート実装
; 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 レジスタ
練習問題
- 複数引数を持つ関数
- 構造体を引数とする関数
- 可変長引数関数の実装
; 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等)
練習問題
- 文字列長計算(strlen 実装)
- 文字列コピー(strcpy 実装)
- 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標準ライブラリ関数の実装
- エラーハンドリング
- パフォーマンス最適化
練習問題
- libc関数の再実装(memcpy, memset, strcmp等)
- 簡単なアルゴリズム(クイックソート)
- 数値変換関数(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アセンブリプログラミングを習得できます。