微機原理與接口技術(shù)指令系統(tǒng)_第1頁
微機原理與接口技術(shù)指令系統(tǒng)_第2頁
微機原理與接口技術(shù)指令系統(tǒng)_第3頁
微機原理與接口技術(shù)指令系統(tǒng)_第4頁
微機原理與接口技術(shù)指令系統(tǒng)_第5頁
已閱讀5頁,還剩104頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

2023/12/61微機原理與接口技術(shù)第三章

指令系統(tǒng)

2023/12/62第一節(jié)

指令的基本結(jié)構(gòu)和執(zhí)行時間指令指令系統(tǒng)8086/8088CPU的指令系統(tǒng)共包含92種基本指令,按照功能可將它們分為6大類:?

數(shù)據(jù)傳送指令?算術(shù)運算指令?邏輯運算和移位指令?串操作指令?控制轉(zhuǎn)移指令?處理器控制指令2023/12/63

8086指令的一般格式如下:

操作碼[操作數(shù)],[操作數(shù)]操作數(shù)主要分為3類:

立即數(shù)操作數(shù)、寄存器操作數(shù)存儲器操作數(shù)。2023/12/64

表3-2隱含及允許超越的段寄存器存儲器操作的類型

隱含的段寄存器

允許超越的段寄存器

偏移地址取指令

CS無

IP堆棧操作

SS無

SP通用數(shù)據(jù)讀寫

DSCS,ES,SS有效地址源數(shù)據(jù)串

DSCS,ES,SSSI目標數(shù)據(jù)串

ES無

DI用BP作為基址寄存器

SSCS,DS,ES有效地址2023/12/65

指令的執(zhí)行時間一條指令的執(zhí)行時間包括取指令、取操作數(shù)、執(zhí)行指令及傳送結(jié)果幾部分,單位用時鐘周期表示

寄存器操作數(shù)的指令執(zhí)行速度最快,立即數(shù)操作數(shù)次之,存儲器操作數(shù)指令的執(zhí)行速度最慢

2023/12/66第二節(jié)8086的尋址方式一、立即尋址(ImmediateAddressing)

主要用于給寄存器或存儲單元賦初值

MOVAX,3508H

2023/12/67

二、直接尋址(DirectAddressing)直接尋址指令在指令的操作碼后面直接給出操作數(shù)的16位偏移地址。此偏移地址也稱為有效地址EA(EffectiveAddress),與指令的操作碼一起,存放在內(nèi)存的代碼段.低8位存放在低地址單元,高8位存放在高地址單元。2023/12/68

直接尋址:MOVAX,[3200H]如果DS=5000H,則所尋找的操作數(shù)的物理地址:5000H×10H+3200H=50000H+3200H=53200H

2023/12/69

段超越:MOVBX,ES:[2100H]2023/12/610

三、寄存器尋址(RegisterAddressing)操作數(shù)為CPU的內(nèi)部寄存器

指令在執(zhí)行過程中不必通過訪問內(nèi)存而取得操作數(shù),因此執(zhí)行速度很快。MOVDS,AX

2023/12/611

四、寄存器間接尋址(RegisterIndirectAddressing)MOVAX,[DI]指令中的16位寄存器的內(nèi)容不是操作數(shù),而是操作數(shù)的偏移地址,操作數(shù)本身則在存儲器中??捎玫募拇嫫饔兴膫€,分別是:SI、DI、BX和BP,但如果使用不同的間址寄存器,則相應(yīng)的段寄存器有所不同

2023/12/612

1.選擇SI、DI、BX作為間址寄存器操作數(shù)在數(shù)據(jù)段(沒有使用段超越時)

MOVAX,[DI]若已知(DS)=5000H,(DI)=1600H,則操作數(shù)的物理地址為:5000H×10H+1600H=51600H執(zhí)行的結(jié)果為(AX)=789AH2023/12/613

2.選擇BP作為間址寄存器

操作數(shù)在堆棧段(沒有使用段超越時)

MOV[BP],AX若已知(SS)=6000H,(BP)=1500H,則操作數(shù)的物理地址為:6000H×10H+1500H=61500H若已知(AX)=5566H,則指令的執(zhí)行結(jié)果為:66H送到61500H內(nèi)存單元,

55H送到61501H內(nèi)存單元2023/12/614

無論用SI、DI、BX或BP作為間址寄存器,都允許段超越。

MOVES:[DI],AXMOVDX,DS:[BP]2023/12/615

五、變址尋址(IndexedAddressing)以指定的寄存器內(nèi)容,加上指令中給出的8位或16位位移量(必須要以一個段寄存器作為基地址),作為操作數(shù)的地址。作為變址尋址的寄存器可以是SI、DI、BX、BP四個寄存器中的任一個

若用SI、DI和BX作為變址寄存器,操作數(shù)在數(shù)據(jù)段,即段地址在DS寄存器;若用BP變址,則操作數(shù)在堆棧段,即段地址在SS寄存器

MOVAX,2000H[SI]

若(SI)=1200H,(DS)=1500H,則操作數(shù)的地址為18200H

2023/12/616變址尋址方式

2023/12/617

六、基址-變址尋址(BasedIndexedAddressing)

將BX和BP看作基址寄存器,將SI和DI看作變址寄存器?;芳幼冎返膶ぶ贩绞?把一個基址寄存器(BX或BP)的內(nèi)容加上一個變址寄存器(SI或DI)的內(nèi)容,再加上指令中指定的8位或16位位移量(必須要以一個段寄存器作為地址基址),作為操作數(shù)的地址

MOVAX,1050H[BX][SI]2023/12/618

MOVAX,1050H[BX][SI]若(BX)=2000H,(SI)=1600H,(DS)=1200H,指令中給出的偏移量為1050H,則源操作數(shù)的物理地址為16650H若用BX作為基址寄存器,則段寄存器為DS,操作數(shù)在數(shù)據(jù)段中;若用BP作為基址寄存器,則段寄存器為SS,操作數(shù)在堆棧段中。2023/12/619基址加變址的尋址方式

2023/12/620第三節(jié)8086的指令系統(tǒng)?

數(shù)據(jù)傳送(Datatransfer)?

算術(shù)運算(Arithmetic)?

邏輯運算和移位(Logic)?

串操作(Stringmanipulation)?

控制轉(zhuǎn)移(Controltransfer)?

處理器控制(Processorcontrol)2023/12/621

OPRD泛指各種類型的操作數(shù)mem存儲器操作數(shù)acc累加器操作數(shù)dest目的操作數(shù)src源操作數(shù)disp8位或16位偏移量,可用符號地址表示DATA8位或16位立即數(shù)port輸入輸出端口,可用數(shù)字或表達式表示()表示寄存器的內(nèi)容[]表示存儲單元的內(nèi)容或偏移地址2023/12/622一、數(shù)據(jù)傳送類指令

按功能可分為以下4小類:

通用數(shù)據(jù)傳送指令輸入輸出指令目標地址傳送指令標志傳送指令2023/12/623

1.通用數(shù)據(jù)傳送指令(GeneralPurposeTransfer)一般傳送指令MOV堆棧操作指令PUSH和POP交換指令XCHG查表轉(zhuǎn)移指令XLAT字位擴展指令2023/12/624

⑴一般傳送指令MOV(Movement)MOVdest,src;(dest)←(src)既可傳送字節(jié)操作數(shù)(8位),也可傳送字操作數(shù)(16位);可使用本章討論過的各種尋址方式;可實現(xiàn)以下各種傳送:2023/12/625MOV可實現(xiàn)的各種傳送:寄存器與寄存器之間的傳送:MOVAL,CL

寄存器與段寄存器之間的傳送:MOVDS,AX

寄存器與存儲器之間的傳送:

MOV[3000H],AX

立即數(shù)到寄存器的傳送:MOVAL,20H

立即數(shù)到存儲器的傳送:

MOVBYTEPTR[BP+SI],20H

存儲器與段寄存器之間的傳送:

MOVDS,[2000H]2023/12/626使用MOV指令完成數(shù)據(jù)傳送時需注意幾點:

MOV指令的兩個操作數(shù)的類型必須相同

MOVAX,DL

╳不能用一條MOV指令完成兩個存儲器單元之間的數(shù)據(jù)傳送

MOV[BX],[SI]

╳不能用立即數(shù)直接給段寄存器賦值

MOVDS,DATA

╳不能在段寄存器之間進行直接數(shù)據(jù)傳送

MOVDS,ES

╳通常不要求用戶用MOV指令修改代碼段寄存器CS和指令指針寄存器IP的內(nèi)容,但CS可以作為源操作數(shù)2023/12/627

⑵堆棧操作指令PUSH和POP(Pushwordontostack,Popwordoffstack)堆棧是內(nèi)存中一個特定的區(qū)域,用以存放寄存器或存儲器中暫時不用但又必須保存的數(shù)據(jù)。

2023/12/628堆棧操作需要遵循以下原則:

堆棧的存取每次必須是一個字(16位);向堆棧中存放數(shù)據(jù)時,總是從高地址向低地址方向增長,從堆棧取數(shù)據(jù)時正好相反;堆棧指令中的操作數(shù)只能是寄存器或存儲器操作數(shù),而不能是立即數(shù);堆棧段在內(nèi)存中的位置由SS決定,堆棧指針SP總是指向棧頂,即SP的內(nèi)容等于當前棧頂?shù)钠频刂?。在壓入操作?shù)之前,SP先減2。每彈出一個字,SP加2;對堆棧的操作遵循“后進先出(LIFO:LastInFirstOut)”的原則。最后壓人堆棧的數(shù)據(jù)會最先被彈出。2023/12/629堆棧示意圖

2023/12/630堆棧操作指令PUSH,POPPUSHsrc;src的高8位→[(SP)-1];src的低8位→[(SP)-2];(SP)-2→(SP)POPdest;[SP]→dest的低8位;[SP+1]→dest的高8位;(SP)+2→(SP)2023/12/631

指令中,操作數(shù)src和dest可以是以下三種類型:寄存器(包括數(shù)據(jù)寄存器、地址寄存器和變址寄存器);段寄存器(CS除外。PUSHCS指令是合法的;而POPCS是非法的);存儲器單元2023/12/632PUSHAX指令執(zhí)行示意圖

2023/12/633POPAX指令執(zhí)行示意圖

2023/12/634交換指令XCHG(Exchange)

指令格式及操作:

XCHGdest,src;(dest)←→(src)源操作數(shù)和目標操作數(shù)均可以是寄存器或存儲器,但不能同時為存儲器。即可以在寄存器與寄存器之間、寄存器與存儲器之間進行交換,但不能在存儲器與存儲器之間進行交換。不能為段寄存器操作數(shù)。即段寄存器的內(nèi)容不能參加交換。兩個操作數(shù)的字長必須相同,可以是字節(jié)交換,也可以是字交換。2023/12/635查表轉(zhuǎn)移指令XLAT(Translate)

指令格式與操作:

XLAT;(AL)←[(BX)+(AL)]

或:XLATsrc_table(src_table表示要查找的表的首地址)可以根據(jù)表中元素的序號查出表中相應(yīng)元素的內(nèi)容應(yīng)預(yù)先將要查找的這類代碼排成一個表存放在內(nèi)存的某個區(qū)域中。將表的首地址(偏移地址)送BX寄存器,要查找的元素的序號送AL,表中第一個元素的序號為0,然后依次為1,2,3,…。執(zhí)行XLAT指令后,標中指定序號的元素存于AL2023/12/636例:現(xiàn)要查出數(shù)值6對應(yīng)的ASCII碼

LEABX,Hex_table;(BX)←表的首地址

MOVAL,6;(AL)←6XLAT;查表轉(zhuǎn)換結(jié)果為(AL)=36H,為6所對應(yīng)的ASCII碼。

2023/12/637字位擴展指令

操作數(shù)擴展的規(guī)則是:擴展時在高位添加符號位,即將符號位擴展到整個高8位(或高16位)。例如,要把有符號數(shù)35H擴展為一個字,則結(jié)果為0035H;而如果要擴展的數(shù)是81H,則結(jié)果為FF81H。2023/12/638CBW(ConvertBytetoWord)

CBW;若(AL)<80H,則(AH)=00H;否則(AH)=FFH。CBW將一個字節(jié)的數(shù)(8位)擴展為一個字長的數(shù)(16位)。指令中隱含了操作數(shù)AL和AH。CBW指令不影響標志位。例如,把字節(jié)9AH擴展為字的語句如下:

MOVAL,9AHCBW其結(jié)果為:(AX)=FF9AH。2023/12/639CWD(ConvertWordtoDoubleword)

CWD;若(AX)<8000H,則(DX)=0000H;否則(DX)=FFFFH。CWD將一個字操作數(shù)(16位)擴展為一個雙字(32位)。指令中隱含了操作數(shù)AX和DX,擴展后的高16位放在DX中。CWD指令也不影響標志位。例如,把字25ABH擴展為雙字的語句如下:

MOVAX,25ABHCWD其結(jié)果為:(DX:AX)=000025ABH2023/12/640輸入輸出指令(InputandOutput)

輸入指令I(lǐng)N用于從外設(shè)端口接收數(shù)據(jù),輸出指令OUT向外設(shè)端口發(fā)送數(shù)據(jù)。無論接收到的數(shù)據(jù)或準備發(fā)送的數(shù)據(jù),都必須在累加器AX(字)或AL(字節(jié))中直接尋址方式:當I/O端口地址為8位二進制時,在指令中直接給出此端口地址。它允許尋址256個端口,端口地址為0~FFH。DX寄存器間接尋址方式:當I/O端口地址為16位二進制時,用DX寄存器間接尋址。它可尋址64K個端口,端口地址為0~FFFFH。

2023/12/641

輸入指令I(lǐng)N(Inputbyteorword)

INacc,port

;port為8位立即數(shù)表示的端口地址,直接尋址或INacc,DX;DX給出16位端口地址,間接尋址輸出指令OUT(Outputbyteorword)OUTport,acc

;port為8位立即數(shù)表示的端口地址,直接尋址或OUTDX,acc;DX給出16位端口地址,間接尋址2023/12/642[例]將一個字節(jié)3BH輸出到端口地址78A0H

MOVAL,3BH

;將要輸出的字節(jié)送入累加器ALMOVDX,78A0H

;將16位端口地址送入DX進行間址OUTDX,AL

;將AL中的一個字節(jié)輸出到DX所指定的16位端口地址2023/12/643目標地址傳送指令(Address-ObjectTransfer)

取偏移地址指令LEA(LoadEffectiveAddress)

LEAreg16,mem指令指令中的源操作數(shù)必須為存儲器操作數(shù),目標操作數(shù)必須為16位通用寄存器,指令的執(zhí)行結(jié)果是把源操作數(shù)的有效地址(即16位偏移地址)送到目標寄存器。例如:LEABX,BUFFER2023/12/644

注意LEA指令和MOV指令的區(qū)別:

LEABX,BUFFERMOVBX,BUFFER以下兩條指令的效果相同:

LEABX,BUFFERMOVBX,OFFSETBUFFER2023/12/645

LDS(LoadpointerusingDS)

LDSreg16,mem32;(reg16)←((mem32)+1:(mem32));(DS)←((mem32)+3:(mem32)+2)指令中源操作數(shù)mem32為存儲器操作數(shù),目標操作數(shù)為16位通用寄存器。LDS指令把存儲器mem32中存放的一個32位遠地址指針(包括偏移地址和段地址)送到reg16和DS。四個存儲單元的前兩個單元的內(nèi)容作為偏移地址送到reg16,后兩個單元的內(nèi)容作為段地址送到段寄存器DS。2023/12/646例設(shè)(DS)=6000,內(nèi)存地址為60348H開始的4個單元中存放了一個32位的遠地址指針98011H。

LDSSI,[0348H] MOVAX,[SI]上述第一條指令執(zhí)行后的結(jié)果為:(SI)=8011H,(DS)=9000H。第二條指令的執(zhí)行結(jié)果為:(AX)=3412H2023/12/647

LES(LoadpointerusingES)LES指令的格式及功能與LDS相似,兩個高地址單元中給出的段地址送ES。2023/12/648標志傳送指令(FlagRegisterTransfer)

LAHF(LoadAHfromFlags)該指令將標志寄存器FLAGS中的五個標志位,即符號標志SF、零標志ZF、輔助進位標志AF、奇偶標志PF以及進位標志CF分別傳送到累加器AH的對應(yīng)位。LAHF指令不影響標志位。

2023/12/649

SAHF(StoreAHintoFlags)SAHF指令的傳送方向與LAHF相反,將AH寄存器的第7、6、4、2、0位分別傳送到標志寄存器的對應(yīng)位。SAHF指令影響標志位,F(xiàn)LAGS寄存器中的SF、ZF、AF、PF和CF將被修改成AH寄存器對應(yīng)位的狀態(tài),但其余標志位不受影響。2023/12/650

PUSHF(PushFlagsontostack)PUSHF指令是將標志寄存器FLAGS壓入堆棧。指令本身不影響標志位。[SP-1]←(FLAGSH)[SP-2]←(FLAGSL)(SP)←(SP)-2POPF(PopFlagsoffstack)POPF指令將堆棧中當前棧頂?shù)膬蓚€單元的內(nèi)容彈出到標志寄存器FLAGS中。POPF指令影響標志位(FLAGSL)←[SP](FLAGSH)←[SP+1](SP)←(SP)+22023/12/651算術(shù)運算指令

8086/8088提供了加、減、乘、除4組基本的算術(shù)運算指令,既可以用于字節(jié)運算,也可以用于字運算;既可用于無符號數(shù)運算,也可用于帶符號數(shù)運算。若是帶符號數(shù),用補碼表示。8086/8088還提供了各類校正操作指令,可以進行十進制的算術(shù)運算。

2023/12/652加法運算指令

不帶進位的加法指令A(yù)DD帶進位的加法指令A(yù)DC加1指令I(lǐng)NC兩條加法調(diào)整指令:AAA和DAA。2023/12/653不帶進位的加法指令A(yù)DD(Addition)

ADDOPRD1,OPRD2;(OPRD1)←(OPRD1)+(OPRD2)ADD加法指令影響標志位源操作數(shù)和目標操作數(shù)可以是寄存器操作數(shù)或存儲器操作數(shù),源操作數(shù)還可以是立即數(shù);操作數(shù)可以是無符號數(shù),也可以是帶符號數(shù)。需注意兩點:一是源操作數(shù)與目標操作數(shù)不能同時為存儲器操作數(shù),二是不能對段寄存器進行運算2023/12/654帶進位的加法指令A(yù)DC(Addwithcarry)

ADCOPRD1,OPRD2;(OPRD1)←(OPRD1)+(OPRD2)+(CF)ADC指令與ADD指令在格式、功能及對標志位的影響等方面都類似,只是在ADC指令中,CF也要參加求和運算ADC指令主要用于多字節(jié)數(shù)據(jù)的加法運算。如果低字節(jié)相加時產(chǎn)生進位,則在下一次高字節(jié)相加時應(yīng)將此進位加進去2023/12/655加1指令I(lǐng)NC(Incrementby1)

INCOPRD;(OPRD)←(OPRD)+1INC指令對指定的操作數(shù)加1,再送回到該操作數(shù)。在指令中,操作數(shù)OPRD可以是寄存器操作數(shù),也可以是存儲器操作數(shù);可以是8位,也可以是16位。但不能是段寄存器,也不能是立即數(shù)INC指令不影響CF標志位,但會影響其他5個狀態(tài)標志位AF、OF、PF、SF和ZF。INC指令通常用在循環(huán)程序中修改地址指針及循環(huán)次數(shù)等2023/12/656壓縮BCD加法的十進制調(diào)整指令DAA

(DecimalAdjustforAddition)

所謂壓縮的BCD碼,是指一個字節(jié)中可以存放兩位BCD碼,高4位和低4位各存放一位。一般來說,兩個BCD碼相加以后,有可能得到不正確的BCD結(jié)果,可用DAA指令對AL寄存器中的“和”進行調(diào)整,即可得到預(yù)期的結(jié)果。DAA指令調(diào)整的方法是:①若(AL)中低4位>9或AF=1,則(AL)+06H→(AL),并使AF=1;②若(AL)中高4位>9或CF=1,則(AL)+60H→(AL),并使CF=1。2023/12/657[例]編程用BCD數(shù)計算46+35=?MOVAL,46H;(AL)=46HADDAL,35H;(AL)=7BHDAA;(AL)=81H2023/12/658

非壓縮BCD加法的十進制調(diào)整指令A(yù)AA

(unpackedBCD[ASCII]AdjustforAddition)

所謂非壓縮的BCD碼,就是一個字節(jié)存放一位BCD碼(BCD碼存放在字節(jié)的低4位,高4位為零)。調(diào)整以前,先用指令A(yù)DD或ADC進行8位數(shù)的加法運算,相加結(jié)果放在AL中,用AAA指令調(diào)整后,非壓縮BCD碼的低位在AL寄存器,高位在AH寄存器。AAA指令的調(diào)整步驟為:①若(AL)中低4位>9或AF=1,則(AL)+6,(AH)+1,并使AF=1;②屏蔽掉(AL)中高4位,即(AL)←(AL)∧0FH;③CF←AF2023/12/659[例]用BCD碼計算8+6=?

MOVAL,08H;BCD碼數(shù)8

MOVBL,06H;BCD碼數(shù)6

ADDAL,BL;(AL)=08H+06H=0EHAAA;(AL)=0EH+06H=04H(高4位清零);(AH)=1;(CF)=12023/12/660減法運算指令

不帶進位減法指令SUB帶進位減法指令SBB減1指令DEC求補指令NEG比較指令CMP減法的ASCII調(diào)整指令A(yù)AS減法十進制調(diào)整指令DAS

2023/12/661

不帶進位減法指令SUB(Subtraction)

SUBOPRD1,OPRD2;(OPRD1)←(OPRD1)-(OPRD2)帶進位減法指令SBB(SubtractionwithBorrow)

SBBOPRD1,OPRD2;(OPRD1)←(OPRD1)-(OPRD2)-CF減1指令DEC(Decrementby1)

DECOPRD;(OPRD)←(OPRD)-12023/12/662

DEC指令常用在循環(huán)程序中修改循環(huán)次數(shù)。例如:

MOVCX,1000HNEXT:DECCX

JNZNEXTHLT2023/12/663

求補指令NEG(Negate)

NEGOPRD;(OPRD)←0-(OPRD)

求補指令對6個操作數(shù)均有影響。操作數(shù)的類型可以是寄存器或存儲器;可以對8位或16位數(shù)求補利用NEG指令可以得到負數(shù)的絕對值2023/12/664

比較指令CMP(Compare)

CMPOPRD1,OPRD2;(OPRD1)-(OPRD2),結(jié)果不送回OPRD1比較指令對6個狀態(tài)標志位SF、ZF、AF、PF、CF和OF都有影響。比較指令主要用來比較兩個數(shù)的大小關(guān)系

2023/12/665

壓縮BCD減法的十進制調(diào)整DAS(DecimalAdjustforSubtraction)非壓縮BCD減法的十進制調(diào)整AAS(unpackedBCD[ASCII]adjustforsubtraction)2023/12/666乘法運算指令無符號數(shù)乘法指令MUL有符號數(shù)乘法指令I(lǐng)MUL乘法的十進制調(diào)整指令A(yù)AM

2023/12/667

無符號數(shù)乘法指令MUL(Multiplicationunsigned)

MULOPRD指令的操作為:字節(jié)乘法:(AX)←(OPRD)×(AL)字乘法:(DX:AX)←(OPRD)×(AX)

源操作數(shù)OPRD可以是8位或16位的寄存器或存儲器。另一個操作數(shù)隱含在累加器中(8位乘法時在AL中;16位乘法時在AX中)。兩個操作數(shù)均按無符號數(shù)處理,其取值范圍為0~255(字節(jié)),或0~65535(字)。乘法指令要求兩個操作數(shù)必須等長,且不能是立即數(shù)2023/12/668

有符號數(shù)乘法指令I(lǐng)MUL(IntegerMultiplication)操作數(shù)應(yīng)滿足帶符號數(shù)的取值范圍,即-128~+127(字節(jié))和-32768~+32767(字)乘法的十進制調(diào)整指令A(yù)AM(unpackedBCD[ASCII]adjustformultiply)

2023/12/669除法運算指令

無符號數(shù)除法指令DIV帶符號數(shù)除法指令I(lǐng)DIV除法的十進制調(diào)整指令A(yù)AD

2023/12/670

無符號數(shù)除法指令DIV(Divisionunsigned)

DIVOPRD指令中的操作數(shù)OPRD(除數(shù))可以是8位或16位的寄存器操作數(shù)或存儲器操作數(shù)。指令隱含被除數(shù)AX(16位)或DX:AX(32位)。字節(jié)除法:(AL)←(AX)/(OPRD)(AH)←(AX)%(OPRD)(%為取余數(shù)操作)字除法:(AX)←(DX:AX)/(OPRD)(DX)←(DX:AX)%(OPRD)(%為取余數(shù)操作)2023/12/671

帶符號數(shù)除法指令I(lǐng)DIV(IntegerDivision)IDIV指令在格式和功能上都與DIV指令類似,只是要求操作數(shù)為有符號數(shù)除法的十進制調(diào)整指令A(yù)AD(unpackedBCD[ASCII]adjustfordivision)2023/12/672邏輯運算和移位指令

邏輯運算指令A(yù)ND(邏輯“與”)OR(邏輯“或”)NOT(邏輯“非”)XOR(邏輯“異或”)TEST(測試)這些指令可對8位或16位的寄存器或存儲器單元中的內(nèi)容進行按位操作2023/12/673

邏輯“與”指令A(yù)ND(Logicaland)

ANDOPRD1,OPRD2;(OPRD1)←(OPRD1)∧(OPRD2)AND指令的主要用途是將目標操作數(shù)的某些位清零,而其他位保持不變?nèi)绻粋€寄存器的內(nèi)容與該寄存器本身相與(例如:ANDAX,AX),則寄存器原來的內(nèi)容不會改變,但將影響標志位SF、ZF和PF,并使CF=OF=02023/12/674

邏輯“或”指令OR(Logicalinclusiveor)

OROPRD1,OPRD2;(OPRD1)←(OPRD1)∨(OPRD2)OR指令的主要用途是將目標操作數(shù)的某些位置1,而其他位保持不變2023/12/675

邏輯“非”指令NOT(Logicalnot)

NOTOPRDNOT指令將指定的操作數(shù)OPRD按位求反,再送回到該操作數(shù)

邏輯“異或”指令XOR(Logicalnot)

XOROPRD1,OPRD2;(OPRD1)←(OPRD1)⊕(OPRD2)

XOR指令的一個用途是將寄存器清零,同時也將進位標志位CF清零。例如:XORAX,AX

2023/12/676

測試指令TEST(Testornon-destructivelogicaland)TEST指令的格式、操作及對操作數(shù)的要求和AND指令類似,但該指令“與”的結(jié)果不送回目標操作數(shù),而只是影響標志位。TEST指令常用于在不破壞原來操作數(shù)的情況下檢測操作數(shù)中某些位是“1”還是“0”。例如:TESTAL,80HTESTAX,4000H2023/12/677非循環(huán)移位指令

算術(shù)左移指令SAL(Shiftarithmeticleft)算術(shù)右移指令SAR(Shiftarithmeticright)邏輯左移指令SHL(Shiftlogicleft)邏輯右移指令SHR(Shiftlogicright)可以實現(xiàn)對8位或16位的寄存器或存儲器操作數(shù)進行指定次數(shù)的移位。在要求進行2位或更多位的移動時,移位的次數(shù)必須放在CL寄存器中。2023/12/678

算術(shù)左移和邏輯左移指令SAL/SHL

算術(shù)左移指令SAL和邏輯左移指令SHL執(zhí)行完全相同的操作:

SALOPRD,1SHLOPRD,1或SALOPRD,CLSHLOPRD,CLSAL指令和SHL指令的區(qū)別是:SAL指令將操作數(shù)視為有符號數(shù),而SHL將操作數(shù)視為無符號數(shù)

2023/12/679[例3-8]一個16位無符號數(shù)存放在以DATA為首地址的兩個連續(xù)的單元,用左移指令實現(xiàn)將該數(shù)乘以乘以10。

LEASI,DATA;DATA單元的偏移地址送SIMOVAX,[SI];(AX)←被乘數(shù)

SHLAX,1;(AX)←DATA*2MOVBX,AX;暫存于BXMOVCL,2;(CL)←移位次數(shù)

SHLAX,CL;(AX)←DATA*8ADDAX,BX;(AX)←DATA*10HLT;停止2023/12/680

邏輯右移指令SHR將目標操作數(shù)順序向右移1位或CL指定的位數(shù)

例:SHRBH,1

SHRAX,CL算術(shù)右移指令SAR

將目標操作數(shù)順序向右移1位或CL指定的位數(shù)例:SARAL,1SARBX,CL2023/12/681循環(huán)移位指令

不帶進位標志位CF的循環(huán)左移指令ROL(Rotateleft)不帶進位標志位CF的循環(huán)右移指令ROR(Rotateright)帶進位標志位CF的循環(huán)左移指令RCL(Rotateleftthroughcarry)帶進位標志位CF的循環(huán)右移指令RCR(Rotaterightthroughcarry)所有循環(huán)移位指令都只影響進位標志CF和溢出標志OF,而對其他標志位沒有影響2023/12/682

不帶進位標志位CF的循環(huán)左移指令ROL

ROLOPRD,1或ROLOPRD,CL

不帶進位標志位CF的循環(huán)右移指令ROR

ROROPRD,1或ROROPRD,CL

2023/12/683

帶進位標志位CF的循環(huán)左移指令RCL

RCLOPRD,1或RCLOPRD,CL

帶進位標志位CF的循環(huán)右移指令RCR

RCROPRD,1或RCROPRD,CL

2023/12/684串操作指令

串操作指令具有以下的共同特點:⑴源串指針為DS:SI。源串(源操作數(shù))默認為數(shù)據(jù)段,即段基地址在DS中,但允許超越。偏移地址用SI寄存器指定。⑵目標串指針為ES:DI。目標串(目標操作數(shù))默認在ES附加段中,不允許段超越。偏移地址用DI寄存器指定。⑶使用重復(fù)前綴時,要操作的串長度放在CX寄存器中。⑷自動修改指針和計數(shù)器。在對每個字節(jié)(或字)操作后,SI和DI寄存器的內(nèi)容會根據(jù)方向標志DF的情況自動修改:若(DF)=0,則每次操作后,SI和DI按地址增量方向修改(對字節(jié)操作加1;對字操作加2);若(DF)=1,則SI和DI按地址減量方向修改。若使用了重復(fù)前綴,CX的內(nèi)容也會每次自動減1。2023/12/685

用于串操作的重復(fù)前綴:REP:無條件重復(fù)前綴-重復(fù)執(zhí)行指令規(guī)定的操作,直到(CX)=0;REPE:相等時重復(fù)-ZF=1,且(CX)≠0時重復(fù);REPZ:結(jié)果為零時重復(fù)-ZF=1,且(CX)≠0時重復(fù);REPNE:不相等時重復(fù)-ZF=0,且(CX)≠0時重復(fù);REPNZ:結(jié)果不為零時重復(fù)-ZF=0,且(CX)≠0時重復(fù)

2023/12/686

串傳送指令MOVS(Movestring)指令格式有3種:

MOVSOPRD1,OPRD2MOVSBMOVSW第二種和第三種格式隱含了兩個操作數(shù)的地址,此時源串和目標串地址必須符合默認值,即源串在DS段,偏移地址在SI中,而目標串在ES段,偏移地址在DI中

2023/12/687[例]將3000H:1500H地址開始的100個字節(jié)傳送到6000H:1000H開始的內(nèi)存單元中去

MOVAX,3000HMOVDS,AX;設(shè)定源串段地址MOVAX,6000HMOVES,AX;設(shè)定目標串段地址MOVSI,1500H;設(shè)定源串偏移地址MOVDI,1000H;設(shè)定目標串偏移地址MOVCX,100;串長度送CXCLD;(DF)=0,使地址指針按增量方向修改NEXT:REPMOVSB

2023/12/688

串比較指令CMPS(Comparestring)指令有3種格式:

CMPSOPRD1,OPRD2CMPSBCMPSW串比較指令通常和條件重復(fù)前綴REPE(REPZ)或REPNE(REPNZ)連用,用來檢查兩個字符串是否相等。2023/12/689[例3-10]現(xiàn)有兩個長度均為100個字節(jié)的字符串,STRING1為源串首地址,STRING2為目標串首地址。試比較兩個字符串是否相同,并找出其中第一個不相等的字符,將源串中該字符的地址送BX,該字符送AL。

LEASI,STRING1;(SI)←源串首地址

LEADI,STRING2;(DI)←目標串首地址

MOVCX,100;(CX)←串長度

CLD;(DF)=0,使地址指針按增量方向修改

REPECMPSB;若相等則重復(fù)比較

JCXZSTOP;若(CX)=0,則轉(zhuǎn)STOPDECSI;否則(SI)-1,指向不相等的單元MOVBX,SI;(BX)←不相等單元的地址MOVAL,[SI];(AL)←不相等單元的內(nèi)容STOP:HLT;停止2023/12/690

串掃描指令SCAS(Scanstring)指令格式有3種:

SCASOPRD;OPRD為目的串

SCASBSCASWSCAS指令執(zhí)行時,將累加器AL或AX的值與目的串(由ES:DI所指向)中的字節(jié)或字進行比較,比較結(jié)果不改變目的操作數(shù),只影響標志位

SCAS指令常用于在一個字符串中搜索特定的關(guān)鍵字,把要找的關(guān)鍵字放在AL(或AX)中,再用本指令與字符串中各字符逐一進行比較2023/12/691[例3-11]有一個包含100個字符的字符串,其首地址為STRING。找出字符串中第一個回車符CR(其ASCII碼為ODH),找到后將其地址保存在BX

LEADI,STRING;(DI)←字符串首地址

MOVAL,0DH;(AL)←回車符CRMOVCX,100;(CX)←字符串長度

CLD ;清標志位DFREPNESCASB;若未找到,重復(fù)掃描

JZ FOUND;若找到,則轉(zhuǎn)FOUND JMPSTOP;轉(zhuǎn)移至STOPFOUND:DECDI;(DI)-1 MOVBX,DI;地址送到BXSTOP:HLT;停止2023/12/692

串裝入指令LODS(Loadstring)指令格式有3種:

LODSOPRD;OPRD為源串

LODSB LODSWLODS指令把由DS:SI指向的源串中的字節(jié)或字取到累加器AL或AX中,并在這之后根據(jù)DF的值自動修改指針SI,以指向下一個要裝入的字節(jié)或字。

2023/12/693

[例3-12]在以BUFFER為首地址的內(nèi)存區(qū)域中,有10個以非壓縮BCD碼形式存放的十進制數(shù),它們的值可能是0~9中的任意一個。將這些十進制數(shù)順序顯示在屏幕上。在屏幕上顯示一個字符的方法,是使用DOS系統(tǒng)功能調(diào)用,這樣只需要三條語句即可:①02H→AH;②待顯示字符的ASCII碼→DL;③INT21H。2023/12/694

LEASI,BUFFER;(SI)←源串首地址

MOV CX,10;(CX)←字符串長度

CLD;清標志位DF MOVAH,02H;(AH)←功能號NEXT:LODSB;取一個BCD碼到AL ADDAL,30H;BCD碼轉(zhuǎn)換為ASCII碼

MOVDL,AL;(DL)←待顯示字符的ASCII碼

INT21H;顯示

DECCX;(CX)←(CX)-1 JNZNEXT;(CX)≠0則重復(fù)

HLT;停止2023/12/695

串存儲指令STOS(Storestring)指令格式有3種:

STOSOPRD;OPRD為目標串

STOSBSTOSWSTOS指令把累加器AL中的字節(jié)或AX中的字存到由ES:DI指向的存儲器單元中,并在這之后根據(jù)DF的值自動修改指針DI的值(增量或減量),以指向下一個存儲單元。利用重復(fù)前綴REP,可對連續(xù)的存儲單元存入相同的值

2023/12/696[例]將5000H:0800H單元開始的100個字節(jié)中裝入初始值FFH

MOVAX,5000H MOVES,AX

MOVDI,0800H

MOVCX,50

CLD

MOVAX,0FFFFHREPSTOSW2023/12/697控制轉(zhuǎn)移指令

無條件轉(zhuǎn)移指令JMP(Jump)JMP指令的操作是無條件地將程序轉(zhuǎn)移到指定的目標地址,并從該地址開始執(zhí)行新的程序段。目標地址可以用直接方式或間接方式給出。JMP指令不影響標志位⑴段內(nèi)直接轉(zhuǎn)移JMPLABLE

;(IP)←(IP)+disp,disp為8位或16位的相對位移量。

指令中的LABLE是一個標號,也稱符號地址,它表示轉(zhuǎn)移的目的地。該標號與本程序在同一個代碼段內(nèi)。

2023/12/698

⑵段內(nèi)間接轉(zhuǎn)移指令格式:

JMPOPRD;(IP)←(OPRD)指令中的操作數(shù)OPRD是16位的寄存器或者存儲器地址??梢圆捎酶鞣N尋址方式。指令的操作是用指定的16位寄存器或存儲器兩單元的內(nèi)容作為目標的偏移地址,來取代原來IP的內(nèi)容,從而實現(xiàn)程序的轉(zhuǎn)移。代碼段寄存器CS的值不變。

例:JMPSI;(IP)←(SI)JMPWORDPTR[BX+SI]

;(IP)←(BX+SI)所指向的連續(xù)兩個存儲單元的內(nèi)容2023/12/699

⑶段間直接轉(zhuǎn)移JMPFARLABLE;(IP)←OFFSETLABLE;(CS)←SEGLABLE指令的操作數(shù)是一個遠標號,該標號在另一個代碼段內(nèi)

⑷段間間接轉(zhuǎn)移

JMPmem32;(IP)←(mem32);(CS)←(mem32+2)指令的操作數(shù)是一個32位的存儲器地址(不能是寄存器)。指令的操作是將存儲器的前兩個字節(jié)送到IP寄存器,存儲器的后兩個字節(jié)送到CS寄存器,以實現(xiàn)到另一個代碼段的轉(zhuǎn)移。

2023/12/6100條件轉(zhuǎn)移指令Jcc

條件轉(zhuǎn)移指令Jcc

Jccshort_lable指令助記符中的“cc”表示條件。Short_lable為短轉(zhuǎn)移。條件轉(zhuǎn)移指令是根據(jù)前一條指令執(zhí)行后標志位的狀態(tài),來決定程序是否轉(zhuǎn)移。若滿足轉(zhuǎn)移指令規(guī)定的條件,則程序轉(zhuǎn)移到指令指定的地址去執(zhí)行;若不滿足條件,則順序執(zhí)行下一條指令。所有的條件轉(zhuǎn)移都是直接尋址方式的短轉(zhuǎn)移,即只能在以當前指令為中心的-128~+127范圍內(nèi)轉(zhuǎn)移。條件轉(zhuǎn)移指令不影響標志位

2023/12/6101

條件轉(zhuǎn)移指令

指令名稱助記符轉(zhuǎn)移條件

進位轉(zhuǎn)移JC(CF)=1無進位轉(zhuǎn)移JNC(CF)=0等于/零轉(zhuǎn)移JE/JZ(ZF)=1不等于/非零轉(zhuǎn)移JNE/JNZ(ZF)=0負轉(zhuǎn)移JS(SF)=1正轉(zhuǎn)移JNS(SF)=0溢出轉(zhuǎn)移JO(OF)=1不溢出轉(zhuǎn)移JNO(OF)=0偶轉(zhuǎn)移JP/JPE(PF)=1奇轉(zhuǎn)移JNP/JPO(PF)=02023/12/6102

低于

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論