Nan Xu

44 papers Misc 1Journal 43
YearRankTypeTitle / Venue / Authors
2026 J jnl
Geo spatial Inf. Sci.
Hao Xu, Nan Xu, Chi Zhang, Shanhang Chi, Yuan Li, Wenyu Li, Yifu Ou, Jiaqi Yao, Han-Su Zhang, Fan Mo, Hui Lu
2026 J jnl
Expert Syst. Appl.
Zhen Wang, Fu-Lin He, Nan Xu, Zhuhong You
2026 J jnl
Inf. Fusion
Jiayuan Li, Zhen Wang, Nan Xu, Zhuhong You
2025 J jnl
Int. J. Digit. Earth
Jiaqi Yao, Mengran Wang, Nan Xu, Tong Liu, Fan Mo, Xue Li, Yongqiang Cao, Kebing Chen, Jinyan Sun, Hui Lu
2025 J jnl
IEEE Trans. Geosci. Remote. Sens.
Yu Li, Lei Zhou, Dongzhen Jia, Yihao Wu, Nan Xu
2025 J jnl
Int. J. Appl. Earth Obs. Geoinformation
Nan Xu, Hao Xu, Wenyu Li, Hui Lu, Yongze Song, Jiaqi Yao, Yue Ma, He Ren, Tingting He, Fan Mo, Peng Gong
2025 J jnl
IEEE J. Sel. Top. Appl. Earth Obs. Remote. Sens.
Can Lu, Feng Wang, Zhen Wang, Nan Xu, Zhuhong You, De-Shuang Huang
2025 J jnl
IEEE Trans. Geosci. Remote. Sens.
Yuhao Wang, Conghong Huang, Yue Ma, Xin Ma, Yifu Ou, Chunpeng Chen, Binbin Li, Shaoguang Zhou, Dongzhen Jia, Zhen Wang, Qingquan Li, Nan Xu
2025 J jnl
Inf. Fusion
Zhen Wang, Jiayuan Li, Nan Xu, Zhuhong You
2025 J jnl
Geo spatial Inf. Sci.
Nan Xu, Lin Wang, Yue Ma, Xin Ma, Xiaohua Wang
2025 J jnl
IEEE J. Sel. Top. Appl. Earth Obs. Remote. Sens.
Zhen Wang, Zhuhong You, Nan Xu, Buhong Wang, De-Shuang Huang
2025 J jnl
IEEE J. Sel. Top. Appl. Earth Obs. Remote. Sens.
Shen-Ao Yuan, Zhen Wang, Jiayuan Li, Nan Xu, Zhuhong You, De-Shuang Huang
2025 J jnl
IEEE Trans. Geosci. Remote. Sens.
Zhen Wang, Shen-Ao Yuan, Ruixiang Li, Nan Xu, Zhuhong You, De-Shuang Huang
2025 J jnl
IEEE Geosci. Remote. Sens. Lett.
Jiayuan Li, Zhen Wang, Nan Xu, Zhuhong You
2025 J jnl
IEEE J. Sel. Top. Appl. Earth Obs. Remote. Sens.
Zhen Wang, Jiayuan Li, Nan Xu, Zhuhong You
2025 J jnl
IEEE J. Sel. Top. Appl. Earth Obs. Remote. Sens.
José Luis Pancorbo, Ruixiang Li, María D. Raya-Sereno, Nan Xu, Zhuhong You
2025 J jnl
IEEE Geosci. Remote. Sens. Lett.
Fan Mo, Xinming Tang, Yingbao Yang, Junfeng Xie, Nan Xu, Haoran Xia
2025 J jnl
IEEE Trans. Geosci. Remote. Sens.
Yuanfei Gu, Jian Yang, Yue Ma, Yao Li, Nan Xu, Xiao Hua Wang
2025 J jnl
Int. J. Digit. Earth
Jiaqi Yao, Nan Xu, Mengran Wang, Tong Liu, Hui Lu, Yongqiang Cao, Xinming Tang, Fan Mo, Huanyu Chang, Haiying Gong, Huichao Xin, Hao Xu
2025 J jnl
IEEE J. Sel. Top. Appl. Earth Obs. Remote. Sens.
Fu-Lin He, Zhen Wang, Nan Xu, Zhuhong You, Deshuang Huang
2025 J jnl
Int. J. Digit. Earth
Jiaqi Yao, Hui Lu, Nan Xu, Guoyuan Li, Xinming Tang, Chen Ma, Zhao Liu, Qingkai Lu, Haobin Xia, Huichao Xin, Jiarui Wu, Taixia Wu
2025 J jnl
IEEE Trans. Geosci. Remote. Sens.
Zhen Wang, Zhu-Hong You, Nan Xu, Chuanlei Zhang, De-Shuang Huang
2025 J jnl
IEEE Trans. Geosci. Remote. Sens.
Jiayuan Li, Zhen Wang, Nan Xu, Zhuhong You, De-Shuang Huang
2024 J jnl
IEEE J. Sel. Top. Appl. Earth Obs. Remote. Sens.
Hanyuan Liu, Yue Shi, Qinnan Chang, Rufat Guluzade, Xin Pan, Nan Xu, Penghua Hu, Xuechun Kong, Yingbao Yang
2024 J jnl
IEEE Geosci. Remote. Sens. Lett.
Xin Li, Feng Xu, Linyang Li, Nan Xu, Fan Liu, Chi Yuan, Ziqi Chen, Xin Lyu
2024 J jnl
Int. J. Appl. Earth Obs. Geoinformation
Rui Tu, Xiaolei Wang, Nan Xu, Junqiang Han, Tao Wang, Weisheng Wang, Feng Zhao, Bayin Dalai, Gulayozov Majid Shonazarovich
2024 Misc conf
ICASSP
Xin Li, Feng Xu, Runliang Xia, Nan Xu, Fan Liu, Chi Yuan, Qian Huang, Xin Lyu
2024 J jnl
IEEE J. Sel. Top. Appl. Earth Obs. Remote. Sens.
Nan Xu, Lin Wang, Han-Su Zhang, Shilin Tang, Fan Mo, Xin Ma
2024 J jnl
Int. J. Digit. Earth
Ming Ni, Nan Xu, Yifu Ou, Jiaqi Yao, Zhichao Li, Fan Mo, Conghong Huang, Huichao Xin, Hao Xu
2023 J jnl
IEEE Geosci. Remote. Sens. Lett.
Ting Zhang, Jian Yang, Yue Ma, Nan Xu, Hui Zhou, Xiao Hua Wang
2023 J jnl
Remote. Sens.
Jiarui Wu, Xiao Huang, Nan Xu, Qishuai Zhu, Conrad Zorn, Wenzhou Guo, Jiangnan Wang, Beibei Wang, Shuaibo Shao, Chaoqing Yu
2023 J jnl
Remote. Sens.
Dongzhen Jia, Yu Li, Xiufeng He, Zhixiang Yang, Yihao Wu, Taixia Wu, Nan Xu
2022 J jnl
IEEE Geosci. Remote. Sens. Lett.
Nan Xu, Yue Ma, Hui Zhou, Wenhao Zhang, Zhiyu Zhang, Xiao Hua Wang
2022 J jnl
Int. J. Appl. Earth Obs. Geoinformation
Conghong Huang, Nan Xu
2022 J jnl
IEEE Trans. Geosci. Remote. Sens.
Zhen Wang, Nan Xu, Jianxin Guo, Chuanlei Zhang, Buhong Wang
2021 J jnl
IEEE J. Sel. Top. Appl. Earth Obs. Remote. Sens.
Nan Xu, Xin Ma, Yue Ma, Pufan Zhao, Jian Yang, Xiao Hua Wang
2021 J jnl
Remote. Sens.
Nan Xu, Huiying Zheng, Yue Ma, Jian Yang, Xinyuan Liu, Xiaohua Wang
2021 J jnl
Remote. Sens.
Zhiyu Zhang, Xinyuan Liu, Yue Ma, Nan Xu, Wenhao Zhang, Song Li
2021 J jnl
IEEE Geosci. Remote. Sens. Lett.
Nan Xu, Yue Ma, Wenhao Zhang, Xiao Hua Wang
2020 J jnl
Remote. Sens.
Luojia Hu, Nan Xu, Jian Liang, Zhichao Li, Luzhen Chen, Feng Zhao
2020 J jnl
IEEE Access
Jinyan Sun, Nan Xu, Lei Ding, Yue Ma, Zhengjia Liu, Zuoji Huang
2020 J jnl
Remote. Sens.
Nan Xu, Yue Ma, Wenhao Zhang, Xiao Hua Wang, Fanlin Yang, Dianpeng Su
2020 J jnl
IEEE J. Sel. Top. Appl. Earth Obs. Remote. Sens.
Zhengjia Liu, Nan Xu, Jieyong Wang
2019 J jnl
Remote. Sens.
Yue Ma, Wenhao Zhang, Jinyan Sun, Guoyuan Li, Xiao Hua Wang, Song Li, Nan Xu
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