Beispiel #1
0
        /// <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);
                    }
                }
            }
        }
Beispiel #2
0
        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;
                }
            }
        }