自作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してから変更させる。マイコンとかだと直接レジスタの読み込み・書き込み出来たりする