#include "../BasicCompiler_Common/common.h" #include "Opcode.h" BOOL Calc_Relation_PE(int *type_stack,LONG_PTR *index_stack,int *pStackPointer){ //value[sp-2]<=value[sp-1] int sp; sp=*pStackPointer; int AnswerType; AnswerType=NeutralizationType(type_stack[sp-2],index_stack[sp-2],type_stack[sp-1],index_stack[sp-1]); if(IsRealNumberType(AnswerType)){ ////////////// // 実数演算 ////////////// if(type_stack[sp-1]==DEF_DOUBLE){ //fld qword ptr[esp] op_fld_ptr_esp(DEF_DOUBLE); //add esp,8 op_add_esp(8); } else if(type_stack[sp-1]==DEF_SINGLE){ //fld dword ptr[esp] op_fld_ptr_esp(DEF_SINGLE); //add esp,4 op_add_esp(4); } else if(type_stack[sp-1]==DEF_INT64||type_stack[sp-1]==DEF_QWORD){ //64ビット整数値 //fild qword ptr[esp] op_fld_ptr_esp(DEF_INT64); //add esp,8 op_add_esp(8); } else{ //その他整数型 //fild dword ptr[esp] op_fld_ptr_esp(DEF_LONG); //add esp,4 op_add_esp(4); } if(type_stack[sp-2]==DEF_DOUBLE){ //fld qword ptr[esp] op_fld_ptr_esp(DEF_DOUBLE); //add esp,4 op_add_esp(4); } else if(type_stack[sp-2]==DEF_SINGLE){ //fld dword ptr[esp] op_fld_ptr_esp(DEF_SINGLE); } else if(type_stack[sp-2]==DEF_INT64||type_stack[sp-2]==DEF_QWORD){ //64ビット整数値 //fild qword ptr[esp] op_fld_ptr_esp(DEF_INT64); //add esp,4 op_add_esp(4); } else{ //その他整数型 //fild dword ptr[esp] op_fld_ptr_esp(DEF_LONG); } //fcompp OpBuffer[obp++]=(char)0xDE; OpBuffer[obp++]=(char)0xD9; //fnstsw ax OpBuffer[obp++]=(char)0xDF; OpBuffer[obp++]=(char)0xE0; //mov ecx,1 OpBuffer[obp++]=(char)0xB9; *((long *)(OpBuffer+obp))=1; obp+=sizeof(long); //test ah,41h OpBuffer[obp++]=(char)0xF6; OpBuffer[obp++]=(char)0xC4; OpBuffer[obp++]=(char)0x41; //jne 5 OpBuffer[obp++]=(char)0x75; OpBuffer[obp++]=(char)0x02; //xor ecx,ecx(ecxを0にする) op_zero_reg(REG_ECX); //mov dword ptr[esp],ecx OpBuffer[obp++]=(char)0x89; OpBuffer[obp++]=(char)0x0C; OpBuffer[obp++]=(char)0x24; } else if(Is64Type(AnswerType)){ //////////////////// // 64ビット整数演算 //////////////////// int TrueSchedule, FalseSchedule1, FalseSchedule2; // 第1項 <= 第2項 //第1項 edx:eax //第2項 ecx:ebx GetStackData_ToRegister(type_stack,sp); //cmp edx,ecx OpBuffer[obp++]=(char)0x3B; OpBuffer[obp++]=(char)0xD1; if(IsSignedType(type_stack[sp-2])==0&&IsSignedType(type_stack[sp-1])==0){ //符号なし演算 //ja FalseSchedule1(偽へジャンプ) OpBuffer[obp++]=(char)0x77; } else{ //符号あり演算 //jg FalseSchedule1(偽へジャンプ) OpBuffer[obp++]=(char)0x7F; } FalseSchedule1=obp; obp++; if(IsSignedType(type_stack[sp-2])==0&&IsSignedType(type_stack[sp-1])==0){ //符号なし演算 //jb TrueSchedule(真へジャンプ) OpBuffer[obp++]=(char)0x72; } else{ //符号あり演算 //jl TrueSchedule(真へジャンプ) OpBuffer[obp++]=(char)0x7C; } TrueSchedule=obp; obp++; //cmp eax,ebx OpBuffer[obp++]=(char)0x3B; OpBuffer[obp++]=(char)0xC3; //ja FalseSchedule2(偽へジャンプ) OpBuffer[obp++]=(char)0x77; FalseSchedule2=obp; obp++; //TrueScheduleのジャンプ先の設定 OpBuffer[TrueSchedule]=obp-(TrueSchedule+1); //mov eax,1 OpBuffer[obp++]=(char)0xB8; *((long *)(OpBuffer+obp))=1; obp+=sizeof(long); //jmp 2(演算終了位置へジャンプ) OpBuffer[obp++]=(char)0xEB; OpBuffer[obp++]=(char)0x02; //FalseScheduleのジャンプ先の設定 OpBuffer[FalseSchedule1]=obp-(FalseSchedule1+1); OpBuffer[FalseSchedule2]=obp-(FalseSchedule2+1); //xor eax,eax(eaxを0にする) op_zero_reg(REG_EAX); //push eax op_push(REG_EAX); } else{ //////////////////// // 32ビット整数演算 //////////////////// //pop ebx op_pop(REG_EBX); //pop eax op_pop(REG_EAX); //sub esp,4 op_sub_esp(4); //mov ecx,1 OpBuffer[obp++]=(char)0xB9; *((long *)(OpBuffer+obp))=1; obp+=sizeof(long); //cmp eax,ebx OpBuffer[obp++]=(char)0x3B; OpBuffer[obp++]=(char)0xC3; if(IsSignedType(type_stack[sp-2])==0&&IsSignedType(type_stack[sp-1])==0){ //符号なし演算 //jbe 5(次のmovを飛び越す) OpBuffer[obp++]=(char)0x76; OpBuffer[obp++]=(char)0x05; } else{ //符号あり演算 //jle 5(次のmovを飛び越す) OpBuffer[obp++]=(char)0x7E; OpBuffer[obp++]=(char)0x05; } //mov ecx,0 OpBuffer[obp++]=(char)0xB9; *((long *)(OpBuffer+obp))=0; obp+=sizeof(long); //mov dword ptr[esp],ecx OpBuffer[obp++]=(char)0x89; OpBuffer[obp++]=(char)0x0C; OpBuffer[obp++]=(char)0x24; } sp--; type_stack[sp-1]=DEF_BOOLEAN; *pStackPointer=sp; return 1; } BOOL Calc_Relation_QE(int *type_stack,LONG_PTR *index_stack,int *pStackPointer){ //value[sp-2]>=value[sp-1] int sp; sp=*pStackPointer; int AnswerType; AnswerType=NeutralizationType(type_stack[sp-2],index_stack[sp-2],type_stack[sp-1],index_stack[sp-1]); if(IsRealNumberType(AnswerType)){ //浮動小数点演算 if(type_stack[sp-1]==DEF_DOUBLE){ //fld qword ptr[esp] op_fld_ptr_esp(DEF_DOUBLE); //add esp,8 op_add_esp(8); } else if(type_stack[sp-1]==DEF_SINGLE){ //fld dword ptr[esp] op_fld_ptr_esp(DEF_SINGLE); //add esp,4 op_add_esp(4); } else if(type_stack[sp-1]==DEF_INT64||type_stack[sp-1]==DEF_QWORD){ //64ビット整数値 //fild qword ptr[esp] op_fld_ptr_esp(DEF_INT64); //add esp,8 op_add_esp(8); } else{ //その他整数型 //fild dword ptr[esp] op_fld_ptr_esp(DEF_LONG); //add esp,4 op_add_esp(4); } if(type_stack[sp-2]==DEF_DOUBLE){ //fld qword ptr[esp] op_fld_ptr_esp(DEF_DOUBLE); //add esp,4 op_add_esp(4); } else if(type_stack[sp-2]==DEF_SINGLE){ //fld dword ptr[esp] op_fld_ptr_esp(DEF_SINGLE); } else if(type_stack[sp-2]==DEF_INT64||type_stack[sp-2]==DEF_QWORD){ //64ビット整数値 //fild qword ptr[esp] op_fld_ptr_esp(DEF_INT64); //add esp,4 op_add_esp(4); } else{ //その他整数型 //fild dword ptr[esp] op_fld_ptr_esp(DEF_LONG); } //fcompp OpBuffer[obp++]=(char)0xDE; OpBuffer[obp++]=(char)0xD9; //fnstsw ax OpBuffer[obp++]=(char)0xDF; OpBuffer[obp++]=(char)0xE0; //mov ecx,1 OpBuffer[obp++]=(char)0xB9; *((long *)(OpBuffer+obp))=1; obp+=sizeof(long); //test ah,1 OpBuffer[obp++]=(char)0xF6; OpBuffer[obp++]=(char)0xC4; OpBuffer[obp++]=(char)0x01; //je 5 OpBuffer[obp++]=(char)0x74; OpBuffer[obp++]=(char)0x05; //mov ecx,0 OpBuffer[obp++]=(char)0xB9; *((long *)(OpBuffer+obp))=0; obp+=sizeof(long); //mov dword ptr[esp],ecx OpBuffer[obp++]=(char)0x89; OpBuffer[obp++]=(char)0x0C; OpBuffer[obp++]=(char)0x24; } else if(Is64Type(AnswerType)){ //////////////////// // 64ビット整数演算 //////////////////// int TrueSchedule, FalseSchedule1, FalseSchedule2; // 第1項 >= 第2項 //第1項 edx:eax //第2項 ecx:ebx GetStackData_ToRegister(type_stack,sp); //cmp edx,ecx OpBuffer[obp++]=(char)0x3B; OpBuffer[obp++]=(char)0xD1; if(IsSignedType(AnswerType)){ //符号あり演算 //jl FalseSchedule1(偽へジャンプ) OpBuffer[obp++]=(char)0x7C; } else{ //符号なし演算 //jb FalseSchedule1(偽へジャンプ) OpBuffer[obp++]=(char)0x72; } FalseSchedule1=obp; obp++; if(IsSignedType(AnswerType)){ //符号あり演算 //jg TrueSchedule(真へジャンプ) OpBuffer[obp++]=(char)0x7F; } else{ //符号なし演算 //ja TrueSchedule(真へジャンプ) OpBuffer[obp++]=(char)0x77; } TrueSchedule=obp; obp++; //cmp eax,ebx OpBuffer[obp++]=(char)0x3B; OpBuffer[obp++]=(char)0xC3; //jb FalseSchedule2(偽へジャンプ) OpBuffer[obp++]=(char)0x72; FalseSchedule2=obp; obp++; //TrueScheduleのジャンプ先の設定 OpBuffer[TrueSchedule]=obp-(TrueSchedule+1); //mov eax,1 OpBuffer[obp++]=(char)0xB8; *((long *)(OpBuffer+obp))=1; obp+=sizeof(long); //jmp 2(演算終了位置へジャンプ) OpBuffer[obp++]=(char)0xEB; OpBuffer[obp++]=(char)0x02; //FalseScheduleのジャンプ先の設定 OpBuffer[FalseSchedule1]=obp-(FalseSchedule1+1); OpBuffer[FalseSchedule2]=obp-(FalseSchedule2+1); //xor eax,eax(eaxを0にする) op_zero_reg(REG_EAX); //push eax op_push(REG_EAX); } else{ //////////////////// // 32ビット整数演算 //////////////////// //pop ebx op_pop(REG_EBX); //pop eax op_pop(REG_EAX); //sub esp,4 op_sub_esp(4); //mov ecx,1 OpBuffer[obp++]=(char)0xB9; *((long *)(OpBuffer+obp))=1; obp+=sizeof(long); //cmp eax,ebx OpBuffer[obp++]=(char)0x3B; OpBuffer[obp++]=(char)0xC3; if(IsSignedType(AnswerType)){ //符号あり演算 //jge 5(次のmovを飛び越す)符号有り OpBuffer[obp++]=(char)0x7D; OpBuffer[obp++]=(char)0x05; } else{ //符号なし演算 //jae 5(次のmovを飛び越す) OpBuffer[obp++]=(char)0x73; OpBuffer[obp++]=(char)0x05; } //mov ecx,0 OpBuffer[obp++]=(char)0xB9; *((long *)(OpBuffer+obp))=0; obp+=sizeof(long); //mov dword ptr[esp],ecx OpBuffer[obp++]=(char)0x89; OpBuffer[obp++]=(char)0x0C; OpBuffer[obp++]=(char)0x24; } sp--; type_stack[sp-1]=DEF_BOOLEAN; *pStackPointer=sp; return 1; } BOOL Calc_Relation_P(int *type_stack,LONG_PTR *index_stack,int *pStackPointer){ //value[sp-2]value[sp-1] int sp; sp=*pStackPointer; int AnswerType; AnswerType=NeutralizationType(type_stack[sp-2],index_stack[sp-2],type_stack[sp-1],index_stack[sp-1]); if(IsRealNumberType(AnswerType)){ ////////////// // 実数演算 ////////////// if(type_stack[sp-1]==DEF_DOUBLE){ //fld qword ptr[esp] op_fld_ptr_esp(DEF_DOUBLE); //add esp,8 op_add_esp(8); } else if(type_stack[sp-1]==DEF_SINGLE){ //fld dword ptr[esp] op_fld_ptr_esp(DEF_SINGLE); //add esp,4 op_add_esp(4); } else if(type_stack[sp-1]==DEF_INT64||type_stack[sp-1]==DEF_QWORD){ //64ビット整数値 //fild qword ptr[esp] op_fld_ptr_esp(DEF_INT64); //add esp,8 op_add_esp(8); } else{ //Long、DWord //fild dword ptr[esp] op_fld_ptr_esp(DEF_LONG); //add esp,4 op_add_esp(4); } if(type_stack[sp-2]==DEF_DOUBLE){ //fld qword ptr[esp] op_fld_ptr_esp(DEF_DOUBLE); //add esp,4 op_add_esp(4); } else if(type_stack[sp-2]==DEF_SINGLE){ //fld dword ptr[esp] op_fld_ptr_esp(DEF_SINGLE); } else if(type_stack[sp-2]==DEF_INT64||type_stack[sp-2]==DEF_QWORD){ //64ビット整数値 //fild qword ptr[esp] op_fld_ptr_esp(DEF_INT64); //add esp,4 op_add_esp(4); } else{ //Long、DWord //fild dword ptr[esp] op_fld_ptr_esp(DEF_LONG); } //fcompp OpBuffer[obp++]=(char)0xDE; OpBuffer[obp++]=(char)0xD9; //fnstsw ax OpBuffer[obp++]=(char)0xDF; OpBuffer[obp++]=(char)0xE0; //mov ecx,1 OpBuffer[obp++]=(char)0xB9; *((long *)(OpBuffer+obp))=1; obp+=sizeof(long); //test ah,41 OpBuffer[obp++]=(char)0xF6; OpBuffer[obp++]=(char)0xC4; OpBuffer[obp++]=(char)0x41; //je 5 OpBuffer[obp++]=(char)0x74; OpBuffer[obp++]=(char)0x05; //mov ecx,0 OpBuffer[obp++]=(char)0xB9; *((long *)(OpBuffer+obp))=0; obp+=sizeof(long); //mov dword ptr[esp],ecx OpBuffer[obp++]=(char)0x89; OpBuffer[obp++]=(char)0x0C; OpBuffer[obp++]=(char)0x24; } else if(Is64Type(AnswerType)){ //////////////////// // 64ビット整数演算 //////////////////// int FalseSchedule, TrueSchedule1, TrueSchedule2; // 第1項 > 第2項 //第1項 edx:eax //第2項 ecx:ebx GetStackData_ToRegister(type_stack,sp); //cmp edx,ecx OpBuffer[obp++]=(char)0x3B; OpBuffer[obp++]=(char)0xD1; if(IsSignedType(AnswerType)){ //符号有り //jg TrueSchedule1(真へジャンプ) OpBuffer[obp++]=(char)0x7F; } else{ //符号無し //ja TrueSchedule1(真へジャンプ) OpBuffer[obp++]=(char)0x77; } TrueSchedule1=obp; obp++; if(IsSignedType(AnswerType)){ //符号有り //jl FalseSchedule(偽へジャンプ) OpBuffer[obp++]=(char)0x7C; } else{ //符号無し //jb FalseSchedule(偽へジャンプ) OpBuffer[obp++]=(char)0x72; } FalseSchedule=obp; obp++; //cmp eax,ebx OpBuffer[obp++]=(char)0x3B; OpBuffer[obp++]=(char)0xC3; //ja TrueSchedule2(真へジャンプ) OpBuffer[obp++]=(char)0x77; TrueSchedule2=obp; obp++; //FalseScheduleのジャンプ先の設定 OpBuffer[FalseSchedule]=obp-(FalseSchedule+1); //xor eax,eax(eaxを0にする) op_zero_reg(REG_EAX); //jmp 5(演算終了位置へジャンプ) OpBuffer[obp++]=(char)0xEB; OpBuffer[obp++]=(char)0x05; //TrueScheduleのジャンプ先の設定 OpBuffer[TrueSchedule1]=obp-(TrueSchedule1+1); OpBuffer[TrueSchedule2]=obp-(TrueSchedule2+1); //mov eax,1 OpBuffer[obp++]=(char)0xB8; *((long *)(OpBuffer+obp))=1; obp+=sizeof(long); //push eax op_push(REG_EAX); } else{ //////////////////// // 32ビット整数演算 //////////////////// //pop ebx op_pop(REG_EBX); //pop eax op_pop(REG_EAX); //sub esp,4 op_sub_esp(4); //mov ecx,1 OpBuffer[obp++]=(char)0xB9; *((long *)(OpBuffer+obp))=1; obp+=sizeof(long); //cmp eax,ebx OpBuffer[obp++]=(char)0x3B; OpBuffer[obp++]=(char)0xC3; if(IsSignedType(AnswerType)){ //jg 5(次のmovを飛び越す) OpBuffer[obp++]=(char)0x7F; OpBuffer[obp++]=(char)0x05; } else{ //ja 5(次のmovを飛び越す) OpBuffer[obp++]=(char)0x77; OpBuffer[obp++]=(char)0x05; } //mov ecx,0 OpBuffer[obp++]=(char)0xB9; *((long *)(OpBuffer+obp))=0; obp+=sizeof(long); //mov dword ptr[esp],ecx OpBuffer[obp++]=(char)0x89; OpBuffer[obp++]=(char)0x0C; OpBuffer[obp++]=(char)0x24; } sp--; type_stack[sp-1]=DEF_BOOLEAN; *pStackPointer=sp; return 1; } BOOL Calc_Relation_NotEqual(int *type,int *pStackPointer){ //value[sp-2]<>value[sp-1] int sp; sp=*pStackPointer; if(type[sp-2]==DEF_DOUBLE||type[sp-2]==DEF_SINGLE|| type[sp-1]==DEF_DOUBLE||type[sp-1]==DEF_SINGLE){ ////////////// // 実数演算 ////////////// if(type[sp-1]==DEF_DOUBLE){ //fld qword ptr[esp] op_fld_ptr_esp(DEF_DOUBLE); //add esp,8 op_add_esp(8); } else if(type[sp-1]==DEF_SINGLE){ //fld dword ptr[esp] op_fld_ptr_esp(DEF_SINGLE); //add esp,4 op_add_esp(4); } else if(type[sp-1]==DEF_INT64||type[sp-1]==DEF_QWORD){ //64ビット整数値 //fild qword ptr[esp] op_fld_ptr_esp(DEF_INT64); //add esp,8 op_add_esp(8); } else{ //Long、DWord //fild dword ptr[esp] op_fld_ptr_esp(DEF_LONG); //add esp,4 op_add_esp(4); } if(type[sp-2]==DEF_DOUBLE){ //fld qword ptr[esp] op_fld_ptr_esp(DEF_DOUBLE); //add esp,4 op_add_esp(4); } else if(type[sp-2]==DEF_SINGLE){ //fld dword ptr[esp] op_fld_ptr_esp(DEF_SINGLE); } else if(type[sp-2]==DEF_INT64||type[sp-2]==DEF_QWORD){ //64ビット整数値 //fild qword ptr[esp] op_fld_ptr_esp(DEF_INT64); //add esp,4 op_add_esp(4); } else{ //Long、DWord //fild dword ptr[esp] op_fld_ptr_esp(DEF_LONG); } //fcompp OpBuffer[obp++]=(char)0xDE; OpBuffer[obp++]=(char)0xD9; //fnstsw ax OpBuffer[obp++]=(char)0xDF; OpBuffer[obp++]=(char)0xE0; //mov ecx,1 OpBuffer[obp++]=(char)0xB9; *((long *)(OpBuffer+obp))=1; obp+=sizeof(long); //test ah,40 OpBuffer[obp++]=(char)0xF6; OpBuffer[obp++]=(char)0xC4; OpBuffer[obp++]=(char)0x40; //je 5 OpBuffer[obp++]=(char)0x74; OpBuffer[obp++]=(char)0x05; //mov ecx,0 OpBuffer[obp++]=(char)0xB9; *((long *)(OpBuffer+obp))=0; obp+=sizeof(long); //mov dword ptr[esp],ecx OpBuffer[obp++]=(char)0x89; OpBuffer[obp++]=(char)0x0C; OpBuffer[obp++]=(char)0x24; } else if(type[sp-2]==DEF_INT64||type[sp-2]==DEF_QWORD|| type[sp-1]==DEF_INT64||type[sp-1]==DEF_QWORD){ //////////////////// // 64ビット整数演算 //////////////////// int TrueSchedule1, TrueSchedule2; // 第1項 <> 第2項 //第1項 edx:eax //第2項 ecx:ebx GetStackData_ToRegister(type,sp); //cmp eax,ebx OpBuffer[obp++]=(char)0x3B; OpBuffer[obp++]=(char)0xC3; //jnz TrueSchedule1(真へジャンプ) OpBuffer[obp++]=(char)0x75; TrueSchedule1=obp; obp++; //cmp edx,ecx OpBuffer[obp++]=(char)0x3B; OpBuffer[obp++]=(char)0xD1; //jnz TrueSchedule2(真へジャンプ) OpBuffer[obp++]=(char)0x75; TrueSchedule2=obp; obp++; //xor eax,eax(eaxを0にする) op_zero_reg(REG_EAX); //jmp 5(演算終了位置へジャンプ) OpBuffer[obp++]=(char)0xEB; OpBuffer[obp++]=(char)0x05; //TrueScheduleのジャンプ先の設定 OpBuffer[TrueSchedule1]=obp-(TrueSchedule1+1); OpBuffer[TrueSchedule2]=obp-(TrueSchedule2+1); //mov eax,1 OpBuffer[obp++]=(char)0xB8; *((long *)(OpBuffer+obp))=1; obp+=sizeof(long); //push eax op_push(REG_EAX); } else{ //////////////////// // 32ビット整数演算 //////////////////// //pop eax op_pop(REG_EAX); //pop ebx op_pop(REG_EBX); //sub esp,4 op_sub_esp(4); //xor eax,ebx OpBuffer[obp++]=(char)0x33; OpBuffer[obp++]=(char)0xC3; //jz 5(次のmovを飛び越す) OpBuffer[obp++]=(char)0x74; OpBuffer[obp++]=(char)0x05; //mov eax,1 OpBuffer[obp++]=(char)0xB8; *((long *)(OpBuffer+obp))=1; obp+=sizeof(long); //mov dword ptr[esp],eax OpBuffer[obp++]=(char)0x89; OpBuffer[obp++]=(char)0x04; OpBuffer[obp++]=(char)0x24; } sp--; type[sp-1]=DEF_BOOLEAN; *pStackPointer=sp; return 1; } BOOL Calc_Relation_Equal(int *type,int *pStackPointer){ //value[sp-2]=value[sp-1] int sp; sp=*pStackPointer; if(type[sp-2]==DEF_DOUBLE||type[sp-2]==DEF_SINGLE|| type[sp-1]==DEF_DOUBLE||type[sp-1]==DEF_SINGLE){ ////////////// // 実数演算 ////////////// if(type[sp-1]==DEF_DOUBLE){ //fld qword ptr[esp] op_fld_ptr_esp(DEF_DOUBLE); //add esp,8 op_add_esp(8); } else if(type[sp-1]==DEF_SINGLE){ //fld dword ptr[esp] op_fld_ptr_esp(DEF_SINGLE); //add esp,4 op_add_esp(4); } else if(type[sp-1]==DEF_INT64||type[sp-1]==DEF_QWORD){ //64ビット整数値 //fild qword ptr[esp] op_fld_ptr_esp(DEF_INT64); //add esp,8 op_add_esp(8); } else{ //Long、DWord //fild dword ptr[esp] op_fld_ptr_esp(DEF_LONG); //add esp,4 op_add_esp(4); } if(type[sp-2]==DEF_DOUBLE){ //fld qword ptr[esp] op_fld_ptr_esp(DEF_DOUBLE); //add esp,4 op_add_esp(4); } else if(type[sp-2]==DEF_SINGLE){ //fld dword ptr[esp] op_fld_ptr_esp(DEF_SINGLE); } else if(type[sp-2]==DEF_INT64||type[sp-2]==DEF_QWORD){ //64ビット整数値 //fild qword ptr[esp] op_fld_ptr_esp(DEF_INT64); //add esp,4 op_add_esp(4); } else{ //Long、DWord //fild dword ptr[esp] op_fld_ptr_esp(DEF_LONG); } //fcompp OpBuffer[obp++]=(char)0xDE; OpBuffer[obp++]=(char)0xD9; //fnstsw ax OpBuffer[obp++]=(char)0xDF; OpBuffer[obp++]=(char)0xE0; //mov ecx,1 OpBuffer[obp++]=(char)0xB9; *((long *)(OpBuffer+obp))=1; obp+=sizeof(long); //test ah,40 OpBuffer[obp++]=(char)0xF6; OpBuffer[obp++]=(char)0xC4; OpBuffer[obp++]=(char)0x40; //jne 5 OpBuffer[obp++]=(char)0x75; OpBuffer[obp++]=(char)0x05; //mov ecx,0 OpBuffer[obp++]=(char)0xB9; *((long *)(OpBuffer+obp))=0; obp+=sizeof(long); //mov dword ptr[esp],ecx OpBuffer[obp++]=(char)0x89; OpBuffer[obp++]=(char)0x0C; OpBuffer[obp++]=(char)0x24; } else if(type[sp-2]==DEF_INT64||type[sp-2]==DEF_QWORD|| type[sp-1]==DEF_INT64||type[sp-1]==DEF_QWORD){ //////////////////// // 64ビット整数演算 //////////////////// int FalseSchedule1, FalseSchedule2; // 第1項 == 第2項 //第1項 edx:eax //第2項 ecx:ebx GetStackData_ToRegister(type,sp); //cmp eax,ebx OpBuffer[obp++]=(char)0x3B; OpBuffer[obp++]=(char)0xC3; //jnz FalseSchedule1(偽へジャンプ) OpBuffer[obp++]=(char)0x75; FalseSchedule1=obp; obp++; //cmp edx,ecx OpBuffer[obp++]=(char)0x3B; OpBuffer[obp++]=(char)0xD1; //jnz FalseSchedule2(偽へジャンプ) OpBuffer[obp++]=(char)0x75; FalseSchedule2=obp; obp++; //mov eax,1 OpBuffer[obp++]=(char)0xB8; *((long *)(OpBuffer+obp))=1; obp+=sizeof(long); //jmp 2(演算終了位置へジャンプ) OpBuffer[obp++]=(char)0xEB; OpBuffer[obp++]=(char)0x02; //FalseScheduleのジャンプ先の設定 OpBuffer[FalseSchedule1]=obp-(FalseSchedule1+1); OpBuffer[FalseSchedule2]=obp-(FalseSchedule2+1); //xor eax,eax(eaxを0にする) op_zero_reg(REG_EAX); //push eax op_push(REG_EAX); } else{ //////////////////// // 32ビット整数演算 //////////////////// //pop eax op_pop(REG_EAX); //pop ebx op_pop(REG_EBX); //sub esp,4 op_sub_esp(4); //xor eax,ebx OpBuffer[obp++]=(char)0x33; OpBuffer[obp++]=(char)0xC3; //jnz 4(次のxorとjmpを飛び越す) OpBuffer[obp++]=(char)0x74; OpBuffer[obp++]=(char)0x04; //xor eax,eax OpBuffer[obp++]=(char)0x33; OpBuffer[obp++]=(char)0xC0; //jmp 5 OpBuffer[obp++]=(char)0xEB; OpBuffer[obp++]=(char)0x05; //mov eax,1 OpBuffer[obp++]=(char)0xB8; *((long *)(OpBuffer+obp))=1; obp+=sizeof(long); //mov dword ptr[esp],eax OpBuffer[obp++]=(char)0x89; OpBuffer[obp++]=(char)0x04; OpBuffer[obp++]=(char)0x24; } sp--; type[sp-1]=DEF_BOOLEAN; *pStackPointer=sp; return 1; }