如何修改正则表达式以完整捕获汇编代码的指令与操作数?
汇编指令与操作数的正则捕获修复
问题场景
需要捕获汇编代码中指定操作指令及其对应的两个操作数(寄存器/内存地址),但原正则表达式仅能捕获无空格的操作数,对于qword ptr [r13 + 8*rdi]这类带空格的内存操作数,只会截取qword部分,无法完整捕获。
修改后的代码
import re assembly_code = """ lea r8, [rcx + 8*rax] movsd xmm0, qword ptr [rcx + 8*rax] ## xmm0 = mem[0],zero mov rcx, r9 xor edi, edi .p2align 4, 0x90 LBB0_12: ## Parent Loop BB0_2 Depth=1 ## Parent Loop BB0_3 Depth=2 ## Parent Loop BB0_4 Depth=3 ## Parent Loop BB0_10 Depth=4 ## Parent Loop BB0_11 Depth=5 ## => This Inner Loop Header: Depth=6 movsd xmm1, qword ptr [r13 + 8*rdi] ## xmm1 = mem[0],zero mulsd xmm1, qword ptr [rcx] addsd xmm0, xmm1 movsd qword ptr [r8], xmm0 add rcx, 2048 lea r12, [rsi + rdi] add r12, 1 add rdi, 1 cmp r12, r14 jl LBB0_12 ## %bb.13: ## in Loop: Header=BB0_11 Depth=5 add rax, 1 add r9, 8 cmp rax, rbx jl LBB0_11 """ # 修改后的正则表达式 pattern = r"\b(mov|movaps|movups|movss|movsd|movlps|movhps|movlpd|movhpd|movd|movq)\b\s+(.+?)\s*,\s*(.+?)(?=\s*##|$)" matches = re.findall(pattern, assembly_code) for match in matches: print("Instruction: ", match[0]) print("Operand 1: ", match[1].strip()) print("Operand 2: ", match[2].strip()) print("---")
运行输出
Instruction: movsd Operand 1: xmm0 Operand 2: qword ptr [rcx + 8*rax] --- Instruction: mov Operand 1: rcx Operand 2: r9 --- Instruction: movsd Operand 1: xmm1 Operand 2: qword ptr [r13 + 8*rdi] --- Instruction: movsd Operand 1: qword ptr [r8] Operand 2: xmm0 ---
关键修改说明
- 替换操作数匹配规则:将原正则中限制非空白字符的
\S+改为非贪婪匹配.+?,允许捕获包含空格的完整操作数。 - 终止匹配逻辑:用正向预查
(?=\s*##|$)确保操作数2的匹配截止到注释(##)或行末,避免混入注释内容。 - 去除多余空格:通过
.strip()清理操作数前后的冗余空格,保证输出整洁。
内容的提问来源于stack exchange,提问作者user3116936
相关产品推荐
相关产品推荐

