こないだからO30日でできる自作入門という本を始めてます。
文章も面白いし、書いている内容も結構濃いし、なかなか面白い。
2日目は1日目にバイナリエディタで書いていたソースをアセンブリ言語にして進めていく感じになってます。
試しに1日目のほぼバイナリのソースを逆アセンブルしていたので、今回のアセンブリのコードと比較してみました。
前回に登場した逆アセンブルしたもの
8048060: b8 00 00 8e d0 mov $0xd08e0000,%eax 8048065: bc 00 7c 8e d8 mov $0xd88e7c00,%esp 804806a: 8e c0 mov %eax,%es 804806c: be 74 7c 8a 04 mov $0x48a7c74,%esi 8048071: 83 c6 01 add $0x1,%esi 8048074: 3c 00 cmp $0x0,%al 8048076: 74 09 je 0x8048081 8048078: b4 0e mov $0xe,%ah 804807a: bb 0f 00 cd 10 mov $0x10cd000f,%ebx 804807f: eb ee jmp 0x804806f 8048081: f4 hlt 8048082: eb fd jmp 0x8048081 8048084: 0a 0a or (%edx),%cl 8048086: 48 dec %eax 8048087: 65 gs 8048088: 6c insb (%dx),%es:(%edi) 8048089: 6c insb (%dx),%es:(%edi) 804808a: 6f outsl %ds:(%esi),(%dx) 804808b: 2c 20 sub $0x20,%al 804808d: 77 6f ja 0x80480fe 804808f: 72 6c jb 0x80480fd 8048091: 64 21 0a and %ecx,%fs:(%edx) 8048094: 0a 00 or (%eax),%al
ソースコード 本体の一部のみです。
entry: MOV AX,0 MOV SS,AX MOV SP,0x7c00 MOV DS,AX MOV ES,AX MOV SI,msg putloop: MOV AL,[SI] ADD SI,1 CMP AL,0 JE fin MOV AH,0x0e MOV BX,15 INT 0x10 JMP putloop fin: HLT JMP fin msg: DB 0x0a, 0x0a DB "hello, world" DB 0x0a DB 0
逆アセンブルした方は32ビットレジスタを使っているし、見た目はちょっと違うけど、やってることは同じように見える。ふんふん。
この書籍はテーマじたいがOSなんで、だいぶコンピュータの基礎から書いてあるのだけど、レジスタを意識してプログラムを書けば速いプログラムがかけるっていう理屈はとっても納得できたけど、どうやって意識するのかが問題だね。
たぶん本書を読んでいけば答えは載ってるかもしれないけど、分かるのかな?
ちょっと考えてみよう。
・・・うーむ。
まあ、このぐらいにしとこうか。
ブートセクタの最後が0x55 0xaaなのは決まり事のようだ。
書籍ではWindows系を作っているので、今使っているLinuxのブートセクタを覗いてみよう。
$ sudo dd if=/dev/sda bs=512 count=1 > mbr.dat [/tmp] 1+0 records in 1+0 records out 512 bytes (512 B) copied, 8.5621e-05 s, 6.0 MB/s
$ hexdump -C mbr.dat [/tmp] 00000000 eb 48 90 10 8e d0 bc 00 b0 b8 00 00 8e d8 8e c0 |.H..............| 00000010 fb be 00 7c bf 00 06 b9 00 02 f3 a4 ea 21 06 00 |...|.........!..| 00000020 00 be be 07 38 04 75 0b 83 c6 10 81 fe fe 07 75 |....8.u........u| 00000030 f3 eb 16 b4 02 b0 01 bb 00 7c b2 80 8a 74 03 02 |.........|...t..| 00000040 80 00 00 80 ea 49 08 00 00 08 fa 90 90 f6 c2 80 |.....I..........| 00000050 75 02 b2 80 ea 59 7c 00 00 31 c0 8e d8 8e d0 bc |u....Y|..1......| 00000060 00 20 fb a0 40 7c 3c ff 74 02 88 c2 52 f6 c2 80 |. ..@|<.t...R...| 00000070 74 54 b4 41 bb aa 55 cd 13 5a 52 72 49 81 fb 55 |tT.A..U..ZRrI..U| 00000080 aa 75 43 a0 41 7c 84 c0 75 05 83 e1 01 74 37 66 |.uC.A|..u....t7f| 00000090 8b 4c 10 be 05 7c c6 44 ff 01 66 8b 1e 44 7c c7 |.L...|.D..f..D|.| 000000a0 04 10 00 c7 44 02 01 00 66 89 5c 08 c7 44 06 00 |....D...f.\..D..| 000000b0 70 66 31 c0 89 44 04 66 89 44 0c b4 42 cd 13 72 |pf1..D.f.D..B..r| 000000c0 05 bb 00 70 eb 7d b4 08 cd 13 73 0a f6 c2 80 0f |...p.}....s.....| 000000d0 84 f0 00 e9 8d 00 be 05 7c c6 44 ff 00 66 31 c0 |........|.D..f1.| 000000e0 88 f0 40 66 89 44 04 31 d2 88 ca c1 e2 02 88 e8 |..@f.D.1........| 000000f0 88 f4 40 89 44 08 31 c0 88 d0 c0 e8 02 66 89 04 |..@.D.1......f..| 00000100 66 a1 44 7c 66 31 d2 66 f7 34 88 54 0a 66 31 d2 |f.D|f1.f.4.T.f1.| 00000110 66 f7 74 04 88 54 0b 89 44 0c 3b 44 08 7d 3c 8a |f.t..T..D.;D.}<.| 00000120 54 0d c0 e2 06 8a 4c 0a fe c1 08 d1 8a 6c 0c 5a |T.....L......l.Z| 00000130 8a 74 0b bb 00 70 8e c3 31 db b8 01 02 cd 13 72 |.t...p..1......r| 00000140 2a 8c c3 8e 06 48 7c 60 1e b9 00 01 8e db 31 f6 |*....H|`......1.| 00000150 31 ff fc f3 a5 1f 61 ff 26 42 7c be 7f 7d e8 40 |1.....a.&B|..}.@| 00000160 00 eb 0e be 84 7d e8 38 00 eb 06 be 8e 7d e8 30 |.....}.8.....}.0| 00000170 00 be 93 7d e8 2a 00 eb fe 47 52 55 42 20 00 47 |...}.*...GRUB .G| 00000180 65 6f 6d 00 48 61 72 64 20 44 69 73 6b 00 52 65 |eom.Hard Disk.Re| 00000190 61 64 00 20 45 72 72 6f 72 00 bb 01 00 b4 0e cd |ad. Error.......| 000001a0 10 ac 3c 00 75 f4 c3 00 00 00 00 00 00 00 00 00 |..<.u...........| 000001b0 00 00 00 00 00 00 00 00 8d cf 0e 00 00 00 80 20 |............... | 000001c0 21 00 83 dd 1e 3f 00 08 00 00 00 a0 0f 00 00 dd |!....?..........| 000001d0 1f 3f 8e fe ff ff 00 a8 0f 00 00 58 70 02 00 00 |.?.........Xp...| 000001e0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| 000001f0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 aa |..............U.| 00000200
おお、ちゃんと0x55 0xaaになっとるね。
あとは出だしがLinuxは0xeb 0x48 0x90 、本書は 0xeb 0x4e 0x90 になってる。
ちょっと調べた感じだと最初の0xebは “0xEB cb JMP rel8” という事らしい。
0x00 0x01 0x02 についてはJMP命令が入るようだ。
0x03番目からはブートセクタの名前を8バイトで入れるとなるのはFAT12に限らずだいたいどれも同じなようでした。
なんとなく納得できたので次に進もうと思います。
ところで最近と言うか半年ほどになるけど、ブログの進め方が1冊の本を中心に進めていたんだけど、テーマがプログラムの勉強だったからそれが合っていただけなので、ぼちぼち自由に進めようと思います。
よいコンテンツを作っていればまたどこかに取り上げられたりして、うはうはITリテラシーの向上につながるというものです。
とは言うもののしばらくはカーネルの事とかになりそうだ(笑)
ブログをやりだした当初はブログなんてサーバーの勉強のおまけだったのだが、今では逆転してコンテンツが中心になってくると、サーバーに変化を起こす事に対してかなり慎重になってしまう。
本来は今のような状況が目的だったんだけど、実際にこんな状態になるとブログだけ別のものに移そうかとか、いろいろと考えてしまうんで面白いもんだね。
参考文献
30日でできるOS自作入門 川合秀美著
参考サイト
0から作るソフトウェア開発 ブートローダその4 FAT12
adsaria mood LinuxにおけるにおけるMBRのまとめとバックアップ方法
Sunday Programmer PCが起動する仕組み