30日でできるOS自作入門【19日目】
概要
これはMozyの1人アドベントカレンダー 2018 の19日目の記事です。
書こうとした経緯は、こちら
今日の内容
- naskfunc.nas をどんどん書いていく
今日やったこと
- 昨日作っていたC言語では実現できなかったハードウェアのIO部分に関する部分を作成した。
; [FORMAT "WCOFF"] ; [INSTRSET "i486p"] [BITS 32] ; [FILE "naskfunc.nas"] GLOBAL io_hlt, io_cli, io_sti, io_stihlt GLOBAL io_in8, io_in16, io_in32 GLOBAL io_out8, io_out16, io_out32 GLOBAL io_load_eflags, io_store_eflags [SECTION .text] io_hlt: ; void io_hlt(void); hlt ret io_cli: ; void io_cli (void); cli ret io_sti: ; void io_sti (void); sti ret io_stihlt: ; void io_stihlt (void); sti hlt ret io_in8: ; io_in8 (int port); mov edx,[esp+4] ; port mov eax, 0 in al, dx ret io_in16: ; int io_in16 (int port); mov edx,[esp+4] ; port mov eax, 0 in ax, dx ret io_in32: ; int io_in32 (int port); mov edx,[esp+4] ; port in eax, dx ret io_out8: ; void io_out8(int port, int data); mov edx,[esp+4] ; port mov al, [esp+8] ; data out dx, al ret io_out16: ; void io_out16(int port, int data); mov edx,[esp+4] ; port mov ax, [esp+8] ; data out dx, ax ret io_out32: ; void io_out32(int port, int data); mov edx,[esp+4] ; port mov eax,[esp+8] ; data out dx, eax ret io_load_eflags: ; int io_load_eflags (void); pushfd ; push eflags pop eax ret io_store_eflags: ; void io_store_eflags (int eflags); mov eax,[esp+4] push eax popfd ; pop eflags ret
ハマりポイント
特になし〜。昨日ポインタ周りとかをきちんと追ったからだな。
知ったこと
EFLAGS関連はPUSHFDとPOPFDで実現できる。
それぞれ フラグをダブルワードでスタックから飛ばす、スタックに登録するという意味