的尋址方式和指令系統(tǒng)_第1頁
的尋址方式和指令系統(tǒng)_第2頁
的尋址方式和指令系統(tǒng)_第3頁
的尋址方式和指令系統(tǒng)_第4頁
的尋址方式和指令系統(tǒng)_第5頁
已閱讀5頁,還剩119頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第三章8086的尋址方式和指令系統(tǒng)3.18086的尋址方式3.2指令的機器碼表示方法3.38086指令系統(tǒng)1匯編語言指令的特點語法結(jié)構(gòu)符合人類語言的共同特點——動作+對象指令操作碼→動作:做什么指令操作數(shù)→對象:針對什么做動作例: MOVAX,BX機器指令:指令的二進制代碼形式。如:89D8匯編指令:助記符形式的指令。如:MOVAX,BX2匯編語言指令操作碼:由CPU設(shè)計人員定義。每一種操作唯一對應(yīng)一個操作碼。操作數(shù):可由編程人員采用不同方式給出。尋址方式:尋找操作數(shù)(操作數(shù)地址)的方式;指令格式:指令中對操作碼、操作數(shù)的編碼方式。3操作數(shù)1.8086指令中操作數(shù)的個數(shù)可以有以下幾種情況無操作數(shù)指令,例:等待指令WAIT單操作數(shù)指令,例:加1指令I(lǐng)NCAL雙操作數(shù)指令,例:減法指令

SUBAL,BL源操作數(shù):后者(BL)目的操作數(shù):前者(AL)42、操作數(shù)存放地點,可以有以下幾種:立即數(shù):操作數(shù)直接包含在指令中。 例:MOVAL,50H

寄存器操作數(shù):操作數(shù)存放在寄存器中。例:INCAL

I/O操作數(shù):操作數(shù)來自I/O端口。例:INAL,28H操作數(shù)內(nèi)存操作數(shù):操作數(shù)存放在內(nèi)存單元中。 例:MOVAL,[2000H]

53.18086的尋址方式6實質(zhì)都是間接尋址78086的非存儲器尋址方式1、立即數(shù)尋址方式源操作數(shù)以8位或16位常數(shù)的形式直接出現(xiàn)在指令中。一般用于賦值。

例:MOVAL,5FH2、寄存器(直接)尋址方式

8位或16位寄存器的值就是操作數(shù)本身。與其它尋址方式相比,該方式執(zhí)行速度最快。

例:MOVSI,DX通用寄存器、段寄存器均可83、固定尋址(隱含尋址)

操作數(shù)并不直接出現(xiàn)在指令中,而是由操作碼隱含地指定為某一固定內(nèi)容。例:PUSHDS

;目操作數(shù)隱含為棧頂字單元

POPBX

;源操作數(shù)隱含為棧頂字單元

LAHF

;源操作數(shù)隱含為標(biāo)志寄存器低字節(jié),;目操作數(shù)隱含為寄存器AH4、I/O端口尋址僅用于輸入/輸出指令I(lǐng)N、OUT。98086的存儲器尋址方式二、存儲器尋址方式1、直接尋址方式操作數(shù)存放在存儲器單元中,由指令直接給出該單元的有效地址EA(即16位段內(nèi)偏移量)。操作數(shù)的物理地址PA=16*DS+EA

例:MOVAX,[0016H]尋址過程示意段超越前綴

MOVAX,ES:[0500H]符號地址

MOVAX,AREA1102、寄存器間接尋址方式操作數(shù)存放在存儲器單元中,指令給出的16位寄存器值就是該單元的EA。

PA=16*DS+BX

或=16*DS+SI

或=16*DS+DI

或=16*SS+BP例:MOV[BX],CL尋址過程示意必須是BX、BP、SI、DI段超越前綴:MOVBX,DS:[BP]MOVAX,ES:[SI]113、寄存器相對尋址操作數(shù)的有效地址是一個基址或變址寄存器的內(nèi)容與指令中指定的8位或16位位移量之和。例:MOVDL,[BP+2]尋址過程示意其它等效寫法

MOVDL,[BP]2MOVDL,2[BP]124、基址變址尋址方式操作數(shù)的有效地址是一個基址寄存器(BX或BP)和一個變址寄存器(SI或DI)的內(nèi)容之和。

PA=16*DS+BX+

PA=16*SS+BP+

例:MOV[BX][SI],AX尋址過程示意其它等效寫法:

MOV[BX+SI],AXSIDI135、相對基址變址尋址方式操作數(shù)的有效地址是一個基址寄存器和一個變址寄存器的內(nèi)容,再加上指令中指定的8位或16位位移量之和。

PA=16*DS+BX++位移量或

PA=16*SS+BP++位移量例:MOVAX,4[BX][DI

尋址過程示意其它等效寫法:

MOVAX,4[BX+DI]MOVAX,[BX+DI+4]SIDI14段寄存器使用規(guī)則直接尋址使用BX、SI、DI的間接尋址使用BP的間接尋址堆棧操作源串指針目標(biāo)串指針指令指針默認(rèn)段寄存器DSDSSSSSDSESCS可加的段超越前綴ES:SS:CS:ES:SS:CS:DS:ES:CS:—ES:SS:CS:——固定搭配的寄存器SPDIIP153.28086的指令格式與編碼指令的書寫格式

操作碼[[操作數(shù)1],[操作數(shù)2]]說明:操作碼:必備;操作數(shù):可以是1個、2個或沒有,可以是8位或16位指令的編碼格式采用變長編碼格式,屬于CISC。低端

高端指令前綴操作碼字段尋址方式字段操作數(shù)字段1字節(jié)1字節(jié)1字節(jié)1~4字節(jié)便于書寫可讀性強163.38086指令系統(tǒng)3.3.1數(shù)據(jù)傳送指令3.3.2算術(shù)運算指令3.3.3邏輯運算及移位指令3.3.4串操作指令3.3.5控制轉(zhuǎn)移指令3.3.6處理器控制指令3.3.7指令的執(zhí)行時間和軟件延時173.3.1數(shù)據(jù)傳送指令通用數(shù)據(jù)傳送指令MOV堆棧操作指令PUSH、POP數(shù)據(jù)交換指令XCHG查表指令XLAT輸入輸出指令I(lǐng)N、OUT地址傳送指令LEA、LDS、LES標(biāo)志傳送指令LAHF、SAHF、PUSHF、POPF小結(jié)18通用數(shù)據(jù)傳送指令MOV功能:將源操作數(shù)內(nèi)容復(fù)制到目的操作數(shù)中格式:MOVdst,src;(dst)←(src)Dst:R、M、SR;Src:R、M、SR、Im不影響標(biāo)志位19MOV指令有以下5種傳送路徑:①立即數(shù)→通用寄存器或存儲單元MOVAX,0220HMOVWORDPTR[DI],1000H②通用寄存器←→通用寄存器MOVAL,BL;BL中的8位數(shù)據(jù)送到AL中③通用寄存器←→段寄存器MOVDS,AX;AX中的16位數(shù)據(jù)送到DSMOVBX,ES;ES中的16位數(shù)據(jù)送到AX20④通用寄存器←→存儲單元MOV4[DI],AL;((DI)+4)←ALMOVAX,[SI];AX←((SI))⑤段寄存器←→存儲單元MOV[BX+SI],CS;CS的內(nèi)容送到[BX+SI]和[BX+SI]+1的兩單元MOVDS,[3000H];3000H和3001H兩單元的內(nèi)容送到DS其它操作:傳遞偏移地址

MOVDX,OFFSETARRAY;將ARRAY的偏移地址送至DX,offset是屬性操作符21特別注意MOV指令不能直達的路徑:立即數(shù)×→段寄存器存儲單元×→存儲單元段寄存器×→段寄存器CS段寄存器不可作為目的操作數(shù)22對MOV指令的使用,應(yīng)注意以下幾點:

MOV指令是雙操作數(shù)指令,源和目的操作數(shù)的類型必須一致,或同為字節(jié),或同為字。下面的指令是錯誤的:

MOVAX,BLMOVAL,1234H

不允許用立即數(shù)作目的操作數(shù)。不能用CS和IP作目的操作數(shù),也就是說,CS

和IP兩寄存器的內(nèi)容不得隨意改變,一般只能在轉(zhuǎn)移指令時改變。23堆棧的概念

堆棧——以“先進后出”原則組織起來的連續(xù)的存儲空間。

堆棧操作以字為單位。固定以SS:SP為指針指示棧頂,出、入堆棧的操作均針對棧頂單元進行。80X86的堆棧生長方向為“由高向低增長”。入棧,指針減出棧,指針加24堆棧操作入棧:先修改棧頂指針(SP減2);然后將入棧數(shù)據(jù)存入,低字節(jié)存入SP指向的單元,高字節(jié)存入SP+1指向的單元。出棧:先將出棧數(shù)據(jù)彈出,SP指向的單元存入目標(biāo)位置低字節(jié),SP+1指向的單元存入目標(biāo)位置高字節(jié);然后修改棧頂指針(SP加2)。25堆棧操作指令1、入棧指令PUSH可使用的操作數(shù)類型:PUSHCX ;通用寄存器PUSHDS ;段寄存器PUSH[0040H];存儲器

目操作數(shù)隱含為棧頂單元指令執(zhí)行時先SP減2入棧過程示意2、出棧指令POP可使用的操作數(shù)類型:POPSI ;通用寄存器POPES ;段寄存器POP[BX] ;存儲器源操作數(shù)隱含為棧頂單元指令執(zhí)行后SP加2出棧過程示意不能用CS!不影響標(biāo)志位26數(shù)據(jù)交換指令XCHG功能:將源、目操作數(shù)的內(nèi)容互相交換,指令執(zhí)行后源、目操作數(shù)同時被改變指令形式:XCHGop1,op2;(op1)(op2)op1:R,M;op2:R,M不影響標(biāo)志位交換指令對操作數(shù)有如下要求:兩個操作數(shù)字長必須相同,可以是字節(jié)交換,也可以是字交換。27源操作數(shù)和目的操作數(shù)均可以是寄存器或存儲器,但不能同時為存儲器。

段寄存器不能作為操作數(shù)。如:

XCHGCL,DH ;通用寄存器通用寄存器

XCHGAX,[BP];通用寄存器存儲器寄存器存儲器【例】

設(shè)(DS)=2000H,(SI)=0100H,

(DX)=1145H,(20300H)=22H,(20301H)=3CH則執(zhí)行指令“XCHG[SI+200H],DL”后,DL的內(nèi)容發(fā)生了什么樣的變化?

28查表指令XLAT指令功能:將AL中的值(碼)轉(zhuǎn)換為內(nèi)存表格中的某一值后,再送回AL中。指令形式:XLAT[數(shù)據(jù)表首地址標(biā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。實現(xiàn)什么功能?29已知十進制數(shù)0~9的七段LED顯示碼對照表如表所示。試用XLAT指令求數(shù)字6的七段顯示碼。十進制數(shù)的七段顯示碼

十進制數(shù)字七段顯示碼十進制數(shù)字七段顯示碼0123440H79H24H30H19H5678912H02H78H00H18H30TABLEDB40H,79H,24H,30H,19HDB12H,02H,78H,00H,18H┆┆MOVAL,6;數(shù)字6的位移量送ALMOVBX,OFFSETTABLE;表格首址送BXXLATTABLE

31輸入/輸出指令

輸入指令I(lǐng)N、輸出指令OUT:專用于訪問I/O

空間。80X86采用獨立的I/O編址方式,即采用不同的指令分別訪問I/O空間與內(nèi)存空間。

I/O空間的尋址范圍:最大為216=64K字節(jié)端口地址大于FFH(255)時,必須固定使用

DX進行“間接”的訪問。

累加器AX或AL是數(shù)據(jù)輸入/輸出的唯一通路

不影響標(biāo)志位。32輸入指令I(lǐng)N格式:

INAL,8位I/O地址 ;長格式,字節(jié)輸入

INAX,8位I/O地址 ;長格式,字輸入

INAL,DX ;短格式,字節(jié)輸入

INAX,DX ;短格式,字輸入尋址方式:I/O尋址功能:字節(jié)輸入:將I/O地址所指的端口上的8位數(shù)據(jù)復(fù)制到AL中。字輸入:將指令指定的I/O端口上的8位數(shù)據(jù)復(fù)制到AL中;下一個端口地址上的8位數(shù)據(jù)復(fù)制到AH中。33【例】

INAL,0F1HINAX,80HMOVDX,310HINAL,DX34輸出指令OUT格式:

OUT8位I/O地址,AL ;長格式,字節(jié)輸出

OUT8位I/O地址,AX ;長格式,字輸出

OUTDX,AL ;短格式,字節(jié)輸出

OUTDX,AX ;短格式,字輸出尋址方式:I/O尋址功能:字節(jié)輸出:將AL的值復(fù)制到I/O地址所指的端口上。字輸出:將AL的值復(fù)制到指令所指定的I/O端口上,AH的值復(fù)制到下一址的端口上。35【例】

OUT85H,ALMOVDX,0FF4HOUTDX,ALMOVDX,30HOUTDX,AX36地址傳送指令有效地址傳送指令LEA:

LEA16位通用寄存器,存儲器源操作數(shù)的有效地址EA(不是內(nèi)容!!)→目標(biāo)寄存器例:假設(shè)SI=1000H,DS=5000H,(51000H)=1234HLEABX,[SI]→執(zhí)行后:BX=等價于MOVBX,OFFSET[SI]MOVBX,[SI]→執(zhí)行后:BX=

?1234H1000H?37全地址指針傳送指令LDS:從源操作數(shù)制定的內(nèi)存單元中取出4字節(jié)內(nèi)容作為全地址指針,低16位至目標(biāo)寄存器作為偏移量,高16位送至段基址DS。LDS16位通用寄存器,存儲器LDSSI,[450H]→執(zhí)行后:SI=F346HDS=0A90HMemory0AH……46HF3H90H12450H12451H12452H12453H例:設(shè)DS=1200H(12450H)=F346H(12452H)=0A90H38全地址指針傳送指令LES:從源操作數(shù)制定的內(nèi)存單元中取出4字節(jié)內(nèi)容作為全地址指針,低16位至目標(biāo)寄存器作為偏移量,高16位送至段基址ES。

LES16位通用寄存器,存儲器39標(biāo)志傳送指令標(biāo)志裝入指令LAHF(Flags)L→AH標(biāo)志存儲指令SAHFAH→(Flags)L標(biāo)志入棧指令PUSHF

將標(biāo)志寄存器壓入堆棧。標(biāo)志出棧指令POPF

將棧頂字單元的內(nèi)容彈到標(biāo)志寄存器中。全部隱含源、目操作數(shù)唯一可改變TF的指令!d15d11d10d9d8d7d6d4d2d0OFDFIFTFSFZFAFPFCF40數(shù)據(jù)傳送指令小結(jié)源、目操作數(shù)長度必須一致。源、目操作數(shù)不能同時是存儲器操作數(shù)。源、目操作數(shù)不能同時是段寄存器。立即數(shù)和代碼段寄存器CS不能作目操作數(shù)。當(dāng)目操作數(shù)是段寄存器時,源操作數(shù)不能是立即數(shù)??梢允褂枚渭拇嫫鞯闹噶睿篗OV、PUSH、POP。除SAHF、POPF指令外,其它數(shù)傳指令的執(zhí)行不影響標(biāo)志位。對所有指令都適用!413.3.2算術(shù)運算指令加法指令A(yù)DD、ADC、INC、AAA、DAA減法指令SUB、SBB、DEC、AAS、DAS、

CMP、NEG乘法指令MUL、IMUL、AAM除法指令DIV、IDIV、AAD、CBW、CWD小結(jié)42加法指令1、加指令A(yù)DD形式:ADDdst,src

;dst←src+dstdst:R,M;

src:R,M,Im執(zhí)行后影響所有狀態(tài)標(biāo)志SF、ZF、AF、PF、CF、OF2、帶進位的加指令A(yù)DC形式:ADCdst,src;dst←src+dst+CF其余與ADD指令相同最常用的加法用于高字(字節(jié))相加43【例】對兩個8位16進制數(shù)5EH和3CH求和,并分析加法運算指令執(zhí)行后對標(biāo)志位的影響。

用AL和BL存放兩個加數(shù):

MOVAL,5EHMOVBL,3CHADDAL,BL44【例】求兩個4字節(jié)無符號數(shù)0107A379H+10067E4FH的和。

MOVDX,0107HMOVAX,0A379HMOVBX,1006HMOVCX,7E4FHADDAX,CXADCDX,BX453、自加1指令I(lǐng)NC指令形式:INCop;op←op+1Op:R,M;執(zhí)行之后影響標(biāo)志位SF、ZF、AF、PF、OF

,但不影響CF

【例】INCBLINCCXINCBYTE

PTR[BX]INCWORDPTR[BX]

常用于修改地址指針46加法的十進制調(diào)整指令1、非壓縮BCD碼調(diào)整指令A(yù)AA(無操作數(shù))何時使用?對什么進行調(diào)整?如何調(diào)整?影響標(biāo)志位CF、AF兩個非壓縮BCD碼或ASCII碼表示的十進制數(shù)相加時自動調(diào)整AL中的和,非壓縮BCD碼的結(jié)果存在AL中。若AL低4位大于9或有進位,AH+1→AH47如何調(diào)整?若AL低4位>9或半進位標(biāo)志AF=1,則:①AL←AL+6②用與操作將AL高4位清0③AF置1,CF置1,AH←AH+1否則,僅將AL寄存器的高4位清0。【例】若AL=(9)BCD,BL=(5)BCD,求兩數(shù)之和。設(shè)AH=0

ADDAL,BLAAA4800001001┅9+00000101┅5

00001110┅低4位>9+00000110┅加6調(diào)整

00010100┅^00001111┅清高4位00000100┅AL=4CF=1,AF=1,AH=1ADDAL,BL;AAA;結(jié)果為AX=0104H,表示非壓縮十進制數(shù)1449加法的十進制調(diào)整指令2、壓縮BCD碼調(diào)整指令DAA(無操作數(shù))何時使用?對什么進行調(diào)整?影響SF、ZF、AF、CF、PF兩個壓縮BCD碼相加時自動調(diào)整AL中的和,結(jié)果在AL中產(chǎn)生一個壓縮BCD碼的和。若有進位,則CF=150加法的十進制調(diào)整指令如何調(diào)整?若AL低4位>9或半進位標(biāo)志AF=1,則:

AL←AL+6,對低半字節(jié)進行調(diào)整若此時AL中高半字節(jié)結(jié)果>9或CF=1,則:

AL←AL+60H,對高半字節(jié)進行調(diào)整,并使

CF置1,否則CF置0?!纠咳鬉L=(88)BCD,BL=(49)BCD,求兩數(shù)之和。

ADDAL,BLDAA51

10001000

┅88+01001001┅49

11010001┅

AF=1+00000110┅

加6調(diào)整

11010111┅

調(diào)整后高半字節(jié)>

9^01100000┅加60H調(diào)整

00110111┅結(jié)果為AL=(37)BCD,

CF=1ADDAL,BL;DAA;52減法運算指令1、減法指令SUB形式:SUBdst,src;dst←dst-srcdst:R,M;

src:R,M,Im執(zhí)行之后影響所有狀態(tài)標(biāo)志SF、ZF、AF、PF、CF、OF最常用的減法53減法運算指令2、帶借位的減指令SBB形式:SBB

dst,src;dst←dst-src-CFdst:R,M;

src:R,M,Im其余與SUB指令相同!3、自減1指令DEC形式:DECop;op←op-1op:R,M;執(zhí)行之后影響標(biāo)志位SF、ZF、AF、PF、OF

,但不影響CF

用于高字(字節(jié))相減常用于修改地址指針54取相反數(shù)指令NEG形式:NEG操作數(shù)功能:0-操作數(shù)內(nèi)容→操作數(shù)影響所有狀態(tài)標(biāo)志SF、ZF、AF、PF、CF、OF允許的操作數(shù)類型:通用寄存器、存儲器實質(zhì)上,NEG指令執(zhí)行結(jié)果即取原數(shù)的相反數(shù)。55比較指令CMP使用方法與SUB、SBB相同。功能:目操作數(shù)-源操作數(shù),同時影響狀態(tài)標(biāo)志SF、ZF、AF、PF、CF、OF

。CMP通常用于比較兩個數(shù)的大小,而又不破壞原操作數(shù)的場合。其后一般緊跟著條件轉(zhuǎn)移指令以實現(xiàn)不同情況下的分支處理。例:

CMPAL,BL;AL-BL,保持寄存器的值不變

JNZEQUAL;若ZF=0(不等),轉(zhuǎn)EQUAL處

……;

ZF=1(相等)情況下的處理不改變操作數(shù)本身的值!56減法的十進制調(diào)整指令1、非壓縮BCD碼調(diào)整指令A(yù)AS(無操作數(shù))

兩個非壓縮BCD碼相減,結(jié)果在AL中,用AAS指令進行調(diào)整,在AL中得到非壓縮BCD碼結(jié)果。若有借位,AH自動減1。影響CF、AF。如何調(diào)整?若AL低4位>9或半進位標(biāo)志AF=1,則:①AL←AL-6,AF置1②用與操作將AL高4位清0③AH←AH-1,CF置1否則,不需要調(diào)整。57減法的十進制調(diào)整指令2、壓縮BCD碼調(diào)整指令DAS(無操作數(shù))兩個壓縮BCD碼相減,結(jié)果在AL中,用DAS指令進行調(diào)整,在AL中得到壓縮BCD碼結(jié)果。影響SF、ZF、AF、CF、PF

。如何調(diào)整?若AL低4位>9或半進位標(biāo)志AF=1,則:

AL←AL-6,AF置1。若此時AL中高半字節(jié)結(jié)果>9或CF=1,則:

AL←AL-60H,CF置1,58乘法運算指令

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

通用寄存器或存儲器帶符號數(shù)乘法指令:IMUL

通用寄存器或存儲器非壓縮BCD碼乘法調(diào)整:AAM

字節(jié)相乘:字相乘:

影響標(biāo)志CF、OF:相乘后若高位(AH或DX)≠0,則將CF、OF置1,否則清0。表明高位內(nèi)容有效與否。59乘法運算指令如:MULDL;無符號數(shù)乘

IMULCX;有符號數(shù)乘

MULBYTEPTR[SI]IMULWORDPTR[BX]【例】設(shè)AL=55H,BL=14H,計算積。

MULBL

結(jié)果AX=06A4H,CF=1,OF=1

【例】設(shè)AL=-28,BL=59,計算積。

IMULBL

結(jié)果AX=F98CH=-1652,CF=1,OF=1

60除法運算指令無符號數(shù)除法指令:DIV

通用寄存器或存儲器帶符號數(shù)除法指令:IDIV

通用寄存器或存儲器

BCD碼轉(zhuǎn)換成二進制數(shù)指令:AAD字節(jié)除法:AX值÷操作數(shù)內(nèi)容(8位)→

字除法:DX:AX值÷操作數(shù)內(nèi)容(16位)→IDIV之后,余數(shù)與被除數(shù)同號除數(shù)太小致使商超過規(guī)定的長度時,自動轉(zhuǎn)入中斷處理。不影響任何標(biāo)志商→AL余數(shù)→AH商→AX余數(shù)→DX61符號擴展指令主要用在IDIV指令之前。將被除數(shù)的符號位擴展至高位寄存器中,使長度擴展一倍。AL擴展為AX——CBWAX擴展為DX:AX——CWD不影響任何標(biāo)志位62【例】編程求-38/3的商和余數(shù)。

MOVAL,11011010B;被除數(shù)-38=-26HMOVCH,00000011B;除數(shù)3CBW;將AL符號擴展到AH;AX=1111111111011010BIDIVCH;AX/CH;AL=11110100B=-12(商);AH=11111110=-2(余數(shù))

63算術(shù)運算指令小結(jié)加、減法的運算結(jié)果與兩個操作數(shù)的長度相等,進、借位反映在標(biāo)志位上。乘、除法運算僅由指令指定一個操作數(shù),另一個操作數(shù)固定為累加器。除了除法和符號擴展指令外,其它算術(shù)運算指令均影響狀態(tài)標(biāo)志,不同指令對標(biāo)志位的影響也各不相同。允許使用BCD碼進行算術(shù)運算。為了得到正確的BCD碼運算結(jié)果,應(yīng)使用相應(yīng)的十進制調(diào)整指令。所有的十進制調(diào)整均對累加器進行。加、減、乘法的調(diào)整在運算之后進行,只有除法必須先調(diào)整,后運算。643.3.3邏輯運算及移位指令邏輯運算指令NOT

、AND、TEST、OR、XOR算術(shù)移位指令SAL、SAR邏輯移位指令SHL、SHR不帶進位的循環(huán)移位指令ROL、ROR帶進位的循環(huán)移位指令RCL、RCR小結(jié)65邏輯非指令NOT格式:

NOT通用寄存器或存儲器功能:將操作數(shù)內(nèi)容按位取反,結(jié)果送回原處。不影響任何標(biāo)志舉例:NOTAXNOTBL NOTBYTEPTR[BX]

66邏輯運算指令邏輯與指令

AND目操作數(shù),源操作數(shù)目操作數(shù)的內(nèi)容∧源操作數(shù)的內(nèi)容→目操作數(shù)邏輯或指令:OR目操作數(shù),源操作數(shù)目操作數(shù)的內(nèi)容∨源操作數(shù)的內(nèi)容→目操作數(shù)邏輯異或指令:XOR目操作數(shù),源操作數(shù)目操作數(shù)的內(nèi)容⊕源操作數(shù)的內(nèi)容→目操作數(shù)允許的操作數(shù)類型組合:Dst:R、M;Src:R、M、Im將CF、OF標(biāo)志清0;影響SF、ZF、PF標(biāo)志。測試指令TEST:與AND指令的區(qū)別僅在于TEST不改變目操作數(shù)。其后常緊跟條件轉(zhuǎn)移指令以實現(xiàn)判斷分支。67邏輯運算指令的應(yīng)用1、AND指令通常用于將操作數(shù)的某些位清0。如:ANDAL,0FCH;AL的低2位清0,其余保持不變2、TEST指令常用于“取出”操作數(shù)的某一位來進行判斷。如:TESTAL,20H;取AL的D5位

JZBCLR;ZF=1(該位為0)就到BCLR處3、OR指令通常用于將操作數(shù)的某些位置1。如:ORAL,80H;AL的D7位置1,其余位保持不變4、XOR指令通常用于將操作數(shù)的某些位取反。如:XORAL,0FH;AL的低4位取反,高4位保持不變68移位指令算術(shù)左移指令SAL算術(shù)右移指令SAR邏輯左移指令SHL邏輯右移指令SHR注:SAL,SHL效果相同CF0MSBLSBCF0MSBLSBCFMSBLSBCFMSBLSB069格式:

SAL/SAR/SHL/SHR操作數(shù),1 ;移1位

SAL/SAR/SHL/SHR操作數(shù),CL ;移位(CL)次

移位之后改變操作數(shù)內(nèi)容,但CL的值不變允許的操作數(shù)類型:通用寄存器、存儲器對標(biāo)志位的影響:移出位→CF;僅當(dāng)移1位時,影響OF,表明最高位的值有否改編;按照移位后的結(jié)果置/復(fù)位SF、ZF、PF。應(yīng)用舉例:用移位指令實現(xiàn)乘除法算術(shù)運算。70用移位指令實現(xiàn)乘、除法

SALAX,1 ;實現(xiàn)AX×2 MOVBX,AX SALAX,1 ;實現(xiàn)AX×4 ADDAX,BX ;實現(xiàn)AX×6

MOVBL,AL MOVCL,3 SHRAL,CL ;實現(xiàn)AL÷8 SUBBL,AL ;實現(xiàn)AL×7/871循環(huán)移位指令不帶進位的循環(huán)左移指令ROL不帶進位的循環(huán)右移指令ROR帶進位的循環(huán)左移指令RCL帶進位的循環(huán)右移指令RCRCFMSBLSBCFMSBLSBCFMSBLSBCFMSBLSB72格式:

ROL/ROR/RCL/RCR操作數(shù),1 ;移1位

ROL/ROR/RCL/RCR操作數(shù),CL ;移位(CL)次

移位之后改變操作數(shù)內(nèi)容,但CL的值不變。允許的操作數(shù)類型:通用寄存器、存儲器

如:ROLBX,CLRORWORDPTR[SI],1對標(biāo)志位的影響:移出位→CF;僅當(dāng)移1位時影響OF。移出的位不會丟失73邏輯運算及移位指令小結(jié)AND、TEST、OR、XOR指令對標(biāo)志位的影響:固定使CF=OF=0;根據(jù)運算結(jié)果改變SF、ZF、PF。NOT指令形式上只有一個操作數(shù);不影響任何標(biāo)志位。SAL、SAR、SHL、SHR指令的使用方法相同,對標(biāo)志位的影響也相同:移出位給CF;根據(jù)結(jié)果改變SF、ZF、PF;當(dāng)移位次數(shù)為1時,影響OF。ROL、ROR、RCL、RCR的使用方法相同,對標(biāo)志位的影響相同:移出位給CF;當(dāng)移位次數(shù)為1時,影響OF。使用SHR或SAR每移1位,可視為分別將無符號數(shù)和帶符號數(shù)除以2;使用SHL/SAL每移1位,可視為將數(shù)值乘以2。743.3.4串操作指令串傳送指令MOVS、MOVSB、MOVSW串比較指令CMPS、CMPSB、CPMSW串檢索指令SCAS、SCASB、SCASW串裝入指令LODS、LODSB、LODSW串存儲指令STOS、STOSB、STOSW串操作指令重復(fù)前綴REP、REPZ/REPE、REPNZ/REPNE小結(jié)75串操作的基本概念什么是串?

地址連續(xù)的字節(jié)或字存儲單元,通常用于存放同一類數(shù)據(jù)。數(shù)據(jù)源:源串;數(shù)據(jù)結(jié)果:目的串。串操作指令對串元素實現(xiàn)傳送、比較、檢索、裝入、存儲等操作,并自動修改地址指針。串操作重復(fù)前綴加在串操作指令之前,根據(jù)不同條件判斷是否重復(fù)執(zhí)行串操作??梢詫崿F(xiàn)對整個串的同一種操作。76串操作指令的特點DS:SI——默認(rèn)的源串指針,可段超越;

ES:DI——固定的目標(biāo)串指針,不允許段超越。自動修改串指針:方向標(biāo)志DF決定指針的修改方向——DF=0,指針加;DF=1,指針減。串元素的類型決定修改量—字節(jié)串,指針加/減1;字串,指針加/減2。加有重復(fù)前綴時,固定使用CX計錄并修改重復(fù)次數(shù),再根據(jù)CX值及標(biāo)志位ZF判斷是否重復(fù)進行串操作。前綴本身不影響任何標(biāo)志位。77串傳送指令格式:

MOVS目標(biāo)串首址標(biāo)號,源串首址標(biāo)號

MOVSBMOVSW功能:將源串中DS:SI所指的串元素復(fù)制到目標(biāo)串中ES:DI所指的單元處;然后自動修改SI、DI。MOVSB、MOVSW分別是字節(jié)串和字串的傳送指令,隱含了操作數(shù)。78重復(fù)前綴REP格式:

REP串操作指令功能:

串操作指令執(zhí)行之后,先修改CX(CX-1→CX),再判斷串是否處理完(CX是否為0):不是0,繼續(xù)執(zhí)行該串操作指令;否則順序執(zhí)行下一條指令。應(yīng)用舉例79串傳送舉例程序?qū)崿F(xiàn)‘H’‘E’‘L’‘L’‘O’‘!’源串目標(biāo)串SRC_MESSNEW_LOC80串傳送指令及重復(fù)前綴應(yīng)用例DATASEGMENTSRC_MESSDB‘HELLO!’DATAENDSEXTRASEGMENTNEW_LOCDB6DUP(?)EXTRAENDSCODESEGMENTASSUMECS:CODE,DS:DATA,ES:EXTRASTART:MOVAX,DATAMOVDS,AXMOVAX,EXTRAMOVES,AXLEASI,SRC_MESSLEADI,NEW_LOCMOVCX,6CLD

REPMOVSBCODEENDSENDSTART 81串比較指令格式:

CMPS目標(biāo)串首址標(biāo)號,源串首址標(biāo)號

CMPSBCMPSW功能:用源串中DS:SI所指的串元素值減去目標(biāo)串中ES:DI所指的串元素值,結(jié)果反映在標(biāo)志位上;自動修改SI、DI。CMPSB、CMPSW分別是字節(jié)串和字串的比較指令,隱含了操作數(shù)。82重復(fù)前綴REPZ/REPE格式:

REPZ/REPE串操作指令功能:

串操作指令執(zhí)行之后修改CX(CX-1→CX),判斷是否滿足串未完(CX≠0)、且結(jié)果相等(ZF=1):滿足則繼續(xù)執(zhí)行該串操作指令;否則順序執(zhí)行下一條指令。應(yīng)用舉例83串比較指令及重復(fù)前綴舉例比較兩個字符串是否相等:

MOVCX,20 ;源串、目標(biāo)串的字符個數(shù)

LEASI,STR1;STR1:源串的首址標(biāo)號

LEADI,STR2 ;STR2:目標(biāo)串的首址標(biāo)號

CLD ;DF=0,串指針自動增量

REPECMPSB;比較對應(yīng)元素是否相同。是:繼續(xù)比,否:執(zhí)行下條指令

JNZDIFF ;因?qū)?yīng)元素不同而退出比較SAME:…… ;因串結(jié)束(CX=0)而退出比較84串檢索指令格式:

SCAS目標(biāo)串首址標(biāo)號

SCASBSCASW功能:用AL(字節(jié)串)或AX(字串)的值減去目標(biāo)串中ES:DI所指的串元素值,結(jié)果反映在標(biāo)志位上;然后自動修改DI。SCASB、SCASW分別是字節(jié)串和字串的檢索指令,隱含了操作數(shù)。實際上是源串固定為累加器的串比較指令85重復(fù)前綴REPNZ/REPNE格式:

REPNZ/REPNE串操作指令功能:串操作指令執(zhí)行之后修改CX(CX-1→CX),判斷是否滿足串未完(CX≠0)、且結(jié)果不等(ZF=0):滿足則繼續(xù)執(zhí)行該串操作指令;否則順序執(zhí)行下一條指令。應(yīng)用舉例86串檢索指令及重復(fù)前綴舉例在一個字符串中檢索有無關(guān)鍵字符“$”:

MOVCX,30 ;目標(biāo)串的字符個數(shù)

LEADI,STR2 ;STR2:目標(biāo)串的首址標(biāo)號

MOVAL,‘$’ ;關(guān)鍵字符在AL中

CLD ;DF=0,串指針自動增量

REPNESCASB;比較AL與串元素,不同:繼續(xù)比,相同:執(zhí)行下條指令

JZ FND ;找到關(guān)鍵字符NOFD:…… ;因串檢索結(jié)束而退出,未找到87串裝入指令格式:

LODS源串首址標(biāo)號

LODSBLODSW功能:將源串中DS:SI所指的串元素復(fù)制到AL(字節(jié)串)或AX(字串)中;然后自動修改SI。LODSB、LODSW分別是字節(jié)串和字串的裝入指令,隱含了操作數(shù)。一般不使用重復(fù)前綴實際上是目標(biāo)串固定為累加器的串傳送指令88串存儲指令格式:

STOS目標(biāo)串首址標(biāo)號

STOSBSTOSW功能:將AL(字節(jié)串)或AX(字串)的值復(fù)制到目標(biāo)串中ES:DI所指的單元處;然后自動修改DI。STOSB、STOSW分別是字節(jié)串和字串的存儲指令,隱含了操作數(shù)。應(yīng)用舉例實際上是源串固定為累加器的串傳送指令89串裝入/串存儲指令舉例

將大寫字母組成的源串元素全部轉(zhuǎn)換成小寫字母,并存入目標(biāo)串中:

MOVCX,5 ;串元素的個數(shù)

LEASI,STR1 ;SI指向源串(數(shù)據(jù)段中)

LEADI,STR2 ;DI指向目標(biāo)串(附加段中)

CLD ;DF=0,串指針自動增量AGN: LODSB ;源串元素裝入累加器

ADD AL,20H ;大寫字母→小寫字母

STOSB ;存入目標(biāo)串中

LOOPAGN ;循環(huán)控制

……903.3.5控制轉(zhuǎn)移指令無條件轉(zhuǎn)移指令JMP過程調(diào)用及返回指令CALL、RET條件轉(zhuǎn)移指令:JC/JB/JNAE、JNC/JNB/JAE、JS、JNS、JZ/JE、 JNZ/JNE、JO、JNO、JP/JPE、JNP/JPO、JA/JNBE、JAE/JNB、JB/JNAE、JBE/JNA、JG/JNLE、JGE/JNL、JL/JNGE、JLE/JNG循環(huán)控制指令

LOOP、LOOPZ/LOOPE、LOOPNZ/LOOPNE、JCXZ中斷及中斷返回指令I(lǐng)NT、INTO、IRET小結(jié)控制程序流向:改變正常執(zhí)行順序,轉(zhuǎn)向新目標(biāo)91控制轉(zhuǎn)移指令概述所有控制轉(zhuǎn)移指令都只有一個操作數(shù),通過該操作數(shù)給出目標(biāo)地址——新的IP(或CS:IP)值。該類指令對IP(或CS:IP)進行強制性修改,并執(zhí)行其他相關(guān)操作。不影響任何標(biāo)志位的值。跳變或轉(zhuǎn)移的目標(biāo)地址距離當(dāng)前的正常指針的地址偏移量稱為“相對偏移量”:相對偏移量=目標(biāo)地址-當(dāng)前正常順序的IP值相對偏移量是一個符號數(shù),正值表示向后跳轉(zhuǎn),負(fù)值表示向前跳轉(zhuǎn)。92控制轉(zhuǎn)移指令可實現(xiàn)三種范圍的跳轉(zhuǎn):近轉(zhuǎn)移(near):段內(nèi)轉(zhuǎn)移,相對偏移量為1個字,取值范圍-32768~+32767;短轉(zhuǎn)移(short):段內(nèi)轉(zhuǎn)移,相對偏移量為1字節(jié),取值范圍-128~+127;遠(yuǎn)轉(zhuǎn)移(far):段間轉(zhuǎn)移,目標(biāo)地址與正常順序的IP值不在同一個代碼段內(nèi)。近轉(zhuǎn)移、短轉(zhuǎn)移采用特殊的“相對尋址方式”來獲得轉(zhuǎn)移的目標(biāo)地址。93相對尋址方式

僅用于進行段內(nèi)直接轉(zhuǎn)移的控制轉(zhuǎn)移指令。指令操作數(shù)是8位或16位帶符號相對偏移量,代表目標(biāo)地址與當(dāng)前正常順序的地址之差:

目標(biāo)地址=當(dāng)前正常順序的IP值+相對偏移量編程時一般使用目標(biāo)地址的標(biāo)號作為操作數(shù),不需要計算相對偏移量。

例:JNZDIFFRT941無條件轉(zhuǎn)移指令JMP格式:JMP操作數(shù)(目標(biāo)地址)操作數(shù)(目標(biāo)地址)的給出方式段內(nèi)直接給出:例如

JMP標(biāo)號

段內(nèi)間接給出:例如JMPAX/JMPWORDPTR5[BX]

段間直接給出:例如JMPFARPTR標(biāo)號

段間間接給出:例如JMPDWORDPTR[DI+1200H]功能:按照不同的操作數(shù)給出方式,找出目標(biāo)地址,用它代替原指令指針??蓪崿F(xiàn)全部存儲空間內(nèi)的轉(zhuǎn)移?!鄬ぶ?5示例設(shè)CS=2400H,IP=0100H,DS=2000H,BX=100H,標(biāo)號JNEAR的地址是2400:0450H,標(biāo)號JFAR的地址是3200:11A0H,

那么有:JMPJNEAR;JMPBXJMPWORDPTR5[BX]JMPFARJFARJMPDWORDPTR[BX]程序分別轉(zhuǎn)向何處運行?962過程調(diào)用及返回

過程(Procedure)常稱子程序,是指能夠完成某種獨立功能的程序模塊。主程序的調(diào)用實質(zhì)上是一種強制改變正常指令指針順序的過程,調(diào)用之前的正常IP值稱為“斷點”。CALLRET97過程調(diào)用指令CALL格式:CALL操作數(shù)(即目標(biāo)地址)操作數(shù)(目標(biāo)地址)的給出方式段內(nèi)直接給出,如:CALLNEARPTRSUBP段內(nèi)間接給出,如:CALLAXCALLWORDPTR[BX+SI]段間直接給出,如:CALLFARPTRSUBP段間間接給出,如:CALLDWORDPTR[DI]98CALL指令執(zhí)行的操作可實現(xiàn)的轉(zhuǎn)移執(zhí)行過程段內(nèi)直接/間接給出近轉(zhuǎn)移——目標(biāo)地址與控制轉(zhuǎn)移指令位于同一代碼段內(nèi)

SP減2,斷點(原IP值)入棧用目標(biāo)地址(16位操作數(shù)的值)代替原IP值段間直接/間接給出遠(yuǎn)轉(zhuǎn)移——目標(biāo)地址與控制轉(zhuǎn)移指令位于不同代碼段中

SP減2,原CS值入棧

SP再減2,原IP值入棧用目標(biāo)地址(32位操作數(shù)的值)代替原CS:IP值與JMP的不同之處:有對應(yīng)的返回指令;必須保存斷點,執(zhí)行過程與堆棧有關(guān)。99過程返回指令RET格式:

RETRET16位立即數(shù)位于被調(diào)過程的末尾;必須與CALL指令成對使用!根據(jù)對應(yīng)的CALL指令轉(zhuǎn)移類型,自動確定段內(nèi)/段間返回。功能:從棧頂彈出1個字(段內(nèi)返回)或2個字(段間返回),作為返回地址(即斷點)給IP或CS:IP;SP相應(yīng)加2或加4。指令后跟16位立即數(shù),用以在恢復(fù)斷點后,在現(xiàn)行SP值上再加此數(shù),以釋放相應(yīng)數(shù)目的堆棧空間。必須是偶數(shù),為什么?100示例設(shè)CS=2400H,IP=1010H,DS=2000H,BX=100H,SS=3000H,SP=0100H,標(biāo)號SUBN的地址是1200H,標(biāo)號SUBF的地址是3200:11A0H,

那么有:CALLSUBN;CALLBXCALLWORDPTR5[BX]CALLFARSUBFCALLDWORDPTR[BX]程序分別轉(zhuǎn)向何處運行?堆棧如何變化?1013條件轉(zhuǎn)移指令格式:指令助記符目標(biāo)地址(短標(biāo)號)功能:根據(jù)當(dāng)前各標(biāo)志位狀態(tài)進行判斷,如果滿足指令所指定的條件,則轉(zhuǎn)移至目標(biāo)地址處;否則順序執(zhí)行。尋址方式:相對尋址轉(zhuǎn)移范圍:短轉(zhuǎn)移,即相對位移量是一個8位的帶符號數(shù)(-128~+127)。本身并不影響任何標(biāo)志位102根據(jù)單個標(biāo)志進行判斷轉(zhuǎn)移的指令JS JZ/JEJP/JPEJCJOJNSJNZ/JNEJNP/JPOJNCJNO標(biāo)志位=1則轉(zhuǎn)移:標(biāo)志位=0則轉(zhuǎn)移:103判斷無符號數(shù)大小的指令JA/JNBE;目操作數(shù)>源操作數(shù)則轉(zhuǎn)移JAE/JNB;目操作數(shù)≥源操作數(shù)則轉(zhuǎn)移JB/JNAE;目操作數(shù)<源操作數(shù)則轉(zhuǎn)移JBE/JNA;目操作數(shù)≤源操作數(shù)則轉(zhuǎn)移

通常用在CMP指令之后;由指令自動選擇不同標(biāo)志位,進行不同條件的判斷。104判斷帶符號數(shù)大小的指令JG/JNLE;目操作數(shù)>源操作數(shù)則轉(zhuǎn)移JGE/JNL;目操作數(shù)≥源操作數(shù)則轉(zhuǎn)移JL/JNGE;目操作數(shù)<源操作數(shù)則轉(zhuǎn)移JLE/JNG;目操作數(shù)≤源操作數(shù)則轉(zhuǎn)移通常用在CMP指令之后;由指令自動選擇不同的標(biāo)志位和判斷條件。與無符號數(shù)不同!1054.循環(huán)控制指令格式:

LOOP短標(biāo)號

LOOPZ/LOOPE短標(biāo)號

LOOPNZ/LOOPNE短標(biāo)號

JCXZ短標(biāo)號尋址方式:相對尋址,只能實現(xiàn)短轉(zhuǎn)移。功能:根據(jù)CX的值和ZF標(biāo)志判斷是否轉(zhuǎn)移。指令本身不影響ZF106LOOP指令:CX-1→CXCX≠0?是:轉(zhuǎn)移否:順序執(zhí)行LOOPZ指令:CX-1→CXCX≠0且ZF=1?是:轉(zhuǎn)移否:順序執(zhí)行LOOPNZ指令:CX-1→CXCX≠0且ZF=0?是:轉(zhuǎn)移否:順序執(zhí)行JCXZ指令:CX=0?是:轉(zhuǎn)移否:順序執(zhí)行107循環(huán)控制轉(zhuǎn)移指令的使用

MOVCX,10

(其它初始條件)NXT:(循環(huán)執(zhí)行的指令)

LOOPNXT

(退出循環(huán)后的處理)

MOVCX,10

(其它初始條件)NXT:DECCX

JCXZ

LAST

(循環(huán)執(zhí)行的指令)

JMPNXTLAST:(退出

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論