匯編語言是各種計算機語言中與硬件關系最為密切、最直接的語言,是時空效率最高的語言,它能夠利用計算機所有硬件特性並能直接控制硬件,所以在計算機應用系統設計和過程控制中是必不可少的.目前教學中采用8086/8088匯編語言系統組織教學仍是最佳選擇.其中子程序技術是一種解決重復性問題的重要設計方法,采用子程序結構可以簡化源程序書寫、提高程序存儲效率、減少出錯率、增加程序的易讀性和可維護性,並且有利用子程序資源的組織和使用.設計子程序時,除了必需要考慮的程序調用、返回和完成特定功能的指令序列外,還必須注意解決子程序設計中帶有的共性的一些問題,即:現場保護、參數傳遞、子程序的嵌套與遞歸調用、編寫子程序說明文檔等.
1 現場保護
現場保護的目的是調用子程序之後,能夠返回主程序繼續執行.因此要對子程序中用到的寄存器,堆棧進行必要的保護.
1 1 寄存器保護因為匯編語言程序中的主要操作對象是CPU中的各寄存器,對那些主程序和子程序中都會用到的一些寄存器要在子程序使用之前進行保護.寄存器保護最好是在子程序中進行,並且在子程序中進行恢復,這樣子程序顯得更完整.其方法是使用堆棧,由於指令系統中制定了規范的進棧指令PUSH和出棧指令POP,並會自動修改堆棧指針,只要在程序設計中注意8086/8088的堆棧是否按"後進先出"的原則組織的.
1 2 堆棧保護子程序是利用調用(CALL)指令和返回(RET)指令來實現正確的調用和返回的.因為CALL命令執行時壓入堆棧的斷點地址就是供子程序返回主程序時的地址,編程時一定要注意子程序的類型屬性,即是段內調用還是段間調用.段內調用和返回為NEAR屬性,段間調 王艷玲,等談談匯編語言中子程序的設計方法37用和返回為FAR屬性.8086/8088的匯編程序用子程序定義PROC的類型屬性來確定CALL和RET指令的屬性.如果所定義的子程序是FAR屬性,那麼對它的調用和返回一定都是FAR屬性;如果所定義的子程序是NEAR屬性,那麼對它的調用和返回也一定是NEAR屬性.這樣用戶只是在定義子程序時考慮它的屬性,而CALL和RET指令的屬性就可以由匯編程序來確定了.另外,進入子程序後再使用堆棧時也必須保證壓入和彈出字節數一致,如果在這裡堆棧存取出錯,必然會導致返回地址的錯誤.
2 參數傳遞
主程序在調用子程序時,經常要向子程序傳遞一些參數或控制信息,子程序執行後,也常需要把運行的結果返回調用程序.這種信息傳遞稱為參數傳遞,其常用的方法有寄存器傳遞、內存固定單元傳遞、堆棧傳遞.
2 1 寄存器傳遞由主程序將要傳遞的參數裝入事先約定的寄存器中,轉入子程序後再取出進行處理,這種方法受CPU內部寄存器數量限制,因此只適於傳遞少量參數的場合,如一些常見的軟件延時子程序,均是利用某寄存器傳遞循環計數器初值.
2 2 通過內存固定單元的傳遞此方法適於大量傳遞參數時使用,它是在內存中開辟特定的一片區域用於傳遞參數.主程序和子程序都按事先約定在指定的存儲單元中進行數據交換,這種方法要占用一定數量的存儲單元.不足之處是信息易被修改,不利於模塊化設計.
2 3 通過堆棧實現參數傳遞這種方法是先在主程序中把參數和參數地址壓入堆棧,在子程序中取出使用,由於堆棧操作不占用寄存器,並且堆棧單元使用後可自動釋放,反復使用,便於實現數據隔離和模塊化設計.使用這種方法時,當子程序返回後,這些參數就不在有用了,應當丟棄.這時可以利用帶立即數的返回指令修改指針,使其指向參數入棧以前的值.
3 子程序嵌套與遞歸調用
匯編語言中子程序的嵌套只要堆棧空間允許,一般不受嵌套層次限制.嵌套子程序設計中,應注意寄存器的保護和恢復,避免各層子程序之間寄存器沖突.遞歸子程序的設計必須保證每次調用都不破壞以前調用時所用的參數和中間結果.為保證每次調用的正確,一般把每次調用的參數、有關寄存器的內容以及中間結果進棧保存.
4 子程序說明文檔
一般來說子程序是要反復使用或提供用戶使用,所以編寫子程序時應盡量采用較好的算法,使子程序運行速度比較快,又節省內存.同時還應最大限度地滿足今後程序維護與使用的需要.在設計子程序的同時就應當建立相應的說明文檔,清楚地描述子程序的功能和調用方法.通常子程序說明文檔應包括:子程序名稱、子程序功能、入口參數、出口參數、工作寄存器、工作單元及最後修改日期等