5 from pyparsing
import *
8 from collections
import defaultdict
14 log = logging.getLogger(
"msp430dis")
15 console_handler = logging.StreamHandler()
16 console_handler.setFormatter(logging.Formatter(
"%(levelname)-5s: %(message)s"))
17 log.addHandler(console_handler)
18 log.setLevel(logging.DEBUG)
20 conditional_branch = [
'jnz',
'jz',
'jnc',
'jc',
22 unconditional_branch = [
'jmp']
26 if len(t) == 1
and isinstance(t[0], ExprId):
28 elif len(t) == 1
and isinstance(t[0], ExprInt):
30 raise NotImplementedError(
'not fully functional')
35 if len(t) == 1
and isinstance(t[0], ExprId):
36 return ExprOp(
'autoinc', t[0])
37 raise NotImplementedError(
'not fully functional')
42 if len(t) == 2
and isinstance(t[1], ExprId):
44 raise NotImplementedError(
'not fully functional')
51 if isinstance(t, ExprId)
or \
52 isinstance(t, ExprInt)
or \
53 isinstance(t, ExprMem)
or \
54 (isinstance(t, ExprOp)
and t.op ==
"autoinc"):
57 raise NotImplementedError(
'not fully functional')
62 i = regs16_str.index(t)
69 LPARENT = Suppress(
"(")
70 RPARENT = Suppress(
")")
76 if not t
in mn_msp430.regs.all_regs_ids_byname:
79 r = mn_msp430.regs.all_regs_ids_byname[t]
89 my_var_parser =
parse_ast(ast_id2expr, ast_int2expr)
90 base_expr.setParseAction(my_var_parser)
93 deref_nooff = Group(ARO + base_expr).setParseAction(deref2expr_nooff)
94 deref_pinc = Group(ARO + base_expr + PINC).setParseAction(deref2expr_pinc)
95 deref_off = Group(base_expr + LPARENT +
96 gpregs.parser + RPARENT).setParseAction(deref2expr_off)
99 sreg_p = Group(deref_pinc | deref_nooff |
100 deref_off | base_expr).setParseAction(deref_expr)
113 if self.name.startswith(
'j'):
115 return self.
name in [
'call']
119 if isinstance(e, ExprId):
121 elif isinstance(e, ExprInt):
123 elif isinstance(e, ExprOp)
and e.op ==
"autoinc":
124 o =
"@%s+" % str(e.args[0])
125 elif isinstance(e, ExprMem):
126 if isinstance(e.arg, ExprId):
130 o =
"0x0(%s)" % e.arg
131 elif isinstance(e.arg, ExprInt):
133 elif isinstance(e.arg, ExprOp):
134 o =
"%s(%s)" % (e.arg.args[1], e.arg.args[0])
136 raise NotImplementedError(
'unknown instance e = %s' %
type(e))
142 if not isinstance(e, ExprInt):
147 ad = e.arg + int(self.offset)
149 l = symbol_pool.getby_offset_create(ad)
154 if self.
name in conditional_branch + unconditional_branch:
156 if self.name.startswith(
'ret'):
158 if self.name.startswith(
'int'):
160 if self.name.startswith(
'mov')
and self.
args[1] == PC:
162 return self.
name in [
'call']
165 if self.
name in conditional_branch:
167 if self.
name in unconditional_branch:
169 return self.
name in [
'call']
175 return self.name
in [
'call']
178 return [self.
args[0]]
185 if self.offset
is None:
186 raise ValueError(
'symbol not resolved %s' % l)
187 if not isinstance(e, ExprInt):
189 log.warning(
'dynamic dst %r', e)
194 if self.
name !=
"call":
195 self.
args[0] =
ExprInt(int(e.arg) - self.offset, 16)
201 o = super(instruction_msp430, self).
__str__()
223 all_mn_mode = defaultdict(list)
224 all_mn_name = defaultdict(list)
225 all_mn_inst = defaultdict(list)
226 instruction = instruction_msp430
227 max_instruction_len = 8
239 l = sum([x.l
for x
in fields])
240 assert l % 16 == 00,
"len %r" % l
247 if n > bs.getlen() * 8:
248 raise ValueError(
'not enought bits %r %r' % (n, len(bs.bin) * 8))
251 c = cls.getbytes(bs, i)
269 n_offset = (offset & ~1) + 1 - offset % 2
270 out += bs.getbytes(n_offset, 1)
288 return [(subcls, name, bases, dct, fields)]
302 raise NotImplementedError(
'not fully functional')
305 def addop(name, fields, args=None, alias=False):
306 dct = {
"fields": fields}
310 type(name, (mn_msp430,), dct)
315 mn_mod = [
'.w',
'.b']
319 prio = default_prio + 1
325 if hasattr(self.parent,
'size'):
326 size = [16, 8][self.parent.size.value]
328 e = self.reg_info.expr[v]
329 if self.parent.a_s.value == 0b00:
334 elif self.parent.a_s.value == 0b01:
341 e +
ExprInt16(self.parent.off_s.value), size)
342 elif self.parent.a_s.value == 0b10:
349 elif self.parent.a_s.value == 0b11:
353 if self.parent.size.value == 0:
362 raise NotImplementedError(
363 "unknown value self.parent.a_s.value = " +
364 "%d" % self.parent.a_s.value)
369 if e
in self.reg_info.expr:
370 self.parent.a_s.value = 0
371 self.
value = self.reg_info.expr.index(e)
372 elif isinstance(e, ExprInt):
374 if v == 0xffff
and self.parent.size.value == 0:
375 self.parent.a_s.value = 0b11
377 elif v == 0xff
and self.parent.size.value == 1:
378 self.parent.a_s.value = 0b11
381 self.parent.a_s.value = 0b10
384 self.parent.a_s.value = 0b01
387 self.parent.a_s.value = 0b11
390 self.parent.a_s.value = 0b10
393 self.parent.a_s.value = 0b00
396 self.parent.a_s.value = 0b11
398 self.parent.off_s.value = v
399 elif isinstance(e, ExprMem):
400 if isinstance(e.arg, ExprId):
401 self.parent.a_s.value = 0b10
402 self.
value = self.reg_info.expr.index(e.arg)
403 elif isinstance(e.arg, ExprInt):
404 self.parent.a_s.value = 0b01
405 self.
value = self.reg_info.expr.index(SR)
406 self.parent.off_s.value = int(e.arg.arg)
407 elif isinstance(e.arg, ExprOp):
408 self.parent.a_s.value = 0b01
409 self.
value = self.reg_info.expr.index(e.arg.args[0])
410 self.parent.off_s.value = int(e.arg.args[1].arg)
412 raise NotImplementedError(
413 'unknown instance e.arg = %s' %
type(e.arg))
414 elif isinstance(e, ExprOp)
and e.op ==
"autoinc":
415 self.parent.a_s.value = 0b11
416 self.
value = self.reg_info.expr.index(e.args[0])
418 raise NotImplementedError(
'unknown instance e = %s' %
type(e))
423 prio = default_prio + 1
428 if hasattr(self.parent,
'size'):
429 size = [16, 8][self.parent.size.value]
434 e = self.reg_info.expr[v]
435 if self.parent.a_d.value == 0:
437 elif self.parent.a_d.value == 1:
441 x = e +
ExprInt16(self.parent.off_d.value)
444 raise NotImplementedError(
445 "unknown value self.parent.a_d.value = " +
446 "%d" % self.parent.a_d.value)
451 if e
in self.reg_info.expr:
452 self.parent.a_d.value = 0
453 self.
value = self.reg_info.expr.index(e)
454 elif isinstance(e, ExprMem):
455 if isinstance(e.arg, ExprId):
457 elif isinstance(e.arg, ExprOp):
458 r, i = e.arg.args[0], e.arg.args[1]
459 elif isinstance(e.arg, ExprInt):
462 raise NotImplementedError(
463 'unknown instance e.arg = %s' %
type(e.arg))
464 self.parent.a_d.value = 1
465 self.
value = self.reg_info.expr.index(r)
466 self.parent.off_d.value = int(i.arg)
468 raise NotImplementedError(
'unknown instance e = %s' %
type(e))
477 elif v[
'a_s'] == 0b01:
482 elif v[
'a_s'] == 0b10:
484 elif v[
'a_s'] == 0b11:
486 if v['sreg'] in [2, 3]:
496 raise NotImplementedError(
"unknown value v[a_s] = %d" % v[
'a_s'])
499 return super(bs_cond_off_s, self).
encode()
517 raise NotImplementedError(
"unknown value v[a_d] = %d" % v[
'a_d'])
534 plen = self.parent.l + self.l
535 assert(plen % 8 == 0)
543 if (1 << (self.l - 1)) & v:
550 if not isinstance(self.
expr, ExprInt):
552 v = int(self.expr.arg)
553 if (1 << (self.l - 1)) & v:
554 v = -((0xffff ^ v) + 1)
556 self.
value = (v & 0xffff) & self.lmask
560 off_s =
bs(l=16, order=-10, cls=(bs_cond_off_s,), fname =
"off_s")
561 off_d =
bs(l=16, order=-10, cls=(bs_cond_off_d,), fname =
"off_d")
563 a_s =
bs(l=2, order=-4, fname=
'a_s')
564 a_d =
bs(l=1, order=-6, fname=
'a_d')
566 a_d2 =
bs(l=2, order=-2, fname=
'a_d')
568 sreg =
bs(l=4, order=-3, cls=(msp430_sreg_arg,), fname=
'sreg')
569 dreg =
bs(l=4, order=-5, cls=(msp430_dreg_arg,), fname=
'dreg')
571 bw =
bw_mn(l=1, order=-10, mn_mod=[
'.w',
'.b'], fname=
'size')
575 'mov': 4,
'add': 5,
'addc': 6,
'subc': 7,
'sub': 8,
'cmp': 9,
576 'dadd': 10,
'bit': 11,
'bic': 12,
'bis': 13,
'xor': 14,
'and': 15})
577 addop(
"f1", [bs_f1, sreg, a_d, bw, a_s, dreg, off_s, off_d])
579 bs_f2 =
bs_name(l=3, name={
'rrc': 0,
'rra': 2,
581 addop(
"f2_1", [
bs(
'000100'), bs_f2, bw, a_s, sreg, off_s])
584 bs_f2_nobw =
bs_name(l=3, name={
'swpb': 1,
'sxt': 3,
586 addop(
"f2_2", [
bs(
'000100'), bs_f2_nobw,
bs(
'0'), a_s, sreg, off_s])
589 offimm =
bs(l=10, cls=(msp430_offs,), fname=
"offs", order=-1)
591 bs_f2_jcc =
bs_name(l=3, name={
'jnz': 0,
'jz': 1,
'jnc': 2,
'jc': 3,
'jn': 4,
592 'jge': 5,
'jl': 6,
'jmp': 7})
593 addop(
"f2_3", [
bs(
'001'), bs_f2_jcc, offimm])