diff --git a/include/interfaces/irdb/STARSOp.h b/include/interfaces/irdb/STARSOp.h
index 6b47a1ab049d02d7edaa42cc15de45e81eb992ee..8702b70f31198b320ba53f38bc6cd7ddcf160b85 100644
--- a/include/interfaces/irdb/STARSOp.h
+++ b/include/interfaces/irdb/STARSOp.h
@@ -65,7 +65,7 @@ class STARS_IRDB_op_t : public STARS_op_t
 				case op_Mem: return operand.mem.disp;
 				case op_Imm: return operand.imm.imm;
 				case op_Addr: return operand.addr.addr;
-				default: assert(0);
+				default: return STARS_BADADDR;
 			}
 		}
 
@@ -137,7 +137,17 @@ class STARS_IRDB_op_t : public STARS_op_t
 		virtual void SetOpGlobalIndex(std::size_t index) { global_index=index; } // Set STARS SSA name index.
 
 
-		virtual void SetReg(uint16_t NewReg) { assert(OpType==op_Reg); operand.reg.RegNum=(STARS_RegNo)NewReg; }
+		virtual void SetReg(uint16_t NewReg) 
+		{ 
+			switch(OpType)
+			{
+				case op_Reg:
+					operand.reg.RegNum=(STARS_RegNo)NewReg;
+				case op_Mem:
+					operand.mem.base=(STARS_RegNo)NewReg;
+			}
+			return;
+		}	
 		virtual void SetAddr(STARS_ea_t NewAddr) { assert(OpType==op_Mem); operand.mem.disp=NewAddr; }
 		virtual void SetSIB(char value);
 
diff --git a/src/interfaces/irdb/STARS_IRDB_Op.cpp b/src/interfaces/irdb/STARS_IRDB_Op.cpp
index 85f798e6da3c0a77b8893b952855374c32baf24f..b0bcef79a313e754099f2c0d60573bca9da41eae 100644
--- a/src/interfaces/irdb/STARS_IRDB_Op.cpp
+++ b/src/interfaces/irdb/STARS_IRDB_Op.cpp
@@ -13,7 +13,7 @@ using namespace std;
 
 static int log2int(unsigned int index)
 {
-	assert(index>0);
+	assert(index>=0);
 	int targetlevel = 0;
 	while (index >>= 1) ++targetlevel;
 	return  targetlevel;
@@ -166,7 +166,6 @@ no operands for eflags or mxcsr?
 			operand.mem.base=(STARS_RegNo)log2int_or_err(the_arg.Memory.BaseRegister);
 			operand.mem.index=(STARS_RegNo)log2int_or_err(the_arg.Memory.IndexRegister);
 			operand.mem.scale=the_arg.Memory.Scale;
-			assert(operand.mem.scale==the_arg.Memory.Scale);
 			operand.mem.disp=the_arg.Memory.Displacement;
 
 			// if there's no base reg, and an index reg with scale==1,
@@ -181,7 +180,10 @@ no operands for eflags or mxcsr?
 
 			// if the scale >0, we have a sib byte.
 			if(operand.mem.scale > 0)
+			{
 				operand.mem.hasSIB=1;
+				operand.mem.scale=log2int(operand.mem.scale);	
+			}
 			// if there's both a base and an index, then there's a sib byte.
 			if(operand.mem.base != STARS_x86_R_none && operand.mem.index != STARS_x86_R_none)
 				operand.mem.hasSIB=1;
@@ -240,6 +242,7 @@ no operands for eflags or mxcsr?
 
 
 
+
 }
 
 bool STARS_IRDB_op_t::operator<(const STARS_op_t &rOp_param) const
@@ -294,7 +297,7 @@ char STARS_IRDB_op_t::GetSIB(void) const
 	char ret=0;
 	ret|=((int)operand.mem.base&0x7)<<0;
 	ret|=((int)operand.mem.index&0x7)<<3;
-	ret|=(log2int((int)operand.mem.scale)&0x3)<<6;
+	ret|=(((int)operand.mem.scale)&0x3)<<6;
 	return ret;
 } // Get x86 SIB byte (dense encoding of base reg, index reg, and scale factor)
 
@@ -313,7 +316,7 @@ void STARS_IRDB_op_t::SetSIB(char value)
 	(*(int*)&operand.mem.index)|=(value>>3)&0x7;
 
 	// set scale
-	operand.mem.scale= (STARS_RegNo)1<<((value>>6)&0x3);
+	operand.mem.scale= (STARS_RegNo)((value>>6)&0x3);
 	if(operand.mem.index==STARS_x86_R_sp)
 		operand.mem.scale=(STARS_RegNo)0;
 }