mozyのかきおき

mozyの読書感想文や思考置き場

30日でできるOS自作入門【4日目】

f:id:mozy_ok:20181130220523p:plain

概要

これはMozyの1人アドベントカレンダー 2018 の4日目の記事です。

adventar.org

書こうとした経緯は、こちら

mozy-ok.hatenablog.com

今日の内容

  • プログラム部分をどんどん書き換える

今日やったこと

ORG      0x7c00          ; このプログラムがどこに読み込まれるのか

~中略~

; プログラム本体

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                 ; SIに1を足す
        CMP     AL,0
        JE          fin
        MOV     AH,0x0e         ; 一文字表示する
        MOV     BX,15           ; カラーコードを指定
        INT         0x10            ; ビデオBIOS呼び出し
        JMP         putloop
fin:
        HLT                     ; 何かあるまでCPUを停止させる
        JMP     fin             ; 無限ループ

msg:
        DB      0x0a, 0x0a      ; 改行を2つ
        DB      "hello, world"
        DB      0x0a            ; 改行
        DB      0

        RESB    0x7dfe-$        ; 0x7dfeまでを0x00で埋める命令

        DB      0x55, 0xaa

; 以下はブートセクタ以外の部分の記述

        DB      0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
        RESB    4600
        DB      0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
        RESB    1469432

ハマりポイント

  • ORG命令って昨日までのコードのどこに出て来ていたんだろう
  • このくらいになってくると書いたアセンブラとバイナリの対応がわからなくなってくる
  • 諸々の疑問の解決に最後にあげたブログの内容がすごく参考になった

知ったこと

  • ORG命令
    • origin の略
    • なぜ 0x7c00 なのかはこの節を読み込んでいくとわかるらしい
    • 機械語が実行時にどこに読み込まれるかを指定する
    • この命令をかくと、$ の意味が昨日までとは変わって、出力ファイルの何バイト目であるかではなく、読み込まれる予定のメモリ番地に変わる
  • JMP命令
    • jump の略
    • これはC言語でいうgoto文
    • entry; はラベルでjumpとセットで飛び先の指定に使ったりする
  • MOV命令

    • move の略
    • 基本的にただの代入である
    • MOV AX,0 とは AX = 0; ということ
    • SS, AX とは何かっていうのもまた読んでいくとわかるらしい
  • レジスタの説明

    • AX アキュムレータ
    • CX カウンタ
    • DX データ
    • BX ベース
    • SP スタックポインタ
    • BP ベースポインタ
    • SI スタックインデックス
    • DI デスティネーションインデックス
  • これらは全て16ビットのレジスタ
  • その証としてX が付いていてこれは extend (拡張)という意味
  • 昔はCPUが8bitだった時代の名残で進化したんだぜという意味で付いている。

参考にした

yuyubu.hatenablog.com