OS自作入門 / 2008/08/25 (Mon) / 編集 |
[OS-Wiki]メモリマップ
どうやらメモリにもIPアドレスのように利用区分があるそうで、上記ページから一部抜粋すると
どうやらメモリにもIPアドレスのように利用区分があるそうで、上記ページから一部抜粋すると
- 0x00000000 - 0x0009ffff : RAM
- 0x00000000 - 0x000003ff : リアルモード用INTベクタ
- 0x00000300 - 0x000003ffはBIOS用スタック?
- 0x00000400 - 0x000004ff : BIOS用ワークエリア?
- 0x00007c00 - 0x00007dff : ブートセクタが読み込まれるアドレス
- 0x0009fc00 - 0x0009ffff : ACPI用ワークエリア(の場合がある)
- 0x000a0000 - 0x000bffff : ビデオアクセス用アドレス空間
- 000c0000 - 0x000c7fff : ビデオBIOS?
- 0x000c8000 - 0x000dffff : 各種カードのROMがあったりなかったり?
- 0x000d0000 - 0x000dffffはたいてい空いている
- 0x000e0000 - 0x000effff : 拡張BIOS(ここが空いている場合もある?)
- 0x000f0000 - 0x000fffff : BIOS
- 0x00100000 - 0x00efffff : RAM (これに満たない可能性もある)
- 0x00f00000 - 0x00ffffff : RAMもしくはISAホール(どちらになるかはBIOSの設定などによる) 0x01000000 - メモリが尽きるまで : RAM
- メモリが尽きたところ - 0xffffffef : PCIデバイスなどのメモリマップトI/Oに利用可能な領域
- 0xfffffff0 - 0xffffffff : 386以降ではここにリセットジャンプ命令がある
ちなみに、[OS-Wiki]OSを作るときによく使うBIOSファンクション (AT互換機)
一文字表示
AH = 0x0e;
AL = キャラクターコード;
BH = 0;
BL = カラーコード;
戻り値:なし
註:ビープ、バックスペース、CR、LFは制御コードとして認識される
このページだけ見てもなんのことだかさっぱりなのでサンプルコードから抜粋
(前略)
MOV SI,msg
putloop:
MOV AL,[SI]
ADD SI,1; SIに1を足す
CMP AL,0
JE fin
MOV AH,0x0e; 一文字表示ファンクション
MOV BX,15; カラーコード
INT 0x10 ; ビデオBIOS呼び出し
JMP putloop msg:
DB 0x0a, 0x0a ; 改行を2つ
DB "hello, world"
DB 0x0a ; 改行
DB 0
(後略)
なかんじらしい、C言語的には
#include//INT 0x10 (ビデオBIOS呼び出し)の代わり
main(){
char *SI;//レジスタ
char AL;//レジスタ
char msg[] = "\n\nhello,world\n";
SI = msg;
while(1){
SI++;
AL=*SI;
if(AL == '\0') break;
printf("%c",*SI);//AH(一文字表示)のかわり
}
}
って感じなのかな?よくわからないけど、、、
むりやり似せたから大分冗長コードw ちなみにカラーは俺には無理だった(笑)
さてと、窓でqemuが動かないどうしよう、、、たすけて美鎖さん(笑)
一文字表示
AH = 0x0e;
AL = キャラクターコード;
BH = 0;
BL = カラーコード;
戻り値:なし
註:ビープ、バックスペース、CR、LFは制御コードとして認識される
このページだけ見てもなんのことだかさっぱりなのでサンプルコードから抜粋
(前略)
MOV SI,msg
putloop:
MOV AL,[SI]
ADD SI,1; SIに1を足す
CMP AL,0
JE fin
MOV AH,0x0e; 一文字表示ファンクション
MOV BX,15; カラーコード
INT 0x10 ; ビデオBIOS呼び出し
JMP putloop msg:
DB 0x0a, 0x0a ; 改行を2つ
DB "hello, world"
DB 0x0a ; 改行
DB 0
(後略)
なかんじらしい、C言語的には
#include
main(){
char *SI;//レジスタ
char AL;//レジスタ
char msg[] = "\n\nhello,world\n";
SI = msg;
while(1){
SI++;
AL=*SI;
if(AL == '\0') break;
printf("%c",*SI);//AH(一文字表示)のかわり
}
}
って感じなのかな?よくわからないけど、、、
むりやり似せたから大分冗長コードw ちなみにカラーは俺には無理だった(笑)
さてと、窓でqemuが動かないどうしよう、、、たすけて美鎖さん(笑)
PR
トラックバック
URL :
コメント