《匯編語言程序設(shè)計》第6章課件_第1頁
《匯編語言程序設(shè)計》第6章課件_第2頁
《匯編語言程序設(shè)計》第6章課件_第3頁
《匯編語言程序設(shè)計》第6章課件_第4頁
《匯編語言程序設(shè)計》第6章課件_第5頁
已閱讀5頁,還剩32頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、匯編語言匯編語言淮南師范學(xué)院重點(diǎn)課程淮南師范學(xué)院重點(diǎn)課程匯編語言程序設(shè)計第6章 調(diào)用程序與子程序調(diào)用程序與子程序 調(diào)用與返回指令調(diào)用與返回指令 子程序設(shè)計子程序設(shè)計 匯編語言匯編語言淮南師范學(xué)院重點(diǎn)課程淮南師范學(xué)院重點(diǎn)課程匯編語言程序設(shè)計第6章 6.1 6.1 調(diào)用程序與子程序調(diào)用程序與子程序 子程序子程序: :在許多應(yīng)用程序中,常常需要多次使用某功能的指令序列。這時,為了減少重復(fù)編寫程序,節(jié)省內(nèi)存空間,把這一功能的指令序列組成一個相對獨(dú)立的程序段。在程序運(yùn)行時,如果需要使用這個給定的功能,就轉(zhuǎn)移到這個獨(dú)立的程序段,待這個獨(dú)立的程序段指令序列執(zhí)行完后,又返回到原來位置繼續(xù)運(yùn)行程序。我們把這個相

2、對獨(dú)立的程序段就叫子程序或過程。調(diào)用程序調(diào)用程序: :編制程序時,按需要轉(zhuǎn)向子程序,稱為子程序調(diào)用,或稱為過程調(diào)用。調(diào)用子程序的程序稱為調(diào)用程序或主程序。主、子程序是相對而言的。但子程序一定是受調(diào)用程序或主程序調(diào)用的。返回返回匯編語言匯編語言淮南師范學(xué)院重點(diǎn)課程淮南師范學(xué)院重點(diǎn)課程匯編語言程序設(shè)計第6章6.2 6.2 調(diào)用與返回指令調(diào)用與返回指令 1過程調(diào)用指令CALL 指令格式:指令格式: CALL DST 其中DST為過程的目標(biāo)地址。 指令功能:指令功能: 把CALL指令的下一條指令地址(稱為返回點(diǎn)或斷點(diǎn)) 推入堆棧保存,然后轉(zhuǎn)到目標(biāo)地址(DST)。 CALL指令可以在段內(nèi)、段間調(diào)用,尋址

3、方式分為直接和間接兩種。(1)段內(nèi)直接調(diào)用 指令中DST給出轉(zhuǎn)向地址。首先將指令指針I(yè)P推入堆棧保存,然后把從指令中得到的距目標(biāo)過程相對偏移量(最大為32K字節(jié))加到指令指針I(yè)P上(得到子程序的入口地址),實(shí)現(xiàn)過程調(diào)用。執(zhí)行的操作為:(SP)(SP)2 (SP)+1,(SP)(IP) (IP)(IP)+D16其中D16為機(jī)器指令的位移量,它是轉(zhuǎn)向地址和返回地址之間的差直。 匯編語言匯編語言淮南師范學(xué)院重點(diǎn)課程淮南師范學(xué)院重點(diǎn)課程匯編語言程序設(shè)計第6章(2)段內(nèi)間接調(diào)用執(zhí)行的操作為:(SP)(SP)2 (SP)+1,(SP)(IP) (IP)(EA) 其中EA 是由DST的尋址方式所確定的有效地

4、址。(3)段間直接調(diào)用 首先把現(xiàn)行的代碼段寄存器CS的內(nèi)容和指令指針I(yè)P的值入棧保存,然后把指令中的地址偏移字和段地址字送入IP和CS。執(zhí)行的操作為:(SP)(SP)2 (SP)+1,(SP)(CS) (SP)(SP)2 (SP)+1,(SP)(IP) (IP)偏移地址(指令的第2、3個字節(jié)) (CS)段地址(指令的第4、5個字節(jié)) 匯編語言匯編語言淮南師范學(xué)院重點(diǎn)課程淮南師范學(xué)院重點(diǎn)課程匯編語言程序設(shè)計第6章(4)段間間接調(diào)用 首先把現(xiàn)行的代碼段寄存器CS的內(nèi)容和指令指針I(yè)P的值入棧保存,然后把指令中的地址偏移字和段地址字送入IP和CS。執(zhí)行的操作為:(SP)(SP)2 (SP)+1,(SP

5、)(CS) (SP)(SP)2 (SP)+1,(SP)(IP) (IP)(EA) (CS)(EA+2)其中EA 是由DST的尋址方式所確定的有效地址。2 2返回指令返回指令RETRET指令格式:指令格式:RET指令功能:指令功能:RET指令通常寫在一個子程序(或過程)的最后,用以返回到調(diào)用這個子程序的斷點(diǎn)處。匯編語言匯編語言淮南師范學(xué)院重點(diǎn)課程淮南師范學(xué)院重點(diǎn)課程匯編語言程序設(shè)計第6章RET指令也屬于無條件轉(zhuǎn)移指令。可以在段內(nèi)或段間返回。(1)段內(nèi)返回 RET指令由堆棧彈回斷點(diǎn)偏移量到指令指針I(yè)P,實(shí)現(xiàn)段內(nèi)調(diào)用返回。執(zhí)行的操作為:(IP)(SP)+1,(SP)(SP)(SP)+2(2)段間返回

6、 RET指令除由堆棧彈回斷點(diǎn)偏移量到指令指針I(yè)P外,還由堆棧彈回斷點(diǎn)所在段基址到代碼段寄存器CS,實(shí)現(xiàn)段間調(diào)用返回。執(zhí)行的操作為:(IP)(SP)+1,(SP) (SP)(SP)+2 (CS)(SP)+1,(SP) (SP)(SP)+2返回返回匯編語言匯編語言淮南師范學(xué)院重點(diǎn)課程淮南師范學(xué)院重點(diǎn)課程匯編語言程序設(shè)計第6章 6.3 6.3 子程序設(shè)計子程序設(shè)計 6.3.1 子程序定義 6.3.2 子程序的調(diào)用與返回 6.3.3 現(xiàn)場保護(hù)與恢復(fù) 6.3.4 參數(shù)的傳遞方式 6.3.5 子程序調(diào)用舉例 6.3.6 6.3.6 子程序的嵌套與遞歸子程序的嵌套與遞歸返回返回匯編語言匯編語言淮南師范學(xué)院重

7、點(diǎn)課程淮南師范學(xué)院重點(diǎn)課程匯編語言程序設(shè)計第6章6.3.1 子程序定義 格式:過程名 PROC NEAR/FAR 過程名 ENDP其中PROC表示過程定義開始,ENDP表示過程定義結(jié)束。 一般過程名同標(biāo)號一樣,具有三種屬性,即段屬性、偏移地址屬性以及類型屬性。而類型屬性可指定為NEAR或FAR兩種類型。具有NEAR屬性的子程序與調(diào)用程序應(yīng)在同一個邏輯段中,而具有FAR屬性的子程序和調(diào)用程序不在同一個邏輯段內(nèi)。若為NEAR類型屬性時可以省略“NEAR”。如下面的定義皆為正確的過程定義:段內(nèi)調(diào)用: A PROC NEAR A PROC 或 A ENDP A ENDP匯編語言匯編語言淮南師范學(xué)院重點(diǎn)

8、課程淮南師范學(xué)院重點(diǎn)課程匯編語言程序設(shè)計第6章段間調(diào)用:B PROC FAR B ENDP 6.3.2 6.3.2 子程序的調(diào)用與返回子程序的調(diào)用與返回1 1段內(nèi)調(diào)用段內(nèi)調(diào)用前面已經(jīng)講過,子程序調(diào)用可以在段內(nèi)調(diào)用,也可以在段間調(diào)用。如果前面已經(jīng)講過,子程序調(diào)用可以在段內(nèi)調(diào)用,也可以在段間調(diào)用。如果是段內(nèi)調(diào)用,則在過程定義時,必須定義為是段內(nèi)調(diào)用,則在過程定義時,必須定義為NEARNEAR類型。這時,過程定類型。這時,過程定義可放在代碼段中,置于主程序體之前或之后。義可放在代碼段中,置于主程序體之前或之后?!纠纠?.16.1】已知三個八位無符號數(shù)】已知三個八位無符號數(shù)X X、Y Y、Z Z,分

9、別存放于分別存放于BUFBUF、BUF+1BUF+1和和BUF+2BUF+2存儲單元,計算存儲單元,計算2 2X+5Y+8ZX+5Y+8Z,結(jié)果送結(jié)果送RESRES和和RES+1RES+1單元。單元。 返回返回匯編語言匯編語言淮南師范學(xué)院重點(diǎn)課程淮南師范學(xué)院重點(diǎn)課程匯編語言程序設(shè)計第6章NAME EXAM6_1NAME EXAM6_1DATA SEGMENTDATA SEGMENTBUF DB 71H,0A4H,9BHBUF DB 71H,0A4H,9BHRES DB 2 DUP(?)RES DB 2 DUP(?)DATA ENDSDATA ENDSSTACK SEGMENT PARA STA

10、CK STACKSTACK SEGMENT PARA STACK STACKSTAPN DB 100 DUP(?)STAPN DB 100 DUP(?)TOP EQU LENGTH STAPNTOP EQU LENGTH STAPNSTACK ENDSSTACK ENDSCODE SEGMENTCODE SEGMENT ASSUME CS:CODE, DS:DATA, SS:STACK ASSUME CS:CODE, DS:DATA, SS:STACKSTART:MOV AX,DATASTART:MOV AX,DATA MOV DS,AX MOV DS,AX MOV AX,STACK MOV

11、AX,STACK MOV SS,AX MOV SS,AX MOV AX,TOP MOV AX,TOP MOV SP,AX MOV SP,AX MOV AX,0 MOV AX,0 ;AXAX清清0 0 MOV WORD PTR RES,AX MOV WORD PTR RES,AX ;RESRES字單元清字單元清0 0匯編語言匯編語言淮南師范學(xué)院重點(diǎn)課程淮南師范學(xué)院重點(diǎn)課程匯編語言程序設(shè)計第6章 LEA BX,BUF LEA BX,BUF ;置地址指針置地址指針 MOV AL,2MOV AL,2 CALL MULL CALL MULL ;過程調(diào)用過程調(diào)用 MOV AL,5MOV AL,5 CALL

12、 MULL CALL MULL ;過程調(diào)用過程調(diào)用 MOV AL,8MOV AL,8 CALL MULL CALL MULL ;過程調(diào)用過程調(diào)用 MOV AH,4CHMOV AH,4CH INT 21H INT 21HMULL PROC MULL PROC ;乘法子程序乘法子程序 MUL BYTE PTR BX MUL BYTE PTR BX ;做乘法結(jié)果在做乘法結(jié)果在AXAX ADD WORD PTR RES,AX ADD WORD PTR RES,AX ;做加法做加法 MOV AX,0 MOV AX,0 ;AXAX清清0 0 INC BX INC BX ;地址加地址加1 1 RET RET

13、 ;返回主程序返回主程序 MULL ENDPMULL ENDPCODE ENDSCODE ENDSEND STARTEND START匯編語言匯編語言淮南師范學(xué)院重點(diǎn)課程淮南師范學(xué)院重點(diǎn)課程匯編語言程序設(shè)計第6章2 2段間調(diào)用段間調(diào)用子程序如果段間調(diào)用時,必須定義為FAR類型。段間調(diào)用通常用于不同模塊之間的調(diào)用。編寫不同模塊的段間調(diào)用程序,應(yīng)該注意以下幾個個問題: (1)主程序模塊和子程序模塊分別匯編,然后用連接程序?qū)⑺鼈冞B接在一起。 (2)在主程序模塊中,主程序所調(diào)用的外部過程名必須用EXTRN偽指令說明。 (3)在過程模塊中,提供給外段調(diào)用的過程名必須用PUBLIC偽指令說明。 (4)模塊

14、間其它公用符號名及外部符號名的定義不可缺少。 【例6.2】將【例6.1】 中的段內(nèi)調(diào)用改為段間調(diào)用匯編語言匯編語言淮南師范學(xué)院重點(diǎn)課程淮南師范學(xué)院重點(diǎn)課程匯編語言程序設(shè)計第6章源程序?yàn)椋涸闯绦驗(yàn)椋篘AME EXAM6_2NAME EXAM6_2EXTRN MULLEXTRN MULL:FAR FAR ;外部引用說明外部引用說明PUBLIC RES PUBLIC RES ;定義公用名定義公用名DATA SEGMENTDATA SEGMENTBUF DB 71H,0A4H,9BHBUF DB 71H,0A4H,9BHRES DB 2 DUP(?)RES DB 2 DUP(?)DATA ENDSDA

15、TA ENDSSTACK SEGMENT PARA STACK STACKSTACK SEGMENT PARA STACK STACKSTAPN DB 100 DUP(?)STAPN DB 100 DUP(?)TOP EQU LENGTH STAPNTOP EQU LENGTH STAPNSTACK ENDSSTACK ENDSCODE SEGMENTCODE SEGMENT ASSUME CS:CODE, DS:DATA, SS:STACK ASSUME CS:CODE, DS:DATA, SS:STACKSTART:MOV AX,DATASTART:MOV AX,DATA MOV DS,A

16、X MOV DS,AX MOV AX,STACK MOV AX,STACK MOV SS,AX MOV SS,AX MOV AX,TOP MOV AX,TOP MOV SP,AXMOV SP,AX MOV AX,0 MOV AX,0 ;AXAX清清0 0 MOV WORD PTR RES,AX MOV WORD PTR RES,AX ;RESRES字單元清字單元清0 0 LEA BX,BUF LEA BX,BUF ;置地址指針置地址指針匯編語言匯編語言淮南師范學(xué)院重點(diǎn)課程淮南師范學(xué)院重點(diǎn)課程匯編語言程序設(shè)計第6章 MOV AL,2MOV AL,2 CALL MULL CALL MULL ;過程

17、調(diào)用過程調(diào)用 MOV AL,5MOV AL,5 CALL MULL CALL MULL ;過程調(diào)用過程調(diào)用 MOV AL,8MOV AL,8 CALL MULL CALL MULL ;過程調(diào)用過程調(diào)用 MOV AH,4CHMOV AH,4CH INT 21H INT 21HCODE ENDSCODE ENDS END START END START NAME L6_2A NAME L6_2A EXTRN RES EXTRN RES:BYTE BYTE ;外部引用說明外部引用說明CODEA SEGMENTCODEA SEGMENT MULL PROC FAR MULL PROC FAR ;乘法子

18、程序乘法子程序 ASSUME CS ASSUME CS:CODEACODEAPUBLIN MULL PUBLIN MULL ;定義公用名定義公用名 MUL BYTE PTR BX MUL BYTE PTR BX ;做乘法結(jié)果在做乘法結(jié)果在AXAX ADD WORD PTR RES,AX ADD WORD PTR RES,AX ;做加法做加法 MOV AX,0 MOV AX,0 ;AXAX清清0 0 INC BX INC BX ;地址加地址加1 1 RET RET ;返回主程序返回主程序 MULL ENDPMULL ENDPCODEA ENDSCODEA ENDS END END返回返回匯編語言

19、匯編語言淮南師范學(xué)院重點(diǎn)課程淮南師范學(xué)院重點(diǎn)課程匯編語言程序設(shè)計第6章6.3.3 現(xiàn)場保護(hù)與恢復(fù) 要保護(hù)的寄存器:應(yīng)該是在子程序中將被使用,返回調(diào)用程序后仍然需要使用其原有內(nèi)容的那些寄存器。即保護(hù)調(diào)用程序和子程序兩者在使用上發(fā)生沖突的那些寄存器。但在編程時,一時很難弄清哪些是有沖突的寄存器,一種較為簡單的方法是把所有的寄存器均加以保護(hù)。一般在子程序中進(jìn)行寄存器保護(hù)較好。即在子程序的開始部分,先進(jìn)行相關(guān)寄存器(主要是在子程序中使用的各寄存器)的保護(hù)。然后再進(jìn)行子程序的處理操作。在執(zhí)行完子程序后,返回前,先恢復(fù)各寄存器內(nèi)容后,再返回調(diào)用程序。例如:SUBT PROC NEARSUBT PROC N

20、EAR PUSH AX PUSH AX PUSH BX PUSH BX PUSH CX PUSH CX PUSH DX PUSH DX POP DX POP DX POP CX POP CX POP BX POP BX POP AX POP AX RET RETSUBT ENDPSUBT ENDP返回返回匯編語言匯編語言淮南師范學(xué)院重點(diǎn)課程淮南師范學(xué)院重點(diǎn)課程匯編語言程序設(shè)計第6章6.3.4 參數(shù)的傳遞方式 參數(shù)傳遞通常有三種方法:寄存器、存儲器和堆棧分別作為傳遞的工具 。1利用寄存器傳遞參數(shù) 實(shí)現(xiàn)的方法是把子程序所需要的入口參數(shù),由調(diào)用程序予先放入指定的寄存器中。在進(jìn)入子程序后,子程序就可直

21、接對這些寄存器內(nèi)容進(jìn)行操作了。同樣子程序的運(yùn)行結(jié)果,也可置入寄存器中,把它們作為子程序的出口參數(shù)寄存器使用。 【例6.3】以BCDBUF為首址的內(nèi)存緩沖區(qū)存放著若干單元的用BCD碼表示的十進(jìn)制數(shù)。每個單元中放兩位BCD碼,要求把它們分別轉(zhuǎn)換為ASCII碼,存放在ASCBUF為首址的緩沖區(qū)中,且高4位BCD碼轉(zhuǎn)換成的ASCII碼放在地址較高的單元。并且要求邊轉(zhuǎn)換邊顯示這些ASCII碼。源程序?yàn)椋篘AME EXAM6_3NAME EXAM6_3DATA SEGMENTDATA SEGMENTBCDUBF DB 71H,24H,96H,87H,12H,78H,56H,34H,63H,45HBCDUB

22、F DB 71H,24H,96H,87H,12H,78H,56H,34H,63H,45HCOUNT EQU $-BCDBUFCOUNT EQU $-BCDBUFASCBUF DB 20 DUP(?)ASCBUF DB 20 DUP(?)DATA ENDSDATA ENDS匯編語言匯編語言淮南師范學(xué)院重點(diǎn)課程淮南師范學(xué)院重點(diǎn)課程匯編語言程序設(shè)計第6章STACK SEGMENT PARA STACKSTACKSTACK SEGMENT PARA STACKSTACKSTAPN DB 100 DUP(?)STAPN DB 100 DUP(?)TOP EQU LENGTH STAPNTOP EQU L

23、ENGTH STAPNSTACK ENDSSTACK ENDSCODE SEGMENTCODE SEGMENT ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACKSTART: MOV AX,DATASTART: MOV AX,DATA MOV DS,AX MOV DS,AX MOV ES,AX MOV ES,AX MOV AX,STACK MOV AX,STACK MOV SS,AX MOV SS,AX MOV AX,TOP MOV AX,TOP MOV SP,AX MOV SP,AX

24、MOV SI,OFFSET BCDBUF MOV SI,OFFSET BCDBUF ;BCDBCD碼首址碼首址 MOV DI,OFFSET ASCBUF MOV DI,OFFSET ASCBUF ;ASCIIASCII碼首址碼首址 MOV CX,COUNT MOV CX,COUNT ;組合組合BCDBCD碼個數(shù)碼個數(shù) CLD CLD ;DF=0 DF=0 LD: LODSB LD: LODSB ;取一個組合取一個組合BCDBCD碼碼 MOV BLMOV BL,AL AL ;保存保存 AND AL,0FHAND AL,0FH OR AL,30H OR AL,30H ;BCDBCD碼低位轉(zhuǎn)換為碼低

25、位轉(zhuǎn)換為ASCIIASCII碼碼 匯編語言匯編語言淮南師范學(xué)院重點(diǎn)課程淮南師范學(xué)院重點(diǎn)課程匯編語言程序設(shè)計第6章MOV DL,AL MOV DL,AL ;存入存入DLDL STOSB STOSB ;存入存入ASCIIASCII碼存儲區(qū)碼存儲區(qū)CALL DISP CALL DISP ;顯示顯示ASCIIASCII碼字符碼字符 MOV AL,BL MOV AL,BL ;BCDBCD碼送回碼送回ALAL PUSH CX PUSH CX ;保存計數(shù)保存計數(shù) MOV CL,4MOV CL,4 SHR AL,CL SHR AL,CL OR AL,30H OR AL,30H ;BCDBCD碼高位轉(zhuǎn)換為碼高位

26、轉(zhuǎn)換為ASCIIASCII碼碼 MOV DL,AL MOV DL,AL ;存入存入DLDL STOSB STOSB ;存入存入ASCIIASCII碼存儲區(qū)碼存儲區(qū) CALL DISP CALL DISP ;顯示顯示ASCIIASCII碼碼 POP CX POP CX ;彈出計數(shù)彈出計數(shù) LOOP LP LOOP LP ;計數(shù)減計數(shù)減1 1不為不為0 0繼續(xù)繼續(xù) MOV AH,4CHMOV AH,4CH INT 21H INT 21H ;子程序名:子程序名:DISPDISP ;功能:顯示功能:顯示ASCIIASCII字符字符 ;入口參數(shù):;入口參數(shù):ASCIIASCII碼在碼在DLDL中中匯編語

27、言匯編語言淮南師范學(xué)院重點(diǎn)課程淮南師范學(xué)院重點(diǎn)課程匯編語言程序設(shè)計第6章 DISP PROCDISP PROC MOV AH,2 MOV AH,2 ;2 2號系統(tǒng)功能調(diào)用號系統(tǒng)功能調(diào)用 INT 21HINT 21H MOV DL, MOV DL, MOV AH,2 MOV AH,2 INT 21H INT 21H RET RETDISP ENDPDISP ENDPCODE ENDSCODE ENDS END START END START 2利用存儲器傳遞參數(shù)利用存儲器傳遞參數(shù) 利用存儲器參數(shù)傳遞,適合于參數(shù)較多的情況。大多是在數(shù)據(jù)區(qū)建立參數(shù)利用存儲器參數(shù)傳遞,適合于參數(shù)較多的情況。大多是在數(shù)

28、據(jù)區(qū)建立參數(shù)表,里面放有子程序所要使用的參數(shù)。調(diào)用程序把該參數(shù)表首地址傳送給子表,里面放有子程序所要使用的參數(shù)。調(diào)用程序把該參數(shù)表首地址傳送給子程序。子程序通過參數(shù)表取得所需參數(shù),在數(shù)據(jù)處理完后,將結(jié)果也送到指程序。子程序通過參數(shù)表取得所需參數(shù),在數(shù)據(jù)處理完后,將結(jié)果也送到指定的數(shù)據(jù)儲存區(qū)中。定的數(shù)據(jù)儲存區(qū)中。 【例例6.4】 將例【例將例【例6.3】的程序改為用存儲器傳遞參數(shù)?!康某绦蚋臑橛么鎯ζ鱾鬟f參數(shù)。 匯編語言匯編語言淮南師范學(xué)院重點(diǎn)課程淮南師范學(xué)院重點(diǎn)課程匯編語言程序設(shè)計第6章源程序?yàn)椋涸闯绦驗(yàn)椋篘AME EXAM6_4NAME EXAM6_4DATA SEGMENTDATA SEG

29、MENTBCDUBF DB 71H,24H,96H,87H,12H,78H,56H,34H,63H,45HBCDUBF DB 71H,24H,96H,87H,12H,78H,56H,34H,63H,45HCOUNT EQU $-BCDBUFCOUNT EQU $-BCDBUFASCBUF DB 20 DUP(?)ASCBUF DB 20 DUP(?)DATA ENDSDATA ENDSSTACK SEGMENT PARA STACKSTACKSTACK SEGMENT PARA STACKSTACKSTAPN DB 100 DUP(?)STAPN DB 100 DUP(?)TOP EQU LE

30、NGTH STAPNTOP EQU LENGTH STAPNSTACK ENDSSTACK ENDSCODE SEGMENTCODE SEGMENT ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACKSTART: MOV AX,DATASTART: MOV AX,DATA MOV DS,AX MOV DS,AX MOV ES,AX MOV ES,AX MOV AX,STACK MOV AX,STACK MOV SS,AX MOV SS,AX MOV AX,TOP MOV AX,TOP M

31、OV SP,AX MOV SP,AX MOV SI,OFFSET BCDBUF MOV SI,OFFSET BCDBUF ;BCDBCD碼首址碼首址 匯編語言匯編語言淮南師范學(xué)院重點(diǎn)課程淮南師范學(xué)院重點(diǎn)課程匯編語言程序設(shè)計第6章MOV DI,OFFSET ASCBUF MOV DI,OFFSET ASCBUF ;ASCIIASCII碼首址碼首址 MOV CX,COUNT MOV CX,COUNT ;組合組合BCDBCD碼個數(shù)碼個數(shù) CLD CLD ;DF=0DF=0LP: LODSBLP: LODSB MOV BL,AL MOV BL,AL AND AL,OFH AND AL,OFH OR A

32、L,30H OR AL,30H STOSB STOSB CALL DISP CALL DISP MOV AL,BL MOV AL,BL PUSH CX PUSH CX MOV CL,4 MOV CL,4 SHR AL,CL SHR AL,CL OR AL,30H OR AL,30H STOSB STOSB CALL DISP CALL DISP POP CX POP CX LOOP LP LOOP LP MOV AH,4CH MOV AH,4CH INT 21H INT 21H 匯編語言匯編語言淮南師范學(xué)院重點(diǎn)課程淮南師范學(xué)院重點(diǎn)課程匯編語言程序設(shè)計第6章 ;子程序名:;子程序名:DISPDI

33、SP ;功能:顯示功能:顯示ASCIIASCII字符字符 ;入口參數(shù):;入口參數(shù):DIDI指向指向ASCIIASCII碼單元碼單元DISP PROCDISP PROC PUSH DI PUSH DI DEC DI DEC DI ;該該DIDI是要顯示字符所在單元地址是要顯示字符所在單元地址 MOV DL,DIMOV DL,DI MOV AH,2 MOV AH,2 INT 21H INT 21H POP DI POP DI MOV DL, MOV DL, MOV AH MOV AH,2 2 INT 21H INT 21H RET RETDISP ENDPDISP ENDPCODE ENDSCOD

34、E ENDS END START END START 匯編語言匯編語言淮南師范學(xué)院重點(diǎn)課程淮南師范學(xué)院重點(diǎn)課程匯編語言程序設(shè)計第6章3 3利用堆棧傳遞參數(shù)利用堆棧傳遞參數(shù) 利用堆棧進(jìn)行參數(shù)傳遞,就是在主程序中將參數(shù)推入堆棧,而在子程序中將參數(shù)從堆棧中彈出。用堆棧傳遞參數(shù)也適于多參數(shù)的情況,但要注意堆棧后進(jìn)先出的特點(diǎn),避免參數(shù)進(jìn)出棧的混亂?!纠?.5】 將例【例6.3】的程序改為用堆棧傳遞參數(shù)。LP: LODSBLP: LODSB MOV BL,AL MOV BL,AL AND AL,OFH AND AL,OFH OR AL,30H OR AL,30H MOV AH,0 MOV AH,0 PUS

35、H AX PUSH AX ;保存低位保存低位BCDBCD碼對應(yīng)的碼對應(yīng)的ASCIIASCII碼碼 STOSBSTOSB CALL DISP CALL DISP MOV AL,BL MOV AL,BL MOV DX,CX MOV DX,CX匯編語言匯編語言淮南師范學(xué)院重點(diǎn)課程淮南師范學(xué)院重點(diǎn)課程匯編語言程序設(shè)計第6章 MOV CL,4MOV CL,4 SHR AL,CL SHR AL,CL OR AL,30H OR AL,30H MOV CX,DX MOV CX,DX MOV AH,0 MOV AH,0 PUSH AX PUSH AX STOSB STOSB CALL DISP CALL DIS

36、P LOOP LP LOOP LP MOV AH,4CH MOV AH,4CH INT 21H INT 21H ;子程序名:子程序名:DISPDISP ;功能:顯示功能:顯示ASCIIASCII字符字符 ;入口參數(shù):;入口參數(shù): ASCIIASCII在堆棧中在堆棧中DISP PROCDISP PROC MOV BP,SP MOV BP,SP MOV DL,BP+2 MOV DL,BP+2 ;取出取出ASCIIASCII碼字符送入碼字符送入DLDL MOV AH,2 MOV AH,2 INT 21H INT 21H MOV DL, MOV DL, 匯編語言匯編語言淮南師范學(xué)院重點(diǎn)課程淮南師范學(xué)院

37、重點(diǎn)課程匯編語言程序設(shè)計第6章MOV AH,2MOV AH,2 INT 21H INT 21H RET RETDISP ENDPDISP ENDPCODE ENDSCODE ENDS END START END START 請大家注意:前面所介紹的三種參數(shù)的傳遞方法,并不是固定不變的,請大家注意:前面所介紹的三種參數(shù)的傳遞方法,并不是固定不變的,即它們是可以綜合使用的。依實(shí)現(xiàn)的需要和情況的不同,可以使用其即它們是可以綜合使用的。依實(shí)現(xiàn)的需要和情況的不同,可以使用其中一種方式,也可以同時使用幾種方式的混合。有的時候還可能并不中一種方式,也可以同時使用幾種方式的混合。有的時候還可能并不需要參數(shù)傳遞

38、。需要參數(shù)傳遞。 返回返回匯編語言匯編語言淮南師范學(xué)院重點(diǎn)課程淮南師范學(xué)院重點(diǎn)課程匯編語言程序設(shè)計第6章 6.3.5 6.3.5 子程序調(diào)用舉例子程序調(diào)用舉例【例6.6】將一個給定的二進(jìn)制數(shù)按位轉(zhuǎn)換成相應(yīng)的ASCII碼字符串,送到指定的存儲單元顯示。如二進(jìn)制數(shù)10010011轉(zhuǎn)換成字符串為10010011。要求將轉(zhuǎn)換過程寫成子程序,且子程序應(yīng)具有較好的通用性,而必須能實(shí)現(xiàn)對8位和16位二進(jìn)制數(shù)的轉(zhuǎn)換。入口參數(shù):DX存放待轉(zhuǎn)換的二進(jìn)制數(shù) CX存放待轉(zhuǎn)換數(shù)的位數(shù)(8位或16位) DX存放ASCII碼首址出口參數(shù):轉(zhuǎn)換后字符串放在以DI作指針的字節(jié)存儲區(qū)中。NAME EXAM6_6 DATA SEG

39、MENT NUM8 DB 93H NUM16 DW 0ABCDH ASCBUF DB 20 DUP(0) DATA ENDS STACK SEGMENT STACK DB 200 DUP(0) STACK ENDS CODE SEGMENT 匯編語言匯編語言淮南師范學(xué)院重點(diǎn)課程淮南師范學(xué)院重點(diǎn)課程匯編語言程序設(shè)計第6章 ASSUME DS:DATA, CS:CODE, SS:STACK ASSUME DS:DATA, CS:CODE, SS:STACK START: MOV AX,DATA START: MOV AX,DATA MOV DS,AX MOV DS,AX MOV DX,0 MOV

40、DX,0 MOV DL,NUM8 MOV DL,NUM8 ;轉(zhuǎn)換二進(jìn)制數(shù)送轉(zhuǎn)換二進(jìn)制數(shù)送DXDX MOV CX,8 MOV CX,8 LEA DI,ASCBUF LEA DI,ASCBUF ;字符串首址字符串首址DIDI CALL BTASC CALL BTASC ;調(diào)用子程序調(diào)用子程序BTASCBTASC MOV DI,BYTE PTR 0DH MOV DI,BYTE PTR 0DH MOV DI+1,BYTE PTR 0AH MOV DI+1,BYTE PTR 0AH MOV DI+2,BYTE PTR $ MOV DI+2,BYTE PTR $ LEA DX,ASCBUF LEA DX,

41、ASCBUF MOV AH,9 MOV AH,9 INT 21H INT 21H MOV DX,NUM16 MOV DX,NUM16 MOV CX,16 MOV CX,16 ;置位數(shù)置位數(shù)1616 LEA DI,ASCBUFLEA DI,ASCBUF CALL BTASC CALL BTASC匯編語言匯編語言淮南師范學(xué)院重點(diǎn)課程淮南師范學(xué)院重點(diǎn)課程匯編語言程序設(shè)計第6章 MOV DI,BYTE PTR 0DH MOV DI,BYTE PTR 0DH MOV DI+1,BYTE PTR 0AH MOV DI+1,BYTE PTR 0AH MOV DI+2,BYTE PTR $ MOV DI+2,

42、BYTE PTR $ ;顯示轉(zhuǎn)換后的字符串顯示轉(zhuǎn)換后的字符串 LEA DX,ASCBUFLEA DX,ASCBUF MOV AH,9 MOV AH,9 INT 21H INT 21H MOV AH,4CH MOV AH,4CH INT 21H INT 21H BTASC PROC BTASC PROC PUSH AX PUSH AX ;保存保存AXAX MOV AL,0 MOV AL,0 CMP CX,8 CMP CX,8 ;比較比較8 8位數(shù)位數(shù) JNE L1 JNE L1 ;直接轉(zhuǎn)換直接轉(zhuǎn)換1616位數(shù)位數(shù) MOV DH,DL MOV DH,DL ;8 8位數(shù)轉(zhuǎn)換送位數(shù)轉(zhuǎn)換送DHDH L1

43、: ROL DX,1 L1: ROL DX,1 ;DXDX最高位移入最高位移入CFCF MOV AL,0 MOV AL,0 RCL AL,1 RCL AL,1 ;CFCF移入移入ALAL最低位最低位匯編語言匯編語言淮南師范學(xué)院重點(diǎn)課程淮南師范學(xué)院重點(diǎn)課程匯編語言程序設(shè)計第6章 ADD AL,30HADD AL,30H MOV BYTE PTR DI,AL MOV BYTE PTR DI,AL INC DI INC DI LOOP L1 LOOP L1 POP AX POP AX RET RET BTASC ENDP BTASC ENDP CODE ENDS CODE ENDSEND START

44、END START【例例6.76.7】已知某班】已知某班N N個學(xué)生的成績,試編制一個子程序統(tǒng)計不及格,個學(xué)生的成績,試編制一個子程序統(tǒng)計不及格,60606969分,分,70707979分,分,80808989分,分,90909999分及分及100100分的人數(shù),分別存放到以分的人數(shù),分別存放到以S S為首址的單為首址的單元中。元中。入口參數(shù):以變量入口參數(shù):以變量SCORESCORE為首址的字存儲單元的值。為首址的字存儲單元的值。 CXCX存儲待處理的學(xué)生人。存儲待處理的學(xué)生人。出口參數(shù):以出口參數(shù):以S S為首址的字存儲區(qū)的值。為首址的字存儲區(qū)的值。匯編語言匯編語言淮南師范學(xué)院重點(diǎn)課程淮南

45、師范學(xué)院重點(diǎn)課程匯編語言程序設(shè)計第6章 NAME EXAM6_7NAME EXAM6_7STACK SEGMENT STACKSTACK SEGMENT STACK DB 200 DUP (0) DB 200 DUP (0)STACK ENDSSTACK ENDSDATA SEGMENTDATA SEGMENTSCORE DW 78,89,83,54,35,76,74,85,90,100,66,95SCORE DW 78,89,83,54,35,76,74,85,90,100,66,95N EQU ($-SCORE)/2N EQU ($-SCORE)/2S DW 6 DUP (0)S DW 6

46、 DUP (0)CODE SEGMENTCODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK ASSUME CS:CODE,DS:DATA,SS:STACKSTART: MOV AX,DATASTART: MOV AX,DATA MOV DS,AX MOV DS,AX MOV CX,N MOV CX,N CALL COUNT CALL COUNT MOV AH,4CH MOV AH,4CH INT 21H INT 21HCOUNT PROCCOUNT PROC MOV SI,0 MOV SI,0NEXT: MOV AX,SCORESINEXT: MOV AX

47、,SCORESI CMP AX,60 CMP AX,60 JB L1 JB L1 MOV BX,10 MOV BX,10 DIV BL DIV BL匯編語言匯編語言淮南師范學(xué)院重點(diǎn)課程淮南師范學(xué)院重點(diǎn)課程匯編語言程序設(shè)計第6章 CBW CBW MOV BX,AX MOV BX,AX SUB BX,5 SUB BX,5 SAL BX,1 SAL BX,1 INC WORD PTR SBX INC WORD PTR SBX JMP L2 JMP L2L1: MOV BX,0L1: MOV BX,0 SAL BX,1 SAL BX,1 INC WORD PTR SBX INC WORD PTR SB

48、XL2: ADD SI,2L2: ADD SI,2 LOOP NEXT LOOP NEXT RET RETCOUNT ENDPCOUNT ENDPCODE ENDSCODE ENDS END START END START【例例6.86.8】將】將AXAX中的十六位有符號二進(jìn)制數(shù)以十進(jìn)制形式顯示輸出子程序中的十六位有符號二進(jìn)制數(shù)以十進(jìn)制形式顯示輸出子程序F2T10F2T10。 該程序首先判斷該程序首先判斷AXAX中數(shù)的符號,若數(shù)為負(fù)數(shù),則將負(fù)號中數(shù)的符號,若數(shù)為負(fù)數(shù),則將負(fù)號“-”“-”送入輸出緩沖區(qū),并求送入輸出緩沖區(qū),并求(AXAX)的絕對值;若的絕對值;若AXAX中的數(shù)為正數(shù),則不做其他

49、處理,此時(中的數(shù)為正數(shù),則不做其他處理,此時(AXAX)即為無符號二即為無符號二進(jìn)制數(shù)。然后將無符號二進(jìn)制數(shù)轉(zhuǎn)換成十進(jìn)制數(shù),可采用將(進(jìn)制數(shù)。然后將無符號二進(jìn)制數(shù)轉(zhuǎn)換成十進(jìn)制數(shù),可采用將(AXAX)除以除以1010,得到第,得到第一個商和第一個余數(shù),第一個余數(shù)就是所求十進(jìn)制數(shù)的個數(shù);將第一個商除以一個商和第一個余數(shù),第一個余數(shù)就是所求十進(jìn)制數(shù)的個數(shù);將第一個商除以1010,得到第二個商和余數(shù),第二余數(shù)就是所求十進(jìn)制數(shù)的十位數(shù)得到第二個商和余數(shù),第二余數(shù)就是所求十進(jìn)制數(shù)的十位數(shù),這一過程一直循,這一過程一直循環(huán)到商數(shù)為環(huán)到商數(shù)為0 0時,時,匯編語言匯編語言淮南師范學(xué)院重點(diǎn)課程淮南師范學(xué)院重點(diǎn)

50、課程匯編語言程序設(shè)計第6章得到的余數(shù)就是所求十進(jìn)制數(shù)的最高位數(shù),為了得到轉(zhuǎn)換后的十進(jìn)制數(shù)得到的余數(shù)就是所求十進(jìn)制數(shù)的最高位數(shù),為了得到轉(zhuǎn)換后的十進(jìn)制數(shù)ASCIIASCII字字符串,可利用堆棧的先進(jìn)后出原則來實(shí)現(xiàn)。符串,可利用堆棧的先進(jìn)后出原則來實(shí)現(xiàn)。 NAME EXAM6_8NAME EXAM6_8DATA SEGMENTDATA SEGMENTBINARY DW 7FFFH,0,0FFFEH,50H,8000H,1000H,2000HBINARY DW 7FFFH,0,0FFFEH,50H,8000H,1000H,2000H N=($-BINARY)/2 N=($-BINARY)/2DATA

51、 ENDSDATA ENDSSTACK SEGMENT STACKSTACK SEGMENT STACK DB 200 DUP (0) DB 200 DUP (0)STACK ENDSSTACK ENDSCODE SEGMENTCODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK ASSUME CS:CODE,DS:DATA,SS:STACKSTART: MOV AX,DATASTART: MOV AX,DATA MOV DS,AX MOV DS,AXMOV CX,NMOV CX,N LEA DI,BINARY LEA DI,BINARYLOPA: MOV

52、AX,DILOPA: MOV AX,DI CALL F2T10 CALL F2T10 MOV DL, , MOV DL, , MOV AH,2 MOV AH,2匯編語言匯編語言淮南師范學(xué)院重點(diǎn)課程淮南師范學(xué)院重點(diǎn)課程匯編語言程序設(shè)計第6章 INT 21H INT 21H ADD DI,2 ADD DI,2 LOOP LOPA LOOP LOPA MOV AH,4CH MOV AH,4CH INT 21H INT 21HDATA SEGMENTDATA SEGMENTBUF DB 7 DUP (?)BUF DB 7 DUP (?)DATA ENDSDATA ENDSF2T10 PROCF2T10 PROC PUSH BX PUSH BX PUSH DX PUSH DX PUSH SI PUSH SI PUSH CX PUSH CX LEA SI,BUF LEA SI,BUF OR AX,AX JNS PLUS JNS PLUS NEG AX NEG AX MOV SI,BYTE PTR - MOV SI,BYTE PTR - INC SI INC SIPLUS: MOV BX,10PLUS: MOV BX,10 MOV CX,0

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論