You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改正则表达式以完整捕获汇编代码的指令与操作数?

汇编指令与操作数的正则捕获修复

问题场景

需要捕获汇编代码中指定操作指令及其对应的两个操作数(寄存器/内存地址),但原正则表达式仅能捕获无空格的操作数,对于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
---

关键修改说明

  1. 替换操作数匹配规则:将原正则中限制非空白字符的\S+改为非贪婪匹配.+?,允许捕获包含空格的完整操作数。
  2. 终止匹配逻辑:用正向预查(?=\s*##|$)确保操作数2的匹配截止到注释(##)或行末,避免混入注释内容。
  3. 去除多余空格:通过.strip()清理操作数前后的冗余空格,保证输出整洁。

内容的提问来源于stack exchange,提问作者user3116936

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 22:05:23