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