Wayne Holmes

40 papers A 6B 3Journal 14Unranked 16
YearRankTypeTitle / Venue / Authors
2026 J jnl
J. Learn. Anal.
Josmario Albuquerque, Bart Rienties, Martin Hlosta, Wayne Holmes
2025 J jnl
Interact. Learn. Environ.
Josmario Albuquerque, Bart Rienties, Wayne Holmes, Martin Hlosta
2025 J jnl
Int. J. Artif. Intell. Educ.
Imogen Casebourne, Shengpeng Shi, Michael Hogan, Wayne Holmes, Tore Hoel, Rupert Wegerif, Li Yuan
2024 J jnl
Int. J. Artif. Intell. Educ.
Wayne Holmes
2024 J jnl
Int. J. Artif. Intell. Educ.
Wayne Holmes
2024 conf
AIED Companion (2)
Christian M. Stracke, Irene-Angelica Chounta, Vania Dimitrova, Beth Havinga, Wayne Holmes
2024 conf
AIED Companion (1)
Christian M. Stracke, Irene-Angelica Chounta, Wayne Holmes
2024 conf
AIED Companion (2)
Cleo Schulten, Li Yuan, Kiev Gama, Wayne Holmes, Alexander Nolte, Tore Hoel, Irene-Angelica Chounta
2024 J jnl
CoRR
Kaska Porayska-Pomsta, Wayne Holmes, Selena Nemorin
2023 conf
AIED (Posters/Late Breaking Results/...)
Wayne Holmes, Christian M. Stracke, Irene-Angelica Chounta, Dale Allen, Duuk Baten, Vania Dimitrova, Beth Havinga, Juliette Norrmen-Smith, Barbara Wasson
2023 conf
AIED (Posters/Late Breaking Results/...)
Wayne Holmes, Judy Kay
2023 J jnl
ACM Trans. Access. Comput.
Francisco Iniesto, Tim Coughlan, Kate Lister, Peter Devine, Nick Freear, Richard Greenwood, Wayne Holmes, Ian Kenny, Kevin McLeod, Ruth Tudor
2022 J jnl
Int. J. Artif. Intell. Educ.
Wayne Holmes, Kaska Porayska-Pomsta, Ken Holstein, Emma Sutherland, Toby Baker, Simon Buckingham Shum, Olga C. Santos, Maria Mercedes T. Rodrigo, Mutlu Cukurova, Ig Ibert Bittencourt, Kenneth R. Koedinger
2022 conf
SIGCSE (2)
Oli Howson, Patricia Charlton, Francisco Iniesto, Wayne Holmes
2022 J jnl
CoRR
Kaska Porayska-Pomsta, Wayne Holmes
2022 conf
AIED (2)
Beate Grawemeyer, Manolis Mavrikis, Wayne Holmes
2021 J jnl
Interact. Learn. Environ.
Jingjing Zhang, Ming Gao, Wayne Holmes, Manolis Mavrikis, Ning Ma
2020 ch.
Encyclopedia of Education and Information Technologies
Wayne Holmes
2020 A conf
ASSETS
Francisco Iniesto, Tim Coughlan, Kate Lister, Wayne Holmes
2019 conf
AIED (2)
Wayne Holmes, Juliette Culver
2019 conf
AIED (2)
Lawrence Kizilkaya, David Vince, Wayne Holmes
2019 B conf
L@S
Wayne Holmes, Stamatina Anastopoulou
2019 J jnl
Br. J. Educ. Technol.
Alexandra Okada, Denise Whitelock, Wayne Holmes, Chris Edwards
2018 conf
AIED (2)
Manolis Mavrikis, Wayne Holmes, Jingjing Zhang, Ning Ma
2018 B conf
L@S
Chris Edwards, Wayne Holmes, Denise Whitelock, Ale Okada
2017 J jnl
IxD&A
Bart Rienties, Quan Nguyen, Wayne Holmes, Katharine Reedy
2017 J jnl
User Model. User Adapt. Interact.
Beate Grawemeyer, Manolis Mavrikis, Wayne Holmes, Sergio Gutiérrez Santos, Michael Wiedmann, Nikol Rummel
2017 J jnl
Comput. Educ.
Asimina Vasalou, Rilla Khaled, Wayne Holmes, Daniel Gooch
2017 conf
TEA
Alexandra Okada, Denise Whitelock, Wayne Holmes, Chris Edwards
2017 B conf
EDM
Beate Grawemeyer, Alex Wollenschlaeger, Sergio Gutiérrez Santos, Wayne Holmes, Manolis Mavrikis, Alexandra Poulovassilis
2016 A conf
LAK
Beate Grawemeyer, Manolis Mavrikis, Wayne Holmes, Sergio Gutiérrez Santos, Michael Wiedmann, Nikol Rummel
2016 conf
ICLS
Nikol Rummel, Manolis Mavrikis, Michael Wiedmann, Katharina Loibl, Claudia Mazziotti, Wayne Holmes, Alice Hansen
2015 A conf
AIED
Beate Grawemeyer, Manolis Mavrikis, Wayne Holmes, Sergio Gutiérrez Santos
2015 A conf
AIED
Beate Grawemeyer, Manolis Mavrikis, Wayne Holmes, Alice Hansen, Katharina Loibl, Sergio Gutiérrez Santos
2015 A conf
IUI
Beate Grawemeyer, Wayne Holmes, Sergio Gutiérrez Santos, Alice Hansen, Katharina Loibl, Manolis Mavrikis
2015 A conf
AIED
Wayne Holmes, Manolis Mavrikis, Alice Hansen, Beate Grawemeyer
2015 conf
AIED Workshops
Claudia Mazziotti, Wayne Holmes, Michael Wiedmann, Katharina Loibl, Nikol Rummel, Manolis Mavrikis, Alice Hansen, Beate Grawemeyer
2015 conf
AIED Workshops
Beate Grawemeyer, Manolis Mavrikis, Wayne Holmes, Alice Hansen, Katharina Loibl, Sergio Gutiérrez Santos
2015 conf
EDM (Workshops)
Beate Grawemeyer, Manolis Mavrikis, Wayne Holmes, Alice Hansen, Katharina Loibl, Sergio Gutiérrez Santos
2011 conf
PE-WASUN
Saeed Ur Rehman, Stevan M. Berber, Akshya K. Swain, Wayne Holmes
redb/extractors/decompiler/bninja/arch/x86.py
← Index redb/extractors/decompiler/bninja/arch/x86.py python
from binaryninja.enums import (
    InstructionTextTokenType,
)

# Support both package and standalone imports
try:
    from .architecture import Architecture
except ImportError:
    # Fallback to absolute imports (for multiprocessing spawned processes)
    from redb.extractors.decompiler.bninja.arch.architecture import Architecture


class Arch_x86(Architecture):
    """The concrete class for architecture-dependent details for x86_64"""

    def __init__(self):
        # general purpose registers for 64bits
        self.gpr_64 = [
            "RAX",
            "RBX",
            "RCX",
            "RDX",
            "RSI",
            "RDIR9",
            "R10",
            "R11",
            "R12",
            "R13",
            "R14",
            "R15",
        ]

        self.gpr_32 = [
            "EAX",
            "EBX",
            "ECX",
            "EDX",
            "ESI",
            "EDI",
            "R8D",
            "R9D",
            "R10D",
            "R11D",
            "R12D",
            "R13D",
            "R14D",
            "R15D",
        ]

        self.gpr_16 = [
            "AX",
            "BX",
            "CX",
            "DX",
            "SI",
            "DI",
            "R8W",
            "R9W",
            "R10W",
            "R11W",
            "R12W",
            "R13W",
            "R14W",
            "R15W",
        ]

        self.gpr_8 = [
            "AL",
            "BL",
            "CL",
            "DL",
            "SIL",
            "DIL",
            "R8B",
            "R9B",
            "R10B",
            "R11B",
            "R12B",
            "R13B",
            "R14B",
            "R15B",
        ]

        self.fpu_x87 = ["ST0", "ST1", "ST2", "ST3", "ST4", "ST5", "ST6", "ST7"]

        self.sse_xmm = [
            "XMM0",
            "XMM1",
            "XMM2",
            "XMM3",
            "XMM4",
            "XMM5",
            "XMM6",
            "XMM7",
            "XMM8",
            "XMM9",
            "XMM10",
            "XMM11",
            "XMM12",
            "XMM13",
            "XMM14",
            "XMM15",
        ]

        self.avx_ymm = [
            "YMM0",
            "YMM1",
            "YMM2",
            "YMM3",
            "YMM4",
            "YMM5",
            "YMM6",
            "YMM7",
            "YMM8",
            "YMM9",
            "YMM10",
            "YMM11",
            "YMM12",
            "YMM13",
            "YMM14",
            "YMM15",
        ]
        self.flags = ["FLAGS", "EFLAGS", "RFLAGS"]
        self.stack_registers = ["RBP", "RSP", "SP", "BP"]
        self.size = 8
        self.global_registers = (
            self.gpr_64
            + self.gpr_32
            + self.gpr_16
            + self.gpr_8
            + self.fpu_x87
            + self.sse_xmm
            + self.avx_ymm
        )
        self.opcode_categories = self._initialize_opcode_categories()

        ## instructions
        self.instructions = []

    def is_register(self, register):
        register = register.upper()
        return register in self.global_registers

    def is_general_purpose_register(self, register):
        register = register.upper()
        return (
            register in self.gpr_64
            or register in self.gpr_32
            or register in self.gpr_16
            or register in self.gpr_8
        )

    def is_stack_register(self, register):
        register = register.upper()
        return register in self.stack_registers

    def is_xmm_register(self, register):
        register = register.upper()
        return register in self.sse_xmm

    def is_control_flow(self, instr_tokens):
        return False

    def is_control_flow_instruction(self, instr_tokens):
        """Check if an instruction is a control flow instruction (jump, call, return, loop)."""
        try:
            # Extract the mnemonic from the instruction tokens
            mnemonic = None
            for token in instr_tokens:
                if token.type == InstructionTextTokenType.InstructionToken:
                    mnemonic = token.text.upper()
                    break

            if not mnemonic:
                return False

            # Check if it's a jump, call, return, or loop instruction
            return (
                mnemonic.startswith("J")  # All jumps (JMP, JE, JNE, etc.)
                or mnemonic == "CALL"  # Function calls
                or mnemonic == "RET"  # Return
                or mnemonic == "RETN"  # Another form of return
                or mnemonic.startswith("LOOP")
            )  # Loop instructions

        except Exception as e:
            print(e)
            # If we can't determine, assume it's not a control flow instruction
            return False

    def is_control_flow_instruction_by_mnemonic(self, mnemonic):
        """Check if an instruction is a control flow instruction based on its mnemonic."""
        if not mnemonic:
            return False

        mnemonic = mnemonic.upper()
        return (
            mnemonic.startswith("J")  # All jumps (JMP, JE, JNE, etc.)
            or mnemonic == "CALL"  # Function calls
            or mnemonic == "RET"  # Return
            or mnemonic == "RETN"  # Another form of return
            or mnemonic.startswith("LOOP")
        )

    def _initialize_opcode_categories(self):
        """Initialize mapping of opcodes to categories similar to Ghidra's implementation."""
        opcode_categories = {}
        opcode_index = {}  # Add this to mimic Ghidra's opcodeIndex

        # Define common opcodes array similar to Ghidra's COMMON_OPCODES
        COMMON_OPCODES = [
            # Core instructions (tracked individually)
            "MOV",
            "PUSH",
            "POP",
            "LEA",
            "CALL",
            "RET",  # Data movement and control
            "ADD",
            "SUB",
            "MUL",
            "DIV",  # Basic arithmetic
            "AND",
            "OR",
            "XOR",
            "NOT",  # Logical operations
            "JMP",
            "JE",
            "JNE",  # Basic jumps
            "TEST",
            "CMP",  # Comparisons
            # Grouped categories (aggregated tracking)
            "SIMD_MOVE",  # MOVAPS, MOVDQA, MOVDQU, etc.
            "COND_JUMP_EXT",  # Other conditional jumps (JG, JL, JGE, etc.)
            "STRING_OP",  # MOVS, STOS, LODS, SCAS, CMPS
            "STACK_ADV",  # ENTER, LEAVE, PUSHA, POPA
            "ARITHMETIC_ADV",  # IMUL, IDIV, ADC, SBB
            "BIT_OP",  # SHL, SHR, SAR, ROL, ROR, etc.
            "FPU_OP",  # FLD, FST, FADD, etc.
            "SYSTEM_OP",  # SYSCALL, INT, SYSENTER
            "CRYPTO_OP",  # AES*, SHA* instructions
            "MISC_OP",  # Rare but interesting (CPUID, RDTSC, etc.)
        ]

        # Create index map like Ghidra
        for i, opcode in enumerate(COMMON_OPCODES):
            opcode_index[opcode] = i

        # Now categorize opcodes using if/elif/else structure like in Ghidra
        for opcode in COMMON_OPCODES:
            # String Operations (checking these first to avoid MOV confusion)
            if opcode.startswith("MOVS") or opcode in [
                "STOS",
                "LODS",
                "SCAS",
                "CMPS",
                "REP",
                "REPE",
                "REPNE",
            ]:
                opcode_categories[opcode] = "STRING_MANIPULATION"

            # Data Movement (after string ops to avoid MOVS confusion)
            elif opcode.startswith("MOV") or opcode in ["LEA", "XCHG"]:
                opcode_categories[opcode] = "DATA_MOVEMENT"

            # Stack Operations
            elif opcode in ["PUSH", "POP", "ENTER", "LEAVE", "PUSHA", "POPA"]:
                opcode_categories[opcode] = "STACK_MANAGEMENT"

            # Control Flow (non-conditional)
            elif opcode in ["JMP", "CALL", "RET"]:
                opcode_categories[opcode] = "CONTROL_FLOW"

            # Conditional Jumps and Loops
            elif opcode.startswith("J") or opcode.startswith("LOOP"):
                opcode_categories[opcode] = "CONDITIONAL_JUMP"

            # Arithmetic
            elif opcode in [
                "ADD",
                "SUB",
                "MUL",
                "DIV",
                "IMUL",
                "IDIV",
                "ADC",
                "SBB",
                "INC",
                "DEC",
                "NEG",
            ]:
                opcode_categories[opcode] = "ARITHMETIC"

            # Logical
            elif opcode in ["AND", "OR", "XOR", "NOT", "TEST", "CMP"]:
                opcode_categories[opcode] = "LOGICAL"

            # Shifts & Rotates
            elif opcode in ["SHL", "SHR", "SAR", "SAL", "ROL", "ROR", "RCL", "RCR"]:
                opcode_categories[opcode] = "SHIFT_ROTATE"

            # System & Interrupts
            elif opcode in [
                "SYSCALL",
                "INT",
                "SYSENTER",
                "SYSEXIT",
                "SGDT",
                "SIDT",
                "SLDT",
                "WRMSR",
                "RDMSR",
            ]:
                opcode_categories[opcode] = "SYSTEM_CALLS"

            # Floating Point
            elif opcode.startswith("F"):
                opcode_categories[opcode] = "FPU_ARITHMETIC"

            # System Information and Random Number Generation
            elif opcode in ["PUSHF", "POPF", "CPUID", "RDTSC", "RDRAND", "RDSEED"]:
                opcode_categories[opcode] = "CPU_FEATURES"

            # Cryptography
            elif opcode.startswith("AES") or opcode.startswith("SHA"):
                opcode_categories[opcode] = "CRYPTOGRAPHIC"

            # Miscellaneous (including flag operations)
            else:
                opcode_categories[opcode] = "MISC"

        # Additional categorization for opcodes not in COMMON_OPCODES
        # This can be used in the normalize_opcode method

        # Store both maps as instance variables
        # self.opcode_categories = opcode_categories
        self.opcode_index = opcode_index

        return opcode_categories

    def is_simd_register(self, register):
        return register in self.sse_xmm