diff python/ppci/target/arm/instructions.py @ 350:2b02bd286fe9

Fixed A9 hello worle
author Windel Bouwman
date Sat, 08 Mar 2014 16:29:03 +0100
parents 3bb7dcfe5529
children 899ae3aea803
line wrap: on
line diff
--- a/python/ppci/target/arm/instructions.py	Sat Mar 08 16:16:41 2014 +0100
+++ b/python/ppci/target/arm/instructions.py	Sat Mar 08 16:29:03 2014 +0100
@@ -34,6 +34,9 @@
         self.token[0:32] = self.v
         return self.token.encode()
 
+    def __repr__(self):
+        return 'DCD {}'.format(hex(self.v))
+
 
 def Mov(*args):
     if len(args) == 2:
@@ -84,6 +87,9 @@
         self.token.cond = AL
         return self.token.encode()
 
+    def __repr__(self):
+        return 'MOV {}, {}'.format(self.rd, self.rm)
+
 
 def Add(*args):
     if len(args) == 3 and isinstance(args[0], ArmRegister) and \
@@ -206,6 +212,10 @@
     def relocations(self):
         return [(self.target, 'b_imm24')]
 
+    def __repr__(self):
+        mnemonic = self.__class__.__name__
+        return '{} {}'.format(mnemonic, self.target)
+
 
 EQ, NE, CS, CC, MI, PL, VS, VC, HI, LS, GE, LT, GT, LE, AL = range(15)
 
@@ -255,6 +265,10 @@
         self.token[0:16] = reg_list_to_mask(self.reg_list)
         return self.token.encode()
 
+    def __repr__(self):
+        return 'PUSH {}'.format(self.reg_list)
+
+
 class Pop(ArmInstruction):
     def __init__(self, register_set):
         super().__init__()
@@ -266,14 +280,23 @@
         self.token[0:16] = reg_list_to_mask(self.reg_list)
         return self.token.encode()
 
+    def __repr__(self):
+        return 'POP {}'.format(self.reg_list)
+
 
 def Ldr(*args):
-    if len(args) == 3 and isinstance(args[1], ArmRegister):
-        return Ldr1(*args)
-    elif len(args) == 2 and isinstance(args[1], ArmRegister):
-        return Ldr1(args[0], args[1], 0)
+    """ Convenience function that creates the correct instruction """
+    if len(args) == 3:
+        if isinstance(args[1], ArmRegister):
+            return Ldr1(*args)
+    elif len(args) == 2:
+        if isinstance(args[1], ArmRegister):
+            return Ldr1(args[0], args[1], 0)
+        elif isinstance(args[1], str):
+            return Ldr3(*args)
     raise Exception()
 
+
 def Str(*args):
     if len(args) == 3 and isinstance(args[1], ArmRegister):
         return Str1(*args)
@@ -304,20 +327,42 @@
             self.token[0:12] = -self.offset
         return self.token.encode()
 
+    def __repr__(self):
+        return '{} {}, [{}, {}]'.format(self.mnemonic, self.rt, self.rn, 
+                hex(self.offset))
 
 class Str1(LdrStrBase):
     opcode = 0b010
     bit20 = 0
+    mnemonic = 'STR'
 
 
 class Ldr1(LdrStrBase):
     opcode = 0b010
     bit20 = 1
+    mnemonic = 'LDR'
 
 
 class Ldr3(ArmInstruction):
-    """ Load PC relative constant value """
+    """ Load PC relative constant value
+        LDR rt, label
+        encoding A1
+    """
     def __init__(self, rt, label):
+        super().__init__()
         self.rt = rt
         self.label = label
 
+    def __repr__(self):
+        return 'LDR {}, {}'.format(self.rt, self.label)
+
+    def relocations(self):
+        return [(self.label, 'ldr_imm12')]
+
+    def encode(self):
+        self.token.cond = AL
+        self.token[0:12] = 0  # Filled by linker
+        self.token[12:16] = self.rt.num
+        self.token[16:23] = 0b0011111
+        self.token[24:28] = 0b0101
+        return self.token.encode()