asm { USE64 // ************************************ _MEMSET:: ENTER 0 PUSH RDI CLD MOV RDI,U64 SF_ARG1[RBP] MOV RAX,U64 SF_ARG2[RBP] MOV RCX,U64 SF_ARG3[RBP] REP_STOSB MOV RAX,RDI POP RDI LEAVE RET1 24 // ************************************ _MEMSET_U16:: ENTER 0 PUSH RDI CLD MOV RDI,U64 SF_ARG1[RBP] MOV RAX,U64 SF_ARG2[RBP] MOV RCX,U64 SF_ARG3[RBP] REP_STOSW MOV RAX,RDI POP RDI LEAVE RET1 24 // ************************************ _MEMSET_U32:: ENTER 0 PUSH RDI CLD MOV RDI,U64 SF_ARG1[RBP] MOV RAX,U64 SF_ARG2[RBP] MOV RCX,U64 SF_ARG3[RBP] REP_STOSD MOV RAX,RDI POP RDI LEAVE RET1 24 // ************************************ _MEMSET_U64:: ENTER 0 PUSH RDI CLD MOV RDI,U64 SF_ARG1[RBP] MOV RAX,U64 SF_ARG2[RBP] MOV RCX,U64 SF_ARG3[RBP] REP_STOSQ MOV RAX,RDI POP RDI LEAVE RET1 24 // ************************************ _MEMCPY:: ENTER 0 PUSH RSI PUSH RDI CLD MOV RDI,U64 SF_ARG1[RBP] MOV RSI,U64 SF_ARG2[RBP] MOV RCX,U64 SF_ARG3[RBP] REP_MOVSB MOV RAX,RDI POP RDI POP RSI LEAVE RET1 24 // ************************************ _MEMCMP:: ENTER 0 PUSH RSI PUSH RDI CLD MOV RSI,U64 SF_ARG1[RBP] MOV RDI,U64 SF_ARG2[RBP] MOV RCX,U64 SF_ARG3[RBP] XOR RAX,RAX REPE_CMPSB JZ @@05 MOV AL,1 JA @@05 MOV RAX,-1 @@05: POP RDI POP RSI LEAVE RET1 24 // ************************************ _BEQU:: ENTER 0 XOR RAX,RAX MOV RDX,U64 SF_ARG3[RBP] MOV RBX,U64 SF_ARG1[RBP] MOV RCX,U64 SF_ARG2[RBP] TEST RDX,RDX JZ @@5 BTS U64 [RBX],RCX JMP @@10 @@5: BTR U64 [RBX],RCX @@10: ADC AL,0 LEAVE RET1 24 // ************************************ _LBEQU:: ENTER 0 XOR RAX,RAX MOV RDX,U64 SF_ARG3[RBP] MOV RBX,U64 SF_ARG1[RBP] MOV RCX,U64 SF_ARG2[RBP] TEST RDX,RDX JZ @@5 LOCK BTS U64 [RBX],RCX JMP @@10 @@5: LOCK BTR U64 [RBX],RCX @@10: ADC AL,0 LEAVE RET1 24 // ************************************ _LIMIT_I64:: ENTER 0 MOV RAX,U64 SF_ARG1[RBP] MOV RCX,U64 SF_ARG2[RBP] MOV RDX,U64 SF_ARG3[RBP] CMP RAX,RCX CMOVL RAX,RCX CMP RAX,RDX CMOVG RAX,RDX LEAVE RET1 24 // ************************************ _LIMIT_U64:: ENTER 0 MOV RAX,U64 SF_ARG1[RBP] MOV RCX,U64 SF_ARG2[RBP] MOV RDX,U64 SF_ARG3[RBP] CMP RAX,RCX CMOVB RAX,RCX CMP RAX,RDX CMOVA RAX,RDX LEAVE RET1 24 // ************************************ _CALL:: ENTER 0 MOV RAX,U64 SF_ARG1[RBP] TEST RAX,RAX JZ @@05 CALL RAX @@05: LEAVE RET1 8 // ************************************ _BIT_FIELD_OR_U32:: ENTER 0 MOV RBX,U64 SF_ARG2[RBP] SHR RBX,3 ADD RBX,U64 SF_ARG1[RBP] MOV RAX,U64 SF_ARG3[RBP] MOV RCX,U64 SF_ARG2[RBP] AND CL,7 SHL RAX,CL OR U64 [RBX],RAX LEAVE RET1 24 // ************************************ _BIT_FIELD_EXTRACT_U32:: ENTER 0 MOV RBX,U64 SF_ARG2[RBP] MOV RCX,RBX SHR RBX,3 ADD RBX,U64 SF_ARG1[RBP] MOV RDX,U64 [RBX] AND CL,7 SHR RDX,CL MOV RCX,U64 SF_ARG3[RBP] MOV RAX,1 SHL RAX,CL DEC RAX AND RAX,RDX LEAVE RET1 24 // ************************************ _XCHG_U64:: ENTER 0 MOV RDX,U64 SF_ARG1[RBP] MOV RAX,U64 SF_ARG2[RBP] XCHG U64 [RDX],RAX LEAVE RET1 16 _XCHG_U32:: ENTER 0 MOV RDX,U64 SF_ARG1[RBP] MOV EAX,U32 SF_ARG2[RBP] XCHG U32 [RDX],EAX LEAVE RET1 16 _XCHG_U16:: ENTER 0 MOV RDX,U64 SF_ARG1[RBP] MOVZX RAX,U16 SF_ARG2[RBP] XCHG U16 [RDX],AX LEAVE RET1 16 _XCHG_U8:: ENTER 0 MOV RDX,U64 SF_ARG1[RBP] MOVZX RAX,U8 SF_ARG2[RBP] XCHG U8 [RDX],AL LEAVE RET1 16 _LXCHG_U64:: ENTER 0 MOV RDX,U64 SF_ARG1[RBP] MOV RAX,U64 SF_ARG2[RBP] LOCK XCHG U64 [RDX],RAX LEAVE RET1 16 _LXCHG_U32:: ENTER 0 MOV RDX,U64 SF_ARG1[RBP] MOV EAX,U32 SF_ARG2[RBP] LOCK XCHG U32 [RDX],EAX LEAVE RET1 16 _LXCHG_U16:: ENTER 0 MOV RDX,U64 SF_ARG1[RBP] MOVZX RAX,U16 SF_ARG2[RBP] LOCK XCHG U16 [RDX],AX LEAVE RET1 16 _LXCHG_U8:: ENTER 0 MOV RDX,U64 SF_ARG1[RBP] MOVZX RAX,U8 SF_ARG2[RBP] LOCK XCHG U8 [RDX],AL LEAVE RET1 16 // ************************************ _REP_IN_U32:: ENTER 0 PUSH RDI MOV RDI,U64 SF_ARG1[RBP] MOV RDX,U64 SF_ARG3[RBP] MOV RCX,U64 SF_ARG2[RBP] REP_INSD POP RDI LEAVE RET1 24 _REP_IN_U16:: ENTER 0 PUSH RDI MOV RDI,U64 SF_ARG1[RBP] MOV RDX,U64 SF_ARG3[RBP] MOV RCX,U64 SF_ARG2[RBP] REP_INSW POP RDI LEAVE RET1 24 _REP_IN_U8:: ENTER 0 PUSH RDI MOV RDI,U64 SF_ARG1[RBP] MOV RDX,U64 SF_ARG3[RBP] MOV RCX,U64 SF_ARG2[RBP] REP_INSB POP RDI LEAVE RET1 24 _REP_OUT_U32:: ENTER 0 PUSH RSI MOV RSI,U64 SF_ARG1[RBP] MOV RDX,U64 SF_ARG3[RBP] MOV RCX,U64 SF_ARG2[RBP] REP_OUTSD POP RSI LEAVE RET1 24 _REP_OUT_U16:: ENTER 0 PUSH RSI MOV RSI,U64 SF_ARG1[RBP] MOV RDX,U64 SF_ARG3[RBP] MOV RCX,U64 SF_ARG2[RBP] REP_OUTSW POP RSI LEAVE RET1 24 _REP_OUT_U8:: ENTER 0 PUSH RSI MOV RSI,U64 SF_ARG1[RBP] MOV RDX,U64 SF_ARG3[RBP] MOV RCX,U64 SF_ARG2[RBP] REP_OUTSB POP RSI LEAVE RET1 24 // ************************************ _CPUID:: ENTER 0 PUSH RSI MOV RAX,U64 SF_ARG1[RBP] CPUID MOV RSI,U64 SF_ARG2[RBP] MOV U64 [RSI],RAX MOV U64 8[RSI],RBX MOV U64 16[RSI],RCX MOV U64 24[RSI],RDX POP RSI LEAVE RET1 16 // ************************************ _CALLIND:: ENTER 0 PUSH RSI PUSH RDI MOV RDX,U64 SF_ARG1[RBP] MOV RCX,U64 SF_ARG2[RBP] //argc LEA RSI,U64 SF_ARG3[RBP] //argv SHL RCX,3 SUB RSP,RCX MOV RDI,RSP REP_MOVSB @@05: TEST RDX,RDX JZ @@15 CALL RDX @@10: POP RDI POP RSI LEAVE RET @@15: XOR RAX,RAX MOV RCX,U64 SF_ARG2[RBP] //argc SHL RCX,3 ADD RSP,RCX POP RDI POP RSI LEAVE RET // ************************************ _CALLEXTNUM:: ENTER 0 PUSH RSI PUSH RDI MOV RDX,U64 SF_ARG1[RBP] MOV RCX,U64 SF_ARG2[RBP] //argc LEA RSI,U64 SF_ARG3[RBP] //argv SHL RCX,3 SUB RSP,RCX MOV RDI,RSP REP_MOVSB @@05: MOV RAX,U64 [SYS_EXTERN_TABLE] MOV RAX,U64 [RAX+RDX*8] TEST RAX,RAX JZ @@15 CALL RAX @@10: POP RDI POP RSI LEAVE RET @@15: XOR RAX,RAX MOV RCX,U64 SF_ARG2[RBP] //argc SHL RCX,3 ADD RSP,RCX POP RDI POP RSI LEAVE RET // ************************************ _CALLEXTSTR:: ENTER 0 PUSH RSI PUSH RDI MOV RCX,U64 SF_ARG2[RBP] //argc LEA RSI,U64 SF_ARG3[RBP] //argv SHL RCX,3 SUB RSP,RCX MOV RDI,RSP REP_MOVSB @@05: MOV RSI,U64 SF_ARG1[RBP] CALL SYS_EXT_FIND1 TEST RAX,RAX JZ @@15 CALL RAX @@10: POP RDI POP RSI LEAVE RET @@15: MOV RCX,U64 SF_ARG2[RBP] //argc SHL RCX,3 ADD RSP,RCX POP RDI POP RSI LEAVE RET // ************************************ _SET_GS_BASE:: ENTER 0 MOV RAX,SF_ARG1[RBP] PUSH RAX PUSH RCX PUSH RDX MOV RDX,RAX SHR RDX,32 MOV ECX,IA32_GS_BASE WRMSR POP RDX POP RCX POP RAX LEAVE RET1 8 SET_FS_BASE:: PUSH RAX PUSH RCX PUSH RDX MOV RDX,RAX SHR RDX,32 MOV ECX,IA32_FS_BASE WRMSR POP RDX POP RCX POP RAX RET _SET_MSR:: ENTER 0 MOV RAX,SF_ARG2[RBP] MOV RDX,RAX SHR RDX,32 MOV RCX,SF_ARG1[RBP] WRMSR LEAVE RET1 16 _SYS_HLT:: CLI @@05: HLT JMP @@05 }