




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
8086尋址方式與指令系統(tǒng)4.1.1匯編語(yǔ)言與機(jī)器語(yǔ)言
我們已經(jīng)學(xué)過(guò)高級(jí)語(yǔ)言,例如BASIC語(yǔ)言或FORTRAN語(yǔ)言,無(wú)論哪種語(yǔ)言,它都規(guī)定了一系列用于編寫(xiě)程序的語(yǔ)句和應(yīng)該遵循的語(yǔ)法規(guī)則。人們根據(jù)一種語(yǔ)言給定的語(yǔ)句及其語(yǔ)法規(guī)則就可以寫(xiě)出程序,計(jì)算機(jī)則通過(guò)執(zhí)行已編好的程序來(lái)完成人們要求它完成的各種復(fù)雜功能。匯編語(yǔ)言也一樣,根據(jù)匯編語(yǔ)言的語(yǔ)句及其語(yǔ)法規(guī)則可以寫(xiě)出匯編語(yǔ)言程序。但匯編語(yǔ)言與高級(jí)語(yǔ)言有較大的區(qū)別,匯編語(yǔ)言中的語(yǔ)句與機(jī)器的種類(lèi)和型號(hào)密切相關(guān)?!?.1匯編語(yǔ)言及匯編程序的基本概念
在高級(jí)語(yǔ)言中,完成某個(gè)加法功能,我們可采用語(yǔ)句X=A+B,只要給變量A和B賦一確定值,此加法就可以實(shí)現(xiàn)了。在匯編語(yǔ)言中則不同,程序必須指出A,B存放在何處,相加后的結(jié)果又存放在何處,然后才能實(shí)現(xiàn)這一加法運(yùn)算。顯然,匯編語(yǔ)言在通過(guò)程序告訴計(jì)算機(jī)做什么和如何做時(shí),顯得更加具體。正是這種具體,使得該語(yǔ)言與計(jì)算機(jī)(處理器)緊密相關(guān),從而也要求學(xué)習(xí)和使用匯編語(yǔ)言的人對(duì)處理器的結(jié)構(gòu)有更加深入的了解。那么,什么是機(jī)器語(yǔ)言,匯編語(yǔ)言與機(jī)器語(yǔ)言之間又有什么關(guān)系呢?我們說(shuō),機(jī)器語(yǔ)言是這樣一種語(yǔ)言,它的每條語(yǔ)句就是計(jì)算機(jī)可以直接執(zhí)行的一條指令,這些指令以二進(jìn)制碼的形式表示。例如我們要將累加器AX中加上一個(gè)常數(shù)02,其二進(jìn)制碼表示的指令為:
000001010000001000000000。也就是說(shuō),當(dāng)處理器中取得了這樣一組指令代碼時(shí),它將自動(dòng)地完成(AX)+2→(AX)中的操作。處理器所以能這樣是因?yàn)樘幚砥髟谠O(shè)計(jì)時(shí),就考慮了這樣一組代碼應(yīng)完成的功能。自然,不同的處理器,指令的機(jī)器碼將各不相同,完成的具體功能也將各不相同。采用機(jī)器語(yǔ)言編寫(xiě)程序的一個(gè)最大好處是,程序送入計(jì)算機(jī)后,可以直接執(zhí)行。但是,我們很快會(huì)感覺(jué)到,采用機(jī)器語(yǔ)言編寫(xiě)程序是多么困難,既不易書(shū)寫(xiě),也不易檢查。匯編語(yǔ)言正是為了克服這一缺點(diǎn)而形成的一種與機(jī)器語(yǔ)言直接相關(guān)的語(yǔ)言。匯編語(yǔ)言的基本思想是采用一組字母、數(shù)字或符號(hào)來(lái)代替一條二進(jìn)制碼表示的指令,例如上面所述的指令可采用字符ADDAX,02來(lái)代替,它表示將累加器AX中的內(nèi)容加上一個(gè)常數(shù)02。顯然,這要比一串二進(jìn)制碼清晰多了,既容易書(shū)寫(xiě),也容易記憶。
表示一條指令的這些字符常稱(chēng)為助記符。我們必須指出,采用助記符寫(xiě)出的程序,機(jī)器是不能直接執(zhí)行的,因?yàn)樯厦嫖覀円呀?jīng)指出,處理器在設(shè)計(jì)時(shí)是按二進(jìn)制指令碼考慮的。所以,采用匯編語(yǔ)言編寫(xiě)的程序在執(zhí)行前還必須將其“翻譯”成機(jī)器語(yǔ)言。通常將采用助記符指令寫(xiě)成的程序,稱(chēng)為源程序,將它翻譯成的機(jī)器語(yǔ)言程序稱(chēng)為目標(biāo)程序。將匯編語(yǔ)言的源程序翻譯成目標(biāo)程序的過(guò)程稱(chēng)為匯編過(guò)程或簡(jiǎn)稱(chēng)匯編。匯編過(guò)程通常是由計(jì)算機(jī)完成的。它是通過(guò)執(zhí)行一個(gè)專(zhuān)門(mén)完成匯編的軟件——稱(chēng)為匯編程序來(lái)實(shí)現(xiàn)的。既然寫(xiě)出的源程序要由匯編程序?qū)⑵浞g后才能執(zhí)行,所以,我們編寫(xiě)的源程序必須符合匯編程序的一系列要求或者規(guī)則,只有這樣,你的程序才能被正確地“翻譯”。
所以,匯編語(yǔ)言的一系列規(guī)則是與“翻譯”軟件——匯編程序相關(guān)的。匯編語(yǔ)言的語(yǔ)句有兩種基本類(lèi)型,即指令與偽指令。指令可由匯編程序翻譯成機(jī)器語(yǔ)言指令,例如上例中的ADDAX,02,匯編后將形成一條機(jī)器語(yǔ)言指令050200(十六進(jìn)制碼),所以,匯編語(yǔ)言中的指令與機(jī)器語(yǔ)言指令基本上是一一對(duì)應(yīng)的。偽指令則不匯編成機(jī)器語(yǔ)言指令,僅僅在匯編過(guò)程中告訴匯編程序應(yīng)如何匯編。例如告訴匯編程序已寫(xiě)出的匯編語(yǔ)言源程序有幾個(gè)段,段的名稱(chēng)是什么,是否采用過(guò)程,匯編到某處是否需要留出存儲(chǔ)空間,應(yīng)留多大,是否要用到外部變量等。
所以,偽指令是為匯編程序在匯編時(shí)用的。但指令與偽指令都是組成匯編語(yǔ)言源程序的基本語(yǔ)句。除了這兩類(lèi)基本語(yǔ)句外,在匯編語(yǔ)言中,還存在另一類(lèi)指令稱(chēng)為宏指令,它是使用者利用上述基本語(yǔ)句自己定義的新的指令。4.1.2各種計(jì)算機(jī)語(yǔ)言的比較
機(jī)器語(yǔ)言
用機(jī)器碼表示,例如B8H、C3H。
匯編語(yǔ)言
用指令助記符表示機(jī)器碼,例如對(duì)應(yīng)于機(jī)器碼B8H、C3H的助記符為MOVAX,BX。
CPU不同,機(jī)器碼不同,助記符也不同。
高級(jí)語(yǔ)言
語(yǔ)言規(guī)范,可移植。4.1.3匯編語(yǔ)言與匯編程序
匯編語(yǔ)言→匯編語(yǔ)言源程序
用助記符表示機(jī)器碼用符號(hào)地址表示存儲(chǔ)器地址用偽指令管理源程序匯編程序
將匯編語(yǔ)言源程序(簡(jiǎn)稱(chēng)源程序)編譯為機(jī)器所能識(shí)別的目標(biāo)代碼的系統(tǒng)程序。如MASM.EXE。
匯編語(yǔ)言是一種面向CPU指令系統(tǒng)的程序設(shè)計(jì)語(yǔ)言,它采用指令系統(tǒng)的助記符來(lái)表示操作碼和操作數(shù),用符號(hào)地址表示操作數(shù)地址,因而易記、易讀、易修改,給編程帶來(lái)很大方便。用匯編語(yǔ)言編寫(xiě)的程序能夠直接利用硬件系統(tǒng)的特性,直接對(duì)位、字節(jié)、字寄存器、存儲(chǔ)單元、I/O端口等進(jìn)行處理,同時(shí)也能直接使用CPU指令系統(tǒng)和指令系統(tǒng)提供的各種尋址方式編制出高質(zhì)量的程序,這種程序不但占用內(nèi)存空間少,而且執(zhí)行速度快。
1、匯編語(yǔ)言2、匯編程序
用匯編語(yǔ)言編寫(xiě)的源程序在輸入計(jì)算機(jī)后,需要將其翻譯成目標(biāo)程序,計(jì)算機(jī)才能執(zhí)行相應(yīng)指令,這個(gè)翻譯過(guò)程稱(chēng)為匯編,完成匯編任務(wù)的程序稱(chēng)為匯編程序。有基本匯編ASM(Assembler)和宏匯編MASM(MacroAssembler)兩種。匯編程序以匯編語(yǔ)言源程序文件作為輸入,并由它產(chǎn)生兩種輸出文件:目標(biāo)程序文件和源程序列表文件。目標(biāo)程序文件經(jīng)連接定位后由計(jì)算機(jī)執(zhí)行;源程序列表文件將列出源程序、目標(biāo)程序的機(jī)器語(yǔ)言代碼及符號(hào)表。匯編程序的作用就是把源程序文件(ASM文件)轉(zhuǎn)換成用二進(jìn)制代碼表示的目標(biāo)程序文件(OBJ文件)。匯編程序的主要功能有:①
檢查源程序。②測(cè)出源程序語(yǔ)法錯(cuò)誤,并給出錯(cuò)誤。③
產(chǎn)生目標(biāo)程序,并可給出列表文件。④
展開(kāi)宏指令。匯編語(yǔ)言指令的特點(diǎn)語(yǔ)法結(jié)構(gòu)符合人類(lèi)語(yǔ)言的共同特點(diǎn)——?jiǎng)幼鳎珜?duì)象指令操作碼→動(dòng)作:做什么?指令操作數(shù)→對(duì)象:針對(duì)什么做動(dòng)作?機(jī)器指令:指令的二進(jìn)制代碼形式。如:89D8H匯編指令:助記符形式的指令。如:MOVAX,BX匯編語(yǔ)言指令操作碼助記符:與動(dòng)作一一對(duì)應(yīng)例: MOVAX,BX目/源操作數(shù):可能有多種組合匯編語(yǔ)言指令操作碼:由CPU設(shè)計(jì)人員定義。每一種操作唯一對(duì)應(yīng)一個(gè)操作碼。例:加法操作助記符ADD;數(shù)據(jù)傳送操作助記符MOV;比較操作助記符CMP操作數(shù):可由編程人員采用不同方式給出。尋址方式:尋找操作數(shù)(操作數(shù)地址)的方式;指令格式:指令中對(duì)操作碼、操作數(shù)的編碼方式。操作數(shù)1.8086指令中操作數(shù)的個(gè)數(shù)可以有以下幾種情況無(wú)操作數(shù)指令,例:等待指令WAIT單操作數(shù)指令,例:加1指令I(lǐng)NCAL雙操作數(shù)指令,例:減法指令SUBAL,BL源操作數(shù):后者(BL)目的操作數(shù):前者(AL)2、操作數(shù)存放地點(diǎn),可以有以下幾種:
立即數(shù):操作數(shù)直接包含在指令中。 例:MOVAL,50H
寄存器操作數(shù):操作數(shù)存放在寄存器中。 例:INCAL
內(nèi)存操作數(shù):操作數(shù)存放在內(nèi)存單元中。 例:MOVAL,[2000H]
I/O操作數(shù):操作數(shù)來(lái)自I/O端口。例:INAL,28H操作數(shù)§4.28086尋址方式給出操作數(shù)的可能的方式:由操作碼隱含地指定由指令直接給出操作數(shù)存放于CPU內(nèi)部的寄存器中存放于存儲(chǔ)器單元內(nèi)來(lái)自I/O端口8086尋址方式(續(xù))非存儲(chǔ)器尋址方式存儲(chǔ)器尋址方式其它尋址方式—固定尋址、相對(duì)尋址、I/O端口尋址
直接尋址寄存器間接尋址基址尋址變址尋址基址加變址尋址
立即數(shù)尋址寄存器(直接)尋址實(shí)質(zhì)都是間接尋址
寄存器相對(duì)尋址方式(基址加變址相對(duì)尋址)8086尋址方式一、非存儲(chǔ)器尋址方式(以8086為例,下同)1、立即數(shù)尋址方式
源操作數(shù)以8位或16位常數(shù)的形式直接出現(xiàn)在指令中。一般用于賦值。例:MOVAL,5FH2、寄存器(直接)尋址方式
8位或16位寄存器的值就是操作數(shù)本身。與其它尋址方式相比,該方式執(zhí)行速度最快。例:MOVSI,DX通用寄存器、段寄存器均可
立即數(shù)可以用二進(jìn)制數(shù)、八進(jìn)制數(shù)、十進(jìn)制數(shù)以及十六進(jìn)制數(shù)來(lái)表示。在非十進(jìn)制的立即數(shù)末尾需要使用字母加以標(biāo)識(shí)。必要情況下,十進(jìn)制數(shù)用字母D加以標(biāo)識(shí),通常情況下不需要標(biāo)識(shí)。如:
MOVAL,10;十進(jìn)制數(shù)(D)
MOVAL,00100101B;二進(jìn)制數(shù)(B)
MOVAL,0AH;十六進(jìn)制(H)
8086尋址方式(續(xù))二、存儲(chǔ)器尋址方式1、直接尋址方式操作數(shù)存放在存儲(chǔ)器單元中,由指令直接給出該單元的有效地址EA(即16位段內(nèi)偏移量)。例:MOVAX,[0016H]尋址過(guò)程示意2、寄存器間接尋址方式操作數(shù)存放在存儲(chǔ)器單元中,指令給出的16位寄存器值就是該單元的EA。例:MOV[BX],CL必須使用BX、BP、SI、DI尋址過(guò)程示意直接尋址過(guò)程示意圖DS(默認(rèn)段)值0000ES值0000SS值0000CS值0000Bit19430+)0016H:
000000000001011020位物理地址……××××MemoryMOVAX,[0016H]AHAL寄存器間接尋址過(guò)程示意圖MOV[BX],CL(設(shè)BX原值為2010H)DS(BX、SI、DI默認(rèn)段)0000ES0000SS(BP的默認(rèn)段)0000CS0000Bit19430+)BX:
001000000001000020位物理地址……××Memory8086尋址方式——基址尋址3、基址尋址方式(寄存器相對(duì)尋址方式)使用基址寄存器(BX或BP)、并帶位移量的間接尋址。操作數(shù)EA=BX或BP值+位移量。例:MOVDL,[BP+2]其它等效寫(xiě)法:
MOVDL,[BP]2MOVDL,2[BP]尋址過(guò)程示意
基址尋址過(guò)程示意圖MOVDL,[BP+2]
(設(shè)BP原值為4000H)DS(BX的默認(rèn)段)值0000ES值0000SS(BP的默認(rèn)段)值0000CS值0000Bit19430
BP:
0100000000000000+)位移量:00000000
0000001020位物理地址……××Memory8086尋址方式——變址尋址4、變址尋址方式(寄存器相對(duì)尋址方式)使用變址寄存器(SI或DI)、并帶位移量的間接尋址。操作數(shù)EA=SI或DI值+位移量。例:MOV[SI+10],AH其它等效寫(xiě)法:MOV[SI]10,AHMOV10[SI],AH尋址過(guò)程示意變址尋址過(guò)程示意圖MOV[SI]10,AH(設(shè)SI原值為008CH)DS(SI、DI默認(rèn)段)值0000ES值0000SS值0000CS值0000Bit19430
SI:
0000000010001100+)位移量:00000000
0000101020位物理地址……××Memory8086尋址方式——基址加變址尋址5、基址加變址尋址方式使用一個(gè)基址寄存器、一個(gè)變址寄存器的間接尋址。操作數(shù)EA=BX或BP值+SI或DI值(+位移量)。例:MOV[BX+DI+4],CX其它等效寫(xiě)法:MOV[BX+DI]4,CXMOV4[BX+DI],CXMOV[BX][DI]4,CXMOV4[BX][DI],CX尋址過(guò)程示意基址加變址尋址過(guò)程示意圖MOV[BX+DI+4],CX(設(shè)BX原值為1000H,DI原值為0300H)DS(BX的默認(rèn)段)值0000ES值0000SS(BP的默認(rèn)段)值0000CS值0000Bit19430
BX:0001000000000000DI:0000001100000000+)位移量:00000000
0000010020位物理地址……××××MemoryCHCL段寄存器使用規(guī)則直接尋址使用BX、SI、DI的間接尋址使用BP的間接尋址堆棧操作源串指針目標(biāo)串指針指令指針默認(rèn)段寄存器DSDSSSSSDSESCS可加的段超越前綴ES:SS:CS:ES:SS:CS:DS:ES:CS:—ES:SS:CS:——固定搭配的寄存器SPSIDIIP
段超越前綴段超越前綴形式為:段寄存器名:例如:當(dāng)操作數(shù)在內(nèi)存單元時(shí),系統(tǒng)根據(jù)隱含約定,自動(dòng)將寄存器DS或SS的值作為段地址。然而,當(dāng)操作數(shù)段地址不在隱含的段寄存器時(shí),可以使用段超越前綴取代其隱含約定。MOVAX,ES:[BP];段地址在ESMOVAX,CS:[BX][SI];段地址在CS8086尋址方式——其它方式(1)三、其它尋址方式1、固定尋址(隱含尋址)操作數(shù)并不直接出現(xiàn)在指令中,而是由操作碼隱含地指定為某一固定內(nèi)容。例:PUSHDS
目操作數(shù)隱含為棧頂字單元
POPBX
源操作數(shù)隱含為棧頂字單元
LAHF
源操作數(shù)隱含為標(biāo)志寄存器低字節(jié),目操作數(shù)隱含為寄存器AH8086尋址方式——其它方式(2)2、相對(duì)尋址僅用于進(jìn)行段內(nèi)直接轉(zhuǎn)移的控制轉(zhuǎn)移指令。指令中的操作數(shù)是一個(gè)8位或16位帶符號(hào)的相對(duì)偏移量,代表目標(biāo)地址與正常執(zhí)行順序的原地址之差。
目標(biāo)地址=順序執(zhí)行的原地址+相對(duì)偏移量編程時(shí)一般使用目標(biāo)地址的標(biāo)號(hào)作為操作數(shù),不需要計(jì)算相對(duì)偏移量。例:JNZNEXT8086尋址方式——其它方式(3)3、I/O端口尋址
僅用于I/O指令I(lǐng)N、OUT。長(zhǎng)格式I/O尋址——端口地址在8位以?xún)?nèi)時(shí),用端口地址直接做操作數(shù)。可尋址的I/O空間為256字節(jié)。例:INAX,43HOUT0FH,AL短格式I/O尋址——端口地址超過(guò)8位時(shí),固定使用DX做操作數(shù),DX的值就是該16位端口的地址??蓪ぶ返腎/O空間為65536字節(jié)。例:INAL,DXOUTDX,AX事先已向DX賦值§4.38086的指令格式指令的書(shū)寫(xiě)格式(以8086為例)
操作碼助記符[[目操作數(shù)助記符],[源操作數(shù)助記符]](操作碼:必備;操作數(shù):可以是1個(gè)、2個(gè)或沒(méi)有;可以是8位或16位)指令的編碼格式(以8086為例)采用變長(zhǎng)編碼格式。低端
高端指令前綴操作碼字段尋址方式字段操作數(shù)字段1字節(jié)1字節(jié)1字節(jié)1~4字節(jié)便于書(shū)寫(xiě)可讀性強(qiáng)由機(jī)器識(shí)別和執(zhí)行4.3.1指令格式
每臺(tái)計(jì)算機(jī)都有一套反映該計(jì)算機(jī)全部功能的指令,它構(gòu)成了該計(jì)算機(jī)的指令系統(tǒng)。通常指令以二進(jìn)制編碼的形式存放在存儲(chǔ)器中,用二進(jìn)制編碼形式表示的指令稱(chēng)為機(jī)器指令。CPU可以直接識(shí)別機(jī)器指令。對(duì)于使用者來(lái)說(shuō),機(jī)器指令記憶、閱讀比較困難,為此將每一條指令都用統(tǒng)一規(guī)定的符號(hào)和格式來(lái)表示。用符號(hào)表示的指令稱(chēng)為符號(hào)指令。符號(hào)指令具有直觀、易理解、可幫助記憶的特點(diǎn)。匯編語(yǔ)言程序中的指令就是符號(hào)指令。在計(jì)算機(jī)中,符號(hào)指令與機(jī)器指令具有一一對(duì)應(yīng)的關(guān)系。
每條符號(hào)指令都由操作碼和操作數(shù)兩部分組成,操作碼表示計(jì)算機(jī)執(zhí)行某種指令功能,操作數(shù)表示操作中所需要的數(shù)據(jù)或者所需數(shù)據(jù)與輸出數(shù)據(jù)的存放位置(又稱(chēng)地址碼)。低端
高端指令前綴操作碼字段尋址方式字段操作數(shù)字段1字節(jié)1字節(jié)1字節(jié)1~4字節(jié)單字節(jié)指令(隱含的操作數(shù))單字節(jié)指令(寄存器模式)寄存器到寄存器不帶位移量的寄存器和內(nèi)存之間的傳送帶位移量的寄存器和內(nèi)存之間的傳送(設(shè)位移量為16位)立即數(shù)送寄存器(設(shè)立即數(shù)為16位)立即數(shù)送內(nèi)存(設(shè)帶16位位移量)
操作碼操作碼REG操作碼操作碼操作碼操作碼操作碼11REGR/MMODREGR/MMODREGR/M11REGR/MMOD操作碼
R/M位移量低位位移量高位位移量高位位移量低位數(shù)據(jù)低位數(shù)據(jù)高位數(shù)據(jù)高位數(shù)據(jù)低位REG——寄存器MOD——模式R/M——寄存器或內(nèi)存1、操作碼域:
一般用指令的第一個(gè)字節(jié)或者頭兩個(gè)字節(jié)表示指令的操作碼和尋址方式——操作碼域。REGW=1(字)W=0(字節(jié))REGW=1(字)W=0(字節(jié))REG寄存器000AXAL100SPAH00ES001BXBL101BPBH01CS010CXCL110SICH10SS011DXDL111DIDH11DS表4-18086寄存器編碼表表4-2MOD和R/M的編碼各字段的含義如下:
(1)操作碼字段OPCODE。
操作碼字段規(guī)定指令的操作類(lèi)型,說(shuō)明指令所要完成的操作。同時(shí)還指出操作數(shù)類(lèi)型、操作數(shù)傳送方向、寄存器編碼或符號(hào)擴(kuò)展等。
(2)尋址方式字段。尋址方式字段規(guī)定寄存器/存儲(chǔ)器操作數(shù)的尋址方式。MOD
R/M為主尋址字節(jié),它規(guī)定操作數(shù)存放的位置(R/M)以及存儲(chǔ)器操作數(shù)有效地址EA的計(jì)算方法。
(3)操作數(shù)字段:包括位移量字段DISP和立即數(shù)字段DATA。
位移量字段DISP:
位移量是存儲(chǔ)器操作數(shù)段內(nèi)偏移地址的一部分。DISP字段指出位移量的大小,其長(zhǎng)度為1或2個(gè)字節(jié)。
立即數(shù)字段DATA:
立即數(shù)字段指明立即操作數(shù)的大小,其長(zhǎng)度也是1或2個(gè)字節(jié)。8位立即數(shù)與16操作數(shù)一起使用時(shí),CPU自動(dòng)將它擴(kuò)展為符號(hào)相同的16位數(shù)。
(4)前綴字段PREFIX。
前綴字段用于修改指令操作的某些性質(zhì)。常用前綴有五種:
①段超越前綴:將前綴中指明的段寄存器取代指令中默認(rèn)的段寄存器。
②操作數(shù)寬度前綴:改變當(dāng)前操作數(shù)寬度的默認(rèn)值。③地址寬度前綴:改變當(dāng)前地址寬度的默認(rèn)值。
④重復(fù)前綴:重復(fù)串的基本操作,以提高CPU處理串?dāng)?shù)據(jù)的速度。
⑤總線鎖存前綴:產(chǎn)生鎖存信號(hào),以防止其他總線主控設(shè)備中斷CPU在總線上的傳輸操作。每個(gè)前綴的編碼為一個(gè)字節(jié)。在一條指令前可同時(shí)使用多個(gè)指令前綴,不同前綴的前后順序無(wú)關(guān)緊要。上述指令格式中,操作碼字段是必要的,其他字段均可有可無(wú),這取決于特定的操作功能。操作碼:指出執(zhí)行這條指令時(shí),CPU要做什么操作。(OP)一般用指令的一個(gè)字節(jié)表示,有時(shí)由于用8位還不夠,常在指令的第二個(gè)字節(jié)中還可占有3位操作碼。指令的第一字節(jié):wd立即方式尋址時(shí),操作碼中用S位表示符號(hào)擴(kuò)展
s=1,將8位立即數(shù)擴(kuò)展成16位數(shù)時(shí)OPd/sww=1,對(duì)字進(jìn)行操作w=0,對(duì)字節(jié)進(jìn)行操作d=1,目的操作數(shù)d=0,源操作數(shù)2、操作數(shù)域:操作碼域后面所跟的字節(jié)一般統(tǒng)稱(chēng)為操作數(shù)域。?2字節(jié)的有效地址(直接尋址);?1字節(jié)或者2字節(jié)的位移量;?1字節(jié)或者2字節(jié)的立即數(shù);?1字節(jié)或者2字節(jié)的位移量,后面再跟1字節(jié)或者2字節(jié)的立即數(shù);?2字節(jié)的位移量和2字節(jié)的段地址(只對(duì)段間接轉(zhuǎn)移而言)。指令:?jiǎn)尾僮鲾?shù)指令雙操作數(shù)指令8086/8088指令系統(tǒng)是80X86/Pentium的基本指令集。指令的操作數(shù)是8位或16位操作數(shù),偏移地址是16位地址。按功能可將指令分成六類(lèi),即數(shù)據(jù)傳送類(lèi)、算術(shù)運(yùn)算類(lèi)、邏輯運(yùn)算與移位類(lèi)、串操作類(lèi)、控制轉(zhuǎn)移類(lèi)和處理器控制類(lèi)。為便于理解指令的形式和功能,對(duì)指令中操作數(shù)符號(hào)的約定如下:OPRD:操作數(shù)(operand);OPRD1,OPRD2:多操作數(shù)指令中,OPRD1為目標(biāo)操作數(shù),OPRD2為源操作數(shù);
reg:8位或16位的通用寄存器(register);
sreg:段寄存器(segmentregister);
§4.48086指令系統(tǒng)
reg8:8位通用寄存器;
reg16:16位通用寄存器;
mem:8位或16位存儲(chǔ)器(memory);
mem8:8位存儲(chǔ)器;
mem16:16位存儲(chǔ)器;
imm:8位或16位立即數(shù)(immediateoperand
);
imm8:8位立即數(shù);
imm16:16位立即數(shù)。§4.48086指令系統(tǒng)§4.48086指令系統(tǒng)數(shù)據(jù)傳送指令算術(shù)運(yùn)算指令邏輯運(yùn)算指令控制轉(zhuǎn)移指令串操作指令輸入/輸出指令處理器控制指令中斷指令指令前綴§4.4.1數(shù)據(jù)傳送指令通用數(shù)據(jù)傳送指令MOV堆棧操作指令PUSH、POP數(shù)據(jù)交換指令XCHG查表指令XLAT地址傳送指令LEA、LDS、LES標(biāo)志傳送指令LAHF、SAHF、PUSHF、POPF小結(jié)通用數(shù)據(jù)傳送指令MOV(Movement)功能:將源操作數(shù)內(nèi)容復(fù)制到目操作數(shù)中??墒褂玫牟僮鲾?shù)類(lèi)型組合舉例:MOVDX,BP ;通用寄存器通用寄存器MOVAX,ES ;通用寄存器段寄存器MOVSP,1800H ;通用寄存器←立即數(shù)MOVBL,[2480H] ;通用寄存器存儲(chǔ)器MOVDS,[BX+DI] ;段寄存器存儲(chǔ)器MOVBYTEPTR[SI],0FH;存儲(chǔ)器←立即數(shù)CS不能做目操作數(shù)!指令格式:MOVOPRD1,OPRD2
指令功能:將源操作數(shù)傳送給目標(biāo)操作數(shù),結(jié)果目的操作數(shù)的內(nèi)容等于源操作數(shù)的內(nèi)容,源操作數(shù)的內(nèi)容不變。即OPRD2→OPRD1。OPRD1和OPRD2可以是字節(jié)或字,但是必須等長(zhǎng)。對(duì)標(biāo)志位的影響:無(wú)具體指令形式:
MOVreg/sreg,reg
;
reg/sreg←reg
MOVreg,sreg
;
reg←sreg
MOVreg/sreg,mem
;
reg/sreg←mem
MOVmem,reg/sreg
;mem←reg/sreg
MOVreg,imm
;
reg←imm
MOVmem,imm
;mem←imm
源操作數(shù)可以是通用寄存器、段寄存器、存儲(chǔ)器以及立即操作數(shù),目標(biāo)操作數(shù)可以是通用寄存器、段寄存器(CS除外)或存儲(chǔ)器。各種數(shù)據(jù)傳送關(guān)系如下圖所示。使用MOV指令進(jìn)行數(shù)據(jù)傳送時(shí)應(yīng)注意:段寄存器CS及立即數(shù)不能作為目標(biāo)操作數(shù);兩個(gè)存儲(chǔ)單元之間不允許直接傳送數(shù)據(jù);立即數(shù)不能直接傳送到段寄存器;兩個(gè)段寄存器之間不能直接傳送數(shù)據(jù)。說(shuō)明:(1)雙操作數(shù)指令不允許兩個(gè)操作數(shù)同時(shí)為段寄存器或存儲(chǔ)器操作數(shù)。
MOVsreg
,sreg
;錯(cuò)誤
MOVmem
,mem
;錯(cuò)誤
(2)立即數(shù)不能傳送到段寄存器中。
MOVsreg
,imm
;錯(cuò)誤(3)目的操作數(shù)不允許使用CS段寄存器。(4)dest與src必須類(lèi)型匹配,即同時(shí)是字節(jié)或字類(lèi)型。以下幾點(diǎn)要注意:寄存器具有明確的類(lèi)型,例如,AL、AX分別為字節(jié)、字類(lèi)型。若立即數(shù)沒(méi)有明確的類(lèi)型,MASM負(fù)責(zé)將立即數(shù)擴(kuò)展為與目的操作數(shù)位數(shù)相同。有時(shí)MASM不能確定內(nèi)存操作數(shù)的類(lèi)型,需要用byteptr和wordptr明確指出是字節(jié)或字類(lèi)型。關(guān)于PTR的詳細(xì)介紹見(jiàn)第5章。只要其中一個(gè)操作數(shù)的類(lèi)型確定即可。例:錯(cuò)誤的MOV指令如下所示:MOVAX,BL;類(lèi)型不匹配MOVDS,1000H;不允許立即數(shù)送段寄存器MOV[BX],[SI];不允許內(nèi)存操作數(shù)之間傳送MOVES,CS;不允許段寄存器之間傳送MOVCS,AX;CS不能作為目的操作數(shù)例:設(shè)B是已定義的字節(jié)變量,以下是一些錯(cuò)誤和正確的指令。MOVAX,B;錯(cuò)誤,類(lèi)型不匹配MOVAL,0;正確,MASM可以判斷出要送字節(jié)0堆棧操作指令PUSH/POP
(Pushwordontostack/Popwordoffstack)
堆棧是按照后進(jìn)先出原則組織的一段內(nèi)存數(shù)據(jù)區(qū)域。8086規(guī)定堆棧設(shè)置在堆棧段SS內(nèi)。堆棧的棧底是固定不變的,這塊存儲(chǔ)器只有一個(gè)出入口,稱(chēng)之為棧頂棧指針SP始終指向堆棧的棧頂。隨著PUSH和POP指令的執(zhí)行,棧頂?shù)奈恢脤l(fā)生變化,進(jìn)棧棧頂向低地址方向擴(kuò)展,退棧棧頂向高地址(棧底)方向擴(kuò)展,即SP的內(nèi)容被修改,并始終指向的是棧頂。在子程序調(diào)用或中斷時(shí),堆棧用于保護(hù)當(dāng)前的斷點(diǎn)地址和現(xiàn)場(chǎng)數(shù)據(jù),以便子程序執(zhí)行完畢后正確返回到主程序。斷點(diǎn)地址的保存由子程序調(diào)用指令或中斷響應(yīng)來(lái)完成,現(xiàn)場(chǎng)數(shù)據(jù)保存可通過(guò)堆棧操作指令來(lái)實(shí)現(xiàn)。堆棧的概念
堆棧——以“先進(jìn)后出”原則組織起來(lái)的連續(xù)的內(nèi)存空間。堆棧操作以字為單位。固定以SS:SP為指針指示棧頂,出、入堆棧的操作均針對(duì)棧頂單元進(jìn)行。8086的堆棧生長(zhǎng)方向?yàn)椤跋蛳略鲩L(zhǎng)”。入棧,指針減出棧,指針加堆棧操作入棧:先修改棧頂指針(SP減1),將入棧數(shù)據(jù)的高字節(jié)存入棧頂;再次修改指針(SP減1),將低字節(jié)存入棧頂。出棧:先將棧頂單元的內(nèi)容存入目標(biāo)字的低字節(jié)中,修改棧頂指針(SP加1);再將當(dāng)前棧頂單元的內(nèi)容存入目標(biāo)字的高字節(jié)中,并修改指針(SP加1)。指令格式:PUSHOPRD
POPOPRD
指令功能:進(jìn)棧指令PUSH使(SP)-2→(SP),然后將16位的源操作數(shù)壓入堆棧,先高位后低位。源操作數(shù)可以是通用寄存器、段寄存器和存儲(chǔ)器。
POP退棧指令的執(zhí)行過(guò)程與PUSH相反。它從當(dāng)前棧頂彈出16位操作數(shù)到目標(biāo)操作數(shù),同時(shí)(SP)+2→(SP),使SP指向新的棧頂。目標(biāo)操作數(shù)可以是通用寄存器、段寄存器(CS除外)或存儲(chǔ)器。進(jìn)棧和退棧的操作數(shù)要求以字為單位。PUSH和POP指令不影響標(biāo)志位。堆棧操作指令1、入棧指令PUSH可使用的操作數(shù)類(lèi)型:PUSHCX ;通用寄存器PUSHDS ;段寄存器PUSHWORDPTR[0040H]
;存儲(chǔ)器目操作數(shù)隱含為棧頂單元指令執(zhí)行后SP減2入棧過(guò)程示意2、出棧指令POP可使用的操作數(shù)類(lèi)型:POPSI ;通用寄存器POPES ;段寄存器POPWORDPTR[BX]
;存儲(chǔ)器源操作數(shù)隱含為棧頂單元指令執(zhí)行后SP加2出棧過(guò)程示意不能用CS!入棧操作示例設(shè)有(SS)=3200H,(SP)=0800H,(AX)=105CH。(SP)=0800H→32800H……StackPUSHAX(SP)=(SP)-1→327FFH(SP)=(SP)-1→327FEH(SP)=07FEH5CHAL10HAH出棧操作示例設(shè)有(SS)=3200H,(SP)=07FEH(SP)=(SP)+1→32800HPOPAX(SP)=(SP)+1→327FFH(SP)=07FEH→327FEH……Stack10H5CH(SP)=0800H(AX)=105CHAHAL
具體指令形式:
PUSHreg16;(SP)←(SP)-2,[SP]←reg16
POPreg16;reg16←[SP],(SP)←(SP)+2
PUSHSreg
;(SP)←(SP)-2,[SP]←Sreg16
POPSreg16;Sreg16←[SP],(SP)←(SP)+2
PUSHmem16;(SP)←(SP)-2,[SP]←mem16
POPmem16;mem16←[SP],(SP)←(SP)+2數(shù)據(jù)交換指令XCHG(Exchange)功能:將源、目操作數(shù)的內(nèi)容互相交換,指令執(zhí)行后源、目操作數(shù)同時(shí)被改變。可使用的操作數(shù)類(lèi)型組合:
XCHGCL,DH ;通用寄存器通用寄存器
XCHGAX,[BP] ;通用寄存器存儲(chǔ)器立即數(shù)為什么不能做操作數(shù)?指令格式:XCHGOPRD1,OPRD2
指令功能:將一個(gè)字節(jié)或一個(gè)字的源操作數(shù)與目標(biāo)操作數(shù)進(jìn)行交換。具體指令形式:
XCHGreg,reg
;reg←→reg
XCHGmem,reg
;mem←→reg
XCHGreg,mem
;reg←→mem
XCHG可實(shí)現(xiàn)寄存器之間或寄存器與存儲(chǔ)器之間的信息交換。但是,不能在兩個(gè)存儲(chǔ)單元之間直接交換數(shù)據(jù),段寄存器和立即數(shù)不能作為操作數(shù)。例:XCHGBX,[BP+SI]如指令執(zhí)行前:(BX)=6F30H,(BP)=0200H,(SI)=0046H,(SS)=2F00H,(2F246H)=4254H,OPR2的物理地址=2F000H+0200H+0046H=2F246H則指令執(zhí)行后:(BX)=4254H,(2F246H)=6F30H。指令格式:XLAT
XLATOPRD;AL←[BX+AL]
指令功能:完成一個(gè)字節(jié)的查表轉(zhuǎn)換。它將數(shù)據(jù)段中偏移地址為BX與AL寄存器之和的存儲(chǔ)單元的內(nèi)容送入AL寄存器。在使用該指令時(shí),應(yīng)首先在數(shù)據(jù)段中建立一個(gè)長(zhǎng)度小于256B的表格,表的首地址置于BX中,AL中存放查找對(duì)象在表中的下標(biāo)。指令執(zhí)行后,所查找的對(duì)象存于AL中,BX內(nèi)容保持不變。查表指令XLAT(Translate)查表指令XLAT(Translate)指令形式XLAT[數(shù)據(jù)表首地址標(biāo)號(hào)]應(yīng)用舉例TABDB0,1,4,9,16,25,36,49,64,81 ;數(shù)據(jù)段中以TAB為首地址定義的字節(jié)表,數(shù)目≤255
……MOVBX,OFFSETTABMOVAL,4XLATTAB指令執(zhí)行后,(AL)=16。實(shí)現(xiàn)什么功能?
1、有效地址傳送指令LEA(Loadeffectiveaddress)。
指令格式:LEAOPRD1,OPRD2
指令功能:將源操作數(shù)的有效地址送到目的操作數(shù)。具體指令形式:
LEAreg16,mem;reg16←Addr(mem)
2、地址指針傳送指令LDS(Loaddatesegmentregister)/LES(Loadextra-segmentregister)。
指令格式:LDSOPRD1,OPRD2
指針?biāo)图拇嫫骱虳S:LDSreg16,mem32;
把源操作數(shù)指定的4個(gè)相繼字節(jié)到由指令指定的寄存器及DS寄存器中。該指令常指定SI寄存器。
地址傳送指令指令格式:
LESOPRD1,OPRD2指針?biāo)图拇嫫骱虴S:LESreg16,mem32;
把源操作數(shù)指定的4個(gè)相繼字節(jié)送到由指令指定的寄存器及ES寄存器中。該指令常指定DI寄存器
。指令功能:這兩條指令的功能類(lèi)似,都是將源操作數(shù)偏移地址決定的雙字單元中的第一個(gè)字的內(nèi)容傳送到指令指定的16位通用寄存器,第二個(gè)字的內(nèi)容傳送給段寄存器DS或ES。地址傳送指令地址傳送指令有效地址傳送指令LEA:源操作數(shù)的有效地址EA(不是內(nèi)容!!)→目標(biāo)寄存器LEA16位通用寄存器,存儲(chǔ)器全地址指針傳送指令LDS:將源操作數(shù)單元的內(nèi)容當(dāng)作32位全地址指針,偏移量(低16位)→目標(biāo)寄存器,段基址(高16位)→DS。LDS16位通用寄存器,存儲(chǔ)器全地址指針傳送指令LES:將源操作數(shù)單元的內(nèi)容當(dāng)作32位全地址指針,偏移量(低16位)→目標(biāo)寄存器,段基址(高16位)→ES。LES16位通用寄存器,存儲(chǔ)器應(yīng)用舉例LEA指令與MOV指令的區(qū)別:LEASI,BUFF指令是將標(biāo)號(hào)BUFF的偏移地址送入寄存器中;MOVSI,BUFF指令是將標(biāo)號(hào)BUFF所指存儲(chǔ)單元的內(nèi)容送入SI。BUFF=0123454800FEFFLEASI,BUFF;執(zhí)行后:(SI)=0002HMOVSI,BUFF;執(zhí)行后:(SI)=0048H段起始地址LDS或LES指令將源操作數(shù)指定的4個(gè)連續(xù)字節(jié)單元內(nèi)容分別送入指令指定的寄存器以及DS或ES中。其中:低16位送到一個(gè)指定的字寄存器,高16位送到DS或ES中。57H13H68H24H例:(DS)=C000H,(C2480H)=1357H,(C2482H)=2468HDS:2480HDS:2481HDS:2482HDS:2483H
1357
2468SIDSLDSSI,[2480H]地址傳送指令的比較已知:(DS)=09A0H,(BX)=0048HLEADI,[BX]LDSSI,[BX]LESDI,[BX]等價(jià)于MOVDI,OFFSET[BX]→執(zhí)行后:(DI)=0048H→執(zhí)行后:(SI)=003EH
(DS)=0816H→執(zhí)行后:(DI)=003EH
(ES)=0816HMemory08H……3EH00H16H09A48H09A49H09A4AH09A4BH標(biāo)志傳送指令標(biāo)志裝入指令LAHF(LoadAHfromflags)(Flags)L→AH標(biāo)志存儲(chǔ)指令SAHF(StoreAHontoflags)AH→(Flags)L標(biāo)志入棧指令PUSHF(Pushflagsontostack)
將標(biāo)志寄存器壓入堆棧。標(biāo)志出棧指令POPF
將棧頂字單元的內(nèi)容彈到標(biāo)志寄存器中。全部隱含源、目操作數(shù)唯一可改變TF的指令!POPF(Popflagsoffstack)
標(biāo)志字傳送指令用于對(duì)標(biāo)志寄存器(PSW)的保護(hù)和更新操作。指令的操作數(shù)由隱含方式給出。(1)標(biāo)志字讀寫(xiě)指令LAHF/SAHF。
指令格式:LAHF
SAHF
LAHF指令可將標(biāo)志寄存器的低字節(jié)(含符號(hào)標(biāo)志SF、零標(biāo)志ZF、輔助進(jìn)位標(biāo)志AF、奇偶標(biāo)志PF和進(jìn)位標(biāo)志CF)傳送到AH寄存器中。這條指令不影響標(biāo)志位。
SAHF指令的功能與LAHF相反,它將寄存器AH的內(nèi)容傳送到標(biāo)志寄存器的低字節(jié)中。標(biāo)志傳送指令
(2)標(biāo)志進(jìn)棧/出棧指令PUSHF/POPF。
指令格式:PUSHF
POPF
PUSHF指令把標(biāo)志寄存器的內(nèi)容壓入堆棧,同時(shí)堆棧指針(SP)←(SP)-2。
POPF指令將堆棧指針SP所指的一個(gè)字傳送到標(biāo)志寄存器中,同時(shí)堆棧指針(SP)←(SP)+2。說(shuō)明:LAHF/SAHF指令是寄存器AH與標(biāo)志寄存器PSW的低字節(jié)之間完成的字節(jié)型數(shù)據(jù)傳送。
PUSHF/POPF指令是標(biāo)志寄存器PSW與堆棧間進(jìn)行的字型數(shù)據(jù)傳送。
指令SAHF/POPF將影響標(biāo)志位。數(shù)據(jù)傳送指令小結(jié)源、目操作數(shù)長(zhǎng)度必須一致。源、目操作數(shù)不能同時(shí)是存儲(chǔ)器操作數(shù)。源、目操作數(shù)不能同時(shí)是段寄存器。立即數(shù)和代碼段寄存器CS不能作目的操作數(shù)。當(dāng)目操作數(shù)是段寄存器時(shí),源操作數(shù)不能是立即數(shù)??梢允褂枚渭拇嫫鞯闹噶睿篗OV、PUSH、POP。除XCHG指令外,其它數(shù)傳指令僅改變目的操作數(shù),源操作數(shù)保持不變。除SAHF、POPF指令外,其它數(shù)傳指令的執(zhí)行不影響標(biāo)志位。對(duì)所有指令都適用!§4.4.2算術(shù)運(yùn)算指令加法指令A(yù)DD、ADC、INC、AAA、DAA減法指令SUB、SBB、DEC、AAS、DAS、CMP、NEG乘法指令MUL、IMUL、AAM除法指令DIV、IDIV、AAD、CBW、CWD小結(jié)
算術(shù)運(yùn)算指令可完成加、減、乘、除運(yùn)算以及在算術(shù)運(yùn)算過(guò)程中進(jìn)行進(jìn)制及編碼調(diào)整操作。在進(jìn)行這些操作時(shí),可針對(duì)字節(jié)或字運(yùn)算,也可對(duì)帶符號(hào)數(shù)和無(wú)符號(hào)數(shù)進(jìn)行運(yùn)算。
1、加法指令A(yù)DD(Addition)。
指令格式:ADDOPRD1,OPRD2
指令功能:將源操作數(shù)與目的操作數(shù)相加,結(jié)果存放于目的操作數(shù)。即OPRD1+OPRD2→OPRD1。具體指令形式:
ADDreg,reg
;reg←reg+reg
ADDreg,mem
;reg←reg+mem
ADDreg,imm
;reg←reg+imm
ADDmem,reg
;mem←mem+reg
ADDmem,imm
;mem←mem+imm
要求源操作數(shù)和目的操作數(shù)同時(shí)為帶符號(hào)的數(shù)或無(wú)符號(hào)數(shù),且長(zhǎng)度相等。加法運(yùn)算指令2、帶進(jìn)位加法指令A(yù)DC(Addwithcarry)。
指令格式:ADCOPRD1,OPRD2
指令功能:將源操作數(shù)與目的操作數(shù)以及進(jìn)位標(biāo)志位CF的值相加,并將結(jié)果存放于目的操作數(shù),即OPRD1+OPRD2+CF→OPRD1。
具體指令形式:
ADCreg,reg
;reg←reg+reg+CF
ADCreg,mem
;reg←reg+mem+CF
ADCreg,imm
;reg←reg+imm+CF
ADCmem,reg
;mem←mem+reg+CF
ADCmem,imm
;mem←mem+imm+CF
加法運(yùn)算指令
3、加1指令I(lǐng)NC(Incrementdestinationby1)。
指令格式:INCOPRD
指令功能:將指定操作數(shù)內(nèi)容加1。INC指令不影響進(jìn)位標(biāo)志CF。
具體指令形式:
INCmem
;mem←mem+1
INCreg
;reg←reg+1
加法運(yùn)算指令加法運(yùn)算指令1、加指令A(yù)DD形式:ADD目的操作數(shù),源操作數(shù)功能:目操作數(shù)內(nèi)容+源操作數(shù)內(nèi)容→目的操作數(shù);執(zhí)行之后影響所有狀態(tài)標(biāo)志SF、ZF、AF、PF、CF、OF
。允許的操作數(shù)類(lèi)型:目的操作數(shù)——通用寄存器、存儲(chǔ)器;源操作數(shù)——通用寄存器、存儲(chǔ)器、立即數(shù)。2、帶進(jìn)位的加指令A(yù)DC功能:目操作數(shù)內(nèi)容+源操作數(shù)內(nèi)容+CF→目操作數(shù)其余與ADD指令相同!3、自加1指令I(lǐng)NC形式:INC操作數(shù)(通用寄存器或存儲(chǔ)器)功能:操作數(shù)內(nèi)容+1→操作數(shù);執(zhí)行之后影響標(biāo)志位SF、ZF、AF、PF、OF
,但不影響CF
!最常用的加法用于高字(字節(jié))相加常用于修改地址指針
1、減法指令SUB(Subtract)。
指令格式:SUBOPRD1,OPRD2
指令功能:將目的操作數(shù)減去源操作數(shù),結(jié)果存放于目的操作數(shù),即OPRD1-OPRD2→OPRD1。
具體指令形式:
SUBreg,reg
;reg←reg-reg
SUBreg,mem
;reg←reg-mem
SUBreg,imm
;reg←reg-imm
SUBmem,reg
;mem←mem-reg
SUBmem,imm
;mem←mem-imm
減法運(yùn)算指令
2、帶借位減法指令SBB(Subtractwithborrow)。
指令格式:SBBOPRD1,OPRD2
指令功能:將目的操作數(shù)減去源操作數(shù),再減去借位CF的值,結(jié)果存放于目的操作數(shù)。即OPRD1-OPRD2-CF→OPRD1。
具體指令形式:
SBBreg,reg
;reg←reg-reg-CF
SBBreg,mem
;reg←reg-mem-CF
SBBreg,imm
;reg←reg-imm-CF
SBBmem,reg
;mem←mem-reg-CF
SBBmem,imm
;mem←mem-imm-CF
減法運(yùn)算指令3、減1指令DEC(Decrementdestinationby1)。
指令格式:DECOPRD
指令功能:對(duì)指定操作數(shù)減1。DEC指令不影響進(jìn)位標(biāo)志。具體指令形式:
DECmem
;mem←mem-1
DECreg
;reg←reg-1
減法運(yùn)算指令減法運(yùn)算指令1、減指令SUB形式:SUB目操作數(shù),源操作數(shù)功能:目操作數(shù)內(nèi)容-源操作數(shù)內(nèi)容→目操作數(shù);執(zhí)行之后影響所有狀態(tài)標(biāo)志SF、ZF、AF、PF、CF、OF
。允許的操作數(shù)類(lèi)型:目操作數(shù)——通用寄存器、存儲(chǔ)器;源操作數(shù)——通用寄存器、存儲(chǔ)器、立即數(shù)。2、帶借位的減指令SBB功能:目操作數(shù)內(nèi)容-源操作數(shù)內(nèi)容-CF→目操作數(shù)其余與SUB指令相同!3、自減1指令DEC形式:DEC操作數(shù)(通用寄存器或存儲(chǔ)器)功能:操作數(shù)內(nèi)容-1→操作數(shù);執(zhí)行之后影響標(biāo)志位SF、ZF、AF、PF、OF,但不影響CF
!最常用的減法用于高字(字節(jié))相減常用于修改地址指針指令格式:CMPOPRD1,OPRD2指令功能:將目的操作數(shù)減去源操作數(shù),結(jié)果不予保存。只是根據(jù)結(jié)果的狀態(tài)設(shè)置條件標(biāo)志位,設(shè)置狀態(tài)標(biāo)志位與SUB指令含義相同。
CMPreg,reg
;
reg-reg
CMPreg,mem
;
reg-mem
CMPreg,imm
;reg-imm
CMPmem,reg
;mem-reg
CMPmem,imm
;mem-imm
比較指令CMP(Comparetwooperands)比較指令通常用于比較兩個(gè)操作數(shù)的大小。由受影響的標(biāo)志位狀態(tài)來(lái)判斷兩個(gè)操作數(shù)比較的結(jié)果。不論是無(wú)符號(hào)數(shù)比較還是有符號(hào)數(shù)比較,若在比較指令后,(ZF)=1,則兩者相等,否則不相等。若兩者不相等,則可在比較兩個(gè)數(shù)之后,利用其他標(biāo)志位的狀態(tài)來(lái)確定兩者中哪個(gè)大。比較指令CMP
如果是兩個(gè)無(wú)符號(hào)數(shù)比較,則可根據(jù)進(jìn)位標(biāo)志CF的狀態(tài)來(lái)判斷:若(CF)=1,則OPRD1<OPRD2;若(CF)=0,則OPRD1>OPRD2。
如果是兩個(gè)有符號(hào)數(shù)比較,則要根據(jù)SF和OF兩個(gè)標(biāo)志的關(guān)系來(lái)判斷:若SF⊕OF=0,則OPRD1>OPRD2;若SF⊕OF=1,則OPRD1<OPRD2。
在程序中,比較指令常用于條件轉(zhuǎn)移之前,條件轉(zhuǎn)移指令根據(jù)CMP操作之后的狀態(tài)標(biāo)志決定程序轉(zhuǎn)移或不轉(zhuǎn)移。比較指令CMP比較指令CMP使用方法與SUB、SBB相同。功能:目操作數(shù)-源操作數(shù),同時(shí)影響狀態(tài)標(biāo)志SF、ZF、AF、PF、CF、OF
。CMP通常用于比較兩個(gè)數(shù),其后一般緊跟著條件轉(zhuǎn)移指令以實(shí)現(xiàn)不同情況下的分支處理。例:
CMPAL,BL;AL-BL,保持寄存器的值不變
JNZEQUAL;若(ZF)=0(不等),轉(zhuǎn)EQUAL處
……
;(ZF)=1(相等)情況下的處理不改變操作數(shù)本身的值!指令格式:NEGOPRD
指令功能:對(duì)指定操作數(shù)求補(bǔ)運(yùn)算。在機(jī)器內(nèi)部,對(duì)操作數(shù)的求補(bǔ)操作是對(duì)操作數(shù)進(jìn)行求反后末位加1。通過(guò)求補(bǔ)可使正數(shù)變?yōu)樨?fù)數(shù)或使負(fù)數(shù)變?yōu)檎龜?shù)。這樣使得一個(gè)正數(shù)減去一個(gè)正數(shù)的減法運(yùn)算,轉(zhuǎn)化為一個(gè)正數(shù)加上一個(gè)負(fù)數(shù)的加法運(yùn)算。具體指令形式:
NEGmem
;mem←0-mem
NEGreg
;reg←0-reg取相反數(shù)指令NEG
(Negateorform2,scomplement)取相反數(shù)指令NEG形式:NEG操作數(shù)功能:0-操作數(shù)內(nèi)容→操作數(shù);影響所有狀態(tài)標(biāo)志SF、ZF、AF、PF、CF、OF
允許的操作數(shù)類(lèi)型:通用寄存器、存儲(chǔ)器實(shí)質(zhì)上,NEG指令相當(dāng)于將目操作數(shù)固定為0值的SUB指令;執(zhí)行結(jié)果即取原數(shù)的相反數(shù)。乘法指令包括無(wú)符號(hào)數(shù)乘法、帶符號(hào)數(shù)乘法兩種。
1、無(wú)符號(hào)數(shù)乘法指令MUL(Multiplyaccumulatorbyregister-or-memory;unsigned)。
指令格式:MULOPRD
指令功能:完成兩個(gè)無(wú)符號(hào)數(shù)的乘法運(yùn)算。要求被乘數(shù)放在AL或AX累加器中,用于字節(jié)運(yùn)算和字運(yùn)算,另一乘數(shù)可通過(guò)指令中的OPRD(除立即數(shù)方式以外的尋址方式)獲得。具體指令形式:
MULreg
;(AX)←(AL)×reg8乘法運(yùn)算指令或(DX,AX)←(AX)×reg16
2、帶符號(hào)數(shù)乘法IMULOPRD;操作同上
IMUL(Integermultiplyaccumulatorbyregister-or-memory;signed)
進(jìn)行字節(jié)運(yùn)算時(shí),目的操作數(shù)必須是累加器AL,乘積在寄存器AX中;進(jìn)行字運(yùn)算時(shí),目的操作數(shù)必須是累加器AX,乘積在寄存器DX,AX中。源操作數(shù)不允許使用立即數(shù)。
乘法指令運(yùn)算結(jié)果只影響狀態(tài)標(biāo)志CF、OF。
例:MULBX;無(wú)符號(hào)數(shù)乘法,BX乘上AX乘法運(yùn)算指令
具體指令形式:
IMULreg
;(AX)←(AL)×reg8
或(DX,AX)←(AX)×reg16
IMULmem
;(AX)←(AL)×mem8
或(DX,AX)←(AX)×mem16
乘法指令的執(zhí)行結(jié)果會(huì)使標(biāo)志位發(fā)生變化。只有進(jìn)位標(biāo)志CF、溢出標(biāo)志OF有意義,其它標(biāo)志位無(wú)定義。CF、OF定義如下:當(dāng)進(jìn)行字節(jié)運(yùn)算時(shí),其結(jié)果超過(guò)字節(jié)長(zhǎng)度成為字((AH)≠0),CF和OF置“1”;乘法運(yùn)算指令
當(dāng)進(jìn)行字運(yùn)算時(shí),其結(jié)果超過(guò)字長(zhǎng)度成為雙字((DX)≠0),CF和OF置“1”。這樣就可以用OF及CF來(lái)檢查和判斷字節(jié)或字操作的結(jié)果。對(duì)MUL指令,當(dāng)進(jìn)行字節(jié)操作時(shí),乘積結(jié)果的高一半為0((AH)=0),或當(dāng)進(jìn)行字操作時(shí),乘積結(jié)果高一半為0((DX)=0),CF和OF均為0。對(duì)于IMUL指令,如果乘積結(jié)果的高一半為低一半的符號(hào)位的擴(kuò)展,那么CF和OF均置“0”,否則置“1”。
乘法指令為乘積保留了兩倍于原來(lái)操作數(shù)的存儲(chǔ)空間,因而不會(huì)出現(xiàn)溢出現(xiàn)象。
乘法運(yùn)算指令乘法運(yùn)算指令無(wú)符號(hào)數(shù)乘法指令:MUL通用寄存器或存儲(chǔ)器帶符號(hào)數(shù)乘法指令:IMUL通用寄存器或存儲(chǔ)器乘積低字節(jié)→AL乘積高字節(jié)→AH乘積低位字→AX乘積高位字→DX影響標(biāo)志CF、OF
:相乘后若高位(AH或DX)≠0,則將CF、OF置1,否則清0。字節(jié)相乘:AL值×操作數(shù)內(nèi)容(8位)→字相乘:AX值×操作數(shù)內(nèi)容(16位)→
除法指令包括無(wú)符號(hào)數(shù)除法指令DIV,帶符號(hào)數(shù)除法指令I(lǐng)DIV,以及在除法運(yùn)算中輔助DIV、IDIV指令的字節(jié)轉(zhuǎn)換為字指令CBW和字轉(zhuǎn)換為雙字指令CWB。
1、無(wú)符號(hào)數(shù)除法指令DIV(Division;unsigned)。
指令格式:DIVOPRD
指令功能:完成兩個(gè)無(wú)符號(hào)數(shù)的除法運(yùn)算,除法操作可作字節(jié)或字操作。在進(jìn)行字節(jié)操作時(shí),要求被除數(shù)為16位、并存放在AX累加器,除數(shù)8位由指令中的源操作數(shù)指定,結(jié)果的8位商存放于AL中,8位余數(shù)存放于AH中。在進(jìn)行字操作時(shí),要求被除數(shù)為32位,存放在DX,AX寄存器中,16位除數(shù)由指令中源操作數(shù)指定,結(jié)果的16位商存放于AX中,16位余數(shù)存放于DX中。除法運(yùn)算指令
2、帶符號(hào)數(shù)除法指令I(lǐng)DIV(Integerdivision;signed)。指令格式:IDIV源操作數(shù)指令功能:完成兩個(gè)帶符號(hào)數(shù)的除法操作。在執(zhí)行該指令時(shí),要求操作數(shù)為帶符號(hào)數(shù),商及余數(shù)也為帶符號(hào)數(shù),余數(shù)與被除數(shù)的符號(hào)相同。除法指令的使用需要說(shuō)明:
①源操作數(shù)不允許使用立即尋址方式。
②除法指令執(zhí)行后,標(biāo)志位無(wú)定義。
③除數(shù)為零時(shí),則產(chǎn)生一個(gè)0類(lèi)型中斷。在除法運(yùn)算中常常使用CBW和CWD對(duì)除法所需操作數(shù)進(jìn)行長(zhǎng)度擴(kuò)展。除法運(yùn)算指令除法運(yùn)算指令
無(wú)符號(hào)數(shù)除法指令:DIV通用寄存器或存儲(chǔ)器帶符號(hào)數(shù)除法指令:IDIV通用寄存器或存儲(chǔ)器商→AL余數(shù)→AH商→AX余數(shù)→DX字節(jié)除法:AX值÷操作數(shù)內(nèi)容(8位)→字除法:DX:AX值÷操作數(shù)內(nèi)容(16位)→IDIV之后,余數(shù)與被除數(shù)同號(hào)。除數(shù)太小致使商超過(guò)規(guī)定的長(zhǎng)度時(shí),自動(dòng)轉(zhuǎn)入中斷處理。不影響任何標(biāo)志!
十進(jìn)制調(diào)整指令
在算術(shù)運(yùn)算中操作數(shù)可以采用BCD碼,但是運(yùn)算后的結(jié)果必須經(jīng)過(guò)調(diào)整,否則結(jié)果是錯(cuò)誤的。BCD碼是一種用二進(jìn)制編碼表示的十進(jìn)制數(shù),每個(gè)BCD碼都是由4位二進(jìn)制代碼來(lái)表示的,故稱(chēng)為壓縮BCD碼。例如,10000101可看作十進(jìn)制的85。使用BCD碼進(jìn)行算術(shù)運(yùn)算,一方面符合計(jì)算機(jī)只能處理二進(jìn)制數(shù)的要求,另一方面BCD碼也給編寫(xiě)和閱讀程序帶來(lái)了直觀效果。為此指令系統(tǒng)提供了必須用在ADD、ADC指令后面的加法十進(jìn)制調(diào)整指令DAA和必須用在SUB、SBB指令后面的減法十進(jìn)制調(diào)整指令DAS。經(jīng)過(guò)調(diào)整后的結(jié)果才是正確的BCD碼。
1、非壓縮BCD數(shù)加法調(diào)整指令A(yù)AA(ASCIIadjustforaddition)。
指令格式:AAA
指令功能:將寄存器AL中的和調(diào)整為非壓縮的BCD碼。AAA指令用在ADD、ADC指令之后。
AAA指令調(diào)整過(guò)程如下:
①當(dāng)(AL)的低4位為0~9H之間,且AF為“0”,則執(zhí)行③;
②當(dāng)(AL)
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 人家服務(wù)合同范本
- 中班社會(huì)領(lǐng)域活動(dòng)方案
- 房屋雙方買(mǎi)賣(mài)合同
- 車(chē)輛掛靠經(jīng)營(yíng)協(xié)議書(shū)
- 交通物流配送優(yōu)化方案
- 班車(chē)租賃合同集錦
- 智能制造模具研發(fā)投資合同
- 工程機(jī)械施工協(xié)議書(shū)
- 新能源材料研發(fā)投資合同
- Unit 3 Amazing animals第4課時(shí)(教學(xué)設(shè)計(jì))-2024-2025學(xué)年人教PEP版(2024)英語(yǔ)三年級(jí)上冊(cè)
- 燈泡貫流式機(jī)組基本知識(shí)培訓(xùn)ppt課件
- 小學(xué)數(shù)學(xué)四年級(jí)下冊(cè)培優(yōu)補(bǔ)差記錄
- 人參無(wú)公害標(biāo)準(zhǔn)化生產(chǎn)操作規(guī)程
- 人教版三年級(jí)下冊(cè)體育與健康教案(全冊(cè)教學(xué)設(shè)計(jì))
- DB61∕T 5006-2021 人民防空工程標(biāo)識(shí)標(biāo)準(zhǔn)
- 產(chǎn)品結(jié)構(gòu)設(shè)計(jì)(課堂PPT)
- 第九課_靜止的生命
- 尖尖的東西我不碰(課堂PPT)
- 工程勘察和設(shè)計(jì)承攬業(yè)務(wù)的范圍
- 碳纖維、鋼板加固板計(jì)算表(根據(jù)2013版加固規(guī)范 編寫(xiě))
- 第二版人民幣暗記大全
評(píng)論
0/150
提交評(píng)論