Files
2022-10-26 12:25:11 +08:00

1682 lines
54 KiB
C++

#pragma once
#include "IWzASM.h"
#include "IWzASM.CmdBlk.Tools.h"
//¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬
// <PROTOTYPEs>
//
#pragma pack(push, 1)
#pragma push_macro("INLINE")
#pragma push_macro("CONST")
#pragma push_macro("STATIC")
#define INLINE __forceinline
#define CONST const
#define STATIC static
#define CSTATIC STATIC CONST
//¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬
// <IL PROTOTYPEs>
struct IL
{
union {
OPW_T X;
struct { OPB_T L, H; };
};
IL( CONST OPW_T cCMD ) : X(cCMD) {}
};
//¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬
// <sIL PROTOTYPEs>
template<OPW_T _CMD>
struct sIL
{
IL FIELD;
sIL() : FIELD(_CMD) {}
INLINE VOID Change( OPW_T cCMD ) { FIELD.X = cCMD; }
};
//¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬
// <sIL FAVORATE>
typedef sIL<IWzASM::RET> sIL_RET;
typedef sIL<IWzASM::NOP> sIL_NOP;
typedef sIL<IWzASM::MARK01> sIL_MARK01;
typedef sIL<IWzASM::MARK02> sIL_MARK02;
typedef sIL<IWzASM::MARK03> sIL_MARK03;
typedef sIL<IWzASM::MARK04> sIL_MARK04;
typedef sIL<IWzASM::MARK05> sIL_MARK05;
typedef sIL<IWzASM::MARK06> sIL_MARK06;
typedef sIL<IWzASM::MARK07> sIL_MARK07;
typedef sIL<IWzASM::MARK08> sIL_MARK08;
typedef sIL<IWzASM::MARK09> sIL_MARK09;
typedef sIL<IWzASM::MARK10> sIL_MARK10;
typedef sIL<IWzASM::MARK11> sIL_MARK11;
typedef sIL<IWzASM::MARK12> sIL_MARK12;
typedef sIL<IWzASM::MARK13> sIL_MARK13;
typedef sIL<IWzASM::MARK14> sIL_MARK14;
typedef sIL<IWzASM::MARK15> sIL_MARK15;
typedef sIL<IWzASM::MARK16> sIL_MARK16;
typedef sIL<IWzASM::MARK17> sIL_MARK17;
typedef sIL<IWzASM::MARK18> sIL_MARK18;
typedef sIL<IWzASM::MARK19> sIL_MARK19;
// 1byte MARK Á¶ÇÕ
template<OPB_T _MARKB> struct sIL_MARKC { sIL<DECL_WzASM_HASH(_MARKB, OPT::NOP)> M01; };
typedef sIL_MARKC<OPC::MARK01> sIL_MARKC01;
typedef sIL_MARKC<OPC::MARK02> sIL_MARKC02;
typedef sIL_MARKC<OPC::MARK03> sIL_MARKC03;
typedef sIL_MARKC<OPC::MARK04> sIL_MARKC04;
typedef sIL_MARKC<OPC::MARK05> sIL_MARKC05;
typedef sIL_MARKC<OPC::MARK06> sIL_MARKC06;
typedef sIL_MARKC<OPC::MARK07> sIL_MARKC07;
typedef sIL_MARKC<OPC::MARK08> sIL_MARKC08;
typedef sIL_MARKC<OPC::MARK09> sIL_MARKC09;
typedef sIL_MARKC<OPC::MARK10> sIL_MARKC10;
typedef sIL_MARKC<OPC::MARK11> sIL_MARKC11;
typedef sIL_MARKC<OPC::MARK12> sIL_MARKC12;
typedef sIL_MARKC<OPC::MARK13> sIL_MARKC13;
typedef sIL_MARKC<OPC::MARK14> sIL_MARKC14;
typedef sIL_MARKC<OPC::MARK15> sIL_MARKC15;
typedef sIL_MARKC<OPC::MARK16> sIL_MARKC16;
typedef sIL_MARKC<OPC::MARK17> sIL_MARKC17;
typedef sIL_MARKC<OPC::MARK18> sIL_MARKC18;
typedef sIL_MARKC<OPC::MARK19> sIL_MARKC19;
#if !WzASM_UPDATE_0x5001
template<OPW_T _MARK>
struct sIL_MARK
{
sIL<_MARK> M01;
};
// 1byte MARK Á¶ÇÕ
template<OPB_T _MARKB>
struct sIL_MARK_COMPOSE
{
sIL<DECL_WzASM_HASH(_MARKB, OPT::NOP)> M01;
};
#endif
//¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬
// <sDT PROTOTYPEs>
template<typename _TYPE, _TYPE _VAL>
struct sDT
{
_TYPE VALUE;
sDT() : VALUE(_VAL) {}
inline VOID Change( _TYPE vVAL ) { VALUE = vVAL; }
};
struct DT1
{
BYTE L;
DT1( CONST BYTE vVAL ) : L(vVAL) {}
};
struct DT2
{
union {
WORD X;
struct { BYTE L, H; };
};
DT2( CONST WORD vVAL ) : X(vVAL) {}
};
struct DT4
{
union {
DWORD EX;
WORD X;
struct {
union {
struct { BYTE L, H; };
WORD LX;
};
union {
struct { BYTE L, H; };
WORD HX;
};
};
};
DT4( CONST DWORD vVAL ) : EX(vVAL){}
};
template<BYTE _VAL> struct sDT1 : sDT<BYTE, _VAL> {}; // 1BYTE DATA
template<WORD _VAL> struct sDT2 : sDT<WORD, _VAL> {}; // 2BYTE DATA
template<DWORD _VAL> struct sDT4 : sDT<DWORD, _VAL> {}; // 4BYTE DATA
template<WzASMH _HASH> struct sDTH : sDT<WzASMH, _HASH> {}; // 2BYTE DATA
template<OPB_T _MARK> struct sDTM : sDT<OPB_T, _MARK> {}; // 1BYTE DATA - { OP(2B) | jmark(1B) }
template<WzPTR _PTR> struct sDTP : sDT<WzPTR, _PTR> {}; // 4BYTE DATA
template<BYTE _CATEGORY, BYTE _PROTOCOL>
struct sDTPK : sDT<WORD, MAKEWORD(_CATEGORY, _PROTOCOL)> {};
//¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬
// <sDT SPECIAL>
// <Offset Control Argument>
template<WORD _DT, WORD _OP>
struct sDT_CALC
{
cOFF CALC;
sDT_CALC()
{
CALC.DT = _DT;//(WORD)offsetof( _TYPE, _FIELD );
CALC.OP = _OP;
}
};
template<typename _TYPE, typename _FIELD, typename WORD _OP>
struct sDT_CALC_T
{
cOFF CALC;
sDT_CALC_T()
{
CALC.DT = (WORD)OFFSETOF( _TYPE, _FIELD );
CALC.OP = _OP;
}
};
//¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬
//
// 6 BYTE
struct sIL_CRYPT_BLK_HEADER_MAGIC
{
//sDT1<'W'> M01;
//sDT1<0xF1> M02;
//sDT1<'A'> M03;
//sDT1<0x74> M04;
//sDT1<'m'> M05;
//sDT1<'4'> M06;
BYTE MARRAY[6];
sIL_CRYPT_BLK_HEADER_MAGIC()
{
MARRAY[0] = 'W';
MARRAY[1] = 0xF1;
MARRAY[2] = 'A';
MARRAY[3] = 0x74;
MARRAY[4] = 'm';
MARRAY[5] = '4';
}
};
// 6 BYTE + 7 BYTE
struct sIL_CRYPT_BLK_HEADER
{
sIL_CRYPT_BLK_HEADER_MAGIC M01;
sDT2<'7'> M02_CRYPT_KEY;
sDT2<101> M03_VERSION;
sDT1<0xF7> M04_TYPE;
sDT1<0x90> M05;
sDT1<0x83> M06;
};
// 8 BYTE
struct sIL_CRYPT_BLK_TAIL
{
sDT1<0x71> M01;
sDT1<0x87> M02;
sDT1<'A'> M03;
sDT1<'s'> M04;
sDT1<'m'> M05;
sDT1<'|'> M06;
sDT1<'i'> M07;
sDT1<'x'> M08;
};
//¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬
// <CLR>
typedef sIL<IWzASM::CLR_EAX> sIL_CLR_EAX;
typedef sIL<IWzASM::CLR_EBX> sIL_CLR_EBX;
typedef sIL<IWzASM::CLR_ECX> sIL_CLR_ECX;
typedef sIL<IWzASM::CLR_EDX> sIL_CLR_EDX;
typedef sIL<IWzASM::CLR_ERP> sIL_CLR_ERP;
typedef sIL<IWzASM::CLR_EOP> sIL_CLR_EOP;
typedef sIL<IWzASM::CLR_EABCDX> sIL_CLR_EABCDX;
typedef sIL<IWzASM::CLRA_EAX> sIL_CLRA_EAX;
typedef sIL<IWzASM::CLRA_EBX> sIL_CLRA_EBX;
typedef sIL<IWzASM::CLRA_ECX> sIL_CLRA_ECX;
typedef sIL<IWzASM::CLRA_EDX> sIL_CLRA_EDX;
typedef sIL<IWzASM::CLRA_ERP> sIL_CLRA_ERP;
typedef sIL<IWzASM::CLRA_EOP> sIL_CLRA_EOP;
typedef sIL<IWzASM::CLRA_EABCDX> sIL_CLRA_EABCDX;
//¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬
// <MOV>
typedef sIL<IWzASM::MOV_EAX_EBX> sIL_MOV_EAX_EBX;
typedef sIL<IWzASM::MOV_EAX_ECX> sIL_MOV_EAX_ECX;
typedef sIL<IWzASM::MOV_EAX_EDX> sIL_MOV_EAX_EDX;
typedef sIL<IWzASM::MOV_EAX_ERP> sIL_MOV_EAX_ERP;
typedef sIL<IWzASM::MOV_EAX_EOP> sIL_MOV_EAX_EOP;
typedef sIL<IWzASM::MOV_EBX_EAX> sIL_MOV_EBX_EAX;
typedef sIL<IWzASM::MOV_EBX_ECX> sIL_MOV_EBX_ECX;
typedef sIL<IWzASM::MOV_EBX_EDX> sIL_MOV_EBX_EDX;
typedef sIL<IWzASM::MOV_EBX_ERP> sIL_MOV_EBX_ERP;
typedef sIL<IWzASM::MOV_EBX_EOP> sIL_MOV_EBX_EOP;
typedef sIL<IWzASM::MOV_ECX_EAX> sIL_MOV_ECX_EAX;
typedef sIL<IWzASM::MOV_ECX_EBX> sIL_MOV_ECX_EBX;
typedef sIL<IWzASM::MOV_ECX_EDX> sIL_MOV_ECX_EDX;
typedef sIL<IWzASM::MOV_ECX_ERP> sIL_MOV_ECX_ERP;
typedef sIL<IWzASM::MOV_ECX_EOP> sIL_MOV_ECX_EOP;
typedef sIL<IWzASM::MOV_EDX_EAX> sIL_MOV_EDX_EAX;
typedef sIL<IWzASM::MOV_EDX_EBX> sIL_MOV_EDX_EBX;
typedef sIL<IWzASM::MOV_EDX_ECX> sIL_MOV_EDX_ECX;
typedef sIL<IWzASM::MOV_EDX_ERP> sIL_MOV_EDX_ERP;
typedef sIL<IWzASM::MOV_EDX_EOP> sIL_MOV_EDX_EOP;
typedef sIL<IWzASM::MOV_ERP_EAX> sIL_MOV_ERP_EAX;
typedef sIL<IWzASM::MOV_ERP_EBX> sIL_MOV_ERP_EBX;
typedef sIL<IWzASM::MOV_ERP_ECX> sIL_MOV_ERP_ECX;
typedef sIL<IWzASM::MOV_ERP_EDX> sIL_MOV_ERP_EDX;
typedef sIL<IWzASM::MOV_ERP_EOP> sIL_MOV_ERP_EOP;
typedef sIL<IWzASM::MOV_EOP_EAX> sIL_MOV_EOP_EAX;
typedef sIL<IWzASM::MOV_EOP_EBX> sIL_MOV_EOP_EBX;
typedef sIL<IWzASM::MOV_EOP_ECX> sIL_MOV_EOP_ECX;
typedef sIL<IWzASM::MOV_EOP_EDX> sIL_MOV_EOP_EDX;
typedef sIL<IWzASM::MOV_EOP_ERP> sIL_MOV_EOP_EOP;
//¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬
// <MOV><SPECIAL>
typedef sIL<IWzASM::MOV_EOP_OFF> sIL_MOV_ERP_OFF;
// ERP[1].CALC = CALC(_DT, _OP)
template<typename WORD _DT, typename WORD _OP>
struct sIL_MOV_ERP_CALC_BLK
{
sIL_MOV_ERP_OFF M01;
sDT_CALC<_DT, _OP> M02;
};
//¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬
/* REG[0].EX = (_TYPE)_VAL */
template<typename _TYPE, OPW_T _CMD, typename _DECLTYPE, typename BYTE _SZ>
struct sIL_MOV_VAL
{
sIL<_CMD> M01;
_DECLTYPE M02;
inline VOID ChangeVAL( _TYPE vVAL )
{ M02.Change( vVAL ); }
};
/* REG[0].EX = (_TYPE)_VAL */
template<typename BYTE _VAL>
struct sIL_MOV_EAX_B1 : sIL_MOV_VAL<BYTE, IWzASM::MOV_EAX_B1, sDT1<_VAL>, 0> {};
/* REG[0].EX = (_TYPE)_VAL */
template<typename WORD _VAL>
struct sIL_MOV_EAX_B2 : sIL_MOV_VAL<WORD, IWzASM::MOV_EAX_B2, sDT2<_VAL>, 0> {};
/* REG[0].EX = (_TYPE)_VAL */
template<typename DWORD _VAL>
struct sIL_MOV_EAX_B4 : sIL_MOV_VAL<DWORD, IWzASM::MOV_EAX_B4, sDT4<_VAL>, 0> {};
/* REG[0].EX = (_TYPE)_VAL */
template<typename WzASMH _HASH>
struct sIL_MOV_EAX_HASH : sIL_MOV_VAL<WzASMH, IWzASM::MOV_EAX_HASH, sDTH<_HASH>, 0> {};
/* REG[0].EX = (_TYPE)_VAL */
template<typename WzPTR _PTR>
struct sIL_MOV_EAX_PTR : sIL_MOV_VAL<WzPTR, IWzASM::MOV_EAX_PTR, sDTP<_PTR>, 0> {};
/* REG[0].EX = (_TYPE)_VAL */
template<typename BYTE _VAL>
struct sIL_MOV_EBX_B1 : sIL_MOV_VAL<BYTE, IWzASM::MOV_EBX_B1, sDT1<_VAL>, 0> {};
/* REG[0].EX = (_TYPE)_VAL */
template<typename WORD _VAL>
struct sIL_MOV_EBX_B2 : sIL_MOV_VAL<WORD, IWzASM::MOV_EBX_B2, sDT2<_VAL>, 0> {};
/* REG[0].EX = (_TYPE)_VAL */
template<typename DWORD _VAL>
struct sIL_MOV_EBX_B4 : sIL_MOV_VAL<DWORD, IWzASM::MOV_EBX_B4, sDT4<_VAL>, 0> {};
/* REG[0].EX = (_TYPE)_VAL */
template<typename WzASMH _HASH>
struct sIL_MOV_EBX_HASH : sIL_MOV_VAL<WzASMH, IWzASM::MOV_EBX_HASH, sDTH<_HASH>, 0> {};
/* REG[0].EX = (_TYPE)_VAL */
template<typename WzPTR _PTR>
struct sIL_MOV_EBX_PTR : sIL_MOV_VAL<WzPTR, IWzASM::MOV_EBX_PTR, sDTP<_PTR>, 0> {};
//¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬
// <MOV><SPECIAL><EXA IDX>
/* REG[0].EX = (_TYPE)_VAL */
template<typename BYTE _VAL>
struct sIL_MOV_EAX0_B1 : sIL_MOV_VAL<BYTE, IWzASM::MOV_EAX0_B1, sDT1<_VAL>, 0> {};
/* REG[0].EX = (_TYPE)_VAL */
template<typename WORD _VAL>
struct sIL_MOV_EAX0_B2 : sIL_MOV_VAL<WORD, IWzASM::MOV_EAX0_B2, sDT2<_VAL>, 0> {};
/* REG[0].EX = (_TYPE)_VAL */
template<typename DWORD _VAL>
struct sIL_MOV_EAX0_B4 : sIL_MOV_VAL<DWORD, IWzASM::MOV_EAX0_B4, sDT4<_VAL>, 0> {};
/* REG[0].EX = (_TYPE)_VAL */
template<typename WzASMH _VAL>
struct sIL_MOV_EAX0_HASH : sIL_MOV_VAL<WORD, IWzASM::MOV_EAX0_HASH, sDTH<_VAL>, 0> {};
/* REG[0].EX = (_TYPE)_VAL */
template<typename WzPTR _PTR>
struct sIL_MOV_EAX0_PTR : sIL_MOV_VAL<WzPTR, IWzASM::MOV_EAX0_PTR, sDTP<_PTR>, 0> {};
//
template<typename BYTE _VAL>
struct sIL_MOV_EAX1_B1 : sIL_MOV_VAL<BYTE, IWzASM::MOV_EAX1_B1, sDT1<_VAL>, 0> {};
/* REG[1].EX = (_TYPE)_VAL */
template<typename WORD _VAL>
struct sIL_MOV_EAX1_B2 : sIL_MOV_VAL<WORD, IWzASM::MOV_EAX1_B2, sDT2<_VAL>, 0> {};
/* REG[1].EX = (_TYPE)_VAL */
template<typename DWORD _VAL>
struct sIL_MOV_EAX1_B4 : sIL_MOV_VAL<DWORD, IWzASM::MOV_EAX1_B4, sDT4<_VAL>, 0> {};
/* REG[1].EX = (_TYPE)_VAL */
template<typename WzASMH _VAL>
struct sIL_MOV_EAX1_HASH : sIL_MOV_VAL<WORD, IWzASM::MOV_EAX1_HASH, sDTH<_VAL>, 0> {};
/* REG[1].EX = (_TYPE)_VAL */
template<typename WzPTR _PTR>
struct sIL_MOV_EAX1_PTR : sIL_MOV_VAL<WzPTR, IWzASM::MOV_EAX1_PTR, sDTP<_PTR>, 0> {};
//
/* REG[2].EX = (_TYPE)_VAL */
template<typename BYTE _VAL>
struct sIL_MOV_EAX2_B1 : sIL_MOV_VAL<BYTE, IWzASM::MOV_EAX2_B1, sDT1<_VAL>, 0> {};
/* REG[2].EX = (_TYPE)_VAL */
template<typename WORD _VAL>
struct sIL_MOV_EAX2_B2 : sIL_MOV_VAL<WORD, IWzASM::MOV_EAX2_B2, sDT2<_VAL>, 0> {};
/* REG[2].EX = (_TYPE)_VAL */
template<typename DWORD _VAL>
struct sIL_MOV_EAX2_B4 : sIL_MOV_VAL<DWORD, IWzASM::MOV_EAX2_B4, sDT4<_VAL>, 0> {};
/* REG[2].EX = (_TYPE)_VAL */
template<typename WzASMH _VAL>
struct sIL_MOV_EAX2_HASH : sIL_MOV_VAL<WORD, IWzASM::MOV_EAX2_HASH, sDTH<_VAL>, 0> {};
/* REG[2].EX = (_TYPE)_VAL */
template<typename WzPTR _PTR>
struct sIL_MOV_EAX2_PTR : sIL_MOV_VAL<WzPTR, IWzASM::MOV_EAX2_PTR, sDTP<_PTR>, 0> {};
//
/* REG[3].EX = (_TYPE)_VAL */
template<typename BYTE _VAL>
struct sIL_MOV_EAX3_B1 : sIL_MOV_VAL<BYTE, IWzASM::MOV_EAX3_B1, sDT1<_VAL>, 0> {};
/* REG[3].EX = (_TYPE)_VAL */
template<typename WORD _VAL>
struct sIL_MOV_EAX3_B2 : sIL_MOV_VAL<WORD, IWzASM::MOV_EAX3_B2, sDT2<_VAL>, 0> {};
/* REG[3].EX = (_TYPE)_VAL */
template<typename DWORD _VAL>
struct sIL_MOV_EAX3_B4 : sIL_MOV_VAL<DWORD, IWzASM::MOV_EAX3_B4, sDT4<_VAL>, 0> {};
/* REG[3].EX = (_TYPE)_VAL */
template<typename WzASMH _VAL>
struct sIL_MOV_EAX3_HASH : sIL_MOV_VAL<WzASMH, IWzASM::MOV_EAX3_HASH, sDTH<_VAL>, 0> {};
/* REG[3].EX = (_TYPE)_VAL */
template<typename WzPTR _PTR>
struct sIL_MOV_EAX3_PTR : sIL_MOV_VAL<WzPTR, IWzASM::MOV_EAX3_PTR, sDTP<_PTR>, 0> {};
//¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬
// <MOV><SPECIAL><EXA>
template< typename _TYPE, OPW_T _CMD,
typename _DECLTYPE1, typename _DECLTYPE2, typename _DECLTYPE3, typename _DECLTYPE4,
typename BYTE _SZ
>
struct sIL_MOV_EAX_ARR4_VAL
{
sIL<_CMD> M01;
_DECLTYPE1 M02_ARG0;
_DECLTYPE2 M03_ARG1;
_DECLTYPE3 M04_ARG2;
_DECLTYPE4 M05_ARG3;
};
template< typename _TYPE, OPW_T _CMD,
typename _DECLTYPE1, typename _DECLTYPE2, typename _DECLTYPE3,
typename BYTE _SZ
>
struct sIL_MOV_EAX_ARR3_VAL
{
sIL<_CMD> M01;
_DECLTYPE1 M02_ARG0;
_DECLTYPE2 M03_ARG1;
_DECLTYPE3 M04_ARG2;
};
template< typename _TYPE, OPW_T _CMD,
typename _DECLTYPE1, typename _DECLTYPE2,
typename BYTE _SZ
>
struct sIL_MOV_EAX_ARR2_VAL
{
sIL<_CMD> M01;
_DECLTYPE1 M02_ARG0;
_DECLTYPE2 M03_ARG1;
};
template<typename BYTE _B1, BYTE _B2, BYTE _VAL3, BYTE _B4>
struct sIL_MOV_EAX_EXA4B1 : sIL_MOV_EAX_ARR4_VAL<BYTE, IWzASM::MOV_EAX_EXA4B1, sDT1<_B1>, sDT1<_B2>, sDT1<_VAL3>, sDT1<_B4>, 0> {};
template<typename WORD _B1, WORD _B2, WORD _VAL3, WORD _B4>
struct sIL_MOV_EAX_EXA4B2 : sIL_MOV_EAX_ARR4_VAL<WORD, IWzASM::MOV_EAX_EXA4B2, sDT2<_B1>, sDT2<_B2>, sDT2<_VAL3>, sDT2<_B4>, 0> {};
template<typename DWORD _B1, DWORD _B2, DWORD _VAL3, DWORD _B4>
struct sIL_MOV_EAX_EXA4B4 : sIL_MOV_EAX_ARR4_VAL<DWORD, IWzASM::MOV_EAX_EXA4B4, sDT4<_B1>, sDT4<_B2>, sDT4<_VAL3>, sDT4<_B4>, 0> {};
template<typename WzASMH _B1, WzASMH _B2, WzASMH _VAL3, WzASMH _B4>
struct sIL_MOV_EAX_EXA4HS : sIL_MOV_EAX_ARR4_VAL<WzASMH, IWzASM::MOV_EAX_EXA4HS, sDTH<_B1>, sDTH<_B2>, sDTH<_VAL3>, sDTH<_B4>, 0> {};
//////////////////////////////////////////////////////////////////////////
template<typename BYTE _B1, BYTE _B2, BYTE _VAL3>
struct sIL_MOV_EAX_EXA3B1 : sIL_MOV_EAX_ARR3_VAL<BYTE, IWzASM::MOV_EAX_EXA3B1, sDT1<_B1>, sDT1<_B2>, sDT1<_VAL3>, 0> {};
template<typename WORD _B1, WORD _B2, WORD _VAL3>
struct sIL_MOV_EAX_EXA3B2 : sIL_MOV_EAX_ARR3_VAL<WORD, IWzASM::MOV_EAX_EXA3B2, sDT2<_B1>, sDT2<_B2>, sDT2<_VAL3>, 0> {};
template<typename DWORD _B1, DWORD _B2, DWORD _VAL3>
struct sIL_MOV_EAX_EXA3B4 : sIL_MOV_EAX_ARR3_VAL<DWORD, IWzASM::MOV_EAX_EXA3B4, sDT4<_B1>, sDT4<_B2>, sDT4<_VAL3>, 0> {};
template<typename WzASMH _B1, WzASMH _B2, WzASMH _VAL3>
struct sIL_MOV_EAX_EXA3HS : sIL_MOV_EAX_ARR3_VAL<WzASMH, IWzASM::MOV_EAX_EXA3HS, sDTH<_B1>, sDTH<_B2>, sDTH<_VAL3>, 0> {};
//////////////////////////////////////////////////////////////////////////
template<typename BYTE _B1, BYTE _B2>
struct sIL_MOV_EAX_EXA2B1 : sIL_MOV_EAX_ARR2_VAL<BYTE, IWzASM::MOV_EAX_EXA2B1, sDT1<_B1>, sDT1<_B2>, 0> {};
template<typename WORD _B1, WORD _B2>
struct sIL_MOV_EAX_EXA2B2 : sIL_MOV_EAX_ARR2_VAL<WORD, IWzASM::MOV_EAX_EXA2B2, sDT2<_B1>, sDT2<_B2>, 0> {};
template<typename DWORD _B1, DWORD _B2>
struct sIL_MOV_EAX_EXA2B4 : sIL_MOV_EAX_ARR2_VAL<DWORD, IWzASM::MOV_EAX_EXA2B4, sDT4<_B1>, sDT4<_B2>, 0> {};
template<typename WzASMH _B1, WzASMH _B2>
struct sIL_MOV_EAX_EXA2HS : sIL_MOV_EAX_ARR2_VAL<WzASMH, IWzASM::MOV_EAX_EXA2HS, sDTH<_B1>, sDTH<_B2>, 0> {};
//¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬
// MOV & PUSH
// (1) E(A/D)X = E(A/D)X
// PUSH E(A/D)X
// (2) E(A/B)X = VAL_xx
// PUSH E(A/B)X
template<typename _MOVCMD, typename OPW_T _PUSHCMD>
struct sIL_MOVnPUSH
{
_MOVCMD M01;
sIL<_PUSHCMD> M02;
};
// (2) E(A/B)X = VAL_xx
// PUSH E(A/B)X
template<typename _TYPE, OPW_T _CMD, typename _DECLTYPE, typename OPW_T _PUSHCMD>
struct sIL_MOVnPUSH_REG_VAL : sIL_MOVnPUSH<sIL_MOV_VAL<_TYPE, _CMD, _DECLTYPE, 0>, _PUSHCMD> {};
//////////////////////////////////////////////////////////////////////////
template<typename BYTE _VAL>
struct sIL_MOVnPUSH_EAX_B1 : sIL_MOVnPUSH_REG_VAL<BYTE, IWzASM::MOV_EAX_B1, sDT1<_VAL>, IWzASM::PUSH_EAX> {};
template<typename WORD _VAL>
struct sIL_MOVnPUSH_EAX_B2 : sIL_MOVnPUSH_REG_VAL<WORD, IWzASM::MOV_EAX_B2, sDT2<_VAL>, IWzASM::PUSH_EAX> {};
template<typename DWORD _VAL>
struct sIL_MOVnPUSH_EAX_B4 : sIL_MOVnPUSH_REG_VAL<DWORD, IWzASM::MOV_EAX_B4, sDT4<_VAL>, IWzASM::PUSH_EAX> {};
template<typename WzASMH _HASH>
struct sIL_MOVnPUSH_EAX_HASH : sIL_MOVnPUSH_REG_VAL<WzASMH, IWzASM::MOV_EAX_HASH, sDTH<_HASH>, IWzASM::PUSH_EAX> {};
template<typename WzPTR _PTR>
struct sIL_MOVnPUSH_EAX_PTR : sIL_MOVnPUSH_REG_VAL<WzPTR, IWzASM::MOV_EAX_PTR, sDTP<_PTR>, IWzASM::PUSH_EAX> {};
//
template<typename BYTE _VAL>
struct sIL_MOVnPUSH_EBX_B1 : sIL_MOVnPUSH_REG_VAL<BYTE, IWzASM::MOV_EBX_B1, sDT1<_VAL>, IWzASM::PUSH_EBX> {};
template<typename WORD _VAL>
struct sIL_MOVnPUSH_EBX_B2 : sIL_MOVnPUSH_REG_VAL<WORD, IWzASM::MOV_EBX_B2, sDT2<_VAL>, IWzASM::PUSH_EBX> {};
template<typename DWORD _VAL>
struct sIL_MOVnPUSH_EBX_B4 : sIL_MOVnPUSH_REG_VAL<DWORD, IWzASM::MOV_EBX_B4, sDT4<_VAL>, IWzASM::PUSH_EBX> {};
template<typename WzASMH _HASH>
struct sIL_MOVnPUSH_EBX_HASH : sIL_MOVnPUSH_REG_VAL<WzASMH, IWzASM::MOV_EBX_HASH, sDTH<_HASH>, IWzASM::PUSH_EBX> {};
template<typename WzPTR _PTR>
struct sIL_MOVnPUSH_EBX_PTR : sIL_MOVnPUSH_REG_VAL<WzPTR, IWzASM::MOV_EBX_PTR, sDTP<_PTR>, IWzASM::PUSH_EBX> {};
//////////////////////////////////////////////////////////////////////////
struct sIL_MOVnPUSH_EAX_EBX : sIL_MOVnPUSH<sIL_MOV_EAX_EBX, IWzASM::PUSH_EAX> {};
struct sIL_MOVnPUSH_EAX_ECX : sIL_MOVnPUSH<sIL_MOV_EAX_ECX, IWzASM::PUSH_EAX> {};
struct sIL_MOVnPUSH_EAX_EDX : sIL_MOVnPUSH<sIL_MOV_EAX_EDX, IWzASM::PUSH_EAX> {};
struct sIL_MOVnPUSH_EAX_ERP : sIL_MOVnPUSH<sIL_MOV_EAX_ERP, IWzASM::PUSH_EAX> {};
struct sIL_MOVnPUSH_EBX_EAX : sIL_MOVnPUSH<sIL_MOV_EBX_EAX, IWzASM::PUSH_EBX> {};
struct sIL_MOVnPUSH_EBX_ECX : sIL_MOVnPUSH<sIL_MOV_EBX_ECX, IWzASM::PUSH_EBX> {};
struct sIL_MOVnPUSH_EBX_EDX : sIL_MOVnPUSH<sIL_MOV_EBX_EDX, IWzASM::PUSH_EBX> {};
struct sIL_MOVnPUSH_EBX_ERP : sIL_MOVnPUSH<sIL_MOV_EBX_ERP, IWzASM::PUSH_EBX> {};
struct sIL_MOVnPUSH_ECX_EAX : sIL_MOVnPUSH<sIL_MOV_ECX_EAX, IWzASM::PUSH_ECX> {};
struct sIL_MOVnPUSH_ECX_EBX : sIL_MOVnPUSH<sIL_MOV_ECX_EBX, IWzASM::PUSH_ECX> {};
struct sIL_MOVnPUSH_ECX_EDX : sIL_MOVnPUSH<sIL_MOV_ECX_EDX, IWzASM::PUSH_ECX> {};
struct sIL_MOVnPUSH_ECX_ERP : sIL_MOVnPUSH<sIL_MOV_ECX_ERP, IWzASM::PUSH_ECX> {};
struct sIL_MOVnPUSH_EDX_EAX : sIL_MOVnPUSH<sIL_MOV_EDX_EAX, IWzASM::PUSH_EDX> {};
struct sIL_MOVnPUSH_EDX_EBX : sIL_MOVnPUSH<sIL_MOV_EDX_EBX, IWzASM::PUSH_EDX> {};
struct sIL_MOVnPUSH_EDX_ECX : sIL_MOVnPUSH<sIL_MOV_EDX_ECX, IWzASM::PUSH_EDX> {};
struct sIL_MOVnPUSH_EDX_ERP : sIL_MOVnPUSH<sIL_MOV_EDX_ERP, IWzASM::PUSH_EDX> {};
struct sIL_MOVnPUSH_ERP_EAX : sIL_MOVnPUSH<sIL_MOV_ERP_EAX, IWzASM::PUSH_ERP> {};
struct sIL_MOVnPUSH_ERP_EBX : sIL_MOVnPUSH<sIL_MOV_ERP_EBX, IWzASM::PUSH_ERP> {};
struct sIL_MOVnPUSH_ERP_ECX : sIL_MOVnPUSH<sIL_MOV_ERP_ECX, IWzASM::PUSH_ERP> {};
struct sIL_MOVnPUSH_ERP_EDX : sIL_MOVnPUSH<sIL_MOV_ERP_EDX, IWzASM::PUSH_ERP> {};
//¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬
// STORE
// ·¹Áö½ºÅ͸¦ »ç¿ëÇÏÁö ¾Ê°í Á÷Á¢ ÀÔ·Â
// PUSH VAL_xx
template<typename _TYPE, typename _DECLTYPE, typename OPW_T _PUSHCMD>
struct sIL_PUSH_VAL
{
sIL<_PUSHCMD> M01;
_DECLTYPE M02;
inline VOID Change( _TYPE vVAL ) { M01.Change( vVAL ); }
};
template<typename BYTE _VAL>
struct sIL_PUSH_B1 : sIL_PUSH_VAL<BYTE, sDT1<_VAL>, IWzASM::PUSH_B1> {};
template<typename WORD _VAL>
struct sIL_PUSH_B2 : sIL_PUSH_VAL<WORD, sDT2<_VAL>, IWzASM::PUSH_B2> {};
template<typename DWORD _VAL>
struct sIL_PUSH_B4 : sIL_PUSH_VAL<DWORD, sDT4<_VAL>, IWzASM::PUSH_B4> {};
template<typename WzASMH _HASH>
struct sIL_PUSH_HASH : sIL_PUSH_VAL<WzASMH, sDTH<_HASH>, IWzASM::PUSH_HASH> {};
////¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬
//// EBX = VAL_xx
//// EAX += EBX
//template<typename _TYPE, OPW_T _CMD, typename _DECLTYPE, typename BYTE _SZ>
//struct sIL_ADD32_EAX_VAL
//{
// sIL<_CMD> M01;
// _DECLTYPE M02;
// sIL<IWzASM::ADD_EAX_EBX> M03;
//
// inline VOID Change( _TYPE vVAL )
// { M02.Change( vVAL ); }
//};
//
//template<typename BYTE _VAL>
//struct sIL_ADD32_EAX_B1 : sIL_ADD32_EAX_VAL<BYTE, IWzASM::MOV_EBX_B1, sDT1<_VAL>, 0> {};
//
//template<typename WORD _VAL>
//struct sIL_ADD32_EAX_B2 : sIL_ADD32_EAX_VAL<WORD, IWzASM::MOV_EBX_B2, sDT2<_VAL>, 0> {};
//
//template<typename DWORD _VAL>
//struct sIL_ADD32_EAX_B4 : sIL_ADD32_EAX_VAL<DWORD, IWzASM::MOV_EBX_B4, sDT4<_VAL>, 0> {};
//¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬
// <±âº»> EAX´Â ¸ÞÀÎ ¿¬»ê °ø°£ (µ¡¼ÀÀº ¼ø¼­¿¡ »ó°ü¾øÀ½)
// <USED REG> EAX, EBX
// EAX : ¿¬»êµÈ Àå¼Ò
// <ARG>
// _LDEBX : EBX¿¡ ·ÎµåÇÏ´Â ÇüÅ CMD BLOCK
// <COMMENT>
// EAX += EBX
template<typename _LDEBX, typename BYTE _TMP>
struct sIL_OP_EAX_PLUS_XXX
{
_LDEBX M01;
sIL<IWzASM::ADD_EAX_EBX> M02;
};
//¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬
// <±âº»> EAX´Â ¸ÞÀÎ ¿¬»ê °ø°£ (µ¡¼ÀÀº ¼ø¼­¿¡ »ó°ü¾øÀ½)
// <USED REG> EAX, EBX
// EAX : ¿¬»êµÈ Àå¼Ò
// <ARG>
// _LDEBX : EAX¿¡ ·ÎµåÇÏ´Â ÇüÅ CMD BLOCK
// <COMMENT>
// EBX += EAX
template<typename _LDEAX, typename BYTE _TMP>
struct sIL_OP_EBX_PLUS_XXX
{
_LDEAX M01;
sIL<IWzASM::ADD_EBX_EAX> M02;
};
//¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬
// <EXPRESSION>
// EAX = EAX + VAL_xx
// 1) EBX = VAL_xx (M01.M02)
// 2) EAX += EBX
template<typename BYTE _VAL> struct sIL_OP_EAX_PLUS_B1 : sIL_OP_EAX_PLUS_XXX<sIL_MOV_EBX_B1<_VAL>, 0> {};
//¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬
// <EXPRESSION>
// EAX = EAX + VAL_xx
// 1) EBX = VAL_xx (M01.M02)
// 2) EAX += EBX
template<typename WORD _VAL> struct sIL_OP_EAX_PLUS_B2 : sIL_OP_EAX_PLUS_XXX<sIL_MOV_EBX_B2<_VAL>, 0> {};
//¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬
// <EXPRESSION>
// EAX = EAX + VAL_xx
// 1) EBX = VAL_xx (M01.M02)
// 2) EAX += EBX
template<typename DWORD _VAL> struct sIL_OP_EAX_PLUS_B4 : sIL_OP_EAX_PLUS_XXX<sIL_MOV_EBX_B4<_VAL>, 0> {};
//¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬
// <EXPRESSION>
// EAX = EAX + VAL_xx
// 1) EBX = VAL_xx (M01.M02)
// 2) EAX += EBX
template<typename BYTE _VAL> struct sIL_OP_EBX_PLUS_B1 : sIL_OP_EBX_PLUS_XXX<sIL_MOV_EAX_B1<_VAL>, 0> {};
//¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬
// <EXPRESSION>
// EAX = EAX + VAL_xx
// 1) EBX = VAL_xx (M01.M02)
// 2) EAX += EBX
template<typename WORD _VAL> struct sIL_OP_EBX_PLUS_B2 : sIL_OP_EBX_PLUS_XXX<sIL_MOV_EAX_B2<_VAL>, 0> {};
//¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬
// <EXPRESSION>
// EAX = EAX + VAL_xx
// 1) EBX = VAL_xx (M01.M02)
// 2) EAX += EBX
template<typename DWORD _VAL>
struct sIL_OP_EBX_PLUS_B4 : sIL_OP_EBX_PLUS_XXX<sIL_MOV_EAX_B4<_VAL>, 0> {};
//¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬
// EAX += ExX
typedef sIL_OP_EAX_PLUS_XXX<sIL_MOV_EBX_ECX, 0> sIL_OP_EAX_PLUS_ECX;
//¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬
// EAX += ExX
typedef sIL_OP_EAX_PLUS_XXX<sIL_MOV_EBX_EDX, 0> sIL_OP_EAX_PLUS_EDX;
//¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬
// EAX += ExX
typedef sIL_OP_EAX_PLUS_XXX<sIL_MOV_EBX_ERP, 0> sIL_OP_EAX_PLUS_ERP;
//¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬
// EBX += ExX
typedef sIL_OP_EBX_PLUS_XXX<sIL_MOV_EAX_ECX, 0> sIL_OP_EBX_PLUS_ECX;
//¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬
// EBX += ExX
typedef sIL_OP_EBX_PLUS_XXX<sIL_MOV_EAX_EDX, 0> sIL_OP_EBX_PLUS_EDX;
//¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬
// EBX += ExX
typedef sIL_OP_EBX_PLUS_XXX<sIL_MOV_EAX_ERP, 0> sIL_OP_EBX_PLUS_ERP;
//¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬
// <±âº»> EAX´Â ¸ÞÀÎ ¿¬»ê °ø°£ (¼ø¼­ »ó°ü ÀÖÀ½)
// <USED REG> EAX, EBX
// EAX : ¿¬»êµÈ Àå¼Ò
// <ARG>
// _LDEBX : EBX¿¡ ·ÎµåÇÏ´Â ÇüÅ CMD BLOCK
// <COMMENT>
// EAX -= EBX
// <EXPRESSION>
// EAX = EAX - VAL_xx
// 1) EBX = VAL_xx
// 2) EAX -= EBX
template<typename _LDEBX, typename BYTE _TMP>
struct sIL_OP_EAX_MINUS_XXX
{
_LDEBX M01;
sIL<IWzASM::SUB_EAX_EBX> M02;
};
//¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬
// <±âº»> EAX´Â ¸ÞÀÎ ¿¬»ê °ø°£ (¼ø¼­ »ó°ü ÀÖÀ½)
// <USED REG> EAX, EBX
// EAX : ¿¬»êµÈ Àå¼Ò
// <ARG>
// _LDEAX : EBX¿¡ ·ÎµåÇÏ´Â ÇüÅ CMD BLOCK
// <COMMENT>
// EBX -= EAX
// <EXPRESSION>
// EBX = EBX - VAL_xx
// 1) EAX = VAL_xx
// 2) EBX -= EAX
template<typename _LDEAX, typename BYTE _TMP>
struct sIL_OP_EBX_MINUS_XXX
{
_LDEAX M01;
sIL<IWzASM::SUB_EBX_EAX> M02;
};
// <EXPRESSION>
// EAX = EAX - VAL_xx
// 1) EBX = VAL_xx
// 2) EAX -= EBX
template<typename BYTE _VAL> struct sIL_OP_EAX_MINUS_B1 : sIL_OP_EAX_MINUS_XXX<sIL_MOV_EBX_B1<_VAL>, 0> {};
template<typename WORD _VAL> struct sIL_OP_EAX_MINUS_B2 : sIL_OP_EAX_MINUS_XXX<sIL_MOV_EBX_B2<_VAL>, 0> {};
template<typename DWORD _VAL> struct sIL_OP_EAX_MINUS_B4 : sIL_OP_EAX_MINUS_XXX<sIL_MOV_EBX_B4<_VAL>, 0> {};
// <EXPRESSION>
// EBX = EBX - VAL_xx
// 1) EAX = VAL_xx
// 2) EBX -= EAX
template<typename BYTE _VAL> struct sIL_OP_EBX_MINUS_B1 : sIL_OP_EBX_MINUS_XXX<sIL_MOV_EAX_B1<_VAL>, 0> {};
template<typename WORD _VAL> struct sIL_OP_EBX_MINUS_B2 : sIL_OP_EBX_MINUS_XXX<sIL_MOV_EAX_B2<_VAL>, 0> {};
template<typename DWORD _VAL> struct sIL_OP_EBX_MINUS_B4 : sIL_OP_EBX_MINUS_XXX<sIL_MOV_EAX_B4<_VAL>, 0> {};
// EAX -= ExX
typedef sIL_OP_EAX_MINUS_XXX<sIL_MOV_EBX_ECX, 0> sIL_OP_EAX_MINUS_ECX;
typedef sIL_OP_EAX_MINUS_XXX<sIL_MOV_EBX_EDX, 0> sIL_OP_EAX_MINUS_EDX;
typedef sIL_OP_EAX_MINUS_XXX<sIL_MOV_EBX_ERP, 0> sIL_OP_EAX_MINUS_ERP;
// EBX -= ExX
typedef sIL_OP_EBX_MINUS_XXX<sIL_MOV_EAX_ECX, 0> sIL_OP_EBX_MINUS_ECX;
typedef sIL_OP_EBX_MINUS_XXX<sIL_MOV_EAX_EDX, 0> sIL_OP_EBX_MINUS_EDX;
typedef sIL_OP_EBX_MINUS_XXX<sIL_MOV_EAX_ERP, 0> sIL_OP_EBX_MINUS_ERP;
//¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬
// <±âº»> EAX´Â ¸ÞÀÎ ¿¬»ê °ø°£ (¼ø¼­ »ó°ü ¾øÀ½)
// <USED REG> EAX, EBX
// EAX : ¿¬»êµÈ Àå¼Ò
// <ARG>
// _LDEBX : EBX¿¡ ·ÎµåÇÏ´Â ÇüÅ CMD BLOCK
// <COMMENT>
// EAX *= EBX, -or- EBX *= EAX
// <EXPRESSION>
// EAX = EAX * VAL_xx
// 1) EBX = VAL_xx
// 2) EAX *= VAL_xx
template<typename _LDEBX, typename BYTE _TMP>
struct sIL_OP_EAX_MUL_XXX
{
_LDEBX M01;
sIL<IWzASM::MUL_EAX_EBX> M02;
};
//template<typename _LDEBX, typename BYTE _TMP>
//struct sIL_OP_EBX_MUL_XXX
//{
// _LDEBX M01;
// sIL<IWzASM::MUL_EBX_EAX> M02;
//};
// <EXPRESSION>
// 1) EBX = VAL_xx
// 2) EAX *= EBX
template<typename BYTE _VAL> struct sIL_OP_EAX_MUL_B1 : sIL_OP_EAX_MUL_XXX<sIL_MOV_EBX_B1<_VAL>, 0> {};
template<typename WORD _VAL> struct sIL_OP_EAX_MUL_B2 : sIL_OP_EAX_MUL_XXX<sIL_MOV_EBX_B2<_VAL>, 0> {};
template<typename DWORD _VAL> struct sIL_OP_EAX_MUL_B4 : sIL_OP_EAX_MUL_XXX<sIL_MOV_EBX_B4<_VAL>, 0> {};
//// <EXPRESSION>
//// 1) EAX = VAL_xx
//// 2) EBX *= EAX
//template<typename BYTE _VAL> struct sIL_OP_EBX_MUL_B1 : sIL_OP_EBX_MUL_XXX<sIL_MOV_EAX_B1<_VAL>, 0> {};
//template<typename WORD _VAL> struct sIL_OP_EBX_MUL_B2 : sIL_OP_EBX_MUL_XXX<sIL_MOV_EAX_B2<_VAL>, 0> {};
//template<typename DWORD _VAL> struct sIL_OP_EBX_MUL_B4 : sIL_OP_EBX_MUL_XXX<sIL_MOV_EAX_B4<_VAL>, 0> {};
// EAX *= ExX
typedef sIL_OP_EAX_MUL_XXX<sIL_MOV_EBX_ECX, 0> sIL_OP_EAX_MUL_ECX;
typedef sIL_OP_EAX_MUL_XXX<sIL_MOV_EBX_EDX, 0> sIL_OP_EAX_MUL_EDX;
typedef sIL_OP_EAX_MUL_XXX<sIL_MOV_EBX_ERP, 0> sIL_OP_EAX_MUL_ERP;
//// EBX *= ExX
//typedef sIL_OP_EBX_MUL_XXX<sIL_MOV_EAX_ECX, 0> sIL_OP_EBX_MUL_ECX;
//typedef sIL_OP_EBX_MUL_XXX<sIL_MOV_EAX_EDX, 0> sIL_OP_EBX_MUL_EDX;
//typedef sIL_OP_EBX_MUL_XXX<sIL_MOV_EAX_ERP, 0> sIL_OP_EBX_MUL_ERP;
//¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬
// <±âº»> EAX´Â ¸ÞÀÎ ¿¬»ê °ø°£ (¼ø¼­ »ó°ü ¾øÀ½)
// <USED REG> EAX, EBX
// EAX : ¿¬»êµÈ Àå¼Ò
// <ARG>
// _LDEBX : EBX¿¡ ·ÎµåÇÏ´Â ÇüÅ CMD BLOCK
// <COMMENT>
// EAX /= EBX, -or- EBX /= EAX
// <EXPRESSION>
// EAX = EAX / VAL_xx
// 1) EBX = VAL_xx
// 2) EAX /= VAL_xx
template<typename _LDEBX, typename BYTE _TMP>
struct sIL_OP_EAX_DIV_XXX
{
_LDEBX M01;
sIL<IWzASM::DIV_EAX_EBX> M02;
};
//template<typename _LDEBX, typename BYTE _TMP>
//struct sIL_OP_EBX_DIV_XXX
//{
// _LDEBX M01;
// sIL<IWzASM::DIV_EBX_EAX> M02;
//};
// <EXPRESSION>
// 1) EBX = VAL_xx
// 2) EAX /= EBX
template<typename BYTE _VAL> struct sIL_OP_EAX_DIV_B1 : sIL_OP_EAX_DIV_XXX<sIL_MOV_EBX_B1<_VAL>, 0> {};
template<typename WORD _VAL> struct sIL_OP_EAX_DIV_B2 : sIL_OP_EAX_DIV_XXX<sIL_MOV_EBX_B2<_VAL>, 0> {};
template<typename DWORD _VAL> struct sIL_OP_EAX_DIV_B4 : sIL_OP_EAX_DIV_XXX<sIL_MOV_EBX_B4<_VAL>, 0> {};
//// <EXPRESSION>
//// 1) EAX = VAL_xx
//// 2) EBX /= EAX
//template<typename BYTE _VAL> struct sIL_OP_EBX_DIV_B1 : sIL_OP_EBX_DIV_XXX<sIL_MOV_EAX_B1<_VAL>, 0> {};
//template<typename WORD _VAL> struct sIL_OP_EBX_DIV_B2 : sIL_OP_EBX_DIV_XXX<sIL_MOV_EAX_B2<_VAL>, 0> {};
//template<typename DWORD _VAL> struct sIL_OP_EBX_DIV_B4 : sIL_OP_EBX_DIV_XXX<sIL_MOV_EAX_B4<_VAL>, 0> {};
// EAX /= ExX
typedef sIL_OP_EAX_DIV_XXX<sIL_MOV_EBX_ECX, 0> sIL_OP_EAX_DIV_ECX;
typedef sIL_OP_EAX_DIV_XXX<sIL_MOV_EBX_EDX, 0> sIL_OP_EAX_DIV_EDX;
typedef sIL_OP_EAX_DIV_XXX<sIL_MOV_EBX_ERP, 0> sIL_OP_EAX_DIV_ERP;
//// EBX /= ExX
//typedef sIL_OP_EBX_DIV_XXX<sIL_MOV_EAX_ECX, 0> sIL_OP_EBX_DIV_ECX;
//typedef sIL_OP_EBX_DIV_XXX<sIL_MOV_EAX_EDX, 0> sIL_OP_EBX_DIV_EDX;
//typedef sIL_OP_EBX_DIV_XXX<sIL_MOV_EAX_ERP, 0> sIL_OP_EBX_DIV_ERP;
//¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬
// <񃧯>
// ++EAX, ++EBX
typedef sIL<IWzASM::INC_EAX> sIL_INC_EAX;
typedef sIL<IWzASM::INC_EBX> sIL_INC_EBX;
//¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬
// <񃧯>
// --EAX, --EBX
typedef sIL<IWzASM::DEC_EAX> sIL_DEC_EAX;
typedef sIL<IWzASM::DEC_EBX> sIL_DEC_EBX;
//¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬
// <񃧯>
// (TEST_ExX != 0), EFL:TEST_RET = { != 0, == 0 }
// (ExX compare ExX), EFL:TEST_RET = { <, >, ==, !(<), !(>) }
//¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬
// <񃧯>
// (ExX != 0), (TRUE) EFL:TEST_RET = { <, >, == }
template<typename OPW_T _CMD>
struct sIL_CMP
{
sIL<_CMD> M01;
};
typedef sIL_CMP<IWzASM::TEST_EAX> sIL_TEST_EAX;
typedef sIL_CMP<IWzASM::TEST_EBX> sIL_TEST_EBX;
typedef sIL_CMP<IWzASM::TEST_ECX> sIL_TEST_ECX;
typedef sIL_CMP<IWzASM::TEST_EDX> sIL_TEST_EDX;
typedef sIL_CMP<IWzASM::TEST_ERP> sIL_TEST_ERP;
typedef sIL_CMP<IWzASM::TEST_EOP> sIL_TEST_EOP;
typedef sIL_CMP<IWzASM::CMP_EAX_EBX> sIL_CMP_EAX_EBX;
typedef sIL_CMP<IWzASM::CMP_EAX_ECX> sIL_CMP_EAX_ECX;
typedef sIL_CMP<IWzASM::CMP_EAX_EDX> sIL_CMP_EAX_EDX;
typedef sIL_CMP<IWzASM::CMP_EAX_ERP> sIL_CMP_EAX_ERP;
typedef sIL_CMP<IWzASM::CMP_ECX_EAX> sIL_CMP_ECX_EBX;
typedef sIL_CMP<IWzASM::CMP_ECX_EBX> sIL_CMP_ECX_ECX;
typedef sIL_CMP<IWzASM::CMP_ECX_EDX> sIL_CMP_ECX_EDX;
typedef sIL_CMP<IWzASM::CMP_ECX_ERP> sIL_CMP_ECX_ERP;
//¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬
// <񃧯>
// (EFL:TEST_RET (cond.) (val) )
// switch( EFL ) { >, <, >= <=, ==, !=, == 0, != 0 }
template<typename OPW_T _CMD, OPB_T _JMARK>
struct sIL_COND_JUMP
{
sIL<_CMD> M01;
sDTM<_JMARK> M02;
inline VOID ChangeCMD( OPW_T wCMD )
{ M01.Change( wCMD ); }
inline VOID ChangeMARK( OPB_T jMARK )
{ M02.Change( jMARK ); }
};
template<typename OPB_T _JMARK>
struct sIL_COND_ZERO_EQUAL : sIL_COND_JUMP<IWzASM::JZEROEQUAL, _JMARK> {};
template<typename OPB_T _JMARK>
struct sIL_COND_ZERO_NOT_EQUAL : sIL_COND_JUMP<IWzASM::JZERONOTEQUAL, _JMARK> {};
template<typename OPB_T _JMARK>
struct sIL_COND_EQUAL : sIL_COND_JUMP<IWzASM::JEQUAL, _JMARK> {};
template<typename OPB_T _JMARK>
struct sIL_COND_NOT_EQUAL : sIL_COND_JUMP<IWzASM::JNOTEQUAL, _JMARK> {};
template<typename OPB_T _JMARK>
struct sIL_COND_BELOW : sIL_COND_JUMP<IWzASM::JBELOW, _JMARK> {};
template<typename OPB_T _JMARK>
struct sIL_COND_NOT_BELOW : sIL_COND_JUMP<IWzASM::JNOTBELOW, _JMARK> {};
template<typename OPB_T _JMARK>
struct sIL_COND_ABOVE : sIL_COND_JUMP<IWzASM::JABOVE, _JMARK> {};
template<typename OPB_T _JMARK>
struct sIL_COND_NOT_ABOVE : sIL_COND_JUMP<IWzASM::JNOTABOVE, _JMARK> {};
//¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬
// <ºñ±³¹®>
// <, >, ==, !=, == 0, != 0
template<typename _EXPRCOND, typename OPW_T _CMPCMD, typename OPB_T _JMPMARK>
struct sIL_IF_THEN_ELSE
{
_EXPRCOND M01;
sIL_COND_JUMP<_CMPCMD, _JMPMARK> M02;
};
template<typename _EXPRCOND, typename OPB_T _JMPMARK>
struct sIL_IF_THEN_ELSE_IS_ZERO : sIL_IF_THEN_ELSE<_EXPRCOND, IWzASM::JZEROEQUAL, _JMPMARK> {};
template<typename _EXPRCOND, typename OPB_T _JMPMARK>
struct sIL_IF_THEN_ELSE_IS_NOT_ZERO : sIL_IF_THEN_ELSE<_EXPRCOND, IWzASM::JZERONOTEQUAL, _JMPMARK> {};
template<typename _EXPRCOND, typename OPB_T _JMPMARK>
struct sIL_IF_THEN_ELSE_IS_EQUAL : sIL_IF_THEN_ELSE<_EXPRCOND, IWzASM::JEQUAL, _JMPMARK> {};
template<typename _EXPRCOND, typename OPB_T _JMPMARK>
struct sIL_IF_THEN_ELSE_IS_NOT_EQUAL : sIL_IF_THEN_ELSE<_EXPRCOND, IWzASM::JNOTEQUAL, _JMPMARK> {};
template<typename _EXPRCOND, typename OPB_T _JMPMARK>
struct sIL_IF_THEN_ELSE_IS_BELOW : sIL_IF_THEN_ELSE<_EXPRCOND, IWzASM::JBELOW, _JMPMARK> {};
template<typename _EXPRCOND, typename OPB_T _JMPMARK>
struct sIL_IF_THEN_ELSE_IS_NOT_BELOW : sIL_IF_THEN_ELSE<_EXPRCOND, IWzASM::JNOTBELOW, _JMPMARK> {};
template<typename _EXPRCOND, typename OPB_T _JMPMARK>
struct sIL_IF_THEN_ELSE_IS_ABOVE : sIL_IF_THEN_ELSE<_EXPRCOND, IWzASM::JABOVE, _JMPMARK> {};
template<typename _EXPRCOND, typename OPB_T _JMPMARK>
struct sIL_IF_THEN_ELSE_IS_NOT_ABOVE : sIL_IF_THEN_ELSE<_EXPRCOND, IWzASM::JNOTABOVE, _JMPMARK> {};
//¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬
// <±âº»> ¹«Á¶°Ç ºÐ±â
// goto MARK(x)
template<typename OPB_T _JMARK>
struct sIL_JUMP
{
sIL<IWzASM::JUMP> M01;
sDT1<_JMARK> M02;
};
//
template<typename OPW_T _CMD>
struct sIL_JUMPn
{
sIL<_CMD> M01;
};
typedef sIL_JUMPn<IWzASM::JUMP1> sIL_JUMP1;
typedef sIL_JUMPn<IWzASM::JUMP2> sIL_JUMP2;
typedef sIL_JUMPn<IWzASM::JUMP3> sIL_JUMP3;
typedef sIL_JUMPn<IWzASM::JUMP4> sIL_JUMP4;
typedef sIL_JUMPn<IWzASM::JUMP5> sIL_JUMP5;
typedef sIL_JUMPn<IWzASM::JUMP6> sIL_JUMP6;
typedef sIL_JUMPn<IWzASM::JUMP7> sIL_JUMP7;
typedef sIL_JUMPn<IWzASM::JUMP8> sIL_JUMP8;
typedef sIL_JUMPn<IWzASM::JUMP9> sIL_JUMP9;
typedef sIL_JUMPn<IWzASM::JUMP10> sIL_JUMP10;
typedef sIL_JUMPn<IWzASM::JUMP11> sIL_JUMP11;
typedef sIL_JUMPn<IWzASM::JUMP12> sIL_JUMP12;
typedef sIL_JUMPn<IWzASM::JUMP13> sIL_JUMP13;
typedef sIL_JUMPn<IWzASM::JUMP14> sIL_JUMP14;
typedef sIL_JUMPn<IWzASM::JUMP15> sIL_JUMP15;
typedef sIL_JUMPn<IWzASM::JUMP16> sIL_JUMP16;
typedef sIL_JUMPn<IWzASM::JUMP17> sIL_JUMP17;
typedef sIL_JUMPn<IWzASM::JUMP18> sIL_JUMP18;
typedef sIL_JUMPn<IWzASM::JUMP19> sIL_JUMP19;
template<typename OPB_T _JMARK>
struct sIL_JUMP_COMPOSE : sIL_JUMPn<DECL_WzASM_HASH(_JMARK, OPT::NOP)> {};
//¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬
//¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬
// Á¶°Ç Ç¥Çö½Ä ¾øÀÌ EFL 0ÀÎÁö ¾Æ´ÑÁöÀÇ ¿©ºÎ ÆÇ´Ü
template<typename OPB_T _JMPMARK>
struct sIL_IFZERO_THEN_ELSE
{
sIL<IWzASM::JZEROEQUAL> M01;
sDTM<_JMPMARK> M02;
inline VOID Change( OPB_T mMARK )
{ M02.Change( mMARK ); }
};
template<typename OPB_T _JMPMARK>
struct sIL_IFNZERO_THEN_ELSE
{
sIL<IWzASM::JZERONOTEQUAL> M01;
sDTM<_JMPMARK> M02;
inline VOID Change( OPB_T mMARK )
{ M02.Change( mMARK ); }
};
//template<typename _EBXIL, typename _USRCODE, typename OPB_T _MARK4LOOP>
//struct sIL_FOR_LOOP
//{
// sIL_CLR_EAX M01;
// sIL_CLR_ECX M02;
// _EBXIL M03;
// sIL_JUMP11 M04;
// //sIL_MARK01 M05;
// sIL_MARKC<_MARK4LOOP> M05;
// sIL<IWzASM::ADD_ECX_EAX> M06;
// sIL<IWzASM::INC_EAX> M07;
// sIL<IWzASM::PUSH_EABCDX> M08;
// _USRCODE M09;
// sIL<IWzASM::POP_EABCDX> M10;
// sIL_MARK11 M11;
// sIL_IF_THEN_ELSE_IS_BELOW<sIL_CMP_EAX_EBX, _MARK4LOOP> M12;
//};
//¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬
// <FOR LOOP>
//
template<
typename _INIT, typename _EXPR, typename _ITR,
typename _LOGIC,
typename OPB_T _EXPRMARK, typename OPB_T _LOOPMARK
>
struct sIL_FORLOOP_RAW
{
_INIT M01;
sIL_JUMP_COMPOSE<_EXPRMARK> M02;
sIL_MARKC<_LOOPMARK> M03;
_ITR M04;
sIL<IWzASM::PUSH_EABCDX> M05;
_LOGIC M06;
sIL<IWzASM::POP_EABCDX> M07;
sIL_MARKC<_EXPRMARK> M08;
_EXPR M09;
};
// LOAD to EBX
template<typename _CMD, typename WORD _SZ>
struct sIL_FORLOOP_ZEROtoUPPER_COUNTING_LOOP_INIT_REG
{
sIL_CLR_EAX M01;
sIL_CLR_ERP M02;
_CMD M03;
};
struct sIL_FORLOOP_ZEROtoUPPER_COUNTING_LOOP_ITERATOR
{
sIL<IWzASM::INC_EAX> M02;
};
// <NOTE>
// EBX : UPPER LIMIT
// EAX : INCREASE COUNT
// ECX
// ÀÌ ·çƾÀ¸·Î ÁøÀԽà EDX °ø°£¸¸ÀÌ »ç¿ë °¡´ÉÇÏ´Ù. ÁÖÀÇÇÒ °Í.
template<typename _USRCODE, typename DWORD _UPRVAL, typename OPB_T _EXPRMARK, typename OPB_T _LOOPMARK>
struct sIL_FORLOOP_ZEROtoUPPER_COUNTING_LOOP :
sIL_FORLOOP_RAW<
sIL_FORLOOP_ZEROtoUPPER_COUNTING_LOOP_INIT_REG<sIL_MOV_EBX_B4<_UPRVAL>, 0>,
sIL_IF_THEN_ELSE_IS_BELOW<sIL_CMP_EAX_EBX, _LOOPMARK>,
sIL_FORLOOP_ZEROtoUPPER_COUNTING_LOOP_ITERATOR,
_USRCODE,
_EXPRMARK, _LOOPMARK
>
{
};
// ÀÌ ·çƾÀ¸·Î ÁøÀԽà EDX °ø°£¸¸ÀÌ »ç¿ë °¡´ÉÇÏ´Ù. ÁÖÀÇÇÒ °Í.
template<typename _INITCODE, typename _USRCODE, typename _ITR, typename DWORD _UPRVAL, typename OPB_T _EXPRMARK, typename OPB_T _LOOPMARK>
struct sIL_FORLOOP_USR_DEFINE_COUNTING_LOOP :
sIL_FORLOOP_RAW<
_INITCODE,
sIL_IF_THEN_ELSE_IS_BELOW<sIL_CMP_EAX_EBX, _LOOPMARK>,
_ITR,
_USRCODE,
_EXPRMARK, _LOOPMARK
>
{
};
//¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬
// CALL_IBF -> Call Reserved Internal Base Function
// - IBF ÇÔ¼ö´Â Á¤ÇØÁø º°µµÀÇ Á¤ÇØÁø EFP°¡ Á¸ÀçÇÑ´Ù.
//
// <EXPRESSION>
// ERP = (IBF*)( POP() );
template<typename HandlerIBF _FNPTR>
struct sIL_CALL_IBF_PTR
{
sIL<IWzASM::CALL_IBF> M01; // Call Base Function
sDT<HandlerIBF, _FNPTR> M02; // Internal Base Function
inline VOID Change( HandlerIBF fnPTR )
{ M02.Change( fnPTR ); }
};
//¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬
// CALL_IBF Çü½Ä
// - ÀÎÀÚ´Â ÀÌ¹Ì ½ºÅÿ¡ PUSHµÇ¾î ÀÖÀ¸¸ç,
// [0]ÀÇ À§Ä¡¿¡´Â EFP·Î Ȱ¿ë°¡´ÉÇÑ ÇÔ¼ö Æ÷ÀÎÅÍ µî·ÏµÇ¾î ÀÖ¾î¾ß ÇÑ´Ù.
// - ½ºÅà PUSH,POPÀ¸·Î ƯÁ¤ ·¹Áö½ºÅͰ¡ ¾Æ´Ñ À§Ä¡¿¡ ´ëÇØ GENERAL CALLÀ» ¼öÇàÇÑ´Ù.
//
// <EXPRESSION>
// EFP = POP();
// PUSH( EFP );
// ERP = (EFP[0]*)( POP() );
struct sIL_CALL_IBF_STK_EFP
{
sIL<IWzASM::POP_EFP> M01;
sIL<IWzASM::PUSH_EFP> M02;
sIL<IWzASM::CALL_IBF_EFP> M03;
};
//¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬
// CALL_IBF Çü½Ä
// - ÀÎÀÚ´Â ÀÌ¹Ì ½ºÅÿ¡ PUSHµÇ¾î ÀÖ´Ù.
//
// <EXPRESSION>
// EFP[0] = FIND_HASH(_HASH)
// ERP = (EFP[0]*)( POP() );
template<typename WzASMH _HASH>
struct sIL_CALL_IBF_HASH
{
sIL<IWzASM::LEA_EFP_HASH> M01;
sDTH<_HASH> M02;
sIL<IWzASM::CALL_IBF_EFP> M03;
inline VOID ChangeHASH( WzASM_IBF_HASH_T wHASH_IBF )
{
M02.Change( wHASH_IBF );
};
};
//¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬
// CALL_IBF Çü½Ä
// - ÀÎÀÚ´Â »ç¿ëÀÚ°¡ Á÷Á¢ ÀÔ·ÂÇÑ´Ù.
//
// <EXPRESSION>
// (_PUSHCODES)
// EFP[0] = FIND_HASH(_HASH)
// ERP = (EFP[0]*)( POP() );
template<typename _PUSHCODES, typename WzASMH _HASH>
struct sIL_CALL_IBF_HASH_USRINPUT
{
_PUSHCODES M01;
sIL_CALL_IBF_HASH<_HASH> M02;
inline VOID ChangeHASH( WzASM_IBF_HASH_T wHASH_IBF )
{
M02.ChangeHASH( wHASH_IBF );
};
};
////¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬
//// <NOT SUPPORTED>
//// ÀÌÀü °á°ú°ª EAX¸¦ ÀÎÀÚ·Î ¹Þ¾ÆµéÀδÙ.
//// °á°ú°ª EAX°ªÀº À¯ÁöµÈ´Ù.
//struct sIL_FAST_CALL_RIB
//{
// sIL<IWzASM::LEA_ECX> M01; // Find Base Function by EAX
// sIL<IWzASM::CALL_IBF> M02; // Call Base Function
//};
//
////¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬
//// ÀÌÀü °á°ú°ª EAX¸¦ ÀÎÀÚ·Î ¹Þ¾ÆµéÀδÙ.
//// °á°ú°ª EAX°ªÀº À¯ÁöÇÏÁö ¸øÇÑ´Ù.
//template<typename WzASMH _HASHCODE, typename _INPUTARG, typename WORD _SZ>
//struct sIL_CALL_RC
//{
// _INPUTARG M01; // ÇÔ¼öÈ£Ã⠽à ÀÎÀÚ·Î ³ÖÀ» °ª
// sIL<IWzASM::LEA_ECX_HASH> M02; // Find Base Function by HASH
// sDT<WzASMH, _HASHCODE> M03; // HASHCODE
// sIL<IWzASM::CALL_RC> M04; // Call GRES C Function
//
// inline VOID Change( WzASMH hHASH )
// { M02.Change( hHASH ); }
//};
//¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬
// sIL_CALL_RC
// - ÀÌÀü °á°ú°ª EAX¸¦ ÀÎÀÚ·Î ¹Þ¾ÆµéÀδÙ.
// - °á°ú°ª EAX°ªÀº À¯ÁöÇÏÁö ¸øÇÑ´Ù.
//
// <EXPRESSION>
// (_INPUTARG)
// REF = FIND_GRES_HASH(_HASH)
// ERP = (REF)( POP() );
template<typename WzASMH _HASHCODE, typename _INPUTARG, typename WORD _SZ>
struct sIL_CALL_RC
{
_INPUTARG M01; // ÇÔ¼öÈ£Ã⠽à ÀÎÀÚ·Î ³ÖÀ» °ª
sIL<IWzASM::LEA_REF_HASH> M02; // Find Base Function by HASH
sDTH<_HASHCODE> M03; // HASHCODE
sIL<IWzASM::CALL_RC> M04; // Call GRES C Function
inline VOID Change( WzASMH hHASH )
{ M02.Change( hHASH ); }
};
//
//struct sIL_FAST_CALL_RC
//{
// sIL<IWzASM::LEA_ECX> M01; // Find Base Function by EAX
// sIL<IWzASM::CALL_RC> M02; // Call GRES C Function
//};
//
////¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬
//// ÀÌÀü °á°ú°ª EAX¸¦ ÀÎÀÚ·Î ¹Þ¾ÆµéÀδÙ.
//// °á°ú°ª EAX°ªÀº À¯ÁöÇÏÁö ¸øÇÑ´Ù.
//template<typename WzASMH _HASHCODE>
//struct sIL_CALL_RD
//{
// sIL<IWzASM::LEA_EDX_HASH> M01; // Find Base Function by HASH
// sDT<WzASMH, _HASHCODE> M02; // HASHCODE
// sIL<IWzASM::CALL_RD> M03; // Call GRES D Function
//
// inline VOID Change( WzASMH hHASH )
// { M02.Change( hHASH ); }
//};
//
//struct sIL_FAST_CALL_RD
//{
// sIL<IWzASM::LEA_EDX> M01; // Find Base Function by EAX
// sIL<IWzASM::CALL_RD> M02; // Call GRES C Function
//};
//¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬
// À̰ÍÀº HASH·Î µî·ÏµÈ ÇÔ¼ö »Ó¸¸ ¾Æ´Ï¶ó Á÷Á¢ ¸Þ¸ð¸® Æ÷ÀÎÅ͸¦ ÀÔ·ÂÇØ¼­
// »ç¿ëÇϹǷΠHASH¿¡ µî·ÏµÈ ÇÔ¼ö°¡ ¾Æ´Ï´õ¶óµµ È£ÃâÀÌ °¡´ÉÇÏ´Ù.
struct sIL_CALL_IBF_PTR_MAKE_ARGS
{
sIL_CLRA_EAX M01_CLRA_EAX;
struct sINTER_make_arguments {
sIL_MOV_EAX0_PTR<NULL> M01_EIP_OBJ;
sIL_MOV_EAX1_PTR<NULL> M02_ARG1_CMDPTR; // { 0, (ARG1*), 0, 0 }
sIL_MOV_EAX2_B2<0> M03_ARG2_VAL; // { 0, (ARG1*), (ARG2), 0 }
} M02_make_arguments;
sIL<IWzASM::PUSH_EAX> M04_INPUTARG; // Input ARG
sIL_CALL_IBF_PTR<NULL> M05_CALL_IBF_HANDLER;
inline VOID ChangeARG( BYTE* IN pCMDSTREAM, WORD wSIZE )
{
M02_make_arguments.M02_ARG1_CMDPTR.ChangeVAL( pCMDSTREAM );
M02_make_arguments.M03_ARG2_VAL.ChangeVAL( wSIZE );
}
inline VOID RegisterIBF( HandlerIBF fnIBF )
{ M05_CALL_IBF_HANDLER.Change( fnIBF ); }
inline VOID RegisterEIP( WzASM_EIP* pEIP )
{
//uREG_NODE& rNODE = *(uREG_NODE*)&M01.M02_ARG0;
//rNODE.PTR = pEIP;
M02_make_arguments.M01_EIP_OBJ.ChangeVAL( (WzPTR)pEIP );
};
};
//¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬
// <sMETHOD_CALL_IBF_PTR>
// À̰ÍÀº µ¶¸³µÈ ÇÔ¼ö - ±¸ºÐ ¹æ¹ý (sIL_RET°¡ Á¸ÀçÇÏ´Â °æ¿ì)
struct sMETHOD_CALL_IBF_PTR
{
sIL<IWzASM::PUSH_EAX> M01;
sIL_CALL_IBF_PTR_MAKE_ARGS M02;
sIL<IWzASM::POP_EAX> M03;
sIL_RET M04;
inline VOID ChangeARG( BYTE* IN pCMDSTREAM, WORD wSIZE )
{ M02.ChangeARG( pCMDSTREAM, wSIZE ); }
inline VOID RegisterIBF( HandlerIBF fnIBF )
{ M02.RegisterIBF( fnIBF ); }
inline VOID RegisterEIP( WzASM_EIP* pEIP )
{ M02.RegisterEIP( pEIP ); };
};
//¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬
//
//{
// sUREG_NODE uArg0( NULL, _ALLOC_SZ );
// BYTE* pPTR = HandlerIBF_(malloc)(&uArg0.NODE);
// sUREG_NODE uArg1( NULL, pPTR, _ALLOC_SZ );
// HandlerIBF_(ZeroMemory)( &uArg1.NODE );
// return pPTR;
//}
template<typename _DECLTYPE1, typename _DECLTYPE2, typename WORD _ALLOC_SZ=1>
struct sMETHOD_ALLOCnCLEAR_MEMORY_BASE
{
sIL<IWzASM::PUSH_EAX> M01;
sIL_MOV_EAX_EXA2B4<0, 0> M02;
sIL_MOV_EAX1_B2<_ALLOC_SZ> M03; // ¿©±â±îÁö°¡ Æ÷¸Ë ¸¸µç °Í
sIL_MOV_EBX_EAX M04; // Àӽà ÀúÀå
sIL<IWzASM::PUSH_EAX> M05;
_DECLTYPE1 M06;
sIL_MOV_EAX_EBX M07; // µ¥ÀÌÅÍ º¹¿ø
sIL<IWzASM::MOV_EAX2_EAX1> M08; // Æ÷¸Ë ÀçÁ¤·Ä
sIL<IWzASM::MOV_EAX1_ERP0> M09; // °á°ú°ªÀÎ Æ÷ÀÎÅÍ ÇÒ´ç
sIL<IWzASM::PUSH_EAX> M10;
_DECLTYPE2 M11;
sIL<IWzASM::MOV_ERP0_EAX1> M12;
sIL<IWzASM::POP_EAX> M13;
sIL_RET M14;
inline VOID RegisterEIP( WzASM_EIP* pEIP )
{
uREG_NODE& rNODE = *(uREG_NODE*)&M02.M02_ARG0;
rNODE.PTR = pEIP;
};
inline VOID ChangeSize( WORD wSIZE )
{ M03.ChangeVAL( wSIZE ); }
};
template<typename WORD _ALLOC_SZ=1>
struct sMETHOD_ALLOCnCLEAR_MEMORY_PTR
: sMETHOD_ALLOCnCLEAR_MEMORY_BASE<
sIL_CALL_IBF_PTR<NULL>, sIL_CALL_IBF_PTR<NULL>, _ALLOC_SZ
>
{
sMETHOD_ALLOCnCLEAR_MEMORY_PTR()
{
M06.Change( FNPTR_IBF_HANDLER(malloc) );
M11.Change( FNPTR_IBF_HANDLER(ZeroMemory) );
}
};
template<typename WORD _ALLOC_SZ=1>
struct sMETHOD_ALLOCnCLEAR_MEMORY_HASH
: sMETHOD_ALLOCnCLEAR_MEMORY_BASE<
sIL_CALL_IBF_HASH<IBF_HASH::IBF_malloc>, sIL_CALL_IBF_HASH<IBF_HASH::IBF_ZeroMemory>, _ALLOC_SZ
>
{
};
//¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬
// <sMETHOD_CALL_WITH_ALLOCEDMEMORY_BASE>
// ÇÒ´çµÈ ¸Þ¸ð¸®¸¦ µî·ÏµÈ IBFÇڵ鷯ÀÇ ÀÎÀÚ·Î ³Ñ°ÜÁØ´Ù.
// <WARNING>
// ÇÒ´çµÈ ¸Þ¸ð¸®¸¦ ÇØÁ¦ÇÏ´Â ·çƾÀº Á¸ÀçÇÏÁö ¾Ê´Â´Ù. Áï, IBFÇڵ鷯¿¡¼­ ÇØÁ¦
// ½ÃŰ°Å³ª ERP°ªÀ¸·Î Áö¿øÇØ¾ß ÇÒ °ÍÀÌ´Ù.
//
// <SAMPLE>
//
// BYTE* pPTR = malloc(_ALLOC_SZ);
// ZeroMemory( pPTR, _ALLOC_SZ );
// sUREG_NODE uArg( WzASM_EIP*, pPTR, _ALLOC_SZ );
// HandlerIBF_(REGISTERED)( &uArg.NODE );
//
template<typename _DECLTYPE1, typename WORD _ALLOC_SZ = 1>
struct sMETHOD_CALL_WITH_ALLOCEDMEMORY_BASE
{
sIL<IWzASM::PUSH_EABCDX> M01;
sIL_MOV_EAX_EXA2B1<0, 0> M02;
sIL_MOV_EAX1_B2<_ALLOC_SZ> M03; // ¿©±â±îÁö°¡ Æ÷¸Ë ¸¸µç °Í
sIL<IWzASM::PUSH_EAX> M04; // Àӽà ÀúÀå (Æ÷¸Ë)
sIL<IWzASM::PUSH_EAX> M05; // IBF ÀÎÀÚ
_DECLTYPE1 M06; // ALLOCnCLEAR_MEMORY( NULL, [SZ] )
sIL<IWzASM::POP_EAX> M07; // µ¥ÀÌÅÍ º¹¿ø (Æ÷¸Ë)
sIL<IWzASM::MOV_EAX2_EAX1> M08; // [EIP*], [(SZ)], [SZ]
sIL<IWzASM::MOV_EAX1_ERP0> M09; // [EIP*], [PTR], [SZ] °á°ú°ªÀÎ Æ÷ÀÎÅÍ ÇÒ´ç
sIL<IWzASM::PUSH_EAX> M10; // IBF ÀÎÀÚ
sIL_CALL_IBF_PTR<NULL> M11; // RegisterIBFHandler (ÇØ´ç Æ÷ÀÎÅÍ¿¡ new & cmd execute)
sIL<IWzASM::POP_EABCDX> M12;
sIL_RET M13;
sMETHOD_CALL_WITH_ALLOCEDMEMORY_BASE() {};
inline VOID Register( WzASM_EIP* pEIP, HandlerIBF fnPTR )
{
//uREG_NODE& rNODE = *(uREG_NODE*)&M02.M02;
//rNODE.PTR = pEIP;
M11.Change( fnPTR );
};
inline VOID ChangeSize( WORD wSIZE )
{
M03.Change( wSIZE );
}
};
//////////////////////////////////////////////////////////////////////////
// <sMETHOD_CALL_WITH_ALLOCEDMEMORY_PTR>
// sMETHOD_CALL_WITH_ALLOCEDMEMORY_BASE + POINTER IBF HANDLER µî·Ï
template<typename WORD _ALLOC_SZ = 1>
struct sMETHOD_CALL_WITH_ALLOCEDMEMORY_PTR
: public sMETHOD_CALL_WITH_ALLOCEDMEMORY_BASE<
sIL_CALL_IBF_PTR<NULL>, _ALLOC_SZ
>
{
sMETHOD_CALL_WITH_ALLOCEDMEMORY_PTR()
{
M06.Change( FNPTR_IBF_HANDLER(ALLOCnCLEAR_MEMORY) );
};
};
//////////////////////////////////////////////////////////////////////////
// <sMETHOD_CALL_WITH_ALLOCEDMEMORY_PTR>
// sMETHOD_CALL_WITH_ALLOCEDMEMORY_BASE + HASH IBF HANDLER µî·Ï
template<typename WORD _ALLOC_SZ = 1>
struct sMETHOD_CALL_WITH_ALLOCEDMEMORY_HASH
: public sMETHOD_CALL_WITH_ALLOCEDMEMORY_BASE<
sIL_CALL_IBF_HASH<IBF_HASH::IBF_ALLOCnCLEAR_MEMORY>, _ALLOC_SZ
>
{
};
//¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬
// <sIL_WzEIP_CALL_WITH_FREE_BASE>
// ÁÖ¾îÁø ¸Þ¸ð¸®¸¦ ÇØÁ¦ÇÑ´Ù. // [EIP*], [PTR]
// À̰ÍÀ» È£Ãâ Çϱâ Àü
// uNODE.EXA[sARG::ARG1]¿¡ ÁÖ¾îÁø °ªÀÌ Á¸ÀçÇØ¾ß ÇÑ´Ù.
//
// <SAMPLE>
// uREG_NODE uNODE;
// uNODE.EXA[sARG::ARG1].PTR = (freeing ptr);
// free( uNODE.EXA[sARG::ARG1].PTR )
//
template<typename _LDEAXCMD, typename DWORD _SZ=1>
struct sIL_WzEIP_CALL_WITH_FREE_BASE
{
_LDEAXCMD M01; // EAX[1]¿¡ ÇØÁ¦ÇÒ Æ÷ÀÎÅÍ Á¸ÀçÇÏ´Â ÇüÅ·Πº¯Çü
sIL<IWzASM::PUSH_EAX> M02; // Àӽà ÀúÀå (Æ÷¸Ë)
sIL_CALL_IBF_HASH<IBF_HASH::IBF_free> M03; // IBF_free( NULL, [PTR] ) -> ERP[0]´Â ¹«°ü
};
//¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬
// <GET OFFSET_POINTER on OBJECT>
//
// <EXPRESSION>
// MEMBER* pMEMBER = &((OBJECT*)->MEMBER(by _OFFSET));
//
// EAX = (OBJECT*)
// EOP[0] = EAX;
// EOP[1] = sCALC( _OFFSET, ADD )
// EAX = EOP[0] + EOP[1]
//
// <USED REG>
// EAX = { ~, pMEMBER, ~ }
// EOP = { OBJECT*, sCALC(OBJECT, MEMBER) }
//
template<typename WORD _OFFSET>
struct sIL_GET_OFFSET_PTR
{
sIL<IWzASM::MOV_EOP_EAX> M01; // EOP = EAX
sIL<IWzASM::MOV_EOP_OFF> M02; // EOP[1] = NEXT-B4(sCALC)
sDT_CALC<_OFFSET, cOFF::ADD> M03_OFFSET; // -(P)-sCALC(DT,OP)
sIL<IWzASM::LEA_EAX_EOP> M04; // EAX = EOP + -(P)-
// ÀÌ¹Ì ÇÒ´çµÈ °´Ã¼ÀÇ ¿É¼Â°è»ê µ¥ÀÌÅÍ º¯°æ
inline VOID ChangeOFFSETofPTR( WORD wOffset, cOFF::eOP eCMD )
{
M03_OFFSET.CALC.DT = wOffset;
M03_OFFSET.CALC.OP = eCMD;
}
};
//¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬
// <GET OFFSET_POINTER on OBJECT>
//
// <EXPRESSION>
// MEMBER* pMEMBER = &((OBJECT*)->MEMBER(by _OFFSET));
//
// EAX = (OBJECT*)
// EOP[0] = EAX;
// EOP[1] = sCALC( _OFFSET, ADD )
// EAX = EOP[0] + EOP[1]
//
// <USED REG>
// EAX = { pMEMBER, ~ }
// EOP = { OBJECT*, sCALC(OBJECT, MEMBER) }
//
template<typename WzPTR _ROOTPTR, typename WORD _OFFSET>
struct sIL_GET_OFFSET_PTR_ON_ROOT {
sIL_MOV_EAX_PTR<_ROOTPTR> M01;
sIL_GET_OFFSET_PTR<_OFFSET> M02_OFFSET;
// ±âÁØ EOP°ª º¯°æ
inline VOID ChangeBaseObject( WzPTR pPTR )
{ M01.ChangeVAL( pPTR ); }
// ÀÌ¹Ì ÇÒ´çµÈ °´Ã¼ÀÇ ¿É¼Â°è»ê µ¥ÀÌÅÍ º¯°æ
inline VOID ChangeOFFSETofPTR( WORD wOffset, cOFF::eOP eCMD )
{ M02_OFFSET.ChangeOFFSETofPTR( wOffset, eCMD ); }
};
//¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬
// <CHECK BOOLEAN>
//
// <EXPRESSION>
// MEMBER* pMEMBER = &((OBJECT*)->MEMBER(by _OFFSET));
// BOOL bCHECK = CALL_HANDLER( 0, pMEMBER, 0, 0 );
// if( bCHECK )
// { º°µµ ÄÚµå Áö¿ø ÇÊ¿ä }
// else
// goto _JMPFAILCASE;
//
//
// <USED REG>
// EAX = { ~, pMEMBER, ~ }
// EOP = { OBJECT*, sCALC(OBJECT, MEMBER) }
// ERP = bCHECK
// EFL
//
template<typename WzASM_IBF_HASH_T _IBF_HASH, typename WORD _OFFSET, typename OPB_T _JMPFAILCASE>
struct sIL_CHECK_BOOL
{
sIL_GET_OFFSET_PTR_ON_ROOT<NULL, _OFFSET> M01;
sIL<IWzASM::MOV_EAX1_EAX0> M02;
sIL_CALL_IBF_HASH_USRINPUT<sIL<IWzASM::PUSH_EAX>, _IBF_HASH> M04_CHECK_BOOL;
sIL_IF_THEN_ELSE_IS_ZERO<sIL_TEST_ERP, _JMPFAILCASE> M09;
// ±âÁØ EOP°ª º¯°æ
inline VOID ChangeBaseObject( WzPTR pPTR )
{ M01.ChangeBaseObject( pPTR ); }
// ÀÌ¹Ì ÇÒ´çµÈ °´Ã¼ÀÇ ¿É¼Â°è»ê µ¥ÀÌÅÍ º¯°æ
inline VOID ChangeOFFSETofPTR( WORD wOffset, cOFF::eOP eCMD )
{ M01.ChangeOFFSETofPTR( wOffset, eCMD ); }
// [?][PTR] - Çü½ÄÀÇ IBF
inline VOID ChangeCompareRoutine( WzASM_IBF_HASH_T wHASH_IBF )
{ M04_CHECK_BOOL.ChangeHASH( wHASH_IBF ); }
};
//¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬
// <CHECK BOOLEAN>
//
// <EXPRESSION>
// --PUSH GPR--
// MEMBER* pMEMBER = &((OBJECT*)->(_OFFSET MEMBER));
// BOOL bCHECK = CALL_HANDLER( 0, pMEMBER, 0, 0 );
// if( bCHECK )
// {
// EAX = { ~, pMEMBER, _INTERVAL, ~ }
// CALL_HANDLER( EAX );
// --POP GPR--
// return TRUE;
// }
// //if( !bCHECK ) goto _JMPFAILCASE;
// _JMPFAILCASE:
// --POP GPR--
// return FALSE;
//
// <USED REG>
// EAX = { ~, pMEMBER, _INTERVAL, ~ }
// EOP = { OBJECT*, sCALC(OBJECT, MEMBER) }
// ERP = bCHECK
// EFL
//
template<typename WzASM_IBF_HASH_T _CHK_IBF_HASH, typename WzASM_IBF_HASH_T _ACT_IBF_HASH, typename _USRCODE, typename WORD _OFFSET, typename DWORD _INTERVAL>
struct sMETHOD_INTERVAL_WORKNODE_CODES
{
sIL<IWzASM::PUSH_EABCDX> M01; // STK(n)
sIL_CHECK_BOOL<_CHK_IBF_HASH, _OFFSET, OPT::MARK01> M02;
// Á¶°Ç ¸¸Á·½Ã (½Ã°£ÀÌ µÇ¾úÀ» ¶§...)
// (ITimeout*)->SetNextTimeoutCurTickBased( Pop() );
//sIL_CALL_IBF_HASH_USRINPUT<sIL<IWzASM::PUSH_EAX>, _ACT_IBF_HASH> M04_if_is_true_than_call_IBF_handler
struct sINTER_if_is_true_than_call_IBF_handler {
sIL_MOV_EAX2_B2<_INTERVAL> M01;
sIL_CALL_IBF_HASH_USRINPUT<sIL<IWzASM::PUSH_EAX>, _ACT_IBF_HASH> M02;
} M04_if_is_true_than_call_IBF_handler;
// User Code Block
_USRCODE M06;
// °á°úó¸® (TRUE)
// EBX = TRUE;
// ERP = EBX
struct sINTER_make_return_true_result {
sIL<IWzASM::MOV_EBX_B1> M01;
sDT1<TRUE> M02;
sIL<IWzASM::MOV_ERP_EBX> M03;
} M09;
sIL_MARK01 M10;
sIL<IWzASM::POP_EABCDX> M11;
sIL_RET M12;
inline VOID ChangeBaseObject( WzPTR pPTR )
{ M02.ChangeBaseObject( pPTR ); }
inline VOID Change_if_is_true_than_call_IBF_handler( WzASM_IBF_HASH_T wHASH_IBF )
{ M04_if_is_true_than_call_IBF_handler.M02.ChangeHASH( wHASH_IBF ); }
};
#pragma pop_macro("STATIC")
#pragma pop_macro("CONST")
#pragma pop_macro("INLINE")
#pragma pack(pop)