巨集和子程式都是為了簡化源程式的編寫,提高程式的可維護性,但是它們二者之間存在著以下本質的區別:
1 、在源程式中,通過書寫巨集名來引用巨集,而子程式是通過 call 指令來呼叫;
2 、匯程式設計序對巨集通過巨集擴充套件來加入其定義體,巨集引用多少次,就相應擴充套件多少次,所以,引用巨集不會縮短目標程式;而子程式**在目標程式中只出現一次,呼叫子程式是執行同一程式段,因此,目標程式也得到相應的簡化;
3 、巨集引用時,引數是通過「實參」替換「形參」的方式來實現傳遞的,引數形式靈活多樣,而子程式呼叫時,引數是通過暫存器、堆疊或約定儲存單元進行傳遞的;
4 、巨集引用語句擴充套件後,目標程式中就不再有巨集引用語句,執行時,不會有額外的時間開銷,而子程式的呼叫在目標程式中仍存在,子程式的呼叫和返回均需要時間。
總之,當程式片段不長,速度是關鍵因素時,可採用巨集來簡化源程式,但當程式片段較長,儲存空間是關鍵因素時,可採用子程式的方法來簡化源程式和目標程式。 處理的時間不同.巨集呼叫是在源程式被匯程式設計序處理的;而子程式呼叫是在程式執行期間由 cp 直接執行的.
處理的方式不同.兩者都必須先定義後使用,但巨集呼叫是用巨集體替換巨集呼叫偽指令,實參代替形參,源程式被翻譯成目標**後巨集定義隨著消失;而子程式則沒有這樣的替換操作,是以 call 指令將控制權由呼叫者轉給子程式並執行.
引數處理不同.巨集呼叫是以實參代替形參,引數的形式不受限制,可以是任何合法的字元;子程式的引數需要暫存器或儲存單元進行傳遞,而且需要附加的指令實現引數傳遞.
執行速度不同.子程式呼叫時需要執行 call 指令和 ret 指令,還要執行實現引數傳遞的附加指令,因而會比巨集展開後的**多而執行速度稍慢.
占用的儲存器空間大小不同.巨集指令在每次呼叫時都要展開,把巨集體中的程式段複製一遍,因而用巨集指令編寫的程式在目標**中會重複出現相同或相似的程式段,占用記憶體空間較大;而子程式是由 call 指令呼叫的,無論調多少次,子程式的目標**只在程式**現一次,目標**相對較短.
巨集與子程式具有各自的特點,程式設計師應該根據具體問題選擇使用那種方法通常,當程式段較短或要求較快執行時,應選用巨集;當程式段較長或為減小目標**時,要選用子程式比較結論
子程式呼叫與巨集定義的異同 巨集指令及子程式設計實驗
2.5 巨集指令及子程式設計實驗 2.5.1 實驗目的 1 熟悉巨集指令 巨集定義 巨集呼叫以及巨集展開的概念 掌握巨集指令的定義與呼叫的方法。2 掌握子程式的定義 呼叫以及呼叫程式與子程式之間引數的傳遞方法。3 了解巨集指令與子程式的異同以及各自的適用場合。2.5.2 實驗預習要求 1 複習巨集指...
巨集定義與巨集替換
一.c c 語言中使用巨集的主要目的主要有 3 個 1.提高 的可讀性 把用到的常量定義成有意義的名字 2.無需函式呼叫,執行效率高 對於一些簡單的操作,無需呼叫函式,雖然程式設計是強調模組化,但是函式呼叫時,需要保護現場和恢復現場。這些都需要耗時。對於複雜的操作來講,這些耗時可以不計,但是對於簡單...
巨集定義與巨集替換
一.c c 語言中使用巨集的主要目的主要有 3 個 1.提高 的可讀性 把用到的常量定義成有意義的名字 2.無需函式呼叫,執行效率高 對於一些簡單的操作,無需呼叫函式,雖然程式設計是強調模組化,但是函式呼叫時,需要保護現場和恢復現場。這些都需要耗時。對於複雜的操作來講,這些耗時可以不計,但是對於簡單...