我想找出一个正则表达式模式,能够捕获操作以及它针对给定的汇编代码片段所作用的两个寄存器或地址。这是我到目前为止所拥有的:
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] 的一个或多个相匹配。一个lookbehind (?<! )
可以防止以空格结束或使用 e.g. [^,#\n]*[^\s,#]
或者。
\b(mov(?:aps|ups|aps|ss|sd|lps|hps|lpd|hpd|d|q)?) +(\w+) *, *([^,#\n]+(?<! ))
See this demo at regex101或Python demo - 使用[ \t]
而不是
可以出现制表符的位置。
进一步做了一些更改,例如缩短模式、使用 \w
第二组中的单词字符,删除 \b\s+
中的单词边界它看起来多余( \s
已经需要单词结束)。
关于Python正则表达式捕获短语?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76082604/