use of com.google.security.zynamics.zylib.disassembly.IOperandTreeNode in project binnavi by google.
the class XorDotTranslator method translate.
@Override
public void translate(final ITranslationEnvironment environment, final IInstruction instruction, final List<ReilInstruction> instructions) throws InternalTranslationException {
TranslationHelpers.checkTranslationArguments(environment, instruction, instructions, "xor.");
final IOperandTreeNode registerOperand1 = instruction.getOperands().get(1).getRootNode().getChildren().get(0);
final IOperandTreeNode registerOperand2 = instruction.getOperands().get(2).getRootNode().getChildren().get(0);
XorGenerator.generate(instruction.getAddress().toLong() * 0x100, environment, instruction, instructions, "xor.", registerOperand2.getValue(), registerOperand1.getValue(), true, false, false, false);
}
use of com.google.security.zynamics.zylib.disassembly.IOperandTreeNode in project binnavi by google.
the class XorisTranslator method translate.
@Override
public void translate(final ITranslationEnvironment environment, final IInstruction instruction, final List<ReilInstruction> instructions) throws InternalTranslationException {
TranslationHelpers.checkTranslationArguments(environment, instruction, instructions, "xoris");
final IOperandTreeNode registerOperand1 = instruction.getOperands().get(1).getRootNode().getChildren().get(0);
final IOperandTreeNode literalOperand1 = instruction.getOperands().get(2).getRootNode().getChildren().get(0);
long baseOffset = instruction.getAddress().toLong() * 0x100;
final String tmpLiteralValue = environment.getNextVariableString();
instructions.add(ReilHelpers.createStr(baseOffset++, OperandSize.DWORD, String.valueOf(Long.valueOf(literalOperand1.getValue()) << 16), OperandSize.DWORD, tmpLiteralValue));
XorGenerator.generate(baseOffset, environment, instruction, instructions, "xoris", registerOperand1.getValue(), tmpLiteralValue, false, false, false, false);
}
use of com.google.security.zynamics.zylib.disassembly.IOperandTreeNode in project binnavi by google.
the class SubGenerator method generate.
public static void generate(long baseOffset, final ITranslationEnvironment environment, final IInstruction instruction, final List<ReilInstruction> instructions, final String mnemonic, final String firstOperand, final String secondOperand, final boolean setCr, final boolean setOverflow, final boolean setCarry, final boolean isExtended) throws InternalTranslationException {
TranslationHelpers.checkTranslationArguments(environment, instruction, instructions, mnemonic);
final IOperandTreeNode registerOperand1 = instruction.getOperands().get(0).getRootNode().getChildren().get(0);
final String targetRegister = registerOperand1.getValue();
final String extendedSubResult = environment.getNextVariableString();
final String twoComplementfirstOperand = environment.getNextVariableString();
final String tmpResult = environment.getNextVariableString();
final String tmpVar3 = setOverflow ? environment.getNextVariableString() : null;
final String tmpVar4 = setOverflow ? environment.getNextVariableString() : null;
final String overflowTmp = setOverflow ? environment.getNextVariableString() : null;
final String msbVara = setOverflow ? environment.getNextVariableString() : null;
final String msbVarb = setOverflow ? environment.getNextVariableString() : null;
final String msbVarr = setOverflow ? environment.getNextVariableString() : null;
final String crTemp = setCr ? environment.getNextVariableString() : null;
// perform actual subtraction in the 2's complement !rA + rB + 1
instructions.add(ReilHelpers.createXor(baseOffset++, OperandSize.DWORD, firstOperand, OperandSize.DWORD, "4294967295", OperandSize.DWORD, twoComplementfirstOperand));
instructions.add(ReilHelpers.createAdd(baseOffset++, OperandSize.DWORD, twoComplementfirstOperand, OperandSize.DWORD, secondOperand, OperandSize.QWORD, tmpResult));
// extended subtraction does !rA + rB + XER[CA] rather then !rA + rB + 1
if (isExtended) {
instructions.add(ReilHelpers.createAdd(baseOffset++, OperandSize.QWORD, tmpResult, OperandSize.BYTE, Helpers.XER_CARRY_BIT, OperandSize.QWORD, extendedSubResult));
} else {
instructions.add(ReilHelpers.createAdd(baseOffset++, OperandSize.QWORD, tmpResult, OperandSize.BYTE, "1", OperandSize.QWORD, extendedSubResult));
}
// reduce to register size
instructions.add(ReilHelpers.createAnd(baseOffset++, OperandSize.QWORD, extendedSubResult, OperandSize.DWORD, "4294967295", OperandSize.DWORD, targetRegister));
if (setOverflow) {
// Isolate summands msb's
instructions.add(ReilHelpers.createBsh(baseOffset++, OperandSize.DWORD, firstOperand, OperandSize.WORD, "-31", OperandSize.DWORD, msbVara));
instructions.add(ReilHelpers.createBsh(baseOffset++, OperandSize.DWORD, secondOperand, OperandSize.WORD, "-31", OperandSize.DWORD, msbVarb));
// Isolate MSB(Result)
instructions.add(ReilHelpers.createBsh(baseOffset++, OperandSize.DWORD, targetRegister, OperandSize.WORD, "-31", OperandSize.DWORD, msbVarr));
// perform overflow calculation ( msbA XOR msbB ) AND ( msbB XOR msbR ) == OF
instructions.add(ReilHelpers.createXor(baseOffset++, OperandSize.DWORD, msbVara, OperandSize.DWORD, msbVarb, OperandSize.DWORD, tmpVar4));
instructions.add(ReilHelpers.createXor(baseOffset++, OperandSize.DWORD, msbVarb, OperandSize.DWORD, msbVarr, OperandSize.DWORD, tmpVar3));
instructions.add(ReilHelpers.createAnd(baseOffset++, OperandSize.DWORD, tmpVar4, OperandSize.DWORD, tmpVar3, OperandSize.DWORD, overflowTmp));
// set XER register bits according to the current register state and overflow calculation
instructions.add(ReilHelpers.createStr(baseOffset++, OperandSize.DWORD, overflowTmp, OperandSize.WORD, Helpers.XER_OVERFLOW));
instructions.add(ReilHelpers.createOr(baseOffset++, OperandSize.WORD, Helpers.XER_SUMMARY_OVERFLOW, OperandSize.DWORD, overflowTmp, OperandSize.WORD, Helpers.XER_SUMMARY_OVERFLOW));
}
if (setCarry) {
// isolate the carry bit
instructions.add(ReilHelpers.createBsh(baseOffset++, OperandSize.QWORD, extendedSubResult, OperandSize.DWORD, "-32", OperandSize.WORD, Helpers.XER_CARRY_BIT));
}
if (setCr) {
// EQ CR0
instructions.add(ReilHelpers.createBisz(baseOffset++, OperandSize.DWORD, targetRegister, OperandSize.BYTE, Helpers.CR0_EQUAL));
// LT CR0
instructions.add(ReilHelpers.createBsh(baseOffset++, OperandSize.DWORD, targetRegister, OperandSize.WORD, "-31", OperandSize.BYTE, Helpers.CR0_LESS_THEN));
// GT CR0
instructions.add(ReilHelpers.createOr(baseOffset++, OperandSize.BYTE, Helpers.CR0_EQUAL, OperandSize.BYTE, Helpers.CR0_LESS_THEN, OperandSize.BYTE, crTemp));
instructions.add(ReilHelpers.createBisz(baseOffset++, OperandSize.BYTE, crTemp, OperandSize.BYTE, Helpers.CR0_GREATER_THEN));
// SO CR0
instructions.add(ReilHelpers.createStr(baseOffset, OperandSize.BYTE, Helpers.XER_SUMMARY_OVERFLOW, OperandSize.BYTE, Helpers.CRO_SUMMARY_OVERFLOW));
}
}
use of com.google.security.zynamics.zylib.disassembly.IOperandTreeNode in project binnavi by google.
the class SubfcDotTranslator method translate.
@Override
public void translate(final ITranslationEnvironment environment, final IInstruction instruction, final List<ReilInstruction> instructions) throws InternalTranslationException {
TranslationHelpers.checkTranslationArguments(environment, instruction, instructions, "subfc.");
final IOperandTreeNode registerOperand1 = instruction.getOperands().get(1).getRootNode().getChildren().get(0);
final IOperandTreeNode registerOperand2 = instruction.getOperands().get(2).getRootNode().getChildren().get(0);
SubGenerator.generate(instruction.getAddress().toLong() * 0x100, environment, instruction, instructions, "subfc.", registerOperand1.getValue(), registerOperand2.getValue(), true, false, true, false);
}
use of com.google.security.zynamics.zylib.disassembly.IOperandTreeNode in project binnavi by google.
the class SubfeDotTranslator method translate.
@Override
public void translate(final ITranslationEnvironment environment, final IInstruction instruction, final List<ReilInstruction> instructions) throws InternalTranslationException {
TranslationHelpers.checkTranslationArguments(environment, instruction, instructions, "subfe.");
final IOperandTreeNode registerOperand1 = instruction.getOperands().get(1).getRootNode().getChildren().get(0);
final IOperandTreeNode registerOperand2 = instruction.getOperands().get(2).getRootNode().getChildren().get(0);
SubGenerator.generate(instruction.getAddress().toLong() * 0x100, environment, instruction, instructions, "subfe.", registerOperand1.getValue(), registerOperand2.getValue(), true, false, true, true);
}
Aggregations