Linux Assembly HOWTO を読んだ
http://www.tldp.org/HOWTO/Assembly-HOWTO/index.html
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. わからないことばかりで歯痒い。