LoginSignup
0
0

More than 3 years have passed since last update.

30日でできるOS自作入門 5日目(前半)の疑問点と回答

Last updated at Posted at 2020-09-30

30日でできるOS自作入門 5日目

p.97「0x0ff4とかの番地がいったいどこから出てきたのか?」「asmhead.nasに数字を合わせただけ」asmhead.nasってもともとなんだっけ?

→3日目までharibote.nasだったもの。
p.62を見てみる。

haribote.nas
CYLS    EQU     0x0ff0          ; ブートセクタが設定する
LEDS    EQU     0x0ff1
VMODE   EQU     0x0ff2          ; 色数に関する情報。何ビットカラーか?
SCRNX   EQU     0x0ff4          ; 解像度のX
SCRNY   EQU     0x0ff6          ; 解像度のY
VRAM    EQU     0x0ff8          ; グラフィックバッファの開始番地
;(中略)
MOV     BYTE [VMODE],8  ; 画面モードをメモする(C言語が参照する)
MOV     WORD [SCRNX],320
MOV     WORD [SCRNY],200
MOV     DWORD [VRAM],0x000a0000

なぜVMODE以降から番地を2つおきに確保しているのか?

→1つの番地当たり1Byte=8bitなので、1つの番地で表せる最大値は 11111111(2)=255
解像度はx方向が320で255を超えてしまうため、2Byteのメモリを確保する必要がある。
実際、その後の代入文ではMOV WORDを使用している。
VRAMの0x000a0000はBIOSによって決められている値。

0x0ff4の出どころは分かったけど、その元になった0x0ff0っていったい?

ipl10.nas
MOV     [0x0ff0],CH     ;IPLがどこまで読んだのかメモ

→p.63「メモリマップによるとこのへんも誰にも使われていないようでしたので」
筆者が適当に決めてCYLSの値をメモした番地。

p.98「このかたまりは合計12バイトです」charは1Byte、shortは2Byteだから9Byteじゃないの?
bootpack.c
struct BOOTINFO{
    char cyls, leds, vmode, reserve;
    short scrnx, scrny;
    char *vram;
};

→p.76に記載がある。
「char *p;でもshort *p;でもint *p;でも、変数pは4バイトの変数です」
「この変数pは『番地』を記憶するための変数だからです」

ポインタは4Byteの変数なので12Byteで正しい。
「番地(vram)」は4Byteの変数として管理されている。その番地に入っている「値(*vram)」は1Byteの変数(char)として管理されている。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0