public static string NameMemIndex(x86Assembler a, x86Register baseRegister, int displacement, x86Register indexRegister, x86IndexShift shift, x86Segment segment) { string ret = ""; bool form2 = baseRegister == x86Register.None; if (form2) { ret += NameSegment(segment) + ":0x" + displacement.ToString("X").PadLeft(8, '0'); } ret += "[" + NameRegister(indexRegister, 4); switch (shift) { case x86IndexShift.Mul1: break; case x86IndexShift.Mul2: ret += " * 2"; break; case x86IndexShift.Mul4: ret += " * 4"; break; case x86IndexShift.Mul8: ret += " * 8"; break; default: throw new Exception("Invalid index shift!"); } if (baseRegister != x86Register.None) { ret += " + " + NameRegister(baseRegister, 4); } if (displacement != 0 && !form2) { ret += " " + (displacement < 0 ? "-" : "+") + " " + (displacement < 0 ? -displacement : displacement).ToString(); } return ret + "]"; }
public void WriteMemIndex(byte r, x86Register baseReg, int displacement, x86Register indexReg, x86IndexShift iShift) { byte shift = (byte)iShift; switch (shift) { case 0: case 1: case 2: case 3: break; default: throw new Exception("Invalid shift!"); } if (baseReg == x86Register.None) { WriteAddressByte(0, r, 4); WriteAddressByte(shift, (byte)indexReg, 5); WriteImm32((uint)displacement); } else if (displacement == 0 && baseReg != x86Register.EBP) { WriteAddressByte(0, r, 4); WriteAddressByte(shift, (byte)indexReg, (byte)baseReg); } else if (InSByteRange(displacement)) { WriteAddressByte(1, r, 4); WriteAddressByte(shift, (byte)indexReg, (byte)baseReg); WriteImm8((byte)displacement); } else { WriteAddressByte(2, r, 4); WriteAddressByte(shift, (byte)indexReg, (byte)baseReg); WriteImm32((uint)displacement); } }