Python: 解析并提取汇编中的操作码
我想要解析一个汇编文件,只提取出操作码,去掉操作数。输入文件的每一行都有正好3个操作码。我是不是应该在每一行中提取“[”后面的第一个词,然后把它们放到一个列表里?有没有更好的方法呢?
这是我的输入文件格式:
[slli a3,a3,4] [add.n a3,a3,a8] [l32i a11,a3,128]
[add.n a3,a3,a8] [l32i a11,a3,128] [l32r a9,0x1fff8954]
[l32i a11,a3,128] [l32r a9,0x1fff8954] [l32i.n a10,a11,4]
[l32r a9,0x1fff8954] [l32i.n a10,a11,4] [l8ui a8,a11,0]
我期望的输出应该像这样:
[ slli : add.n : l32i ]
[ add.n : l32i : l32r ]
[ l32i : l32r : l32i.n ]
[ l32r : l32i.n : l8ui ]
2 个回答
2
这件事用正则表达式来做非常简单。
import re
pattern = re.compile(r'\[(\S+)')
output = []
with open('inputfile') as f:
for line in f:
output.append(pattern.findall(line))
现在你有了一份操作码列表。
>>> from pprint import pprint
>>> pprint(output)
[['slli', 'add.n', 'l32i'],
['add.n', 'l32i', 'l32r'],
['l32i', 'l32r', 'l32i.n'],
['l32r', 'l32i.n', 'l8ui']]
接下来可以处理这个列表,生成你想要的输出,比如说:
>>> for line in output:
... print '[ %s ]' % ' : '.join(line)
...
[ slli : add.n : l32i ]
[ add.n : l32i : l32r ]
[ l32i : l32r : l32i.n ]
[ l32r : l32i.n : l8ui ]
1
查找操作码:
>>> import re
>>> re.findall(r'\[(?=([a-z0-9.]+))','[slli a3,a3,4] [add.n a3,a3,a8] [l32i a11,a3,128]')
['slli', 'add.n', 'l32i']
你应该把这个放到一个函数里。