NO1-高校匯編語言精講課件_第1頁
NO1-高校匯編語言精講課件_第2頁
NO1-高校匯編語言精講課件_第3頁
NO1-高校匯編語言精講課件_第4頁
NO1-高校匯編語言精講課件_第5頁
已閱讀5頁,還剩37頁未讀, 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、2022-3-61子程序設計子程序設計2022-3-62課前思考課前思考p子程序調用和返回時需要保護與恢復哪些寄存子程序調用和返回時需要保護與恢復哪些寄存器?器?p子程序的參數傳送有幾種方法?子程序的參數傳送有幾種方法?p如何采用增強功能的過程定義偽操作編制子程如何采用增強功能的過程定義偽操作編制子程序?序?p子程序嵌套與遞歸的區別?子程序嵌套與遞歸的區別?2022-3-63學習目標學習目標p了解子程序的構成了解子程序的構成p學會運用多種方法在調用程序與子程序之間傳學會運用多種方法在調用程序與子程序之間傳遞參數。遞參數。p掌握遞歸子程序的編程技巧。掌握遞歸子程序的編程技巧。2022-3-64學

2、習指南和難重點學習指南和難重點【學習指南】【學習指南】熟悉堆棧的運行過程對學習這一章至關重熟悉堆棧的運行過程對學習這一章至關重要。要。【難重點】【難重點】子程序的調用和返回。保護與恢復寄存器。子程序的調用和返回。保護與恢復寄存器。子程序的參數傳送。嵌套與遞歸子程序。子程序的參數傳送。嵌套與遞歸子程序。DOS系統功能調用。系統功能調用。2022-3-65子程序的設計方法子程序的設計方法 子程序又稱為過程,相當于高級語言中的過子程序又稱為過程,相當于高級語言中的過程和函數。程和函數。2022-3-66過程定義偽操作過程定義偽操作 過程定義偽操作用在過程(子程序)的前后,使過程定義偽操作用在過程(子

3、程序)的前后,使整個過程形成清晰的、具有特定功能的代碼塊。其格整個過程形成清晰的、具有特定功能的代碼塊。其格式為:式為:過程名過程名 PROC PROC near|farnear|far 過程名過程名 ENDPENDP其中過程名為標識符,它又是子程序入口的符號其中過程名為標識符,它又是子程序入口的符號地址,與標號的作用相同。地址,與標號的作用相同。屬性(屬性(AttributeAttribute)是指類型屬性,可以是)是指類型屬性,可以是NEARNEAR或或FARFAR。2022-3-67過程定義偽操作(續)過程定義偽操作(續) 用戶對過程屬性的確定原則很簡單,即:用戶對過程屬性的確定原則很簡

4、單,即:(1 1)如果調用程序和過程在)如果調用程序和過程在同一個代碼段中同一個代碼段中,則使用則使用NEARNEAR屬性。屬性。(2 2)如果調用程序和過程)如果調用程序和過程不在同一個代碼段不在同一個代碼段中,中,則使用則使用FARFAR屬性。屬性。2022-3-68過程定義偽操作(續)過程定義偽操作(續)過程的屬性為過程的屬性為near的情況:的情況: ;SampleB.ASMstack segment stackdw 512 dup(?)stack endsdata segment.;在數據段定義數據在數據段定義數據data endscode segment codeassume cs

5、:code,ds:data,ss:stackstart: mov ax,datamov ds,ax.;在代碼段填入指令序列在代碼段填入指令序列mov ax,4c00hint 21h.;子程序代碼子程序代碼code endsend start;SampleC.ASM.model small.stack.data.;在數據段定義數據在數據段定義數據.codestart:mov ax,datamov ds,ax.;在代碼段填入指令序列在代碼段填入指令序列mov ax,4c00hint 21h.;子程序代碼子程序代碼end start2022-3-611過程定義偽操作(續)過程定義偽操作(續)過程的屬

6、性為過程的屬性為far的情況:的情況:2022-3-612子程序的調用和返回子程序的調用和返回 子程序的正確調用和正子程序的正確調用和正確返回可以保證過程的正確確返回可以保證過程的正確執行,這一功能由執行,這一功能由80868086的的CALLCALL和和RETRET指令完成。指令完成。為保證其正確性,除為保證其正確性,除PROCPROC的屬性要正確選擇外,的屬性要正確選擇外,還應該注意子程序運行期間還應該注意子程序運行期間的的堆棧狀態堆棧狀態。例如:例如:SUBT PROC NEARPUSH AXPUSH BXPUSH CXPUSH DXPOP DXPOP CXPOP BXPOP AX RE

7、TSUBT ENDP 2022-3-613保存與恢復寄存器保存與恢復寄存器p如果主程序在調用子程序之前的某個寄存器內容在如果主程序在調用子程序之前的某個寄存器內容在從子程序返回后還有用,而子程序又恰好使用了同從子程序返回后還有用,而子程序又恰好使用了同一個寄存器,這就破壞了該寄存器的原有內容,因一個寄存器,這就破壞了該寄存器的原有內容,因而會造成程序運行錯誤,這是不允許的。而會造成程序運行錯誤,這是不允許的。p如果使用寄存器在主程序和子程序之間傳送參數的如果使用寄存器在主程序和子程序之間傳送參數的話,則這種寄存器就不一定需要保存,特別是用來話,則這種寄存器就不一定需要保存,特別是用來向主程序回

8、送結果的寄存器,就更不應該因保存和向主程序回送結果的寄存器,就更不應該因保存和恢復寄存器而破壞了應該向主程序傳送的信息?;謴图拇嫫鞫茐牧藨撓蛑鞒绦騻魉偷男畔?。 2022-3-614子程序的參數傳送子程序的參數傳送1. 通過通過寄存器寄存器傳送參數傳送參數主程序往子程序傳參數主程序往子程序傳參數子程序返回值子程序返回值特點:方便,但參數不能太多。特點:方便,但參數不能太多。求求Count個元素的和個元素的和入口參數:入口參數:CXCX元素個數,元素個數,DS:BXDS:BX數組的段地址:偏移地址數組的段地址:偏移地址出口參數:出口參數:ALAL校驗和校驗和2022-3-615;求;求Coun

9、tCount個元素的和個元素的和; ;設置入口參數(含有設置入口參數(含有DSDS數組的段地址)數組的段地址)mov mov bxbx,offset array,offset array;BX;BX數組的偏移地址數組的偏移地址mov mov cxcx,count,count ;CX;CX數組的元素個數數組的元素個數call checksumacall checksuma; ;調用求和過程調用求和過程mov result,mov result,alal; ;處理出口參數處理出口參數2022-3-616checksumachecksumaproc nearproc nearxor al,alxor

10、 al,al; ;累加器清累加器清0 0suma:suma:add add alal,bxbx ; ;求和求和inc inc bxbx; ;指向下一個字節指向下一個字節looploop suma sumaretretchecksumachecksumaendpendpendend2022-3-617子程序的參數傳送(續)子程序的參數傳送(續)2. 2. 若子程序和調用程序在同一源文件若子程序和調用程序在同一源文件( (同一同一程序模塊程序模塊) )中,則子程序可直接訪問模塊中的中,則子程序可直接訪問模塊中的變量。即通過變量。即通過存儲單元傳存儲單元傳遞參數。遞參數。求求Count個元素的和個元

11、素的和入口參數:入口參數:count元素個數,元素個數,array數組名(含段地址:偏移地址)數組名(含段地址:偏移地址)出口參數:出口參數:result校驗和校驗和2022-3-618例例2 通過通過存儲單元傳存儲單元傳遞參數遞參數; ;主程序主程序call checksumbcall checksumb; ;子程序子程序checksumbchecksumbprocproc near nearpush axpush axpush bxpush bxpush cxpush cxxor al,alxor al,al; ;累加器清累加器清0 0mov bx,offset mov bx,offset

12、 arrayarray; ;BXBX數組的偏移地址數組的偏移地址mov cx,mov cx,countcount; ;CXCX數組的元素個數數組的元素個數2022-3-619例例2 通過通過存儲單元傳存儲單元傳遞參數遞參數sumb:sumb:add al,bxadd al,bx; ;求和求和inc bxinc bxloop sumbloop sumbmov mov resultresult,al,al; ;保存校驗和保存校驗和pop cxpop cxpop bxpop bxpop axpop axretretchecksumbchecksumbendpendp2022-3-620子程序的參數傳

13、送(續)子程序的參數傳送(續)3.3.通過通過堆棧表堆棧表傳送參數或參數地址。高級語言常采傳送參數或參數地址。高級語言常采用這種方法。用這種方法。求求Count個元素的和個元素的和入口參數:入口參數:順序壓入偏移地址和元素個數順序壓入偏移地址和元素個數出口參數:出口參數:ALAL校驗和校驗和2022-3-621例例3 主程序主程序mov ax,offset arraymov ax,offset arraypush axpush axmov ax,countmov ax,countpush axpush axcall checksumccall checksumcadd sp,4add sp,4

14、mov result,almov result,alchecksumcchecksumc proc nearproc nearpush bppush bpmov bp,spmov bp,sp; ;利用利用BPBP間接尋址存取參數間接尋址存取參數push bxpush bxpush cxpush cxmov bx,mov bx,bp+6bp+6 ;SS:BP+6;SS:BP+6指向偏移地址指向偏移地址mov cx,mov cx,bp+4bp+4 ;SS:BP+4;SS:BP+4指向元素個數指向元素個數xor al,alxor al,alsumc:sumc:add al,bx add al,bx

15、inc bxinc bxloop sumcloop sumcpop cxpop cxpop bxpop bxpop bppop bpretretchecksumcchecksumc endpendp2022-3-623子程序的參數傳送(續)子程序的參數傳送(續)4.多個模塊之間的參數傳送問題多個模塊之間的參數傳送問題要點:要點:(1)(1)多個模塊使用同一變量,只能分配一次內存。多個模塊使用同一變量,只能分配一次內存。(2)(2)若要將變量定義成允許別的模塊訪問,則變量若要將變量定義成允許別的模塊訪問,則變量用用public public 定義成外部符號。如:定義成外部符號。如:PUBLIC

16、PUBLIC Var1Var1,Var2Var2,(3)(3)若在本模塊中使用另一個模塊中定義的變量,若在本模塊中使用另一個模塊中定義的變量,則在本模塊中用則在本模塊中用extrnextrn 定義。如:定義。如:EXTRNEXTRNVar1Var1:bytebyte,Var2Var2:bytebyte,2022-3-624子程序的嵌套與遞歸調用子程序的嵌套與遞歸調用子程序的嵌套調用是指在子程序中再調用其它子程序。子程序的嵌套調用是指在子程序中再調用其它子程序。 遞歸調用和高級語言中的一致,子程序直接或間接遞歸調用和高級語言中的一致,子程序直接或間接的調用自己,實際上是嵌套調用的一種特例。的調用

17、自己,實際上是嵌套調用的一種特例。 大量使用嵌套調用和遞歸調用會耗費大量的堆??沾罅渴褂们短渍{用和遞歸調用會耗費大量的堆??臻g,特別是遞歸調用。所以,在程序設計中需要估計程間,特別是遞歸調用。所以,在程序設計中需要估計程序執行時所需要的最大堆棧空間,序執行時所需要的最大堆??臻g,把堆棧段設置得足夠把堆棧段設置得足夠大,避免堆棧溢出大,避免堆棧溢出的情況。的情況。ALdispALdispprocprocpush axpush axpush cxpush cx; ;實現實現alal內容的顯示內容的顯示push dxpush dxpush axpush ax; ;暫存暫存axaxmov dl,alm

18、ov dl,al; ;轉換轉換alal的高的高4 4位位mov cl,4mov cl,4shr dl,clshr dl,clcall dldispcall dldisp; ;調用子程序顯示調用子程序顯示alal高高4 4位位pop dxpop dxand dl,0fhand dl,0fhcall dldispcall dldisp; ;調用子程序顯示調用子程序顯示alal低低4 4位位pop dxpop dxpop cxpop cxpop axpop axretretALdispALdispendpendp; ;顯示顯示dldl低低4 4位中一位十六進制數位中一位十六進制數dldispdldi

19、spprocprocor dl,30hor dl,30hcmp dl,39hcmp dl,39hjbe dldisp1jbe dldisp1add dl,7add dl,7dldisp1:dldisp1: mov ah,2mov ah,2int 21hint 21hretretdldispdldispendpendp.model small.model small.stack 256.stack 256.data.dataN Ndw 5dw 5resultresultdw ?dw ?.code.codestart:start:mov ax,datamov ax,datamov ds,axmov

20、 ds,axmov ax,nmov ax,ncall factcall factmov ax,resultmov ax,resultmov ah,4chmov ah,4chint 21hint 21h求階乘求階乘; ;計算計算N!N!的近過程的近過程; ;入口參數:入口參數:AXAX; ;出口參數:出口參數:resultresultfact fact procproccmp ax,0cmp ax,0;N=0?;N=0?jne l1jne l1mov result,1mov result,1; ;是,是, N!N!1 1retretl1:l1:push axpush axdec axdec ax

21、call factcall factpop axpop axmul resultmul resultmov result,axmov result,axretretfact fact endpendpend startend start求階乘求階乘2022-3-629子程序舉例子程序舉例例例6 HEXIDEC6 HEXIDEC是一個把十六進制數轉換成十進制數是一個把十六進制數轉換成十進制數的程序。要求把從鍵盤輸入的的程序。要求把從鍵盤輸入的0 00FFFFH0FFFFH的十六進的十六進制正數轉換為十進制數并在屏幕上顯示出來。制正數轉換為十進制數并在屏幕上顯示出來。子程序之間的參數傳送,采用寄存

22、器傳送的方式子程序之間的參數傳送,采用寄存器傳送的方式DisplayDisplayequ equ 2h2h; ; 顯示單個字符的功能號是顯示單個字符的功能號是2 2key_in key_in equ equ 1h 1h ; ; 鍵盤輸入單個字符的功能號是鍵盤輸入單個字符的功能號是1 1doscall doscall equequ21h21h; DOS; DOS中斷號中斷號hexidec hexidec segment segment main proc far main proc far assume assume cs:hexideccs:hexidecstart: start: pushp

23、ush ds ds subsubax,ax ax,ax push ax push ax call call hexibinhexibin; ; 十六進制轉換成二進制十六進制轉換成二進制call call crlf crlf ; ; 顯示回車和換行顯示回車和換行call call binidecbinidec ; ; 二進制轉換成十進制二進制轉換成十進制call call crlfcrlf ret ret main endp main endp 這是主程序這是主程序; ; 定義子程序定義子程序hexibinhexibin( (十六進制轉換成二進制十六進制轉換成二進制, ,結果在結果在bxbx中中

24、) )hexibin hexibin proc nearproc nearmovmovbx,0bx,0newchar:newchar:mov ah,key_in mov ah,key_in int int doscall doscall ; ; 鍵盤輸入單個字符鍵盤輸入單個字符sub sub al,30h al,30h jl jl exit exit cmp cmp al,10d al,10d jl jl add_to add_to ; 0; 09 9之間轉之間轉add_toadd_to; ; 判斷是否判斷是否a af f之間之間(a(a的的ASCIIASCII碼為碼為61h)61h)sub

25、sub al,27h al,27h cmp cmp al,0ah al,0ah jl jl exit exit cmp cmp al,10h al,10h jge jge exit exit (待續)(待續)(續)(續); 0; 09 9或或a af fadd_to:add_to:mov cl,4 mov cl,4 shl bx,cl shl bx,cl ; (bx); (bx)* *1616mov ah,0 mov ah,0 add bx,ax add bx,ax jmp newchar jmp newchar exit:exit:ret ret hexibin hexibin endpen

26、dp ; ; 定義子程序定義子程序binidecbinidec( (二進制轉換成十進制二進制轉換成十進制) ) binidec proc nearbinidec proc nearmov mov cx,10000d cx,10000d callcall dec_div dec_div ; bx; bx被被1000010000除除mov mov cx,1000d cx,1000d call dec_div call dec_div ; bx; bx被被10001000除除movmovcx,100d cx,100d callcall dec_div dec_div ; bx; bx被被100100

27、除除movmovcx,10d cx,10d callcall dec_div dec_div ; bx; bx被被1010除除mov mov cx,1d cx,1d callcall dec_div dec_div ; bx; bx被被1 1除除ret ret ; ; 定義子程序定義子程序dec_divdec_div( (十進制除十進制除) ) dec_div dec_div proc nearproc nearmov mov ax,bx ax,bx mov mov dx,0 dx,0 ; ; 被除數在被除數在dx:axdx:ax中中div div cx cx mov mov bx,dx bx

28、,dx ; ; 余數送余數送bxbxmov mov dl,al dl,al ; ; 商送商送dldladd add dl,30h dl,30h mov mov ah,display ah,display int int doscall doscall ; ; 顯示單個字符顯示單個字符ret ret dec_div dec_div endpendpbinidec binidec endpendp; 定義子程序定義子程序crlf crlf crlf proc nearcrlf proc nearmov mov dl,0ah dl,0ah mov mov ah,display ah,display

29、int int doscall doscall mov mov dl,0dh dl,0dh mov mov ah,display ah,display int int doscall doscall ret ret crlf endpcrlf endphexidec ends hexidec ends end start end start 2022-3-636例例7 7 本例為一個簡單的信息檢索系統。在數據區本例為一個簡單的信息檢索系統。在數據區里,有里,有1010個不同的信息,編號為個不同的信息,編號為0 09 9,每個信息包,每個信息包括括3030個字符?,F在要求編制一個程序:從鍵盤接收

30、個字符?,F在要求編制一個程序:從鍵盤接收0 09 9之間的一個編號,然后在屏幕上顯示出相應編之間的一個編號,然后在屏幕上顯示出相應編號的信息內容。號的信息內容。 datarea segment thirty db 30 ; 信息表信息表 msg0 db I like my IBM-PC- msg1 db 8088 programming is fun- msg2 db Time to buy more diskettes- msg3 db This program works- msg4 db Turn off that printer- msg5 db I have more memory

31、than you- msg6 db The PSP can be useful- msg7 db BASIC was easier than this- msg8 db DOS is indispensable- msg9 db Last massage of the day- ; 錯誤信息錯誤信息 errmsg db error! invalid parameter! datarea ends stack stack segmentsegmentdb 256 dup(0) db 256 dup(0) tostoslabel wordlabel wordstack stack endsendsprognam segment prognam segment main proc main proc far far assumecs:prognam,ds:datarea,ss:stackassumecs:prognam,ds:datarea,ss:stackstart: start: mov mov ax,stackax,stackmovmovss,axss,axmov mov sp,offset tossp,offset tospush ds push ds sub sub ax,ax ax,ax pu

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論