微型計算機技術(shù)58612課件_第1頁
微型計算機技術(shù)58612課件_第2頁
微型計算機技術(shù)58612課件_第3頁
微型計算機技術(shù)58612課件_第4頁
微型計算機技術(shù)58612課件_第5頁
已閱讀5頁,還剩74頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

微型計算機技術(shù)學(xué)習(xí)輔導(dǎo)(4)第四章匯編語言程序設(shè)計基礎(chǔ)

4.1循環(huán)程序設(shè)計在程序設(shè)計中,常常需要一段程序反復(fù)執(zhí)行若干次,這通常用循環(huán)的方法來實現(xiàn),借助幾種循環(huán)控制指令和前綴可以方便地實現(xiàn)循環(huán)。4.1.1基本結(jié)構(gòu)的循環(huán)程序(1)初始化部分:循環(huán)前的準(zhǔn)備工作,包括建立指針、設(shè)置變量及循環(huán)初值等。(2)循環(huán)體:這是循環(huán)程序的工作部分,完成循環(huán)的基本操作。(3)修改部分:修改參數(shù),包括操作數(shù)地址、循環(huán)計數(shù)值或其他控制變量。(4)控制部分:根據(jù)對循環(huán)條件的判斷結(jié)果,控制循環(huán)的執(zhí)行或結(jié)束。初始化循環(huán)體初始化修改部分修改部分循環(huán)體循環(huán)控制循環(huán)控制YNNY先工作后判斷先判斷后工作例:編制一個程序,將BX寄存器中的二進制數(shù)用十六進制數(shù)的形式顯示出來。(1)BX寄存器中的二進制數(shù)可用4位十六進制數(shù)顯示,故循環(huán)次數(shù)為4,放入CH中。(2)BX循環(huán)左移4次,最高位數(shù)字移到最低位置;(3)0~9的數(shù)字與ASCII碼差為30H;A~F(41H~46H)與ASCII碼差為37H;故0~9的數(shù)字+30H,而A~F應(yīng)+37H。開始CX←循環(huán)記數(shù)值BX循環(huán)左移4次轉(zhuǎn)換為ASCII碼>9?+7顯示次數(shù)=0?結(jié)束例:統(tǒng)計某字單元中二進制數(shù)位值為1的個數(shù),統(tǒng)計結(jié)果存放在變量ONE中。DATASEGMENTNUMDW1669HFINI:MOVAH,4CHONEDB?INT21HDATAENDSCODEENDSCODESEGMENTENDSTARTASSNUMCS:CODEDS:DATASTART:MOVAX,DATAMOVDS,AXMOVAX,NUMCOMP:CMPAX,0JZFINISHLAX,1JNCCOMPINCONEJMPCOMP開始AX←NUMAX=0?AX左移一位CF=1?ONE+1結(jié)束YY4.1.2多重循環(huán)程序一個計算過程可能要依賴幾個互相獨立變化的參數(shù),這就需要在一個循環(huán)過程中再包含一個循環(huán)過程,形成外層循環(huán)嵌套內(nèi)層循環(huán)的結(jié)構(gòu)形式,這種程序就稱為多重循環(huán)程序。多重循環(huán)程序設(shè)計的基本方法和單重循環(huán)程序設(shè)計是一致的,應(yīng)分別考慮各層循環(huán)的控制條件及其程序?qū)崿F(xiàn),相互之間不能混淆。另外要注意在每次通過外層循環(huán)再次進入內(nèi)層循環(huán)時,初始條件必須重新設(shè)置。例:有一個首地址為A的N字?jǐn)?shù)組,請編制程序使該數(shù)組中的數(shù)按照從小到大的次序排列(整序)。采用起泡排序算法實現(xiàn)整序:從第一個數(shù)開始依次對相鄰兩個數(shù)Ki和Ki十l進行比較,若Ki≤Ki十l,Ki的位置不動,Ki十l繼續(xù)和Ki十2比較;若Ki>Ki十1,則兩者交換位置。Ki十1(交換前的Ki)繼續(xù)和Ki十2比較??梢钥闯?,在第一遍比較了N-1次后,最大的數(shù)已經(jīng)放到了最后,所以在第二遍時,只需比較N-2次,同樣道理,第三遍只需比較n-3次…。如果有N個數(shù),最多要比較n-1遍。

序號數(shù)比較遍數(shù)1234比較次數(shù)123412312113232321616151588285851616321515168815153161685151515328881616

1641515858883232

32

3258885

85

85

85

85

第一遍比較5-1=4次挑出最大數(shù)85第二遍比較5-2=3次挑出第二大數(shù)32第三遍比較5-3=2次挑出第三大數(shù)16第四遍比較5-4=1次挑出第四大數(shù)15完成整序DSEGSEGMENTNEQU5ADW5DUP(?)DSEGENDSCSEGSEGMENTMAINPROCFARASSUMECS:CSEG,DS:DSEGSTART:MOVAX,DSEGMOVDS,AXNUM:ADDSI,2MOXCX,NLOOPLOOP2DECCXMOVCX,DXLOOP1:MOVDX,CXLOOPLOOP1MOVSI,0MOVAH,4CHLOOP2:MOVAX,A[SI]INT21HCMPAX,A[SI+2]MAINENDPJLENUMXCHGAX,A[SI+2]CSEGENDSMOVA[SI],AXENDSTART

4.2分支程序設(shè)計4.2.1分支程序結(jié)構(gòu)兩路(單重)分支結(jié)構(gòu)多路(多重)分支結(jié)構(gòu)這兩種結(jié)構(gòu)都要求先對條件進行判定,然后根據(jù)判定結(jié)果確定執(zhí)行哪路分支,判定一次只能有一路分支被選擇。一般來講一個條件兩路分支;N個條件,2N路分支。判定條件判定條件ABABXYN

4.2.2分支程序的設(shè)計方法分支程序的實現(xiàn)方法有多種,最常用的方法有:利用比較和條件轉(zhuǎn)移指令實現(xiàn)分支,利用邏輯尺控制分支,以及利用地址跳轉(zhuǎn)表實現(xiàn)分支等方法。例:X/2X<0Y=2X=02XX>0這個問題可以通過X與0的比較,利用條件轉(zhuǎn)移指令來確定三個計算分支中的某一支。MOVAL,XCMPAL,0JLM1JZM2SALAL,1JMPNEXTM1:SARAL,1JMPNEXTM2:MOVAL,2NEXT:MOVX,ALAL←XX<0?AL÷2X=0?AL←2AL×2X←ALYNYN利用地址跳轉(zhuǎn)表的方法主要用于多路分支(三路分支以上)的情況,下面通過一個實例來說明這種程序設(shè)計方法。在調(diào)用DOS文件管理功能時,如出現(xiàn)了錯誤(如使用了非法功能號),DOS則根據(jù)AX中的錯誤碼,將相應(yīng)的錯誤信息顯示出來。(AX)=1~5各表示一種錯誤,其錯誤信息分別為ERl~ER5。AX除l~5之外的數(shù)碼是無效的。(1)錯誤信息提示的地址分別為ERl~ER5。(2)ERl~ER5構(gòu)成跳轉(zhuǎn)表,表首地址為ERTAB。(3)表中各項的地址為表首址+(功能號-1)×21號錯誤提示2號錯誤提示3號錯誤提示4號錯誤提示5號錯誤提示ER1ER2ER3ER4ER5ER1ER2ER3ER5ER4ERTABERTAB+2ERTAB+4ERTAB+6ERTAB+8DATASEGMENTCMPAX,5OUTRDB“非1~5$”JGOUTR;≥5轉(zhuǎn)至OUTRER1DB“錯誤1提示$”CMPAX,1ER2DB“錯誤2提示$”JGETADR;1~5轉(zhuǎn)TADRER3DB“錯誤3提示$”O(jiān)UTR:LEADX,OUTRER4DB“錯誤1提示$”JMPDISPM;轉(zhuǎn)至DISPMER5DB“錯誤1提示$”TADR:MOVBX,AXEVENDECBXERTABDWER1,ER2,ER3SHLBX,1DWER4,ER5MOVDX,ERTAB[BX]DATAENDSDISPM:MOVAH,9CODESEGMENTINT21HSHOWERRPROCFARPOPBX;恢復(fù)現(xiàn)場ASSUMECS:CODE,DS:DATAPOPDXMOVSI,DATAPOPAXMOVDS,SIREGPHSUAX;保護現(xiàn)場SHOWERRENDPPUSHDXCODEENDSPUSHBXEND

4.3子程序設(shè)計子程序又稱為過程,在程序?qū)崿F(xiàn)中,如果要多次用到一些功能相同的程序段,那么就可以用偽操作PROC和ENDP把這些程序段定義成子程序。需要時用CALL指令來調(diào)用它,調(diào)用程序也稱為主程序。子程序有兩種屬性:NEAR(缺省的屬性)和FAR。和調(diào)用程序在同一代碼段中的子程序使用NEAR屬性,和調(diào)用程序不在同一代碼段中的子程序使用FAR屬性。4.3.1主程序與子程序之間的參數(shù)傳送主程序在調(diào)用子程序時,需要傳送一些參數(shù)(入口參數(shù))給子程序,子程序運行完后也要將運行結(jié)果(出口參數(shù))回送給主程序。利用寄存器傳送參數(shù)傳送參數(shù)的方式:利用存儲區(qū)傳送參數(shù)利用堆棧傳送參數(shù)1.利用寄存器傳送參數(shù)這種參數(shù)傳送的方式方便、快速,但只適合傳送參數(shù)較少的情況。例:編寫程序,將一個16位二進制數(shù)轉(zhuǎn)換成用ASCII表示的十進制數(shù)。這是一個常用的轉(zhuǎn)換子程序,應(yīng)提供給所有的用戶調(diào)用。因此,要將該子程序的人口參數(shù)和出口參數(shù)注釋清楚,方便調(diào)用。入口參數(shù):DX=被轉(zhuǎn)換數(shù)DI=結(jié)果單元首地址出口參數(shù):DI=ASCII碼結(jié)果單元首地址BIN-TO-ASCPROC

PUSHCX;保護現(xiàn)場POPDI;恢復(fù)現(xiàn)場PUSHAXPOPAXPUSHDIPOPCXADDDI,4;指向最低位RET

BINAO:MOVAX,DXBIN-TO-ASCENDPMOVDX,0CODEENDSMOVCX,10ENDSTARTDIVCX;÷10XCHGAX,DX;商←→余數(shù)ADDAL,30H;轉(zhuǎn)換ASCII碼MOV[DI],AL;存結(jié)果DECDI;修改指針CMPDX,0JNZBINA0;≠0,轉(zhuǎn)BINA0本例中,N為二進制數(shù),先除10,余數(shù)為個位,或30H變?yōu)锳SCII碼;再對商除10,余數(shù)為十位,或30H變?yōu)锳SCII碼;直至商為0。2.利用存儲區(qū)傳送參數(shù)參數(shù)存放在存儲區(qū)中,入口參數(shù)為存儲區(qū)首地址。適合參數(shù)較多的情況。例:TABLE數(shù)組中存有15個十進制數(shù),挑出最大數(shù)存放在MAX單元中。DATASEGMENTFOUNTPROCTABLEDB4,6,8,4,9…MOVAL,[SI]NEQU15DECCXMAXDB?INCSIDATAENDSLOP:CMPAL,[SI]CODESEGMENTJGL1ASSUMECS;CODE,DS:DATAMOVAL,[SI]START:MOVAX,DATAL1:INCSIMOVDS,AXLOOPLOPMOVCX,NFOUNTENDPLEASI,TABLE;入口參數(shù)CODEENDSCALLFOUNTENDSTARTMOVMAX,ALMOVAH,4CHINT21H

3.利用堆棧傳送函數(shù)利用堆棧適合于傳送參數(shù)多,而且子程序有嵌套、遞歸調(diào)用的情況。主程序?qū)?shù)或參數(shù)地址推入堆棧,子程序從堆棧中取出參數(shù)或參數(shù)地址。利用堆棧傳送涵數(shù)一定要注意堆棧的變化,如果參數(shù)和返回地址混淆,會造成子程序不能正確返回的錯誤。例:調(diào)加密子程序?qū)?shù)組中的數(shù)據(jù)Aj加密。秘約規(guī)則為Aj×2,再各位求反。DSEGSEGMENTSTART:MOVAX,DSEGNEQU20MOVDS,AXARAYDWNDUP(?)MOVAX,SSEGDSEGENDSMOVSS,AXSSEGSEGMENTLEASP,TOP;指定棧底DW64DUP(?)LEABX,ARAYTOPLABELWORDPUSHBX;首地址入棧SSEGENDSMOVBX,N;個數(shù)入棧CSEGSEGMENTPUSHBXASSUMECS:CSEG,CALLECRYSS:SSEG,MOVAX,4C00HDS:DSEGINT21H

4.4I/O程序設(shè)計

信息交換地址端口:地址信息主機I/O接口數(shù)據(jù)端口:狀態(tài)信息狀態(tài)端口:數(shù)據(jù)信息4.4.1直接控制I/O的程序設(shè)計1.I/O端口在80x86微機中,I/O端口編址在一個獨立的地址空間中,這個I/O空間允許設(shè)置64K(65536)個8位端口或32K(32768)個16位端口。2.I/O程序舉例對于I/O和存儲器分離的地址空間系統(tǒng),80x86有專門的I/O指令與端口進行通信。下面通過幾個I/O程序的例子,說明使用I/O指令直接在端口級上輸入輸出的方法。輸入指令輸出指令I(lǐng)NAN,30HOUT30H,ALINAX,40HOUT40H,AXINAL,DX;DX←16位端口地址OUTDX,AX;DX←16位端口地址INAX,DX;DX←16位端口地址OUTDX,AX;DX←16位端口地址

例:SOUND程序。程序通過I/O指令使設(shè)備控制寄存器(1/O端口地址為61H)的第1位交替為0和l,而61H端口的第l位和揚聲器的脈沖門相連,交替為0和l的脈沖電流被放大后送到揚聲器使之發(fā)出了聲音。

76543210SOUNDPROCPUSHAXPUSHDXMOVDX,1000INAL,61HDECDXANDAL,11111100BJNZTRIGTRIG:XORAL,00000010BPOPDXOUT61H,ALPOPAXMOVCX,6000RETDELAY:LOOPDELAYSOUNDENDP1/0與門放大器端口61H本例中CX=6000它決定發(fā)聲頻率值小聲音尖銳,值大聲音低沉。DX=1000決定發(fā)聲時間長短。

例:PRT—CHAR程序。這是一個采用查詢方式的打印字符程序。程序通過反復(fù)瀆取并測試打印機的狀態(tài)來控制輸出。在打印機接口中,數(shù)據(jù)寄存器的端口地址為378H,狀態(tài)寄存器的端口地址為379H,控制寄存器的端口地址為37AH。76543210

忙位(0=忙)未用應(yīng)答(0=可接受)打印出錯(0=出錯)紙出界(1=出界)聯(lián)機狀態(tài)(1=聯(lián)機)76543210未用選通(1=輸出數(shù)據(jù))工作方式自動換行(1=換行)(0=禁止中斷方式)初始化(1=正常)選擇位(1=接通)

狀態(tài)寄存器端口379H控制寄存器端口37AH又例:CPU要從3個設(shè)備輪流輸人數(shù)據(jù),PROCl,PROC2,PROC3分別是設(shè)備l,設(shè)備2和設(shè)備3的數(shù)據(jù)輸入程序,它們的狀態(tài)寄存器的端口地址分別用STAT1,STAT2,STAT3表示,這三個狀態(tài)寄存器的5位是輸入準(zhǔn)備位。輪流查詢?nèi)齻€數(shù)據(jù)輸入設(shè)備的程序段:INPUT:INAL,STAT1;AL←狀態(tài)寄存器1TESTAL,20H;輸入準(zhǔn)備好?JZDEV2;否,轉(zhuǎn)DEV2CALLFARPTRPROC1;準(zhǔn)備好,調(diào)PROC1DEV2:INAL,STAT2TESTAL,20HJZDEV3CALLFARPTRPROC2DEV3:INAL,STAT3TESTAL,20HJZNO-INPUTCALLFARPTRPROC1NO-INPUT:……查詢方式的優(yōu)點:可以安排優(yōu)先次序,最先查詢的設(shè)備優(yōu)先級最高。修改查詢次序就修改了設(shè)備的優(yōu)先級。缺點:查詢等待浪費CPU的時間,在設(shè)備多時由詢問轉(zhuǎn)向處理程序的時間較長。4.4.2中斷程序設(shè)計中斷是一種使CPU中止正在執(zhí)行的程序而轉(zhuǎn)去處理特殊事件的操作,引起中斷的事件稱為中斷源。中斷是CPU和外部設(shè)備進行輸入/輸出的有效方法??梢员苊庖蚍磸?fù)查詢外部設(shè)備的狀態(tài)而浪費時間,從而提高CPU的效率。中斷源分為軟件中斷(或稱內(nèi)中斷)和硬件中斷(或稱外中斷),系統(tǒng)通過分配給這些中斷的類型號來加以識別和處理。

80x86中斷源及其中斷類型號

IR08259AIR1可編程IR2中斷IR3控制器IR4(PIC)IR5IR6IR708系統(tǒng)定時器09鍵盤0A彩色/圖形0B串行COM20C串行COM10DLTP2控制0E磁盤控制器0FLTP1控制非屏蔽中斷請求中斷邏輯INTn指令單步TF=1除法錯誤INT0指令I(lǐng)NTRNMI2401nCPU1.軟件中斷的執(zhí)行(1)中斷指令I(lǐng)NTn的執(zhí)行。CPU執(zhí)行一條INTn指令時,中斷系統(tǒng)立即產(chǎn)生類型為n的中斷,并且通過中斷向量調(diào)用相應(yīng)的中斷處理程序來完成其中斷功能。(2)處理CPU某些錯誤的中斷。除法錯中斷:在執(zhí)行除法指令時,若發(fā)現(xiàn)除數(shù)為0或商超過了寄存器所能表達(dá)的范圍,則立即產(chǎn)生一個類型為0的中斷。溢出中斷:有一條專門的指令I(lǐng)NTO來中斷發(fā)生溢出的算術(shù)操作。如果OF=1,INTO指令引起中斷,如OF:=0,則不發(fā)生中斷,CPU繼續(xù)運行原程序。溢出中斷的類型號為4。(3)為調(diào)試程序沒置的中斷。單步中斷:單步是一種很有用的調(diào)試方法。當(dāng)標(biāo)志位TF設(shè)置為l時,每條指令執(zhí)行后,CPU自動產(chǎn)生類型號為1的單步中斷。斷點中斷:斷點可以設(shè)置在程序的任何地方,設(shè)置斷點實際上是把一條斷點指令I(lǐng)NT3插入程序中,CPU每執(zhí)行到斷點處的INT3指令便產(chǎn)生一個中斷。INT指令和INTO指令產(chǎn)生的中斷。以及除法錯中斷都不能被禁止,并且比任何外部中斷的優(yōu)先權(quán)都高。如果系統(tǒng)增設(shè)鍵蠱中斷,則可用下列指令實現(xiàn):INAL,21H;取中斷屏蔽字ANDAL,11111101B;將第1為置0,保留其余位不變OUT21H,AL;回送21H端口中斷標(biāo)志位IF的設(shè)置:STI;設(shè)置中斷允許位(IF=1),允許中斷(開中斷)CLI;清除中斷允許位(1F=0),禁止中斷(關(guān)中斷)中斷命令寄存器76543210(I/O端口20H)中斷命令寄存器:EOI是中斷結(jié)束位,當(dāng)EOI為1時,當(dāng)前正在處理的硬件中斷請求就被清除,所以在中斷處理完成后,必須把中斷結(jié)束位置為1。結(jié)束硬件中斷用下面的指令:MOVAL,20H;20H=00100000B,置EOI為1OUT20H,AL;

RSLEOI00L2L1L03.中斷操作步驟8086/8088中斷系統(tǒng)能處理256種類型的中斷,類型號為0~0FFH。中斷向量表是各類型中斷處理程序的人口地址表。中斷向量的地址可由中斷類型號乘以4計算出來。以BIOS中斷INT4AH為例,表示出中斷操作的以下5個步驟:①取中斷類型號;⑦計算中斷向量地址;③取中斷向量,偏移地址送IP,段地址送CS;④轉(zhuǎn)人中斷處理程序;⑤中斷返問到INT指令的下一條指令。類型49H中斷向量0518F000類型4BH中斷向量0:1280:1290:12A0:12B0:124INT4AHMOVCX,30H向量地址=4AH×4=128STIPUSHDSIRET1805F000IPCS①②③中斷處理程序F000:1805④⑤采用向量中斷可加快CPU中斷處理速度。利用保留的中斷類型號擴充中斷功能,需要在中斷向量表中建立相應(yīng)的中斷向量。為中斷類型N設(shè)置中斷向量的方法:

MOVAX,0MOVES,AXMOVBX,N﹡4MOVAX,OFFSETINHANDMOVES:WORDPTR[BX],AXMOVAX,SEGINHANDMOVES:WORDPTR[BX+2],AX

INHAND:IRET中斷向量表子程序IRETINHAND(BX)=N﹡4(BX)+2OFFSETINHANDSEGINHAND0:0000IPCS①②①②用自己編寫的中斷處理程序代替系統(tǒng)中的某個中斷處理功能時:(1)利用DOS功能調(diào)用(21H)保存原中斷向量(2)設(shè)置新的中斷向量;(3)在程序結(jié)束之前恢復(fù)原中斷向量設(shè)置中斷向量的DOS功能調(diào)用把由AL指定的中斷類型的中斷向量DS:DX放在中斷向量表中.預(yù)置:AH=25HAL=中斷類型號DS:DX=中斷向量執(zhí)行:INT21H

取中斷向量的DOS功能調(diào)用把由AL指定的中斷類型的中斷向量從中斷向量表中取到ES:BX中預(yù)置:AH=35HAL=中斷類型號執(zhí)行:INT21H例:使用DOS功能調(diào)用存取中斷向量。

MOVAL,N;MOVAH,35H;INT21H;PUSHESPUSHBXPUSHDSMOVAX,SEGINTNANDMOVDS,AXMOVDX,OFFSETINTHANDMOVAL,NMOVAH,25HPOPDS

利用功能號35H的DOS功能調(diào)用把N類型的中斷向量取到ES:BX中,進行壓棧保存。新的中斷向量DS:DX利用功能號25H的DOS功能調(diào)用存入到中斷向量表中。中斷類型為N。

POPDX;POPDS;MOVAL,NMOVAH,25HINT21HRETINTHAND:IRET將原來壓棧保護的中斷向量彈出到DS:DX中,利用功能號25H的DOS功能調(diào)用再存入到中斷向量表中。INTHAND是新的中斷服務(wù)子程序的入口符號地址。

4.中斷過程中斷過程:

1.保存返回地址CS:IP、保存標(biāo)志寄存器FLAGS。2.CPU還自動清除IF位和TF位,目的是使CPU轉(zhuǎn)人中斷處理程序后,不允許再產(chǎn)生新的中斷。3.轉(zhuǎn)入中斷服務(wù)程序。

IRET中斷服務(wù)1.FKAGS、CS、IP入棧2.清除IF、TF3.轉(zhuǎn)中斷處理程序INTHAND產(chǎn)生中斷1.IP、CS和FLAGS出棧2.返回斷點,繼續(xù)執(zhí)行下一條指令。中斷返回5.中斷優(yōu)先級中斷優(yōu)先級:CPU根據(jù)中斷源的輕重緩急為中斷源事先安排的中斷優(yōu)先級次序。當(dāng)多個中斷源同時向CPU請求中斷時,CPU先比較它們的優(yōu)先級,然后從優(yōu)先級高到優(yōu)先級低的次序來依次處理各個中斷源的中斷請求。8086規(guī)定中斷的優(yōu)先級次序為:

優(yōu)先級高軟件中斷(除法錯,INTO,INT)非屏蔽中斷(NMI)可屏蔽中斷(INTR)低單步中斷可屏蔽中斷的優(yōu)先權(quán)又分為八級,在正常的優(yōu)先級方式下,優(yōu)先級次序是:

優(yōu)先級高低IR0,IR1,IR2,IR3,IR4,IR5,IR6,IR74.4.3中斷程序設(shè)計舉例中斷處理程序的編寫應(yīng)注意:(1)中斷處理程序若不允許被打斷,則清除IF和TF,若允許其他設(shè)備中斷,則需用STI指令把IF位置1。(2)CPU產(chǎn)生一次中斷,I/O設(shè)備只完成一個字節(jié)(或字)的輸入/輸出,所以中斷處理程序所用的指針變量或數(shù)據(jù)變量一般應(yīng)設(shè)置存儲單元來保存。(3)硬件設(shè)備的中斷處理結(jié)束后,一般要發(fā)出中斷結(jié)束命令(E0I)。否則將屏蔽同級或低級的中斷。例:編寫一個中斷處理程序,要求在主程序運行過程中,每隔10s響鈴一次,同時在屏幕上顯示出信息“Thebellisring!”。本例中用新設(shè)計的處理程序來代替原有的1CH中斷程序,為此:在主程序的初始化部分,先保存當(dāng)前1CH的中斷向量,再設(shè)置新的中斷向量。在主程序的結(jié)束部分恢復(fù)保存的1CH中斷向量。SCATK1SEGMENTPARASTACKDW100DUP(?)STACK1ENDSDATASEGMENTCOUNTDW1MSGDB‘Thebellisring’,0dh,0ah,’$’DATAENDSCODESEGMENTMAINPROCFARASSUMECS:CODE,DS:DATA,SS:STACK1START:MOVAX,DATAMOVDS,AXMOVAL,1CH;取功能號1CH的中斷向量壓棧保存MOVAH,35HINT21HPUSHESPUSHBXPUSHDSMOVDX,OFFSETRING;子程序入口地址的偏移量送DXMOVAX,SEGRING;子程序入口地址的段基值送DSMOVDS,AX;中斷向量送DS:DXMOVAL,1CHMOVAH,25HINT21HPOPDS

POPDXPOPDSSTIMOVAL,1CHMOVDI,20000MOVAH,25DELAY:MOVSI,30000INT21HDELAY1:DECSIMOVAH,4CHJNZDELAY1INT21HDECDIMAINENDPJNZDELAYIN21HANDAL,11111110BOUT21H,AL設(shè)置時鐘中斷延時

RINGPROCNEARSOUNT:XORAL,02HPUSHDSOUT61H,ALPUSHAXMOVCX,1400HPUSHCXWAIT1:LOOPWAIT1PUSHDXDECDXMOVAX,DATAJNZSOUNTMOVDS,AXMOVCOUNT,182STI;開中斷EXIT:CLI;關(guān)中斷DECCOUNTMOVAL,20HJNZEXITOUT20H,ALMOVDX,OFFSETMSGPOPDXMOVAH,09HPOPCXINT21HPOPAXMOVDX,100POPDSINAL,61HIRETANDAL,0FCHRINGENDPENDSTART顯示提示語響鈴程序EOI=1清除中斷請求保護寄存器恢復(fù)寄存器

4.5BIOS和DOS基本調(diào)用

在存儲器系統(tǒng)中從地址0FE000H開始的8KROM(只讀存儲器)中裝有BIOS例行程序:系統(tǒng)加電自檢、引導(dǎo)裝入、主要I/O設(shè)備的管理程序以及接口控制等功能模塊來處理所有的系統(tǒng)中斷。使用BIOS功能調(diào)用,給程序員編程帶來很大方便。DOS提供了一組系統(tǒng)功能調(diào)用子程序:包括I/O設(shè)備處理程序、文件管理程序和一些其他的處理程序。DOS操作比相應(yīng)功能的BIOS操作更簡易,而且對硬件的依賴性更少些。BIOS中斷類型CPU中斷類型0除法錯1單步2非屏蔽中斷3斷點4溢出5打印屏幕6保留7保留8259中斷類型8系統(tǒng)定時器(IRQ0)CCOM1控制器(IRQ4)9鍵盤(IRQ1)DI‘PT2控制器(IRQ5)A彩色/圖形接口(IRQ2)E磁盤控制器(IRQ6)BCOM2控制器(IRQ3)FLPT1控制器(1RQ7)BIOS中斷類型10顯示器I/O11取設(shè)備信息12取內(nèi)存容量13磁盤I/O14RS—232串行口I/O15磁帶I/O16鍵盤I/O17打印機I/O18ROMBASIC19引導(dǎo)裝入程序1A時鐘40軟盤BIOS用戶應(yīng)用程序1B鍵盤終止地址(Ctrl-Break)1C定時器4A報警(用戶鬧鐘)數(shù)據(jù)表指針1D顯示器參數(shù)表410﹟硬盤參數(shù)表1E軟盤參數(shù)表461﹟硬盤參數(shù)表1F圖形字符擴展碼49指向鍵盤增強服務(wù)變換表DOS中斷類型20程序終止27結(jié)束并駐留內(nèi)存21功能調(diào)用28鍵盤忙循環(huán)22終止地址29快速寫字符23Ctrl-C中斷向量2A網(wǎng)絡(luò)接口24嚴(yán)重錯誤向量2E執(zhí)行命令25絕對磁盤讀2F多路轉(zhuǎn)接接口26絕對磁盤寫30~3F保留給DOS

DOS功能與BIOS功能都通過軟件中斷調(diào)用。基本步驟:(1)將調(diào)用參數(shù)裝入指定的寄存器中;(2)如需功能號,把它裝入AH;(3)如需子功能號,把它裝入AL;(4)按中斷號調(diào)用DOS或BIOS中斷;(5)檢查返回參數(shù)是否正確。4.5.1鍵盤I/O鍵盤由三種基本類型的鍵組成:(1)字符數(shù)字鍵,如字母A(a)一Z(z),數(shù)字0—9以及%、$,#等常用字符。(2)擴展功能鍵,如Home,End,Backspace,Arrows,Return,Delete,Insert,PgUp,PgD,以及程序功能鍵F1一F10等。(3)和其他鍵組合使用的控制鍵,如A1t,Ctrl和Shift等。字符數(shù)字鍵—ASCII碼字符;擴展功能鍵產(chǎn)生一個動作:如按下Home鍵能把光標(biāo)移到屏幕的左上角,End鍵使光標(biāo)移到屏幕上文本的末尾;組合控制鍵改變其他鍵所產(chǎn)生的字符碼。1.字符碼與掃描碼鍵盤上的每個鍵都對應(yīng)一個掃描碼,根據(jù)掃描碼就能唯一地確定哪一個鍵改變了狀態(tài)。字符碼是每個鍵代表的字符和符號的ASCII碼(祥見教材P150頁表4.6)

2.BIOS鍵盤中斷BIOS鍵盤中斷(INT16H)的中斷處理程序包括3個不同的功能:AH功能返回參數(shù)0從鍵盤讀一字符AL=字符碼,AH=掃描碼1讀鍵盤緩沖區(qū)的字符如ZF=0,AL=字符碼,AH=掃描碼ZF=1,緩沖區(qū)空2取鍵盤狀態(tài)字節(jié)AL=鍵盤狀態(tài)字節(jié)調(diào)用方法:(1)功能號送入AH(2)執(zhí)行INT16H的BIOS中斷例如,要查看按鍵的掃描碼和ASCII碼,可以調(diào)用中斷類型16H的0功能。

MOVAH,0;AH←功能號0,INT16HMOVBX,AX;(AX)=(BX)=掃描碼和ASCII碼CALLBINHEX;調(diào)用二進制轉(zhuǎn)換十六進制的子程序

鍵盤上不具有ASCII碼的鍵,如Shift、Ctrl、Alt、NumLock、Scro11、Ins和Capslock等,按動了它們能改變其他鍵所產(chǎn)生的代碼。是通過鍵盤狀態(tài)字節(jié)進行判斷按動與否。

1=按下右移鍵RSHIFT1=按下左移鍵LSHIFT1=按下控制鍵CTRL1=按下交替鍵ALT1=SCOLLLOCK狀態(tài)已變1=NUMLOCK狀態(tài)已變1=CAPSLOCK狀態(tài)已變1=INSERT狀態(tài)已變鍵盤狀態(tài)字節(jié)KB-FLAG

例:讀取鍵盤狀態(tài)字節(jié),并以十六進制打印出來。MOVAH,02H

INT16H;BIOS16H中斷MOVBX,AX;(AX)=(BX)=鍵盤狀態(tài)字節(jié)CALLBINIHEX;轉(zhuǎn)換十六進制打印MOVDL,0DH;顯示CR字符(02號DOS功能調(diào)用)MOVAH,02HAGAIN:MOVAH,02H;功能號02H→AHINT21HJMPAGAIN

3.DOS鍵盤功能調(diào)用

DOS鍵盤操作(INT21H功能調(diào)用)AH功能調(diào)用參數(shù)返回參數(shù)1輸入一個字符并顯示AL=字符

(檢測Ctrl-C或Ctrl-break,并調(diào)用INT23H結(jié)束程序)6讀鍵盤字符,不回顯DL=0FFH有字符,AL=字符,ZF=0無字符,AL=0,ZF=17輸入一個字符不顯示AL=字符

(不支持檢測Ctrl-C或Ctrl-break)8輸入一個字符不顯示AL=字符

(檢測Ctrl-C或Ctrl-break,并調(diào)用INT23H結(jié)束程序)A輸入字符到緩沖區(qū)DS:DX;緩沖區(qū)首址B讀鍵盤狀態(tài)AL=0FFH有鍵入AL=00H無鍵入C清除鍵盤緩沖區(qū)AL=鍵盤功能號調(diào)用一種鍵盤功能(1、6、7、8、A)(1)單字符輸入交互程序中常常需要用戶對一個提示做出應(yīng)答,例如,程序顯示出一串信息,要求你回答Y或N,回答Y,程序?qū)⑥D(zhuǎn)入標(biāo)號為YES的程序段,而回答N使程序轉(zhuǎn)入標(biāo)號為NO的程序段,按下其他鍵程序就等待。GET-KEY:MOVAH,1;AH←功能號1INT21HCMPAL,’Y’;是Y嗎?JEYES;是Y,轉(zhuǎn)程序YESCMPAL,’N’;是N嗎?JENO;是N,轉(zhuǎn)程序NOJNEGET-KEY;等待輸入Y或N如果想檢測Enter(Return)鍵,就要在指令中寫出它的ASCII碼0DH,例如:

WAIT-HERE:MOVAH,7;檢測鍵,但不顯示或不執(zhí)行INT21HCMPAL,0DH;是Enter嗎?(0DH回車鍵的ASCII碼)JNEWAIT-HERE

要求程序能接收功能鍵或數(shù)字組合鍵必須進行兩次DOS調(diào)用,第一次回送00,第二次回送掃描碼。例如,程序顯示出一個菜單,要求用戶通過鍵入F1,F(xiàn)2或F3來選擇1,2或3項,按其他鍵則產(chǎn)生錯誤信息。例:檢測鍵盤輸入的功能鍵

MOVAH,7INT21H;第一次回送00CMPAL,0JEGET-EC;為0,功能鍵JMPERROR;非0,轉(zhuǎn)錯誤信息GET-EC:MOVAH,7INT21HCMPAL,3BH;F1?JEOPTION1CMPAL,3CH;F2?JEOPTION2CMPAL,3DH;F3?JEOPTION3JMPERROR;都不是,轉(zhuǎn)錯誤信息

(2)輸入字符串中斷21H的A功能從鍵盤讀入一串字符并把它存人用戶定義的緩沖區(qū)中。緩沖區(qū)的第一個字節(jié)為預(yù)輸入數(shù),第二個字節(jié)為實際輸入數(shù),第三個字節(jié)起是輸入的字符串,最后一個為回車(0DH)。例如:

LAMLENDB32ACTLENDB?STRINGDB32DUP(?);建立緩沖區(qū)執(zhí)行輸入字符串的指令:

LEADXMAXLENMOVAH,0AHINT21H假定輸入字符串為:ABCDEFGH……XYZ↙的緩沖區(qū):實際輸入字符數(shù)26(1AH)預(yù)定輸入字符數(shù)20H1AHABCDEFGXYZ↙CX←實際字符數(shù)DS:DX指向第一個字符可用如下指令:SUBAH,AHMOVAL,LAMLEN+1ADDDX,2

(3)清除鍵盤緩沖區(qū)0CH功能:清除鍵盤緩沖區(qū),再執(zhí)行AL指定的(1、6、7、8、AH)功能。例如:MOVAH,0CH;清除以前鍵入的字符MOVAL,08H;再執(zhí)行08號功能INT21H可以避免由于偶然超前打入的字符而出現(xiàn)的錯誤(4)檢驗鍵盤狀態(tài)0BH功能:如按鍵,則AL=0FFH,如沒按鍵,則AL=00,無論哪種都將繼續(xù)執(zhí)行程序中的下一條指令。例:未按鍵,程序不斷循環(huán),只要按下任意鍵,程序就退出循環(huán)并返回。

SOUNDER:……..……..MOVAH,0BHINT21HINCALJNZSOUNDERRET按鍵AL=0FFH,+1為0不按鍵AL=0,+1不為0故非0循環(huán)。

4.5.2顯示器I/O

1.字符屬性屏幕上的字符,在存儲器中由連續(xù)的兩個字節(jié)表示,一個字節(jié)保存ASCII碼,另一個字節(jié)保存字符的屬性。在屏幕上處理字母、數(shù)字以及一些字符圖形稱為文本方式。(1)單色字符顯示單色顯示屬性字節(jié):76543210

閃爍亮度0=正常顯示0=正常亮度1=閃爍顯示1=加強亮度

背景前景000=黑111=白000=黑111=白單色顯示的屬性表屬性值(二進制)屬性值(十六進制)顯示效果0000000000無顯示0000000101黑底白字,下劃線0000011107黑底白字,正常顯示000011110F黑底白字,高亮度0111000070白底黑字,反相顯示1000011187黑底白字,閃爍11110000F0白底黑字,反相閃爍(2)彩色字符顯示彩色文本顯示時,屬性字節(jié)選擇前景(顯示的字符)和背景的顏色。字符可以選擇16種顏色中的一種,背景有8種顏色可以選擇。

16色方式下的屬性字節(jié)BLRGBIRGB閃爍背景前景

16色字符方式顏色的組合顏色IRGB顏色IRGB顏色IRGB顏色IRGB黑0000灰1000紅0100淺紅1100藍(lán)0001淺藍(lán)1001品紅0101淺品紅1101綠0010淺綠1010棕0110黃1110青0011淺青1011灰白0111白1111背景顏色只能是表中I為0的8種顏色。如果前景和背景是同一種顏色,顯示出的字符是看不見的,但屬性字節(jié)中的位7可以使字符閃爍(BL=1)。2.BIOS顯示中斷中斷類型10H的部分顯示操作及所用的寄存器表AH功能調(diào)用參數(shù)返回參數(shù)1置光標(biāo)類型(CH)0~3=光標(biāo)開始行(CL)0~3=光標(biāo)結(jié)束行BH=頁號2置光標(biāo)位置DH=行DL=列3讀光標(biāo)位置BH=頁號CH/CL=光標(biāo)開始/結(jié)束行DH/DL=行/列AH功能調(diào)用參數(shù)返回參數(shù)5置當(dāng)前顯示頁AL=頁號6屏幕初始化或上卷AL=上卷行數(shù)AL=0全屏幕為空白BH=卷入行屬性CH=左上角行號CL=左上角列號DH=右下角行號DL=右下角列號7屏幕初始化或下卷AL=下卷行數(shù)AL=0全屏幕為空白BH=卷入行屬性CH=左上角行號CL=左上角列號DH=右下角行號DL=右下角列號8讀光標(biāo)位置的BH=顯示頁AH=屬性屬性和字符AL=字符AH

溫馨提示

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

評論

0/150

提交評論