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 命令を使うなどが考えられる用途だろうか。