/// <summary> /// gibt eine 64-Bit Adressierung zurück, mit Leerzeichen am Anfang (z.B. " [rsi]") /// </summary> /// <param name="index">Index auf den Register (z.B. 2: "rdx")</param> /// <returns>fertige Adressierung</returns> /// <param name="ext">optionale Zusatzinfos</param> static string R64Addr(int index, AddrExt ext = AddrExt.None) { int constBytes = 0; if (ext.HasFlag(AddrExt.C1)) { constBytes = 1; } if (ext.HasFlag(AddrExt.C4)) { constBytes = 4; } string t1 = Asm.RegistersR64[index]; string t2 = constBytes > 0 ? "x" : ""; string str = t1; if (str != "" && t2 != "") { str += " + "; } str += t2; if (str == "") { str = "0"; } return(" [" + str + "]"); }
/// <summary> /// gibt eine mehrteilige 64-Bit Adressierung zurück, mit Leerzeichen am Anfang (z.B. "[rsi + rcx * 4]") /// </summary> /// <param name="index1">Index auf den ersten Register (z.B. 6: "rsi")</param> /// <param name="index2">Index auf den zweiten Register (z.B. 1: "rcx")</param> /// <param name="mulShift2">Shiftwert für die Multiplikation des zweiten Registers (z.B. 2: "rcx * 4")</param> /// <param name="ext">optionale Zusatzinfos</param> /// <returns>fertige Adressierung</returns> static string R64Addr(int index1, int index2, int mulShift2, AddrExt ext = AddrExt.None) { int constBytes = 0; bool skip1 = false; bool skip2 = false; if (ext.HasFlag(AddrExt.C1)) { constBytes = 1; } if (ext.HasFlag(AddrExt.C4)) { constBytes = 4; } if (ext.HasFlag(AddrExt.Rbp1ToC4) && index1 == 5) { skip1 = true; constBytes = 4; } if (ext.HasFlag(AddrExt.Rsp2Skip) && index2 == 4) { skip2 = true; } string t1 = skip1 ? "" : Asm.RegistersR64[index1]; string t2 = skip2 ? "" : Asm.RegistersR64[index2]; if (mulShift2 != 0 && t2 != "") { t2 += " * " + (1 << mulShift2); } string t3 = constBytes > 0 ? "x" : ""; string str = t1; if (str != "" && t2 != "") { str += " + "; } str += t2; if (str != "" && t3 != "") { str += " + "; } str += t3; if (str == "") { str = "0"; } return(" [" + str + "]"); }