Linux Assembly HOWTO

32ビット x86 アセンブラについての HOWTO だ。DOS プログラマに向けて書かれてるのかな?

しょっぱなから種々のアセンブラやプロジェクトの紹介が続き、おなかいっぱい。Linux のブートローダを書くのに使われていた as86 も出てきた。今は GRUB とかもあるしカーネルのブートローダは使われないんだろうけど。

実際にアセンブラで Hello World プログラムを書いてみるのは第6章。手元の環境が x64 なので i386 のバイナリをリンクするのに手間取った。nasm -f elf hello.asm で hello.o を作った後は、ld -s -m elf_i386 -o hello hello.o で実行ファイルを作る。

$ file hello.o hello
hello.o: ELF 32-bit LSB  relocatable, Intel 80386, version 1 (SYSV), not stripped
hello:   ELF 32-bit LSB  executable, Intel 80386, version 1 (SYSV), statically linked, stripped

アセンブラで書いたオブジェクトファイルを insmod でカーネルに組込む例もあった。こわいから試してないけど、動く気がしない。32ビットと64ビットのコードって共存できるの?

ELF フォーマットっていうレイヤーがあったり、.text や .bss セクションって何なの? リンクされると何が起こるの? ユーザープロセスが産まれるってどういうこと? etc. わからないことばかりで歯痒い。

アセンブラの今日的意義?

int 0x80 と唱えて、C で書けるものをアセンブラで書いても仕方ない。アプリケーションプログラマにとっては、TSC を読んだり、SIMD 命令を使うなどが考えられる用途だろうか。