; 今日添加的内容
MOV AX,0x0820
MOV ES,AX
MOV CH,0 ; 柱面0
MOV DH,0 ; 磁头0
MOV CL,2 ; 扇区2
MOV AH,0x02 ; AH=0x02 : 磁盘读取
MOV AL,1 ; 1个扇区
MOV BX,0
MOV DL,0x00 ; A驱动器
INT 0x13 ; 磁盘BIOS调用
JC error
JC命令の機能:
いわゆるJCは、キャリーの場合はジャンプの略語です。つまり、フラグビット1のみの場合は、ジャンプします。
INT 0x13命令に関しては、BIOS関数0x13を呼び出すことであることがわかっていますが、それが何をするのかはまだわかりません。
私たちは以下を見つけることができます:
- ディスクの読み取り、書き込み、セクター検証、およびシーク
- AH = 0x02(ディスクの読み取り)
- AH = 0x03
- AH = 0x04
- AH = 0x0c
- AL =処理されるセクターの数;(連続するセクターのインテリジェントな同時処理)
- CH =シリンダー番号&0xff
- CL =セクター番号(0-5桁)|(シリンダー番号&0x300)>> 2;
- DH =ヘッド番号
- DL =ドライブ文字;
- ES:BX =バッファアドレス;(チェック、つまり、シーク時に使用されません)
- 戻り値
- FLACS.CF0:エラーなし、AH0
- FLACS.CF == 1:エラーがあり、エラー番号はAHに保存されます
戻り値のFLACS.CFは、BIOSでこの関数を呼び出した後、エラーがない場合はキャリーフラグが0であり、エラーがある場合はキャリーフラグが1であることを意味します。
CPUにはいくつかの1ビットレジスタがあります。この1ビットレジスタをフラグと呼びます。英語にはフラグはなく、他にもいくつかの1ビットレジスタがあります。CH、CL、DH、およびDLは、それぞれシリンダー番号、セクター番号、ヘッド番号、およびドライブ番号です。
フロッピーディスクの構造:
これまでに開発されたプログラムはセグメントレジスタを考慮していませんが、実際にはメモリ内のアドレスを指定する必要があり、セグメントレジスタも指定する必要があります。通常、これを省略すると、DSデータセグメントレジスタがデフォルトのセグメントレジスタ。
!cons_nt.batをダブルクリックし、cmdにmake runと入力すると
、エラーメッセージは表示されません。エラーメッセージがある場合は、エラーメッセージが表示されます。
フロッピーディスクの信頼性が低いため、データが読み取れない場合がありますが、このときはもう一度読み取ってください。したがって、エラーが1つか2つある場合でも、数回再読み取りするだけです。上記のプログラムと次の最適化に基づいて、エラーが発生したときにループ読み取りを実行できます。
JNC命令の機能:JC機能の反対、つまり、キャリーフラグが0の場合、ジャンプします。JAEは条件付きジャンプでもあります。これは、以上の場合にジャンプすることを意味します。
ディスクを再読み込みする前に、AH = 0x00、DL = 0x00、INT 0x13の処理が行われ、フロッピーディスクの状態をリセットして再度読み取ります。
18セクターの読み取りセクター
を循環的に読み取ります。つまり、上記の機能を循環的に繰り返します。最終画面は以前と同じですが、この時点で、ディスク上の512 * 17バイトをメモリ内の0x8200〜0xa3ffに読み取りました。
次に、10個のシリンダーを読み取ります。これはequalの省略形である別の命令EQUです。CYLSEQU10はCYLS = 10を意味します。
CYLS
EQU10;どの程度ORG0x7c00;このプログラムはどこで読み取られますか
追加トピック:ファイルを空のフロッピーディスクに保存する場合
(1)ファイル名は0x002600の後の場所に書き込まれます
(2)ファイルの内容は0x004200の後の場所に書き込まれます
書き込まれたプログラムはブート領域から開始し、ディスクの内容をメモリアドレス0x8000にロードするため、ディスク0x4200の内容はメモリアドレス0x8000 + 0x4200 = 0xc200に配置する必要があります。
別のファイルharibote.nasにORG0xc200を書き込み、ipl.nas処理の最後にJMP 0xc200命令を追加すると、ipl.nasの最後からこのメモリアドレスにジャンプして、コードコンテンツの実行を続行できます。
次に、haribote.nasに次のコマンドを記述して、最終的なコマンドラインウィンドウに黒いウィンドウを表示します。
; haribote-os
; TAB=4
ORG 0xc200 ; 这个程序会被读取到哪里
MOV AL,0x13 ; VGA图形,320x200x8bit颜色
MOV AH,0x00
INT 0x10
fin:
HLT
JMP fin
AH = 0x00に設定した後、グラフィックカードのBIOSの関数0x10を呼び出して、表示モードを切り替えます。ここで0x13画像モードを選択すると、8ビットカラーモードで256色を使用できます。
make runの後、プログラムが正常に実行されていることを示す黒いウィンドウが正常に表示され、グラフィカルモードになり、カーソルが消えます。
32ビットモードの準備準備
harness.nasの変更
;haribote-os
;TAB = 4
; 有关BOOT_INFO
CYLS EQU 0x0ff0 ;设定启动区
LEDS EQU 0x0ff1
VMODE EQU 0x0ff2 ;有关颜色数目的信息
SCRNX EQU 0x0ff4 ;分辨率的x
SCRNY EQU 0x0ff6 ;分辨率的y
VRAM EQU 0x0ff8 ;图像缓冲区的开始地址,VRAM指显卡内存
ORG 0xc200 ;程序要装载的地方
MOV AL,0x13 ;VGA显卡,32x00x8位颜色
MOV AH,0x00 ;设置AH=0x00,调用显卡BIOS函数,就可以切换显示模式了,AL中设置模式
INT 0x10
MOV BYTE [VMODE],8 ; 记录画面模式
MOV WORD [SCRNX],320
MOV WORD [SCRNY],200
MOV DWORD [VRAM],0x000a0000 ;这种画面模式下"VRAM是0xa0000到0xaffff的64KB
; 用BIOS取得键盘上各种LED指示灯的状态
MOV AH,0x02
INT 0x16 ; keyboard BIOS
MOV [LEDS],AL
fin:
HLT
JMP fin
いわゆる32ビットモードとは、CPUのモードを指します。CPUには、16ビットと32ビットの2つのモードがあります。16ビットモードで起動する場合は、AXやCXなどの16個のレジスタを使用すると非常に便利ですが、EAXやECXなどの32ビットレジスタは非常に不便です。また、機械語のコマンドコードは16ビットと32ビットで異なります。同じ機械語の解釈方法が異なるため、16ビットモードの機械語を32ビットモードで実行することはできません。その逆も同様です。
ただし、BIOSは16ビットの機械語で記述されているため、32ビットモードではBIOS関数を呼び出すことができないという1つのポイントがあります。BIOSと関係がある場合は、最初にそれを行うことができます.32ビットモードに入ると、BIOS関数を呼び出すことはできません。(32ビットから16ビットに戻る方法もありますが、少し複雑です)
BIOSから画面モードを取得しました。次のステップは、BIOSからキーボードステータスを取得することです。いわゆるキーボードステータスは、NumLockがオンかオフかを示すステータスです。