Beispiel #1
0
 def _get_register_list(encoding, result=None):
     if not result:
         result = []
     for x in range(0, 16):
         if Bits.is_on(encoding, x) and x not in result:
             result.append(x)
     return result
 def jumping_address(self):
     if self._jumping_address is None:
         # On the other hand, one can compute the jumping address
         address = self.encoding & Bits.set(23, 0)
         if Bits.is_on(address, 23):
             address |= Bits.set(29, 24)
         address = (address << 2)
         address += self.address + 8
         address &= 0xffffffff
         self._jumping_address = address
     return self._jumping_address
Beispiel #3
0
 def jumping_address(self):
     """
     Jumping address for branching instructions
     """
     if self.is_branch:
         if self._jumping_address is None:
             # On the other hand, one can compute the jumping address
             address = self.encoding & Bits.set(23, 0)
             if Bits.is_on(address, 23):
                 address |= Bits.set(29, 24)
             address = (address << 2)
             address += self.address + 8
             address &= 0xffffffff
             self._jumping_address = address
         return self._jumping_address
     return None
    def registers_used(self):
        """
        Returns the registers that this instruction is using
        :return: A list of numbers each one containing the index of the register
        """
        result = []
        t = self.opcode_type()

        # Data processing instructions
        if t <= AOpType.DATA_PROCESSING_IMMEDIATE:
            # Get the Rn register
            result.append(self._rn_field_())

            # Certain instructions address two registers:
            op = self.opcode_field()
            if op in range(AOp.EOR,
                           AOp.RSC) or op in [AOp.AND, AOp.BIC, AOp.ORR]:
                result.append(self._rd_field_())

            # And others even three or four
            if t == AOpType.DATA_PROCESSING:
                result.append(self._rm_field_())
                if Bits.is_on(self.encoding, 4):
                    result.append(self._rs_field_())

        # Load and Store
        elif t in [AOpType.LOAD_STORE, AOpType.LOAD_STORE_OFFSET]:
            result.extend([self._rn_field_(), self._rd_field_()])
            if t == AOpType.LOAD_STORE_OFFSET:
                result.append(self._rm_field_())
        # Load and Store multiple
        elif t == AOpType.LOAD_STORE_MULTIPLE:
            result.append(self._rn_field_())
            result.extend(Instruction._get_register_list(self.encoding))

        return result
Beispiel #5
0
 def test_is_on(self):
     self.assertTrue(Bits.is_on(0xE0000000, 31))