忍者ブログ
2024.04│ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
プログラミング関連での備忘録なんかを載せています。
カレンダー
03 2024/04 05
S M T W T F S
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
プロフィール
HN:
たっく
年齢:
42
性別:
男性
誕生日:
1982/03/11
職業:
システムエンジニアなの?
最新コメント
最新トラックバック
ブログ内検索
アーカイブ
アクセス解析
2024年04月26日 (Fri)
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

2009年11月07日 (Sat)

それでは、2日目をはじめます。

1日目は、バイナリエディタで直接、ブートできるフロッピーディスクを作成する事と、同じ物をアセンブラを使用して作成しました。

2日目は、「アセンブラ学習とMakefile入門」です。
1日目に作成したアセンブラのソースでは、まだプログラム本体の機械語を直接DB命令で書いています。
今回は、その部分をアセンブリ言語に直すことをします。


「30日でできる!OS自作入門」を読みながら、修正します。

まず、ソースの先頭に、「ORG 0x7c00」を記入します。
これは、メモリ上のどの位置にこのプログラムが読み込まれるかと言うのを
アセンブラに教えている物の様です。

その下に、「JMP entry」を記入します。
これは、プログラム本体につけたラベル部分に飛んでねっていう命令です。
あと、JMP命令を書いたことで「DB 0xeb, 0x4e, 0x90」の部分の最初の0xebと0x4eが消せます。
これは、「JMP entry」相当の機械語だったためです。(0x90はまた別なのでこいつだけ残しておきます。)


また、プログラム本体を、以下の様に書き換えます。


; プログラム本体
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                     ; 何かあるまでCPUを停止
        JMP     fin             ; 無限ループ

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

        TIMES   0x1fe-($-$$) DB 0       ; 0x001feまでを0x00で埋める

        DB      0x55, 0xaa


大分、プログラムらしくなって来ました。

ソースの解説をみると、大事なところはこんな所でしょうか。
  • ORG命令はプログラムの起点となるメモリの位置をアセンブラに教える為に使う。今回の場合、 「0x7c00」になっているのは、PC/AT互換機の仕様で、ブートはそこから必ず始めなければいけないと決まっているから 。
  • JMP命令は、指定したメモリの番地に強制的に飛ぶ。ラベルが指定されている場合は、そのラベルがついた位置へ飛ぶ。(この場合、entry:ラベルの次のMOV命令のところに飛ぶと思う)
  • MOV AX,0」はC言語の「AX=0」と同じ意味になる。
  • AXとか、SSとかはレジスタ(メモリよりも早くて容量が小さい記憶領域)
  • [SI]という形で代入された場合は、レジスタではなくメモリの位置になる。(よ〜くみると、メモリっぽい形にみえるかも・・・)
  • CMP命令とJE命令は、一塊でC言語のif文相当の命令を書ける。
  • HLT命令は、CPUをちょっとだけ休止させる。(sleepと同じ様な命令だとおもう)


今回はここまでです。
次回は、2日目のその2として、アセンブラでフロッピーイメージを作るのは無駄が多いので、ブートセクタだけを作る様に変更しましょ。ついでにMakefileを使いましょ。と言うことの様です。


--
勘違いしている箇所があれば、指摘して頂けると助かります。

PR
この記事にコメントする
お名前
タイトル
文字色
メールアドレス
URL
コメント
パスワード   Vodafone絵文字 i-mode絵文字 Ezweb絵文字
この記事へのトラックバック
この記事にトラックバックする:
←No.10No.9No.8No.7No.5No.4No.3No.2No.1No.6