docker
アセンブリ
低レベルプログラミング

書籍「低レベルプログラミング」アセンブリ実行 Docker 環境の構築

はじめに

  • 書籍「低レベルプログラミング」では VMWare イメージで実行環境が提供されているが Docker を使いたかったので構築したメモ。
  • 書籍内ではアセンブリの後に C もやるが、まだ最初なのでとりあえずアセンブラが動くところまで。

環境構築

  • Dockerfile の作成
FROM debian:9

RUN apt-get update
RUN apt-get install -y binutils nasm gdb
RUN apt-get install -y vim
  • Docker イメージの作成
docker build -t low-level-programming .

実行

git clone https://github.com/Apress/low-level-programming
  • コードをマウントして Docker イメージの実行
cd /path/to/low-level-programming
docker run -it -v $(pwd)/listings:/listings low-level-programming bash
  • hello.asm のコンパイルと実行
cd /tmp
nasm -felf64 /listings/chap2/hello/hello.asm -o hello.o
ld -o hello hello.o
./hello

デバッガの実行

  • Docker コンテナ内でデバッガを有効にするために実行オプションを追加する
docker run -it --cap-add=SYS_PTRACE --security-opt="seccomp=unconfined" -v $(pwd)/listings:/listings low-level-programming bash
  • gdb コマンドでデバッガを起動する
# コンパイルとデバッガの実行
nasm -felf64 /listings/chap2/hello/hello.asm -o hello.o
ld -o hello hello.o
gdb hello

# アセンブリ向けレイアウトの表示
(gdb) layout asm

# レジスタを表示するレイアウト
(gdb) layout regs

# ブレークポイントを設定する
(gdb) b _start

# 実行
(gdb) run

# 一ステップ実行
(gdb) si

# print $"レジスタ名" でレジスタの値を表示
(gdb) p $cl

# 終了
(gdb) quit