




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、1匯編語言程序設(shè)計第六章 子程序設(shè)計張華平 副教授 博士Email: Website: :/ICTCLAS張華平博士網(wǎng)絡(luò)搜索挖掘與平安實驗室 (wSMSBIT)2021-11 為了程序共享或模塊化設(shè)計的需要,可以把一段公共語句序列設(shè)計成子程序或宏指令的形式。本章介紹子程序的設(shè)計方法。6.1 子程序結(jié)構(gòu)及設(shè)計方法一、子程序結(jié)構(gòu)在匯編語言中用過程定義偽指令定義子程序。過程定義偽指令格式:過程名PROC 屬型過程名ENDP 其中過程名就是子程序名,它也表示子程序入口的符號地址。 屬型可以是NEAR型缺省值或FAR型。NEAR型子程序只可以被段內(nèi)調(diào)用,而FAR型子程序可以被段間或段內(nèi)調(diào)用。1調(diào)用程序和
2、子程序在同一個代碼段的程序結(jié)構(gòu)CODE SEGMENTMAINPROC FARCALLSUB1RETMAINENDPSUB1PROC ;類型可缺省RETSUB1ENDPCODEENDS ;END后跟主程序名ENDMAIN2調(diào)用程序和子程序在不同段的程序結(jié)構(gòu)CODE1SEGMENTMAINPROC FARCALLFAR PTR SUB2RETMAINENDPCODE1ENDSCODE2SEGMENTSUB1PROCFARCALL FAR PTR SUB2 ;CALL SUB2RETSUB1ENDPSUB2PROCFARRETSUB2ENDPCODE2ENDSENDMAIN二、設(shè)計子程序時應(yīng)注意的
3、問題1子程序說明為便于引用,子程序應(yīng)在開頭對其功能、調(diào)用參數(shù)和返回參數(shù)等予以說明,例如參數(shù)的類型、格式及存放位置等。2存放器的保存與恢復為了保證調(diào)用程序的存放器內(nèi)容不被破壞,應(yīng)在子程序開頭保存它要用到的存放器內(nèi)容,返回前再恢復它們。3注意堆棧狀態(tài)在設(shè)計含有子程序的程序時,要密切注意堆棧的變化。這包括要注意一切與堆棧有關(guān)的操作。例如CALL調(diào)用類型和子程序定義類型的一致性,PUSH和POP指令的匹配,通過堆棧傳遞參數(shù)時子程序返回使用RET n指令等,以確保堆棧平衡。北京理工大學-張華平-2021106.2 堆 棧 所謂堆棧,就是供程序使用的一塊連續(xù)的內(nèi)存空間,一般用于保存和讀取臨時性的數(shù)據(jù)。北京
4、理工大學-張華平-2021116.2.1 堆棧特點 1. 臨時性2. 快速性3. 動態(tài)擴展性北京理工大學-張華平-2021126.2.2 堆棧用途 1. 保護和恢復調(diào)用現(xiàn)場2. 用于變量之間的數(shù)據(jù)傳遞3. 用做臨時的數(shù)據(jù)區(qū)4. 子程序的調(diào)用和返回北京理工大學-張華平-2021136.2.3 子程序的返回地址 例. 段內(nèi)調(diào)用和返回設(shè)計兩個子程序:第1個子程序AddProc1使用ESI和EDI作為加數(shù),做完加法后把和放在EAX中;第2個子程序AddProc2使用X和Y作為加數(shù),做完加法后把和放在Z中。主程序先后調(diào)用兩個子程序,最后將結(jié)果顯示出來。在AddProc2中用到了EAX,所以要先將EAX保
5、存在堆棧中,返回時再恢復EAX的值。否那么EAX中的值會被破壞。 見程序PROG0603.ASM 。6.3 子程序參數(shù)傳遞可以通過給子程序傳遞參數(shù)使其更通用。常用的參數(shù)傳遞方法如下:通過存放器傳遞;子程序直接訪問模塊中變量同一模塊;通過地址表傳遞參數(shù)地址;通過堆棧傳遞參數(shù)或參數(shù)地址。北京理工大學-張華平-2021156.3.1 C語言函數(shù)的參數(shù)傳遞方式 在C/C+以及其他高級語言中,函數(shù)的參數(shù)是通過堆棧來傳遞的。C語言中的庫函數(shù),以及Windows API等也都使用堆棧方式來傳遞參數(shù)。16C函數(shù)常見的有5種參數(shù)傳遞方式調(diào)用規(guī)那么見下表。 調(diào)用規(guī)則參數(shù)入棧順序參數(shù)出棧說 明cdecl方式從右至左
6、主程序參數(shù)個數(shù)可動態(tài)變化stdcall方式從右至左子程序Windows API常使用fastcall方式用ECX、EDX傳遞第1、2個參數(shù),其余的參數(shù)同stdcall,從右至左 子程序常用于內(nèi)核程序this方式ECX等于this,從右至左子程序C+成員函數(shù)使用naked方式從右至左子程序自行編寫進入/退出代碼1通過存放器傳遞這種傳遞方式使用方便,適用于參數(shù)較少的情況。例把BX中的16位二進制數(shù)轉(zhuǎn)換成十進制并顯示在屏幕上。分析:采用從高到低逐個除以十進制位權(quán)的方法。見程序2假設(shè)調(diào)用程序和子程序在同模塊中,子程序可以直接訪問模塊中的變量例實現(xiàn)數(shù)組求和功能。要求數(shù)組求和不考慮溢出情況由子程序?qū)崿F(xiàn),其
7、數(shù)組元素及結(jié)果均為字型數(shù)據(jù)。見程序。3通過地址表傳遞參數(shù)地址適用于參數(shù)較多的情況。具體方法是先建立一個地址表,該表由參數(shù)地址構(gòu)成。然后把表的首地址通過存放器或堆棧傳遞給子程序。例編寫一個數(shù)組求和子程序,其數(shù)組元素及結(jié)果均為字型數(shù)據(jù)。另定義兩個數(shù)組,并編寫一個主程序,通過調(diào)用數(shù)組求和子程序分別求出兩個數(shù)組的和。 分析:雖然主、子程序在同模塊中,但由于在一個程序中要分別求出兩個數(shù)組的和,因此子程序不能直接引用數(shù)組變量名。 本例用數(shù)組首地址、元素個數(shù)的地址、和地址構(gòu)成地址表,通過地址表傳送這些參數(shù)的地址,以便子程序能夠訪問到所需參數(shù)。 見程序。4通過堆棧傳遞參數(shù)或參數(shù)地址 這種方式適用于參數(shù)較多,或
8、子程序有多層嵌套、遞歸調(diào)用的情況。 步驟:主程序把參數(shù)或參數(shù)地址壓入堆棧;子程序使用堆棧中的參數(shù)或通過棧中參數(shù)地址取到參數(shù);子程序返回時使用RET n指令調(diào)整SP指針,以便刪除堆棧中已用過的參數(shù),保持堆棧平衡,保證程序的正確返回。例完成數(shù)組求和功能,求和由子程序?qū)崿F(xiàn),要求通過堆棧傳遞參數(shù)地址。見程序 本例通過BP訪問堆棧中的參數(shù)。 程序的堆棧變化情況參見圖6-1,指示了程序中所有入棧操作對堆棧的影響隨入棧數(shù)據(jù)的增加,SP的值不斷減小,堆??捎每臻g也隨之減少。圖6-2為已從子程序返回、而主程序RET指令執(zhí)行前的堆棧狀態(tài),其中的灰色局部表示執(zhí)行語句時已彈出的數(shù)據(jù)。 隨著彈出數(shù)據(jù)的增加,SP的值不斷
9、增大,堆??捎每臻g也隨之增大。子程序中語句RET 6指令,在從堆棧彈出返回地址后還要使SP值加6,這樣就跳過了通過堆棧傳遞的三個參數(shù),或者說刪除了它們。 因此,當主程序的語句RET指令被執(zhí)行時,程序控制從棧頂彈出數(shù)字0給IP,彈出PSP的段基址給CS,于是執(zhí)行PSP:0處的INT 20H指令,正確返回操作系統(tǒng)。返回語句執(zhí)行后堆棧狀態(tài)語句執(zhí)行后堆棧狀態(tài)語句執(zhí)行后堆棧狀態(tài)語句執(zhí)行后堆棧狀態(tài)語句執(zhí)行后堆棧狀態(tài)語句執(zhí)行后堆棧狀態(tài)語句執(zhí)行后堆棧狀態(tài)語句執(zhí)行后堆棧狀態(tài)語句執(zhí)行后堆棧狀態(tài)語句執(zhí)行后堆棧狀態(tài)語句執(zhí)行后堆棧狀態(tài)圖6-1 程序6.6中所有入棧操作對堆棧的影響SSSPBPDI值SI值CX值A(chǔ)X值BP
10、值IP值CS值SUM的地址COUNT地址ARY首地址0PSP段基址返回SP語句執(zhí)行后堆棧狀態(tài)圖6-2 程序6.6中主程序的RET執(zhí)行前堆棧狀態(tài)SSDI值SI值CX值A(chǔ)X值BP值IP值CS值SUM的地址COUNT地址ARY首地址0PSP段基址 從以上分析可以看出,通過堆棧傳遞參數(shù)時子程序的返回指令必須是RET N形式,當堆棧操作是16位時N值應(yīng)該是壓入堆棧的參數(shù)個數(shù)的2倍,只有這樣保證程序的正常運行。 用結(jié)構(gòu)形式訪問堆棧中的參數(shù),這種方法更簡便及標準化。 例完成數(shù)組求和功能,其中求和由子程序?qū)崿F(xiàn),要求使用結(jié)構(gòu)訪問堆棧中的參數(shù)。 圖6-3給出了堆棧及結(jié)構(gòu)數(shù)據(jù)定義。注意這些結(jié)構(gòu)字段的順序為其值壓入的
11、逆序。實際上,它只是給圖6-1中由主程序壓入的數(shù)據(jù)、返回地址及子程序壓入的BP值起了個名字而已,而字段值的預(yù)置是通過PUSH和CALL指令實現(xiàn)的。當子程序用到堆棧中的參數(shù)時,只需使用BP作為基地址、通過結(jié)構(gòu)字段名訪問就可以了。編碼見程序。返回SSSPBPDI值堆棧數(shù)據(jù)SI值結(jié)構(gòu)字段名CX值A(chǔ)X值BP值SAVE_BPIP值SAVE_CS_IPCS值SUM的地址SUM_ADDRCOUNT地址COUNT_ADDRARY首地址ARY_ADDR0PSP段基址圖6-3 程序6.7的堆棧及結(jié)構(gòu)數(shù)據(jù)示意圖結(jié)構(gòu)6.4 嵌套與遞歸子程序一、子程序嵌套在匯編語言中,允許子程序作為調(diào)用程序去調(diào)用另一子程序,把這種關(guān)系
12、稱為子程序嵌套。 圖6-4為子程序嵌套示意圖。嵌套的層數(shù)沒什么限制,其層數(shù)稱為嵌套深度。主程序SUB1SUB2CALL SUB1CALL SUB2RETRETRET圖6-4 子程序嵌套示意圖返回 由于子程序嵌套對堆棧的使用很頻繁,因此還要確保堆棧有足夠空間,并要注意堆棧的正確狀態(tài),這包括CALL、RET、RET N、PUSH、POP、INT、IRET等與堆棧操作有關(guān)指令的正確使用。子程序嵌套舉例見程序,嵌套深度2。北京理工大學-張華平-20216.5 緩沖區(qū)溢出攻擊原理 緩沖區(qū)溢出是目前最常見的一種平安問題,操作系統(tǒng)以及應(yīng)用程序一般都存在緩沖區(qū)溢出漏洞。緩沖區(qū)溢出是由編程錯誤引起的,當程序向緩
13、沖區(qū)內(nèi)寫入的數(shù)據(jù)超過了緩沖區(qū)的容量,就發(fā)生了緩沖區(qū)溢出,緩沖區(qū)之外的內(nèi)存單元被程序“非法修改。一般情況下,緩沖區(qū)溢出會導致應(yīng)用程序的錯誤或者運行中止,但是,攻擊者利用程序中的漏洞,精心設(shè)計出一段入侵程序代碼,覆蓋緩沖區(qū)之外的內(nèi)存單元,這些程序代碼就可以被CPU所執(zhí)行,從而獲取系統(tǒng)的控制權(quán)。 北京理工大學-張華平-2021346.5.1 堆棧溢出 在一個程序中,會聲明各種變量。靜態(tài)全局變量位于數(shù)據(jù)段并且在程序開始運行時被初始化,而局部變量那么在堆棧中分配,只在該函數(shù)內(nèi)部有效。 如果局部變量使用不當,會造成緩沖區(qū)溢出漏洞。北京理工大學-張華平-2021356.5.2 數(shù)據(jù)區(qū)溢出 當變量或數(shù)組位于數(shù)
14、據(jù)區(qū)時,由于程序?qū)ψ兞?、?shù)組的過度使用而導致對其他數(shù)據(jù)單元的覆蓋,也可能導致程序執(zhí)行錯誤。北京理工大學-張華平-2021366.6 模塊化程序設(shè)計 如果有多個源程序文件,或者需要使用C/C+、匯編等多種語言混合編程,就需要對這些源程序分別編譯,最后連接構(gòu)成一個可執(zhí)行文件。 北京理工大學-張華平-202137如下圖,系統(tǒng)由模塊A、模塊B、模塊C組成,而模塊B中的局部功能又可以進一步分解成為模塊D、模塊E,整個系統(tǒng)包括了5個模塊。模塊中的代碼設(shè)計為子程序,能夠相互進行調(diào)用。 北京理工大學-張華平-202138在子程序設(shè)計中,主程序和子程序之間可以通過全局變量、存放器、堆棧等方式傳遞數(shù)據(jù),這種技術(shù)在
15、模塊化程序設(shè)計中同樣適用。 北京理工大學-張華平-2021396.6.2 模塊間的通信 由于各個模塊需要單獨匯編,于是就會出現(xiàn)當一個模塊通過名字調(diào)用另一模塊中的子程序或使用其數(shù)據(jù)時,這些名字對于調(diào)用者來講是未定義的,因此在匯編過程中就會出現(xiàn)符號未定義錯誤。可以通過偽指令EXTRN、PUBLIC等來解決。 北京理工大學-張華平-2021401. 外部引用偽指令EXTRN格式:EXTRN 變量名:類型,功能:說明在本模塊中用到的變量是在另一個模塊中定義的,同時指出變量的類型。 北京理工大學-張華平-2021412. 全局符號說明偽指令PUBLIC格式:PUBLIC 名字,功能:告訴匯編程序本模塊中
16、定義的名字可以被其他模塊使用。這里的名字可以是變量名,也可以是子程序名。 3. 子程序聲明偽指令PROTO格式:子程序名 PROTO C | stdcall :第一個參數(shù)類型 ,:后續(xù)參數(shù)類型功能:說明子程序的名字和參數(shù)類型,供主程序調(diào)用。在前面的程序中,已經(jīng)屢次使用這種方式調(diào)用C語言的庫函數(shù)及Windows的API。 程序1a 主模塊EXTRN SUBM:FARPUBLIC PRICE,QTY,TOTALstacksg segment stack stk dw 32 dup(s)stacksg endsdata segmentPRICE DW 60QTY DW 80TOTAL DD ?data endscode segmentmain proc far assume cs:code,ds:data mov ax,data mov ds,ax CALL FAR PTR SUBM mov ax,4c00h int 21hmain endpcode ends end main北京理工大學-張華平-20214
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025至2030年中國船用電加熱器數(shù)據(jù)監(jiān)測研究報告
- 2025年度水利工程款抵還住宅房款執(zhí)行協(xié)議
- 二零二五年度素食餐廳轉(zhuǎn)讓及素食文化推廣合同
- 2025年度租賃房屋承租方精裝修合同范本
- 2025年度老年人贍養(yǎng)贍養(yǎng)金及社區(qū)養(yǎng)老支持協(xié)議
- 2025至2030年中國緩沖葫蘆數(shù)據(jù)監(jiān)測研究報告
- 二零二五年度礦業(yè)權(quán)轉(zhuǎn)讓與資源整合合同
- 二零二五年度大型土方工程居間管理與協(xié)調(diào)合同
- 2025至2030年中國純棉布料數(shù)據(jù)監(jiān)測研究報告
- 二零二五年度智能電網(wǎng)工程款代付及進度管理合同
- 七年級下冊《平行線的判定》課件與練習
- 2025年中考英語時文閱讀 6篇有關(guān)電影哪吒2和 DeepSeek的英語閱讀(含答案)
- 修高速土方合同范例
- 2024年湖北省武漢市中考語文試卷
- 二零二五年度高品質(zhì)小區(qū)瀝青路面翻新施工與道路綠化合同2篇
- 2024年形勢與政策復習題庫含答案(綜合題)
- 2022年北京市初三一模語文試題匯編:基礎(chǔ)知識綜合
- 2025年廣東食品藥品職業(yè)學院高職單招高職單招英語2016-2024年參考題庫含答案解析
- 2 爆破工試題及答案
- 工程項目部安全生產(chǎn)治本攻堅三年行動實施方案
- 2024三農(nóng)新政策解讀
評論
0/150
提交評論