最近為了CVSD的期末專題,親自寫MIPS的Test Bench,雖然已經完成了最簡單的Bubble Sort,但仍然想要寫更高端的演算法,於是回過頭來看看以前寫過的C程式碼,像是Quick Sort或是Merge Sort之類的,但卻遇上了無法處理遞迴的問題。

  到了現在,我才能深深地體會到,關於Stack Pointer,這個真的是不可或缺。以前讀過計概、上過資結,學到了這些特殊用途的指標,卻仍然只是霧裡看花,有學沒有懂。直到今天,要親自上戰場,寫更低階的組合語言,才知道這個指標的用處。



  事情的起源,來自於遞迴的架構。在這個架構中,要不斷地呼叫函數和傳入變數。前者沒有什麼問題,可以用J型態這一類的指令執行;然而後者,在一般的呼叫函數中雖然沒有問題,但是遇到了遞迴,若是沒有Stack Pointer,便會變得寸步難行。

  舉例來說,我們需要儲存傳入的變數,我們可以選擇把它們存入CPU的暫存器,亦或是儲存到外面的記憶體。但是,我們要怎麼作,才能告訴下層的函數,不要去動到這些變數的位置,又或者說,當回到這層時,要怎麼取回之前存入的資料,這些都是一個問題。

  如果架構沒有很複雜,那麼,憑著人腦的分配管理,是可以很輕易地處理,各變數之間的儲存和寫入。但是現在引入了遞迴,因此就只能讓原本的分配策略,用一個演算法去描述才行。所以加入了Stack Pointer,讓資料的儲存間,變得相當有條理性。而且更重要的,是它所具有的First In Last Out的特性,相當符合實際上資料轉移的應用。

  雖然之前在寫組合語言時,曾經對Compiler所寫的方式,感到不以為然,覺得有些資料儲存,非常不必要而且累贅。但現在才知道,這種才是符合General Case的寫法。只能說,吃米不知米價,只有當自己親自面對時,才會明白當事人的心情。



  今天寫程式,突然恍然大悟,於是寫下了這篇作為參考。


arrow
arrow

    uxijgil 發表在 痞客邦 留言(0) 人氣()