マイペースなプログラミング日記

DTMやプログラミングにお熱なd-kamiがマイペースに書くブログ

I/Oポート関係だけのはずが...

I/Oポート関係の命令をCから呼び出せるようにしようと思ったが、いろいろ詰め込んでしまった。HLTとかCALLとかは別のファイルに入れようと思った

[BITS 32]
[SECTION .text]

    GLOBAL asmHLT,     _asmHLT
    GLOBAL asmCLI,     _asmCLI
    GLOBAL asmSTI,     _asmSTI
    GLOBAL asmSTIHLT,  _asmSTIHLT
    GLOBAL asmFarJump, _asmFarJump
    GLOBAL asmFarCall, _asmFarCall
    GLOBAL asmCall,    _asmCall

    GLOBAL asm_in8,    _asm_in8
    GLOBAL asm_in16,   _asm_in16
    GLOBAL asm_in32,   _asm_in32

    GLOBAL asm_out8,   _asm_out8
    GLOBAL asm_out16,  _asm_out16
    GLOBAL asm_out32,  _asm_out32

    GLOBAL asmReadEFlags,  _asmReadEFlags
    GLOBAL asmWriteEFlags, _asmWriteEFlags

    GLOBAL asmReadCR0,     _asmReadCR0
    GLOBAL asmWriteCR0,    _asmWriteCR0

    GLOBAL asmLoadGDTR,    _asmLoadGDTR
    GLOBAL asmLoadTR,      _asmLoadTR

asmHLT:
_asmHLT:

    HLT
    RET

asmCLI:
_asmCLI:

    CLI
    RET

asmSTI:
_asmSTI:

    STI
    RET

asmSTIHLT:
_asmSTIHLT:

    STI
    HLT
    RET

asm_in8:
_asm_in8:

    MOV EDX, [ESP + 4]
    XOR EAX, EAX
    IN AL, DX
    RET

asm_in16:
_asm_in16:

    MOV EDX, [ESP + 4]
    XOR EAX, EAX
    IN AX, DX
    RET

asm_in32:
_asm_in32:

    MOV EDX, [ESP + 4]
    IN  EAX, DX
    RET

asm_out8:
_asm_out8:
    MOV EDX, [ESP + 4]
    MOV AL, [ESP + 8]
    OUT DX, AL
    RET

asm_out16:
_asm_out16:

    MOV EDX, [ESP + 4]
    MOV AX, [ESP + 8]
    OUT DX, AX
    RET

asm_out32:
_asm_out32:

    MOV EDX, [ESP + 4]
    MOV EAX, [ESP + 8]
    OUT DX,  EAX
    RET

asmReadEFlags:
_asmReadEFlags:

    PUSHFD
    POP EAX
    RET

asmWriteEFlags:
_asmWriteEFlags:

    MOV EAX, [ESP + 4]
    PUSH EAX
    POPFD
    RET

asmReadCR0:
_asmReadCR0:

    MOV EAX, CR0
    RET

asmWriteCR0:
_asmWriteCR0:

    MOV EAX, [ESP + 4]
    MOV CR0, EAX
    RET

asmLoadTR:
_asmLoadTR:

    LTR [ESP + 4]
    RET

asmFarJump:
_asmFarJump:

    JMP FAR [ESP + 4]
    RET

asmFarCall:
_asmFarCall:

    CALL FAR [ESP + 4]
    RET

asmCall:
_asmCall:

    CALL [ESP + 4]
    RET

asmLoadGDTR:
_asmLoadGDTR:

    MOV AX, [ESP + 4]
    MOV [ESP + 6], AX
    LGDT [ESP + 6]
    RET