diff options
Diffstat (limited to 'devtools/tasmrecover/tasm/op.py')
-rw-r--r-- | devtools/tasmrecover/tasm/op.py | 410 |
1 files changed, 410 insertions, 0 deletions
diff --git a/devtools/tasmrecover/tasm/op.py b/devtools/tasmrecover/tasm/op.py new file mode 100644 index 0000000000..10fdd8a568 --- /dev/null +++ b/devtools/tasmrecover/tasm/op.py @@ -0,0 +1,410 @@ +import re +import lex + +class Unsupported(Exception): + pass + +class var: + def __init__(self, size, offset): + self.size = size + self.offset = offset + +class const: + def __init__(self, value): + self.value = value + +class reg: + def __init__(self, name): + self.name = name + def size(self): + return 2 if self.name[1] == 'x' else 1 + def __str__(self): + return "<register %s>" %self.name + +class unref: + def __init__(self, exp): + self.exp = exp + def __str__(self): + return "<unref %s>" %self.exp + +class ref: + def __init__(self, name): + self.name = name + def __str__(self): + return "<ref %s>" %self.name + +class glob: + def __init__(self, name): + self.name = name + def __str__(self): + return "<global %s>" %self.name + +class segment: + def __init__(self, name): + self.name = name + def __str__(self): + return "<segment %s>" %self.name + +class baseop(object): + def parse_arg(self, arg): + return arg + + def split(self, text): + a, b = lex.parse_args(text) + return self.parse_arg(a), self.parse_arg(b) + def __str__(self): + return str(self.__class__) + +class basejmp(baseop): + pass + +class _call(baseop): + def __init__(self, arg): + self.name = arg + def visit(self, visitor): + visitor._call(self.name) + def __str__(self): + return "call(%s)" %self.name + +class _rep(baseop): + def __init__(self, arg): + pass + def visit(self, visitor): + visitor._rep() + +class _mov(baseop): + def __init__(self, arg): + self.dst, self.src = self.split(arg) + def visit(self, visitor): + visitor._mov(self.dst, self.src) + def __str__(self): + return "mov(%s, %s)" %(self.dst, self.src) + +class _mov2(baseop): + def __init__(self, dst, src): + self.dst, self.src = dst, src + def visit(self, visitor): + visitor._mov(self.dst, self.src) + +class _shr(baseop): + def __init__(self, arg): + self.dst, self.src = self.split(arg) + def visit(self, visitor): + visitor._shr(self.dst, self.src) + +class _shl(baseop): + def __init__(self, arg): + self.dst, self.src = self.split(arg) + def visit(self, visitor): + visitor._shl(self.dst, self.src) + +class _ror(baseop): + def __init__(self, arg): + pass + +class _rol(baseop): + def __init__(self, arg): + pass + +class _sar(baseop): + def __init__(self, arg): + self.dst, self.src = self.split(arg) + def visit(self, visitor): + visitor._sar(self.dst, self.src) + +class _sal(baseop): + def __init__(self, arg): + self.dst, self.src = self.split(arg) + def visit(self, visitor): + visitor._sal(self.dst, self.src) + +class _rcl(baseop): + def __init__(self, arg): + self.dst, self.src = self.split(arg) + def visit(self, visitor): + visitor._rcl(self.dst, self.src) + +class _rcr(baseop): + def __init__(self, arg): + self.dst, self.src = self.split(arg) + def visit(self, visitor): + visitor._rcr(self.dst, self.src) + +class _neg(baseop): + def __init__(self, arg): + self.arg = arg + def visit(self, visitor): + visitor._neg(self.arg) + +class _dec(baseop): + def __init__(self, arg): + self.dst = arg + def visit(self, visitor): + visitor._dec(self.dst) + +class _inc(baseop): + def __init__(self, arg): + self.dst = arg + def visit(self, visitor): + visitor._inc(self.dst) + +class _add(baseop): + def __init__(self, arg): + self.dst, self.src = self.split(arg) + def visit(self, visitor): + visitor._add(self.dst, self.src) + +class _sub(baseop): + def __init__(self, arg): + self.dst, self.src = self.split(arg) + def visit(self, visitor): + visitor._sub(self.dst, self.src) + +class _mul(baseop): + def __init__(self, arg): + self.arg = self.parse_arg(arg) + def visit(self, visitor): + visitor._mul(self.arg) + +class _div(baseop): + def __init__(self, arg): + self.arg = self.parse_arg(arg) + def visit(self, visitor): + visitor._div(self.arg) + +class _and(baseop): + def __init__(self, arg): + self.dst, self.src = self.split(arg) + def visit(self, visitor): + visitor._and(self.dst, self.src) + +class _xor(baseop): + def __init__(self, arg): + self.dst, self.src = self.split(arg) + def visit(self, visitor): + visitor._xor(self.dst, self.src) + +class _or(baseop): + def __init__(self, arg): + self.dst, self.src = self.split(arg) + def visit(self, visitor): + visitor._or(self.dst, self.src) + +class _cmp(baseop): + def __init__(self, arg): + self.a, self.b = self.split(arg) + def visit(self, visitor): + visitor._cmp(self.a, self.b) + +class _test(baseop): + def __init__(self, arg): + self.a, self.b = self.split(arg) + def visit(self, visitor): + visitor._test(self.a, self.b) + +class _xchg(baseop): + def __init__(self, arg): + self.a, self.b = self.split(arg) + def visit(self, visitor): + visitor._xchg(self.a, self.b) + +class _jnz(basejmp): + def __init__(self, label): + self.label = label + def visit(self, visitor): + visitor._jnz(self.label) + +class _jz(basejmp): + def __init__(self, label): + self.label = label + def visit(self, visitor): + visitor._jz(self.label) + +class _jc(basejmp): + def __init__(self, label): + self.label = label + def visit(self, visitor): + visitor._jc(self.label) + +class _jnc(basejmp): + def __init__(self, label): + self.label = label + def visit(self, visitor): + visitor._jnc(self.label) + +class _js(basejmp): + def __init__(self, label): + self.label = label + def visit(self, visitor): + visitor._js(self.label) + +class _jns(basejmp): + def __init__(self, label): + self.label = label + def visit(self, visitor): + visitor._jns(self.label) + +class _jl(basejmp): + def __init__(self, label): + self.label = label + def visit(self, visitor): + visitor._jl(self.label) + +class _jg(basejmp): + def __init__(self, label): + self.label = label + def visit(self, visitor): + visitor._jg(self.label) + +class _jle(basejmp): + def __init__(self, label): + self.label = label + def visit(self, visitor): + visitor._jle(self.label) + +class _jge(basejmp): + def __init__(self, label): + self.label = label + def visit(self, visitor): + visitor._jge(self.label) + +class _jmp(basejmp): + def __init__(self, label): + self.label = label + def visit(self, visitor): + visitor._jmp(self.label) + +class _loop(basejmp): + def __init__(self, label): + self.label = label + def visit(self, visitor): + visitor._loop(self.label) + +class _push(baseop): + def __init__(self, arg): + self.regs = [] + for r in arg.split(): + self.regs.append(self.parse_arg(r)) + def visit(self, visitor): + visitor._push(self.regs) + +class _pop(baseop): + def __init__(self, arg): + self.regs = [] + for r in arg.split(): + self.regs.append(self.parse_arg(r)) + def visit(self, visitor): + visitor._pop(self.regs) + +class _ret(baseop): + def __init__(self, arg): + pass + def visit(self, visitor): + visitor._ret() + +class _lodsb(baseop): + def __init__(self, arg): + pass + def visit(self, visitor): + visitor._lodsb() + +class _lodsw(baseop): + def __init__(self, arg): + pass + def visit(self, visitor): + visitor._lodsw() + +class _stosw(baseop): + def __init__(self, arg): + self.repeat = 1 + self.clear_cx = False + def visit(self, visitor): + visitor._stosw(self.repeat, self.clear_cx) + +class _stosb(baseop): + def __init__(self, arg): + self.repeat = 1 + self.clear_cx = False + def visit(self, visitor): + visitor._stosb(self.repeat, self.clear_cx) + +class _movsw(baseop): + def __init__(self, arg): + self.repeat = 1 + self.clear_cx = False + def visit(self, visitor): + visitor._movsw(self.repeat, self.clear_cx) + +class _movsb(baseop): + def __init__(self, arg): + self.repeat = 1 + self.clear_cx = False + def visit(self, visitor): + visitor._movsb(self.repeat, self.clear_cx) + +class _in(baseop): + def __init__(self, arg): + self.arg = arg + def visit(self, visitor): + raise Unsupported("input from port: %s" %self.arg) + +class _out(baseop): + def __init__(self, arg): + self.arg = arg + def visit(self, visitor): + raise Unsupported("out to port: %s" %self.arg) + +class _cli(baseop): + def __init__(self, arg): + pass + def visit(self, visitor): + raise Unsupported("cli") + +class _sti(baseop): + def __init__(self, arg): + pass + def visit(self, visitor): + raise Unsupported("sli") + +class _int(baseop): + def __init__(self, arg): + self.arg = arg + def visit(self, visitor): + raise Unsupported("interrupt: %s" %self.arg) + +class _iret(baseop): + def __init__(self, arg): + pass + def visit(self, visitor): + raise Unsupported("interrupt return") + +class _cbw(baseop): + def __init__(self, arg): + pass + def visit(self, visitor): + visitor._cbw() + +class _nop(baseop): + def __init__(self, arg): + pass + def visit(self, visitor): + pass + +class _stc(baseop): + def __init__(self, arg): + pass + def visit(self, visitor): + visitor._stc() + +class _clc(baseop): + def __init__(self, arg): + pass + def visit(self, visitor): + visitor._clc() + +class label(baseop): + def __init__(self, name): + self.name = name + def visit(self, visitor): + visitor._label(self.name) + |