LoginSignup
1
0

More than 5 years have passed since last update.

メモ:「30日でできる!OS自作入門 」4日目

Posted at

C言語からメモリ書き込み
アセンブリに write_mem8という関数を書いて Cから呼び出す形式

16bit モードではメモリインデックスは [CX], [SP]はできなかったが、32bit モードでは [ECX], [ESP] なども使えるとのこと。

EAX, ECX, EDXは自由に使える。

8086, 80186, 286 は 16bit CPU, 386, Pentium .. は 32bit CPU

A - 0xa0000 から 0xaffffに 15番目の色(白)を書くので真っ白が画面ができました。

B - 色を i & 0xff することによってシマシマの模様が出力できました。

スクリーンショット 2018-12-19 22.41.28.png

C は char *p; と宣言して直接書くやつ

D も p = (char*) 0xa0000; と宣言して *(p + i) = i & 0x0f; と書き換えてるだけ

E は p[i] = i & 0x0f; インデックスの使い方; p[i] は配列ではない、だたの表現の違い; a[2] も 2[a]も一緒

F は 16色のpalette の定義

CLI: Clear Interrupt Flag; STI: Set Interrupt Flag
EFLAGS: (15) _ NT IOPL(2) OF DF IF TF SF ZF _ AF _ PF _ CF (0)

C言語では Flags 周りのさわれない

IN/OUTはDeviceと電気信号を受けたり、送ったりするもの

io_in8 は IN AL, DX, in16 は IN AX, DX, in32は IN EAX, DX
io_out8 は OUT DX, AL, out16 は OUT DX, AX, out32 は OUT DX, EAX

PUSHFD: PUSH EFLAGS, POPFD: POP EFLAGS; EAX に FLAGS が入る
(Push Flags DWord, Flags を Stack に押し込む
PUSHFD: MOV EAX, EFLAGS 的な
POPFD: MOV EFLAGS, EAX 的な

G はボックスを作る
320の幅指定して、XとYなめて書き出してるだけ。

スクリーンショット 2018-12-20 1.36.46.png

H はWindowsっぽく四角いものいっぱい作ってるイメージだった

スクリーンショット 2018-12-20 1.40.42.png

達成感はめちゃある!

1
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
1
0