885 lines
15 KiB
Plaintext
885 lines
15 KiB
Plaintext
////**************************PROCEDURE*************************
|
|
ALIGN 8,OC_NOP
|
|
CP_CALL::
|
|
PUSH RBP
|
|
MOV RBP,RSP
|
|
MOV RAX,U8 SF_PARAM1[RBP]
|
|
OR RAX,RAX
|
|
JZ @@100
|
|
CALL RAX
|
|
@@100: POP RBP
|
|
RET
|
|
////**************************PROCEDURE*************************
|
|
ALIGN 8,OC_NOP
|
|
OR_U4_BIT_FIELD::
|
|
PUSH RBP
|
|
MOV RBP,RSP
|
|
MOV RBX,U8 SF_PARAM2[RBP]
|
|
SHR RBX,3
|
|
ADD RBX,U8 SF_PARAM1[RBP]
|
|
MOV RAX,U8 SF_PARAM3[RBP]
|
|
MOV RCX,U8 SF_PARAM2[RBP]
|
|
AND RCX,7
|
|
SHL RAX,CL
|
|
OR U8 [RBX],RAX
|
|
POP RBP
|
|
RET
|
|
////**************************PROCEDURE*************************
|
|
ALIGN 8,OC_NOP
|
|
SYS_EBF_MASKTABLE:
|
|
DU8 0,1,3,7,15,31,63,127,255;
|
|
DU8 0x1FF,0x3FF,0x7FF,0x0FFF;
|
|
DU8 0x1FFF,0x3FFF,0x7FFF,0x0FFFF;
|
|
DU8 0x1FFFF,0x3FFFF,0x7FFFF,0xFFFFF;
|
|
DU8 0x1FFFFF,0x3FFFFF,0x7FFFFF,0xFFFFFF;
|
|
DU8 0x1FFFFFF,0x3FFFFFF,0x7FFFFFF,0xFFFFFFF;
|
|
DU8 0x1FFFFFFF,0x3FFFFFFF,0x7FFFFFFF,0xFFFFFFFF;
|
|
|
|
EXTRACT_U4_BIT_FIELD::
|
|
PUSH RBP
|
|
MOV RBP,RSP
|
|
MOV RBX,U8 SF_PARAM2[RBP]
|
|
MOV CL,3
|
|
SHR RBX,3
|
|
ADD RBX,U8 SF_PARAM1[RBP]
|
|
MOV RAX,U8 [RBX]
|
|
MOV RCX,U8 SF_PARAM2[RBP]
|
|
AND RCX,7
|
|
SHR RAX,CL
|
|
MOV RBX,U8 SF_PARAM3[RBP]
|
|
AND RAX,U8 SYS_EBF_MASKTABLE[RBX*8]
|
|
POP RBP
|
|
RET
|
|
////**************************PROCEDURE*************************
|
|
// IN: RSI=STRUCT TO INSERT
|
|
// RDI=PREDECESSOR
|
|
ALIGN 8,OC_NOP
|
|
INSQUE::
|
|
PUSH RBX
|
|
MOV RBX,U8 [RDI]
|
|
MOV U8 [RDI],RSI
|
|
MOV U8 [RSI],RBX
|
|
MOV U8 8[RSI],RDI
|
|
MOV U8 8[RBX],RSI
|
|
POP RBX
|
|
RET
|
|
////**************************PROCEDURE*************************
|
|
// IN: RSI=STRUCT TO INSERT
|
|
// RDI=SUCCESSOR
|
|
ALIGN 8,OC_NOP
|
|
INSQUE_REV::
|
|
PUSH RBX
|
|
MOV RBX,U8 8[RDI]
|
|
MOV U8 [RBX],RSI
|
|
MOV U8 [RSI],RDI
|
|
MOV U8 8[RSI],RBX
|
|
MOV U8 8[RDI],RSI
|
|
POP RBX
|
|
RET
|
|
////**************************PROCEDURE*************************
|
|
// IN: RSI=STRUCT TO REMOVE
|
|
ALIGN 8,OC_NOP
|
|
REMQUE::
|
|
PUSH RBX
|
|
PUSH RDI
|
|
MOV RBX,U8 [RSI]
|
|
MOV RDI,U8 8[RSI]
|
|
MOV U8 [RDI],RBX
|
|
MOV U8 8[RBX],RDI
|
|
POP RDI
|
|
POP RBX
|
|
RET
|
|
////**************************PROCEDURE*************************
|
|
ALIGN 8,OC_NOP
|
|
CP_REP_INSW::
|
|
PUSH RBP
|
|
MOV RBP,RSP
|
|
PUSH RDI
|
|
MOV RDI,U8 SF_PARAM1[RBP]
|
|
MOV RDX,U8 SF_PARAM3[RBP]
|
|
MOV RCX,U8 SF_PARAM2[RBP]
|
|
REP_INSW
|
|
POP RDI
|
|
POP RBP
|
|
RET
|
|
|
|
ALIGN 8,OC_NOP
|
|
CP_REP_INSB::
|
|
PUSH RBP
|
|
MOV RBP,RSP
|
|
PUSH RDI
|
|
MOV RDI,U8 SF_PARAM1[RBP]
|
|
MOV RDX,U8 SF_PARAM3[RBP]
|
|
MOV RCX,U8 SF_PARAM2[RBP]
|
|
REP_INSB
|
|
POP RDI
|
|
POP RBP
|
|
RET
|
|
|
|
ALIGN 8,OC_NOP
|
|
CP_REP_OUTSW::
|
|
PUSH RBP
|
|
MOV RBP,RSP
|
|
PUSH RSI
|
|
MOV RSI,U8 SF_PARAM1[RBP]
|
|
MOV RDX,U8 SF_PARAM3[RBP]
|
|
MOV RCX,U8 SF_PARAM2[RBP]
|
|
REP_OUTSW
|
|
POP RSI
|
|
POP RBP
|
|
RET
|
|
|
|
ALIGN 8,OC_NOP
|
|
CP_REP_OUTSB::
|
|
PUSH RBP
|
|
MOV RBP,RSP
|
|
PUSH RSI
|
|
MOV RSI,U8 SF_PARAM1[RBP]
|
|
MOV RDX,U8 SF_PARAM3[RBP]
|
|
MOV RCX,U8 SF_PARAM2[RBP]
|
|
REP_OUTSB
|
|
POP RSI
|
|
POP RBP
|
|
RET
|
|
|
|
ALIGN 8,OC_NOP
|
|
CP_HLT::
|
|
HLT
|
|
|
|
////**************************PROCEDURE*************************
|
|
ALIGN 8,OC_NOP
|
|
CP_FSQRT::
|
|
PUSH RBP
|
|
MOV RBP,RSP
|
|
FLD U8 SF_PARAM1[RBP]
|
|
FSQRT
|
|
FSTP U8 SF_PARAM1[RBP]
|
|
FWAIT
|
|
MOV RAX,U8 SF_PARAM1[RBP]
|
|
POP RBP
|
|
RET
|
|
////**************************PROCEDURE*************************
|
|
ALIGN 8,OC_NOP
|
|
CP_FSIN::
|
|
PUSH RBP
|
|
MOV RBP,RSP
|
|
FLD U8 SF_PARAM1[RBP]
|
|
FSIN
|
|
FSTP U8 SF_PARAM1[RBP]
|
|
FWAIT
|
|
MOV RAX,U8 SF_PARAM1[RBP]
|
|
POP RBP
|
|
RET
|
|
////**************************PROCEDURE*************************
|
|
ALIGN 8,OC_NOP
|
|
CP_FCOS::
|
|
PUSH RBP
|
|
MOV RBP,RSP
|
|
FLD U8 SF_PARAM1[RBP]
|
|
FCOS
|
|
FSTP U8 SF_PARAM1[RBP]
|
|
FWAIT
|
|
MOV RAX,U8 SF_PARAM1[RBP]
|
|
POP RBP
|
|
RET
|
|
////**************************PROCEDURE*************************
|
|
ALIGN 8,OC_NOP
|
|
CP_FTAN::
|
|
PUSH RBP
|
|
MOV RBP,RSP
|
|
FLD U8 SF_PARAM1[RBP]
|
|
@@1: FPTAN
|
|
FSTSW
|
|
FWAIT
|
|
TEST AX,0x400
|
|
JNZ @@1
|
|
FFREE
|
|
FINCSTP
|
|
FSTP U8 SF_PARAM1[RBP]
|
|
FWAIT
|
|
MOV RAX,U8 SF_PARAM1[RBP]
|
|
POP RBP
|
|
RET
|
|
////**************************PROCEDURE*************************
|
|
ALIGN 8,OC_NOP
|
|
CP_FATAN::
|
|
PUSH RBP
|
|
MOV RBP,RSP
|
|
FLD U8 SF_PARAM1[RBP]
|
|
FLD1
|
|
@@1: FPATAN
|
|
FSTSW
|
|
FWAIT
|
|
TEST AX,0x400
|
|
JNZ @@1
|
|
FSTP U8 SF_PARAM1[RBP]
|
|
FWAIT
|
|
MOV RAX,U8 SF_PARAM1[RBP]
|
|
POP RBP
|
|
RET
|
|
////**************************PROCEDURE*************************
|
|
ALIGN 8,OC_NOP
|
|
CP_ARG::
|
|
PUSH RBP
|
|
MOV RBP,RSP
|
|
FLD U8 SF_PARAM2[RBP]
|
|
FLD U8 SF_PARAM1[RBP]
|
|
@@1: FPATAN
|
|
FSTSW
|
|
FWAIT
|
|
TEST AX,0x400
|
|
JNZ @@1
|
|
FSTP U8 SF_PARAM1[RBP]
|
|
FWAIT
|
|
MOV RAX,U8 SF_PARAM1[RBP]
|
|
POP RBP
|
|
RET
|
|
////**************************PROCEDURE*************************
|
|
ALIGN 8,OC_NOP
|
|
CP_ROUND::
|
|
PUSH RBP
|
|
MOV RBP,RSP
|
|
|
|
SUB RSP,8
|
|
FSTCW U4 -8[RBP]
|
|
FWAIT
|
|
MOV AX,U2 -8[RBP]
|
|
MOV U2 -6[RBP],AX
|
|
AND AX,~0x0C00
|
|
MOV U2 -8[RBP],AX
|
|
FLDCW U4 -8[RBP]
|
|
|
|
FLD U8 SF_PARAM1[RBP]
|
|
FRNDINT
|
|
FSTP U8 SF_PARAM1[RBP]
|
|
FWAIT
|
|
MOV RAX,U8 SF_PARAM1[RBP]
|
|
|
|
FLDCW U4 -6[RBP]
|
|
FWAIT
|
|
ADD RSP,8
|
|
|
|
POP RBP
|
|
RET
|
|
|
|
////**************************PROCEDURE*************************
|
|
ALIGN 8,OC_NOP
|
|
CP_TRUNC::
|
|
PUSH RBP
|
|
MOV RBP,RSP
|
|
|
|
SUB RSP,8
|
|
FSTCW U4 -8[RBP]
|
|
FWAIT
|
|
MOV AX,U2 -8[RBP]
|
|
MOV U2 -6[RBP],AX
|
|
OR AX,0x0C00
|
|
MOV U2 -8[RBP],AX
|
|
FLDCW U4 -8[RBP]
|
|
|
|
FLD U8 SF_PARAM1[RBP]
|
|
FRNDINT
|
|
FSTP U8 SF_PARAM1[RBP]
|
|
FWAIT
|
|
MOV RAX,U8 SF_PARAM1[RBP]
|
|
|
|
FLDCW U4 -6[RBP]
|
|
FWAIT
|
|
ADD RSP,8
|
|
|
|
POP RBP
|
|
RET
|
|
////**************************PROCEDURE*************************
|
|
ALIGN 8,OC_NOP
|
|
CP_FLOOR::
|
|
PUSH RBP
|
|
MOV RBP,RSP
|
|
|
|
SUB RSP,8
|
|
FSTCW U4 -8[RBP]
|
|
FWAIT
|
|
MOV AX,U2 -8[RBP]
|
|
MOV U2 -6[RBP],AX
|
|
AND AX,~0x0C00
|
|
OR AX,0x0400
|
|
MOV U2 -8[RBP],AX
|
|
FLDCW U4 -8[RBP]
|
|
|
|
FLD U8 SF_PARAM1[RBP]
|
|
FRNDINT
|
|
FSTP U8 SF_PARAM1[RBP]
|
|
FWAIT
|
|
MOV RAX,U8 SF_PARAM1[RBP]
|
|
|
|
FLDCW U4 -6[RBP]
|
|
FWAIT
|
|
ADD RSP,8
|
|
|
|
POP RBP
|
|
RET
|
|
////**************************PROCEDURE*************************
|
|
ALIGN 8,OC_NOP
|
|
CP_CEILING::
|
|
PUSH RBP
|
|
MOV RBP,RSP
|
|
|
|
SUB RSP,8
|
|
FSTCW U4 -8[RBP]
|
|
FWAIT
|
|
MOV AX,U2 -8[RBP]
|
|
MOV U2 -6[RBP],AX
|
|
AND AX,~0x0C00
|
|
OR AX,0x0800
|
|
MOV U2 -8[RBP],AX
|
|
FLDCW U4 -8[RBP]
|
|
|
|
FLD U8 SF_PARAM1[RBP]
|
|
FRNDINT
|
|
FSTP U8 SF_PARAM1[RBP]
|
|
FWAIT
|
|
MOV RAX,SF_PARAM1[RBP]
|
|
|
|
FLDCW U4 -6[RBP]
|
|
FWAIT
|
|
ADD RSP,8
|
|
|
|
POP RBP
|
|
RET
|
|
////**************************PROCEDURE*************************
|
|
ALIGN 8,OC_NOP
|
|
CP_POW10::
|
|
PUSH RBP
|
|
MOV RBP,RSP
|
|
SUB RSP,16
|
|
FSTCW U4 -8[RBP]
|
|
FWAIT
|
|
MOV AX,U2 -8[RBP]
|
|
MOV U2 -6[RBP],AX
|
|
OR AX,0x0C00
|
|
MOV U2 -8[RBP],AX
|
|
FLDCW U4 -8[RBP]
|
|
|
|
FLDL2T
|
|
FLD U8 SF_PARAM1[RBP]
|
|
FMULP
|
|
FST U8 SF_PARAM1[RBP]
|
|
FRNDINT
|
|
FLD U8 SF_PARAM1[RBP]
|
|
FSUBRP
|
|
F2XM1
|
|
FLD1
|
|
FADDP
|
|
FSTP U8 -16[RBP]
|
|
FFREE
|
|
FINCSTP
|
|
FLD U8 SF_PARAM1[RBP]
|
|
FLD U8 -16[RBP]
|
|
FSCALE // ST0<<ST1
|
|
FSTP U8 -16[RBP]
|
|
FFREE
|
|
FINCSTP
|
|
|
|
FLDCW U4 -6[RBP]
|
|
FWAIT
|
|
POP RAX
|
|
ADD RSP,8
|
|
POP RBP
|
|
RET
|
|
////**************************PROCEDURE*************************
|
|
ALIGN 8,OC_NOP
|
|
CP_EXP::
|
|
PUSH RBP
|
|
MOV RBP,RSP
|
|
SUB RSP,16
|
|
FSTCW U4 -8[RBP]
|
|
FWAIT
|
|
MOV AX,U2 -8[RBP]
|
|
MOV U2 -6[RBP],AX
|
|
OR AX,0x0C00
|
|
MOV U2 -8[RBP],AX
|
|
FLDCW U4 -8[RBP]
|
|
|
|
FLDL2E
|
|
FLD U8 SF_PARAM1[RBP]
|
|
FMULP
|
|
FST U8 SF_PARAM1[RBP]
|
|
FRNDINT
|
|
FLD U8 SF_PARAM1[RBP]
|
|
FSUBRP
|
|
F2XM1
|
|
FLD1
|
|
FADDP
|
|
FSTP U8 -16[RBP]
|
|
FFREE
|
|
FINCSTP
|
|
FLD U8 SF_PARAM1[RBP]
|
|
FLD U8 -16[RBP]
|
|
FSCALE // ST0<<ST1
|
|
FSTP U8 -16[RBP]
|
|
FFREE
|
|
FINCSTP
|
|
|
|
FLDCW U4 -6[RBP]
|
|
FWAIT
|
|
|
|
POP RAX
|
|
ADD RSP,8
|
|
POP RBP
|
|
RET
|
|
|
|
////**************************PROCEDURE*************************
|
|
ALIGN 8,OC_NOP
|
|
CP_LOG10::
|
|
PUSH RBP
|
|
MOV RBP,RSP
|
|
SUB RSP,8
|
|
FLDLG2
|
|
FLD U8 SF_PARAM1[RBP]
|
|
FYL2X // y*log2(x)
|
|
FSTP U8 -8[RBP]
|
|
FFREE
|
|
FINCSTP
|
|
FWAIT
|
|
POP RAX
|
|
POP RBP
|
|
RET
|
|
////**************************PROCEDURE*************************
|
|
ALIGN 8,OC_NOP
|
|
CP_LOG2::
|
|
PUSH RBP
|
|
MOV RBP,RSP
|
|
SUB RSP,8
|
|
FLD1
|
|
FLD U8 SF_PARAM1[RBP]
|
|
FYL2X // y*log2(x)
|
|
FSTP U8 -8[RBP]
|
|
FFREE
|
|
FINCSTP
|
|
FWAIT
|
|
POP RAX
|
|
POP RBP
|
|
RET
|
|
////**************************PROCEDURE*************************
|
|
ALIGN 8,OC_NOP
|
|
CP_LN::
|
|
PUSH RBP
|
|
MOV RBP,RSP
|
|
SUB RSP,8
|
|
FLDLN2
|
|
FLD U8 SF_PARAM1[RBP]
|
|
FYL2X // y*log2(x)
|
|
FSTP U8 -8[RBP]
|
|
FFREE
|
|
FINCSTP
|
|
FWAIT
|
|
POP RAX
|
|
POP RBP
|
|
RET
|
|
////**************************PROCEDURE*************************
|
|
ALIGN 8,OC_NOP
|
|
CP_FLDCW::
|
|
PUSH RBP
|
|
MOV RBP,RSP
|
|
FLDCW U4 SF_PARAM1[RBP]
|
|
POP RBP
|
|
RET
|
|
////**************************PROCEDURE*************************
|
|
ALIGN 8,OC_NOP
|
|
CP_FSTCW::
|
|
PUSH RBP
|
|
MOV RBP,RSP
|
|
SUB RSP,8
|
|
FSTCW U4 -8[RBP]
|
|
MOVZX RAX,U2 -8[RBP]
|
|
ADD RSP,8
|
|
POP RBP
|
|
RET
|
|
////**************************PROCEDURE*************************
|
|
ALIGN 8,OC_NOP
|
|
CP_FSTSW::
|
|
XOR EAX,EAX
|
|
FSTSW
|
|
RET
|
|
////**************************PROCEDURE*************************
|
|
ALIGN 8,OC_NOP
|
|
CP_FCLEX::
|
|
FCLEX
|
|
RET
|
|
////**************************PROCEDURE*************************
|
|
ALIGN 8,OC_NOP
|
|
CP_CLFLUSH::
|
|
PUSH RBP
|
|
MOV RBP,RSP
|
|
MOV RAX,U8 SF_PARAM1[RBP]
|
|
CLFLUSH U1 [RAX]
|
|
POP RBP
|
|
RET
|
|
////**************************PROCEDURE*************************
|
|
ALIGN 8,OC_NOP
|
|
CP_CPUID::
|
|
PUSH RBP
|
|
MOV RBP,RSP
|
|
PUSH RSI
|
|
MOV RAX,U8 SF_PARAM1[RBP]
|
|
CPUID
|
|
MOV RSI,U8 SF_PARAM2[RBP]
|
|
MOV U8 [RSI],RAX
|
|
MOV U8 8[RSI],RBX
|
|
MOV U8 16[RSI],RCX
|
|
MOV U8 24[RSI],RDX
|
|
POP RSI
|
|
POP RBP
|
|
RET
|
|
////**************************PROCEDURE*************************
|
|
ALIGN 8,OC_NOP
|
|
CP_GETCR0::
|
|
XOR EAX,EAX
|
|
// MOV EAX,CR0
|
|
DU1 0x0F,0x20,0xC0;
|
|
RET
|
|
////**************************PROCEDURE*************************
|
|
ALIGN 8,OC_NOP
|
|
CP_SETCR0::
|
|
PUSH RBP
|
|
MOV RBP,RSP
|
|
MOV RAX,U8 SF_PARAM1[RBP]
|
|
// MOV CR0,EAX
|
|
DU1 0x0F,0x22,0xC0;
|
|
POP RBP
|
|
RET
|
|
////**************************PROCEDURE*************************
|
|
ALIGN 8,OC_NOP
|
|
CP_LTR::
|
|
PUSH RBP
|
|
MOV RBP,RSP
|
|
LTR U4 SF_PARAM1[RBP]
|
|
POP RBP
|
|
RET
|
|
////**************************PROCEDURE*************************
|
|
ALIGN 8,OC_NOP
|
|
CP_GETCR3::
|
|
XOR EAX,EAX
|
|
// MOV EAX,CR3
|
|
DU1 0x0F,0x20,0xD8;
|
|
RET
|
|
////**************************PROCEDURE*************************
|
|
ALIGN 8,OC_NOP
|
|
CP_SETCR3::
|
|
PUSH RBP
|
|
MOV RBP,RSP
|
|
MOV RAX,U8 SF_PARAM1[RBP]
|
|
//dbgo precede with REX
|
|
// MOV CR3,EAX
|
|
DU1 0x0F,0x22,0xD8;
|
|
POP RBP
|
|
RET
|
|
////**************************PROCEDURE*************************
|
|
ALIGN 8,OC_NOP
|
|
CP_GETCR4::
|
|
XOR EAX,EAX
|
|
// MOV EAX,CR4
|
|
DU1 0x0F,0x20,0xE0;
|
|
RET
|
|
////**************************PROCEDURE*************************
|
|
ALIGN 8,OC_NOP
|
|
CP_SETCR4::
|
|
PUSH RBP
|
|
MOV RBP,RSP
|
|
MOV RAX,U8 SF_PARAM1[RBP]
|
|
// MOV CR4,EAX
|
|
DU1 0x0F,0x22,0xE0;
|
|
POP RBP
|
|
RET
|
|
////**************************PROCEDURE*************************
|
|
ALIGN 8,OC_NOP
|
|
CP_INDCALL::
|
|
PUSH RBP
|
|
MOV RBP,RSP
|
|
PUSH RSI
|
|
PUSH RDI
|
|
MOV RDX,U8 SF_PARAM1[RBP]
|
|
MOV RCX,U8 SF_PARAM2[RBP] //argc
|
|
LEA RSI,U8 SF_PARAM3[RBP] //argv
|
|
SHL RCX,3
|
|
SUB RSP,RCX
|
|
MOV RDI,RSP
|
|
REP_MOVSB
|
|
@@10: OR RDX,RDX
|
|
JZ @@100
|
|
CALL RDX
|
|
@@20: MOV RCX,U8 SF_PARAM2[RBP] //argc
|
|
SHL RCX,3
|
|
ADD RSP,RCX
|
|
POP RDI
|
|
POP RSI
|
|
POP RBP
|
|
RET
|
|
|
|
@@100: XOR EAX,EAX
|
|
MOV RCX,U8 SF_PARAM2[RBP] //argc
|
|
SHL RCX,3
|
|
ADD RSP,RCX
|
|
POP RDI
|
|
POP RSI
|
|
POP RBP
|
|
RET
|
|
|
|
////**************************PROCEDURE*************************
|
|
ALIGN 8,OC_NOP
|
|
CP_CALLEXTNUM::
|
|
PUSH RBP
|
|
MOV RBP,RSP
|
|
PUSH RSI
|
|
PUSH RDI
|
|
MOV RDX,U8 SF_PARAM1[RBP]
|
|
MOV RCX,U8 SF_PARAM2[RBP] //argc
|
|
LEA RSI,U8 SF_PARAM3[RBP] //argv
|
|
SHL RCX,3
|
|
SUB RSP,RCX
|
|
MOV RDI,RSP
|
|
REP_MOVSB
|
|
@@10: MOV RAX,U8 [SYS_EXTERN_TABLE]
|
|
MOV RAX,U8 [RAX+RDX*8]
|
|
OR RAX,RAX
|
|
JZ @@100
|
|
CALL RAX
|
|
@@20: MOV RCX,U8 SF_PARAM2[RBP] //argc
|
|
SHL RCX,3
|
|
ADD RSP,RCX
|
|
POP RDI
|
|
POP RSI
|
|
POP RBP
|
|
RET
|
|
|
|
@@100: XOR EAX,EAX
|
|
MOV RCX,U8 SF_PARAM2[RBP] //argc
|
|
SHL RCX,3
|
|
ADD RSP,RCX
|
|
POP RDI
|
|
POP RSI
|
|
POP RBP
|
|
RET
|
|
////**************************PROCEDURE*************************
|
|
ALIGN 8,OC_NOP
|
|
CP_CALLEXTSTR::
|
|
PUSH RBP
|
|
MOV RBP,RSP
|
|
PUSH RSI
|
|
PUSH RDI
|
|
MOV RCX,U8 SF_PARAM2[RBP] //argc
|
|
LEA RSI,U8 SF_PARAM3[RBP] //argv
|
|
SHL RCX,3
|
|
SUB RSP,RCX
|
|
MOV RDI,RSP
|
|
REP_MOVSB
|
|
@@10: MOV RSI,U8 SF_PARAM1[RBP]
|
|
CALL FIND_EXTERN
|
|
OR RSI,RSI
|
|
JZ @@100
|
|
CALL RSI
|
|
@@20: MOV RCX,U8 SF_PARAM2[RBP] //argc
|
|
SHL RCX,3
|
|
ADD RSP,RCX
|
|
POP RDI
|
|
POP RSI
|
|
POP RBP
|
|
RET
|
|
|
|
@@100: XOR EAX,EAX
|
|
MOV RCX,U8 SF_PARAM2[RBP] //argc
|
|
SHL RCX,3
|
|
ADD RSP,RCX
|
|
POP RDI
|
|
POP RSI
|
|
POP RBP
|
|
RET
|
|
////**************************PROCEDURE*************************
|
|
/*
|
|
I8 ArcDetermineCompressionType(U1 *src,U8 size)
|
|
{
|
|
U8 i,j=0;
|
|
for (i=0;i<size;i++)
|
|
j|=src[i];
|
|
if (j & 0x80)
|
|
return CT_8_BIT;
|
|
else
|
|
return CT_7_BIT;
|
|
}
|
|
*/
|
|
ALIGN 8,OC_NOP
|
|
CP_ARC_DETERMINE_COMPRESSION_TYPE::
|
|
PUSH RBP
|
|
MOV RBP,RSP
|
|
PUSH RSI
|
|
MOV RSI,U8 SF_PARAM1[RBP]
|
|
MOV RCX,U8 SF_PARAM2[RBP]
|
|
OR RCX,RCX
|
|
JZ @@100
|
|
XOR EBX,EBX
|
|
@@1: LODSB
|
|
OR BL,AL
|
|
LOOP @@1
|
|
OR BL,BL
|
|
JNS @@100
|
|
MOV RAX,CT_8_BIT
|
|
JMP @@110
|
|
@@100: MOV RAX,CT_7_BIT
|
|
@@110: POP RSI
|
|
POP RBP
|
|
RET
|
|
////**************************PROCEDURE*************************
|
|
/*
|
|
U8 ArcCheckSum(U1 *buf,U8 size)
|
|
{
|
|
U4 *ptr=buf;
|
|
U8 result=0,i,l=size>>2;
|
|
for (i=0;i<l;i++)
|
|
result^=ptr[i];
|
|
return result;
|
|
}
|
|
*/
|
|
ALIGN 8,OC_NOP
|
|
CP_ARC_CHECK_SUM::
|
|
PUSH RBP
|
|
MOV RBP,RSP
|
|
PUSH RSI
|
|
MOV RSI,U8 SF_PARAM1[RBP]
|
|
MOV RCX,U8 SF_PARAM2[RBP]
|
|
XOR EBX,EBX
|
|
SHR RCX,2
|
|
JZ @@100
|
|
@@1: LODSD
|
|
XOR RBX,RAX
|
|
LOOP @@1
|
|
@@100: MOV RAX,RBX
|
|
POP RSI
|
|
POP RBP
|
|
RET
|
|
////**************************PROCEDURE*************************
|
|
|
|
/*
|
|
void ArcGetTableEntry(ArcCs *c)
|
|
{
|
|
U8 i;
|
|
ArcTableEntry *temp,*temp1;
|
|
|
|
if (c->entry_used) {
|
|
i=c->free_index;
|
|
|
|
c->entry_used=FALSE;
|
|
c->cur_entry=c->next_entry;
|
|
c->cur_bits_in_use=c->next_bits_in_use;
|
|
if (c->next_bits_in_use<ARC_MAX_BITS) {
|
|
c->next_entry = &c->compress[i++];
|
|
if (i==c->free_limit) {
|
|
c->next_bits_in_use++;
|
|
c->free_limit=1<<c->next_bits_in_use;
|
|
}
|
|
} else {
|
|
do if (++i==c->free_limit)
|
|
i=c->min_table_entry;
|
|
while (c->hash[i]);
|
|
temp=&c->compress[i];
|
|
c->next_entry=temp;
|
|
temp1=&c->hash[temp->basecode];
|
|
while (temp1) {
|
|
if (temp1->next==temp) {
|
|
temp1->next=temp->next;
|
|
break;
|
|
} else
|
|
temp1=temp1->next;
|
|
}
|
|
}
|
|
c->free_index=i;
|
|
}
|
|
}
|
|
*/
|
|
ALIGN 8,OC_NOP
|
|
CP_ARC_GET_TABLE_ENTRY::
|
|
PUSH RBP
|
|
MOV RBP,RSP
|
|
PUSH RSI
|
|
PUSH RDI
|
|
MOV RSI,U8 SF_PARAM1[RBP]
|
|
BTR U8 ACS_ENTRY_USED[RSI],0
|
|
JNC U4 @@100
|
|
MOV RDX,U8 ACS_FREE_INDEX[RSI]
|
|
XOR EAX,EAX
|
|
MOV RAX,U8 ACS_NEXT_ENTRY[RSI]
|
|
MOV U8 ACS_CUR_ENTRY[RSI],RAX
|
|
MOV RCX,U8 ACS_NEXT_BITS_IN_USE[RSI]
|
|
MOV U8 ACS_CUR_BITS_IN_USE[RSI],RCX
|
|
CMP RCX,ARC_MAX_BITS
|
|
JAE @@20
|
|
MOV RAX,RDX
|
|
SHL RAX,4
|
|
LEA RAX,U8 ACS_COMPRESS[RSI+RAX]
|
|
MOV U8 ACS_NEXT_ENTRY[RSI],RAX
|
|
INC RDX
|
|
CMP U8 ACS_FREE_LIMIT[RSI],RDX
|
|
JNE @@90
|
|
INC RCX
|
|
MOV U8 ACS_NEXT_BITS_IN_USE[RSI],RCX
|
|
MOV RAX,1
|
|
SHL RAX,CL
|
|
MOV U8 ACS_FREE_LIMIT[RSI],RAX
|
|
JMP @@90
|
|
@@20: INC RDX
|
|
CMP U8 ACS_FREE_LIMIT[RSI],RDX
|
|
JNE @@25
|
|
MOV RDX,U8 ACS_MIN_TABLE_ENTRY[RSI]
|
|
@@25: MOV RAX,U8 ACS_HASH[RSI+RDX*8]
|
|
OR RAX,RAX
|
|
JNZ @@20
|
|
MOV RDI,RDX
|
|
SHL RDI,4
|
|
LEA RDI,U8 ACS_COMPRESS[RSI+RDI]
|
|
MOV U4 ACS_NEXT_ENTRY[RSI],EDI
|
|
MOVZX RBX,U2 ATE_BASECODE[RDI]
|
|
LEA RCX,U8 ACS_HASH[RSI+RBX*8]
|
|
@@50: OR RCX,RCX
|
|
JZ @@90
|
|
MOV RAX,U8 ATE_NEXT[RCX]
|
|
CMP RDI,RAX
|
|
JNE @@55
|
|
MOV RAX,U8 ATE_NEXT[RDI]
|
|
MOV U8 ATE_NEXT[RCX],RAX
|
|
JMP @@90
|
|
@@55: MOV RCX,RAX
|
|
JMP @@50
|
|
@@90: MOV U8 ACS_FREE_INDEX[RSI],RDX
|
|
@@100: POP RDI
|
|
POP RSI
|
|
POP RBP
|
|
RET
|
|
|
|
CP_PUT_GS_BASE::
|
|
PUSH RBP
|
|
MOV RBP,RSP
|
|
MOV RAX,SF_PARAM1[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
|
|
POP RBP
|
|
RET
|
|
|
|
PUT_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
|