Package envi :: Package archs :: Package arm :: Module disasm
[hide private]
[frames] | no frames]

Source Code for Module envi.archs.arm.disasm

 1  #import sys 
 2  #import struct 
 3  #import traceback 
 4   
 5  import envi 
 6  #import envi.bits as e_bits 
 7  #from envi.bits import binary 
 8   
 9  from envi.archs.arm.const import * 
10  from envi.archs.arm.armdisasm import ArmStdDisasm 
11  from envi.archs.arm.thumbdisasm import ArmThumbDisasm 
12  from envi.archs.arm.regs import * 
13   
14  # Universal opcode things: 
15  # len 
16  # mode 
17   
18  #FIXME: TODO 
19  # FIXME ldm sp, { pc } seems to not get marked NOFALL 
20  # FIXME ldm sp, { pc } should probably be marked IF_RET too... 
21  # FIXME b lr / bx lr should be marked IF_RET as well! 
22  # FIXME encoding for swi instruction ( <4 cond> 1111 <24 bytes immediate> ) is totally horked (it's in p_uncond) 
23  # FIXME some arm opcode values are ENC << and some are ENC and some are etc.. 
24  #       (make all be ENC_FOO << 16 + <their index> 
25   
26  # FIXME the following things dont decode correctly 
27  # 5346544e    cmppl   r6, #1308622848 
28   
29  # 
30  # Possible future extensions:  
31  #   * VectorPointFloat subsystem (coproc 10+11) 
32  #   * Debug subsystem (coproc 14) 
33  #   * other 'default' coprocs we can handle and add value? 
34   
35   
36  #################################################################### 
37  # Parsers for the multiply family of instruction encodings 
38   
39 -class ArmDisasm:
40
41 - def __init__(self):
42 self.jzl_enabled = False 43 self._dis_regctx = ArmRegisterContext() 44 self._disasm = None 45 self._disasms = ( 46 ArmStdDisasm(), 47 ArmThumbDisasm(), 48 ArmJazDisasm(), 49 ) 50 self.loclookup = {} 51 52 self.setMode(MODE_ARM)
53
54 - def setMode(self, mode_num):
55 self._disasm = self._disasms[mode_num]
56
57 - def disasm(self, bytes, offset, va, trackMode=True, mode=None):
58 59 # hack to make sure parsing odd addresses kicks to thumb 60 if va & 1 == 1: 61 self.setMode( MODE_THUMB ) 62 else: 63 self.setMode( MODE_ARM ) 64 65 op = self._disasm.disasm(bytes, offset, va, trackMode) 66 return op
67
68 -class ArmJazDisasm:
69 - def disasm(self, bytes, offset, va, trackMode=True):
70 raise Exception('Jaz Not Supported Yet!')
71