『作りながら学ぶOSカーネル』 Chapter 01を読んでのつぶやき

IBM-PCのVRAMの属性について動作確認してみた。

;
; VRAMの属性バイトの確認
;
[org 0x7c00]

start:		mov	ax, 0xb800	; VRAMセグメント
		mov	es, ax
		xor	di, di

		mov	ax, 0x0741	; 黒背景, 白文字, 'A'
		mov	dx, 0x0041	; 黒背景, 黒文字, 'A'	

		mov	cx, 16		; 16回(色)ループ
.@loop		push	cx
		mov	cx, 40		; 最初の40文字は背景色を変更
	rep	stosw
		add	ax, 0x1000	; 背景色+1

		xchg	ax, dx		; 次の40文字は文字色を変更
		mov	cx, 40
	rep	stosw
		add	ax, 0x0100	; 文字色+1
		xchg	ax, dx
		
		pop	cx
		loop	.@loop

		jmp	$

		times 510 - ($ - $$) db 0
		dw	0xaa55

つぶやき

気になった箇所についてのつぶやき。つぶやきなので裏付けを取るところまではやりません。あと「てにをは」、誤字脱字レベルのものについてはスルーします。

p9

シリアル通信でプログラムをRAMに保存するプログラムを入れておき、(中略)この実行でRAMに入ったプログラムにジャンプして作動するといった方法を利用するのが一般的と言えます。

全然一般的じゃないと思いますけどね。運用時としたらROM(いまどきはフラッシュメモリか)に入れるだろうし、デバッグ時だとICEが多いんじゃないかな。

p10

ここを特にMBR領域と呼ぶ

ハードディスクおよびハードディスクと同様にパーティションに分割して使用できる記憶デバイスなら先頭にはMBRがあり、そこにはパーティション情報も含まれますね。でも、ここではフロッピーディスクを使用すわけだし、ハードディスク先頭ではなく、その中のパーティションテーブルの先頭セクタに含まれるIPL(Initial Program Loader)の方がより正確でしょう。

p11

	mov	cx, 0x7ff

これは80×25=2000=0x7d0ですね。

	mov	edi, 0

なぜediなんだろ。

p12

exe,comの形式になっているファイルは、(中略)実行可能ファイルの頭の部分にヘッダを置いて、

EXE形式の場合はリロケーション情報などを含むヘッダがありますが、COM形式にはありません。メモリにロードされるとPSPがつくのは一緒ですが。

p16

00000000 EA0F00C007 jmp 0x7c0:0xf

細かいけれど、これは[org 0]のboo.binの逆アセンブルリストではなく、後で出てくる[org 10]のもの。実際中段ころの箇条書きでは EA0500C007となってて正しいのだけれど、このリストではEA0F00C007なわけです。
でもp17の2行目では、EA0F00C007となっており、混在してしまってます。

p18

一時は、すべてのパーソナルコンピュータでMS-DOSを使用

『すべて』は言い過ぎ。

while();

for (); ですね。while なら while (1) ;

p19

リアルモードでは、プログラムは同時に1つしか動作させることができません。

保護モードでも同じ。

p20

一般的に0x07C0番地は

CPUのハードウェア的なファームウェア

マイクロコードのことかな?

p23

0xFFFF領域

0x10000領域

0xB800:0000〜0xB800:1000, 0xB800:1001〜0xB800:2000

正しくは 0xB800:0000〜0xB800:0FFF, 0xB800:1000〜0xB800:1FFF でしょう。

p24

図1-5

文字色と背景色の位置が逆。

d7 文字を点滅
d6-d4 背景色
d3 文字色高輝度
d2-d0 文字色