mozyのかきおき

mozyの読書感想文や思考置き場

30日でできるOS自作入門【19日目】

f:id:mozy_ok:20181130220523p:plain

概要

これはMozyの1人アドベントカレンダー 2018 の19日目の記事です。

adventar.org

書こうとした経緯は、こちら

mozy-ok.hatenablog.com

今日の内容

  • 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で実現できる。
それぞれ フラグをダブルワードでスタックから飛ばす、スタックに登録するという意味