Python:从asm解析和提取操作码

时间:2014-06-25 23:09:07

标签: python python-2.7

我想解析一个程序集文件,只提取操作码,剥离操作数。输入文件中的每一行都包含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 个答案:

答案 0 :(得分: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 :(得分: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']

你应该把它包装成一个函数。