第三章指令系統(tǒng)2_第1頁
第三章指令系統(tǒng)2_第2頁
第三章指令系統(tǒng)2_第3頁
第三章指令系統(tǒng)2_第4頁
第三章指令系統(tǒng)2_第5頁
已閱讀5頁,還剩63頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

教學(xué)提示在正確理解每條指令的功能基礎(chǔ)上,可以閱讀和編寫有實(shí)際意義的程序段多多閱讀程序段3.3位操作類指令位操作類指令以二進(jìn)制位為基本單位進(jìn)行數(shù)據(jù)的操作;這是一類常用的指令,都應(yīng)該特別掌握注意這些指令對標(biāo)志位的影響1、邏輯運(yùn)算指令A(yù)NDORXORNOTTEST2、移位指令SHLSHRSALSAR3、循環(huán)移位指令ROLRORRCLRCR邏輯與指令A(yù)ND對兩個操作數(shù)執(zhí)行邏輯與運(yùn)算,結(jié)果送到目的操作數(shù)AND指令設(shè)置CF=OF=0,根據(jù)結(jié)果設(shè)置SF、ZF和PF狀態(tài),而對AF未定義ANDreg,imm/reg/mem;reg←reg∧imm/reg/memANDmem,imm/reg;mem←mem∧imm/reg只有相“與”的兩位都是1,結(jié)果才是1;否則,“與”的結(jié)果為0AND邏輯或指令OR對兩個操作數(shù)執(zhí)行邏輯或運(yùn)算,結(jié)果送到目的操作數(shù)OR指令設(shè)置CF=OF=0,根據(jù)結(jié)果設(shè)置SF、ZF和PF狀態(tài),而對AF未定義ORreg,imm/reg/mem;reg←reg∨imm/reg/memORmem,imm/reg;mem←mem∨imm/reg只要相“或”的兩位有一位是1,結(jié)果就是1;否則,結(jié)果為0OR邏輯異或指令XOR對兩個操作數(shù)執(zhí)行邏輯異或運(yùn)算,結(jié)果送到目的操作數(shù)XOR指令設(shè)置CF=OF=0,根據(jù)結(jié)果設(shè)置SF、ZF和PF狀態(tài),而對AF未定義XORreg,imm/reg/mem;reg←reg⊕imm/reg/memXORmem,imm/reg;mem←mem⊕imm/reg只有相“異或”的兩位不相同,結(jié)果才是1;否則,結(jié)果為0XOR邏輯非指令NOT對一個操作數(shù)執(zhí)行邏輯非運(yùn)算NOT指令是一個單操作數(shù)指令NOT指令不影響標(biāo)志位NOTreg/mem;reg/mem←~reg/mem按位取反,原來是“0”的位變?yōu)椤?”;原來是“1”的位變?yōu)椤?”NOT例題:邏輯運(yùn)算moval,45h ;邏輯與al=01handal,31h ;CF=OF=0,SF=0、ZF=0、PF=0moval,45h ;邏輯或al=75horal,31h ;CF=OF=0,SF=0、ZF=0、PF=0moval,45h ;邏輯異或al=74hxoral,31h ;CF=OF=0,SF=0、ZF=0、PF=1moval,45h ;邏輯非al=0bahnotal ;標(biāo)志不變例題:邏輯指令應(yīng)用;AND指令可用于復(fù)位某些位(同0相與),不影響其他位.例:將BL中D3和D0位清0,其他位不變andbl,11110110B例:將AL中的字符‘8’轉(zhuǎn)換成對應(yīng)的數(shù)字8.moval,‘8’

andal,0fh;方法一subal,‘0’;方法二例題:邏輯指令應(yīng)用;OR指令可用于置位某些位(同1相或),不影響其他位。例:將BL中D3和D0位置1,其他位不變orbl,00001001B;XOR指令可用于求反某些位(同1相異或),不影響其他位。例:將BL中D3和D0位求反,其他不變xorbl,00001001B測試指令TEST對兩個操作數(shù)執(zhí)行邏輯與運(yùn)算,結(jié)果不回送到目的操作數(shù)AND指令設(shè)置CF=OF=0,根據(jù)結(jié)果設(shè)置SF、ZF和PF狀態(tài),而對AF未定義TESTreg,imm/reg/mem ;reg∧imm/reg/memTESTmem,imm/reg ;mem∧imm/reg只有相“與”的兩位都是1,結(jié)果才是1;否則,“與”的結(jié)果為0TEST例3.32:測試為0或1testal,01h

;測試AL的最低位D0jnzthere ;標(biāo)志ZF=0,即D0=1 ;則程序轉(zhuǎn)移到there... ;否則ZF=1,即D0=0,順序執(zhí)行there:...

TEST指令通常用于檢測一些條件是否滿足,但又不希望改變原操作數(shù)的情況TEST思考:若要測試ax中的第8、10位是否同時位1,如何實(shí)現(xiàn)?第一步:將第8、10位翻轉(zhuǎn)xorax,0500h第二步:測試第8、10位是否同時為0testax,0500h若結(jié)果為0則說明以上兩位同時為1移位指令(shift)將操作數(shù)移動一位或多位,分成邏輯移位和算術(shù)移位,分別具有左移或右移操作SHLreg/mem,1/CL;邏輯左移,最高位進(jìn)入CF,最低位補(bǔ)0SHRreg/mem,1/CL;邏輯右移,最低位進(jìn)入CF,最高位補(bǔ)0SALreg/mem,1/CL;算術(shù)左移,最高位進(jìn)入CF,最低位補(bǔ)0SARreg/mem,1/CL;算術(shù)右移,最低位進(jìn)入CF,最高位不變SAL與SHL相同演示演示演示移位指令的操作數(shù)移位指令的第一個操作數(shù)是指定的被移位的操作數(shù),可以是寄存器或存儲單元后一個操作數(shù)表示移位位數(shù)(1)1,表示移動一位;(2)CL,移位位數(shù)大于1,用CL寄存器值表示移位指令對標(biāo)志的影響按照移入的位設(shè)置進(jìn)位標(biāo)志CF根據(jù)移位后的結(jié)果影響SF、ZF、PF對AF沒有定義如果進(jìn)行一位移動,則按照操作數(shù)的最高符號位是否改變,相應(yīng)設(shè)置溢出標(biāo)志OF:如果移位前的操作數(shù)最高位與移位后操作數(shù)的最高位不同(有變化),則OF=1;否則OF=0。當(dāng)移位次數(shù)大于1時,OF不確定例3.33:移位指令movcl,4moval,0f0h ;al=f0hshlal,1 ;al=e0h;CF=1,SF=1、ZF=0、PF=0,OF=0shral,1 ;al=70h;CF=0,SF=0、ZF=0、PF=0、OF=1saral,1 ;al=38h;CF=0,SF=0、ZF=0、PF=0、OF=0saral,cl ;al=03h;CF=1,SF=0、ZF=0、PF=1分析下面每次移位后,AH、CF中的值各是多少?MOVAH,11HSHLAH,1MOVCL,2SHLAH,CL思考:左移一位相當(dāng)于乘以幾?例3.34:移位實(shí)現(xiàn)乘movsi,axshlsi,1 ;si←2×axaddsi,ax ;si←3×axmovdx,bxmovcl,03hshldx,cl ;dx←8×bxsubdx,bx ;dx←7×bxadddx,si ;dx←7×bx+3×ax邏輯左移一位相當(dāng)于無符號數(shù)乘以2

邏輯右移一位相當(dāng)于無符號數(shù)除以2循環(huán)移位指令(rotate)將操作數(shù)從一端移出的位返回到另一端形成循環(huán),分成不帶進(jìn)位和帶進(jìn)位,分別具有左移或右移操作ROLreg/mem,1/CL;不帶進(jìn)位循環(huán)左移RORreg/mem,1/CL;不帶進(jìn)位循環(huán)右移RCLreg/mem,1/CL;帶進(jìn)位循環(huán)左移RCRreg/mem,1/CL;帶進(jìn)位循環(huán)右移演示演示演示演示循環(huán)移位指令對標(biāo)志的影響按照指令功能設(shè)置進(jìn)位標(biāo)志CF不影響SF、ZF、PF、AF如果進(jìn)行一位移動,則按照操作數(shù)的最高符號位是否改變,相應(yīng)設(shè)置溢出標(biāo)志OF:如果移位前的操作數(shù)最高位與移位后操作數(shù)的最高位不同(有變化),則OF=1;否則OF=0。當(dāng)移位次數(shù)大于1時,OF不確定例3.35:32位數(shù)移位;將DX.AX中32位數(shù)值左移一位shlax,1rcldx,1DXAXCF0例3.36:位傳送;把AL最低位送BL最低位,保持AL不變rorbl,1roral,1rclbl,1rolal,1AL、BLCFBLCFALCFAL之D0例3.37:BCD碼合并;AH.AL分別存放著非壓縮BCD碼的兩位;將它們合并成為一個壓縮BCD碼存ALandax,0f0fh ;保證高4位為0movcl,4rolah,cl ;也可以用shlah,claddal,ah ;也可以用oral,ah3.4控制轉(zhuǎn)移類指令控制轉(zhuǎn)移類指令用于實(shí)現(xiàn)分支、循環(huán)、過程等程序結(jié)構(gòu),是僅次于傳送指令的最常用指令重點(diǎn)掌握:JMP、Jcc、LOOP常用系統(tǒng)功能調(diào)用int21h一般了解:LOOPZ、LOOPNZ、INTO、CALL、RET、INTn、IRET

控制轉(zhuǎn)移類指令通過改變IP(和CS)值,實(shí)現(xiàn)程序執(zhí)行順序的改變3.4.1無條件轉(zhuǎn)移指令JMP3.4.2條件轉(zhuǎn)移指令JCC3.4.3循環(huán)指令LOOPJCXZ3.4.4~5子程序指令、中斷指令(以后講)3.4.6系統(tǒng)功能調(diào)用INT21H3.4.1無條件轉(zhuǎn)移指令只要執(zhí)行無條件轉(zhuǎn)移指令JMP,就使程序轉(zhuǎn)到指定的目標(biāo)地址處,從目標(biāo)地址處開始執(zhí)行那里的指令操作數(shù)label是要轉(zhuǎn)移到的目標(biāo)地址(目的地址、轉(zhuǎn)移地址)JMP指令分成4種類型:⑴段內(nèi)轉(zhuǎn)移、直接尋址(重點(diǎn)掌握)⑵段內(nèi)轉(zhuǎn)移、間接尋址⑶段間轉(zhuǎn)移、直接尋址⑷段間轉(zhuǎn)移、間接尋址JMPlabel ;程序轉(zhuǎn)向label標(biāo)號指定的地址JMP第2章目標(biāo)地址的尋址方式直接尋址方式轉(zhuǎn)移地址象立即數(shù)一樣,直接在指令的機(jī)器代碼中,就是直接尋址方式間接尋址方式轉(zhuǎn)移地址在寄存器或主存單元中,就是通過寄存器或存儲器的間接尋址方式第2章用標(biāo)號表達(dá)用寄存器或存儲器操作數(shù)表達(dá)JMP目標(biāo)地址的范圍:段內(nèi)段內(nèi)轉(zhuǎn)移——近轉(zhuǎn)移(near)在當(dāng)前代碼段64KB范圍內(nèi)轉(zhuǎn)移(±32KB范圍)不需要更改CS段地址,只要改變IP偏移地址段內(nèi)轉(zhuǎn)移——短轉(zhuǎn)移(short)轉(zhuǎn)移范圍可以用一個字節(jié)表達(dá),在段內(nèi)-128~+127范圍的轉(zhuǎn)移代碼段代碼段第2章JMP目標(biāo)地址的范圍:段間段間轉(zhuǎn)移——遠(yuǎn)轉(zhuǎn)移(far)從當(dāng)前代碼段跳轉(zhuǎn)到另一個代碼段,可以在1MB范圍需要更改CS段地址和IP偏移地址目標(biāo)地址必須用一個32位數(shù)表達(dá),叫做32位遠(yuǎn)指針,它就是邏輯地址第2章代碼段代碼段

實(shí)際編程時,匯編程序會根據(jù)目標(biāo)地址的距離,自動處理成短轉(zhuǎn)移、近轉(zhuǎn)移或遠(yuǎn)轉(zhuǎn)移程序員可用操作符short、nearptr

或farptr

強(qiáng)制JMPJMP段內(nèi)轉(zhuǎn)移、直接尋址JMPlabel ;IP←IP+位移量位移量是緊接著JMP指令后的那條指令的偏移地址,到目標(biāo)指令的偏移地址的地址位移當(dāng)向地址增大方向轉(zhuǎn)移時,位移量為正;向地址減小方向轉(zhuǎn)移時,位移量為負(fù) jmpagain

;轉(zhuǎn)移到again處繼續(xù)執(zhí)行

……again:

deccx

;標(biāo)號again的指令

…… jmpoutput

;轉(zhuǎn)向output

……output:

movresult,al

;標(biāo)號output的指令第2章實(shí)際為相對尋址段內(nèi)轉(zhuǎn)移、間接尋址JMPr16/m16 ;IP←r16/m16將一個16位寄存器或主存字單元內(nèi)容送入IP寄存器,作為新的指令指針,但不修改CS寄存器的內(nèi)容jmpax ;IP←AXjmpwordptr[2000h] ;IP←[2000h]

第2章JMPJMP段間轉(zhuǎn)移、直接尋址JMPfarptrlabel ;IP←label的偏移地址 ;CS←label的段地址將標(biāo)號所在段的段地址作為新的CS值,標(biāo)號在該段內(nèi)的偏移地址作為新的IP值;這樣,程序跳轉(zhuǎn)到新的代碼段執(zhí)行jmpfarptrotherseg ;遠(yuǎn)轉(zhuǎn)移到代碼段2的otherseg第2章JMP段間轉(zhuǎn)移、間接尋址JMPfarptrmem ;IP←[mem],CS←[mem+2]用一個雙字存儲單元表示要跳轉(zhuǎn)的目標(biāo)地址。這個目標(biāo)地址存放在主存中連續(xù)的兩個字單元中的,低位字送IP寄存器,高位字送CS寄存器movwordptr[bx],0movwordptr[bx+2],1500hJMPfarptr[bx];轉(zhuǎn)移到1500h:0第2章JMP3.4.2條件轉(zhuǎn)移指令指定的條件cc如果成立,程序轉(zhuǎn)移到由標(biāo)號label指定的目標(biāo)地址去執(zhí)行指令;條件不成立,則程序?qū)㈨樞驁?zhí)行下一條指令操作數(shù)label是采用短轉(zhuǎn)移,稱為相對尋址方式JccJcclabel;條件滿足,發(fā)生轉(zhuǎn)移:IP←IP+8位位移量;條件不滿足,順序執(zhí)行第2章相對尋址方式Jcc指令的操作數(shù)label是一個標(biāo)號一個8位位移量,表示Jcc指令后的那條指令的偏移地址,到目標(biāo)指令的偏移地址的地址位移8位位移量是相對于當(dāng)前IP的,且距當(dāng)前IP地址-128~+127個單元的范圍之內(nèi),屬于段內(nèi)短距離轉(zhuǎn)移Jcc目標(biāo)地址就采用這種相對尋址方式Jcc指令為2個字節(jié),條件不滿足時的順序執(zhí)行就是當(dāng)前指令偏移指針I(yè)P加2JccJcc指令的分類Jcc指令不影響標(biāo)志,但要利用標(biāo)志(表3.2)。根據(jù)利用的標(biāo)志位不同,16條指令分成3種情況:判斷單個標(biāo)志位狀態(tài)(重點(diǎn)掌握一個,其它類似)3.

比較無符號數(shù)高低3.比較有符號數(shù)大小Jcc條件轉(zhuǎn)移指令中的條件ccJcc實(shí)際雖然指令只有16條,但卻有30個助記符采用多個助記符,只是為了方便記憶和使用1.判斷單個標(biāo)志位狀態(tài)這組指令單獨(dú)判斷5個狀態(tài)標(biāo)志之一⑴JZ/JE和JNZ/JNE:利用零標(biāo)志ZF,判斷結(jié)果是否為零(或相等)⑵JS和JNS:利用符號標(biāo)志SF,判斷結(jié)果是正是負(fù)⑶JO和JNO:利用溢出標(biāo)志OF,判斷結(jié)果是否產(chǎn)生溢出⑷JP/JPE和JNP/JPO:利用奇偶標(biāo)志PF,判斷結(jié)果中“1”的個數(shù)是偶是奇⑸JC/JB/JNAE和JNC/JNB/JAE:利用進(jìn)位標(biāo)志CF,判斷結(jié)果是否進(jìn)位或借位Jcc例題3.38例題3.39例題3.40例題3.41例題3.42例3.38:JZ/JNZ指令 testal,80h ;測試最高位

jznext0 ;D7=0(ZF=1),轉(zhuǎn)移 movah,0ffh ;D7=1,順序執(zhí)行

jmpdone ;無條件轉(zhuǎn)向next0: movah,0done: ... testal,80h ;測試最高位

jnznext1 ;D7=1(ZF=0),轉(zhuǎn)移 movah,0 ;D7=0,順序執(zhí)行

jmpdone ;無條件轉(zhuǎn)向next1: movah,0ffhdone: ...例3.39:JS/JNS指令;計算|X-Y|(絕對值);X和Y為存放于X單元和Y單元的16位操作數(shù);結(jié)果存入result movax,X subax,Y

jnsnonneg negax ;neg是求補(bǔ)指令nonneg: movresult,ax源程序見:EX2_39.ASM并分析分支結(jié)構(gòu)例3.40:JO/JNO指令;計算X-Y;;X和Y為存放于X單元和Y單元的16位操作數(shù);若溢出,則轉(zhuǎn)移到overflow處理 movax,X subax,Y

jooverflow ... ;無溢出,結(jié)果正確overflow: ... ;有溢出處理例3.41:JP/JNP指令;設(shè)字符的ASCII碼在AL寄存器中;將字符加上奇校驗(yàn)位;在字符ASCII碼中為“1”的個數(shù)已為奇數(shù)時;則令其最高位為“0”;否則令最高位為“1” andal,7fh ;最高位置“0”,同時判斷“1”的個數(shù)

jnpnext ;個數(shù)已為奇數(shù),則轉(zhuǎn)向next oral,80h ;否則,最高位置“1”next: ...例3.42:JC/JNC指令;記錄BX中1的個數(shù)源程序見ex2_43.asm

xoral,al ;AL=0,CF=0again: testbx,0ffffh;等價于cmpbx,0

jenext shlbx,1

jncagain incal jmpagainnext: ... ;AL保存1的個數(shù)另一種做法記錄BX中“1”的個數(shù)

xoral,al ;AL=0,CF=0again: cmpbx,0

jznext shlbx,1 ;也可使用shrbx,1 adcal,0 jmpagainnext: ... ;AL保存1的個數(shù)在debug中改變bx的值,再運(yùn)行,分析結(jié)果比較無符號數(shù)高低無符號數(shù)的大小用高(Above)低(Below)表示利用CF確定高低、利用ZF標(biāo)志確定相等(Equal)兩數(shù)的高低分成4種關(guān)系:⑴低于(不高于等于):JB(JNAE)⑵不低于(高于等于):JNB(JAE)⑶低于等于(不高于):JBE(JNA)⑷不低于等于(高于):JNBE(JA)Jcc(重點(diǎn)掌握)例3.43a:比較無符號數(shù) cmpax,bx ;比較ax和bx

jnbnext ;若ax≥bx,轉(zhuǎn)移 xchgax,bx ;若ax<bx,交換next: ...結(jié)果:AX保存較大的無符號數(shù)比較有符號數(shù)大小有符號數(shù)的大(Greater)?。↙ess)需要組合OF、SF標(biāo)志,并利用ZF標(biāo)志確定相等(Equal)兩數(shù)的大小分成4種關(guān)系:⑴小于(不大于等于):JL(JNGE)⑵不小于(大于等于):JNL(JGE)⑶小于等于(不大于):JLE(JNG)⑷不小于等于(大于):JNLE(JG)Jcc(重點(diǎn)掌握)例3.43b:比較有符號數(shù) cmpax,bx ;比較ax和bx

jnlnext ;若ax≥bx,轉(zhuǎn)移 xchgax,bx ;若ax<bx,交換next: ...結(jié)果:AX保存較大的有符號數(shù)條件轉(zhuǎn)移指令應(yīng)用——

分支結(jié)構(gòu)例:當(dāng)dx的高4位全為0時,使ax=0;否則使ax=-1。(習(xí)題3.26(3))分析、畫流程圖、編程分析:dx于0f000h與,根據(jù)結(jié)果判斷源程序見:xi2_26_3.asmtip:jmp指令的應(yīng)用分支結(jié)構(gòu)應(yīng)用:比如,判斷一個字符是否為小寫字母、是否為0~9的數(shù)字.3.363.37…….code.startupmovdx,200fhtestdx,0f000hjzzeromovax,-1

jmpend1zero:movax,0

end1:.exit03.4.3循環(huán)指令(loop)循環(huán)指令默認(rèn)利用CX計數(shù)器,方便實(shí)現(xiàn)計數(shù)循環(huán)的程序結(jié)構(gòu)label操作數(shù)采用相對尋址方式LOOPlabel ;CX←CX-1,;CX≠0,循環(huán)到標(biāo)號labelLOOPZlabel ;CX←CX-1,;CX≠0且ZF=1,循環(huán)到標(biāo)號labelLOOPNZlabel ;CX←CX-1,;CX≠0且ZF=0,循環(huán)到標(biāo)號labelJCXZlabel ;CX=0,轉(zhuǎn)移到標(biāo)號label(重點(diǎn)掌握)例3.44:記錄空格個數(shù);設(shè)待處理字符串存放在以string開始的存儲區(qū),長度為count.

movcx,count ;設(shè)置循環(huán)次數(shù),count為字符串長度 movsi,offsetstring;用lea如何? xorbx,bx ;bx=0,記錄空格數(shù)

jcxzdone;如果長度為0,退出 moval,20h ;空格字符的ascii碼20hagain: cmpal,es:[si] jnznext ;ZF=0非空格,轉(zhuǎn)移 incbx ;ZF=1是空格,個數(shù)加1next: incsi

loopagain

;字符個數(shù)減1,不為0繼續(xù)循環(huán)done:movresult,bxdeccxjnzagaincmpcx,0jzdone源程序見:ex2_44.asm循環(huán)結(jié)構(gòu)習(xí)題3.26(6)(7)(8)3.4.4子程序指令子程序是完成特定功能的一段程序當(dāng)主程序(調(diào)用程序)需要執(zhí)行這個功能時,采用CALL調(diào)用指令轉(zhuǎn)移到該子程序的起始處執(zhí)行當(dāng)運(yùn)行完子程序功能后,采用RET返回指令回到主程序繼續(xù)執(zhí)行演示(先了解,以后細(xì)講)主程序與子程序CALLlabel主程序RET子程序回到CALL指令后的指令處——返回地址子程序調(diào)用指令CALL指令分成4種類型(類似JMP)CALLlabel ;段內(nèi)調(diào)用、直接尋址CALLr16/m16 ;段內(nèi)調(diào)用、間接尋址CALLfarptrlabel ;段間調(diào)用、直接尋址CALLfarptrmem ;段間調(diào)用、間接尋址CALL指令需要保存返回地址:段內(nèi)調(diào)用——入棧偏移地址IPSP←SP-2,SS:[SP]←IP段間調(diào)用——入棧偏移地址IP和段地址CSSP←SP-2,SS:[SP]←IPSP←SP-2,SS:[SP]←CS第2章CALL子程序返回指令根據(jù)段內(nèi)和段間、有無參數(shù),分成4種類型RET ;無參數(shù)段內(nèi)返回RETi16 ;有參數(shù)段內(nèi)返回RET ;無參數(shù)段間返回RETi16 ;有參數(shù)段間返回需要彈出CALL指令壓入堆棧的返回地址段內(nèi)返回——出棧偏移地址IPIP←SS:[SP],SP←SP+2段間返回——出棧偏移地址IP和段地址CSIP←SS:[SP],SP←SP+2CS←SS:[SP],SP←SP+2i16參數(shù)的作用RET第2章返回指令RET的參數(shù) RETi16

;有參數(shù)返回RET指令可以帶有一個立即數(shù)i16,則堆棧指針SP將增加,即SP←SP+i16這個特點(diǎn)使得程序可以方便地廢除若干執(zhí)行CALL指令以前入棧的參數(shù)例3.45:子程序;主程序

moval,0fh ;提供參數(shù)AL

callhtoasc ;調(diào)用子程序 ...;子程序:將AL低4位的一位16進(jìn)制數(shù)轉(zhuǎn)換成ASCII碼htoasc: andal,0fh ;只取al的低4位 oral,30h ;al高4位變成3 cmpal,39h ;是0~9,還是0Ah~0Fh jbehtoend addal,7 ;是0Ah~0Fh,加上7htoend: ret

;子程序返回轉(zhuǎn)換原理3.4.5中斷指令中斷(Interrupt)是又一種改變程序執(zhí)行順序的方法中斷具有多種中斷類型中斷的指令有3條:INTi8IRETINTO本節(jié)主要掌握類似子程序調(diào)用指令的中斷調(diào)用指令I(lǐng)NTi8,進(jìn)而學(xué)習(xí)使用DOS功能調(diào)用(先了解,以后細(xì)講)中斷的過程主程序IRET中斷服務(wù)程序斷點(diǎn)中斷請求中斷請求可以來自處理器外部的中斷源,也可以由處理器執(zhí)行指令引起:例如執(zhí)行INTi8指令。8086的外部中斷8086可以管理256個中斷各種中斷用一個向量編號來區(qū)別主要分成外部中斷和內(nèi)部中斷外部中斷——來自CPU之外的原因引起的中斷,又可以分成可屏蔽中斷:可由CPU的中斷允許標(biāo)志IF控制非屏蔽中斷:不受CPU的中斷允許標(biāo)志IF控制8086的內(nèi)部中斷內(nèi)部中斷——CPU內(nèi)部執(zhí)行程序引起的中斷,又可以分成:除法錯中斷:執(zhí)行除法指令,結(jié)果溢出產(chǎn)生的0號中斷指令中斷:執(zhí)行中斷調(diào)用指令I(lǐng)NTi8產(chǎn)生的i8號中斷斷點(diǎn)中斷:用于斷點(diǎn)調(diào)試(INT3)的3號中斷溢出中斷:執(zhí)行溢出中斷指令,OF=1產(chǎn)生的4號中斷單步中斷:TF=1在每條指令執(zhí)行后產(chǎn)生的1號中斷中斷指令I(lǐng)NTINTi8;中斷調(diào)用指令:產(chǎn)生i8號中斷IRET;中斷返回指令:實(shí)現(xiàn)中斷返回INTO;溢出中斷指令:;若溢出標(biāo)志OF=1,產(chǎn)生4號中斷;否則順序執(zhí)行3.4.6系統(tǒng)功能調(diào)用21H號中斷是DOS提供給用戶的用于調(diào)用系統(tǒng)功能的中斷,它有近百個功能供用戶選擇使用,主要包括設(shè)備管理、目錄管理和文件管理三個方面的功能ROM-BIOS也以中斷服務(wù)程序的形式,向程序員提供系統(tǒng)的基本輸入輸出程序匯編語言程序設(shè)計需要采用系統(tǒng)的各種功能程序充分利用操作系統(tǒng)提供的資源是程序設(shè)計的一個重要方面,需要掌握(重點(diǎn)掌握)功能調(diào)用的步驟通常按照如下4個步驟進(jìn)行:⑴在AH寄存器中設(shè)置系統(tǒng)功能調(diào)用號⑵在指定寄存器中設(shè)置入口參數(shù)⑶執(zhí)行指令I(lǐng)NT21H(或ROM-BIOS的中斷向量號)實(shí)現(xiàn)中斷服務(wù)程序的功能調(diào)用⑷根據(jù)出口參數(shù)分析功能調(diào)用執(zhí)行情況輸入輸出類功能調(diào)用向顯示器輸出字符⒈字符的輸出⒉字符串的輸出從鍵盤輸入數(shù)據(jù)⒊字符的輸入⒋字符串的輸入⒌ROMBIOS中斷調(diào)用裸機(jī)ROM-BIOSDOS功能調(diào)用匯編語言程序第2章字符輸出的功能調(diào)用DOS功能調(diào)用INT21H功能號:AH=02H入口參數(shù):DL=字符的ASCII碼功能:在顯示器當(dāng)前光標(biāo)位置顯示給定的字符,光標(biāo)右移一個字符位置。如按Ctrl-Break或Ctrl-C則退出例3.46:顯示問號;在當(dāng)前顯示器光標(biāo)位置顯示一個問號movah,02h ;設(shè)置功能號:ah←02hmovdl,'?' ;提供入口參數(shù):dl←'?'int21h

;DOS功能調(diào)用:顯示字符串輸出的功能調(diào)用DOS功能調(diào)用INT21H功能號:AH=09H入口參數(shù):DS:DX=欲顯示字符串在主存中的首地址字符串應(yīng)以$(24H)結(jié)束功能:在顯示器輸出指定的字符串可以輸出回車(0DH)和換行(0AH)字符產(chǎn)生回車和換行的作用例3.47:顯示字符串stringdb'Hello,Everybody!',0dh,0ah,'$';在數(shù)據(jù)段定義要顯示的字符串 ... movah,09h

;設(shè)置功能號:ah←09h movdx,offsetstring

;提供入口參數(shù):dx←字符串的偏移地址

int21h ;DOS功能調(diào)用:顯示字符輸入的功能調(diào)用DOS功能調(diào)用INT21H功能號:AH=01H出口參數(shù):AL=字符的ASCII碼功能:獲得按鍵的ASCII代碼值調(diào)用此功能時,若無鍵按下,則會一直等待,直到按鍵后才讀取該鍵值例3.48:判斷按鍵getkey: movah,01h ;功能號:ah←01h

int21h

;功能調(diào)用 cmpal,’Y’ ;處理出口參數(shù)al jeyeskey ;是“Y” cmpal,’N’ jenokey ;是“N” jmpgetkey;重新輸入 ...yeskey: ...nokey: ...舉例調(diào)試:輸入一個字符,接著換行輸出字符串輸入的功能調(diào)用DOS功能調(diào)用INT21H功能號:AH=0AH入口參數(shù):DS:DX=緩沖區(qū)首地址執(zhí)行該功能調(diào)用時,用戶按鍵,最后用回車確認(rèn)本

溫馨提示

  • 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

提交評論