プログラミング関連での備忘録なんかを載せています。
カレンダー
10 | 2024/11 | 12 |
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
職業:
システムエンジニアなの?
おすすめ
最新コメント
最新記事
(11/15)
(11/15)
(11/15)
(11/08)
(11/07)
最新トラックバック
ブログ内検索
最古記事
(11/06)
(11/07)
(11/07)
(11/07)
(11/07)
アクセス解析
それでは、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
この記事にコメントする