#!/usr/bin/env python

# EVM disassembler
from manticore.platforms.evm import EVMAsm as ea

def printi(instruction):
    print 'Instruction: %s'% instruction
    print '\tdescription:', instruction.description
    print '\tgroup:', instruction.group
    print '\taddress:', instruction.offset
    print '\tsize:', instruction.size
    print '\thas_operand:', instruction.has_operand
    print '\toperand_size:', instruction.operand_size
    print '\toperand:', instruction.operand
    print '\tsemantics:', instruction.semantics
    print '\tpops:', instruction.pops
    print '\tpushes:', instruction.pushes
    print '\tbytes:', '0x'+instruction.bytes.encode('hex')
    print '\twrites to stack:', instruction.writes_to_stack
    print '\treads from stack:', instruction.reads_from_stack
    print '\twrites to memory:', instruction.writes_to_memory
    print '\treads from memory:', instruction.reads_from_memory
    print '\twrites to storage:', instruction.writes_to_storage
    print '\treads from storage:', instruction.reads_from_storage
    print '\tis terminator', instruction.is_terminator


instruction = ea.disassemble_one('\x60\x10')
printi(instruction)

instruction = ea.assemble_one('PUSH1 0x10')
printi(instruction)

for instruction in ea.disassemble_all('\x30\x31'):
    printi(instruction)

for instruction in ea.assemble_all('ADDRESS\nBALANCE'):
    printi(instruction)


#High level simple assembler/disassembler
print ea.assemble_hex(
                        """PUSH1 0x60
                           BLOCKHASH
                           MSTORE
                           PUSH1 0x2
                           PUSH2 0x100
                        """
                     )


print ea.disassemble_hex('0x606040526002610100')



