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')
代碼中,使用了有名的組,感覺正則表達式就是強大啊!