匯編語言05課件_第1頁
匯編語言05課件_第2頁
匯編語言05課件_第3頁
匯編語言05課件_第4頁
匯編語言05課件_第5頁
已閱讀5頁,還剩82頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第5章教學(xué)重點(diǎn)在掌握基本的匯編語言程序設(shè)計方法之后,進(jìn)一步學(xué)習(xí)如何提高編程效率的各種實(shí)用方法:高級語言特性宏結(jié)構(gòu)模塊化5.1高級語言特性MASM6.0引入高級語言的程序設(shè)計特性條件控制偽指令.IF.ELSE.ENDIF循環(huán)控制偽指令.WHILE.ENDW.REPEAT.UNTIL過程聲明和過程調(diào)用偽指令.PROTO.INVOKE條件表達(dá)式中的操作符操作符功能操作符功能操作符功能==等于&&邏輯與CARRY?CF=1?!=不等于||邏輯或OVERFLOW?OF=1?>大于!邏輯非PARITY?PF=1?>=大于等于SIGN?SF=1?<小于&位測試ZERO?ZF=1?<=小于等于()改變優(yōu)先級第5章;單分支結(jié)構(gòu) .IFAX<0 negax .ENDIF movresult,ax;雙分支結(jié)構(gòu) .IFax==5 movbx,ax movax,0 .ELSE decax .ENDIF;雙分支結(jié)構(gòu) .IFax==5* cmpax,05h* jne@C0001 movbx,ax movax,0 .ELSE* jmp@C0003*@C0001: decax .ENDIF*@C0003:例題 .data_a sbyte?_b sbyte?_c sbyte?tag byte?

.code

.startup moval,_b imulal movbx,ax ;bx中為b2 moval,_a imul_c movcx,4 imulcx ;ax中為4ac例5.1-1/2 .ifswordptrbx>=ax ;比較二者大小

movtag,1 ;第一分支體:條件滿足,tag←1 .else

movtag,0 ;第二分支體:條件不滿足,tag←0 .endif

.exit0

例5.1-2/2WHILE循環(huán)結(jié)構(gòu)的流程圖第5章;WHILE結(jié)構(gòu) xorax,ax movcx,100

.whilecx!=0 addax,cx deccx

.endw movsum,ax求1~100之和;UNTIL結(jié)構(gòu) xorax,ax movcx,100

.repeat addax,cx deccx

.untilcx==0 movsum,ax要調(diào)用帶參數(shù)過程定義的過程,不應(yīng)采用CALL指令,因?yàn)楸容^煩瑣應(yīng)該采用過程調(diào)用偽指令I(lǐng)NVOKE使用INVOKE偽指令的前提是需要用PROTO偽指令對過程進(jìn)行聲明5.1.3過程聲明和過程調(diào)用偽指令過程名 PROC

調(diào)用距離

語言類型作用范圍<起始參數(shù)> USES寄存器列表,參數(shù):類型 LOCAL參數(shù)表

… ;匯編語言語句過程名 ENDP過程聲明偽指令:用于事先聲明過程的結(jié)構(gòu)過程名

PROTO

調(diào)用距離語言類型,參數(shù):類型過程調(diào)用偽指令

INVOKE

過程名,參數(shù),...如何調(diào)用;匯編語言程序:lt503.asm .modelsmallchecksumdPROTOc,:word,:word ;聲明過程 .stack .dataarray db12h,25h,0f0h,0a3h,3 db68h,71h,0cah,0ffh,90hcount equ$-array

;數(shù)組的元素個數(shù)result db? ;校驗(yàn)和 .code .startup

INVOKEchecksumd,count,offsetarray

;調(diào)用過程 movresult,al ;保存校驗(yàn)和 .exit0例5.3-1/2列表文件checksumdPROCcUSESbxcx,\ countp:word,arrayp:word

movbx,arrayp ;BX←數(shù)組的偏移地址

movcx,countp ;CX←數(shù)組的元素個數(shù) xoral,alsumd: addal,[bx] ;求和:AL←AL+DS:[BX] incbx loopsumd retchecksumdendp end例5.3-2/2列表文件;lt503.asm的列表文件(lt503.lst)

...INVOKEchecksumd,count,offsetarray* movax,wordptrOFFSETarray* pushax* movax,+000Ah* pushax* callchecksumd* addsp,04h

movresult,al

...例5.3-1/2指示該語句由匯編程序自動生成checksumdPROCcUSESbxcx,\ countp:word,arrayp:word* pushbp ;起始代碼* movbp,sp* pushbx ;保護(hù)bx和cx* pushcx movbx,arrayp ;arrayp=[BP+6] movcx,countp ;countp=[BP+4] ...

ret* popcx ;結(jié)尾代碼* popbx* popbp* ret0000hchecksumcendp例5.3-2/2進(jìn)入調(diào)試程序觀察宏——具有宏名的一段匯編語句序列——宏定義時書寫宏指令——這段匯編語句序列的縮寫——宏調(diào)用時書寫宏展開——宏指令處用這段宏代替的過程——宏匯編時實(shí)現(xiàn)宏的參數(shù)功能強(qiáng)大,頗具特色配合宏,還有宏操作符和有關(guān)偽指令5.2.1宏匯編宏定義宏名 macro[形參表] 宏定義體

endmmainbegin MACRO

;;定義名為mainbegin的宏,無參數(shù) movax,@data ;;宏定義體 movds,ax

ENDM ;;宏定義結(jié)束mainend MACROretnum ;;帶有形參retnum moval,retnum ;;宏定義中使用參數(shù) movah,4ch int21h

ENDM宏注釋符宏展開宏展開——在匯編時,用宏定義體的代碼序列替代宏指令的過程。start: mainbegin ;宏指令1 movax,@data ;宏展開1 movds,ax

mainend0 ;宏指令1 moval,0 ;宏展開1 movah,4ch1 int21h宏的參數(shù)宏的參數(shù)使用非常靈活宏定義時,可以無參數(shù),例如5.4a的mainbegin可以帶有一個參數(shù),例如5.4a的mainend也可以具有多個參數(shù);例如5.5a的shlext參數(shù)可以是常數(shù)、變量、存儲單元、指令(操作碼)或它們的一部分,也可以是表達(dá)式;例如5.5b的shift和shrot宏定義體可以是任何合法的匯編語句,既可以是硬指令序列,又可以是偽指令序列;例如5.6的dstring;統(tǒng)一4條移位指令的宏指令shift macrosoprand,snum,sopcode pushcx movcl,snum s&sopcode&soprand,cl popcx endm;統(tǒng)一移位和循環(huán)移位8條指令的宏指令shrot macrosroprand,srnum,sropcode pushcx movcl,srnum

sropcodesroprand,cl popcx endm例5.5b替換操作符;宏定義dstring macrostring db’&string&’,0dh,0ah,’$’ endm;宏調(diào)用dstring <Thisisaexample.>dstring <0!<Number!<10>;宏展開1 db’Thisisaexample.’,0dh,0ah,’$’1 db’0<Number<10’,0dh,0ah,’$’例5.6轉(zhuǎn)義注釋符傳遞注釋符宏操作符;;——宏注釋符,用于表示在宏定義中的注釋。采用這個符號的注釋,在宏展開時不出現(xiàn)&——替換操作符,用于將參數(shù)與其他字符分開。如果參數(shù)緊接在其他字符之前或之后,或者參數(shù)出現(xiàn)在帶引號的字符串中,就必須使用該偽操作符第5章與宏有關(guān)的偽指令局部標(biāo)號偽指令LOCAL標(biāo)號列表宏定義體采用了標(biāo)號,應(yīng)使用LOCAL加以說明它必須是宏定義MACRO語句之后的第一條語句宏定義刪除偽指令PURGE宏名表不需要某個宏定義時,可以把它刪除宏定義退出偽指令EXITM偽指令EXITM表示結(jié)束當(dāng)前宏調(diào)用的展開;宏定義absol macrooprd localnext cmpoprd,0 jgenext negoprdnext: endm 例5.7;宏調(diào)用 absolwordptr[bx] absolbx;宏展開1 cmpwordptr[bx],01 jge??00001 negwordptr[bx]1 ??0000:1 cmpbx,01 jge??00011 negbx1 ??0001:單獨(dú)占一行比較僅是源程序級的簡化:宏調(diào)用在匯編時進(jìn)行程序語句的展開,不需要返回;不減小目標(biāo)程序,執(zhí)行速度沒有改變通過形參、實(shí)參結(jié)合實(shí)現(xiàn)參數(shù)傳遞,簡捷直觀、靈活多變還是目標(biāo)程序級的簡化:子程序調(diào)用在執(zhí)行時由CALL指令轉(zhuǎn)向、RET指令返回;形成的目標(biāo)代碼較短,執(zhí)行速度減慢需要利用寄存器、存儲單元或堆棧等傳遞參數(shù)宏子程序宏與子程序具有各自的特點(diǎn),程序員應(yīng)該根據(jù)具體問題選擇使用那種方法通常,當(dāng)程序段較短或要求較快執(zhí)行時,應(yīng)選用宏;當(dāng)程序段較長或?yàn)闇p小目標(biāo)代碼時,要選用子程序比較

結(jié)論宏子程序5.2.2重復(fù)匯編重復(fù)匯編指在匯編過程中,重復(fù)展開一段(基本)相同的語句重復(fù)匯編沒有名字,不能被調(diào)用重復(fù)匯編常用在宏定義體中,也可以在一般匯編語句中使用重復(fù)匯編偽指令有三個:REPEAT——按參數(shù)值重復(fù)FOR——按參數(shù)個數(shù)重復(fù)FORC——按參數(shù)的字符個數(shù)重復(fù)最后,用ENDM結(jié)束按參數(shù)值重復(fù)REPEAT重復(fù)次數(shù)重復(fù)體ENDMchar='A'REPEAT26dbcharchar=char+1ENDM1 dbchar ;等效于db'A'1 char=char+11 dbchar ;等效于db'B'1 char=char+1 ...1 dbchar ;等效于db'Z'1 char=char+1按參數(shù)個數(shù)重復(fù)FOR形參,〈實(shí)參表〉重復(fù)體ENDMFORregad,<ax,bx,cx,dx>pushregadENDM1 pushax1 pushbx1 pushcx1 pushdx按參數(shù)字符個數(shù)重復(fù)FORC

形參,字符串重復(fù)體ENDMFORCregad,dcbapop®ad&xENDM1 popdx1 popcx1 popbx1 popax5.2.3條件匯編條件匯編偽指令在匯編過程中,根據(jù)條件決定匯編的語句IFxx表達(dá)式

;滿足,匯編分支語句體1

分支語句體1[ELSE

;不滿足,匯編分支語句體2

分支語句體2]ENDIF

;條件匯編結(jié)束pdata macronum

IFnumlt100 ;;如果num<100,則匯編如下語句 dbnumdup(?)

ELSE ;;否則,匯編如下語句 db100dup(?)

ENDIF endm pdata12 ;宏調(diào)用① db12dup(?) ;宏匯編結(jié)果① pdata102 ;宏調(diào)用② db100dup(?) ;宏匯編結(jié)果②例5.10宏

結(jié)

構(gòu)

用宏匯編、重復(fù)匯編和條件匯編 為源程序的編寫提供了很多方便, 靈活運(yùn)用它們可以編寫出非常 良好的源程序來

匯編系統(tǒng)中有些以圓點(diǎn)起始的 偽指令(如.startup、.exit等) 實(shí)際上是一種宏結(jié)構(gòu)dstring MACROstring ;;定義字符串 db'&string&',0dh,0ah,'$' ENDMmainbegin MACROdsseg ;;設(shè)置數(shù)據(jù)段地址 movax,dsseg movds,ax ENDMdispmsg MACROmessage movdx,offsetmessage movah,09h int21h ENDM例題5.4-1/3mainend MACROretnum ;;返回DOS,可不帶參數(shù) ifb<retnum> movah,4ch ;;沒有參數(shù) else movax,4c00h+(retnumAND0ffh)

;;有參數(shù) endif int21h ENDM例題5.4-2/3

.modelsmall .stack256 .datamsg1 equthisbytedstring <Hello,Everybody!!>msg2 equthisbytedstring <Yousee,Imadeit.> .codestart: mainbegin@data ;建立DS內(nèi)容

dispmsgmsg1 ;顯示msg1字符串

dispmsgmsg2 ;顯示msg2字符串

mainend

;返回DOS endstart例題5.4-3/3將程序分段、采用子程序或宏結(jié)構(gòu)都是進(jìn)行模塊化程序設(shè)計介紹開發(fā)大型程序時采用的方法:源程序文件的包含目標(biāo)模塊連接子程序庫5.3模塊化程序設(shè)計例題5.12將鍵盤輸入的數(shù)據(jù)按升序輸出把源程序分放在幾個文本文件中,在匯編時通過包含偽指令I(lǐng)NCLUDE結(jié)合成一體INCLUDE

文件名可將常用的子程序形成.ASM匯編語言源文件可將常用的宏定義存放在.MAC宏庫文件中可將常量定義、聲明語句組織在.INC包含文件中例5.12a①宏庫文件lt512a.mac②主程序文件lt512a.asm③子程序文件sub512a.asm5.3.1源程序文件的包含1dispchar

macrochar ;顯示char字符

movdl,char movah,2 int21h endmdispmsg

macromessage ;顯示message字符串

movdx,offsetmessage movah,9 int21h endmLt512a.mac

includelt512a.mac

...

dispmsgmsg1 ;提示輸入數(shù)據(jù)

movbx,offsetbuf

callinput ;數(shù)據(jù)輸入

cmpcx,0 jestart4 ;沒有輸入數(shù)據(jù)則退出

movcount,cx ... ;顯示輸入的數(shù)據(jù) ... ;數(shù)據(jù)排序 ... ;顯示經(jīng)排序后的數(shù)據(jù)start4: .exit0

includesub512a.asm

endLt512a.asm子程序源文件有3個子程序ALdisp ;顯示2位16進(jìn)制數(shù)子程序(例4.10)sorting ;排序子程序(例4.8)input ;鍵盤輸入子程序還包含一個宏convert ;;將DX兩位ASCII碼轉(zhuǎn)換為兩位16進(jìn)制數(shù)sub512a.asm讓我們重點(diǎn)分析鍵盤輸入子程序input;鍵盤輸入子程序;入口參數(shù):ds:bx=存放數(shù)據(jù)的緩沖區(qū);出口參數(shù):cx=數(shù)據(jù)個數(shù)input

proc pushax pushdx xorcx,cx ;數(shù)據(jù)個數(shù)清0input01: xordx,dx ;輸入字符清0input02: movah,1 ;鍵盤輸入一個字符 int21hinput之一繼續(xù):input之二input10: cmpal,0dh jeinput30;是回車,結(jié)束整個數(shù)據(jù)的輸入

cmpal,’’ jeinput20;是空格和逗號,確認(rèn)輸入了一個數(shù)據(jù)

cmpal,’,’ jeinput20 cmpal,08h jeinput17;是退格,丟棄本次輸入的數(shù)據(jù),出錯input之二繼續(xù):input之三

cmpal,’0’

;有效數(shù)字判斷(圖5.2b)

jbinput17 ;小于’0’,不是有效數(shù)字,出錯

cmpal,’f’ jainput17

;大于’f’,不是有效數(shù)字

cmpal,’a’ jbinput11 subal,20h

;’a’~’f’轉(zhuǎn)換成大寫’A’~’F’

jmpinput12input11: cmpal,’F’ jainput17 ;字符小于’a’、大于’F’,出錯

cmpal,’A’ jaeinput12

;是’A’~’F’,有效字符

cmpal,’9’ jainput17

;是’0’~’9’,有效字符input之三繼續(xù):input之四input12: cmpdl,0 ;有效字符的處理

jneinput13 movdl,al;dl=0,輸入了一個數(shù)據(jù)的低位,則dl←al

jmpinput02 ;轉(zhuǎn)到字符輸入input13: cmpdh,0 jneinput17;dl≠0,dh≠0輸入3位數(shù)據(jù),出錯

movdh,dl;dl≠0,dh=0輸入了一個數(shù)據(jù)的高位

movdl,al ;dh←dl,dl←al

jmpinput02 ;轉(zhuǎn)到字符輸入input之四繼續(xù):input之五input17: movdl,7 ;輸入錯誤處理

movah,2 int21h movdl,'?' movah,2 int21h jmpinput01 ;轉(zhuǎn)到輸入一個數(shù)據(jù)input之五繼續(xù):input之六;轉(zhuǎn)換正確的輸入數(shù)據(jù)(圖5.2c)input20: convert

jmpinput01 ;轉(zhuǎn)到輸入一個數(shù)據(jù)input30: convert

popdx popax ret ;返回,出口參數(shù)已設(shè)定input endpinput之六繼續(xù):convert之一;;將DX兩位ASCII碼轉(zhuǎn)換為兩位16進(jìn)制數(shù)(圖5.2c)convert macro localinput21,input22 localinput24,input25 cmpdl,0 ;;dl=0,沒有要轉(zhuǎn)換的數(shù)據(jù),退出

jeinput25convert之一繼續(xù):convert之二

cmpdl,'9' jbeinput21 subdl,7 ;;字符A~F,則減7input21: anddl,0fh ;;轉(zhuǎn)換低位

cmpdh,0 ;;dh=0,沒有高位數(shù)據(jù)

jeinput24

cmpdh,'9' jbeinput22 subdh,7input22: shldh,1 shldh,1 shldh,1 shldh,1 ;;轉(zhuǎn)換高位

ordl,dh ;;合并高、低位convert之二繼續(xù):convert之三源文件包含的操作步驟:①分別編輯生成各個文件②匯編、連接主程序文件input24: mov[bx],dl ;;存入緩沖區(qū)

incbx inccx ;;數(shù)據(jù)加1input25: endmconvert之三把常用子程序?qū)懗瑟?dú)立的源程序文件,單獨(dú)匯編,形成子程序的目標(biāo)文件.OBJ主程序也經(jīng)過獨(dú)立匯編之后形成目標(biāo)文件連接程序?qū)⑺心繕?biāo)文件連接起來,最終產(chǎn)生可執(zhí)行文件需要遵循的原則:①聲明共用的變量、過程等②實(shí)現(xiàn)正確的段組合③處理好參數(shù)傳遞問題5.3.2目標(biāo)代碼文件的連接2聲明共用的變量、過程各個模塊間共用的變量、過程等要說明PUBLIC標(biāo)識符[,標(biāo)識符...] ;定義標(biāo)識符的模塊使用EXTERN

標(biāo)識符:類型[,標(biāo)識符:類型...] ;調(diào)用標(biāo)識符的模塊使用標(biāo)識符是變量名、過程名等類型是byte/word/dword(變量)或near/far(過程)在一個源程序中,public/extern語句可以有多條各模塊間的public/extern偽指令要互相配對,并且指明的類型互相一致實(shí)現(xiàn)正確的段組合子程序文件必須定義在代碼段中,也可以具有局部的數(shù)據(jù)變量采用簡化段定義格式,只要采用相同的存儲模式,容易實(shí)現(xiàn)正確的近或遠(yuǎn)調(diào)用完整段定義格式中,為了實(shí)現(xiàn)模塊間的段內(nèi)近調(diào)用(near類型),各自定義的段名、類別必須相同,組合類型都是public。實(shí)際的程序開發(fā)中,各個模塊往往由不同的程序員完成,不易實(shí)現(xiàn)段同名或類別相同,所以索性定義成遠(yuǎn)調(diào)用(far類型)定義數(shù)據(jù)段時,同樣也要注意這個問題。當(dāng)各個模塊的數(shù)據(jù)段不同時,要正確設(shè)置數(shù)據(jù)段DS寄存器的段基地址處理好參數(shù)傳遞問題少量參數(shù)可用寄存器或堆棧直接傳送數(shù)據(jù)本身大量數(shù)據(jù)可以安排在緩沖區(qū),用寄存器或堆棧傳送數(shù)據(jù)的存儲地址還可利用變量傳遞參數(shù),但是要采用public/extern聲明為公共(全局)變量這些也是子程序間的參數(shù)傳遞方法另外,第7章混合編程介紹了更好的堆棧傳遞參數(shù)方法,可以采用例5.12b主程序lt512b.asm并入宏定義子程序文件sub512b.asm,要加上段定義語句、聲明語句等,但不需要起始點(diǎn)和結(jié)束點(diǎn)模塊連接的操作步驟:①分別編輯生成各個文件②分別匯編各個文件③連接各個目標(biāo)文件,形成 可執(zhí)行文件 ... ;宏定義 .code

publiccount ;定義count共用

externALdisp:near,sorting:near,input:far ;聲明其他模塊中的子程序 .startup ... .exit0 ;去掉(lt512a.asm中的)包含語句 endLt512b.asm

.modelsmall ;定義同樣的存儲模式

externcount:word ;在其他模塊定義了字變量count

.code ;子程序在代碼段中

publicaldisp,sorting,input ;3個子程序是共用的Aldisp proc ;仍然作為近調(diào)用sorting proc ;仍然作為近調(diào)用input procfar ;修改為遠(yuǎn)調(diào)用 ...

movcount,cx ;提供出口參數(shù) ...input endp

end ;結(jié)束匯編sub512b.asm把常用子程序?qū)懗瑟?dú)立的源文件,單獨(dú)匯編形成OBJ文件后,存入子程序庫主程序也單獨(dú)匯編形成OBJ文件主程序連接時,調(diào)入子程序庫中的子程序模塊,產(chǎn)生最終的可執(zhí)行文件例5.12c①主程序文件lt512c.asm②子程序文件sub512c1.asm③子程序文件sub512c2.asm④子程序文件sub512c3.asm5.3.3子程序庫的調(diào)入3子程序庫子程序庫文件(.LIB)是子程序模塊的集合,其中存放著各子程序的名稱、目標(biāo)代碼及有關(guān)定位信息存入庫的子程序的編寫與目標(biāo)文件連接方法中的要求一樣,只是為方便調(diào)用,更加嚴(yán)格子程序文件編寫完成后,匯編形成目標(biāo)文件;然后利用庫管理工具程序LIB.EXE,把子程序目標(biāo)模塊逐一加入到庫中

LIB

庫文件名

+子程序目標(biāo)文件名庫管理程序LIB幫助創(chuàng)建、組織和維護(hù)子程序模塊庫,例如增加、刪除、替換、合并庫文件等第5章... ;宏定義.codeexternALdisp:near,sorting:near,input:near ;聲明其他模塊中的子程序.startup....exit0endLt512c.asm

.modelsmall .code publicaldispAldisp proc ...Aldisp endp

endsub512c1.asm

.modelsmall .code publicsortingsorting proc ...sorting endp

endsub512c2.asm

.modelsmall .code publicinputinput proc ...input endp

endsub512c3.asm庫文件調(diào)入的操作步驟:①分別編輯生成各個文件②分別匯編各個文件③用庫管理文件,將子程序模塊添加到庫文件(.LIB)中④連接主程序,提供庫文件, 形成可執(zhí)行文件補(bǔ)充例題將子程序應(yīng)用的例題4.13~4.15的子程序編寫成模塊,供主程序調(diào)用實(shí)現(xiàn)功能:從鍵盤輸入有符號十進(jìn)制數(shù),求它們的平均值,然后輸出源程序文件進(jìn)行簡單修改主程序文件子程序文件利用目標(biāo)代碼文件的連接形成可執(zhí)行文件 .modelsmallexternread:near,write:near,mean:near

;外部子程序

publicwtemp

;變量共用 .stack

.data … ;數(shù)據(jù)定義 .code … ;輸入、計算和輸出 end主程序文件 .modelsmall

publicread,write,mean

;子程序共用

externwtemp:word

;外部變量 .code ;代碼段read proc …… ;輸入子程序readwrite proc …… ;輸出子程序writemean proc …… ;計算平均值子程序mean end子程序文件5.4輸入輸出程序設(shè)計輸入指令I(lǐng)N從外設(shè)讀取數(shù)據(jù)輸出OUT指令向外設(shè)提供數(shù)據(jù)處理器通過I/O接口控制外設(shè)參考I/O指令第2.1.5節(jié)建議結(jié)合硬件相關(guān)課程學(xué)習(xí)5.4.1程序直接控制輸入輸出程序執(zhí)行IN或OUT指令實(shí)現(xiàn)數(shù)據(jù)傳送 .modeltiny ;形成com格式的程序 .code .startup

callspeaker_on

;打開揚(yáng)聲器聲音 movah,1 ;等待按鍵 int21h

callspeaker_off ;關(guān)閉揚(yáng)聲器聲音 .exit0例5.13:主程序speaker_onproc ;揚(yáng)聲器開子程序

pushax

inal,61h ;讀取原來控制信息

oral,03h ;D1D0=PB1PB0=11b

out61h,al ;直接控制發(fā)聲

popax retspeaker_onendp例5.13:子程序揚(yáng)聲器關(guān);揚(yáng)聲器關(guān)子程序speaker_off

andal,0fch ;D1D0=PB1PB0=00b

5.4.2程序查詢輸入輸出程序需要查詢外設(shè)狀態(tài),然后進(jìn)行數(shù)據(jù)交換實(shí)際的輸入輸出程序可以規(guī)定一個超時參數(shù)打印機(jī)查詢輸出的控制:要打印的字符首先提供給數(shù)據(jù)端口然后查詢狀態(tài)端口,確定打印機(jī)是否可以接受如果打印機(jī)還沒有準(zhǔn)備好接受數(shù)據(jù),則繼續(xù)檢測一個固定時間如果打印機(jī)能夠接受數(shù)據(jù),處理器利用控制端口將數(shù)據(jù)提供給打印機(jī) movcx,(sizeofokmsg)-1 movsi,offsetokmsgprnbegin:

movdx,378h ;打印機(jī)基地址

movbx,100 ;超時參數(shù)

moval,[si] ;打印字符

callprintchar ;調(diào)用打印子程序

jcprnerr ;CF=1,不能打印

incsi ;CF=0,打印正常

loopprnbegin ;繼續(xù)

movdx,offsetokmsg;顯示正確

jmpprnokprnerr: movdx,offseterrmsg;顯示錯誤prnok: movah,9 int21h例5.14:主程序printcharproc pushcx

outdx,al ;向數(shù)據(jù)端口輸出打印字符

incdx ;基地址加1成為狀態(tài)端口print0: subcx,cxprint1: inal,dx ;查詢狀態(tài)端口

testal,80h ;最高位D7反映打印機(jī)狀態(tài)

jnzprint2 ;D7=1,可以接收打印數(shù)據(jù)

loopprint1 ;D7=0,不能接收打印數(shù)據(jù)

decbl ;超時參數(shù)減1

jnzprint0 ;循環(huán)檢測

stc ;規(guī)定時間內(nèi)沒有準(zhǔn)備好

jmpprint3 ;退出打印例5.14:打印子程序1/2print2: incdx ;基地址再加1成為控制端口 moval,0dh ;使最低位D0=1

outdx,al nop ;延時 moval,0ch ;使最低位D0=0

outdx,al

;產(chǎn)生選通脈沖,將打印字符送入打印機(jī)

clc

;設(shè)置正常標(biāo)志CF=0print3: popcx ret ;返回printcharendp例5.14:打印子程序2/25.4.3中斷服務(wù)程序需要交換數(shù)據(jù)的外設(shè),采用中斷請求向處理器提出要求處理器執(zhí)行事先設(shè)計好的中斷服務(wù)程序,在中斷服務(wù)程序當(dāng)中實(shí)現(xiàn)數(shù)據(jù)交換8086可以處理256種中斷,分為內(nèi)部、外部兩種類型外部可屏蔽中斷用于與外設(shè)進(jìn)行數(shù)據(jù)交換1.內(nèi)部中斷服務(wù)程序主程序通過中斷調(diào)用指令I(lǐng)NTn執(zhí)行內(nèi)部中斷服務(wù)程序,其實(shí)質(zhì)相當(dāng)于子程序調(diào)用編寫內(nèi)部中斷服務(wù)程序與編寫子程序雷同利用過程定義偽指令PROC/ENDP但通常要執(zhí)行STI指令開放可屏蔽中斷最后執(zhí)行IRET指令返回調(diào)用程序內(nèi)部中斷服務(wù)程序常用寄存器傳遞參數(shù)設(shè)置中斷向量:AH=25H(INT21H)獲取中斷向量:AH=35H(INT21H) .dataintoff dw?

;保存原偏移地址intseg dw?

;保存原段地址 .code

movax,3580h ;獲取中斷80H的中斷向量 int21h movintoff,bx ;保存偏移地址 movintseg,es ;保存段基地址例5.15a:1/5獲取中斷向量:AH=35H(INT21H)入口參數(shù):AL=中斷向量號出口參數(shù):ES:BX=中斷服務(wù)程序的入口地址(段基地址:偏移地址)

pushds

movdx,offsetnewint80h movax,segnewint80h movds,ax movax,2580h ;設(shè)置中斷80H的入口地址 int21h

popds例5.15a:2/5設(shè)置中斷向量:AH=25H(INT21H)入口參數(shù):AL=中斷向量號ES:BX=中斷服務(wù)程序的段基地址:偏移地址

int80h

;調(diào)用中斷80h的服務(wù)程序,顯示信息 movdx,intoff ;恢復(fù)中斷80H的入口地址 movax,intseg movds,ax movax,2580h int21h .exit0 ;返回DOS例5.15a:3/5設(shè)置中斷向量:AH=25H(INT21H)入口參數(shù):AL=中斷向量號ES:BX=中斷服務(wù)程序的段基地址:偏移地址newint80h proc ;內(nèi)部中斷服務(wù)程序

sti ;開中斷 pushax ;保護(hù)現(xiàn)場 pushbx pushcx pushsi movsi,offsetintmsg ;獲取顯示字符串首地址 movcx,sizeofintmsg ;獲取顯示字符串個數(shù)例5.15a:4/5disp: moval,cs:[si] ;獲取顯示字符 movbx,0 ;顯示一個字符 movah,0eh int10h incsi loopdisp popsi ;恢復(fù)現(xiàn)場 popcx popbx popax

iret

;中斷返回intmsg db'IamGreat!',0dh,0ah ;顯示信息newint80h endp例5.15a:5/52.駐留中斷服務(wù)程序駐留TSR程序:程序執(zhí)行結(jié)束,但保留在系統(tǒng)主存中,可以讓其他程序使用方法:利用DOS功能31h代替4ch終止程序程序駐留返回:AH=25H(INT21H)入口參數(shù):AL=返回代碼DX=程序駐留的容量(節(jié),1節(jié)=16個字節(jié)) .modeltiny .code .startup ;等價于org100h

jmpstart ;跳轉(zhuǎn)到本程序的開始位置newint80h proc ;駐留的中斷服務(wù)程序 ... ;同例題5.15a過程newint80h endp ;中斷服務(wù)程序結(jié)束start: movax,cs ;主程序開始位置 movds,ax movdx,offsetnewint80h movax,2580h int21h ;設(shè)置80h的中斷向量

int80h ;調(diào)用一下看看例5.15b:1/2 movdx,offsetistmsg ;顯示駐留成功 movah,9 int21h

movdx,(offsetstart)+15

;計算駐留程序的長度(需多加15個字節(jié))

movcl,4 shrdx,cl ;除以16轉(zhuǎn)換成“節(jié)”

movax,3100h

;中斷服務(wù)

溫馨提示

  • 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

提交評論