Пример #1
0
 def ameth_l(self, bytez, offset, tsize, prefixes, operflags):
     reg = self.ROFFSETSIMD
     imm = e_bits.parsebytes(bytez, offset, 1, sign=False)
     idx = (imm & 0xF0) >> 4
     if not (prefixes & PREFIX_VEX_L) or operflags & OP_NOVEXL:
         reg += e_i386.RMETA_LOW128
     return (1, i386RegOper(reg + idx, tsize))
Пример #2
0
    def ameth_0(self, operflags, operval, tsize, prefixes):
        # o = e_i386.i386Disasm.ameth_0(self, operflags, operval, tsize, prefixes)
        if operflags & opcode86.OP_REG:
            # for handling meta registers embedded in opcodes
            if prefixes & PREFIX_OP_SIZE:
                if self._dis_regctx.isMetaRegister(operval):
                    operval = (operval & RMETA_NMASK) | META_SIZES[tsize]
                else:
                    operval |= META_SIZES[tsize]

            width = self._dis_regctx.getRegisterWidth(operval) / 8
            o = i386RegOper(operval, width)
        elif operflags & opcode86.OP_IMM:
            o = i386ImmOper(operval, tsize)
        else:
            raise Exception("Unknown ameth_0! operflags: 0x%.8x" % operflags)

        # If it has a builtin register, we need to check for bump prefix
        if prefixes & PREFIX_REX_W and isinstance(o, e_i386.i386RegOper):
            o.reg &= 0xffff
        if prefixes & PREFIX_REX_B and isinstance(o, e_i386.i386RegOper):
            # the optable entries for AH with REX_B is terribly unhelpful.
            if o.reg & e_i386.RMETA_HIGH8 == e_i386.RMETA_HIGH8:
                o.reg &= REX_HIGH_DROP
                o.reg += 4
            if not (operflags & e_i386_const.OP_NOREXB):
                o.reg += REX_BUMP
        return o
Пример #3
0
    def ameth_h(self, bytez, offset, tsize, prefixes, operflags):
        osize = 0
        vvvv = (prefixes >> VEX_V_SHIFT) & 0xf
        offset = self.ROFFSETSIMD
        if not (prefixes & PREFIX_VEX_L):
            vvvv |= e_i386.RMETA_LOW128

        oper = i386RegOper(offset + vvvv, tsize)
        return osize, oper
Пример #4
0
    def ameth_h(self, bytez, offset, tsize, prefixes, operflags):
        osize = 0
        vvvv = (prefixes >> VEX_V_SHIFT) & 0xf
        offset = self.ROFFSETSIMD
        if not (prefixes & PREFIX_VEX_L):
            vvvv |= e_i386.RMETA_LOW128

        oper = i386RegOper(offset + vvvv, tsize)
        return osize, oper
Пример #5
0
 def ameth_b(self, bytez, offset, tsize, prefixes, operflags):
     osize = 0
     oper = 0
     vvvv = (prefixes >> VEX_V_SHIFT) & 0xf
     oper = i386RegOper(vvvv, tsize)
     # TODO: Disallowing reg_rip is probably wrong
     if oper.tsize == 4:
         oper.reg |= RMETA_LOW32
     return osize, oper
Пример #6
0
    def ameth_l(self, bytez, offset, tsize, prefixes, operflags):
        osize = 1
        imm = e_bits.parsebytes(bytez, offset, 1)
        vvvv = (imm >> 4)
        offset = self.ROFFSETSIMD
        if not (prefixes & PREFIX_VEX_L):
            vvvv |= e_i386.RMETA_LOW128

        oper = i386RegOper(offset + vvvv, tsize)
        return osize, oper
Пример #7
0
    def ameth_l(self, bytez, offset, tsize, prefixes, operflags):
        osize = 1
        imm = e_bits.parsebytes(bytez, offset, 1)
        vvvv = (imm >> 4)
        offset = self.ROFFSETSIMD
        if not (prefixes & PREFIX_VEX_L):
            vvvv |= e_i386.RMETA_LOW128

        oper = i386RegOper(offset + vvvv, tsize)
        return osize, oper
Пример #8
0
    def ameth_w(self, bytez, offset, tsize, prefixes, operflags):
        mod,reg,rm = self.parse_modrm(ord(bytez[offset]))
        if mod == 3:
            vvvv = self.ROFFSETSIMD
            if not (prefixes & PREFIX_VEX_L):
                vvvv |= e_i386.RMETA_LOW128

            osize, oper = (1, i386RegOper(rm + vvvv, tsize))
        else:
            osize, oper = self.extended_parse_modrm(bytez, offset, tsize, prefixes=prefixes)
            if oper.tsize == 32 and not (prefixes & PREFIX_VEX_L):
                oper.tsize = 16

        self._dis_rex_exmodrm(oper, prefixes, operflags)
        return osize,oper
Пример #9
0
 def ameth_b(self, bytez, offset, tsize, prefixes, operflags):
     osize = 0
     oper = 0
     vvvv = (prefixes >> VEX_V_SHIFT) & 0xf
     oper = i386RegOper(vvvv, tsize)
     return osize, oper
Пример #10
0
 def ameth_b(self, bytez, offset, tsize, prefixes, operflags):
     osize = 0
     oper = 0
     vvvv = (prefixes >> VEX_V_SHIFT) & 0xf
     oper = i386RegOper(vvvv, tsize)
     return osize, oper