我想找出一个正则表达式模式,它能够捕获给定汇编代码片段的操作和它所作用的两个寄存器或地址.这就是我到目前为止所拥有的:

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|movaps|movss|movsd|movlps|movhps|movlpd|movhpd|movd|movq)\b\s+(\S+)\s*,\s*(\S+(\s*\[.*?\])?)"

matches = re.findall(pattern, assembly_code)
for match in matches:
    print("Instruction: ", match[0])
    print("Operand 1: ", match[1])
    print("Operand 2: ", match[2])
    print("---")

但输出如下所示:

Instruction:  movsd
Operand 1:  xmm0
Operand 2:  qword
---
Instruction:  mov
Operand 1:  rcx
Operand 2:  r9
---
Instruction:  movsd
Operand 1:  xmm1
Operand 2:  qword
---

我的目标是像qword ptr [r13 + 8*rdi]个模式在其完整的形式.如何修改模式以使其正确捕获完整的字符串?

推荐答案

对于第三组,我会使用类似于[^,#\n]+的值,它与[^not in class]one or more相匹配.A lookbehind (?<! )可以防止在空间中结束或交替使用e.g. [^,#\n]*[^\s,#].

\b(mov(?:aps|ups|aps|ss|sd|lps|hps|lpd|hpd|d|q)?) +(\w+) *, *([^,#\n]+(?<! ))

Python demo.com/r/KjK3bl/1" rel="nofollow noreferrer">See this demo at regexPython demoPython demo-在可能出现制表符的地方使用[ \t]而不是 .

进一步做了一些改变,比如缩短句型,在第二组中使用\w word character,在\b\s+中看起来多余的地方减少word boundary(\s已经需要单词结束).

Python相关问答推荐

从包含数字和单词的文件中读取和获取数据集

具有症状的分段函数:如何仅针对某些输入值定义函数?

如何在Python中使用io.BytesIO写入现有缓冲区?

Python中使用时区感知日期时间对象进行时间算术的Incredit

如何使用Jinja语法在HTML中重定向期间传递变量?

需要计算60,000个坐标之间的距离

如何根据参数推断对象的返回类型?

如何在Windows上用Python提取名称中带有逗号的文件?

无法定位元素错误404

Django REST Framework:无法正确地将值注释到多对多模型,不断得到错误字段名称字段对模型无效'<><>

Pandas—在数据透视表中占总数的百分比

创建可序列化数据模型的最佳方法

如何合并两个列表,并获得每个索引值最高的列表名称?

在Python 3中,如何让客户端打开一个套接字到服务器,发送一行JSON编码的数据,读回一行JSON编码的数据,然后继续?

从列表中获取n个元素,其中list [i][0]== value''

在Google Drive中获取特定文件夹内的FolderID和文件夹名称

判断Python操作:如何从字面上得到所有decorator ?

如何训练每一个pandaprame行的线性回归并生成斜率

Python如何导入类的实例

Pandas:将值从一列移动到适当的列