java程序設(shè)計(jì)_第1頁
java程序設(shè)計(jì)_第2頁
java程序設(shè)計(jì)_第3頁
java程序設(shè)計(jì)_第4頁
java程序設(shè)計(jì)_第5頁
已閱讀5頁,還剩42頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、本教案內(nèi)容本教案內(nèi)容第第4 4章章 匯編語言程序設(shè)計(jì)匯編語言程序設(shè)計(jì)w匯編語言程序設(shè)計(jì)基礎(chǔ)匯編語言程序設(shè)計(jì)基礎(chǔ)n源程序的匯編、連接與調(diào)試源程序的匯編、連接與調(diào)試n分支程序設(shè)計(jì)技術(shù)分支程序設(shè)計(jì)技術(shù)n循環(huán)程序設(shè)計(jì)技術(shù)循環(huán)程序設(shè)計(jì)技術(shù)n子程序設(shè)計(jì)技術(shù)子程序設(shè)計(jì)技術(shù)1.綜合程序設(shè)計(jì)示例綜合程序設(shè)計(jì)示例4.5 子程序設(shè)計(jì)技術(shù)子程序設(shè)計(jì)技術(shù) 利用子程序可以大大地簡化匯編語言的程序設(shè)計(jì)。利用子程序可以大大地簡化匯編語言的程序設(shè)計(jì)。宏宏指令是以存儲空間作為代價(jià)提高執(zhí)行速度的,而子程序是以降低執(zhí)行指令是以存儲空間作為代價(jià)提高執(zhí)行速度的,而子程序是以降低執(zhí)行速度來節(jié)省存儲空間的。建議在多次調(diào)用較短的程序時(shí)使用宏指

2、令,速度來節(jié)省存儲空間的。建議在多次調(diào)用較短的程序時(shí)使用宏指令,在多次調(diào)用較長的程序時(shí)使用子程序。在多次調(diào)用較長的程序時(shí)使用子程序。在子程序設(shè)計(jì)過程中,有幾個(gè)問題需要特別注意:在子程序設(shè)計(jì)過程中,有幾個(gè)問題需要特別注意:一:主程序與子程序之間的參數(shù)傳遞 在設(shè)計(jì)子程序時(shí),需要從主程序獲取數(shù)據(jù),這種數(shù)在設(shè)計(jì)子程序時(shí),需要從主程序獲取數(shù)據(jù),這種數(shù)據(jù)稱為入口參數(shù),同時(shí)子程序執(zhí)行后可能有結(jié)果數(shù)據(jù)要送據(jù)稱為入口參數(shù),同時(shí)子程序執(zhí)行后可能有結(jié)果數(shù)據(jù)要送給主程序,這種數(shù)據(jù)稱為出口參數(shù)。主程序與子程序之間給主程序,這種數(shù)據(jù)稱為出口參數(shù)。主程序與子程序之間對入口參數(shù)和出口參數(shù)的傳遞有三種方式:對入口參數(shù)和出口參數(shù)

3、的傳遞有三種方式:(一)寄存器參數(shù)傳遞方式(一)寄存器參數(shù)傳遞方式(二)存儲單元參數(shù)傳遞方式(二)存儲單元參數(shù)傳遞方式(三)堆棧參數(shù)傳遞方式(三)堆棧參數(shù)傳遞方式例如:一個(gè)延時(shí)子程序,其過程可定義如下: SOFTDLY PROC PUSH BX PUSH CX MOV BL,10 DELAY:MOV CX,2801 WAIT: LOOP WAIT DEC BL JNZ DELAY POP CX POP BX RET SOFTDLY ENDP 例:設(shè)置系統(tǒng)日期的子程序SETTIME。 功能:將變量YEAR、MONTH、DAY的內(nèi)容作為時(shí)間設(shè)置系統(tǒng)日期。 SETTIME PROC NEAR MOV

4、 AH,2BH ;置功能號 MOV CX,YEAR ;置年參數(shù)(字) MOV DH,MONTH ;置月參數(shù)(字節(jié)) MOV DL,DAY ; 置日參數(shù)(字節(jié)) INT 21H ORAL,AL ;檢查狀態(tài) JNZ ERROR ;日期無效轉(zhuǎn) RET ERROR: RET YEAR DW 0 MONTH DB 0 DAY DBSETTIME ENDP 4.5 子程序設(shè)計(jì)技術(shù)子程序設(shè)計(jì)技術(shù) 二、子程序說明文件 子程序?yàn)楣δ塥?dú)立的程序段,而且會為主程序多次調(diào)用。子程序?yàn)楣δ塥?dú)立的程序段,而且會為主程序多次調(diào)用。因此為方便使用,在編寫并調(diào)試好子程序后,應(yīng)該及時(shí)給因此為方便使用,在編寫并調(diào)試好子程序后,應(yīng)該

5、及時(shí)給子程序編寫相應(yīng)的說明文件,其內(nèi)容應(yīng)該包含下列子程序編寫相應(yīng)的說明文件,其內(nèi)容應(yīng)該包含下列6 6個(gè)部分:個(gè)部分:1 1、子程序名、子程序名2 2、子程序所完成的功能、子程序所完成的功能3 3、入口參數(shù)及其傳遞方式、入口參數(shù)及其傳遞方式4 4、出口參數(shù)及其傳遞方式、出口參數(shù)及其傳遞方式5 5、子程序用到的寄存器、子程序用到的寄存器6 6、典型例子、典型例子4.5 子程序設(shè)計(jì)技術(shù)子程序設(shè)計(jì)技術(shù) 這里,子程序用到的寄存器是指執(zhí)行子程序后這里,子程序用到的寄存器是指執(zhí)行子程序后可能被改變的寄存器,子程序中應(yīng)該盡量少改變可能被改變的寄存器,子程序中應(yīng)該盡量少改變幾個(gè)寄存器的內(nèi)容,為此,需要在子程序的

6、入口幾個(gè)寄存器的內(nèi)容,為此,需要在子程序的入口處對某些寄存器進(jìn)行保護(hù),而在出口處再恢復(fù)其處對某些寄存器進(jìn)行保護(hù),而在出口處再恢復(fù)其內(nèi)容,這樣,雖然子程序中使用了這些寄存器,內(nèi)容,這樣,雖然子程序中使用了這些寄存器,但從入口到出口看,這些寄存器的內(nèi)容并沒有改但從入口到出口看,這些寄存器的內(nèi)容并沒有改變,它們就不屬于子程序用到的寄存器。在主程變,它們就不屬于子程序用到的寄存器。在主程序設(shè)計(jì)時(shí),就不必關(guān)心這些寄存器的內(nèi)容。序設(shè)計(jì)時(shí),就不必關(guān)心這些寄存器的內(nèi)容。 4.5 子程序設(shè)計(jì)技術(shù)子程序設(shè)計(jì)技術(shù) 三、子程序的嵌套三、子程序的嵌套 在子程序中還可以調(diào)用其他的子程序,這時(shí)就形成在子程序中還可以調(diào)用其他

7、的子程序,這時(shí)就形成的子程序的嵌套如圖的子程序的嵌套如圖4-5。采用嵌套子程序設(shè)計(jì),可以使。采用嵌套子程序設(shè)計(jì),可以使程序結(jié)構(gòu)模塊化,便于編程和應(yīng)用。但子程序的嵌套級數(shù)程序結(jié)構(gòu)模塊化,便于編程和應(yīng)用。但子程序的嵌套級數(shù)不是越多越好,而是應(yīng)該適可而止,嵌套級數(shù)越多,出錯(cuò)不是越多越好,而是應(yīng)該適可而止,嵌套級數(shù)越多,出錯(cuò)的可能性就越多,這樣不利于程序設(shè)計(jì)。的可能性就越多,這樣不利于程序設(shè)計(jì)。 在設(shè)計(jì)嵌套子程序時(shí),編程時(shí)可以從上到下設(shè)計(jì),在設(shè)計(jì)嵌套子程序時(shí),編程時(shí)可以從上到下設(shè)計(jì),調(diào)試時(shí)應(yīng)該由下至上進(jìn)行,因?yàn)橹挥刑幱谙聦拥淖映绦蛘{(diào)試時(shí)應(yīng)該由下至上進(jìn)行,因?yàn)橹挥刑幱谙聦拥淖映绦蛘_后,才能對上層的子

8、程序進(jìn)行調(diào)試。確后,才能對上層的子程序進(jìn)行調(diào)試。圖4-5 多層子程序嵌套示意圖 4.5 子程序設(shè)計(jì)技術(shù)子程序設(shè)計(jì)技術(shù) 四、遞歸子程序四、遞歸子程序 在嵌套調(diào)用中,被調(diào)用的子程序?yàn)槠渌映绦?。?dāng)被調(diào)在嵌套調(diào)用中,被調(diào)用的子程序?yàn)槠渌映绦?。?dāng)被調(diào)用的子程序是其自身時(shí),就形成了遞歸調(diào)用,這種子程序稱用的子程序是其自身時(shí),就形成了遞歸調(diào)用,這種子程序稱為遞歸子程序。不是所有的子程序都可以遞歸調(diào)用的,設(shè)計(jì)為遞歸子程序。不是所有的子程序都可以遞歸調(diào)用的,設(shè)計(jì)遞歸子程序是一個(gè)較為復(fù)雜的過程,遞歸子程序必須具備遞歸子程序是一個(gè)較為復(fù)雜的過程,遞歸子程序必須具備兩兩個(gè)基本條件個(gè)基本條件:(1 1)采用堆棧參數(shù)

9、傳遞方式采用堆棧參數(shù)傳遞方式,這樣才能保證本次調(diào)用與下,這樣才能保證本次調(diào)用與下次調(diào)用采用不同的參數(shù),即每次調(diào)用給入口和出口參數(shù)都分次調(diào)用采用不同的參數(shù),即每次調(diào)用給入口和出口參數(shù)都分配不同的存儲區(qū)域。配不同的存儲區(qū)域。(2 2)必須設(shè)定遞歸結(jié)束條件必須設(shè)定遞歸結(jié)束條件。 設(shè)計(jì)遞歸子程序還應(yīng)該有清晰的編程思路和明確的程序設(shè)計(jì)遞歸子程序還應(yīng)該有清晰的編程思路和明確的程序結(jié)構(gòu)。設(shè)計(jì)遞歸子程序可以降低程序?qū)Υ鎯θ萘啃枨?,但現(xiàn)結(jié)構(gòu)。設(shè)計(jì)遞歸子程序可以降低程序?qū)Υ鎯θ萘啃枨螅F(xiàn)在計(jì)算機(jī)的存儲容量已經(jīng)不是問題了,因此,用戶應(yīng)該盡量在計(jì)算機(jī)的存儲容量已經(jīng)不是問題了,因此,用戶應(yīng)該盡量避免采用遞歸子程序。避

10、免采用遞歸子程序。4.5 子程序設(shè)計(jì)技術(shù)子程序設(shè)計(jì)技術(shù) 子程序第一次調(diào)用X X發(fā)生中斷123第二次調(diào)用圖4.4 可再入性子程序執(zhí)行流程 五、可再入性子程序五、可再入性子程序 在執(zhí)行子程序期間,在執(zhí)行子程序期間,CPUCPU可能可能會因?yàn)橛兄袛嗾埱蠖D(zhuǎn)向中斷會因?yàn)橛兄袛嗾埱蠖D(zhuǎn)向中斷服務(wù)子程序,如果在中斷服務(wù)服務(wù)子程序,如果在中斷服務(wù)程序中又調(diào)用了該子程序,這程序中又調(diào)用了該子程序,這樣就形成了如圖樣就形成了如圖4.6 4.6 所示的情所示的情況(況(為執(zhí)行流程),子為執(zhí)行流程),子程序的一次調(diào)用還沒有執(zhí)行完程序的一次調(diào)用還沒有執(zhí)行完成,又調(diào)用了該子程序,如果成,又調(diào)用了該子程序,如果這兩次調(diào)用

11、都能夠得到正確的這兩次調(diào)用都能夠得到正確的結(jié)果,則該子程序稱為可再入結(jié)果,則該子程序稱為可再入性子程序。性子程序。子程序第一次調(diào)用X發(fā)生中斷123第二次調(diào)用圖4.4 可再入性子程序執(zhí)行流程4.5 子程序設(shè)計(jì)技術(shù)子程序設(shè)計(jì)技術(shù) 可再入性子程序也需要采用堆棧參數(shù)傳遞方式,而且設(shè)可再入性子程序也需要采用堆棧參數(shù)傳遞方式,而且設(shè)計(jì)過程較為復(fù)雜,因此建議用戶盡量避免設(shè)計(jì)可再入性子計(jì)過程較為復(fù)雜,因此建議用戶盡量避免設(shè)計(jì)可再入性子程序。這里給出一種回避的較好方式,即將原本要求為可程序。這里給出一種回避的較好方式,即將原本要求為可再入性的子程序再入性的子程序復(fù)制復(fù)制出一份,專門供中斷服務(wù)子程序調(diào)用,出一份,

12、專門供中斷服務(wù)子程序調(diào)用,這樣可以巧妙地回避可再入性子程序的設(shè)計(jì)。這樣可以巧妙地回避可再入性子程序的設(shè)計(jì)。 例例4.9 4.9 編寫子程序?qū)崿F(xiàn)給緩沖區(qū)編寫子程序?qū)崿F(xiàn)給緩沖區(qū)BUFBUF中的一組字符的中的一組字符的ASCIIASCII碼加上偶校驗(yàn)位。碼加上偶校驗(yàn)位。解:解:每個(gè)字符的每個(gè)字符的ASCIIASCII碼只占用碼只占用7 7位二進(jìn)制數(shù),其最高位為位二進(jìn)制數(shù),其最高位為0 0。我們可以根據(jù)這。我們可以根據(jù)這7 7位二進(jìn)制數(shù)中位二進(jìn)制數(shù)中“1”1”的個(gè)數(shù),給最高位的個(gè)數(shù),給最高位加上加上“0”0”或或“1”1”,使得一個(gè)字節(jié)內(nèi)容的,使得一個(gè)字節(jié)內(nèi)容的“1”1”個(gè)數(shù)為偶數(shù),個(gè)數(shù)為偶數(shù),這稱為

13、偶檢驗(yàn)。這稱為偶檢驗(yàn)。4.5 子程序設(shè)計(jì)技術(shù)子程序設(shè)計(jì)技術(shù) 設(shè)計(jì)的子程序(設(shè)計(jì)的子程序(SETEVENSETEVEN)用于對)用于對BUFFERBUFFER中的字符中的字符ASCIIASCII碼加上偶檢驗(yàn)位,其入口參數(shù)為:碼加上偶檢驗(yàn)位,其入口參數(shù)為:DIDI(緩沖區(qū)首地址,默(緩沖區(qū)首地址,默認(rèn)為認(rèn)為DSDS段),(段),(CXCX)緩沖區(qū)長度;出口參數(shù):無(實(shí)際上)緩沖區(qū)長度;出口參數(shù):無(實(shí)際上是緩沖區(qū)的內(nèi)容);用到的寄存器:無。是緩沖區(qū)的內(nèi)容);用到的寄存器:無。匯編語言程序如下:匯編語言程序如下:STACK SEGMENT STACK STACKSTACK SEGMENT STACK

14、 STACK DW 100H DUP(?) DW 100H DUP(?)TOP LABEL WORDTOP LABEL WORDSTACK ENDSSTACK ENDS N=22 N=22DATA SEGMENTDATA SEGMENTBUFFER DB xidian university 2006BUFFER DB xidian university 2006DATA ENDSDATA ENDSCODE SEGMENTCODE SEGMENT4.5 子程序設(shè)計(jì)技術(shù)子程序設(shè)計(jì)技術(shù) ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACKASSUME CS:CODE,DS:

15、DATA,ES:DATA,SS:STACKSTART:START: MOV AX,DATA 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 LEA SP,TOP LEA SP,TOP MOV CX,N MOV CX,N LEA DI,BUFFER LEA DI,BUFFER CALL SETEVEN CALL SETEVEN MOV AH,4CH ; MOV AH,4CH ;返回返回DOSDOS MOV AL,0 MOV AL,0 INT 21H

16、INT 21H4.5 子程序設(shè)計(jì)技術(shù)子程序設(shè)計(jì)技術(shù) SETEVEN PROC NEARSETEVEN PROC NEAR;加上偶校驗(yàn)子程序;加上偶校驗(yàn)子程序 PUSH AXPUSH AX PUSH BX PUSH BX PUSH CX PUSH CX PUSH DI PUSH DISETEVEN1:SETEVEN1: MOV AL,DI MOV AL,DI CALL COUNTBYTE CALL COUNTBYTE AND BL,01H AND BL,01H;測試;測試“1”1”的個(gè)數(shù)是否為偶數(shù)的個(gè)數(shù)是否為偶數(shù) JZ SETEVEN2JZ SETEVEN2 OR AL,80H OR AL,80

17、H;最高位置入;最高位置入“1”1” MOV DI,AL MOV DI,AL4.5 子程序設(shè)計(jì)技術(shù)子程序設(shè)計(jì)技術(shù) SETEVEN2:SETEVEN2:INC DIINC DILOOP SETEVEN1LOOP SETEVEN1POP DIPOP DIPOP CXPOP CXPOP BXPOP BXPOP AXPOP AXRETRETSETEVENSETEVENENDPENDPCOUNTBYTE PROC NEARCOUNTBYTE PROC NEAR;子程序:統(tǒng)計(jì)一個(gè)字;子程序:統(tǒng)計(jì)一個(gè)字 節(jié)內(nèi)容中節(jié)內(nèi)容中“1”1”的個(gè)數(shù)的個(gè)數(shù) PUSH AXPUSH AXPUSH CXPUSH CXMOV

18、CX,8MOV CX,8XOR BL,BLXOR BL,BL4.5 子程序設(shè)計(jì)技術(shù)子程序設(shè)計(jì)技術(shù) COU1:COU1: SHR AL,1 SHR AL,1 ADC BL,0 ADC BL,0 LOOP COU1 LOOP COU1 POP CX POP CX POP AX POP AX RET RETCOUNTBYTE ENDPCOUNTBYTE ENDPCODE CODE ENDS ENDS END START END START 這里調(diào)用了統(tǒng)計(jì)一個(gè)字節(jié)內(nèi)容中這里調(diào)用了統(tǒng)計(jì)一個(gè)字節(jié)內(nèi)容中“1”1”的個(gè)數(shù)的子程序的個(gè)數(shù)的子程序COUNTBYTECOUNTBYTE,其入口參數(shù)為,其入口參數(shù)為AL

19、AL,出口參數(shù)為,出口參數(shù)為BLBL,子程序用到,子程序用到的寄存器為的寄存器為BLBL。 4.5 子程序設(shè)計(jì)技術(shù)子程序設(shè)計(jì)技術(shù) 例例4.10 4.10 編寫子程序編寫子程序TRANS16TO10TRANS16TO10,將,將1616位二進(jìn)制數(shù)位二進(jìn)制數(shù)(AX)(AX)轉(zhuǎn)轉(zhuǎn)換成十進(jìn)制數(shù),并保存在指定的緩沖區(qū)中。換成十進(jìn)制數(shù),并保存在指定的緩沖區(qū)中。解:解:1616位二進(jìn)制數(shù)位二進(jìn)制數(shù)x x至多可以用至多可以用5 5位十進(jìn)制數(shù)進(jìn)行表示,其轉(zhuǎn)位十進(jìn)制數(shù)進(jìn)行表示,其轉(zhuǎn)換算法和步驟為:換算法和步驟為:將將x x除以除以1010得到商得到商x1x1和余數(shù)和余數(shù)y1y1,其中,其中y1y1就是轉(zhuǎn)換結(jié)果的最

20、就是轉(zhuǎn)換結(jié)果的最 低位(個(gè)位);低位(個(gè)位);將將x1x1再除以再除以1010得到商得到商x2x2和余數(shù)和余數(shù)y2y2,其中,其中y2y2就是轉(zhuǎn)換結(jié)果的就是轉(zhuǎn)換結(jié)果的十位;十位;依次類推,得到依次類推,得到y(tǒng)3y3、 y4y4和和y5y5,分別為轉(zhuǎn)換結(jié)果第三五,分別為轉(zhuǎn)換結(jié)果第三五位。位。可以肯定可以肯定,x5=0 x5=0,y5y5位為轉(zhuǎn)換結(jié)果的最高位。設(shè)計(jì)的子程序位為轉(zhuǎn)換結(jié)果的最高位。設(shè)計(jì)的子程序TRANS16TO10,TRANS16TO10,其入口參數(shù):其入口參數(shù):AXAX(待轉(zhuǎn)換的數(shù)據(jù)),(待轉(zhuǎn)換的數(shù)據(jù)),DIDI(轉(zhuǎn)換(轉(zhuǎn)換結(jié)果存儲區(qū)域首地址),出口參數(shù):存儲區(qū)域的內(nèi)容。結(jié)果存儲區(qū)域

21、首地址),出口參數(shù):存儲區(qū)域的內(nèi)容。 4.5 子程序設(shè)計(jì)技術(shù)子程序設(shè)計(jì)技術(shù) 匯編語言子程序如下:匯編語言子程序如下:TRANS16TO10TRANS16TO10 PROC NEAR PROC NEAR PUSH AX PUSH AX PUSH BX PUSH BX PUSH CX PUSH CX PUSH DX PUSH DX PUSH DI PUSH DI MOV BX,10 MOV BX,10 MOV CX,5 MOV CX,5TRANS1:TRANS1: XOR DX,DX XOR DX,DX DIV BX DIV BX MOV DI,DLMOV DI,DL INC DI INC DI

22、LOOP TRANS1 LOOP TRANS14.5 子程序設(shè)計(jì)技術(shù)子程序設(shè)計(jì)技術(shù) POP DIPOP DIPOP DXPOP DXPOP CXPOP CXPOP BXPOP BXPOP AXPOP AXRETRETTRANS16TO10TRANS16TO10 ENDP ENDP例例4.11 4.11 編寫子程序編寫子程序DISPAXDDISPAXD,將,將1616位二進(jìn)制數(shù)位二進(jìn)制數(shù)(AX)(AX)轉(zhuǎn)換轉(zhuǎn)換成十進(jìn)制數(shù),并在顯示在屏幕上。成十進(jìn)制數(shù),并在顯示在屏幕上。解解:利用上例將:利用上例將AXAX轉(zhuǎn)換成轉(zhuǎn)換成5 5個(gè)十進(jìn)制數(shù)位,然后利用個(gè)十進(jìn)制數(shù)位,然后利用INT INT 21H21H的

23、的0202號功能進(jìn)行顯示,這時(shí)需要將十進(jìn)制的數(shù)位變換成號功能進(jìn)行顯示,這時(shí)需要將十進(jìn)制的數(shù)位變換成相應(yīng)的相應(yīng)的ASCIIASCII碼。設(shè)計(jì)出的子程序碼。設(shè)計(jì)出的子程序DISPAXDDISPAXD,其入口參數(shù):,其入口參數(shù):AXAX,出口參數(shù):屏幕顯示,這里要用到一個(gè)出口參數(shù):屏幕顯示,這里要用到一個(gè)5 5字節(jié)的臨時(shí)存儲單字節(jié)的臨時(shí)存儲單元,用于存放十進(jìn)制的數(shù)位。元,用于存放十進(jìn)制的數(shù)位。4.5 子程序設(shè)計(jì)技術(shù)子程序設(shè)計(jì)技術(shù) 匯編語言程序如下:匯編語言程序如下:STACK SEGMENT STACK STACKSTACK SEGMENT STACK STACKDW 100H DUP(?)DW 1

24、00H DUP(?)TOP LABEL WORDTOP LABEL WORDSTACK ENDSSTACK ENDSDATA SEGMENTDATA SEGMENTDECIMAL DB 5 DUP(?)DECIMAL DB 5 DUP(?)DATA ENDSDATA ENDSCODE SEGMENTCODE SEGMENTASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACKASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACKSTART:START:MOV AX,DATAMOV AX,DATAMOV DS,AXMOV DS,AXMOV ES,A

25、XMOV ES,AX4.5 子程序設(shè)計(jì)技術(shù)子程序設(shè)計(jì)技術(shù) MOV AX,STACK MOV AX,STACK MOV SS,AX MOV SS,AX LEA SP,TOP LEA SP,TOP MOV AX,23456 MOV AX,23456 CALL DISPAXD CALL DISPAXD MOV AH,4CH ; MOV AH,4CH ;返回返回DOSDOS操作系統(tǒng)操作系統(tǒng) MOV AL,0MOV AL,0 INT 21H INT 21HDISPAXDDISPAXDPROC NEARPROC NEAR PUSH AX PUSH AX PUSH BX PUSH BX PUSH CX PU

26、SH CX PUSH DX PUSH DX PUSH DI PUSH DI4.5 子程序設(shè)計(jì)技術(shù)子程序設(shè)計(jì)技術(shù) LEA DI,DECIMAL LEA DI,DECIMAL CALL TRANS16TO10CALL TRANS16TO10 MOV CX,5 MOV CX,5 LEA DI,DECIMAL+4 LEA DI,DECIMAL+4 MOV AH,2 MOV AH,2DISPAXD2:DISPAXD2: MOV DL,DI MOV DL,DI ADD DL,30H ADD DL,30H DEC DI DEC DI INT 21H INT 21H LOOP DISPAXD2 LOOP DI

27、SPAXD2 POP DI POP DI POP DX POP DX POP CX POP CX4.5 子程序設(shè)計(jì)技術(shù)子程序設(shè)計(jì)技術(shù) POP BX POP BX POP AX POP AX RET RETDISPAXD ENDPDISPAXD ENDPTRANS16TO10 PROC NEAR ;TRANS16TO10 PROC NEAR ;內(nèi)容參見例內(nèi)容參見例4.104.10TRANS16TO10 ENDP TRANS16TO10 ENDP CODE ENDSCODE ENDSEND STARTEND START例例4.12 4.12 編寫子程序?qū)崿F(xiàn):將輸入緩沖區(qū)中以編寫子程序?qū)崿F(xiàn):將輸入緩

28、沖區(qū)中以ASCIIASCII碼表示的碼表示的十進(jìn)制數(shù)轉(zhuǎn)換成十進(jìn)制數(shù)轉(zhuǎn)換成1616位二進(jìn)制數(shù)。緩沖區(qū)的第一個(gè)字節(jié)表示位數(shù),位二進(jìn)制數(shù)。緩沖區(qū)的第一個(gè)字節(jié)表示位數(shù),后續(xù)單元存儲十進(jìn)制數(shù),高位在前,低位在后。如果轉(zhuǎn)換結(jié)果后續(xù)單元存儲十進(jìn)制數(shù),高位在前,低位在后。如果轉(zhuǎn)換結(jié)果超出一個(gè)字的范圍,則在超出一個(gè)字的范圍,則在BXBX中置出錯(cuò)標(biāo)志(中置出錯(cuò)標(biāo)志(FFFFHFFFFH)。)。 4.5 子程序設(shè)計(jì)技術(shù)子程序設(shè)計(jì)技術(shù) 解解:這種存放格式與通過鍵盤輸入十進(jìn)制數(shù)的格式一致。:這種存放格式與通過鍵盤輸入十進(jìn)制數(shù)的格式一致。變換算法與例變換算法與例4.94.9相反,設(shè)十進(jìn)制數(shù)字符變換成數(shù)值后為相反,設(shè)十進(jìn)制

29、數(shù)字符變換成數(shù)值后為x1x1x5x5,x1x1為最低位,則變換結(jié)果為最低位,則變換結(jié)果y y為:為:y=10y=10* *(10(10* *(10(10* *(10(10* *x5+x4)+x3)+x2)+x1x5+x4)+x3)+x2)+x1據(jù)此可以編寫出子程序據(jù)此可以編寫出子程序TRANS10TO16TRANS10TO16,入口參數(shù):,入口參數(shù):SISI(緩(緩沖區(qū)首地址);出口參數(shù):沖區(qū)首地址);出口參數(shù):AXAX(變換結(jié)果)和(變換結(jié)果)和BXBX(變換結(jié)(變換結(jié)果是否出錯(cuò)標(biāo)志);用到的寄存器:果是否出錯(cuò)標(biāo)志);用到的寄存器:AXAX和和BXBX。子程序如下:。子程序如下:TRANS1

30、0TO16TRANS10TO16 PROC NEAR PROC NEAR PUSH CX PUSH CX PUSH DX PUSH DX PUSH SI PUSH SI XOR AX,AX XOR AX,AX4.5 子程序設(shè)計(jì)技術(shù)子程序設(shè)計(jì)技術(shù) XOR CX,CXXOR CX,CXMOV CL,SIMOV CL,SIINC SIINC SIMOV AL,SIMOV AL,SIINC SIINC SISUB AL,30HSUB AL,30HDEC CXDEC CXJCXZ TRANSF2JCXZ TRANSF2MOV BX,10MOV BX,10TRANSF1:TRANSF1:MUL BXMUL

31、 BXJC TRANSF_ERRJC TRANSF_ERRMOV DL,SIMOV DL,SIINC SIINC SI SUB DL,30H SUB DL,30H4.5 子程序設(shè)計(jì)技術(shù)子程序設(shè)計(jì)技術(shù) ADD AL,DLADD AL,DLADC AH,0ADC AH,0JC TRANSF_ERRJC TRANSF_ERRLOOP TRANSF1LOOP TRANSF1MOV BX,0MOV BX,0TRANSF2:TRANSF2:JMP TRANSF_OKJMP TRANSF_OKTRANSF_ERR:TRANSF_ERR:MOV BX,-1MOV BX,-1TRANSF_OK:TRANSF_O

32、K:POP SIPOP SIPOP DXPOP DXPOP CXPOP CXRETRETTRANS10TO16TRANS10TO16 ENDPENDP4.5 子程序設(shè)計(jì)技術(shù)子程序設(shè)計(jì)技術(shù) 例例4.13 4.13 利用鍵盤輸入十進(jìn)制的無符號數(shù),編寫程序完成利用鍵盤輸入十進(jìn)制的無符號數(shù),編寫程序完成轉(zhuǎn)換成相應(yīng)的轉(zhuǎn)換成相應(yīng)的1616位二進(jìn)制數(shù)。位二進(jìn)制數(shù)。解解:可以直接利用例:可以直接利用例4.114.11編寫的子程序完成轉(zhuǎn)換操作。通編寫的子程序完成轉(zhuǎn)換操作。通過鍵盤輸入數(shù)據(jù)時(shí),需要定義鍵盤緩沖區(qū),并調(diào)用過鍵盤輸入數(shù)據(jù)時(shí),需要定義鍵盤緩沖區(qū),并調(diào)用INT 21HINT 21H的的0AH0AH號功能。

33、匯編語言程序如下:號功能。匯編語言程序如下:STACK SEGMENT STACK STACKSTACK SEGMENT STACK STACK DW 100H DUP(?) DW 100H DUP(?)TOP LABEL WORDTOP LABEL WORDSTACK ENDSSTACK ENDSDATA SEGMENTDATA SEGMENTKEYBUFFER KEYBUFFER DB 100DB 100;鍵盤緩沖區(qū);鍵盤緩沖區(qū) DB ?DB ? DB 100 DUP(?) DB 100 DUP(?)STRING1 STRING1 DB Please input decimal data

34、: ,$DB Please input decimal data : ,$;輸入提示字符串;輸入提示字符串4.5 子程序設(shè)計(jì)技術(shù)子程序設(shè)計(jì)技術(shù) DATA ENDSDATA ENDSCODE SEGMENTCODE SEGMENT ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACKSTART:START: MOV AX,DATA MOV AX,DATA MOV DS,AX MOV DS,AX MOV ES,AX MOV ES,AX MOV AX,STACK MOV AX,STACK MOV

35、 SS,AX MOV SS,AX LEA SP,TOP LEA SP,TOP LEA DX,STRING1 LEA DX,STRING1 ;顯示出;顯示出“輸入提示字符串輸入提示字符串” MOV AH,09HMOV AH,09H INT 21H INT 21H MOV AH,0AH MOV AH,0AH;輸入十進(jìn)制數(shù)據(jù);輸入十進(jìn)制數(shù)據(jù) LEA DX,KEYBUFFERLEA DX,KEYBUFFER4.5 子程序設(shè)計(jì)技術(shù)子程序設(shè)計(jì)技術(shù) INT 21H INT 21HLEA SI,KEYBUFFER+1LEA SI,KEYBUFFER+1;變換;變換CALL TRANS10TO16CALL TR

36、ANS10TO16CALL DISPCRCALL DISPCR;屏幕光標(biāo)回車換行;屏幕光標(biāo)回車換行CALL DISPAXCALL DISPAX;顯示變換結(jié)果;顯示變換結(jié)果CALL DISPCRCALL DISPCRMOV AX,BXMOV AX,BX CALL DISPAX CALL DISPAX;顯示變換結(jié)果是否正確的標(biāo)志;顯示變換結(jié)果是否正確的標(biāo)志 (BXBX)的內(nèi)容)的內(nèi)容 MOV AH,4CH ;MOV AH,4CH ;返回返回DOSDOS MOV AL,0 MOV AL,0 INT 21H INT 21H DISPAX PROC NEAR DISPAX PROC NEAR;顯示寄存器

37、;顯示寄存器AXAX的內(nèi)容子程的內(nèi)容子程 序,詳見例序,詳見例3.343.34 DISPAX ENDP DISPAX ENDP4.5 子程序設(shè)計(jì)技術(shù)子程序設(shè)計(jì)技術(shù) DISPCR PROC NEARDISPCR PROC NEAR ;屏幕光標(biāo)回車換行子程序;屏幕光標(biāo)回車換行子程序 PUSH AXPUSH AX PUSH DX PUSH DX MOV AH,2 MOV AH,2 MOV DL,0AH MOV DL,0AH INT 21H INT 21H MOV AH,2 MOV AH,2 MOV DL,0DH MOV DL,0DH INT 21H INT 21H POP DX POP DX POP

38、 AX POP AX RET RETDISPCR ENDPDISPCR ENDP4.5 子程序設(shè)計(jì)技術(shù)子程序設(shè)計(jì)技術(shù) TRANS10TO16TRANS10TO16 PROC NEAR PROC NEAR;詳見例;詳見例4.124.12TRANS10TO16TRANS10TO16 ENDP ENDPCODE CODE ENDS ENDS END START END START 這里,為了方便,設(shè)計(jì)了顯示這里,為了方便,設(shè)計(jì)了顯示AXAX寄存器內(nèi)容的子程序寄存器內(nèi)容的子程序DISPAXDISPAX,它又調(diào)用了顯示,它又調(diào)用了顯示ALAL寄存器內(nèi)容的子程序。另外寄存器內(nèi)容的子程序。另外給出了使屏幕上

39、光標(biāo)回車換行的子程序給出了使屏幕上光標(biāo)回車換行的子程序DISPCRDISPCR。 這樣,執(zhí)行程序的結(jié)果可以直接顯示在屏幕上,圖這樣,執(zhí)行程序的結(jié)果可以直接顯示在屏幕上,圖4.54.5給出了三次執(zhí)行的結(jié)果,這說明前兩次程序執(zhí)行的結(jié)給出了三次執(zhí)行的結(jié)果,這說明前兩次程序執(zhí)行的結(jié)果正確,而第三次程序執(zhí)行的結(jié)果出錯(cuò)。果正確,而第三次程序執(zhí)行的結(jié)果出錯(cuò)。4.5 子程序設(shè)計(jì)技術(shù)子程序設(shè)計(jì)技術(shù) 圖圖4.5 4.5 程序執(zhí)行過程及其結(jié)果程序執(zhí)行過程及其結(jié)果4.5 子程序設(shè)計(jì)技術(shù)子程序設(shè)計(jì)技術(shù) 例例4.14 4.14 設(shè)一組設(shè)一組1616位有符號數(shù)存放在緩沖區(qū)位有符號數(shù)存放在緩沖區(qū)BUFFERBUFFER中,中

40、,前兩個(gè)字節(jié)用于存放數(shù)據(jù)個(gè)數(shù),編寫子程序前兩個(gè)字節(jié)用于存放數(shù)據(jù)個(gè)數(shù),編寫子程序COMPUTMEANCOMPUTMEAN計(jì)計(jì)算這組數(shù)據(jù)平均值。算這組數(shù)據(jù)平均值。解解:計(jì)算數(shù)據(jù)平均值的子程序:計(jì)算數(shù)據(jù)平均值的子程序COMPUTMEANCOMPUTMEAN,采用堆棧參,采用堆棧參數(shù)傳遞方式,人口參數(shù):緩沖區(qū)首地址壓入堆棧;出口參數(shù)傳遞方式,人口參數(shù):緩沖區(qū)首地址壓入堆棧;出口參數(shù):計(jì)算出的平均值存入堆棧,采用與保存緩沖區(qū)首地址數(shù):計(jì)算出的平均值存入堆棧,采用與保存緩沖區(qū)首地址相同的堆棧單元。匯編語言程序如下:相同的堆棧單元。匯編語言程序如下:STACK SEGMENT STACK STACKSTAC

41、K SEGMENT STACK STACK DW 100H DUP(?) DW 100H DUP(?)TOP LABEL WORDTOP LABEL WORDSTACK ENDSSTACK ENDS4.5 子程序設(shè)計(jì)技術(shù)子程序設(shè)計(jì)技術(shù) DATA SEGMENTDATA SEGMENTBUFFER DW 10BUFFER DW 10;假設(shè)有;假設(shè)有1010個(gè)數(shù)據(jù)個(gè)數(shù)據(jù)DW 521,112,3654,-564,45, -166,771,1288,32709,-32014DW 521,112,3654,-564,45, -166,771,1288,32709,-32014DATA ENDSDATA

42、ENDSCODE SEGMENTCODE SEGMENT ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACKSTART:START: MOV AX,DATA 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 LEA SP,TOP LEA SP,TOP MOV AX, OFFSET BUFFER MOV AX, OFFSET BUFFER4.5

43、子程序設(shè)計(jì)技術(shù)子程序設(shè)計(jì)技術(shù) PUSH AX PUSH AX;入口參數(shù)壓入堆棧進(jìn)行傳遞;入口參數(shù)壓入堆棧進(jìn)行傳遞CALL COMPUTMEANCALL COMPUTMEANPOP AXPOP AX;出口參數(shù)也通過堆棧得到;出口參數(shù)也通過堆棧得到CALL DISPAXCALL DISPAX;調(diào)用子程序;調(diào)用子程序DISPAXDISPAX顯示顯示AXAX的內(nèi)的內(nèi)容,即數(shù)據(jù)的平均值容,即數(shù)據(jù)的平均值 MOV AH,4CH MOV AH,4CH ;返回;返回DOSDOS系統(tǒng)系統(tǒng) INT 21HINT 21HCOMPUTMEAN PROC NEARCOMPUTMEAN PROC NEAR;計(jì)算平均值子程

44、序;計(jì)算平均值子程序PUSH BPPUSH BPMOV BP,SPMOV BP,SP ;利用指針;利用指針BPBP指向堆棧中的固定位置指向堆棧中的固定位置PUSH SIPUSH SIPUSH DIPUSH DIPUSH AXPUSH AXPUSH BXPUSH BX4.5 子程序設(shè)計(jì)技術(shù)子程序設(shè)計(jì)技術(shù) PUSH CX PUSH CXPUSH DXPUSH DXMOV SI,BP+4MOV SI,BP+4;從堆棧中取出入口參數(shù),即數(shù);從堆棧中取出入口參數(shù),即數(shù)據(jù)區(qū)的首地址據(jù)區(qū)的首地址XOR DX,DXXOR DX,DXXOR BX,BXXOR BX,BXXOR DI,DIXOR DI,DIMOV

45、 CX,SIMOV CX,SI;取數(shù)據(jù)區(qū)長度;取數(shù)據(jù)區(qū)長度PUSH CXPUSH CX;暫存數(shù)據(jù)個(gè)數(shù);暫存數(shù)據(jù)個(gè)數(shù)ADD SI,2ADD SI,2CPTM1:CPTM1:MOV AX,SIMOV AX,SIADD SI,2ADD SI,2CWDCWDADD BX,AXADD BX,AX4.5 子程序設(shè)計(jì)技術(shù)子程序設(shè)計(jì)技術(shù) ADC DI,DX ADC DI,DXLOOP CPTM1LOOP CPTM1MOV DX,DIMOV DX,DIMOV AX,BXMOV AX,BXPOP BXPOP BX;取出數(shù)據(jù)個(gè)數(shù);取出數(shù)據(jù)個(gè)數(shù)IDIV BXIDIV BX;求數(shù)據(jù)的平均值;求數(shù)據(jù)的平均值CPTM2:C

46、PTM2:MOV BP+4,AXMOV BP+4,AX;在堆棧中保存數(shù)據(jù)的平均值;在堆棧中保存數(shù)據(jù)的平均值 POP DXPOP DXPOP CXPOP CXPOP BXPOP BXPOP AXPOP AXPOP DIPOP DIPOP SIPOP SIPOP BPPOP BP4.5 子程序設(shè)計(jì)技術(shù)子程序設(shè)計(jì)技術(shù) RET RETCOMPUTMEAN ENDPCOMPUTMEAN ENDPCODE ENDSCODE ENDS END START END START 利用堆棧參數(shù)傳遞方式時(shí),一定利用堆棧參數(shù)傳遞方式時(shí),一定要搞清楚堆棧的結(jié)構(gòu)和指針的位置,要搞清楚堆棧的結(jié)構(gòu)和指針的位置,在進(jìn)入子程序后

47、,其堆棧結(jié)構(gòu)與指在進(jìn)入子程序后,其堆棧結(jié)構(gòu)與指針如圖針如圖4.64.6所示,隨著子程序中所示,隨著子程序中PUSHPUSH和和POPPOP指令的操作,堆棧指針指令的操作,堆棧指針SPSP在移在移動,但動,但BPBP指針的位置固定不變,因此指針的位置固定不變,因此,可以利用,可以利用BPBP指針取出入口參數(shù),同指針取出入口參數(shù),同時(shí)將處理結(jié)果存放到指定的堆棧區(qū)域時(shí)將處理結(jié)果存放到指定的堆棧區(qū)域。這樣的子程序?yàn)榭稍偃胄宰映绦颉_@樣的子程序?yàn)榭稍偃胄宰映绦?。緩沖區(qū)指針子程序返回地址BPSIBP+2+4DIAXBXCXDXSP圖4.6 堆棧結(jié)構(gòu)與指針4.5 子程序設(shè)計(jì)技術(shù)子程序設(shè)計(jì)技術(shù) 例例4.15

48、4.15 遞歸子程序設(shè)計(jì)。設(shè)計(jì)子程序完成遞歸子程序設(shè)計(jì)。設(shè)計(jì)子程序完成y=n! y=n! 的計(jì)算。的計(jì)算。解解:假設(shè)已經(jīng)設(shè)計(jì)了計(jì)算:假設(shè)已經(jīng)設(shè)計(jì)了計(jì)算k k階階乘的子程序階階乘的子程序factorialfactorial,為說明方便采用,為說明方便采用f f(k k)表示,則)表示,則k+1k+1階階階乘可以表示成:階乘可以表示成:f(k+1)=(k+1)f(k+1)=(k+1)f(k)f(k)這樣,計(jì)算這樣,計(jì)算n n階階乘的過程可以用圖階階乘的過程可以用圖4.74.7所示。因此,所示。因此,當(dāng)計(jì)算當(dāng)計(jì)算n!n!時(shí),要調(diào)用時(shí),要調(diào)用n n次次factorialfactorial子程序,每次調(diào)

49、子程序,每次調(diào)用使用使k k值減值減1 1,直到,直到k=1,k=1,這時(shí)將這時(shí)將1!=11!=1作為已知結(jié)果,作為已知結(jié)果,然后一層一層返回。然后一層一層返回。4.5 子程序設(shè)計(jì)技術(shù)子程序設(shè)計(jì)技術(shù) 調(diào) 用 factorialf(1)=1 k=1?k=k-1k=nf(k+1)=kf(k)子 程 序 factorial返 回圖 注 :設(shè) k階 階 乘 的 結(jié) 果為 f(k)圖 4.7 計(jì) 算 階 乘 的 遞 歸 子 程 序 流 程 框 圖4.5 子程序設(shè)計(jì)技術(shù)子程序設(shè)計(jì)技術(shù) 為設(shè)計(jì)遞歸子程序?yàn)樵O(shè)計(jì)遞歸子程序factorialfactorial,需要定義一個(gè)字單元,需要定義一個(gè)字單元RESULTR

50、ESULT用于存放計(jì)算結(jié)果,因此,用于存放計(jì)算結(jié)果,因此,factorialfactorial的入口參數(shù)為:的入口參數(shù)為:正整數(shù)正整數(shù)k k(88)和)和RESULTRESULT單元的偏移地址,出口參數(shù)為單元的偏移地址,出口參數(shù)為RESULTRESULT單元的內(nèi)容。匯編語言子程序單元的內(nèi)容。匯編語言子程序factorialfactorial如下如下:N=7 N=7 ;計(jì)算;計(jì)算7 7!,其結(jié)果應(yīng)該為!,其結(jié)果應(yīng)該為5040 (13B0H)5040 (13B0H)STACK SEGMENT STACK STACKSTACK SEGMENT STACK STACK DW 100H DUP(?) D

51、W 100H DUP(?)TOP LABEL WORDTOP LABEL WORDSTACK ENDSSTACK ENDSDATA SEGMENTDATA SEGMENTRESULT DW ?RESULT DW ?DATA ENDSDATA ENDS4.5 子程序設(shè)計(jì)技術(shù)子程序設(shè)計(jì)技術(shù) CODE SEGMENTCODE SEGMENT ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACKSTART:START: MOV AX,DATA MOV AX,DATA MOV DS,AX MOV D

52、S,AX MOV ES,AX MOV ES,AX MOV AX,STACK MOV AX,STACK MOV SS,AX MOV SS,AX LEA SP,TOP LEA SP,TOP LEA SI,RESULT LEA SI,RESULT PUSH SI PUSH SI;結(jié)果單元的偏移地址壓入堆棧;結(jié)果單元的偏移地址壓入堆棧 MOV AX,NMOV AX,N PUSH AX PUSH AX;N N值壓入堆棧值壓入堆棧 CALL FACTORIALCALL FACTORIAL4.5 子程序設(shè)計(jì)技術(shù)子程序設(shè)計(jì)技術(shù) MOV AX,RESULT MOV AX,RESULT;取出結(jié)果,并顯示;取出結(jié)果,并顯示 CALL DISPAXCALL DISPAX MOV AH,4CH MOV AH,4CH ;返回;返回DOSDOS操作系統(tǒng)操作系統(tǒng) INT 21HINT 21HFACTORIAL PROC NEARFACTORIAL PROC NEAR;計(jì)算;計(jì)算N!N!的遞歸子程序的遞歸子程序 PUSH BPPUSH BP MOV BP,SP MOV BP,SP

溫馨提示

  • 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論