Esempio n. 1
0
def HandleOpcode(mnemonic, token: List[str], unit: elf_unit.Unit):
    ins = symbolic.InsFromSymbolized(mnemonic, token)
    if ins.reloc_kind != elf_enum.RELOC_TYPE_AARCH64.NONE:
        sym = unit.FindOrAddSymbol(ins.reloc_symbol, ins.is_local_sym)
        unit.AddReloc(ins.reloc_kind, unit.sec_text, sym,
                      ins.operands[ins.reloc_pos])
        # clear reloc info before proceeding
        ins.reloc_kind = elf_enum.RELOC_TYPE_AARCH64.NONE
        ins.operands[ins.reloc_pos] = 0
    unit.sec_text.AddData(a64.Assemble(ins).to_bytes(4, byteorder='little'))
Esempio n. 2
0
def HandleOneInstruction(count: int, line: str,
                         data: int, ins: Ins,
                         actual_name: str, actual_ops: List[str]):
    name, ops_str = symbolic.InsSymbolize(ins)
    ins2 = symbolic.InsFromSymbolized(name, ops_str)
    assert tuple(ins.operands) == tuple(ins2.operands), f"{ins.operands} vs {ins2.operands}"

    MassageOperandsAndCheckName(actual_name, ins.opcode, actual_ops)
    assert OperandsMatch(ins.opcode, ops_str,
                         actual_ops), f"[{name}] mismatch in [{count}]:  {ops_str} vs {actual_ops}: {line}"
Esempio n. 3
0
def disass(data):
    ins = a64.Disassemble(data)
    if ins is None:
        print(f"could not disassemble {data:x}")
        return

    enum_name, ops_str = symbolic.InsSymbolize(ins)
    print(f"{data:08x}", f"{ins.opcode.NameForEnum()} {' '.join(ops_str)}")
    for f, o, o_str in zip(ins.opcode.fields, ins.operands, ops_str):
        print(f"    {f.name:35s} {o_str:10} ({o})")
    # print(f"flags: {ins.opcode.classes}")
    print()
    data2 = a64.Assemble(ins)
    assert data == data2
    ins2 = symbolic.InsFromSymbolized(enum_name, ops_str)
    assert tuple(ins.operands) == tuple(
        ins2.operands), f"{ins.operands} vs {ins2.operands}"
Esempio n. 4
0
def batch():
    for line in sys.stdin:
        if not line or line.startswith("#"): continue
        data = int(line.split()[0], 16)
        ins = a64.Disassemble(data)
        if ins.opcode is None:
            print(f"could not disassemble {data:x}")
            continue
        enum_name, ops_str = symbolic.InsSymbolize(ins)
        print(
            f"{data:08x} {enum_name}{' ' if ops_str else ''}{', '.join(ops_str)}"
        )
        data2 = a64.Assemble(ins)
        assert data == data2
        ins2 = symbolic.InsFromSymbolized(enum_name, ops_str)
        assert tuple(ins.operands) == tuple(
            ins2.operands), f"{ins.operands} vs {ins2.operands}"
Esempio n. 5
0
def HandleOpcode(mnemonic, token: List[str], unit: elf_unit.Unit):
    AddIns(unit, symbolic.InsFromSymbolized(mnemonic, token))