第一步驟是從你的編譯器獲得乙個組合語言**列表。
1)測試程式
2)靜態變數和初始化
3)堆疊幀
乙個函式分成三個部分:函式序、函式體、函式跋。
4)暫存器變數
5)外部識別符號的長度
6)判斷堆疊幀布局
執行時堆疊儲存了每個函式執行時所需要的資料,包括它的自動變數和返回位址。
a.傳遞函式引數
b.函式序
c.堆疊中的引數次序
d.最終的堆疊幀布局
e.函式跋
f.返回值
g.表示式的***
編寫能夠呼叫c程式或者被c程式呼叫的組合語言程式所需的內容。與這個環境相關的結果總結如下--你的環境肯定在某些方面與它不同!
首先,匯程式設計序中的名字必須遵循外部識別符號的規則。
其次,匯程式設計序必須遵循正確的函式呼叫/返回協議。有兩種情況:從乙個組合語言程式呼叫乙個c程式和從乙個程式呼叫乙個匯程式設計序。為了從匯程式設計序呼叫c程式:
1)如果暫存器d0、d1、a0或a1儲存了重要的值,它們必須在呼叫c程式之前進行儲存,因為c函式不會儲存它們的值。
2)任何函式的引數必須以引數列表相反的順序壓入到堆疊中。
3)函式必須由一條「跳轉子程式」型別的指令呼叫,它會把返回位址壓入到堆疊中。
4)當c函式返回時,匯程式設計序必須清除堆疊中的任何引數。
5)如果匯程式設計序期望接受乙個返回值,它將保持在d0(如果返回值的型別為double,它的另一半將位於d1)。
6)任何在呼叫之前進行過儲存的暫存器此時可以恢復。
為了編寫乙個由c程式呼叫的匯程式設計序:
1)儲存任何你希望修改的暫存器(除d0、d1、a0或a1之外)。
2)引數值從堆疊中獲得,因為呼叫它的c函式把引數壓入到堆疊中。
3)如果函式應該返回乙個值,它的值應該儲存在d0中(在這種情況下,d0不能進行儲存和恢復)。
4)在返回之前,函式必須清除任何它壓入到堆疊中的內容。
即使在一些現代的機器上,乙個必須儲存於rom的程式必須相當小才有可能裝入到有限的記憶體空間中。但許多現代計算機系統在這方面的限制大不如前,這是因為它們提供了**虛擬記憶體。虛擬記憶體是由作業系統實現的,它在需要時把程式活動部分放入記憶體並把不活動的部分複製到磁碟中**,這樣就允許系統執行大型的程式。但程式越大,需要進行的複製就越多。所以大型程式不是想以前那樣根本無法執行,而是隨著程式的增大,它的執行效率逐漸降低。
如果乙個程式太大或太慢,較之專研每個變數,看看把它們宣告為register能不能提高效率,選一種效率更高的演算法或資料結構往往效果要滿意得多。然而這並不是說你可以在**中胡作非為,因為風格惡劣的**總是會把事情弄得更糟。
如果乙個程式太大,很容易想到的著手方向:最大的函式和資料結構。
如果程式太慢,著手方向:對程式進行效能測評,花費時間最多的部分程式和使用最頻繁的那部分**顯然是需要優化的目標。如果這方面能夠提公升,將能大大提高程式的整體執行速度。
三個努力方向:
1)在耗時最多的函式中,有些是庫函式。如果能減少或不用可幫助大大提公升效能。
2)有效函式之所以耗費了大量的時間是因為它們被呼叫的**次數非常多**。
3)有些函式呼叫次數不多,但每次呼叫耗費時間卻很長。尋找更優質的演算法重構是努力的方向。
4)可以對單個函式進行組合語言重新編碼,函式越小,重新編碼越容易。
絕大多數環境都建立某種型別的堆疊幀,函式用它來儲存它們的資料,堆疊幀的細節可能各不相同,但它們的基本思路是相當一致的。
提高效率的最好方法是為它選擇一種更好的演算法,接下來的一種提高程式執行速度的最佳手段是對程式進行效能測評,看看程式在哪個地方花費的時間最多,把優化措施集中在程式的這部分將產生最好的結果。
1)是鏈結器而不是編譯器決定外部識別符號的最大長度;
2)你無法鏈結由不同編譯器產生的程式;
1)使用stdarg實現可變引數列表;
2)改進演算法比優化**更有效率;
3)使用某種環境特有的技巧會導致程式不可移植。
第18章 執行時環境
乙個函式分成3個部分 函式序 prologue 函式體 body 和函式跋 epilogue 函式序用於執行函式啟動需要的一些工作,如為區域性變數保留堆疊中的記憶體。函式體是用於執行有用工作的地方。函式跋用於在函式即將返回之前清理堆疊。當程式增長後的容量超過了記憶體的數量時,它就無法執行,因此它就屬...
ios中執行時學習筆記
1.什麼是執行時?1 執行時是一套純c語言的api 純c語言庫 2 編譯器最終都會將oc 轉化 為執行時 clang rewrite objc m 3 利用執行時,可以做很多底層的操作,比如 動態新增物件的成員變數和成員方法 動態交換兩個方法的實現 特別是交換系統自帶的方法 獲得某個類的所有成員方法...
C和指標 學習筆記 第7章 函式
1.函式定義 函式的定義就是函式體的實現。函式體就是乙個 塊,它在函式被呼叫時執行。與函式定義相反,函式宣告出現在函式被呼叫的地方。函式宣告向編譯器提供該函式的相關資訊,用於確保函式被正確地呼叫。形式引數列表包括變數名和它們的型別宣告。塊包含了區域性變數的宣告和函式呼叫時需要執行的語句。2.函式宣告...