第3章80x86的指令系統(tǒng)和尋址方式2_第1頁
第3章80x86的指令系統(tǒng)和尋址方式2_第2頁
第3章80x86的指令系統(tǒng)和尋址方式2_第3頁
第3章80x86的指令系統(tǒng)和尋址方式2_第4頁
第3章80x86的指令系統(tǒng)和尋址方式2_第5頁
已閱讀5頁,還剩64頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

3.2.3位操作類指令位操作類指令以二進(jìn)制位為基本單位進(jìn)行數(shù)據(jù)的操作;這是一類常用的指令,都應(yīng)該特別掌握注意這些指令對標(biāo)志位的影響1、邏輯運(yùn)算指令A(yù)NDORXORNOTTEST2、移位指令SHLSHRSAR3、循環(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;OR指令可用于置位某些位(同1相或),不影響其他位:將BL中D3和D0位置1,其他位不變orbl,00001001B;XOR指令可用于求反某些位(同1相異或),不影響其他位:將BL中D3和D0位求反,其他不變xorbl,00001001B例:屏蔽AL的第0、1兩位

ANDAL,0FCH例:置AL的第5位為1

ORAL,20H

例:使AL的第0、1位變反

XORAL,3例:測試某些位是0是1

TESTAL,1JZEVEN

********OR00100000**1*****

******01XOR00000011

******10

********AND11111100******00********AND000000010000000*測試指令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例31:測試為0或1testal,01h

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

TEST指令通常用于檢測一些條件是否滿足,但又不希望改變原操作數(shù)的情況TEST例3:請求出AL中“1”的個數(shù),存在AH中。

MOVAH,0Again:SHLAL,1ADCAH,0CMPAL,0JNZAGAINHLT

②MOVAH,0MOVCL,8Again:SHLAL,1JNCNextINCAHNext:DECCLJNZAgainHLT觀看動畫移位指令(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ù),該操作數(shù)為1,表示移動一位;當(dāng)移位位數(shù)大于1時,則用CL寄存器值表示,該操作數(shù)表達(dá)為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不確定例32:移位指令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例33:移位實(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不確定××××××××××××××××DXAXMOVCL,4SHLDX,CLMOVBL,AHSHLAX,CLSHRBL,CLORDL,BL××××××××××××××××××××××××××××

00000000

××××實(shí)現(xiàn)32位數(shù)的移位,要求左移4位。DHDLAHALBL××××××××××××××××××××

0000DXAXBL0000××××BL××××

0000DL①②③④⑤××××××××DL⑥方法1

MOVCL,4Again:SHLAX,1RCLDX,1DECCLJNZAgainAXDXCC方法2循環(huán)移位指令的作用:循環(huán)移位指令可以改變操作數(shù)中所有位的位置例34:32位數(shù)移位;將DX.AX中32位數(shù)值左移一位shlax,1rcldx,1DXAXCF0例35:位傳送;把AL最低位送BL最低位,保持AL不變rorbl,1roral,1rclbl,1rolal,1AL、BLCFBLCFALCFAL之D0例36:BCD碼合并;AH.AL分別存放著非壓縮BCD碼的兩位;將它們合并成為一個壓縮BCD碼存ALandax,0f0fh ;保證高4位為0movcl,4rolah,cl ;也可以用shlah,claddal,ah ;也可以用oral,ah例5:在內(nèi)存某一緩沖區(qū)中,存放著若干用BCD碼表示的十進(jìn)制數(shù),每一個單元中存放兩位,要求將它們轉(zhuǎn)換成ASCⅡ碼,存放在緩沖區(qū),高4位的BCD碼轉(zhuǎn)換的ASCⅡ碼放在地址較高的單元。BCDBUFASCⅡBUF6523020024353633323230綜合例題開始設(shè)地址設(shè)轉(zhuǎn)換個數(shù)轉(zhuǎn)換低4位取數(shù)存結(jié)果轉(zhuǎn)換高4位存結(jié)果CX-1-->CXCX=0?結(jié)束流程圖MOVSI,OffsetBCDBUFMOVDI,OffsetASCⅡBUFMOVCH,CountAgain:MOVAL,[SI]INCSIMOVBL,ALANDAL,0FHORAL,30HMOV[DI],ALINCDIMOVAL,BL;0110,0101MOVCL,4SHRAL,CL;0000,0110

ORAL,30H;0011,0110MOV[DI],ALINCDIDECCHJNZAgainHLTBCDBUFASCⅡBUF65230200243536333232300110010100000101∧00001111∨001100000000010100110101SIDI3.2.4控制轉(zhuǎn)移類指令控制轉(zhuǎn)移類指令用于實(shí)現(xiàn)分支、循環(huán)、過程等程序結(jié)構(gòu),是僅次于傳送指令的最常用指令重點(diǎn)掌握:JMP/Jcc/LOOPCALL/RETINTn/IRET

常用系統(tǒng)功能調(diào)用一般了解: LOOPZ/LOOPNZINTO控制轉(zhuǎn)移類指令通過改變IP(和CS)值,實(shí)現(xiàn)程序執(zhí)行順序的改變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)移、直接尋址⑵段內(nèi)轉(zhuǎn)移、間接尋址⑶段間轉(zhuǎn)移、直接尋址⑷段間轉(zhuǎn)移、間接尋址JMPlabel ;程序轉(zhuǎn)向label標(biāo)號指定的地址JMP目標(biāo)地址的尋址方式直接尋址方式轉(zhuǎn)移地址象立即數(shù)一樣,直接在指令的機(jī)器代碼中,就是直接尋址方式間接尋址方式轉(zhuǎn)移地址在寄存器或主存單元中,就是通過寄存器或存儲器的間接尋址方式用標(biāo)號表達(dá)用寄存器或存儲器操作數(shù)表達(dá)JMP與轉(zhuǎn)移地址有關(guān)的尋址方式:段內(nèi)尋址段內(nèi)直接尋址JMPNEARPTRNEXT

段內(nèi)間接尋址JMPTABLE[BX]

段間尋址

段間直接尋址JMPFARPTRNEXT

段間間接尋址JMPDWORDPTR[BX]用來確定轉(zhuǎn)移指令及轉(zhuǎn)子指令的轉(zhuǎn)向地址。(1)段內(nèi)直接尋址轉(zhuǎn)向的有效地址=當(dāng)前(IP)+位移量(8bit/16bit)

例:JMPNEARPTRNEXT近轉(zhuǎn)移-32768~+32767

JMPSHORTNEXT

短轉(zhuǎn)移-128~+127

目標(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)移代碼段代碼段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)指針,它就是邏輯地址代碼段代碼段

實(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的指令實(shí)際為相對尋址段內(nèi)轉(zhuǎn)移、間接尋址JMPr16/m16 ;IP←r16/m16將一個16位寄存器或主存字單元內(nèi)容送入IP寄存器,作為新的指令指針,但不修改CS寄存器的內(nèi)容jmpax ;IP←AXjmpwordptr[2000h] ;IP←[2000h]

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的othersegJMP段間轉(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:0JMP3.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í)行相對尋址方式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)志(表2.2)。根據(jù)利用的標(biāo)志位不同,16條指令分成3種情況:1.判斷單個標(biāo)志位狀態(tài)2.比較無符號數(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例題2.38例題2.39例題2.40例題2.41例題2.42例2.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: ...例2.39:JS/JNS指令;計算|X-Y|(絕對值);X和Y為存放于X單元和Y單元的16位操作數(shù);結(jié)果存入result movax,X subax,Y

jnsnonneg negax ;neg是求補(bǔ)指令nonneg: movresult,ax例2.40:JO/JNO指令;計算X-Y;;X和Y為存放于X單元和Y單元的16位操作數(shù);若溢出,則轉(zhuǎn)移到overflow處理 movax,X subax,Y

jooverflow ... ;無溢出,結(jié)果正確overflow: ... ;有溢出處理例2.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: ...例2.42:JC/JNC指令;記錄BX中1的個數(shù)

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ù)比較無符號數(shù)高低無符號數(shù)的大小用高(Above)低(Below)表示利用CF確定高低、利用ZF標(biāo)志確定相等(Equal)兩數(shù)的高低分成4種關(guān)系:⑴低于(不高于等于):JB(JNAE)⑵不低于(高于等于):JNB(JAE)⑶低于等于(不高于):JBE(JNA)⑷不低于等于(高于):JNBE(JA)Jcc例2.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例2.43b:比較有符號數(shù) cmpax,bx ;比較ax和bx

jnlnext ;若ax≥bx,轉(zhuǎn)移 xchgax,bx ;若ax<bx,交換next: ...結(jié)果:AX保存較大的有符號數(shù)3.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)號labelLOOPZlabel ;CX←CX-1,;CX≠0且ZF=0,循環(huán)到標(biāo)號labelJCXZlabel ;CX=0,轉(zhuǎn)移到標(biāo)號label例2.44:記錄空格個數(shù)

movcx,count ;設(shè)置循環(huán)次數(shù) movsi,offsetstring xorbx,bx ;bx=0,記錄空格數(shù)

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

loopagain ;字符個數(shù)減1,不為0繼續(xù)循環(huán)deccxjnzagaincmpcx,0jznext3.4.4子程序指令子程序是完成特定功能的一段程序當(dāng)主程序(調(diào)用程序)需要執(zhí)行這個功能時,采用CALL調(diào)用指令轉(zhuǎn)移到該子程序的起始處執(zhí)行當(dāng)運(yùn)行完子程序功能后,采用RET返回指令回到主程序繼續(xù)執(zhí)行演示主程序與子程序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]←CSCALL子程序返回指令根據(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返回指令RET的參數(shù) RETi16

;有參數(shù)返回RET指令可以帶有一個立即數(shù)i16,則堆棧指針SP將增加,即SP←SP+i16這個特點(diǎn)使得程序可以方便地廢除若干執(zhí)行CALL指令以前入棧的參數(shù)例2.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)用中斷的過程主程序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à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ù)⒊字符的輸入⒋字符串的輸入⒌按鍵的判斷裸機(jī)ROM-BIOSDOS功能調(diào)用匯編語言程序字符輸出的功能調(diào)用DOS功能調(diào)用INT21H功能號:AH=02H入口參數(shù):DL=字符的ASCII碼功能:在顯示器當(dāng)前光標(biāo)位置顯示給定的字符,光標(biāo)右移一個字符位置。如按Ctrl-Break或Ctrl-C則退出例2.46:顯示問號;在當(dāng)前顯示器光標(biāo)位置顯示一個問號movah,02h ;設(shè)置功能號:ah←02hmovdl,'?' ;提供入口參數(shù):dl←'?'int21h

;DOS功能調(diào)用:顯示進(jìn)行字符輸出時,當(dāng)輸出響鈴字符(07H)以及退格(08H)、回車(0DH)和換行(0AH)字符時,該功能調(diào)用可以自動識別并能進(jìn)行相應(yīng)處理字符輸出的功能調(diào)用顯示器功能調(diào)用INT10H功能號:AH=0EH入口參數(shù):AL=字符的ASCII碼BL=字符的顏色值(圖形方式)BH=頁號(字符方式)通常使BX=0功能:將字符按原屬性在光標(biāo)處顯示,光標(biāo)自動移到下一個字符位置字符串輸出的功能調(diào)用DOS功能調(diào)用INT21H功能號:AH=09H入口參數(shù):DS:DX=欲顯示字符串在主存中的首地址字符串應(yīng)以$(24H)結(jié)束功能:在顯示器輸出指定的字符串可以輸出回車(0DH)和換行(0AH)字符產(chǎn)生回車和換行的作用例2.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)用此功能時,若無鍵

溫馨提示

  • 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

提交評論