版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025至2030年中國鈉燈蓋數(shù)據(jù)監(jiān)測研究報告
- 2025至2030年中國纖瘦茶數(shù)據(jù)監(jiān)測研究報告
- 2025年中國重型工件噴漆線市場調(diào)查研究報告
- 2025年中國紫圓茄種子市場調(diào)查研究報告
- 2025年中國橡膠切割機(jī)市場調(diào)查研究報告
- 2025版智慧城市基礎(chǔ)設(shè)施建設(shè)拓展合作協(xié)議3篇
- 二零二五年度科技展廳場地租賃合同印花稅支付協(xié)議3篇
- 二零二五年度足浴店線上線下融合運(yùn)營模式轉(zhuǎn)讓協(xié)議
- 二零二五年度車輛不過戶責(zé)任免除保障協(xié)議
- 2025年度個人藝術(shù)品拍賣委托協(xié)議2篇
- 《openEuler操作系統(tǒng)》考試復(fù)習(xí)題庫(含答案)
- 《天潤乳業(yè)營運(yùn)能力及風(fēng)險管理問題及完善對策(7900字論文)》
- 醫(yī)院醫(yī)學(xué)倫理委員會章程
- xx單位政務(wù)云商用密碼應(yīng)用方案V2.0
- 2024-2025學(xué)年人教版生物八年級上冊期末綜合測試卷
- 2025年九省聯(lián)考新高考 語文試卷(含答案解析)
- 死亡病例討論總結(jié)分析
- 第二章 會展的產(chǎn)生與發(fā)展
- 空域規(guī)劃與管理V2.0
- JGT266-2011 泡沫混凝土標(biāo)準(zhǔn)規(guī)范
- 商戶用電申請表
評論
0/150
提交評論