/// <summary> /// generiert alle OpCodes /// </summary> /// <returns>Enumerable der Zeilen, welche generiert wurden</returns> public static IEnumerable <string> GenerateOpCodes() { var opCode = new byte[15]; var oneBytes = RefPriOpcd.ReadElements(); var twoBytes = RefPriOpcd.ReadElements(true); foreach (var oneByte in oneBytes) { Array.Clear(opCode, 0, opCode.Length); int pos = 0; opCode[pos++] = oneByte.value; var entry = oneByte.entries.FirstOrDefault(); if (oneByte.entries.Length != 1) { if (oneByte.entries.Any(x => x.attr == "invd" && x.note == "Invalid Instruction in 64-Bit Mode")) { yield return(Generator.StrB(opCode, pos - 1) + "???"); continue; } if (oneByte.value == 0x0f) { foreach (var line in GenerateOpCodes0F(opCode, pos, twoBytes)) { yield return(line); } break; } throw new NotImplementedException(); } foreach (var syntax in entry.syntax) { foreach (var line in Generate(opCode, pos, syntax, entry, oneByte)) { yield return(line); } } } }
static IEnumerable <string> Generate(byte[] opCode, int pos, RefSyntax syntax, RefEntry entry, RefPriOpcd pri) { if (syntax.mnem == null || syntax.dst.Length != 1 || syntax.src.Length != 1) { throw new NotImplementedException(); } var mnem = syntax.mnem; var dst = syntax.dst[0]; var rgDst = GetRegs(dst); var src = syntax.src[0]; var rgSrc = GetRegs(src); if (dst.nr != null) { if (src.a == "I" && (src.t == "b" || src.t == "vds")) { yield return(Generator.StrB(opCode, pos - 1, src.t == "b" ? 1 : 4) + mnem.ToLower() + Para(rgDst[(int)dst.nr], "x")); yield break; } throw new NotImplementedException(); } bool swap = false; if (dst.a == "G" && src.a == "E") { swap = true; } else if (dst.a != "E" || src.a != "G") { throw new NotImplementedException(); } for (int b = 0; b < 256; b++) { opCode[pos] = (byte)b; int p1 = b & 7; int p2 = b >> 3 & 7; int px = b >> 6; int fixConst = 0; switch (px) { case 0: { string r1 = Asm.RegistersR64[p1]; string r2 = rgSrc[p2]; switch (r1) { case "rsp": { pos++; for (int b2 = 0; b2 < 256; b2++) { opCode[pos] = (byte)b2; int cbytes; r1 = MemAddr(opCode, pos, out cbytes, fixConst); yield return(Generator.StrB(opCode, pos, cbytes) + mnem.ToLower() + Para(r1, r2, swap)); } pos--; } break; case "rbp": { if (fixConst != 0) { goto default; } yield return(Generator.StrB(opCode, pos, 4) + mnem.ToLower() + Para("[rip + x]", r2, swap)); } break; default: { yield return(Generator.StrB(opCode, pos, fixConst) + mnem.ToLower() + Para("[" + r1 + (fixConst != 0 ? " + x" : "") + "]", r2, swap)); break; } } } break; case 1: fixConst = 1; goto case 0; case 2: fixConst = 4; goto case 0; case 3: yield return(Generator.StrB(opCode, pos) + mnem.ToLower() + Para(rgDst[p1], rgSrc[p2], swap)); break; } } }