OS自作入門 4日目
○4日目
C言語と画面表示の練習
→本日より新規分を追記しながら拡張していく。
VRAM上のアドレスにパレット番号を指定しパレットに設定されている色を表示する。
■疑問点??
iplは16ビットモードでかかれており、funcは32ビットモードで書かれている。
→モードの切り替えはアセンブル時に行われる?
▼ポインタの使用
アセンブラでメモリを指定する[]とC言語の*は同義である。
→どちらもメモリを指す。つまり*pはBYTE[p]ということ。
例
p = (char *)i; ⇒これらはアドレス(番地)を代入している。
MOV ECX,i ⇒これらはアドレス(番地)を代入している。
*p = i; ⇒これらはメモリ(上の値)を代入している。
MOV BYTE[ECX] i ⇒これらはメモリ(上の値)を代入している。
※要はポインタは番地変数ってこと。
また、p[i]は*(p+i)と同義である。
→p[0]は*pとなる。
▼配列の宣言
変数はアセンブラでいうとラベルである。
char a[3]; → a:
RESB 3
となる。→予約領域が初期化される保障はない。
staticを指定するとDB命令となる。
▼アセンブラ
CLI clear interrupt flag 割り込みフラグを0にする。
STI set interrupt flag 割り込みフラグを1にする。
IN 指定されたポートのデータを読み込む
OUT 指定されたポートへデータを書き込む
PUSH データをスタックに押し込む。
POP スタックからデータを引っ張り出す。
PUSHFD push flags double-word ;PUSH EFLAGS
POPFD pop flags double-word ;POP EFLAGS
▼レジスタ
EFLAGS→FLAGSの拡張レジスタ
※キャリーフラグや割り込みフラグが入ったレジスタ。
■インラインアセンブラを使用したVCでのコンパイルを試す。
▼C言語
RETした際、EAXに入っている値が関数値となる。
▼VGA→Video Graphic Adapter, Video Graphic Acceralatorの略