30天自制操作系统:第二天

30天自制操作系统:第二天慢慢更新不着急哦 , 会越来越难 , 更新也会越来越慢滴 。
30天自制操作系统:第二天文章插图
1.将扇区加载到指定内存中 。 在第一天的基础上进行代码的加工 , 第二天给程序中加入将引导扇区读入指定内存地址:0x7c00处 , 并使用软中断显示字符 。
出现了一个问题 , 发现0扇区内出现莫名其妙的数据 , 经过分析 , 是编译器自己写入的启动数据 。
优化后的代码为:
; hello-os; TAB=4ORG0x7c00; このプログラムがどこに読み込まれるのかJMPentryentry:MOVAX,0; 初始化寄存器MOVSS,AXMOVSP,0x7c00MOVDS,AXMOVES,AXMOVSI,msgputloop:MOVAL,[SI]ADDSI,1CMPAL,0JEfinMOVAH,0x0e; ?示一个文字MOVBX,15; 指定字符?色 , 不知道???色没? ,有知道的大?告?我下 。INT0x10; ?用??bios , 可以理解??用了一个接口 。JMPputloopfin:HLT; ?cpu停止防止cpu空? , 等待指令 , 只要外部?生?化 , 比如按下?? , 移?鼠? , cpu就会醒?来???行 。JMPfin; 死循? 。 msg:DB0x0a, 0x0a; 改行を2つDB"hello, uos1"DB0x0a; 改行DB0RESB 0x7dfe-$DB0x55, 0xaa; 以下はブートセクタ以外の部分の記述DB0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00RESB 4600DB0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00RESB 1469432经过下面命令编译后 , 生成helloos.img打开后如图所示,出现了一些代码中未实现的数据 。
..\z_tools\nask.exe helloos.nas helloos.img
30天自制操作系统:第二天文章插图
后来经过屏蔽代码 , 显示如图 。
去掉jmp后面的代码也是可以启动起来的 , 证明是编译器写入的初始数据 。
30天自制操作系统:第二天文章插图
30天自制操作系统:第二天文章插图
费了好长时间再调这个问题 , 请大佬们不要鄙视 。
为什么是0x7c00处呢 , 这是bios规定的 。 0x00007c00-0x00007dff为启动区内容的装载地址
执行结果如图:
30天自制操作系统:第二天文章插图
2.完善工程架构去掉helloos.nas中55aa后边占字符的所有代码 , 只留下引导扇区内容 。
; hello-os; TAB=4ORG0x7c00; このプログラムがどこに読み込まれるのか; 以下は標準的なFAT12フォーマットフロッピーディスクのための記述JMPentryDB0x90DB"HELLOIPL"; ブートセクタの名前を自由に書いてよい(8バイト)DW512; 1セクタの大きさ(512にしなければいけない)DB1; クラスタの大きさ(1セクタにしなければいけない)DW1; FATがどこから始まるか(普通は1セクタ目からにする)DB2; FATの個数(2にしなければいけない)DW224; ルートディレクトリ領域の大きさ(普通は224エントリにする)DW2880; このドライブの大きさ(2880セクタにしなければいけない)DB0xf0; メディアのタイプ(0xf0にしなければいけない)DW9; FAT領域の長さ(9セクタにしなければいけない)DW18; 1トラックにいくつのセクタがあるか(18にしなければいけない)DW2; ヘッドの数(2にしなければいけない)DD0; パーティションを使ってないのでここは必ず0DD2880; このドライブ大きさをもう一度書くDB0,0,0x29; よくわからないけどこの値にしておくといいらしいDD0xffffffff; たぶんボリュームシリアル番号DB"HELLO-OS" ; ディスクの名前(11バイト)DB"FAT12"; フォーマットの名前(8バイト)RESB 18entry:MOVAX,0MOVSS,AXMOVSP,0x7c00MOVDS,AXMOVES,AXMOVSI,msgputloop:MOVAL,[SI]ADDSI,1; SIに1を足すCMPAL,0JEfinMOVAH,0x0e; 一文字表示ファンクションMOVBX,15; カラーコードINT0x10; ビデオBIOS呼び出しJMPputloopfin:HLT; 何かあるまでCPUを停止させるJMPfin; 無限ループmsg:DB0x0a, 0x0a; 改行を2つDB"hello, uos"DB0x0a; 改行DB0RESB 0x7dfe-$; 0x7dfeまでを0x00で埋める命令DB0x55, 0xaa


推荐阅读