數(shù)據(jù)傳送類指令_第1頁
數(shù)據(jù)傳送類指令_第2頁
數(shù)據(jù)傳送類指令_第3頁
數(shù)據(jù)傳送類指令_第4頁
數(shù)據(jù)傳送類指令_第5頁
已閱讀5頁,還剩21頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

3.2.1數(shù)據(jù)傳送類指令數(shù)據(jù)傳送指令用于實現(xiàn)寄存器與存儲器之間、寄存器之間、累加器AL/AX與I/O端口之間、立即數(shù)到寄存器或存儲器之間的字節(jié)或字的傳送。這類指令的共同特點是不影響標(biāo)志寄存器的內(nèi)容(SAHF,POPF除外)。堆棧操作指令、標(biāo)志位傳送指令和地址傳送指令也歸入這一類中,共14條指令,又可分為4組,如表3.4所示。1.通用數(shù)據(jù)傳送指令通用數(shù)據(jù)傳送指令包括傳送指令MOV、堆棧操作指令PUSH、POP、輸入/輸出指令(累加器傳送指令)、數(shù)據(jù)交換指令XCHG和查表轉(zhuǎn)換指令XLAT。這類指令是唯一允許以段寄存器作為操作數(shù)的指令(XCHG除外)。表3.4數(shù)據(jù)傳送類指令指令類型指令書寫格式指令功能通用數(shù)據(jù)傳送指令MOV目標(biāo),源PUSH源POP目標(biāo)XCHG目標(biāo),源XLAT字節(jié)或字傳送字壓入堆棧字彈出堆棧字節(jié)或字交換字節(jié)翻譯目標(biāo)地址傳送指令LEA目標(biāo),源LDS目標(biāo),源LES目標(biāo),源裝入有效地址裝入DS寄存器裝入ES寄存器標(biāo)志位傳送指令LAHFSAHFPUSHFPOPF將FR低字節(jié)裝入AH寄存器將AH內(nèi)容裝AFR低字節(jié)將FR內(nèi)容壓入堆域從堆棧彈出FR內(nèi)容I/O數(shù)據(jù)傳送指令I(lǐng)N 累加器,端口OUT端口,累加器從端口輸入字節(jié)或字將字節(jié)或字輸出到端口(1) MOV傳送指令指令格式:MOVOPD,OPS指令功能:將源操作數(shù)OPS傳送到目的操作數(shù)OPD,即(OPD)一(OPS)。源操作數(shù)OPS可以是8/16位的通用寄存器、段寄存器、存儲器中某單元或8/16位的立即數(shù)。(2) PUSH進(jìn)棧(壓入)指令指令格式:PUSHOPS指令功能:將源操作數(shù)OPS壓入堆棧,即SP-2一SP,OPS一(SPH,SP)。源操作數(shù)0PS可以是16位通用寄存器、段寄存器或存儲器中的數(shù)據(jù)字,以保證堆棧按,字”操作。源操作數(shù)OPS不能是立即數(shù)。由于堆棧是按“后進(jìn)先出”方式工作,所以每次執(zhí)行PUSH指令時,總是首先修改棧指針(SP)-2一SP(即SP先減2),使之指向新棧頂,然后把源操作數(shù)壓入堆棧中SP所指示的位置,高字節(jié)在較高地址單元,低字節(jié)在較低地址單元中(真正的棧頂單元)。由于堆??偸前醋植僮?,所以,SP總是指向字地址單元,堆棧段基址由SS確定。堆棧最大容量為64K。(3) POP出棧(彈出)指令指令格式:POPOPD指令功能:將堆棧中當(dāng)前SP所指示的棧頂?shù)囊粋€字傳送到指定的目的操作數(shù)OPD中,同時修改棧指針,即(SP+1,SP)一OPD,(SP)+2一SP,出棧操作是進(jìn)棧操作的逆過程。目的操作數(shù)OPD可以是16位通用寄存器、段寄存器或存儲單元,但CS不能作目的操作數(shù)。和進(jìn)棧指令不同的是,出棧操作時是先將數(shù)據(jù)彈出送入目標(biāo)地址,然后修改棧指針,即將SP減2送SP,這時SP向高地址端移動,指向新的棧頂。(4) XCHG數(shù)據(jù)交換指令指令格式:XCHGOPD,OPS指令功能:把一個字或字節(jié)的源操作數(shù)OPS與目的操作數(shù)OPD互相交換位置。即(OPD)一OPS,(OPS)一OPD。源操作數(shù)OPS可為通用寄存器或存儲器,目的操作數(shù)OPD只能為通用寄存器。因此,交換指令可以在通用寄存器之間、通用寄存器與累加器之間、通用寄存器與存儲器之間進(jìn)行。段寄存器不能作為操作數(shù)。(5) XLAT查表轉(zhuǎn)換指令(換碼指令)指令格式:XLAT轉(zhuǎn)換表或XLAT指令功能:將[BX]為首址,[AL]為位移量的字節(jié)存儲器單元中的數(shù)據(jù)一AL,即[BX+AL]->AL。查表轉(zhuǎn)換指令XLAT可用來將一種代碼轉(zhuǎn)換成另一種代碼,或者說可使累加器中的一個值變換為內(nèi)存表格中的某一個值。具體實現(xiàn)是這樣的:使用XLAT指令之前必須先在內(nèi)存(數(shù)據(jù)段)中建立一個表格,表格的內(nèi)容就是所需要轉(zhuǎn)換的代碼,表格最多不超過256個字節(jié),將表格的起始地址事先裝入BX寄存器中,AL中存放所要查找的對象(表中某一項)到表首地址間的位移量。執(zhí)行XLAT指令時,就將BX中的內(nèi)容和AL中的內(nèi)容相加作為有效地址,將表格中與該地址相對應(yīng)的單元中的內(nèi)容取出并傳送到AL中。也就是說,指令執(zhí)行后所要查找的對象(即轉(zhuǎn)換后的代碼)就在AL中,BX中內(nèi)容保持不變??梢?,只要改變AL的值即可從表中找到不同的代碼。例:利用XLAT指令將一位十六進(jìn)制數(shù)轉(zhuǎn)換為對應(yīng)的ASCII碼。為實現(xiàn)這一轉(zhuǎn)換,首先應(yīng)在內(nèi)存數(shù)據(jù)段建立一個表格,表中存放著十六進(jìn)制數(shù)0,1,…,F(xiàn)的ASCII碼,并將表格的首地址置于BX中,AL中置入所要查找的十六進(jìn)制數(shù)距表頭的位移量,比如現(xiàn)在要查找表中第5項內(nèi)容,則AL中應(yīng)置入4。實現(xiàn)上述操作的程序如下:DATASEGMENTTABDB‘0123456789ABCDEF’DATAENDMOVBX,OFFSETTAB;變量TAB的有效地址FA一BX,即表示首址MOVAL,4 ;TAB表中第5項的位移量4一ALXLATTAB ;([BX+AL])=(TAB+4)=34H一AL上述過程如圖3.5所示。程序中DATASEGMENT到DATAEND之間的語句是十六進(jìn)制數(shù)的ASCII碼表。2.地址傳送指令8086/8088指令系統(tǒng)中有3條專門用于傳送地址的指令:LEA、LDS和LES??捎脕韨魉筒僮鲾?shù)的段地址或偏移地址。(1) LEA取有效地址指令指令格式:LEAOPD,OPS指令功能:按源操作數(shù)OPS提供的尋址方式計算偏移地址(即EA),并將該偏移地址傳送到目的操作數(shù)OPD所指示的16位寄存器中。注意:LEA指令中要求源操作數(shù)OPS所提供的必須是一個存儲器單元地址,而目的操作數(shù)OPD必須是一個除段寄存器以外的16位寄存器。另外,使用LBA指令時應(yīng)注意它與MOV指令的區(qū)別,MOV指令傳送的是源操作數(shù)中的內(nèi)容,而LEA指令傳送的是源操作數(shù)的有效地址。注意下面兩條指令的區(qū)別:MOVAX,[SI];將SI所指示的存儲單元中的內(nèi)容送AXLEAAX,[SI] ;將SI所指的存儲單元的EA送AX下列兩條指令是等價的,都是將變量NUM的EA送SI中。MOVSI,OFFSETNUM;將變量NUM的EA送SI中,;OFFSET為數(shù)值返回運算符LEASI,NUM;與上條MOV指令等效,將NUM的EA送SI;這說明有時可用MOV指令來代替LEA指令。(2)LDS送偏移地址及數(shù)據(jù)段首址指令指令格式:LDSOPD,OPS指令功能:(OPS)一OPD,(OPS+2)一DS該指令執(zhí)行時是把從源操作數(shù)OPS所指示的連續(xù)4個字節(jié)(雙字)存儲器單元中的操作數(shù)送到目的寄存器OPD和DS中,其中低位地址的兩個字節(jié)傳送到OPD指示的寄存器中,高位地址的兩個字節(jié)傳送到段寄存器DS中??梢?,LDS指令要求:OPD一定要是一個16位通用寄存器,常用SI寄存器。OPS所提供的一定要是一個存儲器地址,且是一個地址指針,從指針?biāo)甘镜牡刂穯卧_始,連續(xù)4個字節(jié)單元的內(nèi)容分別送入OPD和DS中。(3)LES傳送偏移地址及附加數(shù)據(jù)段首址指令指令格式:LESOPD,OPS指令功能:(OPS)一OPD,(OPS+2)一ESLES指令功能與LDS類似,所不同的是將OPS所指示的4個連續(xù)單元中的后兩個字節(jié)(高地址)單元中的內(nèi)容送入附加數(shù)據(jù)段寄存器ES中而不是送入DS,前兩個字節(jié)(低地址)單元中的內(nèi)容送OPD所指示的16位寄存器中。3.標(biāo)志位傳送指令標(biāo)志位傳送指令共有4條:LAHF(標(biāo)志裝入AH)、SAHF(AH的內(nèi)容存入標(biāo)志寄存器)、PUSHF(標(biāo)志壓入堆棧)和POPF(標(biāo)志出棧)。這些都是單字節(jié)指令,指令的操作數(shù)是隱含的,因此這些指令都是無操作數(shù)指令。通過這些指令的執(zhí)行,可以讀出當(dāng)前標(biāo)志寄存器中的內(nèi)容,也可以對標(biāo)志寄存器設(shè)置新值。(1) LAHF標(biāo)志寄存器低字節(jié)送AH指令指令格式:LAHF指令功能:把標(biāo)志寄存器FR中SF,ZF,AF,PF和CF(8080和8085所具有的標(biāo)志)分別送到AH中第7,6,4,2和0位,AH中第5,3,1位內(nèi)容未定義,可任意,標(biāo)志寄存器本身內(nèi)容不變。(2) SAHFAH送標(biāo)志寄存器低字節(jié)指令指令格式:SAHF指令功能:SAHF的功能與LAHF指令相反,是將AH中第7,6,4,2和0位狀態(tài)傳送至標(biāo)志寄存器FR中的SF,ZF,AF,PF和CF位,取代這些標(biāo)志位原內(nèi)容,而OF,IF,TF,DF標(biāo)志不受影響??梢?,通過該指令可以對標(biāo)志位進(jìn)行重新設(shè)置,所以該指令也叫設(shè)置標(biāo)志指令。(3) PUSHF標(biāo)志進(jìn)棧指令指令格式:PUSHF指令功能:把整個標(biāo)志寄存器的內(nèi)容壓入堆棧,同時修改棧指針,即SP-2一SP,該指令執(zhí)行后不影響標(biāo)志位。(4) POPF標(biāo)志出棧指令指令格式:POPF指令功能:POPF的功能正好與PUSHF相反,是將當(dāng)前堆棧指針SP所指的一個字傳送到標(biāo)志寄存器FR中,同時修改棧指針即SP+2一SP。PUSHF和POPF這兩條指令用于人為地保存和恢復(fù)標(biāo)志寄存器,常用過程調(diào)用和中斷服務(wù)程序的開頭與結(jié)尾,用來保存主程序的狀態(tài)標(biāo)志。這兩條指令的另一個用途是用來改變跟蹤單步標(biāo)志TF,8086/8088指令系統(tǒng)中沒有能直接改變TF的指令,若要改變TF,可先用PUSHF指令將標(biāo)志寄存器壓入堆棧,然后設(shè)法改變棧頂單元中D8位(TF位),然后再用POPF指令把堆棧中修改過的內(nèi)容送回標(biāo)志寄存器。這樣,只有TF位被改變,其它標(biāo)志位不變。4.輸入/輸出指令(累加器專用傳送指令)輸入/輸出數(shù)據(jù)傳送指令簡稱I/O指令,共兩條,一條是輸入指令I(lǐng)N,另一條是輸出指令OUToI/O指令用來完成累加器AL/AX與I/O端口問的數(shù)據(jù)傳送,指令中給出I/O端口的地址,當(dāng)端口地址值^255時,端口地址由指令中直接給出,當(dāng)端口地址怪256時用間接方式,先將端口地址位置于DX中,然后指令中用DX作間址方式表示。因此,I/O指令有兩種格式。(1)IN輸入指令指令格式:直接方式(長格式):INAL,端口地址 ;字節(jié)(8位)傳送INAX,端口地址;字(16位)傳送間接方式(短格式):INAL,DX;端口地址放在DX寄存器中INAX,DX指令功能:將端口地址中的8位或16位數(shù)傳送到AL或AX中,將端口中的16位數(shù)輸入時,先將指定端口中的字節(jié)數(shù)送入AL中,再將端口地址+1,然后將該端口中的字節(jié)數(shù)送入AH中。由上可知,IN指令有兩種格式,當(dāng)端口地址為00?FFH時用直接方式,端口地址值包含在指令中;當(dāng)端口地址為0000?FFFFH時,用間接方式,即先將端口地址放在DX中,指令中用DX代替端口地址。注意,這時指令的書寫形式與寄存器尋址方式相似,但這里實際上是間址方式。例:INAL,02FH ;將02FH端口的一個字節(jié)數(shù)送入ALINAX,060H;將060H端口的內(nèi)容送AL,將061H端口的內(nèi)容送AHMOVDX,300H;先將端口地址300H送人DX中INAL,DX ;將300H端口的內(nèi)容送入AL中(2)OUT輸出指令指令格式:直接方式:OUT端口地址,AL;字節(jié)(8位)輸出OUT端口地址,AX;字(16位)輸出間接方式:OUTDX,AL;DX中為端口地址OUTDX.AX指令功能:將累加器(AL/AX)中的內(nèi)容輸出傳送到指定的I/O端口中。同樣,當(dāng)端口地址在00?FFH問,用直接方式,端口地址直接由指令中給出,當(dāng)端口地址在0000?FFFFH間,用間接方式。先將端口地址放入DX中,然后在指令中用Dx代替端口地址,即用間接方式表示。例:OUT020H,AL ;將AL中內(nèi)容送020H端口中MOVDX,06FFH;先將端口地址06FFH送DX中OUTDX,AL ;將AL中的內(nèi)容送入06FFH端口中MOVDX,400H ;將端口地址400H送人DX中OUTDX,AX;將AX中內(nèi)容輸出送人400H端口中3.3.2算術(shù)運算類指令8086/8088指令系統(tǒng)中有完備的加、減、乘、除算術(shù)運算指令,可以處理4種類型數(shù)據(jù):無符號二進(jìn)制數(shù)、帶符號二進(jìn)制數(shù)、無符號壓縮的十進(jìn)制數(shù)和元符號非壓縮的十進(jìn)制數(shù)。無符號二進(jìn)制數(shù)和帶符號二進(jìn)制數(shù)的長度可以是8位或16位。帶符號二進(jìn)制數(shù)用補碼表示,最高位為符號,所能表示的數(shù)值范圍,8位時為—128—十127,16位時為-32768?+32767;無符號二進(jìn)制數(shù)的表示范圍,8位時為0?255,16位時為0?65535。若加/減運算的結(jié)果超出上述范圍,對無符號二進(jìn)制數(shù),以Cf置位表示,即溢出也就是進(jìn)位;而對帶符號數(shù),則以O(shè)F置位來表示,說明運算出現(xiàn)了溢出錯誤。對于加法和減法指令,帶符號數(shù)和無符號數(shù)的加法和減法運算的操作過程是一樣的,故可用同一條加法和減法指令來完成。而對于乘、除法運算,帶符號數(shù)和無符號數(shù)的運算過程完全不同,必須設(shè)置兩種指令(即帶符號數(shù)的乘、除指令和無符號數(shù)的乘、除指令)來處理這兩種類型的數(shù)據(jù)。在一個字節(jié)中存放二位BCD碼表示的十進(jìn)制數(shù)稱為壓縮的十進(jìn)制數(shù),若在一個字節(jié)中存放一位BCD碼表示的十進(jìn)制數(shù)稱為非壓縮的十進(jìn)制數(shù),這時高4位為0。壓縮的十進(jìn)制數(shù)只有加、減運算,加/減運算分兩步進(jìn)行:第一步由加/減法指令產(chǎn)生中間結(jié)果,并存AAL中;第二步再執(zhí)行十進(jìn)制調(diào)整指令,將AL中的中間結(jié)果修改成正確的壓縮的十進(jìn)制數(shù)。表3.5列出了8086/8088指令系統(tǒng)中算術(shù)運算類指令的名稱、助記符和它們對標(biāo)志位的影響。表3.5算術(shù)運算類指令類別指令名稱指令書寫格式(助記符)標(biāo)志位變化OSZAPC加法加法(字節(jié)/字)帶進(jìn)位加法(字節(jié)/字)加1(字節(jié)/字)加法的ASCH碼調(diào)整加法的十進(jìn)制調(diào)整ADD目標(biāo),源ADC目標(biāo),源INC目標(biāo)AAADAATTTXXfTfXfffTXTTTTTTTTTXnTTT減法減法(字節(jié)/字)帶進(jìn)位減法(字節(jié)/字)減1(字節(jié)/字)取補比較減法的ASCH碼調(diào)整減法的十進(jìn)制調(diào)整ADD目標(biāo),源ADC目標(biāo),源INC目標(biāo)NEG目標(biāo)CMP目標(biāo),源AAADAAfTfTTXxTTTTXTTTTTXTTTTTTTTTTTTTXTTT-1TTT乘法不帶符號整數(shù)乘法(字節(jié)/字)帶符號整數(shù)乘法(字節(jié)/字)乘法的ASCII調(diào)整MUL源IMUL源AAMTTXXXTxXTxXTTTX除法不帶符號整數(shù)除法(字節(jié)/字)帶符號整數(shù)除法(字節(jié)/字)字節(jié)轉(zhuǎn)換成字字轉(zhuǎn)換成雙字除法的ASCII調(diào)整DIV源IDIV源CBWCWDAADXX--XXX--TxfXX---XX--fXX--X表注:C:進(jìn)位標(biāo)志 f:運算結(jié)果影響標(biāo)志位P:奇偶校驗標(biāo)志 -:運算結(jié)果不影響標(biāo)志位A:輔助進(jìn)位標(biāo)志 X:標(biāo)志位為任意值Z:零標(biāo)志1:將標(biāo)志位置‘1’S:符號標(biāo)志O:溢出標(biāo)志3.3.3邏輯運算和移位類指令由于邏輯運算和移位操作均是對一個字節(jié)或字中的各位進(jìn)行操作,因此,邏輯運算和移位操作也稱為位操作。8086/8088系統(tǒng)中提供了三組位操作指令:邏輯運算指令、算術(shù)/邏輯移位指令和循環(huán)移位指令,如表3.6所示。表3.6邏輯運算和移位指令類別指令名稱指令書寫格式(助記符)狀態(tài)標(biāo)志位OSZAPC邏輯運算‘非’(字/字節(jié))NOT目標(biāo) ‘與’(字/字節(jié))AND目標(biāo),源0ffx$0‘或’(字/字節(jié))OR目標(biāo),源0ffxf0'異或’(字/字節(jié))XOR目標(biāo),源0ffxf0測試(字/字節(jié))TEST目標(biāo),源0ffxf0邏輯左移(字/字節(jié))SHL目標(biāo),計數(shù)值fffxff移位算術(shù)左移(字/字節(jié))SAL目標(biāo),計數(shù)值fffxff邏輯右移(字/字節(jié))SHR目標(biāo),計數(shù)值fffxff算術(shù)右移(字/字節(jié))SAR目標(biāo),計數(shù)值fffxff循環(huán)移位循環(huán)左移(字/字節(jié))ROL目標(biāo),計數(shù)值f--x-f循環(huán)右移(字/字節(jié))ROR目標(biāo),計數(shù)值f--x-f帶進(jìn)位循環(huán)左移(字/字節(jié))RCL目標(biāo),計數(shù)值f--x-f帶進(jìn)位循環(huán)右移(字/字節(jié))RCR目標(biāo),計數(shù)值f--x-f表注:f:運算結(jié)果影響標(biāo)志位 -:運算結(jié)果不影響標(biāo)志位x:標(biāo)志位為任意值0:將標(biāo)志位置‘03.3.4字符串處理類指令字符串就是存儲在存儲器中的一組字或字節(jié)數(shù)據(jù)(字母或數(shù)字)。字符串操作指令就是用一條指令實現(xiàn)對一串字符或數(shù)據(jù)進(jìn)行處理的指令,也就是說,字符串操作指令在對一個字符串進(jìn)行處理時,要重復(fù)執(zhí)行相同的操作多次。重復(fù)操作是通過在串操作指令前加一個串操作重復(fù)前綴符實現(xiàn)的。8086/8088指令系統(tǒng)中有5條(種)基本字符串操作指令,它們是:字符串傳送指令MOVS、字符串比較指令CMPS、字符串掃描指令SCAS、取字符串/字符串裝入指令LODS和字符串存儲指令STOS。串操作指令的類型、格式如表3.7所示。字符串處理指令的特點是:表3.6邏輯運算和移位指令指令名稱指令格式狀態(tài)標(biāo)志位操作碼(助記符)操作數(shù)OSZAPC字符串傳送MOVSMOSB/MOVSW門標(biāo)串,源串無-字符串比較CMPSCMPSB/CMPSW目標(biāo)串,源串無TTTTTTTT字符串掃描scasSCASB/SCASW目的串無TTTTTTTTTTTT取字符串LODSLODSB/LODSW源串無-存字符串STOSSTOSB/STOSW目的串無-表注:f:運算結(jié)果影響標(biāo)志位 -:運算結(jié)果不影響標(biāo)志位字符串處理指令可以對字節(jié)串或字串進(jìn)行處理。字符串指令的尋址方式是隱含的,所有串操作指令都由SI寄存器對源操作數(shù)串進(jìn)行間接尋址,且規(guī)定源串定位于數(shù)據(jù)段DS中,即源串的地址為DS:SI;所有串操作指令都用DI寄存器對目的串進(jìn)行間接尋址,且規(guī)定目的串一定在附加數(shù)據(jù)段ES中,且不能用跨段前綴符修改,即目的串的地址為ES:DI。每執(zhí)行一次串操作指令,地址指針SI和DI會自動進(jìn)行修改,以指向下一個待處理的元素(字符),但地址指針DI和SI的修改由方向標(biāo)志DF決定,當(dāng)DF=1時,SI和DI作自動遞減修改,當(dāng)DF=0時,DI和SI作自動遞增修改。串的長度設(shè)置在CX中,每執(zhí)行一次串操作指令,CX中內(nèi)容自動減1,當(dāng)CX內(nèi)容為0時,停止重復(fù)執(zhí)行串操作指令,所以CX中必須預(yù)先賦值。帶有重復(fù)前綴符的串操作指令在執(zhí)行過程中允許被中斷,CPU是在處理下一個串元素之前判別是否有中斷,若有,轉(zhuǎn)入相應(yīng)中斷處理程序,中斷返回后繼續(xù)從斷點執(zhí)行。與基本串操作指令配合使用的重復(fù)前綴共有3個:REP無條件重復(fù)REPE/REPZ相等/結(jié)果為0時則重復(fù)REPNE/REPNZ不相等/結(jié)果不為0時則重復(fù)這些前綴符只能加在基本串操作指令前,使串操作指令重復(fù)執(zhí)行。其中:無條件重復(fù)前綴REP常與串傳送指令MOVS連用,以實現(xiàn)連續(xù)的字符串傳送,直到整個串傳送完畢,即當(dāng)CX=0時為止。REPE和REPZ含義相同,常與串比較指令CMPS連用,意思是只當(dāng)兩數(shù)相等時才可繼續(xù)比較。REPNE和REPNZ也具有相同的含義,常與串掃描指令SCAS連用,意思是只有當(dāng)兩數(shù)不相等或不為0時,才繼續(xù)執(zhí)行串指令,而遇到兩數(shù)相等或CX=0時,則結(jié)束串操作。3.3.5控制轉(zhuǎn)移類指令程序中的指令通常是順序執(zhí)行的,8086/8088CPU中,指令的執(zhí)行順序是由代碼段寄存器CS和指令指示器IP決定的,每執(zhí)行一條指令,IP的內(nèi)容就自動進(jìn)行調(diào)整,當(dāng)要改變指令的執(zhí)行順序時,就必須改變IP的值,或同時改變CS和IP的值,控制轉(zhuǎn)移指令的功能就是改變CS和IP值的,從而實現(xiàn)程序的轉(zhuǎn)移。為了滿足程序轉(zhuǎn)移的不同要求,8086/8088指令系統(tǒng)提供了4類控制轉(zhuǎn)移指令:無條件轉(zhuǎn)移和過程調(diào)用、條件轉(zhuǎn)移、循環(huán)控制以及中斷指令,如表3.8所示。表3.8控制轉(zhuǎn)移指令類別指令助記符指令名稱無條件轉(zhuǎn)移和過程調(diào)用JMPCALLRET無條件轉(zhuǎn)移過程調(diào)用過程返回條件轉(zhuǎn)移指令JZ/JE等共10條JA/JNBE等8條簡單條件轉(zhuǎn)移(直接標(biāo)志轉(zhuǎn)移)帶符號數(shù)和無符號數(shù)條件轉(zhuǎn)移(間接標(biāo)志轉(zhuǎn)移)循環(huán)控制LOOPLOOPE/LOOPZLOOPNE/LOOPNZJCXZCX手0,循環(huán)CX手0,且ZF=1時,循環(huán)CX手0,且ZF=0時,循環(huán)CX=0時,循環(huán)中斷指令I(lǐng)NTINT0IRET軟件中斷溢出中斷中斷返回3.3.6處理器控制類指令8086/8088指令系統(tǒng)中的處理器控制指令可分為三組:標(biāo)志位操作指令組、外同步指令組和停機與空操作指令組。這些指令都是單字節(jié)的無操作數(shù)指令,只有操作碼。1.標(biāo)志位操作指令標(biāo)志位操作指令主要用來對進(jìn)位標(biāo)志CF、方向標(biāo)志DF和中斷允許標(biāo)志IF進(jìn)行設(shè)置或清除。指令執(zhí)行后不影響其它標(biāo)志位,只影響本指令中指定的標(biāo)志,所有標(biāo)志位操作指令的名稱和功能列于表3.13。(1)STC、CLC和CMC在多字節(jié)或多字運算中,經(jīng)常要用進(jìn)位標(biāo)志CF來說明低位向高位的進(jìn)位情況。在這種運算中,經(jīng)常要對CF進(jìn)行處理。用CLC指令可使CF清0,用STC指令可使CF置1,用CMC指令可使CF求反。STC、CIJC、CMC指令常和ADC、RCl、RCR指令配合使用。STD和CLD方向標(biāo)志DF在執(zhí)行字符串操作指令時用來決定源串和目的串的地址修改方向°STD可使方向標(biāo)志DF置1,則變址寄存器SI和DI內(nèi)容作減量修改,即串操作由高地址端向低地址端變化。CLD指令可使DF清0,則源和目的串的有效地址指針作增量修改地址,即串操作由低地址端向高地址端修改。STI和CLI中斷允許標(biāo)志IF為0或1,取決于CPU是否可響應(yīng)外部的可屏蔽中斷請求。CLI可使中斷允許標(biāo)志IF置0,禁止CPU響應(yīng)中斷,STI指令使IF置1,允許CPU響應(yīng)這類程2.外部同步指令8086/8088CPU可以工作在多處理器方式。為了充分發(fā)揮硬件的功能,系統(tǒng)設(shè)置了3條使CPU與其它協(xié)處理器同步工作的指令。以便共享系統(tǒng)資源。這些指令的執(zhí)行都不影響標(biāo)志位。(1)ESC交權(quán)指令指令格式:ESC外部操作碼,源操作數(shù)指令功能:ESC指令是8086/8088CPU要求協(xié)處理完成某種功能的命令。ESC指令的編碼格式如下:151110876532011011XMODYR/MESC指令是一個2字節(jié)指令,指令中:用5位表示ESC指令操作碼;X字段3位,用來選擇哪個協(xié)處理器,最多可接8個協(xié)處理器;Y字段3位,用來指示所選擇的協(xié)處理器完成的功能,最多可完成8種功能;MOD和R/M字段的組合,用來指定8086/8088存儲器中的操作數(shù),并由8086/8088CPU取出準(zhǔn)備傳送給選定的協(xié)處理器。由于8086/8088和協(xié)處理器8087都是互連在系統(tǒng)總線上的,所以兩個處理器一直共同監(jiān)視著從存儲器取出的每一條指令,當(dāng)然它們只處理與自己有關(guān)的指令,8087只處理ESC指令。一旦發(fā)現(xiàn)主CPU發(fā)出ESC指令(即發(fā)現(xiàn)從存儲器取出的是ESC指令),被選的協(xié)處理器便開始工作,使自己的Busy(忙)引腳為高,并將此高電平送到主CPU的TEST引腳,主CPU處于等待狀態(tài),被選協(xié)處理器根據(jù)ESC指令要求完成某種操作,協(xié)處理器操作結(jié)束,通過TEST向CPU送一低電平,CPU查到TEST為低,便繼續(xù)執(zhí)行后繼指令。(2) WAIT等待指令CPU執(zhí)行等待指令WAIT時,CPU不斷測試TEST引腳電平:當(dāng)TEST引腳為高電平時,CPU就進(jìn)入等待狀態(tài),CPU每隔5個時鐘周期檢測一次TEST引腳;當(dāng)TEST引腳為低電平時,CPU結(jié)束等待,順序執(zhí)行下一條指令。WAIT指令通常用在CPU執(zhí)行ESC指令之后,表示CPU正處于等待狀態(tài),準(zhǔn)備取回協(xié)處理器的處理結(jié)果。(3) LOCK總線封鎖指令總線封鎖指令實際上是一種前綴,它可以加在任何一條指令的前面。LOCK前綴只用于最大模式中,在硬件上將CPU的面iK引腳(總線封鎖信號)與總線裁決器的LOCK輸入引腳相連。當(dāng)CPU執(zhí)行帶LOCK前綴的指令時,會從LOCK引腳往外輸出一個低電平,這樣,在CPU訪問存儲器或I/O端口時,總線控制器會對總線實行封鎖,使其它處理器/總線主模塊得不到總線控制權(quán)。即禁止其它處理器使用總線。3.停機指令和空操作指令(1)HLT停機指令HLT指令也叫暫停指令。HLT指令常與中斷過程聯(lián)系在一起。當(dāng)CPU執(zhí)行HLT指令時,CS和IP指向HLT的下一條指令,而CPU則處于“什么都不做”的暫停狀態(tài)。只有當(dāng)出現(xiàn)下列情況之一時,CPU才脫離暫停狀態(tài):在RESET引腳上出現(xiàn)復(fù)位信號在NMI引腳上產(chǎn)生不可屏蔽中斷申請信號在INTR引腳上出現(xiàn)中斷申請信號,只要IF=1,CPU便脫離暫停狀態(tài),用二個總線周

溫馨提示

  • 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

提交評論