function TCompile.GetErrorBIG5(const xErrorCode: integer): string; //返回错误描述 begin //注意:以下使用的是中文繁体BIG5码,要使用内码转换器才能察看 case xErrorCode of csTCompile_NoError: result := ''; //⊿Τ祇瞷岿粇! csTCompile_NoKnownError: result := 'ぃ笵岿粇!'; csTCompile_NoErrorCode: result := 'тぃ岿粇腹┮癸莱岿粇磞瓃!'; csTCompile_CompileHexCodeError: result := '絪亩せ秈絏岿粇!'; csTCompile_HexMod2_EQ_1_Error: result := '絪亩肚岿粇!'; csTCompile_PMMarker_Error: result := '絪亩眔把计嘿祇ネ岿粇!'; csTCompile_FMMarker_Error: result := '絪亩眔ㄧ计嘿祇ネ岿粇!'; csTCompile_Wording_Error: result := '粂猭祇ネ岿粇!'; csTCompile_Bracket_Error: result := '粂猭岿粇, ( ) 矪!'; csTCompile_Optimize_Error: result := '絪亩涩て祇ネ岿粇!'; csTCompile_Define_Error: result := 'ㄧ计絪亩岿粇(┪禬﹚竡办)!'; csTCompile_Handwriting_Error: result := 'ㄧ计糶Α岿粇!'; csTCompile_FFHandwriting_Error: result := '縩だㄧ计糶Α岿粇!'; csTCompile_ReadFloat_Error: result := '絪亩弄盽计计祇ネ岿粇!'; csTCompile_ReadMarker_Error: result := '絪亩弄夹醚才祇ネ岿粇!'; csTCompile_Read_Error: result := '粂猭岿粇,Τぃ醚才!'; csTCompile_Note_Match_Error: result := '猔睦才腹ぃで皌! { } ┪ /* */'; else result := GetErrorBIG5(csTCompile_NoErrorCode); end; end;function TCompile.GetErrorEnglish(const xErrorCode: integer): string; //返回错误描述 begin //注意:作者是使用工具软件翻译的,希望能有大虾更正:) case xErrorCode of csTCompile_NoError: result := ''; //Not found error! csTCompile_NoKnownError: result := 'Not knowing error.'; csTCompile_NoErrorCode: result := 'Can not find the error code opposite describe.'; csTCompile_CompileHexCodeError: result := 'The CPU instruction''s HEX code error, when compile the text.'; csTCompile_HexMod2_EQ_1_Error: result := 'Stream into the instruction length is error, when compile the text.'; csTCompile_PMMarker_Error: result := 'Find a error when do compile to get the parameters''s name.'; csTCompile_FMMarker_Error: result := 'Find a error when do compile to get the functions''s name.'; csTCompile_Wording_Error: result := 'Wording error!'; csTCompile_Bracket_Error: result := 'Wording error for the "( )" .'; csTCompile_Optimize_Error: result := 'Find a error when do the compile optimize.'; csTCompile_Define_Error: result := 'Get the error when compile then function, or overstep the define extent.'; csTCompile_Handwriting_Error: result := 'The Function''s writeing format error.'; csTCompile_FFHandwriting_Error: result := 'The integral function''s writeing format error.'; csTCompile_ReadFloat_Error: result := 'Find a error when do compile to get the constant''s character.'; csTCompile_ReadMarker_Error: result := 'Find a error when do compile to get the ing''s character.'; csTCompile_Read_Error: result := 'Wording error,have characters did not define.'; csTCompile_Note_Match_Error: result := 'Note match error! { } or /* */'; else result := GetErrorEnglish(csTCompile_NoErrorCode); end; end;
function TCompile.GetErrorCode(): integer; begin result := ErrorCode; end;constructor TCompile.Create(); begin inherited Create(); //Enabled:=true; FEnabledNote := false; GetFunctionList(); RndSeed[0] := 0; //随机函数初始种子值 RndSeed[1] := 0; //保证 @RndSeed[0] 以后的4字节单元恒为零 使指令 FILD qword ptr [E?X] 能按要求执行 end;destructor TCompile.Destroy; begin inherited Destroy; end;function TCompile.SetText(const Value: string): boolean; begin //if not Enabled then // begin // result:=true; // exit; // end; try //application.MessageBox(pchar(inttostr(length(value))),'!'); result := false; Clear(); if Value <> '' then FExeText := Value else FExeText := '0.0'; if not Compile() then exit; result := true; except result := false; end; end;function TCompile.GetText(): string; //获得当前编译的字符串 begin result := FExeText; end;function TCompile.SetParameter(const PName: string; const dValue: Extended): boolean; var i: integer; sKey: string; begin //if not Enabled then //begin // result:=true; // exit; //end; try result := false; sKey := uppercase(PName); if sKey[1] <> '&' then sKey := '&' + sKey; for i := 0 to PParameterList - 1 do begin if uppercase(ParameterList[i].CName) = sKey then begin ParameterList[i].CAddress^ := dValue; result := true; exit; end; end; except result := false; end; end;procedure TCompile.SetParameter(const PAddress: PExtended; const dValue: Extended); begin //if not Enabled then exit; PAddress^ := dValue; end;function TCompile.GetParameterAddress(const PName: string): PExtended; var i: integer; sKey: string; begin try result := PExtended(0); sKey := uppercase(PName); if sKey[1] <> '&' then sKey := '&' + sKey; for i := 0 to PParameterList - 1 do begin if uppercase(ParameterList[i].CName) = sKey then begin result := ParameterList[i].CAddress; exit; end; end; except result := PExtended(0); end; end;function TCompile.GetParameterIndex(const PName: string): integer; //得到参数序号 var i: integer; sKey: string; begin try result := -1; sKey := uppercase(PName); if sKey[1] <> '&' then sKey := '&' + sKey; for i := 0 to PParameterList - 1 do begin if uppercase(ParameterList[i].CName) = sKey then begin result := ParameterList[i].CIndex; exit; end; end; except result := -1; end; end;procedure TCompile.Clear(); begin ErrorCode := 0; CompileInPFirst := 0; TF00 := ''; T_ff_sys_ConstN := 0; PExeAddressCode := 0; //(编译以后的执行码) 初始化 setlength(ExeAddressCode, 1024); PParameterList := 0; //(参数列表) 初始化 setlength(ParameterList, 1024); PExeParameter := 0; //(编译后 参数储存空间) 初始化 setlength(ExeParameter, 1024); PExeAddressList := 0; //(记录指针位置列表 积分) 初始化 setlength(ExeAddressList, 1024); PExeAddressPMList := 0; //(记录指针位置列表 参数存储地址) 初始化 setlength(ExeAddressPMList, 1024); PFunctionStack := 0; //(函数符号调用堆栈) 初始化 setlength(FunctionStack, 1024); T_PTrueNow.ifConst := false; //(编译优化常数时 参数性质堆栈) 初始化 T_PTrueOld.ifConst := false; PT_PTrueNowList := 0; setlength(T_PTrueNowList, 1024);end;
procedure TCompile.ExeAddressCodeIn(const B: array of Byte); var i: integer; begin for i := low(b) to high(b) do begin ExeAddressCodeIn(b[i]); end; end; procedure TCompile.ExeAddressCodeIn(const sB: string); var i: integer; b: byte; function hextoint(const cB: char): byte; begin case upcase(cB) of '0'..'9': result := strtoint(cB); 'A': result := 10; 'B': result := 11; 'C': result := 12; 'D': result := 13; 'E': result := 14; 'F': result := 15; else begin //application.MessageBox('Compile Error!','Error:'); ErrorCode := csTCompile_CompileHexCodeError; result := 0; end; end; end; begin if length(sb) mod 2 = 1 then //application.MessageBox('Compile Error!','Error:'); ErrorCode := csTCompile_HexMod2_EQ_1_Error; for i := 1 to length(sB) div 2 do begin b := hextoint(sb[i * 2 - 1]) * 16 + hextoint(sb[i * 2]); ExeAddressCodeIn(b); end; end; procedure TCompile.GetExeAddressCodeInPointerRePm(const PMIndex: integer); begin if PExeAddressPMList >= high(ExeAddressPMList) - 1 then begin setlength(ExeAddressPMList, 2 * high(ExeAddressPMList) + 2); end; ExeAddressPMList[PExeAddressPMList].ExeIndex := PExeAddressCode; ExeAddressPMList[PExeAddressPMList].PMIndex := PMIndex; inc(PExeAddressPMList); end; function TCompile.GetExeAddressCodeInPointerReCode(): Pointer; begin if PExeAddressList >= high(ExeAddressList) - 1 then begin setlength(ExeAddressList, 2 * high(ExeAddressList) + 2); end; result := @ExeAddressCode[PExeAddressCode]; ExeAddressList[PExeAddressList] := PExeAddressCode; inc(PExeAddressList); end; procedure TCompile.RefreshExeAddressCodeInPointer(); var i: integer; pExe: pointer; iExe: integer; begin for i := 0 to PExeAddressList - 1 do begin pExe := @ExeAddressCode[ExeAddressList[i]]; iExe := Cardinal(PExe) + 5; ExeAddressCode[ExeAddressList[i]] := $B8; //mov eax ExeAddressCode[ExeAddressList[i] + 1] := (byte(iExe mod 256)); ExeAddressCode[ExeAddressList[i] + 2] := (byte((iExe div 256) mod 256)); ExeAddressCode[ExeAddressList[i] + 3] := (byte((iExe div (256 * 256)) mod 256)); ExeAddressCode[ExeAddressList[i] + 4] := (byte((iExe div (256 * 256 * 256)) mod 256)); // mov eax,iExe //return Address end; for i := 0 to PExeAddressPMList - 1 do begin pExe := @ExeParameter[ExeAddressPMList[i].PMIndex]; iExe := Cardinal(pExe); ExeAddressCode[ExeAddressPMList[i].ExeIndex] := (byte(iExe mod 256)); ExeAddressCode[ExeAddressPMList[i].ExeIndex + 1] := (byte((iExe div 256) mod 256)); ExeAddressCode[ExeAddressPMList[i].ExeIndex + 2] := (byte((iExe div (256 * 256)) mod 256)); ExeAddressCode[ExeAddressPMList[i].ExeIndex + 3] := (byte((iExe div (256 * 256 * 256)) mod 256)); //return Address end; end;function TCompile.GetExeCodeLength(): integer; begin result := PExeAddressCode; end;function TCompile.GetExeParameterLength(): integer; begin result := PParameterList * ExendedFormatLength; end;procedure TCompile.SetRandomize2(const RandomSeed: integer); begin RndSeed[0] := RandomSeed; end;
http://community.csdn.net/Expert/topic/2794/2794615.xml?temp=.5860865
begin
//注意:以下使用的是中文繁体BIG5码,要使用内码转换器才能察看
case xErrorCode of
csTCompile_NoError: result := ''; //⊿Τ祇瞷岿粇!
csTCompile_NoKnownError: result := 'ぃ笵岿粇!';
csTCompile_NoErrorCode: result := 'тぃ岿粇腹┮癸莱岿粇磞瓃!';
csTCompile_CompileHexCodeError: result := '絪亩せ秈絏岿粇!';
csTCompile_HexMod2_EQ_1_Error: result := '絪亩肚岿粇!';
csTCompile_PMMarker_Error: result := '絪亩眔把计嘿祇ネ岿粇!';
csTCompile_FMMarker_Error: result := '絪亩眔ㄧ计嘿祇ネ岿粇!';
csTCompile_Wording_Error: result := '粂猭祇ネ岿粇!';
csTCompile_Bracket_Error: result := '粂猭岿粇, ( ) 矪!';
csTCompile_Optimize_Error: result := '絪亩涩て祇ネ岿粇!';
csTCompile_Define_Error: result := 'ㄧ计絪亩岿粇(┪禬﹚竡办)!';
csTCompile_Handwriting_Error: result := 'ㄧ计糶Α岿粇!';
csTCompile_FFHandwriting_Error: result := '縩だㄧ计糶Α岿粇!';
csTCompile_ReadFloat_Error: result := '絪亩弄盽计计祇ネ岿粇!';
csTCompile_ReadMarker_Error: result := '絪亩弄夹醚才祇ネ岿粇!';
csTCompile_Read_Error: result := '粂猭岿粇,Τぃ醚才!';
csTCompile_Note_Match_Error: result := '猔睦才腹ぃで皌! { } ┪ /* */';
else
result := GetErrorBIG5(csTCompile_NoErrorCode);
end;
end;function TCompile.GetErrorEnglish(const xErrorCode: integer): string;
//返回错误描述
begin
//注意:作者是使用工具软件翻译的,希望能有大虾更正:)
case xErrorCode of
csTCompile_NoError: result := ''; //Not found error!
csTCompile_NoKnownError: result := 'Not knowing error.';
csTCompile_NoErrorCode: result :=
'Can not find the error code opposite describe.';
csTCompile_CompileHexCodeError: result :=
'The CPU instruction''s HEX code error, when compile the text.';
csTCompile_HexMod2_EQ_1_Error: result :=
'Stream into the instruction length is error, when compile the text.';
csTCompile_PMMarker_Error: result :=
'Find a error when do compile to get the parameters''s name.';
csTCompile_FMMarker_Error: result :=
'Find a error when do compile to get the functions''s name.';
csTCompile_Wording_Error: result := 'Wording error!';
csTCompile_Bracket_Error: result := 'Wording error for the "( )" .';
csTCompile_Optimize_Error: result :=
'Find a error when do the compile optimize.';
csTCompile_Define_Error: result :=
'Get the error when compile then function, or overstep the define extent.';
csTCompile_Handwriting_Error: result :=
'The Function''s writeing format error.';
csTCompile_FFHandwriting_Error: result :=
'The integral function''s writeing format error.';
csTCompile_ReadFloat_Error: result :=
'Find a error when do compile to get the constant''s character.';
csTCompile_ReadMarker_Error: result :=
'Find a error when do compile to get the ing''s character.';
csTCompile_Read_Error: result :=
'Wording error,have characters did not define.';
csTCompile_Note_Match_Error: result := 'Note match error! { } or /* */';
else
result := GetErrorEnglish(csTCompile_NoErrorCode);
end;
end;
begin
result := ErrorCode;
end;constructor TCompile.Create();
begin
inherited Create();
//Enabled:=true;
FEnabledNote := false;
GetFunctionList();
RndSeed[0] := 0; //随机函数初始种子值
RndSeed[1] := 0;
//保证 @RndSeed[0] 以后的4字节单元恒为零 使指令 FILD qword ptr [E?X] 能按要求执行
end;destructor TCompile.Destroy;
begin
inherited Destroy;
end;function TCompile.SetText(const Value: string): boolean;
begin
//if not Enabled then
// begin
// result:=true;
// exit;
// end;
try
//application.MessageBox(pchar(inttostr(length(value))),'!');
result := false;
Clear();
if Value <> '' then
FExeText := Value
else
FExeText := '0.0';
if not Compile() then
exit;
result := true;
except
result := false;
end;
end;function TCompile.GetText(): string; //获得当前编译的字符串
begin
result := FExeText;
end;function TCompile.SetParameter(const PName: string; const dValue: Extended):
boolean;
var
i: integer;
sKey: string;
begin
//if not Enabled then
//begin
// result:=true;
// exit;
//end;
try
result := false;
sKey := uppercase(PName);
if sKey[1] <> '&' then
sKey := '&' + sKey;
for i := 0 to PParameterList - 1 do
begin
if uppercase(ParameterList[i].CName) = sKey then
begin
ParameterList[i].CAddress^ := dValue;
result := true;
exit;
end;
end;
except
result := false;
end;
end;procedure TCompile.SetParameter(const PAddress: PExtended; const dValue:
Extended);
begin
//if not Enabled then exit;
PAddress^ := dValue;
end;function TCompile.GetParameterAddress(const PName: string): PExtended;
var
i: integer;
sKey: string;
begin
try
result := PExtended(0);
sKey := uppercase(PName);
if sKey[1] <> '&' then
sKey := '&' + sKey;
for i := 0 to PParameterList - 1 do
begin
if uppercase(ParameterList[i].CName) = sKey then
begin
result := ParameterList[i].CAddress;
exit;
end;
end;
except
result := PExtended(0);
end;
end;function TCompile.GetParameterIndex(const PName: string): integer; //得到参数序号
var
i: integer;
sKey: string;
begin
try
result := -1;
sKey := uppercase(PName);
if sKey[1] <> '&' then
sKey := '&' + sKey;
for i := 0 to PParameterList - 1 do
begin
if uppercase(ParameterList[i].CName) = sKey then
begin
result := ParameterList[i].CIndex;
exit;
end;
end;
except
result := -1;
end;
end;procedure TCompile.Clear();
begin
ErrorCode := 0;
CompileInPFirst := 0;
TF00 := '';
T_ff_sys_ConstN := 0; PExeAddressCode := 0; //(编译以后的执行码) 初始化
setlength(ExeAddressCode, 1024); PParameterList := 0; //(参数列表) 初始化
setlength(ParameterList, 1024); PExeParameter := 0; //(编译后 参数储存空间) 初始化
setlength(ExeParameter, 1024); PExeAddressList := 0; //(记录指针位置列表 积分) 初始化
setlength(ExeAddressList, 1024); PExeAddressPMList := 0; //(记录指针位置列表 参数存储地址) 初始化
setlength(ExeAddressPMList, 1024); PFunctionStack := 0; //(函数符号调用堆栈) 初始化
setlength(FunctionStack, 1024); T_PTrueNow.ifConst := false; //(编译优化常数时 参数性质堆栈) 初始化
T_PTrueOld.ifConst := false;
PT_PTrueNowList := 0;
setlength(T_PTrueNowList, 1024);end;
var
i: integer;
begin
for i := low(b) to high(b) do
begin
ExeAddressCodeIn(b[i]);
end;
end;
procedure TCompile.ExeAddressCodeIn(const sB: string);
var
i: integer;
b: byte;
function hextoint(const cB: char): byte;
begin
case upcase(cB) of
'0'..'9':
result := strtoint(cB);
'A':
result := 10;
'B':
result := 11;
'C':
result := 12;
'D':
result := 13;
'E':
result := 14;
'F':
result := 15;
else
begin
//application.MessageBox('Compile Error!','Error:');
ErrorCode := csTCompile_CompileHexCodeError;
result := 0;
end;
end;
end;
begin
if length(sb) mod 2 = 1 then
//application.MessageBox('Compile Error!','Error:');
ErrorCode := csTCompile_HexMod2_EQ_1_Error;
for i := 1 to length(sB) div 2 do
begin
b := hextoint(sb[i * 2 - 1]) * 16 + hextoint(sb[i * 2]);
ExeAddressCodeIn(b);
end;
end;
procedure TCompile.GetExeAddressCodeInPointerRePm(const PMIndex: integer);
begin
if PExeAddressPMList >= high(ExeAddressPMList) - 1 then
begin
setlength(ExeAddressPMList, 2 * high(ExeAddressPMList) + 2);
end;
ExeAddressPMList[PExeAddressPMList].ExeIndex := PExeAddressCode;
ExeAddressPMList[PExeAddressPMList].PMIndex := PMIndex;
inc(PExeAddressPMList);
end;
function TCompile.GetExeAddressCodeInPointerReCode(): Pointer;
begin
if PExeAddressList >= high(ExeAddressList) - 1 then
begin
setlength(ExeAddressList, 2 * high(ExeAddressList) + 2);
end;
result := @ExeAddressCode[PExeAddressCode];
ExeAddressList[PExeAddressList] := PExeAddressCode;
inc(PExeAddressList);
end;
procedure TCompile.RefreshExeAddressCodeInPointer();
var
i: integer;
pExe: pointer;
iExe: integer;
begin
for i := 0 to PExeAddressList - 1 do
begin
pExe := @ExeAddressCode[ExeAddressList[i]];
iExe := Cardinal(PExe) + 5;
ExeAddressCode[ExeAddressList[i]] := $B8; //mov eax
ExeAddressCode[ExeAddressList[i] + 1] := (byte(iExe mod 256));
ExeAddressCode[ExeAddressList[i] + 2] := (byte((iExe div 256) mod 256));
ExeAddressCode[ExeAddressList[i] + 3] := (byte((iExe div (256 * 256)) mod
256));
ExeAddressCode[ExeAddressList[i] + 4] := (byte((iExe div (256 * 256 * 256))
mod 256)); // mov eax,iExe //return Address
end;
for i := 0 to PExeAddressPMList - 1 do
begin
pExe := @ExeParameter[ExeAddressPMList[i].PMIndex];
iExe := Cardinal(pExe);
ExeAddressCode[ExeAddressPMList[i].ExeIndex] := (byte(iExe mod 256));
ExeAddressCode[ExeAddressPMList[i].ExeIndex + 1] := (byte((iExe div 256) mod
256));
ExeAddressCode[ExeAddressPMList[i].ExeIndex + 2] := (byte((iExe div (256 *
256)) mod 256));
ExeAddressCode[ExeAddressPMList[i].ExeIndex + 3] := (byte((iExe div (256 *
256 * 256)) mod 256)); //return Address
end;
end;function TCompile.GetExeCodeLength(): integer;
begin
result := PExeAddressCode;
end;function TCompile.GetExeParameterLength(): integer;
begin
result := PParameterList * ExendedFormatLength;
end;procedure TCompile.SetRandomize2(const RandomSeed: integer);
begin
RndSeed[0] := RandomSeed;
end;