Python: 解析并提取汇编中的操作码

0 投票
2 回答
1810 浏览
提问于 2025-04-18 11:06

我想要解析一个汇编文件,只提取出操作码,去掉操作数。输入文件的每一行都有正好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']

你应该把这个放到一个函数里。

撰写回答