i0kyoto’s diary

Creator Pro・Fusion360・ルアー・Co2レーザー

自作OS入門(4日目)

p69.

__write_mem8:     ;void write_mem8(int addr, int data);

   MOV ECX, [ESP+4]  ;←メモリのアドレス([ESP+4])をECXレジスタに代入

   MOV AL, [ESP+8]   ;←メモリのアドレス([ESP+8])をALレジスタに代入
   MOV [ECX], AL    ;←ECXレジスタのアドレスに[ESP+8]を代入

   RET

引数addrのアドレスに引数dataを入れたい。
ここではVRAMの開始アドレスは0xa0000なので、アドレスをずらしながら値を入れる
+-----------+---------+
| 0xa0000| 0xf |
+-----------+---------+
| 0xa0001| 0xf |
+-----------+---------+
| 0xa0002| 0xf |
+-----------+---------+
| 0xa0003| 0xf |
+-----------+---------+
.......

p91. 
_io_out8 ; void io_out(int port, int data)
   MOV EDX, [ESP+4] ;portの値をEDXレジスタに代入
   MOV AL, [ESP+8] ;dataの値をALレジスタに代入
   OUT DX, AL ;dataの値をportで指定したアドレスに書き込む

   RET

_io_in8: ; int io_in8(int port)
   MOV EDX, [ESP+4] ;portの値をEDXレジスタに代入

   MOV EAX,0    ;0をEAXレジスタに代入

   IN AL, DX     ;AL(8bitレジスタ)にportで指定した値を読み込ませる

   RET


io_load_eflags(void)
io_store_eflags(int eflags)
AT互換機ではレジスタに直接アクセス出来ないので、PUSH/POP・PUSHFD/POPFDしてから変更させる。マイコンとかだと直接レジスタの読み込み・書き込み出来たりする