/** * Translates a OR instruction to REIL code. * * @param environment A valid translation environment. * @param instruction The OR instruction to translate. * @param instructions The generated REIL code will be added to this list * @throws InternalTranslationException if any of the arguments are null the passed instruction is * not a OR instruction */ @Override public void translate( final ITranslationEnvironment environment, final IInstruction instruction, final List<ReilInstruction> instructions) throws InternalTranslationException { TranslationHelpers.checkTranslationArguments(environment, instruction, instructions, "or"); if (instruction.getOperands().size() != 2) { throw new InternalTranslationException( "Error: Argument instruction is not a or instruction (invalid number of operands)"); } final long baseOffset = instruction.getAddress().toLong() * 0x100; long offset = baseOffset; final List<? extends IOperandTree> operands = instruction.getOperands(); final IOperandTree targetOperand = operands.get(0); final IOperandTree sourceOperand = operands.get(1); // Load source operand. final TranslationResult sourceResult = Helpers.translateOperand(environment, offset, sourceOperand, true); instructions.addAll(sourceResult.getInstructions()); // Adjust the offset of the next REIL instruction. offset = baseOffset + instructions.size(); // Load destination operand. final TranslationResult targetResult = Helpers.translateOperand(environment, offset, targetOperand, true); instructions.addAll(targetResult.getInstructions()); // Adjust the offset of the next REIL instruction. offset = baseOffset + instructions.size(); final OperandSize size = targetResult.getSize(); final String sourceRegister = sourceResult.getRegister(); final String targetRegister = targetResult.getRegister(); final String orResult = environment.getNextVariableString(); // Do the OR operation instructions.add( ReilHelpers.createOr(offset, size, sourceRegister, size, targetRegister, size, orResult)); // Set the flags according to the result of the OR operation Helpers.generateBinaryOperationFlags(environment, offset + 1, orResult, size, instructions); offset = baseOffset + instructions.size(); // Write the result of the OR operation back into the target operand Helpers.writeBack( environment, offset, targetOperand, orResult, size, targetResult.getAddress(), targetResult.getType(), instructions); }