AArch64: eret*/drps/bc.<cond> 解码正确,但没有指令组(跳转/相对跳转/返回)
作者: r0ny123创建于 2026年7月11日更新于 2026年7月12日
标签bugAArch64
在 capstone 5.0.7 中测试了 (CS_ARCH_ARM64/CS_MODE_ARM, detail = True)。b.<cond> 已正确地标记了控制流组,但其他几个与控制流相关的 AArch64 指令(如同 b.eq)解码时,groups 数组为空:
import capstone
md = capstone.Cs(capstone.CS_ARCH_ARM64, capstone.CS_MODE_ARM)
md.detail = True
tests = {
'bc.eq': bytes.fromhex('10000054'), # FEAT_HBC hinted conditional branch
'b.eq': bytes.fromhex('00000054'),
'drps': bytes.fromhex('e003bfd6'), # Debug Restore PState
'eret': bytes.fromhex('e0039fd6'),
}
for name, code in tests.items():
for insn in md.disasm(code, 0x401000):
groups = [insn.group_name(g) for g in insn.groups]
print(f'{name}: mnemonic={insn.mnemonic!r} groups={groups}')输出:
bc.eq: mnemonic='bc.eq' groups=[]
b.eq: mnemonic='b.eq' groups=['jump', 'branch_relative']
drps: mnemonic='drps' groups=[]
eret: mnemonic='eret' groups=[]bc.<cond> (AARCH64_INS_BC, FEAT_HBC / ARMv8.8-9.3) 与 b.<cond> 共用完全相同的 imm19 分支偏移编码(仅在位 4 处不同),因此似乎是一个简单的疏漏,没有将其标记为 jump/branch_relative。eret/eretaa/eretab 和 drps 是异常级/调试状态控制传输(到 ELR_ELx),没有操作数,也没有任何组 — AArch64_add_cs_groups 只为 ret/retaa/retab 添加了 AARCH64_GRP_RET,对于这些指令没有添加任何组。
内容来源: capstone-engine/capstone