メモリのダンプ
アセンブリで再帰したら激しく便利なんじゃないかと思って、久しぶりにボクノスいじり。
アセンブリと再帰の相性は抜群。retの代わりに、jmpを使えば末尾呼び出しの最適化まで出来ちゃう。ステキ。
アセンブリ上なら再帰でも、gotoでも、whileだってforだって、見た目が変わらない。末尾呼び出しの最適化とgotoは等価だって事がよくわかった。
で、メモリのダンプ作ってみた。
0x7c00から512バイトのメモリ状況を覗いてみたら、
残りが少なすぎる・・・ユーティリティ書きすぎて、本体書く場所が無い・・・
しまった。ダイエットしないと。
(qemu上でxp /512 0x7c00とやればダンプ出来ちゃう)
ついでに
フロッピーからの読み込み部分も作ってみた。とりあえず1セクタ。
が・・・はまりまくり。OS自作入門とにらめっこ中・・・。
- セグメントの事をすっかり忘れてた。$0x0800としたら、$0x8000番地に読み込まれる。
- ディスクのセクタ番号は1番から始まる。(0番を一生懸命読み込んでた)
- qemuだと、セクタ1個がちゃんと埋まってないと読み込めない。しかもエラーを返さない(mixi時代にハマった記憶が・・・)
出来たー。
read: pusha mov $0x0800, %ax mov %ax, %es mov $0, %ch mov $0, %dh mov $2, %cl /* sector (1-18)*/ mov $0x02, %ah /* read mode */ mov $1, %al mov $0, %bx mov $0, %dl int $0x13 jc read_error jmp read_end read_error: mov $error_message, %si call print read_end: popa ret /* 略 */ signature: . = _start + 510 .word 0xaa55 test: .ascii "Hello I/O World!!\r\n\0" . = 1024
gotoがあるとエラー処理が自然に書けるというのは嬉しい所。gotoラブになりそうだ(汗
8000番地を読み込むと
Hello I/O World!!
おぉぉぉぉ。やっぱOS自作楽しいっす。
そういえばメモリの配置を全然考えてないや・・・何処に置くかな・・・
メモリより先に
そうだ・・・フロッピーディスクイメージにしないと・・・
OS自作入門の時に使ってたmkfatimgをダウンロードして
やっぱ使い慣れたツールがいいよね!!
が、makeしたらエラー出まくり(汗
主に文字列関係、エラー処理が間違ってる。
がりがり修正中・・・
うぉし、直った!!
(原型が殆んど無くなってしまった)
hello.txtを置いたので次は、hello.txtを読めるようにしよう〜。