メモリのダンプ

アセンブリ再帰したら激しく便利なんじゃないかと思って、久しぶりにボクノスいじり。

アセンブリ再帰の相性は抜群。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をダウンロードして

OSASK関係 - mkfatimg

やっぱ使い慣れたツールがいいよね!!


が、makeしたらエラー出まくり(汗


主に文字列関係、エラー処理が間違ってる。


がりがり修正中・・・


うぉし、直った!!


(原型が殆んど無くなってしまった)


hello.txtを置いたので次は、hello.txtを読めるようにしよう〜。