檢查函數用的棧空間

  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')

代碼中,使用了有名的組,感覺正則表達式就是強大啊!

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章