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 + "]";
		}
Exemple #2
0
		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);
			}
		}