Majdi Mansouri

137 papers A 1B 12C 16Misc 12Journal 51Unranked 44
YearRankTypeTitle / Venue / Authors
2026 J jnl
IEEE Access
Maher Kouraichi, Majdi Mansouri, Anis Sakly, Mohamed Trabelsi, Faïçal Mnif
2026 J jnl
IEEE Access
Jamila Snoussi, Majdi Mansouri, Mohamed Faouzi Mimouni, Ahmed Chiheb Ammari
2026 J jnl
IEEE Access
Ismail Nasri, Majdi Mansouri, Mohamed Trabelsi, Lazhar Khriji, Adam Waldemar Skorek
2026 J jnl
IEEE Trans. Ind. Informatics
Majdi Mansouri, Khadija Attouri, Abdelmalek Kouadri
2026 J jnl
IEEE Access
Khadija Attouri, Majdi Mansouri, Abdelmalek Kouadri, Rami Al-Hmouz, Abdulnasir Hossen
2026 J jnl
Adv. Eng. Informatics
Romdhan Nasri, Majdi Mansouri, Zouhaier Affi, Vicenç Puig
2025 J jnl
IEEE Access
Romdhan Nasri, Jannet Jamii, Majdi Mansouri, Zouhaier Affi, Vicenç Puig
2025 J jnl
IEEE Access
Abdelsalam El Haffar, Naser El-Naily, Majdi Mansouri
2025 J jnl
IEEE Access
Dhouha Miri, Mohamed Guerfel, Atef Khedher, Majdi Mansouri, Kamel BenOthman
2025 J jnl
IEEE Access
Imen Nakti, Majdi Mansouri, Rami Al-Hmouz, Atef Khedher
2025 J jnl
Expert Syst. Appl.
Mohammed Tahar Habib Kaib, Abdelmalek Kouadri, Mohamed Faouzi Harkat, Abderazak Bensmail, Majdi Mansouri
2025 J jnl
IEEE Access
Maher Kouraichi, Majdi Mansouri, Mohamed Trabelsi, Anis M'halla, Ayman S. Abdel-Khalik, Anis Sakly
2025 J jnl
IEEE Access
Lazhar Kheriji, Abdelmalek Kouadri, Majdi Mansouri
2025 J jnl
IEEE Access
Ismail Nasri, Majdi Mansouri, Shady S. Refaat, Khaled Dhibi, Adam Waldemar Skorek
2025 conf
ICAISC (1)
Rami Al-Hmouz, Witold Pedrycz, Majdi Mansouri, Ahmed Al-Hmouz
2025 J jnl
IEEE Access
Abdelhalim Louifi, Abdelmalek Kouadri, Mohamed Faouzi Harkat, Abderazak Bensmail, Majdi Mansouri
2025 J jnl
Comput. Electr. Eng.
Zahra Yahyaoui, Walid Touti, Mansour Hajji, Majdi Mansouri, Yassine Bouazzi, Kais Bouzrara
2025 J jnl
IEEE Access
Majdi Mansouri, Khadija Attouri, Shady S. Refaat
2025 J jnl
IEEE Access
Rakia Tarkhani, Saber Krim, Majdi Mansouri, Mohamed Faouzi Mimouni
2025 J jnl
IEEE Access
Dine El Houda Hammami, Saber Maraoui, Majdi Mansouri, Kais Bouzrara, Faisal Mnif
2024 C conf
CoDIT
Lahcene Rouani, Mohamed Faouzi Harkat, Abdelmalek Kouadri, Abderazak Bensmail, Majdi Mansouri, Mohamed N. Nounou
2024 J jnl
IEEE Access
Mohamed Ali Zeddini, Saber Krim, Majdi Mansouri, Mohamed Faouzi Mimouni, Anis Sakly
2024 C conf
CoDIT
Amal Hichri, Wajdi Saadaoui, Mansour Hajji, Majdi Mansouri, Mohamed N. Nounou, Kais Bouzrara
2024 J jnl
IEEE Access
Mohammed Tahar Habib Kaib, Abdelmalek Kouadri, Mohamed Faouzi Harkat, Abderazak Bensmail, Majdi Mansouri
2024 C conf
CoDIT
Jannet Jamii, Romdhan Nasri, Majdi Mansouri, Mohamed Faouzi Mimouni, Zouhair Afi, Vicenç Puig
2024 C conf
CoDIT
Zahra Yahyaoui, Wajdi Saadaoui, Mansour Hajji, Majdi Mansouri, Mohamed N. Nounou, Kais Bouzrara
2024 C conf
CoDIT
Khadija Attouri, Majdi Mansouri, Mansour Hajji, Abdelmalek Kouadri, Kais Bouzrara, Hazem N. Nounou
2024 C conf
CoDIT
Khadija Attouri, Majdi Mansouri, Mansour Hajji, Abdelmalek Kouadri, Kais Bouzrara, Hazem N. Nounou
2024 C conf
CoDIT
Abdelhalim Louifi, Abdelmalek Kouadri, Mohamed Faouzi Harkat, Abderazak Bensmail, Majdi Mansouri, Hazem N. Nounou
2023 conf
SSD
Jannet Jamii, Mohamed Trabelsi, Majdi Mansouri, Mohamed Faouzi Mimouni
2023 J jnl
IEEE Access
Khaled Dhibi, Majdi Mansouri, Mohamed Trabelsi, Kamaleldin Abodayeh, Kais Bouzrara, Hazem N. Nounou, Mohamed N. Nounou
2023 J jnl
IEEE Access
Ali Ajmi, Saber Krim, Anissa Hosseyni, Majdi Mansouri, Mohamed Faouzi Mimouni
2023 conf
SSD
Nesrine Omri, Jannet Jamii, Majdi Mansouri, Mohamed Faouzi Mimouni
2022 conf
SSD
Amal Hichri, Mansour Hajji, Majdi Mansouri, Kais Bouzrara, Hazem N. Nounou, Mohamed N. Nounou
2022 conf
SSD
Manel Marweni, Radhia Fezai, Mansour Hajji, Majdi Mansouri
2022 C conf
CoDIT
Khadija Attouri, Majdi Mansouri, Mansour Hajji, Kais Bouzrara, Hazem N. Nounou, Mohamed N. Nounou
2022 C conf
CoDIT
Manel Marweni, Radhia Fezai, Mansour Hajji, Majdi Mansouri, Kais Bouzrara, Hazem N. Nounou, Mohamed N. Nounou
2022 C conf
CoDIT
Khaled Dhibi, Majdi Mansouri, Kais Bouzrara, Hazem N. Nounou, Mohamed N. Nounou
2022 C conf
CoDIT
Amal Hichri, Majdi Mansouri, Mansour Hajji, Kais Bouzrara, Hazem N. Nounou, Mohamed N. Nounou
2022 C conf
CoDIT
Khaled Dhibi, Majdi Mansouri, Kais Bouzrara, Hazem N. Nounou, Mohamed N. Nounou
2022 J jnl
IEEE Access
Khaled Dhibi, Majdi Mansouri, Kamaleldin Abodayeh, Kais Bouzrara, Hazem N. Nounou, Mohamed N. Nounou
2022 J jnl
IEEE Access
Majdi Mansouri, Khaled Dhibi, Hazem N. Nounou, Mohamed N. Nounou
2022 C conf
CoDIT
Zahra Yahyaoui, Mansour Hajji, Majdi Mansouri, Kais Bouzrara, Hazem N. Nounou, Mohamed N. Nounou
2022 conf
SSD
Khaled Dhibi, Majdi Mansouri, Kais Bouzrara, Hazem N. Nounou, Mohamed N. Nounou
2022 conf
SSD
Jannet Jamii, Majdi Mansouri, Mohamed Faouzi Mimouni
2022 conf
SSD
Khaled Dhibi, Majdi Mansouri, Kais Bouzrara, Hazem N. Nounou, Mohamed N. Nounou
2021 J jnl
IEEE Access
Khaled Dhibi, Radhia Fezai, Majdi Mansouri, Mohamed Trabelsi, Kais Bouzrara, Hazem N. Nounou, Mohamed N. Nounou
2021 conf
SSD
Radhia Fezai, Kais Bouzrara, Majdi Mansouri, Hazem N. Nounou, Mohamed N. Nounou, Vicenç Puig
2021 J jnl
IEEE Access
Khaled Dhibi, Majdi Mansouri, Kais Bouzrara, Hazem N. Nounou, Mohamed N. Nounou
2021 J jnl
IEEE Access
Majdi Mansouri, Mohamed Trabelsi, Hazem N. Nounou, Mohamed N. Nounou
2021 conf
SSD
Khaled Dhibi, Radhia Fezai, Kais Bouzrara, Majdi Mansouri, Hazem N. Nounou, Mohamed N. Nounou, Mohamed Trabelsi
2021 J jnl
Int. J. Control
Imen Baklouti, Majdi Mansouri, Ahmed Ben Hamida, Hazem Numan Nounou, Mohamed N. Nounou
2021 J jnl
Int. J. Mach. Learn. Cybern.
Radhia Fezai, Kamaleldin Abodayeh, Majdi Mansouri, Hazem N. Nounou, Mohamed N. Nounou
2021 conf
SSD
Khadija Attouri, Mansour Hajji, Majdi Mansouri, Hazem N. Nounou, Abdelmalek Kouadri, Kais Bouzrara
2021 J jnl
Eur. J. Control
Mansour Hajji, Mohamed Faouzi Harkat, Abdelmalek Kouadri, Kamaleldin Abodayeh, Majdi Mansouri, Hazem N. Nounou, Mohamed N. Nounou
2021 J jnl
J. Intell. Fuzzy Syst.
Radhia Fezai, Majdi Mansouri, Kamaleldin Abodayeh, Hazem N. Nounou, Mohamed N. Nounou, Vicenç Puig, Kais Bouzrara
2021 conf
SSD
Radhia Fezai, Kais Bouzrara, Majdi Mansouri, Hazem N. Nounou, Mohamed N. Nounou, Mohamed Trabelsi
2021 conf
SSD
Radhia Fezai, Kais Bouzrara, Majdi Mansouri, Hazem N. Nounou, Mohamed N. Nounou, Mohamed Trabelsi
2020 J jnl
IEEE Access
Majdi Mansouri, Radhia Fezai, Mohamed Trabelsi, Mansour Hajji, Mohamed Faouzi Harkat, Hazem N. Nounou, Mohamed N. Nounou, Kais Bouzrara
2020 Misc conf
ATSIP
Raoudha Baklouti, Ahmed Ben Hamida, Majdi Mansouri, Hazem N. Nounou, Mohamed N. Nounou
2020 conf
SSD
Zahra Yahyaoui, Mansour Hajji, Majdi Mansouri, Mohamed Faouzi Harkat, Abdelmalek Kouadri, Hazem N. Nounou, Mohamed N. Nounou
2020 Misc conf
ATSIP
Marwa Chaabane, Ahmed Ben Hamida, Majdi Mansouri, Hazem N. Nounou, Mohamed N. Nounou
2020 Misc conf
ATSIP
Imen Baklouti, Majdi Mansouri, Hazem N. Nounou, Mohamed N. Nounou, Ahmed Ben Hamida
2020 conf
SSD
Amal Hichri, Mansour Hajji, Majdi Mansouri, Mohamed Faouzi Harkat, Abdelmalek Kouadri, Hazem N. Nounou, Mohamed N. Nounou
2020 conf
SSD
Khadija Attouri, Mansour Hajji, Majdi Mansouri, Mohamed Faouzi Harkat, Abdelmalek Kouadri, Hazem N. Nounou, Mohamed N. Nounou
2020 conf
SSD
Khaled Dhibi, Radhia Fezai, Kais Bouzrara, Majdi Mansouri, Abdelmalek Kouadri, Mohamed Faouzi Harkat
2020 J jnl
IEEE Access
Sondes Gharsellaoui, Majdi Mansouri, Mohamed Trabelsi, Mohamed Faouzi Harkat, Shady S. Refaat, Hassani Messaoud
2020 conf
SSD
Khaled Dhibi, Radhia Fezai, Kais Bouzrara, Majdi Mansouri, Abdelmalek Kouadri, Mohamed Faouzi Harkat
2020 conf
SSD
Lamia Belguesmi, Mansour Hajji, Majdi Mansouri, Mohamed Faouzi Harkat, Abdelmalek Kouadri, Hazem N. Nounou, Mohamed N. Nounou
2020 J jnl
J. Intell. Fuzzy Syst.
Radhia Fezai, Majdi Mansouri, Kamaleldin Abodayeh, Hazem N. Nounou, Mohamed N. Nounou, Hassani Messaoud
2020 J jnl
IEEE Access
Radhia Fezai, Kamaleldin Abodayeh, Majdi Mansouri, Abdelmalek Kouadri, Mohamed Faouzi Harkat, Hazem N. Nounou, Mohamed N. Nounou, Hassani Messaoud
2019 A conf
ICCAD
Radhia Fezai, Kamaleldin Abodayeh, Majdi Mansouri, Hazem N. Nounou, Mohamed N. Nounou
2019 conf
IINTEC
Sondes Gharsellaoui, Majdi Mansouri, Shady S. Refaat, Haitham Abu-Rub, Hassani Messaoud
2019 J jnl
Inf. Sci.
Mohamed Faouzi Harkat, Majdi Mansouri, Mohamed N. Nounou, Hazem N. Nounou
2019 conf
IINTEC
Khaled Dhibi, Radhia Fezai, Majdi Mansouri, Abdelmalek Kouadri, Kais Bouzrara
2019 conf
SysTol
Radhia Fazai, Majdi Mansouri, Kamal Abodayeh, Mohamed Trabelsi, Hazem N. Nounou, Mohamed N. Nounou
2019 conf
IINTEC
Radhia Fezai, Majdi Mansouri, Nasreddine Bouguila, Hazem N. Nounou, Mohamed N. Nounou
2019 conf
SysTol
Radhia Fazai, Majdi Mansouri, Kamal Abodayeh, Vicenç Puig, Mohamed Selmi, Hazem N. Nounou, Mohamed N. Nounou
2019 J jnl
Eng. Appl. Artif. Intell.
Radhia Fazai, Majdi Mansouri, Kamal Abodayeh, Vicenç Puig, M.-I. Noori Raouf, Hazem N. Nounou, Mohamed N. Nounou
2019 J jnl
IEEE Trans. Emerg. Top. Comput. Intell.
Majdi Mansouri, Mohamed N. Nounou, Hazem N. Nounou
2019 J jnl
Trans. Inst. Meas. Control
Hajer Lahdhiri, Khaoula Ben Abdellafou, Okba Taouali, Majdi Mansouri, Ouajdi Korbaa
2019 conf
ICTC
Aymen Omri, Mohammad Shaqfeh, Majdi Mansouri, Hussein M. Alnuweiri
2019 conf
ICTC
Aymen Omri, Mohammad Shaqfeh, Majdi Mansouri, Fawaz S. Al-Qahtani, Hussein M. M. Alnuweiri
2019 conf
IINTEC
Radhia Fezai, Majdi Mansouri, Nasreddine Bouguila, Hazem N. Nounou, Mohamed N. Nounou
2018 Misc conf
ATSIP
Raoudha Baklouti, Ahmed Ben Hamida, Majdi Mansouri, Mohamed Faouzi Harkat, Mohamed N. Nounou, Hazem N. Nounou
2018 conf
ECC
Radhia Fazai, Majdi Mansouri, Okba Taouali, Mohamed Faouzi Harkat, Nasreddine Bouguila, Mohamed N. Nounou
2018 conf
SSD
Radhia Fezai, Majdi Mansouri, Okba Taouali, Mohamed Faouzi Harkat, Nasreddine Bouguila
2018 Misc conf
ATSIP
Imen Baklouti Djmal, Majdi Mansouri, Mohamed N. Nounou, Hazem N. Nounou, Ahmed Ben Hamida
2018 conf
ECC
Raoudha Baklouti, Majdi Mansouri, Ahmed Ben Hamida, Hazem N. Nounou, Mohamed N. Nounou
2018 Misc conf
ATSIP
Marwa Chaabane, Ahmed Ben Hamida, Majdi Mansouri, Hazem N. Nounou, Mohamed N. Nounou
2018 B conf
SMC
Raoudha Baklouti, Ahmed Ben Hamida, Majdi Mansouri, Mohamed Faouzi Harkat, Hazem N. Nounou, Mohamed N. Nounou
2018 C conf
AICCSA
Imen Baklouti, Majdi Mansouri, Ahmed Ben Hamida, Hazem N. Nounou, Mohamed N. Nounou
2018 conf
ECC
Marwa Chaabane, Majdi Mansouri, Ahmed Ben Hamida, Hazem N. Nounou, Mohamed N. Nounou
2018 B conf
SMC
Imen Baklouti, Majdi Mansouri, Ahmed Ben Hamida, Hazem N. Nounou, Mohamed N. Nounou
2018 B conf
SMC
Radhia Fazai, Majdi Mansouri, Okba Taouali, Mohamed Faouzi Harkat, Hazem N. Nounou
2018 conf
DX
Mohamed Faouzi Harkat, Tarek Ait Izem, Frédéric Kratz, Majdi Mansouri, Mohamed N. Nounou, Hazem N. Nounou
2017 Misc conf
ATSIP
Marwa Chaabane, Majdi Mansouri, Hazem N. Nounou, Mohamed N. Nounou, Mohamed Ben Slima, Ahmed Ben Hamida
2017 Misc conf
ATSIP
Imen Baklouti, Majdi Mansouri, Hazem N. Nounou, Mohamed Ben Slima, Ahmed Ben Hamida
2017 Misc conf
ATSIP
Raoudha Baklouti, Majdi Mansouri, Hazem N. Nounou, Mohamed N. Nounou, Mohamed Ben Slima, Ahmed Ben Hamida
2017 conf
DSP
Majdi Mansouri, Hazem N. Nounou, Mohamed Faouzi Harkat, Mohamed N. Nounou
2017 C conf
CoDIT
M. Ziyan Sheriff, M. Nazmul Karim, Mohamed N. Nounou, Hazem N. Nounou, Majdi Mansouri
2017 C conf
CoDIT
M. Ziyan Sheriff, M. Nazmul Karim, Mohamed N. Nounou, Hazem N. Nounou, Majdi Mansouri
2016 Misc conf
ATSIP
Marwa Chaabane, Majdi Mansouri, Nouha Jaoua, Ahmed Ben Hamida, Hazem N. Nounou
2016 conf
EMBC
Majdi Mansouri, Parmida Moradi Birgani, Mohamad Reza Kharazi, Mahboube Lotfian, M. Naeimipoor, Mehdi M. Mirbagheri
2016 Misc conf
ATSIP
Raoudha Baklouti, Majdi Mansouri, Mohamed N. Nounou, Zaineb Ben Messaoud, Ahmed Ben Hamida
2016 J jnl
J. Comput. Sci.
Raoudha Baklouti, Majdi Mansouri, Mohamed N. Nounou, Hazem N. Nounou, Ahmed Ben Hamida
2016 Misc conf
ATSIP
Imen Baklouti, Majdi Mansouri, Mohamed N. Nounou, Nouha Jaoua, Ahmed Ben Hamida
2015 J jnl
Comput. Electron. Agric.
Majdi Mansouri, Marie-France Destain
2015 conf
SSD
Majdi Mansouri, Onur Avci, Hazem N. Nounou, Mohamed N. Nounou
2015 conf
SSD
Majdi Mansouri, Onur Avci, Hazem N. Nounou, Mohamed N. Nounou
2014 J jnl
J. Signal Process. Syst.
Majdi Mansouri, Hazem N. Nounou, Mohamed N. Nounou
2014 conf
SSD
Majdi Mansouri, Hazem N. Nounou, Mohamed N. Nounou
2014 conf
SSD
Majdi Mansouri, Hazem N. Nounou, Mohamed N. Nounou
2014 J jnl
Wirel. Commun. Mob. Comput.
Majdi Mansouri
2014 J jnl
Environ. Model. Softw.
Destain Dumont, Vincent Leemans, Majdi Mansouri, Bernard Bodson, Jean-Pierre Destain, Marie-France Destain
2014 B conf
ESANN
Majdi Mansouri, Marie-France Destain, Benjamin Dumont
2014 J jnl
Digit. Signal Process.
Majdi Mansouri, Hazem N. Nounou, Mohamed N. Nounou, Aniruddha Datta
2014 conf
SSD
Majdi Mansouri, Hazem N. Nounou, Mohamed N. Nounou
2013 J jnl
Comput. Networks
Ahmad Sardouk, Majdi Mansouri, Leïla Merghem-Boulahia, Dominique Gaïti, Rana Rahim-Amoud
2013 conf
SSD
Majdi Mansouri, Mostefa Mohamed-Seghir, Hazem N. Nounou, Mohamed N. Nounou, Haitham Abu-Rub
2013 J jnl
Netw. Model. Anal. Health Informatics Bioinform.
Mohamed N. Nounou, Hazem N. Nounou, Majdi Mansouri
2013 J jnl
J. Commun. Networks
Majdi Mansouri, Lyes Khoukhi, Hazem N. Nounou, Mohamed N. Nounou
2013 conf
SSD
Majdi Mansouri, Hazem N. Nounou, Mohamed N. Nounou
2013 conf
SSD
Majdi Mansouri, Mostefa Mohamed-Seghir, Hazem N. Nounou, Mohamed N. Nounou, Haitham Abu-Rub
2012 B conf
IWCMC
Majdi Mansouri, Lyes Khoukhi, Hazem N. Nounou, Mohamed N. Nounou
2011 J jnl
Wirel. Networks
Majdi Mansouri, Ilham Ouachani, Hichem Snoussi, Cédric Richard
2011 J jnl
IET Wirel. Sens. Syst.
Majdi Mansouri, Hichem Snoussi, Cédric Richard
2011 B conf
GLOBECOM
Majdi Mansouri, Lyes Khoukhi, Hazem N. Nounou, Mohamed N. Nounou
2011 B conf
IWCMC
Majdi Mansouri, Hichem Snoussi, Cédric Richard
2011 B conf
IWCMC
Majdi Mansouri, Lyes Khoukhi, Hichem Snoussi, Cédric Richard
2011 B conf
IWCMC
Majdi Mansouri, Lyes Khoukhi
2011
Majdi Mansouri
2011 B conf
GLOBECOM
Ali El Masri, Lyes Khoukhi, Ahmad Sardouk, Majdi Mansouri, Dominique Gaïti
2010 conf
VTC Fall
Majdi Mansouri, Hichem Snoussi, Cédric Richard
2010 B conf
GLOBECOM
Majdi Mansouri, Hichem Snoussi, Cédric Richard
2010 B conf
GLOBECOM
Ahmad Sardouk, Majdi Mansouri, Leïla Merghem-Boulahia, Dominique Gaïti, Rana Rahim-Amoud
2009 conf
IPCV
Majdi Mansouri, Ali Mohammad-Djafari
redb/extractors/decompiler/apk/smali_normalization.py
← Index redb/extractors/decompiler/apk/smali_normalization.py python
"""Semantic normalization of Dalvik/smali instructions.

Analogous to Binary Ninja's LLIL normalization: strips register allocation
noise and instruction encoding variants while preserving semantic operations.

Three normalization levels (most aggressive to most detailed):
  - 'category':    semantic category only (MOV, ALU, CALL, ...)
  - 'opcode':      base opcode, width-invariant (add, sub, invoke, ...)
  - 'opcode_api':  opcode category + API method/field references for
                   invoke/field/alloc instructions (default for MinHash)

References:
  - Smali+ 12-category reduction (Canfora et al.)
  - MOSDroid opcode family grouping
  - DroidSIFT/DroidSim API-sensitive similarity
"""

import re
from typing import List

# ---------------------------------------------------------------------------
# Dalvik opcode -> semantic category mapping
# ---------------------------------------------------------------------------
# Prefix-matched against instruction opcodes. Order matters for overlapping
# prefixes (longer/more-specific prefixes should come first in iteration,
# but since we use startswith and break on first match, we order by
# specificity within the list).

OPCODE_CATEGORIES = {
    # Arithmetic/logic
    "add": "ALU", "sub": "ALU", "mul": "ALU", "div": "ALU",
    "rem": "ALU", "and": "ALU", "or": "ALU", "xor": "ALU",
    "shl": "ALU", "shr": "ALU", "ushr": "ALU", "neg": "ALU",
    "not": "ALU",
    # Data movement
    "move": "MOV", "const": "CONST",
    # Memory access (field/array)
    "iget": "LOAD", "sget": "LOAD", "aget": "LOAD",
    "iput": "STORE", "sput": "STORE", "aput": "STORE",
    # Invocations
    "invoke": "CALL",
    # Control flow
    "if": "BRANCH", "goto": "JMP",
    "switch": "SWITCH",
    "return": "RET",
    # Object/type
    "new": "ALLOC", "check": "TYPE", "instance": "TYPE",
    # Array
    "fill": "ARR", "array": "ARR",
    # Comparison
    "cmpl": "CMP", "cmpg": "CMP", "cmp": "CMP",
    # Exception / synchronization
    "throw": "EXC", "monitor": "SYNC",
    # Conversion (int-to-long, float-to-int, etc.)
    "int-to": "CONV", "long-to": "CONV", "float-to": "CONV",
    "double-to": "CONV",
}

# Pre-compiled regexes for operand extraction
_METHOD_REF_RE = re.compile(r"(L[\w/$]+;->[\w<>]+\(.*?\)[\w/$;\[]*)")
_FIELD_REF_RE = re.compile(r"(L[\w/$]+;->[\w]+:[\w/$;\[]+)")
_CLASS_REF_RE = re.compile(r"(L[\w/$]+;)")
_CONST_STRING_RE = re.compile(r'^const-string(?:/jumbo)?\s')


def categorize_opcode(opcode: str) -> str:
    """Map a Dalvik opcode to its semantic category.

    Prefix-matched: 'add-int/2addr' matches 'add' -> 'ALU'.
    Returns 'OTHER' for unrecognized opcodes.
    """
    for prefix, cat in OPCODE_CATEGORIES.items():
        if opcode.startswith(prefix):
            return cat
    return "OTHER"


# Mapping from semantic categories to the ACFG feature vector indices
# used by Binary Ninja's build_block_features (cfg_features.py).
# This enables cross-platform ACFG feature comparison.
CATEGORY_TO_ACFG_INDEX = {
    "ALU": 0,       # CAT_ARITHMETIC
    "CONV": 0,      # arithmetic-adjacent
    "CMP": 4,       # CAT_COMPARISON
    "MOV": 2,       # CAT_TRANSFER
    "CONST": 2,     # transfer-adjacent (loading constants)
    "LOAD": 5,      # CAT_MEMORY
    "STORE": 5,     # CAT_MEMORY
    "CALL": 3,      # CAT_CALL
    "BRANCH": 1,    # CAT_LOGIC (conditional logic)
    "JMP": 1,       # CAT_LOGIC
    "SWITCH": 1,    # CAT_LOGIC
    "RET": 2,       # CAT_TRANSFER
    "ALLOC": 5,     # CAT_MEMORY (heap allocation)
    "TYPE": 6,      # CAT_OTHER
    "ARR": 5,       # CAT_MEMORY
    "EXC": 6,       # CAT_OTHER
    "SYNC": 6,      # CAT_OTHER
    "OTHER": 6,     # CAT_OTHER
}


def normalize_instruction(line: str, level: str = "opcode_api") -> str:
    """Normalize a single smali instruction line.

    Args:
        line: A single smali instruction (whitespace-stripped).
        level: Normalization level:
            'category'   - most aggressive: just semantic category
            'opcode'     - base opcode only, width/addressing-mode invariant
            'opcode_api' - category + API references for invoke/field/alloc
                          (default, best for MinHash similarity)

    Returns:
        Normalized instruction string, or empty string for non-instructions.
    """
    stripped = line.strip()
    if not stripped:
        return ""

    parts = stripped.split(None, 1)
    opcode = parts[0]
    operands = parts[1] if len(parts) > 1 else ""

    if level == "category":
        return categorize_opcode(opcode)

    if level == "opcode":
        # Strip type/width suffixes for invariance:
        # add-int, add-long, add-float -> 'add'
        # add-int/2addr -> 'add'
        base = re.split(r"[-/]", opcode)[0]
        return base

    if level == "opcode_api":
        # const-string: preserve string content (encrypted strings are a
        # key malware indicator)
        if _CONST_STRING_RE.match(stripped):
            # Extract the string literal
            str_match = re.search(r'"(.*)"', operands)
            if str_match:
                return f"CONST_STR \"{str_match.group(1)}\""
            return "CONST_STR"

        # invoke-*: preserve method reference
        if opcode.startswith("invoke"):
            ref = _METHOD_REF_RE.search(operands)
            if ref:
                return f"CALL {ref.group(1)}"
            return "CALL"

        # Field access: preserve field reference
        if opcode.startswith(("iget", "iput", "sget", "sput")):
            ref = _FIELD_REF_RE.search(operands)
            if ref:
                cat = "LOAD" if "get" in opcode else "STORE"
                return f"{cat} {ref.group(1)}"
            # Fallback: try space-separated format from androguard
            # e.g. "iget v0, p0, Lcom/Foo;->field Ljava/lang/String;"
            space_ref = re.search(
                r"(L[\w/$]+;->[\w]+)\s+([\w/$;\[]+)", operands
            )
            if space_ref:
                cat = "LOAD" if "get" in opcode else "STORE"
                return f"{cat} {space_ref.group(1)}:{space_ref.group(2)}"
            cat = "LOAD" if "get" in opcode else "STORE"
            return cat

        # new-instance: preserve allocated type
        if opcode.startswith("new-instance") or opcode == "new-array":
            ref = _CLASS_REF_RE.search(operands)
            if ref:
                return f"ALLOC {ref.group(1)}"
            return "ALLOC"

        # Everything else: just the category
        return categorize_opcode(opcode)

    # Unknown level: return raw opcode
    return opcode


def normalize_method_body(
    body: str, level: str = "opcode_api"
) -> List[str]:
    """Normalize all instructions in a smali method body.

    Filters out directives (.), labels (:), comments (#), and blank lines.
    Returns a list of normalized instruction strings.

    Args:
        body: Raw smali method body text.
        level: Normalization level (see normalize_instruction).

    Returns:
        List of normalized instruction strings (no empty strings).
    """
    normalized = []
    for line in body.split("\n"):
        stripped = line.strip()
        # Skip non-instructions
        if not stripped:
            continue
        if stripped.startswith((".",":", "#")):
            continue
        result = normalize_instruction(stripped, level)
        if result:
            normalized.append(result)
    return normalized