cost down继续中,为了减少栈的空间(34k->20K),浏览代码中用了很大的栈空间的函数。挑出这些函数,并进行研究之。
MIP16有个特点,在进入函数后,用save指令将一些寄存器压栈,同时为local变量留出足够的栈空间。所以,检索save的大小就可以了。
反汇编代码如下:
68342 801013d0 <avl_frontend_initialize>:
68343 801013d0: 64f4 save 32,ra,s0-s1
68361 801013fa: 8bec lh a3,24(v1)
68362
68363 801013fc <avl_frontend_open>:
68364 801013fc: 64e4 save 32,ra,s0
这里,save后可能有的会用如下的情况,
801027b0 <A1108_IBase_Initialize>:
70529 801027b0: f018 64f7 save a0-a1,184,ra,s0-s1
70530 801027b4: b596 lw a1,80102a0c <A1108_IBase_Initialize+0x25c>
同事说有一个c代码,专用来做类似的工作的框架程序。
想想,这样的事情,适合用正则表达式来表示,所以,就打算用grep写。想了一会儿,思路受阻,关键问题:grep是基于行的查找工具,sed也不行,不善于做这个。
最后,还是用了python. 好久不用,生疏了。还好之前做了一些笔记,翻了一下。写了几句代码,就搞定了。python这方面就是强。
如下:
1 #!/usr/bin/python
2 # Filename: test.py
3
4 import os
6 import re
7
8 string_file = open('flash.dasm')
9 string = string_file.read()
10 #print string
11
12 p = re.compile(r'<(?P<func>.*)>:/s*/n.*save/s*([/w-]+,|)(?P<size>/d+),')
13
14 dest_file = open('func_size.csv','w')
15
16 for i in p.finditer(string):
17 dest_file.write(i.group('func'))
18 dest_file.write(',')
19
20 dest_file.write(i.group('size'))
21 dest_file.write('/n')
代码中,使用了有名的组,感觉正则表达式就是强大啊!