微機原理教程03-2_第1頁
微機原理教程03-2_第2頁
微機原理教程03-2_第3頁
微機原理教程03-2_第4頁
微機原理教程03-2_第5頁
已閱讀5頁,還剩50頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

3.6子程序設(shè)計把功能相對獨立的程序段單獨編寫和調(diào)試,作為一個相對獨立的模塊供程序使用,就形成子程序子程序可以實現(xiàn)源程序的模塊化,可簡化源程序結(jié)構(gòu),可以提高編程效率主程序(調(diào)用程序)需要利用CALL指令調(diào)用子程序(被調(diào)用程序)子程序需要利用RET指令返回主程序3.6.1過程定義和子程序編寫匯編語言中,子程序要用一對過程偽指令PROC和ENDP聲明,格式如下:

過程名

PROC

[NEAR|FAR] …… ;過程體

過程名

ENDP可選的參數(shù)指定過程的調(diào)用屬性。沒有指定過程屬性,則采用默認屬性NEAR屬性(段內(nèi)近調(diào)用)的過程只能被相同代碼段的其他程序調(diào)用FAR屬性(段間遠調(diào)用)的過程可以被相同或不同代碼段的程序調(diào)用子程序編寫注意事項⑴子程序要利用過程定義偽指令聲明⑵子程序最后利用RET指令返回主程序,主程序執(zhí)行CALL指令調(diào)用子程序⑶子程序中對堆棧的壓入和彈出操作要成對使用,保持堆棧的平衡⑷子程序開始應(yīng)該保護使用到的寄存器內(nèi)容,子程序返回前相應(yīng)進行恢復(fù)⑸子程序應(yīng)安排在代碼段的主程序之外,最好放在主程序執(zhí)行終止后的位置(返回DOS后、匯編結(jié)束END偽指令前),也可以放在主程序開始執(zhí)行之前的位置例3.15用顯示器功能調(diào)用輸出一個字符的子程序

;主程序 moval,‘?’ ;主程序提供顯示字符

calldpchar

;調(diào)用子程序

;子程序:顯示AL中的字符dpchar proc

;過程定義,過程名為dpchar

pushax

;順序入棧,保護寄存器

pushbx movbx,0 movah,0eh ;顯示器0EH號輸出一個字符功能 int10h

popbx

;逆序出棧,恢復(fù)寄存器

popax ret ;子程序返回dpchar endp

;過程結(jié)束例3.15源程序;wj0315.asm .modelsmall .stack .codestart: movax,@data movds,ax

moval,‘?’

;主程序提供顯示字符

calldpchar

;調(diào)用子程序 movax,4c00h int21h主程序部分本程序不需要數(shù)據(jù)段例3.15源程序(續(xù))dpchar proc

;過程定義,過程名為dpchar pushax ;順序入棧,保護寄存器 pushbx movbx,0 movah,0eh ;顯示器0EH號輸出一個字符功能 int10h popbx ;逆序出棧,恢復(fù)寄存器 popax

ret ;子程序返回dpchar endp

;過程結(jié)束 endstart子程序安排在主程序執(zhí)行終止后的位置子程序編寫注意事項(續(xù))⑹子程序允許嵌套和遞歸⑺子程序可以與主程序共用一個數(shù)據(jù)段,也可以使用不同的數(shù)據(jù)段(注意修改DS),還可以在子程序最后設(shè)置數(shù)據(jù)區(qū)(利用CS尋址)⑻子程序的編寫可以很靈活,例如具有多個出口(多個RET指令)和入口,但一定要保證堆棧操作的正確性⑼處理好子程序與主程序間的參數(shù)傳遞問題⑽提供必要的子程序說明信息例3.16顯示以“0”結(jié)尾字符串的嵌套子程序

;數(shù)據(jù)段msg db'Well,Imadeit!',0

;代碼段(主程序) movsi,offsetmsg

;主程序提供顯示字符串

calldpstri

;調(diào)用子程序例3.16子程序;子程序dpstri:顯示DS:SI指向的字符串(以0結(jié)尾)

dpstri proc pushaxdps1: moval,[si] ;取顯示字符 incsi cmpal,0 ;是結(jié)尾,則顯示結(jié)束 jzdps2

calldpchar

;調(diào)用字符顯示子程序 jmpdps1dps2: popax retdpstri endp;子程序dpchar:顯示AL中的字符(同例題3.15)含數(shù)據(jù)區(qū)的子程序;子程序HTOASC:十六進制數(shù)轉(zhuǎn)換為ASCII碼HTOASC proc pushbx movbx,offsetASCII andal,0fh xlatCS:ASCII ;換碼:AL←CS:[BX+AL] popbx

ret;數(shù)據(jù)區(qū)ASCII db30h,31h,32h,33h,34h,35h,36h,37h,38h,39h db41h,42h,43h,44h,45h,46hHTOASC endp多出口子程序;子程序HTOASC:十六進制數(shù)轉(zhuǎn)換為ASCII碼

HTOASC proc andal,0fh cmpal,9 jbehtoasc1 addal,37h ;是A~F,加37H

ret

;子程序返回htoasc1: add,30h ;是0~9,加30H

ret

;子程序返回HTOASC endp參數(shù)傳遞主程序與子程序間一個主要問題是參數(shù)傳遞入口參數(shù)(輸入?yún)?shù)):主程序調(diào)用子程序時,提供給子程序的參數(shù)出口參數(shù)(輸出參數(shù)):子程序執(zhí)行結(jié)束返回給主程序的參數(shù)參數(shù)的具體內(nèi)容傳數(shù)值:傳送數(shù)據(jù)本身傳地址:傳送數(shù)據(jù)的主存地址常用的參數(shù)傳遞方法寄存器共享變量堆棧3.6.2用寄存器傳遞參數(shù)最簡單和常用的參數(shù)傳遞方法是通過寄存器,只要把參數(shù)存于約定的寄存器中就可以了由于通用寄存器個數(shù)有限,這種方法對少量數(shù)據(jù)可以直接傳遞數(shù)值,而對大量數(shù)據(jù)只能傳遞地址采用寄存器傳遞參數(shù),注意帶有出口參數(shù)的寄存器不能保護和恢復(fù),帶有入口參數(shù)的寄存器可以保護、也可以不保護,但最好能夠保持一致dpchardpstriHTOASC例3.17用寄存器傳遞參數(shù)顯示字符串

;數(shù)據(jù)段msg db'Well,Imadeit!',0

;代碼段(主程序)

movsi,offsetmsg

;SI寄存器傳遞參數(shù):字符串地址

calldpstri

;調(diào)用子程序例3.17用寄存器傳遞參數(shù)顯示字符串(續(xù))

;代碼段(子程序)

dpstri proc ;顯示以0結(jié)尾的字符處 pushax ;入口參數(shù):SI=字符串地址 pushdxdps1: movdl,[si]

;通過SI使用參數(shù) cmpdl,0 jzdps2 movah,2 int21h incsi jmpdps1dps2: popdx popax retdpstri endp例3.18從鍵盤輸入有符號十進制數(shù)

;數(shù)據(jù)段count =10array dwcountdup(0)

;代碼段(主程序)

movcx,count movbx,offsetarrayagain: callread ;調(diào)用子程序,輸入一個數(shù)據(jù) mov[bx],ax ;存放出口參數(shù)

incbx incbx calldpcrlf

;調(diào)用子程序:光標回車

loopagain將ASCII碼轉(zhuǎn)換為二進制數(shù)的算法①首先判斷輸入正數(shù)還是負數(shù),并用一個寄存器記錄下來;②接著輸入0~9數(shù)字(ASCII碼),并減30H轉(zhuǎn)換為二進制數(shù);③然后將前面輸入的數(shù)值乘10,并與剛輸入的數(shù)字相加得到新的數(shù)值;④重復(fù)②、③步,直到輸入一個非數(shù)字字符結(jié)束;⑤如果是負數(shù)進行求補,轉(zhuǎn)換成補碼;否則直接將數(shù)值保存。例3.18從鍵盤輸入有符號十進制數(shù)(續(xù)1)read proc ;輸入有符號十進制數(shù)

pushbx ;出口參數(shù):AX

pushcx ;說明:負數(shù)用“-”引導(dǎo)

pushdx xorbx,bx ;BX保存結(jié)果

xorcx,cx ;CX為正負標志,0為正,-1為負

movah,1 ;輸入一個字符

int21h

cmpal,'+' ;是“+”,繼續(xù)輸入字符

jzread1

cmpal,'-' ;是“-”,設(shè)置-1標志

jnzread2

movcx,-1例3.18從鍵盤輸入有符號十進制數(shù)(續(xù)2)read1: movah,1 ;繼續(xù)輸入字符 int21hread2: cmpal,‘0’ ;不是0~9之間的字符,輸入結(jié)束 jbread3 cmpal,'9' jaread3

subal,30h ;是0~9之間的字符,轉(zhuǎn)換為二進制數(shù) ;利用移位指令,實現(xiàn)數(shù)值乘10:BX←BX×10

shlbx,1 movdx,bx shlbx,1 shlbx,1 addbx,dx例3.18從鍵盤輸入有符號十進制數(shù)(續(xù)3) movah,0 addbx,ax ;已輸入數(shù)值乘10后,與新輸入數(shù)值相加

jmpread1 ;繼續(xù)輸入字符read3: cmpcx,0 ;是負數(shù),進行求補 jzread4 negbxread4: movax,bx ;設(shè)置出口參數(shù)

popdx popcx popbx ret ;子程序返回read endp例3.18從鍵盤輸入有符號十進制數(shù)(續(xù)4)dpcrlf proc

;使光標回車換行的子程序 pushax pushdx movah,2 movdl,0dh int21h movah,2 movdl,0ah int21h popdx popax retdpcrlf endp3.6.3用共享變量傳遞參數(shù)子程序和主程序使用同一個變量名存取數(shù)據(jù)就是利用共享變量(全局變量)進行參數(shù)傳遞如果變量定義和使用不在同一個源程序中,需要利用PUBLIC、EXTREN聲明如果主程序還要利用原來的變量值,則需要保護和恢復(fù)利用共享變量傳遞參數(shù),子程序的通用性較差,但特別適合在多個程序段間、尤其在不同的程序模塊間傳遞數(shù)據(jù)例3.19用共享變量傳遞參數(shù)顯示字符串

;數(shù)據(jù)段msg db'Well,Imadeit!',0temp dw? ;**共享變量

;代碼段(主程序) movsi,offsetmsg

movtemp,si ;**共享變量傳遞參數(shù)

calldpstri

;調(diào)用子程序例3.19用共享變量傳遞參數(shù)顯示字符串(續(xù))

;代碼段(子程序)

dpstri proc ;顯示以0結(jié)尾的字符處 pushax ;入口參數(shù):temp=字符串地址 pushdx

movsi,temp

;**通過temp獲得參數(shù) …… ;后同例3.16A程序例3.20向顯示器輸出有符號十進制數(shù)

;數(shù)據(jù)段count =10array dw1234,-1234,0…wtemp dw?

;代碼段(主程序) movcx,count movbx,offsetarrayagain: movax,[bx]

movwtemp,ax ;將入口參數(shù)存放到共享變量

callwrite ;調(diào)用子程序,顯示一個數(shù)據(jù) incbx incbx calldpcrlf ;光標回車換行 loopagain將二進制數(shù)轉(zhuǎn)換為ASCII碼的算法①首先判斷數(shù)據(jù)是零、正數(shù)或負數(shù),是零顯示“0”退出;②是負數(shù),顯示“-”,求數(shù)據(jù)的絕對值;③接著數(shù)據(jù)除以10,余數(shù)加30H轉(zhuǎn)換為ASCII碼壓入堆棧;④重復(fù)③步,直到商為0結(jié)束;⑤依次從堆棧彈出各位數(shù)字,進行顯示。例3.20向顯示器輸出有符號十進制數(shù)(續(xù)1)write proc ;顯示有符號10進制數(shù)的通用子程序

pushax ;入口參數(shù):共享變量wtemp

pushbx pushdx

movax,wtemp ;取出顯示數(shù)據(jù)

testax,ax ;判斷數(shù)據(jù)是零、正數(shù)或負數(shù)

jnzwrite1 movdl,'0' ;是零,顯示“0”后退出

movah,2 int21h jmpwrite5例3.20向顯示器輸出有符號十進制數(shù)(續(xù)2)write1: jnswrite2 ;是負數(shù),顯示“-”

movbx,ax ;AX數(shù)據(jù)暫存于BX

movdl,'-' movah,2 int21h movax,bx negax ;數(shù)據(jù)求補(絕對值)write2: movbx,10 pushbx ;10壓入堆棧,作為退出標志例3.20向顯示器輸出有符號十進制數(shù)(續(xù)3)write3: cmpax,0 ;數(shù)據(jù)(商)為零,轉(zhuǎn)向顯示

jzwrite4 subdx,dx ;擴展被除數(shù)DX.AX

divbx ;數(shù)據(jù)除以10:DX.AX÷10

adddl,30h ;余數(shù)(0~9)轉(zhuǎn)換為ASCII碼

pushdx ;數(shù)據(jù)各位先低位后高位壓入堆棧

jmpwrite3write4: popdx ;數(shù)據(jù)各位先高位后低位彈出堆棧

cmpdl,10 ;是結(jié)束標志10,則退出

jewrite5例3.20向顯示器輸出有符號十進制數(shù)(續(xù)4)

movah,2 ;進行顯示

int21h jmpwrite4write5: popdx popbx popax ret ;子程序返回write endp3.6.4用堆棧傳遞參數(shù)參數(shù)傳遞還可以通過堆棧這個臨時存儲區(qū)。主程序?qū)⑷肟趨?shù)壓入堆棧,子程序從堆棧中取出參數(shù);子程序?qū)⒊隹趨?shù)壓入堆棧,主程序彈出堆棧取得它們采用堆棧傳遞參數(shù)是程式化的,它是編譯程序處理參數(shù)傳遞、以及匯編語言與高級語言混合編程時的常規(guī)方法例3.21用堆棧傳遞參數(shù)顯示字符串

;數(shù)據(jù)段msg db'Well,Imadeit!',0

;代碼段(主程序) movsi,offsetmsg

pushsi

;**入口參數(shù)壓入堆棧

calldpstri

;調(diào)用子程序

addsp,2

;**平衡堆棧例3.21用堆棧傳遞參數(shù)顯示字符串(續(xù))dpstri proc ;顯示以0結(jié)尾的字符處

pushbp ;**入口參數(shù):堆棧=字符串地址

movbp,sp ;**通過BP獲得堆棧內(nèi)的參數(shù)

pushax pushdx

movsi,[bp+4] ;**通過BP指針獲得參數(shù) …dps2: popdx popax

popbp

;**恢復(fù)BP寄存器 retdpstri endp例3.22計算有符號數(shù)平均值

;數(shù)據(jù)段count =10array dw1234,-1234,0…wmed dw?

;代碼段(主程序) movax,count

pushax

;壓入數(shù)據(jù)個數(shù) movax,offsetarray

pushax

;壓入數(shù)據(jù)緩沖區(qū)的偏移地址

callmean

;調(diào)用子程序,求平均值

addsp,4

;平衡堆棧

movwmed,ax

;保存出口參數(shù)例3.22計算有符號數(shù)平均值(續(xù)1)mean proc ;計算16位有符號數(shù)平均值子程序 ;入口參數(shù):順序壓入數(shù)據(jù)個數(shù)和數(shù)據(jù)緩沖區(qū)偏移地址

pushbp ;出口參數(shù):AX=平均值

movbp,sp

pushbx

pushcx pushdx pushsi pushdi

movbx,[bp+4] ;從堆棧中取出緩沖區(qū)偏移地址→BX

movcx,[bp+6] ;從堆棧中數(shù)據(jù)個數(shù)→CX例3.22計算有符號數(shù)平均值(續(xù)2)

xorsi,si ;SI保存求和的低16位值

movdi,si ;DI保存求和的高16位值mean1: movax,[bx] ;取出一個數(shù)據(jù)→AX

cwd ;符號擴展→DX

addsi,ax ;求和低16位

adcdi,dx ;求和高16位

incbx ;指向下一個數(shù)據(jù)

incbx loopmean1 ;循環(huán)例3.22計算有符號數(shù)平均值(續(xù)3)

movax,si ;累加和在DX.AX

movdx,di

movcx,[bp+6] ;數(shù)據(jù)個數(shù)在CX

idivcx ;有符號數(shù)除法,AX=平均值

popdi ;恢復(fù)寄存器

popsi popdx popcx popbx

popbp retmean endp3.6.5子程序模塊將子程序單獨編寫成一個源程序文件,經(jīng)過匯編之后形成目標模塊OBJ文件,連接時應(yīng)用⑴使用偽指令PUBLIC和EXTERN聲明共享 PUBLIC標識符[,標識符…] ;定義標識符的模塊使用

EXTERN標識符:類型[,標識符:類型…] ;調(diào)用標識符的模塊使用⑵子程序在代碼段中,但沒有開始和結(jié)束點。⑶子程序、主程序文件的存儲模式要一致。⑷處理好子程序與主程序之間的參數(shù)傳遞。例3.23輸入有符號十進制數(shù)、求平均值輸出 ;子程序文件 .modelsmall ;相同的存儲模式

publicread,write,mean

;子程序共用

externwtemp:word

;聲明外部變量 .code ;代碼段 …… ;子程序代碼

;主程序文件 .modelsmall ;相同的存儲模式

externread:near,write:near,mean:near

;聲明外部子程序

publicwtemp

;變量共用 …… ;輸入、計算和輸出3.6.6子程序庫利用庫管理工具程序LIB.EXE將子程序模塊統(tǒng)一管理,存入子程序庫文件(.LIB)使用子程序庫中的子程序方法1:在連接過程中指明子程序庫方法2:主程序使用子程序庫文件包含偽指令I(lǐng)NCLUDELIB指明子程序庫的子程序的編寫與子程序模塊中的要求一樣,只是為方便調(diào)用,更加嚴格,最好遵循一致的規(guī)則。3.7宏匯編宏是具有宏名的一段匯編語句序列宏需要先定義,然后在程序中進行宏調(diào)用由于形式上類似其他指令,所以常稱其為宏指令宏指令實際上是一段代碼序列的縮寫;在匯編時,匯編程序用對應(yīng)的代碼序列替代宏指令因為是在匯編過程中實現(xiàn)的宏展開,所以常稱為宏匯編1.宏定義宏定義由一對宏匯編偽指令MACRO和ENDM來完成,格式如下:

宏名 MACRO[形參表]

…… ;宏定義體

ENDM其中宏名是符合語法的標識符,同一源程序中該名字定義唯一。宏定義體中不僅可以是硬指令序列,還可以是偽指令語句序列可選的形參表給出了宏定義中用到的形式參數(shù),每個形式參數(shù)之間用逗號分隔2.宏調(diào)用宏定義之后就可以使用它,即宏調(diào)用:

宏名[實參表]宏調(diào)用的格式同一般指令一樣:在使用宏指令的位置寫下宏名,后跟實體參數(shù);如果有多個參數(shù),應(yīng)按形參順序填入實參,也用逗號分隔在匯編時,宏指令被匯編程序用對應(yīng)的代碼序列替代,這就是宏展開宏展開的具體過程是:當匯編程序掃描源程序遇到已有定義的宏調(diào)用時,即用相應(yīng)的宏定義體完全替代源程序的宏指令,同時用位置匹配的實參對形參進行取代宏的實例1dispchar macrochar ;;宏定義

movah,2 ;;宏定義體

movdl,char int21h

endm

dispchar‘?’ ;宏調(diào)用(宏指令)

1

movah,2 ;宏展開

1

movdl,’?’1 int21h宏的實例2dispmsg macromessage ;;宏定義

movah,9 ;;宏定義體

leadx,message int21h

endm

dispmsgstring ;宏調(diào)用(宏指令)

1

movah,9 ;宏展開

1

leadx,string1 int21h宏與子程序的比較比較僅是源程序級的簡化:宏調(diào)用在匯編時進行程序語句的展開,不需要返回;不減小目標程序,執(zhí)行速度沒有改變通過形參、實參結(jié)合實現(xiàn)參數(shù)傳遞,簡捷直觀、靈活多變還是目標程序級的簡化:子程序調(diào)用在執(zhí)行時由CALL指令轉(zhuǎn)向、RET指令返回;形成的目標代碼較短,執(zhí)行速度減慢需要利用寄存器、存儲單元或堆棧等傳遞參數(shù)宏子程序宏與子程序的比較結(jié)論宏與子程序具有各自的特點,程序員應(yīng)該根據(jù)具體問題選擇使用那種方法通常,當程序段較短或要求較快執(zhí)行時,應(yīng)選用宏;當程序段較長或為減小目標代碼時,要選用子程序比較

結(jié)論宏子程序3.局部標號宏定義體中的標號必須用LOCAL偽指令聲明為局部標號局部標號偽指令LOCAL只能用在宏定義體內(nèi),而且是宏定義MACRO語句之后的第一條語句:

LOCAL標號列表標號列表由宏定義體內(nèi)使用的標號組成,用逗號分隔每次宏展開時匯編程序?qū)ζ渲械臉颂栕詣赢a(chǎn)生一個唯一的標識符(其形式為“??0000”到“??FFFF”),避免宏展開后的標號重復(fù)將十六進制字符轉(zhuǎn)換為十六進制數(shù)的宏ASCTOH macro

localasctoh1,asctoh2 cmpal,'9' jbeasctoh1 ;;‘0’~‘9’,減去30H

cmpal,'a' jbasctoh2 ;;‘A’~‘F’,還要減7

subal,20h ;;‘a(chǎn)’~‘f’,再減去20Hasctoh2: subal,7asctoh1: subal,30h endm將一個字量數(shù)據(jù)按十六進制數(shù)顯示出來的宏disphex macrohexdata

localdisphex1 pushax ;保護寄存器 pushbx pushcx pushdx movbx,hexdata movcx,0404h ;CH=4,作為循環(huán)次數(shù) ;CL=4,作為循環(huán)移位次數(shù)將一個字量數(shù)據(jù)按十六進制數(shù)顯示出來的宏(續(xù))disphex1: rolbx,cl ;高4位循環(huán)移位到低4位 moval,bl andal,0fh callhtoasc ;轉(zhuǎn)換成ASCII碼 dispcharal ;顯示該位數(shù)值 decch jnzdisphex1 popdx ;恢復(fù)寄存器 popcx popbx popax endm4.文件包含包含偽指令I(lǐng)NCLUDE可以將任何文本文件內(nèi)容插入源程序,與其他部分同時匯編

INCLUDE文件名包含的文件可以是.MAC宏庫文件:常用的或有價值的宏定義.INC包含文件:各種常量定義、聲明語句等.ASM匯編語言源文件:常用的子程序等利用INCLUDE偽指令包含其他文件,其實質(zhì)仍然是一個源程序,只不過是分在了幾個文件書寫;被包含的文件不能獨立匯編,是依附主程序而存在的例3.24輸入中斷向量號,顯示其入口地址

includewj0324.mac ;前面4個宏定義 ;數(shù)據(jù)段msg1 db'Enternumber(XX):$'msg2 db'TheInterruptProgramAddress:$'crlf db0dh,0ah,'$' ;代碼段

dispmsgmsg1 ;提示輸入一個兩位十六進制數(shù)

movah,1 ;接受高位

in

溫馨提示

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

評論

0/150

提交評論