オペレーティングシステム開発日記-day4

; 今日添加的内容

		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是0xa00000xaffff64KB

; 用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がオンかオフかを示すステータスです。

おすすめ

転載: blog.csdn.net/weixin_45394002/article/details/113823572