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

下載本文檔

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

文檔簡介

1、1第4章 指令系統(tǒng)24.1 80X86指令系統(tǒng)的 尋址方式3一、與數(shù)據(jù)有關(guān)的尋址方式 指令系統(tǒng)是全體指令的集合。通常,一條指令由操作碼和操作數(shù)兩個部分構(gòu)成。操作碼說明指令完成的功能,操作數(shù)說明指令操作的對象。對于操作數(shù)而言,最重要的問題是如何尋找到操作數(shù),即尋址方式的問題。 4尋址方式就是指令中用于說明操作數(shù)所在地址 的方法,或者說是尋找操作數(shù)有效地址的方法。尋址方式大致可分為與數(shù)據(jù)有關(guān)的尋址和與轉(zhuǎn) 移地址有關(guān)的尋址兩大類指令中應(yīng)包含的信息:56 操作數(shù)包含在本條指令當(dāng)中,這種操作數(shù)稱為 立即數(shù);操作數(shù)存放在CPU的某個寄存器中,這種操作數(shù)稱為寄存器操作數(shù);操作數(shù)存放在存儲器中,這種操作數(shù)稱為

2、存儲器操作數(shù)或內(nèi)存操作數(shù)。7與數(shù)據(jù)有關(guān)的尋址方式這種尋址方式用來確定操作數(shù)地址從而找到操作數(shù)。在80X86系列中,8086和80286的字長是16位,一般情況下只處理8位和16位數(shù),只是在乘、除指令中才會有32位數(shù);80386及其后繼機型其字長為32位,因此它除可處理8位和16位操作數(shù)外,還可處理32位操作數(shù),在乘除法情況下可產(chǎn)生64位數(shù)。本節(jié)下面所述例子,如處理的是32位數(shù),則適用于386及其后繼機型。數(shù)據(jù)尋址方式的討論中均以“MOV d,s”為例,這是傳送指令,第1操作數(shù)為目的操作數(shù)d,第2操作數(shù)為源操作數(shù)s,指令執(zhí)行的結(jié)果應(yīng)把s送到d。81立即尋址方式(Immediate Address

3、)立即數(shù)是指操作數(shù)直接存放在指令中,緊跟在操作碼之后,它作為指令的一部分存放在代碼段里。在指令譯碼執(zhí)行時,可以立即得到操作數(shù),它可以是8位或16位或32位的。16/32位的存放規(guī)則:高字節(jié)存放在高地址,低字節(jié)存放在低地址。立即尋址主要用來給寄存器或存儲器賦初值。9例1: MOV AX,3064H 執(zhí)行后AX=? AX=3064H立即尋址示意圖:10例2:立即數(shù)尋址方式舉例:MOVAH, 01101100BMOVDL, BMOVCX, 4*5MOVEAX,34567809H112、寄存器尋址方式(Register Address) 操作數(shù)放在通用寄存器中:對于32位操作數(shù),寄存器可以是EAX、E

4、BX、ECX、EDX、ESI、EDI、ESP、EBP等;對于16位操作數(shù),寄存器可以是AX、BX、CX、DX、 SI、DI、SP、BP等;對于8位操作數(shù),寄存器可以是AL、AH、BL、BH、CL、CH、DL、DH等。寄存器尋址方式的特點是運算速度快。12例3:MOVAX,BX執(zhí)行前(AX) = ?(BX) = 1234H執(zhí)行后(AX) = 1234H(BX) = 1234H13例4:MOVBL,AH執(zhí)行前AH = 00101100B執(zhí)行后BL= 00101100B寄存器尋址示意圖: 14 例5:寄存器尋址方式舉例:MOV AL, BL;BL寄存器的內(nèi)容ALMOV DS, AX;AX寄存器的內(nèi)容

5、DSINCCX;CX寄存器的內(nèi)容加1DECSI;SI寄存器的內(nèi)容減1ADD AX, BX;AX、BX寄存器的內(nèi)容相加,結(jié)果AX15操作數(shù)所在內(nèi)存單元的完整地址表達式:163、直接尋址方式直接尋址方式中,有效地址EA直接出現(xiàn)在指令中,存放在代碼段中指令操作碼之后,操作數(shù)存放在數(shù)據(jù)段中,這種格式中段超越前綴不能省略,否則會出現(xiàn)尋址錯誤。另一種直接尋址方式的格式是,EA是用變量來代表的存儲單元的有效地址。 直接尋址方式的限制是兩個操作數(shù)中必須有一個是寄存器。17例6: MOV AX, 2000H ; 執(zhí)行前(DS)=3000H,(AX)=?, 執(zhí)行后(AX) = 3050H18直接尋址示意圖:19例

6、7:直接尋址方式舉例:MOV DX, DS:2346H;取出數(shù)據(jù)段EA為2346H字單元中的內(nèi)容DXMOV BL, ES:3CH;取出附加段EA為3CH字節(jié)單元中的內(nèi)容BL20例8:取出數(shù)據(jù)段中以VAR命名的字單元的內(nèi)容送AX寄存器,該指令為MOV AX, DS:VAR 或MOV AX, VAR4寄存器間接尋址21寄存器間接尋址要求事先把存儲器單元的有效地址寫入規(guī)定的基址或變址寄存器。指令的地址表達式格式為:段寄存器:間址寄存器對于約定的邏輯段段超越前綴可以省略。16位尋址時,EA由BX、SI、DI或BP提供,其中,BX、SI、DI默認使用DS,BP默認使用SS。32位尋址時,EA由EAX、E

7、BX、ECX、EDX、ESI、EDI、ESP、EBP,其中,ESP、EBP默認使用SS,其余默認使用DS。5基址尋址22格式:段寄存器:基址寄存器位移量段寄存器:位移量基址寄存器操作數(shù)的有效地址:一個基址寄存器的內(nèi)容和指令中指定的8位或16位的位移量之和。16位寄存器BP和BX作基址寄存器, 使用BP基址尋址,約定訪問SS;使用BX基址尋址,約定訪問DS。8個32位寄存器EBP、ESP、EAXEDX、ESI、EDI作基址寄存器,使用EBP和ESP基址尋址時,約定訪問SS;使用其余32位寄存器時,約定訪問DS。6變址尋址23(1)無比例因子的變址尋址。格式:段寄存器:變址寄存器位移量 或段寄存器

8、:位移量變址寄存器 其中,變址寄存器只能選用DI或SI,約定訪問DS。默認情況下:PA=10H(DS) + (SI) + D8PA=10H(DS) + (SI) + D16 PA=10H(DS) + (DI) + D8PA=10H(DS) + (DI) + D1624(2)有比例因子的變址尋址。格式:段寄存器:比例因子變址寄存器位移量 段寄存器:位移量比例因子變址寄存器其中,操作數(shù)的有效地址為一個變址寄存器乘以比例因子再與指令中指定的8位或16位的位移量之和。變址寄存器可為EBP或EAXEDX、ESI、EDI這7個32位寄存器。除EBP默認訪問SS外,其余變址寄存器默認訪問DS。25默認情況下

9、:PA=10H(DS) + (比例因子 ESI) + D8PA=10H(DS)+(比例因子ESI) + D167基址加變址尋址26(1)無比例因子的基址加變址尋址。格式:段寄存器:基址寄存器變址寄存器位移量 或段寄存器:位移量基址寄存器變址寄存器 或段寄存器:位移量基址寄存器變址寄存器其中,基址寄存器和變址寄存器須為規(guī)定的16位寄存器。27(2)有比例因子的基址加變址尋址。格式:段寄存器:基址寄存器比例因子*變址寄存器位移量 或段寄存器:位移量基址寄存器比例因子*變址寄存器 或段寄存器:位移量基址寄存器變址寄存器*比例因子其中,基址寄存器和變址寄存器須為規(guī)定的32位寄存器。28小結(jié) 實模式時,

10、段的最大長度為64K,所以必須保證CPU最終算出的有效地址不超過FFFFH,而且操作數(shù)最高字節(jié)單元的有效地址也不能超過FFFFH,否則執(zhí)行尋址時系統(tǒng)將要癱瘓。 有效地址表達式中的位移量是無符號整數(shù)。 帶有比例因子的變址尋址常用于檢索一維數(shù)組元素, 比例因子的大小常由數(shù)組元素大小決定。 帶有比例因子的基址加變址尋址常用于檢索二維數(shù)組元素。4.1.2 與轉(zhuǎn)移地址有關(guān)的尋址方式29這種尋址方式用來確定轉(zhuǎn)移指令及CALL指令的轉(zhuǎn)向地址。1段內(nèi)直接尋址(intrasegment direct ddressing)30轉(zhuǎn)向的有效地址是當(dāng)前IP寄存器的內(nèi)容和指令中指定的8位或16位位移量之和,如圖4-1所示

11、。 這種方式的轉(zhuǎn)向有效地址用相對于當(dāng)前IP值的位移量來表示,所以它是一種相對尋址方式。指令中的位移量是轉(zhuǎn)向的有效地址與當(dāng)前IP值之差,所以當(dāng)這一程序段在內(nèi)存中的不同區(qū)域運行時,這種尋址方式的轉(zhuǎn)移指令本身不會發(fā)生變化,這是符合程序的再定位要求的。這種尋址方式適用于條件轉(zhuǎn)移及無條件轉(zhuǎn)移指令,但是當(dāng)它用于條件轉(zhuǎn)移指令時,位移量只允許8位(386及其后繼機型條件轉(zhuǎn)移指令的位移量可為8位或32位)。無條件轉(zhuǎn)移指令在位移量為8位時稱為短跳轉(zhuǎn),位移量為16位時則稱為近跳轉(zhuǎn)。31指令的匯編語言格式表示為:JMP NEAR PTR PROGIAJMP SHORT QUEST其中,PROGIA和QUEST均為轉(zhuǎn)向

12、的符號地址,在機器指令中,用位移量來表示。在匯編指令中,如果位移量為16位,則在符號地址前加操作符NERA PTR;如果位移量為8位,則在符號地址前加操作符SHORT。2段內(nèi)間接尋址(intrasegment indirect addressing)32轉(zhuǎn)向有效地址是一個寄存器或是一個存儲單元的內(nèi)容。這個寄存器或存儲器單元的內(nèi)容可以用數(shù)據(jù)尋址方式中除立即數(shù)以外的任何一種尋址方式取得,所得到的轉(zhuǎn)向的有效地址用來取代IP寄存器的內(nèi)容33段內(nèi)間接尋址轉(zhuǎn)移指令的匯編格式可以表示為:JMP BXJMP WORD PTRBP+TABLE其中WORD PTR為操作符,用以指出其后的尋址方式所取得的轉(zhuǎn)向地址是

13、一個字的有效地址,也就是說它是一種段內(nèi)轉(zhuǎn)移。3段間直接尋址(intersegment direct addressing)34在指令中直接提供了轉(zhuǎn)向段地址和偏移地址,所以只要用指令中指定的偏移地址取代IP寄存器的內(nèi)容,用指令中指定的段地址取代CS寄存器的內(nèi)容就完成了從一個段到另一個段的轉(zhuǎn)移操作,如圖4-3所示。 35指令的匯編語言格式可表示為:JMP FAR PTR NEXTROUTINT其中,NEXTROUTINT為轉(zhuǎn)向的符號地址,F(xiàn)AR PTR則是表示段間轉(zhuǎn)移的操作符。對于386及其后繼機型,段間轉(zhuǎn)移應(yīng)修改CS和EIP的內(nèi)容,方法仍然和16位尋址時一致。4段間間接尋址(intersegme

14、nt indirect addressing)36用存儲器中的兩個相繼字的內(nèi)容來取代IP和CS寄存器中的原始內(nèi)容,以達到段間轉(zhuǎn)移的目的。這里,存儲單元的地址是由指令指定除立即數(shù)方式和寄存器方式以外的任何一種數(shù)據(jù)尋址方式取得,如圖4-4所示。37這種指令的匯編語言格式可表示為:JMP DWORD PTRINTERSBX其中,INTERSBX說明數(shù)據(jù)尋址方式為直接變址尋址方式,DWORD PTR為雙字操作符,說明轉(zhuǎn)向地址需取雙字為段間轉(zhuǎn)移指令。對于386及其后繼機型,除16位尋址方式外,還可使用32位尋址方式,方法上也與16位尋址相同。如:JMP DWORD PTREDI4.2 80X86微處理器

15、的指令格式38 程序是使計算機完成一個任務(wù)的一組命令或指令序列; 指令是規(guī)定微處理器執(zhí)行某種特定操作的“命令”。指令系統(tǒng)是計算機全部的指令的集合, 指令系統(tǒng)的功能大體上決定了計算機系統(tǒng)硬件的基本功能。 機器指令由二進制數(shù)組成,計算機硬件只能識別、存儲和運行機器指令。但機器指令無論是在書寫、閱讀和記憶都是非常困難的,為此,引入了符號指令。符號指令使用規(guī)定的助記符和規(guī)定的書寫格式的指令。匯編語言是一種符號語言,用助記符表示操作碼,用符號或符號地址表示操作數(shù)或操作數(shù)地址,它與機器指令是一一對應(yīng)的。3980X86 CPU指令系統(tǒng)采用了變長的指令格式,不可能用一個簡單的規(guī)則來描述指令的編碼格式。通常指令

16、由操作碼和操作數(shù)兩個部分組成。操作碼表示該指令完成的操作,如數(shù)據(jù)傳送指令、算術(shù)邏輯操作等。操作數(shù)可是參加操作的數(shù)本身, 或操作數(shù)的地址。如何尋找操作數(shù)是由指令的尋址方式指出,也是由指令的編碼方式指出。4.2.1 80X86微處理器的指令編碼格式408086/8088/80286指令編碼的一般形式,如圖4-5所示。編碼中每個方框代表了指令相應(yīng)的目標碼的一個或多個字節(jié),并且各成分是以字節(jié)順序表示的,低地址字節(jié)在左邊。41以8086/088指令格式編碼格式為例,其指令由16個字節(jié)組成,它包括操作碼、尋址方式以及操作數(shù)三部分組成,如圖4-6所示42指令的第一字節(jié)為操作碼,規(guī)定指令的操作類型。第二字節(jié)規(guī)

17、定操作數(shù)的尋址方式,稱為尋址方式字節(jié),是指令編碼中最復(fù)雜的字節(jié)。在這一字節(jié)中放置了關(guān)于操作數(shù)類型的信息,用于指出指令中寄存器和存儲器尋址方式的信息。尋址方式字節(jié)被分成三個域,分別是mod(方式)域、reg(寄存器)域和r/m(寄存器/存儲器)域。指令中操作碼字節(jié)和尋址方式字節(jié)格式如圖4-7所示。434.2.2 Pentium指令格式44Pentium的指令長度變化很大(1字節(jié)12字節(jié)),格式如下:45例:給出MOV ECX,EBX+ESI4的指令編碼。解:首先知道MOV指令的指令碼為100010,D=1,W=1。其次MOD/RM部分為 00 001 100。SIB部分為 10 110 011。

18、所以該指令編碼為 1000 1011 0000 1100 1011 0011,也就是8B0CB3。4.2.3 80X86微處理器的指令書寫格式46計算機是通過執(zhí)行指令來處理各種數(shù)據(jù),同時指出數(shù)據(jù)的來源、操作結(jié)果的去向以及執(zhí)行的操作。計算機中的指令由操作碼字段和操作數(shù)字段組成,如圖4-8所示。47操作碼(OP: Operation Code):描述計算機所要執(zhí)行的操作,其長度取決于指令系統(tǒng)中指令的條數(shù)。操作數(shù)(Operand):描述該指令的操作對象(地址碼/操作數(shù)),如給出參與操作的操作數(shù)的值是多少或者指出操作數(shù)存放在何處、操作的結(jié)果應(yīng)送往何處等信息。操作數(shù)可分為存儲器操作數(shù)、寄存器操作數(shù)和立即

19、數(shù)。根據(jù)地址碼部分所給出的地址個數(shù),指令可以分為零地址指令、一地址指令、二地址指令和三地址指令等。4.3 80X86微處理器的指令系統(tǒng)4880X86 CPU指令系統(tǒng)按功能分為6類,它們是數(shù)據(jù)傳送類指令、算術(shù)運算類指令、轉(zhuǎn)移和調(diào)用指令、邏輯運算和移位指令、串操作指令和處理機控制指令。4.3.1 數(shù)據(jù)傳送類指令49數(shù)據(jù)傳送指令負責(zé)把數(shù)據(jù)、地址或立即數(shù)傳送到寄存器或存儲單元中。傳送指令執(zhí)行后, 源操作數(shù)不變。通常,數(shù)據(jù)傳送類指令的執(zhí)行不影響狀態(tài)標志。數(shù)據(jù)傳送指令可以進一步分為通用傳送指令、堆棧操作指令和I/O指令。本章僅介紹通用傳送指令和堆棧操作指令,I/O指令將在第6章中進行介紹。501通用傳送指

20、令(1)數(shù)據(jù)傳送指令。格式:MOV DST, SRC執(zhí)行的操作(DST) (SRC)其中:DST表示目的操作數(shù),SRC表示源操作數(shù)。51MOV指令格式: MOV mem/reg1,mem/reg2 MOV reg,data MOV ac,mem MOV mem,ac MOV segreg,mem/reg MOV mem/reg,segreg MOV mem/reg,data52(2)符號擴展傳送指令。格式:MOVSX DST, SRC功能:將SRC的符號位向高位擴展,使其與目標操作數(shù)字長相同,再送到DST,而SRC保持不變。說明: DST為REG16或REG32,SRC為小于等于DST的立即數(shù)

21、或存儲器操作數(shù)或寄存器操作數(shù)。 對于帶符號數(shù)的補碼,擴展前后的真值相等,只有補碼的位數(shù)不同。53(3)零擴展傳送指令。格式:MOVZX DST,SRC功能:將SRC的高位用0補充,使其與目標操作數(shù)字長相同,再送到DST,而SRC保持不變。說明: DST為REG16或REG32,SRC為小于等于DST的立即數(shù)或存儲器操作數(shù)或寄存器操作數(shù)。 對于無符號數(shù)的真值不變。54(4)有效地址送寄存器指令。格式:LEA REG, SRC; (MOV DES,OFFSET SRC)執(zhí)行:REG EA把源操作數(shù)的有效地址送到指定的寄存器。SRC為內(nèi)存操作數(shù)。REG為16位或32位寄存器(除段寄存器外)。55(5

22、)指針傳送指令。格式:操作碼助記符 REG, SRC功能與說明: 操作碼助記符:LDS、LES、LFS、LGS、LSS,其后兩位字母表段寄存器, 它們是隱含的目標寄存器,共5條地址指針傳送指令。 始終將源操作數(shù)高16位送入隱含的目標寄存器。若源操作數(shù)是32位內(nèi)存操作數(shù),則將低16位送目標通用寄存器; 若源操作數(shù)是48位內(nèi)存操作數(shù),則將低32位送目標通用寄存器。56(6)標志寄存器傳送指令。 格式:LAHF功能:AH (標志寄存器Flag的低字節(jié)),即將標志寄存器的低8位送AH指令,如圖4-9所示。 格式:SAHF功能:(PSW的低位字節(jié))(AH),即將AH寄存器的內(nèi)容傳送到標志寄存器低8位,如

23、圖4-10所示。57(7)交換指令。格式:XCHG OPR1, OPR2 執(zhí)行的操作:(OPR1) (OPR2) 其中:OPR1與OPR2須是等長操作數(shù),且OPR1,OPR2必須有一個是寄存器,能夠完成寄存器與寄存器之間交換數(shù)據(jù)以及寄存器與存儲器之間交換數(shù)據(jù)。注意: 交換指令執(zhí)行結(jié)果不影響標志位。 段寄存器不能作為XCHG的操作數(shù)。58(8)字節(jié)交換指令。格式:BSWAP REG32功能: 將32位REG的位31位24與 位7位0交換,位23位16與位15位8交換,如圖4-11所示。59(9)查表指令XLAT(換碼指令)。格式:XLAT 表頭變量名執(zhí)行:AL(DS:BX+AL )或AL(DS:

24、EBX+AL)用途:把一種碼轉(zhuǎn)換為另一種代碼。602堆棧操作指令堆棧是人為定義的一塊連續(xù)的內(nèi)存空間,用來暫存數(shù)據(jù),按“先進后出”的規(guī)律存取;棧底為堆棧空間的高地址單元,棧頂為低地址單元;棧底是固定不變的,棧頂隨數(shù)據(jù)的進棧與出棧在變化,通常用SP來指出棧頂?shù)牡刂?;堆棧操作以“字”為基本單位。?shù)據(jù)進棧后,棧頂指針向低地址端調(diào)整;數(shù)據(jù)出棧后,棧頂指針向高地址端調(diào)整。數(shù)據(jù)進棧的規(guī)律是,高位字節(jié)存入高地址單元,低位字節(jié)存入低地址單元。61(1)進棧指令PUSH。格式:PUSH SRC功能: 執(zhí)行時, 首先調(diào)整堆棧指針, 然后把源操作數(shù)壓棧。執(zhí)行操作:16位:(SP)(SP)-2 (SP)+1,(SP)(

25、SRC)32位:(ESP)(ESP)-4 (ESP)+3 (ESP)(SRC)注意:內(nèi)存操作數(shù)若不是直接尋址,則必須用PTR運算符來說明其屬性,例如PUSH WORD PTR BX。62(2)出棧指令POP。格式:POP DST功能:先將棧頂彈出2個或4個字節(jié),送入目標操作數(shù),然后調(diào)整堆棧指針。執(zhí)行操作:16位: (SP)+1,(SP)(DST) (SP) (SP) + 232位: (ESP)+3(SP)(DST) (ESP) (ESP) +4注意:內(nèi)存操作數(shù)若不是直接尋址, 則必須用PTR運算符來說明其屬性, 例如 POP WORD PTRBX63(3)16位標志寄存器進棧/出棧指令。(4)

26、32位標志寄存器進棧/出棧指令。64(5)16位通用寄存器進棧/出棧指令。 PUSHA:16位通用寄存器入棧。格式:PUSHA功能:執(zhí)行PUSHA時,首先將SPSP 16,再依次將AX、CX、DX、BX、SP、BP、SI、DI入棧。 POPA:16位通用寄存器出棧。格式:POPA功能:將堆棧內(nèi)的內(nèi)容依次彈出至DI、SI、BP、SP、BX、DX、CX、AX。注意:進棧與出棧順序時相反的;65(6)32位通用寄存器進棧/出棧指令。 PUSHAD:32位通用寄存器入棧。格式:PUSHAD功能:執(zhí)行PUSHA時,首先將SPSP32依次將EAX、ECX、EDX、EBX、ESP、EBP、ESI、EDI入棧

27、。 POPAD:32位通用寄存器出棧。格式:POPAD功能:將堆棧內(nèi)的內(nèi)容依次彈出至EDI、ESI、EBP、ESP、EBX、EDX、ECX、 EAX。4.3.2 算術(shù)運算類指令6680X86的算術(shù)運算指令包括二進制和十進制運算指令。算術(shù)指令用來執(zhí)行算術(shù)運算,它們中有雙操作數(shù)指令,也有單操作數(shù)指令。算術(shù)指令的尋址方式遵循以下規(guī)則: 雙操作數(shù)指令的兩個操作數(shù)中除了源操作數(shù)為立即數(shù)的情況外,必須有一個操作數(shù)在寄存器中。單操作數(shù)指令中不允許使用立即數(shù)方式。 671加法指令加法指令主要包括ADD加法指令、ADC帶進位的加法指令、INC加1指令、XADD 交換加法指令。雙操作數(shù)的指令A(yù)DD和ADC除了源操

28、作數(shù)外,不可以有立即數(shù)。單操作數(shù)指令I(lǐng)NC不允許使用立即數(shù)。操作數(shù)可以是字節(jié)或字的運算,并且影響標志位。68(1)ADD加法指令。格式:ADDDST,SRC執(zhí)行的操作:DST (DST) + (SRC)ADD加法指令影響的標志位有:CF、OF、SF、ZF、PF、AF。ADD指令注意事項: 兩個操作數(shù)不能同時為存儲器操作數(shù); 如果SRC是立即數(shù),DST是存儲器操作數(shù),則DST必須用PTR說明是字節(jié)還是字型或是雙字型,否則匯編時會出錯。69(2)ADC帶進位的加法指令。格式:ADC DST, SRC執(zhí)行的操作:DST (DST) + (SRC)+CFADC帶進位的加法指令影響的標志位有:CF、OF

29、、SF、ZF、PF、AF,其中CF是上一條指令執(zhí)行后產(chǎn)生的CF標志。70(3)INC 加1指令。格式:INC OPR執(zhí)行的操作:(OPR)(OPR) + 1INC指令注意事項: INC指令不影響CF標志,但影響AF、OF、PF、SF、ZF。 INC指令的操作數(shù)不能是立即數(shù)。 當(dāng)INC的操作數(shù)是存儲器操作數(shù)時,必須用PTR說明符說明其屬性。71(4)XADD 交換加法指令。格式:XADD DST,SRC功能:首先SRC與DST互換,然后SRC+DSTDST注意:DST是寄存器操作數(shù)或內(nèi)存操作數(shù), SRC 只能是與DST等長的寄存器操作數(shù)。722減法指令減法指令主要包含:SUB減法指令、SBB帶借

30、位減法指令、DEC減1指令、NEG求補指令、CMP比較指令和CMPXCHG 比較并交換指令73(1)SUB減法。格式:SUB DST, SRC執(zhí)行的操作:DST(DST) (SRC)SUB減法影響的標志位有:CF、OF、SF、ZF、PF、AF。74(2)SBB帶借位減法。格式: SBB DST, SRC執(zhí)行的操作: DST(DST) (SRC) CF75(3)DEC減1。格式:DEC OPR執(zhí)行的操作(OPR)(OPR) 1DEC指令注意事項: DEC指令不影響CF標志,但影響AF、OF、PF、SF、ZF。 DEC指令的操作數(shù)不能是立即數(shù)。 當(dāng)DEC的操作數(shù)是存儲器操作數(shù)時,必須用PTR說明符

31、說明其屬性。76(4)NEG求補。格式:NEG OPR執(zhí)行的操作:OPR - (OPR) 功能:NGE求OPR的負數(shù);若原OPR為正,在執(zhí)行NEG后,變?yōu)檠a碼表示的負數(shù)。反之,原OPR為補碼表示的負數(shù),則執(zhí)行完NEG后,變?yōu)檎龜?shù)。NEG指令注意事項: 操作數(shù)不能是立即數(shù)。 NEG指令影響AF、OF、PF、SF、ZF、CF。 對CF的影響: 只有當(dāng)(OPR) = 0 時,執(zhí)行完NEG后CF = 0,其他情況CF=1。 對OF的影響: 當(dāng)(OPR) = -128 或 (OPR) = -32768時OF = 1,其他情況OF = 0。77(5)CMP比較。格式:CMP DST, SRC執(zhí)行的操作:

32、(DST) (SRC)執(zhí)行的結(jié)果不回送DST,而是根據(jù)結(jié)果去影響的標志位CF、OF、SF、ZF、PF、AF。CMP常用于轉(zhuǎn)移指令之前。78(6)CMPXCHG 比較并交換指令。格式:CMPXCHG DST,SRC功能:將DST與AL/AX/EAX比較,若相等,則將SRC送DST;若不等,則將DST送AL/AX/EAX。793乘法指令乘法指令主要包含無符號數(shù)乘法指令和帶符號數(shù)乘法指令兩種類型。80(1)MUL無符號數(shù)乘法指令,如圖4-15所示。格式:MUL SRC功能與說明:乘數(shù)和被乘數(shù)須是等長的無符號二進制數(shù),乘積為雙倍長;被乘數(shù)默認在累加器中(AL/AX/EAX)。執(zhí)行的操作: 字節(jié)操作:(

33、AX)(AL) * (SRC)字操作: (DX,AX) (AX) * (SRC)雙字操作:(EDX,EAX) (EAX) * (SRC)8182注意事項: 目的操作數(shù)必須是累加器AL、AX、EAX,源操作數(shù)是除立即數(shù)之外的尋址方式。 影響CF、OF標志位,其他無定義。 如果乘積的高半部分為0,即AH = 0、DX = 0或EDX=0,則CF=OF = 0,否則CF = OF = 183(2)IMUL帶符號數(shù)乘法指令。格式1:IMUL SRC執(zhí)行的操作: 字節(jié)操作: (AX) (AL) * (SRC)字操作: (DX,AX) (AX) * (SRC)雙字操作: (EDX,EAX) (EAX) *

34、 (SRC)注意事項: 目的操作數(shù)必須是累加器AL、AX、EAX。 源操作數(shù)是除了立即數(shù)之外的尋址方式。 標志位的影響:CF、OF,其他無定義。 如果乘積的高一半是低一半的符號擴展CF=OF = 0,否則 CF = OF = 1。84格式2:IMUL DST,SRC執(zhí)行的操作:(DST) (DST) * (SRC)注意事項: 標志位的影響:CF、OF, 其他無定義。 如果乘積的高一半是低一半的符號擴展CF=OF = 0,否則 CF = OF = 1。85格式3:IMULDST,SRC,DATA執(zhí)行的操作: DST DATA * (SRC)注意事項:標志位的影響:CF、OF,其他無定義。如果乘積

35、的高一半是低一半的符號擴展CF=OF = 0,否則CF = OF = 1。864除法運算除法指令主要包括DIV 無符號數(shù)的除法指令和IDIV有符號數(shù)的除法指令兩種類型。另外,在有符號數(shù)除法指令中,還需要符號擴展指令的配合。87(1)DIV 無符號數(shù)的除法指令。格式:DIV SRC說明:被除數(shù)應(yīng)是除數(shù)的雙倍字長,被除數(shù)放在默認寄存器中。執(zhí)行的操作如下所述。88字節(jié)操作:16位被除數(shù)放在AX中,8位除數(shù)為源操作數(shù)。結(jié)果的8位商在AL中,8位的余數(shù)在AH中。表示為: (AL) (AX)/(SRC)的商(AH) (AX)/(SRC)的余數(shù)字操作:32 位被除數(shù)在DX,AX中,16位除數(shù)為源操作數(shù)。結(jié)果

36、的16位商在AX中,16位的余數(shù)在DX中。表示為:(AX) (DX,AX)/(SRC)的商(DX) (DX,AX)/(SRC)的余數(shù)89雙字操作:64位被除數(shù)在EDX,EAX中,32位除數(shù)為源操作數(shù)。結(jié)果的32位商在EAX中,32位的余數(shù)在EDX中。表示為: (EAX) (EDX,EAX)/(SRC)的商 (EDX) (EDX,EAX)/(SRC)的余數(shù)注意:執(zhí)行DIV,運算后對標志位無確定影響,都沒有意義。 商超過規(guī)定的范圍, 去執(zhí)行0型中斷。90(2)IDIV有符號數(shù)的除法指令。格式:IDIV SRC說明: 與DIV相同,但除數(shù)、被除數(shù)和商值都是有符號補碼數(shù)。 若被除數(shù)與除數(shù)等長時, 須先

37、將被除數(shù)擴展。 數(shù)的大小不變, 僅將數(shù)的符號位擴展。執(zhí)行的操作如下所述。91字節(jié)操作:16位被除數(shù)在AX中,8位除數(shù)為源操作數(shù)。結(jié)果的8位商在AL中,8位的余數(shù)在AH中。表示為:(AL) (AX)/(SRC)的商(AH) (AX)/(SRC)的余數(shù)字操作:32位被除數(shù)在DX、AX中,16位除數(shù)為源操作數(shù)。結(jié)果的16位商在AX中,16位的余數(shù)在DX中。表示為:(AX) (DX,AX)/(SRC)的商 (DX) (DX,AX)/(SRC)的余數(shù)92雙字操作:64位被除數(shù)在EDX、EAX中,32位除數(shù)為源操作數(shù)。結(jié)果的32位商在EAX中,32位的余數(shù)在EDX中。表示為: (EAX) (EDX,EAX

38、)/(SRC)的商(EDX) (EDX,EAX)/(SRC)的余數(shù)93(3)符號擴展指令。 CBW字節(jié)轉(zhuǎn)換為字。格式:CBW執(zhí)行的操作:將AL的符號位擴展到AH。 CWD字轉(zhuǎn)換為雙字。格式: CWD執(zhí)行的操作:將AX的符號位擴展到DX。94 CDQ雙字擴展為四字。格式:CDQ執(zhí)行的操作: EAX的符號位擴展到EDX。955十進制調(diào)整指令二十進制碼(BCD碼)是二進制數(shù)編碼的十進制數(shù)。BCD碼可分為壓縮BCD(組合BCD碼)和非壓縮BCD碼(未組合BCD碼/分離BCD碼)兩種。壓縮BCD碼用4位二進制數(shù)表示一位十進制數(shù)。非壓縮BCD碼用8位二進制數(shù)表示一位十進制數(shù)。96 前面介紹的四則運算指令,

39、其運算對象都是二進制數(shù),CPU在執(zhí)行中按“逢二進一,借一當(dāng)二”的規(guī)則處理運算過程中的進位和借位。如果運算對象是BCD碼,就需要設(shè)置一套“調(diào)整指令”。調(diào)整指令并非用來進行運算,其目的是:在進行十進制的四則運算中,先用上述的二進制數(shù)運算指令,然后再用相關(guān)的調(diào)整指令,對結(jié)果進行修正,修正后的結(jié)果就是用BCD碼表示的十進制數(shù)。4.3.3 轉(zhuǎn)移和調(diào)用指令97用于控制指令流程的指令有轉(zhuǎn)移、循環(huán)、過程調(diào)用和中斷調(diào)用等指令。按轉(zhuǎn)移條件分為:無條件轉(zhuǎn)移和有條件轉(zhuǎn)移;按轉(zhuǎn)移的范圍分為:段內(nèi)轉(zhuǎn)移和段間轉(zhuǎn)移;按獲取地址的方法分為:直接轉(zhuǎn)移和間接轉(zhuǎn)移。981無條件轉(zhuǎn)移指令JMP無條件轉(zhuǎn)移指令功能:無條件轉(zhuǎn)移,執(zhí)行指定標

40、號處的指令。無條件轉(zhuǎn)移指令的執(zhí)行結(jié)果不影響標志位。格式1:段內(nèi)直接轉(zhuǎn)移JMP 標號JMP SHORT 標號說明:段內(nèi)轉(zhuǎn)移(SHORT)指令偏移量為8位,允許轉(zhuǎn)移值的范圍為-128+127。不含SHORT的指令,其轉(zhuǎn)移范圍可覆蓋整個邏輯段。99格式2: 段內(nèi)間接轉(zhuǎn)移JMP 寄存器操作數(shù); (IP)(EA)JMP 內(nèi)存操作數(shù)說明:寄存器、內(nèi)存單元存放的是有效地址。所謂“間接”,是指當(dāng)CPU執(zhí)行指令時,將寄存器或內(nèi)存單元內(nèi)的有效地址寫入IP或EIP,從而實現(xiàn)轉(zhuǎn)移。100格式3: 段間直接轉(zhuǎn)移JMP 標號 ;(IP)跳轉(zhuǎn)的EA ;(CS) 跳轉(zhuǎn)的段地址說明:模塊化程序設(shè)計中,從一個模塊轉(zhuǎn)移到另一個模塊

41、需執(zhí)行段間轉(zhuǎn)移指令,此時段間轉(zhuǎn)移標號要作兩項說明:在轉(zhuǎn)移目標模塊(即被調(diào)用模塊)中用PUBLIC說明為“公共變量”,在本模塊(即調(diào)用模塊)中用EXTRN說明為“外部變量名”。在模塊設(shè)計時,從一個模塊轉(zhuǎn)移到另一個模塊,用段間直接轉(zhuǎn)移。101格式4:段間間接轉(zhuǎn)移JMP 內(nèi)存操作數(shù);(IP) (EA);(CS)(EA+2)在實模式下,段間間接轉(zhuǎn)移指令將段地址和偏移地址送給CS和IP。1022條件轉(zhuǎn)移指令格式: 操作碼助記符 轉(zhuǎn)移地址標號功能:根據(jù)上一條指令對標志寄存器中標志位的影響來決定程序執(zhí)行的流程,若滿足條件時執(zhí)行指定標號處的指令,否則,順序執(zhí)行后續(xù)指令。 (1)按標志位的當(dāng)前狀態(tài)轉(zhuǎn)移。(2)無

42、符號數(shù)條件轉(zhuǎn)移。(3)有符號數(shù)條件轉(zhuǎn)移。(4)循環(huán)控制轉(zhuǎn)移。1033子程序調(diào)用與返回子程序是一個完整的、獨立的有一定名稱(標號)的程序段,它可以多次被其他程序調(diào)用,并在這個程序段執(zhí)行完后返回到原先調(diào)用的程序處。主程序調(diào)用子程序用子程序調(diào)用指令CALL實現(xiàn);子程序結(jié)束須用一條返回指令(eg.RET指令),返回到主程序。CPU在讀取CALL指令時, IP自動遞增,使它指向下一條指令的存儲單元地址。CALL指令執(zhí)行時,必須保存CALL指令后面的第一條指令地址(斷點地址)。104(1)子程序調(diào)用指令。 段內(nèi)直接相對調(diào)用。格式:CALL DST 段內(nèi)間接調(diào)用。格式: CALL MEM/REG 段間直接調(diào)

43、用。格式:CALLFAR PTR 過程名 段間間接調(diào)用。格式: CALL MEM 無參數(shù)的返回。格式: RET 有參數(shù)返回指令。格式:RET N(N為偶數(shù))1054中斷調(diào)用及返回(1)中斷調(diào)用指令(軟件中斷指令)。格式:INT n(2)中斷返回指令。格式: IRET功能:該指令為中斷服務(wù)程序的返回指令,CPU執(zhí)行該指令時,依次從棧頂彈出6個元素送IP、CS、FLAGS,返回調(diào)用程序斷點。4.3.4 邏輯運算和移位指令1061邏輯運算指令(1)取反指令。NOT 目標操作數(shù)NOT MEM/REG功能:按位求反,不影響標志位。(2)與指令。AND 目標,源操作數(shù)功能:源、目操作數(shù)按位相“與”,結(jié)果放

44、目標操作數(shù)。107(3)或指令OR 目標,源操作數(shù)功能:源、目操作數(shù)按位相“或”,結(jié)果放目標操作數(shù)(4)異或指令XOR 目標,源操作數(shù)功能: 源、目操作數(shù)按位“異或”,結(jié)果放目標操作數(shù)。按位異或相同為“0”,相異為“1”。注意: 源、目標操作數(shù)不允許同為內(nèi)存操作數(shù)。 當(dāng)源操作數(shù)為立即數(shù),目標操作數(shù)為內(nèi)存操作數(shù)時,須用PTR說明其屬性。1082移位指令(1)開環(huán)移位指令(見圖4-17)109算術(shù)移位n位相當(dāng)于把二進制數(shù)乘以或除以2n;邏輯移位操作則用于截取字節(jié)或字中的若干位。移位指令的執(zhí)行結(jié)果影響PF、SF、ZF和CF。其中,CF總是等于最后移出的那一位的值,AF不定。 算術(shù)左移:SAL 操作數(shù)

45、,CL/立即數(shù)。 邏輯左移:SHL 操作數(shù),CL/立即數(shù)。 算術(shù)右移:SAR 操作數(shù),CL/立即數(shù)。 邏輯右移:SHR 操作數(shù),CL/立即數(shù)。110(2)閉環(huán)移位指令。含進位的循環(huán)左移:RCL操作數(shù),CL立即數(shù)。含進位的循環(huán)右移:RCR操作數(shù),CL立即數(shù)。不含進位的循環(huán)左移:ROL操作數(shù),CL立即數(shù)。1113測試與位測試指令 (1)測試指令。格式:TEST 目,源功能:源、目操作數(shù)相“與”,但結(jié)果不回送目標操作數(shù),結(jié)果影響標志位P、Z、S,A未定義,O、C置0。該指令后跟轉(zhuǎn)移指令,用來測試目標操作數(shù)的一位或某幾位。112(2)位測試指令。格式:位測試:BT 目標操作數(shù),源操作數(shù)位測試置0:BT

46、R目標操作數(shù),源操作數(shù)位測試置1:BTS 目標操作數(shù),源操作數(shù)位測試取反:BTC 目標操作數(shù),源操作數(shù)113功能與說明: 四條指令相同點: 測試目標操作數(shù)中由源操作數(shù)指定的那一位,并將測試位位值送C標志。若測試的位置大于目標操作數(shù)的長度,則取源/目的余數(shù)才是測試位。指令執(zhí)行完后,源操作數(shù)不變。 不同點:BT執(zhí)行后,目標操作數(shù)不變;BTR、BTS、BTC執(zhí)行后對測試位做相應(yīng)的操作:置0,置1,取反。1144位掃描指令(1)向前掃描指令。格式:BSF目標寄存器,源操作數(shù)功能:從源的低位高位搜索,將遇到第一個“1”所在的序號存入目標寄存器中。(2)向后掃描指令。格式:BSR目標寄存器,源操作數(shù)功能:

47、從源的高位低位搜索,將遇到第一個“1”所在的序號存入目標寄存器中。說明: 源操作數(shù)為0,Z標=1,否則,Z標=0。 源、目標操作數(shù)須等長;執(zhí)行完指令源不變。4.3.5 串操作指令115從80386開始,串操作指令有所擴展,在原先的字節(jié)操作、字操作基礎(chǔ)上,增加了雙字操作,而且可以采用16位和32位尋址。各種串操作指令雖然功能有所不同,但有許多共同之處。例如,當(dāng)對串中的一個“元素”操作之后,都要自動修改串地址指針,使其指向下一個元素。這個“元素”可以是一個字節(jié)、字、雙字等類型。對數(shù)據(jù)塊(字符串)進行操作,其中部分指令兩個操作數(shù)可以同時是存儲器操作數(shù)。源串和目標串的存儲及尋址方式都是隱含規(guī)定的,即源

48、串放在數(shù)據(jù)段,目標串放在ES附加段。在16位尋址操作下,CPU自動用SI間址訪問數(shù)據(jù)段,用DI間址訪問ES附加段,用CX作為串計算器。在32位尋址操作下,CPU自動用ESI間址訪問數(shù)據(jù)段,用EDI間址訪問ES附加段,用ECX作為串計算器。116串操作指令注意事項:(1)串操作指令需指明每次操作的類型:字節(jié),字,雙字。(2)串操作指令使用DS:SI(ESI)作為源操作數(shù)指針,可用段前綴指令改變;使用ES:DI(EDI)作為目的操作數(shù)指針,不能用段前綴指令改變。(3)設(shè)置DF來表示每次操作以后變址寄存器SI和DI的變化方向:DF0為增址方式,DF1為減址方式。 用CX存放要處理的字符串的元素個數(shù)。

49、 每處理完一個元素,自動修改SI、DI的值。1171串傳送指令格式: (1)MOVSB ;字節(jié)傳送。 (2)MOVSW ;字傳送。 (3)MOVSD ;雙字傳送。 (4)MOVS OPRD1,OPRD2。功能:CPU執(zhí)行串傳送指令,都是將源串DS:SI的一個字符元素送目標串ES:DI。118有重復(fù)前綴的格式:(5)REPMOVSB。(6)REPMOVSW。(7)REPMOVSD。功能:除完成基本傳送指令操作外,需要將傳送元素個數(shù)先送CX,每傳送一個元素都要自動完成(CX1CX)操作,如果(CX0),傳送后續(xù)元素,直到(CX10)為止。1192串裝入指令(Load from string)格式:

50、LODSB;DS:SI中的一個字節(jié)送ALLODSW;DS:SI中的一個字送AXLODSD ;DS:SI中的一個雙字送EAX功能:從源串取一個字符串元素送累加器;注意:根據(jù)D標志自動修改SI。1203串存儲指令(Store Into String)格式:STOSB;把 ALES: DI的1個單元 STOSW ;把 AX ES: DI的2個單元 STOSD;把 EAX ES: DI的4個單元 注意:根據(jù)D標志自動修改DI。121有重復(fù)前綴的格式: REPSTOSBREPSTOSWREPSTOSD說明: 指令執(zhí)行前,應(yīng)把欲存儲元素個數(shù)送CX; CPU執(zhí)行指令時,除完成基本存儲指令的操作外,每存儲一個元素,自動完成CX-1CX,若CX-10,存儲下一個元素,直到(CX -1=0)為止。1224串比較指令基本格式:CMPSOPRD1,OPRD2;OPRD1是源串,OPRD2是目的串CMPSB;字節(jié)串比較CMP

溫馨提示

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

評論

0/150

提交評論