Index: trunk/abdev/BasicCompiler32/CodeGenerator.cpp
===================================================================
--- trunk/abdev/BasicCompiler32/CodeGenerator.cpp	(revision 229)
+++ trunk/abdev/BasicCompiler32/CodeGenerator.cpp	(revision 230)
@@ -300,4 +300,21 @@
 
 //////////////////////////////////
+// lea関連
+//////////////////////////////////
+
+void CodeGenerator::op_lea_RM( int reg, int base_reg, long offset, char mod, Schedule::Type scheduleType )
+{
+	//16ビット演算の命令プリフィックス
+	char op_prefix=0;
+
+	//オペコード
+	char opcode=(char)0x8D;
+
+	__op_format( op_prefix, opcode, 0, reg, base_reg, offset, mod, scheduleType );
+}
+
+
+
+//////////////////////////////////
 // インクリメント・デクリメント
 //////////////////////////////////
@@ -338,4 +355,11 @@
 	pNativeCode->Put( (char)(0xC0|REGISTER_OPERAND(reg)) );
 	pNativeCode->Put( cValue );
+}
+void CodeGenerator::op_add_RV( int reg, long offset, Schedule::Type scheduleType )
+{
+	// add reg,offset
+	pNativeCode->Put( (char)0x81 );
+	pNativeCode->Put( (char)(0xC0|REGISTER_OPERAND(reg)) );
+	pNativeCode->Put( offset, scheduleType );
 }
 void CodeGenerator::op_add_RR( int reg1, int reg2 )
Index: trunk/abdev/BasicCompiler32/Compile_Set_Var.cpp
===================================================================
--- trunk/abdev/BasicCompiler32/Compile_Set_Var.cpp	(revision 229)
+++ trunk/abdev/BasicCompiler32/Compile_Set_Var.cpp	(revision 230)
@@ -95,15 +95,9 @@
 		if(pRelativeVar->bOffsetOffset){
 			//fstp ptr[ecx+offset]
-			compiler.codeGenerator.op_fstp_base_offset(VarType,REG_ECX,(int)pRelativeVar->offset);
-			obp-=sizeof(long);
-			pobj_GlobalVarSchedule->add();
-			obp+=sizeof(long);
+			compiler.codeGenerator.op_fstp_base_offset(VarType,REG_ECX,(int)pRelativeVar->offset, Schedule::GlobalVar );
 		}
 		else{
 			//mov ecx,offset
-			compiler.codeGenerator.op_mov_RV(REG_ECX,(int)pRelativeVar->offset);
-			obp-=sizeof(long);
-			pobj_GlobalVarSchedule->add();
-			obp+=sizeof(long);
+			compiler.codeGenerator.op_mov_RV(REG_ECX,(int)pRelativeVar->offset, Schedule::GlobalVar );
 
 			//fstp ptr[ecx]
@@ -114,13 +108,10 @@
 		if(pRelativeVar->bOffsetOffset){
 			//add ecx,qword ptr[offset]
-			compiler.codeGenerator.op_add_RM(sizeof(long),REG_ECX,REG_NON,(int)pRelativeVar->offset,MOD_DISP32);
+			compiler.codeGenerator.op_add_RM(sizeof(long),REG_ECX,REG_NON,(int)pRelativeVar->offset,MOD_DISP32, Schedule::GlobalVar );
 		}
 		else{
 			//mov ecx,qword ptr[offset]
-			compiler.codeGenerator.op_mov_RM(sizeof(long),REG_ECX,REG_NON,(int)pRelativeVar->offset,MOD_DISP32);
-		}
-		obp-=sizeof(long);
-		pobj_GlobalVarSchedule->add();
-		obp+=sizeof(long);
+			compiler.codeGenerator.op_mov_RM(sizeof(long),REG_ECX,REG_NON,(int)pRelativeVar->offset,MOD_DISP32, Schedule::GlobalVar );
+		}
 
 		goto directmem;
@@ -129,26 +120,20 @@
 		if(pRelativeVar->bOffsetOffset){
 			//fstp ptr[ebp+ecx+offset]
-			compiler.codeGenerator.op_fstp_base_offset_ex(VarType,REG_EBP,REG_ECX,(int)pRelativeVar->offset,USE_OFFSET);
+			compiler.codeGenerator.op_fstp_base_offset_ex(VarType,REG_EBP,REG_ECX,(int)pRelativeVar->offset,USE_OFFSET, Schedule::LocalVar );
 		}
 		else{
 			//fstp ptr[ebp+offset]
-			compiler.codeGenerator.op_fstp_base_offset(VarType,REG_EBP,(int)pRelativeVar->offset);
-		}
-		obp-=sizeof(long);
-		AddLocalVarAddrSchedule();
-		obp+=sizeof(long);
+			compiler.codeGenerator.op_fstp_base_offset(VarType,REG_EBP,(int)pRelativeVar->offset, Schedule::LocalVar );
+		}
 	}
 	else if(pRelativeVar->dwKind==VAR_REFLOCAL){
 		if(pRelativeVar->bOffsetOffset){
 			//add ecx,qword ptr[ebp+offset]
-			compiler.codeGenerator.op_add_RM(sizeof(long),REG_ECX,REG_EBP,(int)pRelativeVar->offset,MOD_BASE_DISP32);
+			compiler.codeGenerator.op_add_RM(sizeof(long),REG_ECX,REG_EBP,(int)pRelativeVar->offset,MOD_BASE_DISP32, Schedule::LocalVar );
 		}
 		else{
 			//mov ecx,qword ptr[ebp+offset]
-			compiler.codeGenerator.op_mov_RM(sizeof(long),REG_ECX,REG_EBP,(int)pRelativeVar->offset,MOD_BASE_DISP32);
-		}
-		obp-=sizeof(long);
-		AddLocalVarAddrSchedule();
-		obp+=sizeof(long);
+			compiler.codeGenerator.op_mov_RM(sizeof(long),REG_ECX,REG_EBP,(int)pRelativeVar->offset,MOD_BASE_DISP32, Schedule::LocalVar );
+		}
 
 		goto directmem;
@@ -328,13 +313,10 @@
 		if(pRelative->bOffsetOffset){
 			//mov ptr[ecx+offset],eax/ax/al
-			compiler.codeGenerator.op_mov_MR(varSize,REG_EAX,REG_ECX,(int)pRelative->offset,MOD_BASE_DISP32);
+			compiler.codeGenerator.op_mov_MR(varSize,REG_EAX,REG_ECX,(int)pRelative->offset,MOD_BASE_DISP32, Schedule::GlobalVar );
 		}
 		else{
 			//mov ptr[offset],eax/ax/al
-			compiler.codeGenerator.op_mov_MR(varSize,REG_EAX,0,(int)pRelative->offset,MOD_DISP32);
-		}
-		obp-=sizeof(long);
-		pobj_GlobalVarSchedule->add();
-		obp+=sizeof(long);
+			compiler.codeGenerator.op_mov_MR(varSize,REG_EAX,0,(int)pRelative->offset,MOD_DISP32, Schedule::GlobalVar );
+		}
 	}
 	else if(pRelative->dwKind==VAR_REFGLOBAL){
@@ -344,13 +326,10 @@
 		if(pRelative->bOffsetOffset){
 			//add ecx,qword ptr[offset]
-			compiler.codeGenerator.op_add_RM(varSize,REG_ECX,REG_NON,(int)pRelative->offset,MOD_DISP32);
+			compiler.codeGenerator.op_add_RM(varSize,REG_ECX,REG_NON,(int)pRelative->offset,MOD_DISP32, Schedule::GlobalVar );
 		}
 		else{
 			//mov ecx,qword ptr[offset]
-			compiler.codeGenerator.op_mov_RM(varSize,REG_ECX,REG_NON,(int)pRelative->offset,MOD_DISP32);
-		}
-		obp-=sizeof(long);
-		pobj_GlobalVarSchedule->add();
-		obp+=sizeof(long);
+			compiler.codeGenerator.op_mov_RM(varSize,REG_ECX,REG_NON,(int)pRelative->offset,MOD_DISP32, Schedule::GlobalVar );
+		}
 
 		goto directmem;
@@ -359,26 +338,20 @@
 		if(pRelative->bOffsetOffset){
 			//mov ptr[ebp+ecx+offset],eax/ax/al
-			compiler.codeGenerator.op_mov_MR_ex(varSize,REG_EAX,REG_EBP,REG_ECX,(int)pRelative->offset,USE_OFFSET);
+			compiler.codeGenerator.op_mov_MR_ex(varSize,REG_EAX,REG_EBP,REG_ECX,(int)pRelative->offset,USE_OFFSET, Schedule::LocalVar );
 		}
 		else{
 			//mov ptr[ebp+offset],eax/ax/al
-			compiler.codeGenerator.op_mov_MR(varSize,REG_EAX,REG_EBP,(int)pRelative->offset,MOD_BASE_DISP32);
-		}
-		obp-=sizeof(long);
-		AddLocalVarAddrSchedule();
-		obp+=sizeof(long);
+			compiler.codeGenerator.op_mov_MR(varSize,REG_EAX,REG_EBP,(int)pRelative->offset,MOD_BASE_DISP32, Schedule::LocalVar );
+		}
 	}
 	else if(pRelative->dwKind==VAR_REFLOCAL){
 		if(pRelative->bOffsetOffset){
 			//add ecx,ptr[ebp+offset]
-			compiler.codeGenerator.op_add_RM(PTR_SIZE,REG_ECX,REG_EBP,(int)pRelative->offset,MOD_BASE_DISP32);
+			compiler.codeGenerator.op_add_RM(PTR_SIZE,REG_ECX,REG_EBP,(int)pRelative->offset,MOD_BASE_DISP32, Schedule::LocalVar );
 		}
 		else{
 			//mov ecx,ptr[ebp+offset]
-			compiler.codeGenerator.op_mov_RM(PTR_SIZE,REG_ECX,REG_EBP,(int)pRelative->offset,MOD_BASE_DISP32);
-		}
-		obp-=sizeof(long);
-		AddLocalVarAddrSchedule();
-		obp+=sizeof(long);
+			compiler.codeGenerator.op_mov_RM(PTR_SIZE,REG_ECX,REG_EBP,(int)pRelative->offset,MOD_BASE_DISP32, Schedule::LocalVar );
+		}
 
 		goto directmem;
Index: trunk/abdev/BasicCompiler32/Compile_Var.cpp
===================================================================
--- trunk/abdev/BasicCompiler32/Compile_Var.cpp	(revision 229)
+++ trunk/abdev/BasicCompiler32/Compile_Var.cpp	(revision 230)
@@ -857,8 +857,5 @@
 
 			//mov dword ptr[offset],eax
-			OpBuffer[obp++]=(char)0xA3;
-			*((long *)(OpBuffer+obp))=offset;
-			pobj_GlobalVarSchedule->add();
-			obp+=sizeof(long);
+			compiler.codeGenerator.op_mov_MR( sizeof(long), REG_EAX, 0, offset, MOD_DISP32, Schedule::GlobalVar );
 		}
 		else{
@@ -1250,16 +1247,9 @@
 		if(pRelativeVar->bOffsetOffset){
 			//lea eax,dword ptr[ecx+offset]
-			OpBuffer[obp++]=(char)0x8D;
-			OpBuffer[obp++]=(char)0x81;
-			*((long *)(OpBuffer+obp))=pRelativeVar->offset;
-			pobj_GlobalVarSchedule->add();
-			obp+=sizeof(long);
+			compiler.codeGenerator.op_lea_RM( REG_EAX, REG_ECX, pRelativeVar->offset, MOD_BASE_DISP32, Schedule::GlobalVar );
 		}
 		else{
 			//mov eax,offset
-			OpBuffer[obp++]=(char)0xB8;
-			*((long *)(OpBuffer+obp))=pRelativeVar->offset;
-			pobj_GlobalVarSchedule->add();
-			obp+=sizeof(long);
+			compiler.codeGenerator.op_mov_RV( REG_EAX, pRelativeVar->offset, Schedule::GlobalVar );
 		}
 	}
@@ -1271,22 +1261,15 @@
 
 			//add eax,dword ptr[offset]
-			compiler.codeGenerator.op_add_RM( sizeof(long), REG_EAX, REG_NON, (int)pRelativeVar->offset, MOD_DISP32 );
+			compiler.codeGenerator.op_add_RM( sizeof(long), REG_EAX, REG_NON, (int)pRelativeVar->offset, MOD_DISP32, Schedule::GlobalVar );
 		}
 		else{
 			//mov eax,dword ptr[offset]
-			compiler.codeGenerator.op_mov_RM( sizeof(long), REG_EAX, REG_NON, (int)pRelativeVar->offset, MOD_DISP32 );
-		}
-		obp-=sizeof(long);
-		pobj_GlobalVarSchedule->add();
-		obp+=sizeof(long);
+			compiler.codeGenerator.op_mov_RM( sizeof(long), REG_EAX, REG_NON, (int)pRelativeVar->offset, MOD_DISP32, Schedule::GlobalVar );
+		}
 	}
 	else if(pRelativeVar->dwKind==VAR_LOCAL){
 		if(pRelativeVar->bOffsetOffset){
 			//add ecx,offset
-			OpBuffer[obp++]=(char)0x81;
-			OpBuffer[obp++]=(char)0xC1;
-			*((long *)(OpBuffer+obp))=pRelativeVar->offset;
-			AddLocalVarAddrSchedule();
-			obp+=sizeof(long);
+			compiler.codeGenerator.op_add_RV( REG_ECX, pRelativeVar->offset, Schedule::LocalVar );
 
 			//lea eax,dword ptr[ebp+ecx]
@@ -1297,10 +1280,6 @@
 		}
 		else{
-			//lea eax,dword ptr[ebp+offset]
-			OpBuffer[obp++]=(char)0x8D;
-			OpBuffer[obp++]=(char)0x85;
-			*((long *)(OpBuffer+obp))=pRelativeVar->offset;
-			AddLocalVarAddrSchedule();
-			obp+=sizeof(long);
+			//lea eax,dword ptr[ecx+offset]
+			compiler.codeGenerator.op_lea_RM( REG_EAX, REG_EBP, pRelativeVar->offset, MOD_BASE_DISP32, Schedule::LocalVar );
 		}
 	}
Index: trunk/abdev/BasicCompiler_Common/include/CodeGenerator.h
===================================================================
--- trunk/abdev/BasicCompiler_Common/include/CodeGenerator.h	(revision 229)
+++ trunk/abdev/BasicCompiler_Common/include/CodeGenerator.h	(revision 230)
@@ -142,7 +142,9 @@
 	void op_movsx_R32R8		(int reg32,int reg8 = REG_NON);
 	void op_movsx_R16R8		(int reg16,int reg8 = REG_NON);
+	void op_lea_RM			( int reg, int base_reg, long offset, char mod, Schedule::Type scheduleType = Schedule::None );
 	void op_inc				(int reg);
 	void op_dec				(int reg);
 	void op_add_RV8			(int reg,char cValue);
+	void op_add_RV			( int reg, long offset, Schedule::Type scheduleType = Schedule::None );
 	void op_add_RR			( int reg1, int reg2 );
 	void op_add_RM			(int op_size,int reg,int base_reg,int offset,char mod, Schedule::Type scheduleType = Schedule::None );
