OS自作入門 四日目

「OS自作入門 四日目」の編集履歴(バックアップ)一覧はこちら

OS自作入門 四日目 - (2007/07/09 (月) 03:41:21) の1つ前との変更点

追加された行は緑色になります。

削除された行は赤色になります。

*OS自作入門四日目のまとめ 自分のためのまとめなので、他の人には意味不かも。 **アセンブラ : INSTRSET | どういう意味だろう。 [INSTRSET "i486p"] ; 486の命令まで使いたいという記述 こういう感じで使う。 :RESB num| numの数だけメモリを確保。Reserve Byteの略。他にもRESW,RESD,RESQ,REST が存在し、それぞれワード、ダブルワード、4倍ワード、10バイトワード。 char a[3]; とすると、アセンブラでは a: RESB 3 となる。 **C言語 :&(AND) | かつ。and演算。それぞれの桁について比較して、両方が1だったら1、どちらかが0なら0。 0100 AND 1101 -> 0100 : (OR) | または。or演算。それぞれの桁について比較して、どちらかが1だったら1。 0100 OR 1101 -> 1101 :^(XOR) | xor演算。どちらかが0かつもう一方が1のとき1。0かつ0は0。1かつ1は0。ビット反転。 0100 XOR 1101 -> 1001 **C言語からメモリへの書き込み C言語の関数上で与えられた引数は 1番目[ESP+ 4] 2番目[ESP+ 8] 3番目[ESP+12] 4番目[ESP+16] ... に書いてある。 **ポインタ int i; char *p; p = (char *) i; *p = i & 0x0f; 変数iを宣言。 ポインタ用の変数pを宣言。 ポインタ用の変数pにポインタ変数にキャストしたiを代入。 p番地にiを0x0fでandをとった値を代入。 番地は以下の様に指定することが可能。 *(p + i) *(i + p) p[i] i[p] これらは全て番地の足し算。 **色 8bitカラーモードでは0〜255の色番号の色の内16色を使うことができる。色番号は0x000000-0xffffffで、その設定にはまずパレットを設定する。パレットの設定には16進数2桁(=8bit)を3つ用いる。 このようにパレットを設定する。 void init_palette(void) { static unsigned char table_rgd[16*3] = { 0x00, 0x00, 0x00, /*0;:黒*/ ... } これを16個指定する。 **その他 :static宣言 | 変数宣言の前にstaticと付けると、RESBの代わりにDB命令でメモリを確保する。 ここでは3×16個も代入が存在するので、代入命令の数を抑えるために使われている。static宣言したことで、ここでは table_rgb: RESB 16*3 以下代入命令... とならずに table_rgb: DB 0x00, 0x00, 0x00, 0xff, ... となっている。(んじゃないのかなぁと思う。) :unsigned宣言 | 変数宣言の前にunsignedを付けると符号のない数(=0か正)として扱う。 charにはunsigned,signed,その他があり、signedは正と負を両方扱う。その他はコンパイラ依存になる。 ----
*OS自作入門四日目のまとめ 自分のためのまとめなので、他の人には意味不かも。 **アセンブラ : INSTRSET | どういう意味だろう。 [INSTRSET "i486p"] ; 486の命令まで使いたいという記述 こういう感じで使う。 :RESB num| numの数だけメモリを確保。Reserve Byteの略。他にもRESW,RESD,RESQ,REST が存在し、それぞれワード、ダブルワード、4倍ワード、10バイトワード。 char a[3]; とすると、アセンブラでは a: RESB 3 となる。 **C言語 :&(AND) | かつ。and演算。それぞれの桁について比較して、両方が1だったら1、どちらかが0なら0。 0100 AND 1101 -> 0100 : (OR) | または。or演算。それぞれの桁について比較して、どちらかが1だったら1。 0100 OR 1101 -> 1101 :^(XOR) | xor演算。どちらかが0かつもう一方が1のとき1。0かつ0は0。1かつ1は0。ビット反転。 0100 XOR 1101 -> 1001 **C言語からメモリへの書き込み C言語の関数上で与えられた引数は 1番目[ESP+ 4] 2番目[ESP+ 8] 3番目[ESP+12] 4番目[ESP+16] ... に書いてある。 **ポインタ int i; char *p; p = (char *) i; *p = i & 0x0f; 変数iを宣言。 ポインタ用の変数pを宣言。 ポインタ用の変数pにポインタ変数にキャストしたiを代入。 p番地にiを0x0fでandをとった値を代入。 番地は以下の様に指定することが可能。 *(p + i) *(i + p) p[i] i[p] これらは全て番地の足し算。 **色 8bitカラーモードでは0〜255の色番号の色の内16色を使うことができる。色番号は0x000000-0xffffffで、その設定にはまずパレットを設定する。パレットの設定には16進数2桁(=8bit)を3つ用いる。 このようにパレットを設定する。 void init_palette(void) { static unsigned char table_rgd[16*3] = { 0x00, 0x00, 0x00, /*0;:黒*/ ... } これを16個指定する。 **その他 :static宣言 | 変数宣言の前にstaticと付けると、RESBの代わりにDB命令でメモリを確保する。 ここでは3×16個も代入が存在するので、代入命令の数を抑えるために使われている。static宣言したことで、ここでは table_rgb: RESB 16*3 以下代入命令... とならずに table_rgb: DB 0x00, 0x00, 0x00, 0xff, ... となっている。(んじゃないのかなぁと思う。) :unsigned宣言 | 変数宣言の前にunsignedを付けると符号のない数(=0か正)として扱う。 charにはunsigned,signed,その他があり、signedは正と負を両方扱う。その他はコンパイラ依存になる。 **パレット # パレットのアクセスの手順 * まず一連のアクセス中に割り込みなどが入らないようにする(たとえばCLI)。 * 0x03c8に設定したいパレット番号を書き込み、続いて、R、G、Bの順に0x03c9に書き込む。もし次のパレットも続けて設定したいのなら、パレット番号の設定を省略して、さらにRGBの順に0x03c9に書き込んでよい。 * 現在のパレット状態を読み出すときは、まず0x03c7にパレット番号を書き込んで、0x03c9を3回読み出す。これが順にR、G、Bになっている。これももし次のパレットも読み出したいときは、パレット番号の設定を省略してRGBの順に読み出してよい。 * 最初にCLIした場合は、最後にSTIする。 ----

表示オプション

横に並べて表示:
変化行の前後のみ表示:
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。