《微型計算機原理》(王忠民版)PPT電子課件教案第4章80x86指令系統(tǒng)
《《微型計算機原理》(王忠民版)PPT電子課件教案第4章80x86指令系統(tǒng)》由會員分享,可在線閱讀,更多相關(guān)《《微型計算機原理》(王忠民版)PPT電子課件教案第4章80x86指令系統(tǒng)(305頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1、第4章 80 x86指令系統(tǒng) 第4章 80 x86指令系統(tǒng) 4.1 8086/8088指令系統(tǒng)指令系統(tǒng) 4.2 80 x86/Pentium指令系統(tǒng)指令系統(tǒng) 第4章 80 x86指令系統(tǒng) 4.1 8086/8088指令系統(tǒng)指令系統(tǒng) 4.1.1 8086/8088指令格式指令格式 用匯編語言編寫的匯編語言程序輸入計算機后,必須由“匯編程序”將它翻譯成由機器指令(指令碼)組成的機器語言程序,才能由計算機識別并執(zhí)行。因此匯編語言程序需由匯編程序翻譯成可執(zhí)行的機器語言程序,一般來說,這一過程不必由人來干預(yù)。我們這里只介紹一下基本原理,以便在必要時也可以手工完成類似的工作。 第4章 80 x86指令系統(tǒng)
2、 8086/8088指令系統(tǒng)的指令類型較多,功能很強。各種指令由于功能不同,需要指令碼提供的信息也不同。為了滿足不同功能的要求又要盡量減少指令所占的空間,8086/8088指令系統(tǒng)采用了一種靈活的、由16個字節(jié)組成的變字長的指令格式,包括操作碼、尋址方式以及操作數(shù)三個部分,如圖4.1所示。 通常指令的第一字節(jié)為操作碼字節(jié)(OPCODE),規(guī)定指令的操作類型;第二字節(jié)為尋址方式字節(jié)(MOD),規(guī)定操作數(shù)的尋址方式;接著以后的36字節(jié)依據(jù)指令的不同而取舍,可變字長的指令主要體現(xiàn)在這里,一般由它指出存儲器操作數(shù)地址的位移量或立即數(shù)。 第4章 80 x86指令系統(tǒng) OPCODEdata/disp-8O
3、PCODEMODOPCODEMODdata/disp-LoOPCODEMODdata/disp-Hidisp-LoOPCODEMODdisp-Hidata-8disp-LoOPCODEMODdisp-Hidisp-Lodisp-Hi圖4.1 8086/8088不同字長的指令碼格式 第4章 80 x86指令系統(tǒng) 操作碼操作碼/尋址方式字節(jié)格式如下:尋址方式字節(jié)格式如下: 第一字節(jié)中,指示操作數(shù)類型:W=0為字節(jié),W=1為字;D指示操作數(shù)的傳送方向:D=0表示寄存器操作數(shù)為源操作數(shù),D=1表示寄存器操作數(shù)為目的操作數(shù)。 第二字節(jié)指出所用的兩個操作數(shù)存放的位置,以及存儲器中操作數(shù)偏移地址的計算方法。
4、其中: 第4章 80 x86指令系統(tǒng) REG字段規(guī)定一個寄存器操作數(shù),它作為源操作數(shù)還是目的操作數(shù)已由第一字節(jié)中的D位規(guī)定。由REG字段選擇寄存器的具體規(guī)定如表4.1所示。 表4.1 REG字段編碼表 REGW=1(字操作) W=0(字節(jié)操作) 000AXAL001CXCL010DXDL011BXBL100SPAH101BPCH110SIDH111DIBH第4章 80 x86指令系統(tǒng) MOD字段用來區(qū)分另一個操作數(shù)在寄存器中(寄存器尋址)還是在存儲器中(存儲器尋址),在存儲器尋址的情況下,還用來指出該字節(jié)后面有無位移量,有多少位位移量。MOD字段的編碼如表4.2所示。 表4.2 MOD字段編碼
5、表 MOD尋址方式 00存儲器尋址,沒有位移量 01存儲器尋址,有8位位移 10存儲器尋址,有16位位移 11寄存器尋址,沒有位移量 第4章 80 x86指令系統(tǒng) R/M字段受MOD字段控制。MOD=11為寄存器方式,R/M字段將指出第二操作數(shù)所在的寄存器編號;MOD=00,01,10為存儲器方式,R/M則指出如何計算存儲器中操作數(shù)的偏移地址。MOD與R/M字段組合的尋址方式見表4.3。 第4章 80 x86指令系統(tǒng) 表表4.3 MOD與與R/M字段組合的尋址方式字段組合的尋址方式 第4章 80 x86指令系統(tǒng) 例例4.1 MOV AH,BX+DI+50H 代碼格式: 100010100110
6、000101010000OPCODE D W MOD REG R/M disp8指令碼為:8A6150H 第4章 80 x86指令系統(tǒng) 例例 4.2 ADD dispBXDI,DX ;disp=2345H 代碼格式: 00000001100100010101000000100011OPCODE D W MOD REG R/M dispHi disp-Hi指令碼為:01914523H 第4章 80 x86指令系統(tǒng) 4.1.2 8086/8088指令系統(tǒng)的尋址方式指令系統(tǒng)的尋址方式 1操作數(shù)的種類操作數(shù)的種類 1) 數(shù)據(jù)操作數(shù) 這類操作數(shù)是與數(shù)據(jù)有關(guān)的操作數(shù),即指令中操作的對象是數(shù)據(jù)。數(shù)據(jù)操作數(shù)又
7、可分為: (1) 立即數(shù)操作數(shù)。指令中要操作的數(shù)據(jù)包含在指令中。 (2)寄存器操作數(shù)。指令中要操作的數(shù)據(jù)存放在指定的寄存器中。 (3)存儲器操作數(shù)。指令中要操作的數(shù)據(jù)存放在指定的存儲單元中。 (4)I/O操作數(shù)。指令中要操作的數(shù)據(jù)來自或送到I/O端口。第4章 80 x86指令系統(tǒng) 2) 地址操作數(shù) 這類操作數(shù)是與程序轉(zhuǎn)移地址有關(guān)的操作數(shù),即指令中操作的對象不是數(shù)據(jù),而是要轉(zhuǎn)移的目標(biāo)地址。它也可以分為立即數(shù)操作數(shù)、寄存器操作數(shù)和存儲器操作數(shù),即要轉(zhuǎn)移的目標(biāo)地址包含在指令中,或存放在寄存器中,或存放在存儲單元之中。 對于數(shù)據(jù)操作數(shù),有的指令有兩個操作數(shù):一個稱為源操作數(shù),在操作過程中其值不改變;另
8、一個稱為目的操作數(shù),操作后一般被操作結(jié)果代替。有的指令只有一個操作數(shù),或沒有(或隱含)操作數(shù)。 對于地址操作數(shù),指令只有一個目的操作數(shù),它是一個供程序轉(zhuǎn)移的目標(biāo)地址。 第4章 80 x86指令系統(tǒng) 2尋址方式 所謂尋址方式,就是指指令中給出的尋找操作數(shù)(包括數(shù)據(jù)操作數(shù)和地址操作數(shù))的方法。根據(jù)操作數(shù)的種類,8086/8088指令系統(tǒng)的尋址方式分為兩大類:數(shù)據(jù)尋址方式和地址尋址方式。 1) 數(shù)據(jù)尋址方式 數(shù)據(jù)尋址方式可分為立即數(shù)尋址方式、寄存器尋址方式、存儲器尋址方式和I/O端口尋址方式四種類型。 第4章 80 x86指令系統(tǒng) (1) 立即數(shù)尋址方式(Immediate Addressing)。
9、立即數(shù)尋址方式所提供的操作數(shù)直接包含在指令中,緊跟在操作碼之后,它作為指令的一部分,這種操作數(shù)稱為立即數(shù)。立即數(shù)可以是位的,也可以是16位的。如果是16位數(shù),則高位字節(jié)存放在高地址存儲單元中,低位字節(jié)存放在低地址存儲單元中。例如:MOV BL,80HMOV AX,1090H則指令執(zhí)行情況如圖4.2所示。執(zhí)行結(jié)果為:(BL)=80H,(AX)=1090H。 第4章 80 x86指令系統(tǒng) BL操作碼80H存儲器AX操作碼90H10H存儲器圖4.2 立即數(shù)尋址方式指令的執(zhí)行情況 第4章 80 x86指令系統(tǒng) (2) 寄存器尋址方式(Register Addressing)。寄存器尋址方式的操作數(shù)存放
10、在指令規(guī)定的寄存器中,寄存器的名字在指令中指出。對于16位操作數(shù),寄存器可以是AX、BX、CX、DX、SI、DI、SP或BP。對于位操作數(shù),寄存器可以是AH、AL、BH、BL、CH、CL、DH或DL。例如:MOV CL,DLMOV AX,BX如果(DL)=50H,(BX)=1234H,則指令執(zhí)行情況如圖4.3所示。執(zhí)行結(jié)果為:(CL)=50H,(AX)=1234H。 第4章 80 x86指令系統(tǒng) 50HCLDLAX12H34HBX圖4.3 寄存器尋址方式的指令執(zhí)行情況 由于寄存器尋址方式的操作數(shù)就在CPU內(nèi)部的寄存器中,不需要訪問存儲器來取得操作數(shù),因而可以取得較高的運行速度。 第4章 80
11、x86指令系統(tǒng) (3) 存儲器尋址方式(Memory Addressing)。存儲器尋址方式的操作數(shù)存放在存儲單元中。在第3章中已經(jīng)知道,操作數(shù)在存儲器中的物理地址是由段地址左移4位與操作數(shù)在段內(nèi)的偏移地址相加得到的。段地址在實模式和保護模式下可從不同途徑取得。本節(jié)要討論的問題是指令中是如何給出存儲器操作數(shù)在段內(nèi)的偏移地址的。偏移地址又稱為有效地址(Effective Address,EA),所以存儲器尋址方式即為求得有效地址(EA)的不同途徑。 第4章 80 x86指令系統(tǒng) 有效地址可以由以下三種地址分量組成: 位移量(Displacement):它是存放在指令中的一個8位或16位的數(shù),但它
12、不是立即數(shù),而是一個地址。 基址(Base Address):它是存放在基址寄存器BX或BP中的內(nèi)容。 變址(Index Addess):它是存放在變址寄存器SI或DI中的內(nèi)容。 對于某條具體指令,這三個地址分量可有不同的組合。如果存在兩個或兩個以上的分量,那么就需要進行加法運算,求出操作數(shù)的有效地址(EA),進而求出物理地址(PA)。正是因為這三種地址分量有不同的組合,才使得對存儲器操作數(shù)的尋址產(chǎn)生了若干種不同的方式。 第4章 80 x86指令系統(tǒng) 直接尋址方式(Direct Addressing)。直接尋址方式的操作數(shù)有效地址只包含位移量一種分量,即在指令的操作碼后面直接給出有效地址。對這
13、種尋址方式有:EA=位移量。例如:MOV AL,1064H 如果(DS)=2000H,則指令執(zhí)行情況如圖4.4所示。執(zhí)行結(jié)果為:(AL)=45H。 第4章 80 x86指令系統(tǒng) 圖4.4 直接尋址方式的指令執(zhí)行情況AL操作碼64H10H存儲器45H20000H21064H20000H1064H21064H代碼段數(shù)據(jù)段第4章 80 x86指令系統(tǒng) 注意這種直接尋址方式與前面介紹的立即數(shù)尋址方式的不同。從指令的表示形式來看,在直接尋址方式中,對于表示有效地址的16位數(shù),必須加上方括號。從指令的功能上來看,本例指令的功能不是將立即數(shù)1064H 傳送到累加器AL,而是將一個有效地址是1064H的存儲單
14、元的內(nèi)容傳送到AL。設(shè)此時數(shù)據(jù)段寄存器(DS)=2000H,則該存儲單元的物理地址為:PA=2000H10H+1064H=20000H+1064H=21064H第4章 80 x86指令系統(tǒng) 如果沒有特殊指明,直接尋址方式的操作數(shù)一般在存儲器的數(shù)據(jù)段中,即隱含的段寄存器是DS。但是8086/8088也允許段超越,此時需要在指令中特別標(biāo)明,方法是在有關(guān)操作數(shù)的前面寫上操作數(shù)所在段的段寄存器名,再加上冒號。例如,若以上指令中源操作數(shù)不在數(shù)據(jù)段而在附加數(shù)據(jù)段中,則指令應(yīng)寫為如下形式: MOV AL,ES:1064H 在匯編語言指令中,可以用符號地址來表示位移量。例如: MOV AL,value 或MO
15、V AL,value此時value為存儲單元的符號地址。 第4章 80 x86指令系統(tǒng) 寄存器間接尋址方式(Register Indirect Addressing)。寄存器間接尋址方式的操作數(shù)有效地址只包含基址寄存器(BX)的內(nèi)容或變址寄存器(SI、DI)的內(nèi)容一種分量。因此,操作數(shù)的有效地址在某個寄存器中,而操作數(shù)本身則在存儲器中的數(shù)據(jù)段內(nèi)。這與寄存器尋址方式操作數(shù)就在寄存器中是不同的。 寄存器間接尋址方式的有效地址表示為: EA=(SI) (DI) (BX)第4章 80 x86指令系統(tǒng) 書寫指令時,用做間址的寄存器必須加上方括弧,以免與一般的寄存器尋址方式混淆。例如: MOV AX,SI
16、MOV BX,AL 如果(DS)=3000H,(SI)=2000H,(BX)=1000H,(AL)=64H,則上述兩條指令的執(zhí)行情況如圖4.5所示。執(zhí)行結(jié)果為:(AX)=4050H,(31000H)=64H。 第4章 80 x86指令系統(tǒng) 存儲器50H40H30000H32000HAX(DS)10H30000H(SI) 2000H32000H存儲器30000H31000HAL64H(DS)10H30000H(BX) 1000H31000H圖4.5 寄存器間接尋址方式的指令執(zhí)行情況 同樣,寄存器間接尋址方式也允許段超越。 例如: MOV ES:DI,AX 第4章 80 x86指令系統(tǒng) 寄存器相對
17、尋址方式(Register Relative Addressing)。寄存器相對尋址方式的操作數(shù)有效地址EA是一個基址寄存器或變址寄存器的內(nèi)容和指令中給定的8位或16位位移量相加之和,所以有效地址由兩種分量組成。可用做寄存器相對尋址方式的寄存器有基址寄存器BX、BP和變址寄存器SI、DI。即 (SI)(DI)(BX)(BP)EA=+disp8/disp16第4章 80 x86指令系統(tǒng) 上述位移量可以看成是一個存放于寄存器中的基值的一個相對值,故稱為寄存器相對尋址方式。在一般情況下,若指令中指定的寄存器是BX、SI、DI,則操作數(shù)默認(rèn)為存放在數(shù)據(jù)段中;若指令中指定的寄存器是BP,則操作數(shù)默認(rèn)為存
18、放在堆棧段中。同樣,寄存器相對尋址方式也允許段超越。 位移量既可以是一個8位或16位的立即數(shù),也可以是符號地址。例如:MOV SI+10H,AX MOV CX,BX+COUNT 第4章 80 x86指令系統(tǒng) 如果(DS)=3000H,(SI)=2000H,(BX)=1000H,COUNT=1050H,(AX)=4050H,則指令執(zhí)行情況如圖4.6所示。執(zhí)行結(jié)果為:(32010H)=4050H,(CX)=4030H。 CX操作碼50H10H存儲器30H30000H32050H操作碼40H(DS)10H30000H(BX) 1000HCOUNT 1050H32050H50HAX操作碼10H存儲器3
19、0000H32010H操作碼(DS)10H30000H(SI) 2000H10H32010H40H圖圖4.6 寄存器相對尋址方式的指令執(zhí)行情況寄存器相對尋址方式的指令執(zhí)行情況 第4章 80 x86指令系統(tǒng) 該尋址方式的操作數(shù)在匯編語言指令中書寫時可以是下述形式之一:MOV AL,BP+TABLEMOV AL,BP+ TABLEMOV AL,TABLEBP 其實以上三條指令代表的是同一功能的指令。其中TABLE為8位或16位位移量。 第4章 80 x86指令系統(tǒng) 基址變址尋址方式(Based Indexed Addressing)。基址變址尋址方式的操作數(shù)有效地址是一個基址寄存器(BX或BP)和
20、一個變址寄存器(SI或DI)的內(nèi)容之和,所以有效地址由兩種分量組成。即 )()()()(BPBXDISIEA 在一般情況下,由基址寄存器決定操作數(shù)在哪個段中。若用BX的內(nèi)容作為基地址,則操作數(shù)在數(shù)據(jù)段中;若用BP的內(nèi)容作為基地址,則操作數(shù)在堆棧段中?;纷冎穼ぶ贩绞酵瑯右苍试S段超越。例如:MOV BX+DI,AX MOV AH,BPSI 第4章 80 x86指令系統(tǒng) 設(shè)當(dāng)前(DS)=3000H,(SS)=4000H,(BX)=1000H,(DI)=1100H,(AX)=0050H,(BP)=2000H,(SI)=1200H,則指令的執(zhí)行情況如圖4.7所示。執(zhí)行結(jié)果為:(32100H)=0050
21、H,(AH)=56H。 存儲器30000H32100H00HAX50H(DS)10H30000H(BX) 1000H(DI) 1100H32100H存儲器56H40000H43200HAH(SS)10H40000H(BP) 2000H(SI) 1200H43200H圖4.7 基址變址尋址方式的指令執(zhí)行情況第4章 80 x86指令系統(tǒng) 該尋址方式的操作數(shù)在匯編語言指令中書寫時可以是下列形式之一:MOV AX,BP+SI MOV AX,BPSI 第4章 80 x86指令系統(tǒng) 基址變址相對尋址方式(Based Indexed Relative Addressing)?;纷冎废鄬ぶ贩绞降牟僮鲾?shù)有效
22、地址是一個基址寄存器內(nèi)容、一個變址寄存器內(nèi)容與指令中指定的一個8位或16位位移量之和,所以有效地址由三個分量組成。即 16/8)()()()(dispdispBPBXDISIEA第4章 80 x86指令系統(tǒng) 同樣,當(dāng)基址寄存器為BX時,操作數(shù)在數(shù)據(jù)段中;基址寄存器為BP時,操作數(shù)在堆棧段中?;纷冎废鄬ぶ贩绞酵瑯右苍试S段超越。例如: MOV AH,BX+DI+1234HMOV BP+SI+DATA,CX 若(DS)=4000H,(SS)=5000H,(BX)=1000H,(DI)=1500H,(BP)=2000H,(SI)=1050H,(CX)=2050H,DATA=10H,則指令執(zhí)行情況如
23、圖4.8所示。執(zhí)行結(jié)果為:(AH)=64H,(53060H)=2050H。 第4章 80 x86指令系統(tǒng) 基址變址相對尋址方式也可以表示成以下幾種不同的形式:MOV AX,BX+SI+COUNTMOV AX,BXSI +COUNTMOV AX,BX+SICOUNT MOV AX,BXSICOUNT MOV AX,COUNTBXSI 第4章 80 x86指令系統(tǒng) 存儲器64H40000H43734HAH(DS)10H40000H(BX) 1000H(DI) 1500H1234H43734H存儲器50000H53060H20HCX50H(SS)10H50000H(BP) 2000H(SI) 105
24、0HDATA 10H53060H圖4. 8 基址變址相對尋址方式的指令執(zhí)行情況 第4章 80 x86指令系統(tǒng) (4) I/O端口尋址方式。I/O端口尋址有以下兩種尋址方式: 端口直接尋址方式。對這種尋址方式,端口地址用8位立即數(shù)(0255)表示。例如:IN AL,21H 此指令表示從地址為21H的端口中讀取數(shù)據(jù)送到AL中。假設(shè)21H端口提供的數(shù)據(jù)為7FH,則指令執(zhí)行情況如圖4.9所示。執(zhí)行結(jié)果為:將21H端口提供的數(shù)據(jù)7FH輸入到8位寄存器AL中。 第4章 80 x86指令系統(tǒng) 端口間接尋址方式。當(dāng)I/O端口地址大于FFH時,必須事先將端口地址存放在DX寄存器中。例如: MOV DX,120H
25、 OUT DX,AX 前一條指令將端口地址120H送到DX寄存器,后一條指令將AX中的內(nèi)容輸出到地址由DX寄存器內(nèi)容所指定的端口中。指令執(zhí)行情況如圖4.10所示。執(zhí)行結(jié)果為:將AX寄存器的內(nèi)容輸出到120H端口。 第4章 80 x86指令系統(tǒng) 7FH接口端口0端口1端口33端口25500H01H21HFFHAL圖4.9 端口直接尋址的指令執(zhí)行情況 第4章 80 x86指令系統(tǒng) 接口端口0端口1端口288端口655350000H0001H0120HFFFFH10F0HAX0120HDX圖4.10 端口間接尋址的指令執(zhí)行情況 第4章 80 x86指令系統(tǒng) 2) 地址尋址方式 在8086/8088指
26、令系統(tǒng)中,有一組指令被用來控制程序的執(zhí)行順序。程序的執(zhí)行順序是由CS和IP的內(nèi)容所決定的。通常情況下,當(dāng)BIU完成一次取指周期后,就自動改變IP的內(nèi)容以指向下一條指令的地址,使程序按預(yù)先存放在程序存儲器中的指令的次序,由低地址到高地址順序執(zhí)行。如需要改變程序的執(zhí)行順序,當(dāng)轉(zhuǎn)移到所要求的指令地址再順序執(zhí)行時,可以安排一條程序轉(zhuǎn)移指令,并按指令的要求修改IP內(nèi)容或同時修改IP和CS的內(nèi)容,從而將程序轉(zhuǎn)移到指令所指定的轉(zhuǎn)移地址。地址尋址方式就是找出程序轉(zhuǎn)移的地址。轉(zhuǎn)移地址可以在段內(nèi)(稱為段內(nèi)轉(zhuǎn)移),也可以跨段(稱段間轉(zhuǎn)移)。尋求轉(zhuǎn)移地址的方法稱為地址尋址方式,它有如下四種方式。 第4章 80 x86
27、指令系統(tǒng) (1) 段內(nèi)直接尋址方式。段內(nèi)直接尋址方式也稱為相對尋址方式。轉(zhuǎn)移的地址是當(dāng)前的IP內(nèi)容和指令規(guī)定的下一條指令到目標(biāo)地址之間的8位或16位相對位移量之和,相對位移量可正可負(fù)。當(dāng)位移量是8位時,稱為短轉(zhuǎn)移,轉(zhuǎn)移范圍為128+127;位移量是16位時,稱為近轉(zhuǎn)移,轉(zhuǎn)移范圍為32768+32767。這種尋址方式適用于無條件轉(zhuǎn)移或條件轉(zhuǎn)移類指令。但條件轉(zhuǎn)移里只有8位位移量的短轉(zhuǎn)移。 第4章 80 x86指令系統(tǒng) 段內(nèi)直接尋址轉(zhuǎn)移指令的格式可以表示為:JMP NEAR PTR PROGIAJMP SHORT QUEST 其中,PROGIA和QUEST均為轉(zhuǎn)向的目標(biāo)地址,在機器指令中,用位移量來
28、表示。在匯編語言中,如果位移量為16位,則在目標(biāo)地址前加操作符NEAR PTR;如果位移量為位,則在目標(biāo)地址前加操作符SHORT。但是,如果目標(biāo)地址的標(biāo)號已經(jīng)定義(即標(biāo)號先定義后引用),那么,即使在標(biāo)號前沒有寫運算符SHORT,匯編程序也能自動生成一個2字節(jié)的短轉(zhuǎn)移指令。這種情況屬于隱含的短轉(zhuǎn)移。 第4章 80 x86指令系統(tǒng) (2) 段內(nèi)間接尋址方式。該尋址方式的程序轉(zhuǎn)移地址存放在寄存器或存儲單元中。存儲器可用各種數(shù)據(jù)尋址方式表示。指令的操作是用指定的寄存器或存儲器中的值取代當(dāng)前IP的內(nèi)容,以實現(xiàn)程序的段內(nèi)轉(zhuǎn)移。 這種尋址方式以及以下的兩種段間尋址方式都不能用于條件轉(zhuǎn)移指令。也就是說,條件轉(zhuǎn)
29、移指令只能使用段內(nèi)直接尋址的位位移量。 第4章 80 x86指令系統(tǒng) 段內(nèi)間接尋址轉(zhuǎn)移指令的格式可以表示為:JMP BXJMP WORD PTR BP+TABLE 其中WORD PTR為操作符,用以指出其后的尋址方式所取得的目標(biāo)地址是一個字的有效地址。 第4章 80 x86指令系統(tǒng) (3) 段間直接尋址方式。這種尋址方式是在指令中直接給出16位的段地址和16位的偏移地址用來更新當(dāng)前的CS和IP的內(nèi)容。指令的格式可以表示為:JMP LABEL_NAME JMP FAR PTR NEXTROUTINT其中,LABEL_NAME是一個在另外的代碼段內(nèi)已定義的遠標(biāo)號。指令的操作是用標(biāo)號的偏移地址取代指
30、令指針寄存器IP的內(nèi)容,同時用標(biāo)號所在段的段地址取代當(dāng)前代碼段寄存器CS的內(nèi)容,結(jié)果使程序轉(zhuǎn)移到另一代碼段內(nèi)指定的標(biāo)號處。第二條指令利用運算符將標(biāo)號NEXTROUTINT的屬性定義為FAR。 第4章 80 x86指令系統(tǒng) (4) 段間間接尋址方式。這種尋址方式是由指令中給出的存儲器尋址方式求出存放轉(zhuǎn)移地址的四個連續(xù)存儲單元的地址。指令的操作是將存儲器的前兩個單元的內(nèi)容送給IP,后兩個單元的內(nèi)容送給CS,以實現(xiàn)到另一個段的轉(zhuǎn)移。 以下是兩條段間間接轉(zhuǎn)移指令的例子:JMP VAR_DOUBLEWORDJMP DWORD PTRBPDI上面第一條指令中,VAR_DOUBLEWORD應(yīng)是一個已定義為3
31、2位的存儲器變量;第二條指令中,利用運算符PTR將存儲器操作數(shù)的類型定義為DWORD(雙字)。 第4章 80 x86指令系統(tǒng) 4.1.3 8086/8088指令系統(tǒng) 8086/8088的指令系統(tǒng)大致可分成以下六種類型: 數(shù)據(jù)傳送指令 算術(shù)運算指令 位操作指令 串操作指令 程序控制指令 處理器控制指令第4章 80 x86指令系統(tǒng) 1數(shù)據(jù)傳送指令數(shù)據(jù)傳送指令 數(shù)據(jù)傳送指令是程序中使用最頻繁的指令。這是因為不論程序針對何種具體的實際問題,往往都需要將原始數(shù)據(jù)、中間結(jié)果、最終結(jié)果以及其他各種信息在CPU的寄存器和存儲器或I/O端口之間多次傳送。 數(shù)據(jù)傳送指令按其功能的不同,可以分為通用數(shù)據(jù)傳送指令、輸
32、入輸出指令、目標(biāo)地址傳送指令和標(biāo)志傳送指令等四組。 第4章 80 x86指令系統(tǒng) 1) 通用數(shù)據(jù)傳送指令 通用數(shù)據(jù)傳送指令有以下四種。 (1) 數(shù)據(jù)傳送指令MOV (MOVement)。指令格式及操作: MOV dst,src ;(dst)(src) 指令格式中的dst表示目的操作數(shù),src表示源操作數(shù)(下同)。指令實現(xiàn)的操作是將源操作數(shù)送給目的操作數(shù)。這種傳送實際上是進行數(shù)據(jù)的“復(fù)制”,源操作數(shù)本身不變。 第4章 80 x86指令系統(tǒng) 這種雙操作數(shù)指令在匯編語言中的表示方法,總是將目的操作數(shù)寫在前面,源操作數(shù)寫在后面,二者之間用一個逗號隔開。 在MOV指令中源操作數(shù)可以是存儲器、寄存器、段寄
33、存器和立即數(shù);目的操作數(shù)可以是存儲器、寄存器(不能為IP)和段寄存器(不能為CS)。數(shù)據(jù)傳送的方向如圖4.11所示。 段寄存器CS DS SS ES存儲器通用存儲器AX BX CX DXBP SP SI DIALBLCL DLAHBHCH DH16位立即數(shù)16位8/16位8/16位8/16位圖4.11 MOV指令數(shù)據(jù)傳送方向 第4章 80 x86指令系統(tǒng) 必須注意,不能用一條MOV指令實現(xiàn)以下傳送: 存儲單元之間的傳送。 立即數(shù)至段寄存器的傳送。 段寄存器之間的傳送。 需說明一點,對于代碼段寄存器CS和指令指針寄存器IP,通常無需用戶利用傳送指令改變其中的內(nèi)容。但是CS可以作為源操作數(shù)。 第4
34、章 80 x86指令系統(tǒng) (2) 堆棧操作指令。堆棧操作指令是用來完成壓入和彈出堆棧操作的。8086/8088指令系統(tǒng)中提供了完成這兩種操作的相應(yīng)指令。 壓入堆棧指令PUSH (PUSH word onto stack)。指令格式及操作: PUSHsrc ;(SP)(SP)2,(SP)+1:(SP)(src) 第4章 80 x86指令系統(tǒng) 指令完成的操作是“先移后入”,即先將堆棧指針SP減2,使SP始終指向棧頂,然后再將操作數(shù)src壓入(SP)+1和(SP)兩個存儲單元中。指令中的操作數(shù)src可以是通用寄存器和段寄存器,也可以是由某種尋址方式所指示的存儲單元,但不能是立即數(shù)。例如: PUSH
35、AX ;(SP)(SP)2,(SP)+1)(AH),(SP)(AL)PUSH CSPUSH SI 第4章 80 x86指令系統(tǒng) 彈出堆棧指令POP (POP word off stack)。指令格式及操作:POP dst ;(dst)(SP)+1:(SP),(SP)(SP)+2 指令完成的操作是“先出后移”,即先將堆棧指針SP所指示的棧頂存儲單元的值彈出到操作數(shù)dst中,然后再將堆棧指針SP加2,使其指向棧頂。指令中的操作數(shù)dst可以是存儲器、通用寄存器或段寄存器(但不能是代碼段寄存器CS),同樣也不能是立即數(shù)。例如: POP BX ;(BL)(SP),(BH)(SP)+1), (SP)(SP
36、)+2 POP ES POP MEMDI 應(yīng)該注意,堆棧操作指令中的操作數(shù)類型必須是字操作數(shù),即16位操作數(shù)。 第4章 80 x86指令系統(tǒng) (3) 數(shù)據(jù)交換指令XCHG (eXCHanGe)。指令格式及操作:XCHG dst,src ;(dst)(src) 該指令的操作是使源操作數(shù)與目的操作數(shù)進行交換,即不僅將源操作數(shù)傳送到目的操作數(shù),而且同時將目的操作數(shù)傳送到源操作數(shù)。 交換指令的源操作數(shù)和目的操作數(shù)各自均可以是寄存器或存儲器,但不能二者同時為存儲器。也就是說,可以在寄存器與寄存器之間,或者寄存器與存儲器之間進行交換。此外,段寄存器的內(nèi)容不能參加交換。 交換的內(nèi)容可以是一個字節(jié)(8位),也
37、可以是一個字(16位)。 第4章 80 x86指令系統(tǒng) (4) 字節(jié)轉(zhuǎn)換指令XLAT (transLATe)。指令格式及操作:XLAT src_table ;(AL)(BX)+(AL) XLAT指令是字節(jié)查表轉(zhuǎn)換指令,可以根據(jù)表中元素的序號,查出表中相應(yīng)元素的內(nèi)容。為了實現(xiàn)查表轉(zhuǎn)換,預(yù)先應(yīng)將表的首地址,即表頭地址傳送到BX寄存器,元素的序號即位移量送AL,表中第一個元素的序號為0,然后依次是1,2,3,。執(zhí)行XLAT指令后,表中指定序號的元素存于AL。由于需要將元素的序號送AL寄存器,所以被尋址的表的最大長度為255個字節(jié)。這是一種特殊的基址變址尋址方式,基址寄存器為BX,變址寄存器為AL。利
38、用XLAT指令實現(xiàn)不同數(shù)制或編碼系統(tǒng)之間的轉(zhuǎn)換十分方便。 第4章 80 x86指令系統(tǒng) 圖4.12 十六進制數(shù)的ASCII碼表30H(0)31H(1)32H(2)39H(9)41H(A)42H(B)46H(F)存儲器Hex_table0Hex_table1Hex_table2Hex_table9Hex_table10Hex_table11Hex_table15第4章 80 x86指令系統(tǒng) 例如內(nèi)存的數(shù)據(jù)段有一張十六進制數(shù)的ASCII碼表,其首地址為Hex_table,如圖4.12所示,為了查出第10個元素(元素序號從0開始),即十六進制數(shù)A的ASCII碼,可用以下幾條指令實現(xiàn):MOV BX,O
39、FFSET Hex_table;(BX)表首址MOV AL,0AH ;(AL)序號XLAT Hex_table ;查表轉(zhuǎn)換結(jié)果十六進制數(shù)A的ASCII碼在AL中,即(AL)=41H。 第4章 80 x86指令系統(tǒng) 上例中查表轉(zhuǎn)換指令后面的操作數(shù)首地址Hex_table(類型為字節(jié)),實際上已經(jīng)預(yù)先傳送到BX寄存器中,寫在XLAT指令中是為了匯編程序用以檢查類型的正確性。但是XLAT指令后面也可以不寫操作數(shù)。 BX寄存器中包含著表的首地址,所在的段由隱含值確定(即DS)。但也允許段超越,此時必須在指令中寫明重設(shè)的段寄存器。XLAT指令的幾種表示形式如下:XLAT;不寫操作數(shù)XLAT src_ta
40、ble ;寫操作數(shù)XLATB ;B表示字節(jié)類型,不允許再寫操作數(shù) XLAT ES:src_table ;重設(shè)段寄存器為ES,必須寫操作數(shù) 第4章 80 x86指令系統(tǒng) 2) 輸入輸出指令 輸入輸出指令共有兩條。輸入指令I(lǐng)N用于從外設(shè)端口讀入數(shù)據(jù),輸出指令OUT則向端口發(fā)送數(shù)據(jù)。無論是讀入的數(shù)據(jù)或是準(zhǔn)備發(fā)送的數(shù)據(jù)都必須放在寄存器AL(字節(jié))或AX(字)中。 輸入輸出指令可以分為兩大類:一類是端口直接尋址的輸入輸出指令;另一類是端口通過DX寄存器間接尋址的輸入輸出指令。在直接尋址的指令中只能尋址256個端口(0255),而間接尋址的指令中可尋址64 K個端口(065535)。 第4章 80 x86
41、指令系統(tǒng) (1) 輸入指令I(lǐng)N (INput byte or word)。輸入指令分直接尋址輸入指令和間接尋址輸入指令。 直接尋址的輸入指令。指令格式及操作: IN acc,port ;(acc)(port) 指令中直接給出端口地址(地址小于0FFH),其功能為從指令中直接指定的端口中讀入一個字節(jié)或一個字送AL或AX。 第4章 80 x86指令系統(tǒng) 間接尋址的輸入指令。指令格式及操作:IN acc,DX ;(acc)(DX) 此指令是從DX寄存器內(nèi)容指定的端口中將8/16位數(shù)據(jù)送入AL/AX中。這種尋址方式的端口地址由16位地址表示,執(zhí)行此指令前應(yīng)將16位地址存入DX寄存器中。 第4章 80
42、x86指令系統(tǒng) (2) 輸出指令OUT (OUTput byte or word)。輸出指令分直接尋址輸出指令和間接尋址輸出指令。 直接尋址的輸出指令。指令格式及操作:OUT port,acc ;(port)(acc) 此指令將AL(8位)或AX(16位)中的數(shù)據(jù)輸出到指令指定的I/O端口,端口地址應(yīng)不大于FFH。 第4章 80 x86指令系統(tǒng) 間接尋址的輸出指令。指令格式及操作:OUT DX,acc ;(DX)(acc) 此指令將AL(8位)或AX(16位)中的數(shù)據(jù)輸出到由DX寄存器內(nèi)容指定的I/O端口中。 第4章 80 x86指令系統(tǒng) 3) 目標(biāo)地址傳送指令 8086/8088 CPU提供
43、了三條把地址指針寫入寄存器或寄存器對的指令,它們可以用來寫入近地址指針和遠地址指針。 (1) 取有效地址指令LEA (Load Effective Address)。指令格式:LEA reg16,mem LEA指令將一個近地址指針寫入到指定的寄存器。指令中的目的操作數(shù)必須是一個16位通用寄存器,源操作數(shù)必須是一個存儲器操作數(shù),指令的執(zhí)行結(jié)果是把源操作數(shù)的有效地址,即16位偏移地址傳送到目標(biāo)寄存器。例如: 第4章 80 x86指令系統(tǒng) LEA BX,BUFFER;(BX)OFFSET BUFFERLEA AX,BPDI;(AX)(BP)+(DI)LEA DX,BETABXSI;(DI)(BP)+
44、(SI)+BETA注意LEA指令與MOV指令的區(qū)別,比較下面兩條指令:LEA BX,BUFFER MOV BX,BUFFER 第4章 80 x86指令系統(tǒng) 前者將存儲器變量BUFFER的偏移地址送到BX,而后者將存儲器變量BUFFER的內(nèi)容(兩個字節(jié))傳送到BX。當(dāng)然也可以用MOV指令來得到存儲器的偏移地址,例如以下兩條指令的效果相同:LEA BX,BUFFERMOV BX,OFFSET BUFFER其中OFFSET BUFFER表示存儲器變量BUFFER的偏移地址。 第4章 80 x86指令系統(tǒng) (2) 地址指針裝入DS指令LDS (Load pointer into DS)。指令格式:LD
45、S reg16,mem32 LDS指令和下面即將介紹的LES指令都是用于寫入遠地址指針。源操作數(shù)是存儲器操作數(shù),目的操作數(shù)可以是任一個16位通用寄存器。 LDS傳送一個32位的遠地址指針,其中包括一個偏移地址和一個段地址,前者送指令中指定的寄存器(目的操作數(shù)),后者送數(shù)據(jù)段寄存器DS。例如: LDS SI,0010H設(shè)當(dāng)前(DS)=C000H,而有關(guān)存儲單元的內(nèi)容為(C0010H)=80H,(C0011H)=01H,(C0012H)=00H,(C0013H)=20H,則執(zhí)行該指令后,SI寄存器的內(nèi)容為0180H,段寄存器DS的內(nèi)容為2000H。 第4章 80 x86指令系統(tǒng) (3) 地址指針裝
46、入ES指令LES (Load pointer into ES)。指令格式: LES reg16,mem32 LES指令與LDS類似,也是裝入一個32位的遠地址指針。位移地址送指定寄存器,但是,段地址送附加段寄存器ES。 目標(biāo)地址傳送指令常常用于在串操作時建立初始的地址指針。 第4章 80 x86指令系統(tǒng) 4) 標(biāo)志傳送指令 8086/8088 CPU中有一標(biāo)志寄存器FLAGS,其中包括6個狀態(tài)標(biāo)志位和3個控制位。每一狀態(tài)標(biāo)志位表示CPU運行的狀態(tài)。許多指令執(zhí)行結(jié)果會影響標(biāo)志寄存器的某些狀態(tài)標(biāo)志位。同時,有些指令的執(zhí)行也受標(biāo)志寄存器中控制位的控制。標(biāo)志傳送指令共有4條。這些指令都是單字節(jié)指令,指
47、令的操作數(shù)為隱含形式。 第4章 80 x86指令系統(tǒng) (1) 取標(biāo)志指令LAHF (Load AH from Flags)。指令格式: LAHF LAHF指令將標(biāo)志寄存器FLAGS中的5個狀態(tài)標(biāo)志位SF、ZF、AF、PF以及CF分別取出傳送到累加器AH的對應(yīng)位,如圖4.13所示。LAHF指令對狀態(tài)標(biāo)志位沒有影響。 OF DF IF TF SF ZF AF PF CFAHFLAGS圖4.13 LAHF指令操作示意圖 第4章 80 x86指令系統(tǒng) (2) 置標(biāo)志指令SAHF (Store AH into Flags)。指令格式: SAHF SAHF指令的傳送方向與LAHF相反,將AH寄存器中的第7
48、、6、4、2、0位分別傳送到標(biāo)志寄存器的對應(yīng)位,如圖4.14所示。 OF DF IF TF SF ZF AF PF CFAHFLAGS圖4.14 SAHF指令操作示意圖 第4章 80 x86指令系統(tǒng) (3) 標(biāo)志壓入堆棧指令PUSHF (PUSH Flags onto stack)。指令格式及操作:PUSHF ;(SP)(SP)2,(SP)+1):(SP)(FLAGS) PUSHF指令先將SP減2,然后將標(biāo)志寄存器FLAGS的內(nèi)容(16位)壓入堆棧。這條指令本身不影響狀態(tài)標(biāo)志位。 第4章 80 x86指令系統(tǒng) (4) 標(biāo)志彈出堆棧指令POPF (POP Flags off stack)。指令格
49、式及操作:POPF ;(FLAGS)(SP)+1:(SP),(SP)(SP)+2 POPF指令的操作與PUSHF相反,它將堆棧內(nèi)容彈出到標(biāo)志寄存器,然后SP加2。POPF指令對狀態(tài)標(biāo)志位有影響,使各狀態(tài)標(biāo)志位恢復(fù)為壓入堆棧以前的狀態(tài)。 PUSHF指令可用于調(diào)用過程時保護當(dāng)前標(biāo)志寄存器的值,過程返回以后再使用POPF指令恢復(fù)標(biāo)志寄存器原來的值。 數(shù)據(jù)傳送指令除了SAHF和POPF外都不影響狀態(tài)標(biāo)志位。 第4章 80 x86指令系統(tǒng) 2算術(shù)運算指令 1) 算術(shù)運算的數(shù)據(jù)類型 8086/8088的算術(shù)運算指令可以處理四種類型的數(shù):無符號的二進制數(shù)、帶符號的二進制數(shù)、無符號的壓縮十進制數(shù)(壓縮型BCD
50、碼)和無符號的非壓縮十進制數(shù)(非壓縮型BCD碼)。除壓縮十進制數(shù)只有加/減運算外,其余三種數(shù)據(jù)類型都可以進行加、減、乘、除運算。 二進制的無符號數(shù)和帶符號數(shù)的長度都可以是8位或16位,但應(yīng)注意它們所能表示的數(shù)的范圍是不同的。若是帶符號數(shù),則用補碼表示。 第4章 80 x86指令系統(tǒng) 十進制數(shù)以字節(jié)的形式存儲。對壓縮十進制數(shù),每個字節(jié)存兩位數(shù),即兩位BCD碼,因而對于一個字節(jié)來說,壓縮十進制數(shù)的范圍是099。而對非壓縮的十進制數(shù),每個字節(jié)存一位數(shù),即由字節(jié)的低4位決定存放的數(shù)字,對于高4位,在進行乘/除運算時必須全為0,加/減運算時可以是任何值。 8086/8088提供的各種調(diào)整操作指令可以方便
51、地進行壓縮或非壓縮十進制數(shù)的算術(shù)運算。 第4章 80 x86指令系統(tǒng) 2) 算術(shù)運算指令對標(biāo)志位的影響 8086/8088的算術(shù)運算指令將運算結(jié)果的某些特性傳送到6個狀態(tài)標(biāo)志位上去,這些標(biāo)志位中的絕大多數(shù)可由跟在算術(shù)運算指令后的條件轉(zhuǎn)移指令進行測試,以改變程序的流程。因此掌握指令執(zhí)行結(jié)果對標(biāo)志位的影響,對編程有著重要的作用。關(guān)于6個狀態(tài)標(biāo)志位的含義已在第3章中做了介紹,這里不再重復(fù)。 算術(shù)運算類指令共有20條,包括加、減、乘、除運算,符號擴展和十進制調(diào)整指令,除符號擴展指令(CBW,CWD)外,其余指令都影響標(biāo)志位。 第4章 80 x86指令系統(tǒng) 3) 二進制數(shù)運算指令 二進制數(shù)運算指令包括加
52、法、減法、乘法、除法和符號擴展指令等五種。 (1) 加法指令。加法指令包括不帶進位加法指令、帶進位加法指令和加1指令。 加法指令A(yù)DD (ADDition)。指令格式及操作: ADD dst,src ;(dst)(dst)+(src) ADD指令將目的操作數(shù)與源操作數(shù)相加,并將結(jié)果送給目的操作數(shù)。加法指令將影響狀態(tài)標(biāo)志位。 第4章 80 x86指令系統(tǒng) 目的操作數(shù)可以是寄存器或存儲器,源操作數(shù)可以是寄存器、存儲器或立即數(shù)。但是源操作數(shù)和目的操作數(shù)不能同時為存儲器。另外,不能對段寄存器進行加法運算(段寄存器也不能參加、減、乘、除運算)。加法指令的操作對象可以是8位數(shù)(字節(jié)),也可以是16位數(shù)(字
53、)。例如:ADD CL,10ADD DX,SIADD AX,MEMADD DATABX,AL ADD ALPHADI,30H;變量ALPHA的類型決定指令完成字節(jié)加還是字加 第4章 80 x86指令系統(tǒng) 相加的數(shù)據(jù)類型可以根據(jù)編程者的意圖,規(guī)定為帶符號數(shù)或無符號數(shù)。對于無符號數(shù),若相加結(jié)果超出了8位或16位無符號數(shù)所能表示的范圍,則進位標(biāo)志位CF被置1;對于帶符號數(shù),如果相加結(jié)果超出了8位或16位補碼所能表示的范圍(128+127或32 768+32 767),則溢出標(biāo)志位OF被置1,結(jié)果溢出。 第4章 80 x86指令系統(tǒng) 帶進位加法指令A(yù)DC (ADdition with Carry)。指
54、令格式及操作: ADC dst,src ;(dst)(dst)+(src)+(CF) ADC指令是將目的操作數(shù)與源操作數(shù)相加,再加上進位標(biāo)志CF的內(nèi)容,然后將結(jié)果送給目的操作數(shù)。與ADD指令一樣,ADC指令的運算結(jié)果也將修改狀態(tài)標(biāo)志位。目的操作數(shù)及源操作數(shù)的類型與ADD指令相同,而且ADC指令同樣也可以進行字節(jié)操作或字操作。 帶進位加法指令主要用于多字節(jié)數(shù)據(jù)的加法運算。如果低字節(jié)相加時產(chǎn)生進位,則在下一次高字節(jié)相加時將這個進位加進去。 第4章 80 x86指令系統(tǒng) 例 4 . 3 計 算 兩 個 多 字 節(jié) 十 六 進 制 數(shù) 之 和 :3B74AC60F8H+20D59E36C1H=? 式中
55、被加數(shù)和加數(shù)均有5個字節(jié),可以編一個循環(huán)程序?qū)崿F(xiàn)以上運算。假設(shè)已將被加數(shù)和加數(shù)分別存入從DATA1和DATA2開始的兩個內(nèi)存區(qū),且均為低位字節(jié)在前,高位字節(jié)在后,如圖4.15所示。要求相加所得結(jié)果仍存回以DATA1為首址的內(nèi)存區(qū)。 第4章 80 x86指令系統(tǒng) 程序流程圖如圖4.16所示。程序如下:MOV CX,5;設(shè)置循環(huán)次數(shù)MOV SI,0 ;置位移量初值CLC ;清進位CFLOOPER:MOV AL,DATA2SI;取一個加數(shù)ADC DATA1SI,AL;和一個被加數(shù)相加INC SI ;位移量加1DEC CX ;循環(huán)次數(shù)減1 JNZ LOOPER ;加完否,若沒完,轉(zhuǎn)LOOPER,繼續(xù)相
56、加HLT ;程序暫停 第4章 80 x86指令系統(tǒng) F8H60HACH存儲器DATA174H3BHC1H36H9EHD5H20HDATA2被加數(shù)加數(shù)圖4.15 例4.3中被加數(shù)和加數(shù)在內(nèi)存中的存放情況 第4章 80 x86指令系統(tǒng) 開始初始化: 置循環(huán)次數(shù)清SI, 清進位標(biāo)志CF取一個字節(jié)加數(shù)與一個被加數(shù)相加并送回內(nèi)存區(qū)SI加1循環(huán)次數(shù)減1循環(huán)次數(shù)到結(jié)束YN 圖4.16 例4.3的程序流程圖 第4章 80 x86指令系統(tǒng) 加1指令I(lǐng)NC (INCrement by 1)。指令格式及操作: INC dst ;(dst)(dst)+1 INC指令將目的操作數(shù)加1,并將結(jié)果送回目的操作數(shù)。指令將影響
57、狀態(tài)標(biāo)志位,如SF、ZF、AF、PF和OF,但對進位標(biāo)志CF沒有影響。 INC指令中目的操作數(shù)可以是寄存器或存儲器,但不能是立即數(shù)和段寄存器。其類型為字節(jié)操作或字操作均可。例如: 第4章 80 x86指令系統(tǒng) INC DLINC SIINC BYTE PTRBXSI INC WORD PTRDI 指令中的BYTE PTR或WORD PTR分別指定隨后的存儲器操作數(shù)的類型是字節(jié)或字。 INC指令常常用于在循環(huán)程序中修改地址。 第4章 80 x86指令系統(tǒng) (2) 減法指令。減法指令包括不帶借位減法指令、帶借位減法指令、減1指令、求補指令和比較指令。 減法指令SUB (SUBtraction)。指
58、令格式及操作: SUB dst,src ;(dst)(dst) (src) SUB指令將目的操作數(shù)減源操作數(shù),結(jié)果送回目的操作數(shù)。指令對狀態(tài)標(biāo)志位有影響。 第4章 80 x86指令系統(tǒng) 操作數(shù)的類型與加法指令一樣,即目的操作數(shù)可以是寄存器或存儲器,源操作數(shù)可以是立即數(shù)、寄存器或存儲器,但不允許兩個存儲器操作數(shù)相減;既可以字節(jié)相減,也可以字相減。例如: SUB AL,37H SUB DX,BX SUB CX,VARE1 SUB ARRAYDI,AX SUB BETABXDI,512;BETA為字型變量,若為字節(jié)型變量,則源操作數(shù)超出范圍 第4章 80 x86指令系統(tǒng) 減法數(shù)據(jù)的類型也可以根據(jù)程序
59、員的要求約定為帶符號數(shù)或無符號數(shù)。當(dāng)無符號數(shù)的較小數(shù)減較大數(shù)時,因不夠減而產(chǎn)生借位,此時進位標(biāo)志CF置1。當(dāng)帶符號數(shù)的較小數(shù)減較大數(shù)時,將得到負(fù)的結(jié)果,則符號標(biāo)志SF置1。帶符號數(shù)相減如果結(jié)果溢出,則OF置1。 第4章 80 x86指令系統(tǒng) 帶借位減法指令SBB (SuBtraction with Borrow)。指令格式及操作:SBB dst,src ;(dst)(dst)(src)(CF) SBB指令是將目的操作數(shù)減源操作數(shù),然后再減進位標(biāo)志CF,并將結(jié)果送回目的操作數(shù)。SBB指令對標(biāo)志位的影響與SUB指令相同。 第4章 80 x86指令系統(tǒng) 目的操作數(shù)及源操作數(shù)的類型也與SUB指令相同。
60、8位或16位數(shù)運算均可。例如:SBB BX,1000SBB CX,DXSBB AL,DATA1SISBB DISPBP,BLSBB BYTE PTR SI+6,97 帶借位減指令主要用于多字節(jié)的減法。 第4章 80 x86指令系統(tǒng) 減1指令DEC (DECrement by 1)。指令格式及操作:DEC dst ;(dst)(dst) 1 DEC指令將目的操作數(shù)減1,結(jié)果送回目的操作數(shù)。指令對狀態(tài)標(biāo)志位SF、ZF、AF、PF和OF有影響,但不影響進位標(biāo)志CF。 操作數(shù)與INC一樣,可以是寄存器或存儲器(立即數(shù)和段寄存器不可)。其類型是字節(jié)操作或字操作均可。例如: DEC BLDEC CXDEC
61、 BYTE PTRBX DEC WORD PTRBPDI 第4章 80 x86指令系統(tǒng) 在循環(huán)程序中常常利用DEC指令來修改循環(huán)次數(shù)。例如: MOV AX,0FFFFHCYC:DEC AX JNZ CYC HLT 以上程序段中DEC AX指令重復(fù)執(zhí)行65535(0FFFFH)次。此程序?qū)嶋H上是一段延時程序。 第4章 80 x86指令系統(tǒng) 求補指令NEG(NEGate)。指令格式及操作: NEG dst ;(dst)0 (dst) NEG指令的操作是用“0”減去目的操作數(shù),結(jié)果送回原來的目的操作數(shù)。求補指令對狀態(tài)標(biāo)志位有影響。 操作數(shù)可以是寄存器或存儲器??梢詫?位數(shù)或16位數(shù)求補。例如:NEG
62、 BLNEG AXNEG BYTE PTRBPSINEG WORD PTRDI+20 第4章 80 x86指令系統(tǒng) 例4.4 內(nèi)存數(shù)據(jù)段存放了200個帶符號數(shù),首地址為TAB1,要求將各數(shù)取絕對值后存入以TAB2為首址的內(nèi)存區(qū)。 由于200個帶符號數(shù)中可能既有正數(shù),又有負(fù)數(shù),因此先要判斷正負(fù)。如為正數(shù),可以原封不動地傳送到另一內(nèi)存區(qū);如為負(fù)數(shù),則需先求補即可得到負(fù)數(shù)的絕對值,然后再傳送。程序如下: LEA SI,TAB1;(SI)源地址指針LEA DI,TAB2 ;(DI)目標(biāo)地址指針 MOV CX,200 ;(CX)循環(huán)次數(shù) 第4章 80 x86指令系統(tǒng) CHECK: MOVAL,SI ;取
63、一個帶符號數(shù)到ALORAL,AL ;AL內(nèi)容不變,但使之影響標(biāo)志JNSNEXT ;若(SF)=0,則轉(zhuǎn)NEXTNEG AL ;否則求補NEXT:MOV DI,AL ;傳送到目標(biāo)地址INC SI ;源地址加1INC DI ;目標(biāo)地址加1DEC CX ;循環(huán)次數(shù)減1JNZ CHECK ;如不等于零,則轉(zhuǎn)CHECKHLT ;停止 第4章 80 x86指令系統(tǒng) 比較指令CMP (CoMPare)。指令格式及操作:CMP dst,src ;(dst) (src) CMP指令將目的操作數(shù)減源操作數(shù),但結(jié)果不送回目的操作數(shù)。因此,執(zhí)行比較指令以后,被比較的兩個操作數(shù)內(nèi)容均保持不變,而比較結(jié)果反映在狀態(tài)標(biāo)志位
64、上,這是比較指令與減法指令SUB的區(qū)別所在。 第4章 80 x86指令系統(tǒng) CMP指令的目的操作數(shù)可以是寄存器或存儲器,源操作數(shù)可以是立即數(shù)、寄存器或存儲器,但不能同時為存儲器??梢赃M行字節(jié)比較,也可以是字比較。例如:CMP AL,0AH ;寄存器與立即數(shù)比較CMP CX,DI ;寄存器與寄存器比較CMP AX,AREA1 ;寄存器與存儲器比較CMP BX+5,SI ;存儲器與寄存器比較 比較指令的執(zhí)行結(jié)果將影響狀態(tài)標(biāo)志位。例如,若兩個被比較的內(nèi)容相等,則(ZF)=1。又如,假設(shè)被比較的兩個無符號數(shù)中,前者小于后者(即不夠減),則(CF)=1,等等。比較指令常常與條件轉(zhuǎn)移指令結(jié)合起來使用,完成
65、各種條件判斷和相應(yīng)的程序轉(zhuǎn)移。 第4章 80 x86指令系統(tǒng) 例4.5 在數(shù)據(jù)段從MYDATA開始的存儲單元中分別存放了兩個8位無符號數(shù),試比較它們的大小,并將大者傳送到MAX單元。程序如下:LEABX,MYDATA;MYDATA偏移地址送BXMOVAL,BX ;第一個無符號數(shù)送ALINCBX ;BX指向第二個無符號數(shù)CMP AL,BX ;兩個數(shù)比較JNC DONE ;如CF=0,則轉(zhuǎn)DONEMOV AL,BX ;否則,第二個無符號數(shù)送ALDONE:MOV MAX,AL ;較大的無符號數(shù)送MAX單元 HLT ;停止 第4章 80 x86指令系統(tǒng) (3) 乘法指令。8086/8088指令系統(tǒng)中有
66、兩條乘法指令,可以實現(xiàn)無符號數(shù)的乘法和帶符號數(shù)的乘法,它們都只有一個源操作數(shù),而目的操作數(shù)是隱含的。這兩條指令都可以實現(xiàn)字節(jié)或字的乘法運算。進行乘法運算時,如果兩個8位數(shù)相乘,那么其乘積最多為16位;如果兩個16位數(shù)相乘,可得到32位的乘積。 需要指出的是,8086/8088 CPU在執(zhí)行乘法指令時,有一個操作數(shù)總是放在累加器(8位數(shù)放在AL,16位數(shù)放在AX)中。8位數(shù)相乘時,其乘積(16位)存放在AX中;16位數(shù)相乘時,其乘積(32位)存放在DX:AX中,其中高16位存于DX中,低16位存于AX中,如圖4.17所示。 第4章 80 x86指令系統(tǒng) (16位)(16位)AXDX乘積乘數(shù)被乘數(shù)(8位)(8位)AX乘積乘數(shù)被乘數(shù)(16位)(32位)操作數(shù)AX操作數(shù)AL圖4.17 乘法運算的操作數(shù)及運算結(jié)果 第4章 80 x86指令系統(tǒng) 無符號數(shù)乘法指令MUL (MULtiplication unsigned)。指令格式及操作: MUL src ;(AX)(AL) (src) (字節(jié)乘法) ;(DX:AX)(AX) (src)(字乘法) MUL指令對狀態(tài)標(biāo)志位CF和OF有影響,SF、ZF、
- 溫馨提示:
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)容負(fù)責(zé)。
6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。