微型計(jì)算機(jī)原理及應(yīng)用61631課件_第1頁
微型計(jì)算機(jī)原理及應(yīng)用61631課件_第2頁
微型計(jì)算機(jī)原理及應(yīng)用61631課件_第3頁
微型計(jì)算機(jī)原理及應(yīng)用61631課件_第4頁
微型計(jì)算機(jī)原理及應(yīng)用61631課件_第5頁
已閱讀5頁,還剩136頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第3章:尋址方式與指令系統(tǒng)3.1數(shù)據(jù)類型及其存儲(chǔ)規(guī)則3.2計(jì)算機(jī)指令格式3.38086CPU的尋址方式3.48086指令系統(tǒng)3.580X86的尋址方式及新增的指令第三章:尋址方式與指令系統(tǒng)3.1數(shù)據(jù)類型及其存儲(chǔ)規(guī)則

3.1.1基本數(shù)據(jù)類型及存儲(chǔ)

一個(gè)存儲(chǔ)單元——一個(gè)字節(jié)占用內(nèi)存的一個(gè)地址。

基本數(shù)據(jù)類型:字、雙字、四字、雙四字

字——兩個(gè)相鄰字節(jié)組成的16位二進(jìn)制;

雙字——4個(gè)相鄰字節(jié)組成的32位二進(jìn)制數(shù);

四字——8個(gè)相鄰字節(jié)組成的64位二進(jìn)制數(shù);

雙四字——16個(gè)相鄰字節(jié)組成的128位二進(jìn)制數(shù)。9CH48H2BH6AH7AH1AHC3H23H72H92H8BH3AHABHA2H12H45H…NN+1N+2N+3N+4N+5N+6N+7N+8N+9N+10N+11N+12N+13N+14N+15單元地址圖3.2基本數(shù)據(jù)類型存儲(chǔ)規(guī)律

地址為N的字節(jié)數(shù)據(jù):

9CH字?jǐn)?shù)據(jù):489CH雙字?jǐn)?shù)據(jù):6A2B489CH四字?jǐn)?shù)據(jù):…雙四字?jǐn)?shù)據(jù):…

3.2計(jì)算機(jī)指令格式指令包括兩部分:指令操作碼部分和地址碼部分。指令操作碼部分是給出該指令應(yīng)完成何種操作。地址碼部分是用來描述該指令的操作對(duì)象。指令格式可分為:零地址指令、一地址指令、二地址指令和三地址指令。零地址指令:只有操作碼部分,而沒有操作數(shù)的指令;一地址指令:只有目的操作數(shù)的單操作數(shù)指令;二地址指令:有兩個(gè)地址指出兩個(gè)操作數(shù)的地址;三地址指令MOV

AX,[BX]操作碼的助記符目的操作數(shù)源操作數(shù)3.2.1指令的助記符格式助記符格式可用以下通式表示:[名字]操作碼項(xiàng)[操作數(shù)項(xiàng)][;注釋]其中:名字是一個(gè)符號(hào),表示本條語句的符號(hào)地址。操作碼項(xiàng)指出該語句的基本操作功能。操作數(shù)項(xiàng)是操作碼的操作對(duì)象,有兩個(gè)或兩個(gè)以上的操作數(shù),各操作數(shù)之間用逗號(hào)隔開。注釋字段是以“;”開頭的說明部分,注釋字段是語句的非執(zhí)行部分。

例如:3.2.280x86指令編碼格式指令編碼格式包含操作碼和操作數(shù)兩部分。操作碼表示計(jì)算機(jī)執(zhí)行什么操作。操作數(shù)指明參與操作的數(shù)的本身,或規(guī)定了操作數(shù)的地址。

圖3.58086CPU指令編碼的一般形式1)操作碼字節(jié)它是指令的第一字節(jié),規(guī)定指令的操作類型,是指令的必選字節(jié),字節(jié)內(nèi)容如下:

D7D6D5D4D3D2D1D0

操作碼字節(jié)尋址方式字節(jié)偏移量字節(jié)(1/2)立即數(shù)字節(jié)(1/2)OPDW表3-1mod與r/m域所組合的尋址方式

MODR/M存儲(chǔ)器尋址寄存器尋址邏輯地址的計(jì)算公式W=0W=1MOD=00B

MOD=01BMOD=10BMOD=11B000001010011100101110111DS:[BX+SI]DS:[BX+DI]SS:[BP+SI]SS:[BP+DI]DS:[SI]DS:[DI]DS:[disp16]Ds:[BX]DS:[BX+SI+disp8]DS:[BX+DI+disp8]SS:[BP+SI+disp8]SS:[BP+DI+disp8]DS:[SI+disp8]DS:[DI+disp8]DS:[disp16+disp8]Ds:[BX+disp8]DS:[BX+SI+disp16]DS:[BX+DI+disp16]SS:[BP+SI+disp16]SS:[BP+DI+disp16]DS:[SI+disp16]DS:[DI+disp16]DS:[disp16+disp16]Ds:[BX+disp16]ALCLDLBLAHCHDHBHAXCXDXBXSPBPSIDI3.38086CPU的尋址方式尋址方式——尋找指令或操作數(shù)存放地址的方法。兩種尋址方式:一種是用來對(duì)操作數(shù)進(jìn)行尋址;另一種是用來對(duì)轉(zhuǎn)移地址或調(diào)用地址進(jìn)行尋址,即對(duì)指令地址進(jìn)行尋址。內(nèi)容回顧通用寄存器AX

累加器(Accumulator)--AX常用作累加器BX

基址寄存器(BaseRegister)--BX用作基址寄存器CX

計(jì)數(shù)寄存器(CounterRegister)--CX用作計(jì)數(shù)寄存器DX

數(shù)據(jù)寄存器(DataRegister)--DX用作數(shù)據(jù)寄存器8個(gè)8位寄存器:AH、AL、BH、BL、CH、CL、DH、DL16位寄存器主要用于存放數(shù)據(jù),也可用來存放地址。8位寄存器只能用于存放數(shù)據(jù)。

段寄存器CS(CodeSegment)代碼段寄存器

存放當(dāng)前程序代碼段的段地址(段基址),控制程序區(qū)。DS(DataSegment)數(shù)據(jù)段寄存器

存放當(dāng)前數(shù)據(jù)段的段地址,控制數(shù)據(jù)區(qū)。SS(StackSegment)堆棧段寄存器

存放當(dāng)前堆棧段的段地址,控制堆棧區(qū)。ES(ExtraSegment)附加段寄存器

存放當(dāng)前附加段的段地址,控制數(shù)據(jù)區(qū)。標(biāo)志寄存器和指令指針I(yè)P

指令指針16位寄存器,用來存放程序?qū)⒁獔?zhí)行的下一條指令的地址偏移值,和CS一起形成了下一條指令的物理地址(CS:IP),類似于8位CPU中中的PC。FLAGS

標(biāo)志寄存器(程序狀態(tài)字寄存器PSW)

16位寄存器,用來存放8086CPU在工作過程中的運(yùn)算結(jié)果中的狀態(tài)標(biāo)志位和微處理器操作的控制標(biāo)志。圖3-6立即數(shù)尋址過程代碼段1234┇MOVAX,3412H的指令代碼34AXAH

AL操作碼123.3.1操作數(shù)的尋址方式1、立即尋址特點(diǎn):指令中含有立即數(shù),執(zhí)行速度快,立即數(shù)只能是整數(shù),且只能作為源操作數(shù)。舉例:MOVAX,3412H3、存儲(chǔ)器尋址指令給出了操作數(shù)在數(shù)據(jù)區(qū)中的地址信息,據(jù)此確定存放操作數(shù)的有效地址EA。有效地址EA:可由指令直接給出;可由指令指定的寄存器間接給出;可由指令指定的寄存器和一個(gè)偏移量間接給出;可由指令指定的兩個(gè)寄存器之和間接給出;可由指令指定的兩個(gè)寄存器和一個(gè)偏移量之和間接給出;五種不同的存儲(chǔ)器尋址方式:1)直接尋址方式2)寄存器間接尋址3)寄存器相對(duì)尋址4)基址加變址尋址方式5)相對(duì)的基址和變址尋址方式代碼段操作碼34數(shù)據(jù)段┇2000DS20000+783427834

34

12AXMOVAX,[7834H]指令代碼┇78┇┇1234圖3-7直接尋址方式尋址過程(1)直接尋址方式指令直接給出操作數(shù)的有效地址存放位置。例如:MOVAX,[7834H]該指令將有效地址EA=7834H單元中的內(nèi)容傳送到AX寄存器中。若(DS)=2000H,則該指令源操作數(shù)的存儲(chǔ)單元的物理地址為20000H+7834H=27834H。(2)寄存器間接尋址指令中的寄存器給出操作數(shù)存放位置的有效地址。注意兩點(diǎn):一是寄存器中的內(nèi)容是操作數(shù)的有效地址,而不是操作數(shù)本身;二是只能用CPU中的基址寄存器BX、BP或變址寄存器DI、SI來間接尋址。如果指令前面沒有用前綴指令指明操作數(shù)在哪一段,則通常默認(rèn)段寄存器為BP:SS,BX,DI,SI:DS。即:物理地址=[DS]×10H+EA=[DS]×10H+或物理地址=[SS]×10H+[BP](3)寄存器相對(duì)尋址指令中的寄存器和偏移量給出操作數(shù)存放位置的有效地址。物理地址=[DS]×10H+EA=[DS]×10H+或物理地址=[SS]×10H+[BP]例如:

MOVBX,[DI+10H]該指令將DI中的內(nèi)容加上偏移量10H后作為有效地址,對(duì)該有效地址進(jìn)行字的讀操作,送入BX中。

代碼段操作碼24數(shù)據(jù)段267868┇1

2

3

4DS2

7

3

2BX12340

27321B2967826AXMOV

AX,[BX+6824H]指令代碼┇+6824┇圖3-9寄存器相對(duì)尋址操作過程基址尋址——用BX、BP為基址寄存器進(jìn)行尋址變址尋址——用SI、DI為變址寄存器進(jìn)行尋址(4)基址加變址尋址方式指令中的兩個(gè)寄存器給出操作數(shù)存放位置的有效地址。物理地址=[DS]×10H+EA=[DS]×10H+或物理地址=[SS]×10H+例如:ADDAX,[BX+SI]

該指令將BX中的內(nèi)容加上SI中的內(nèi)容作為有效地址,對(duì)該有效地址進(jìn)行字的讀操作,讀取結(jié)果與AX中內(nèi)容相加,結(jié)果送到AX中。(5)相對(duì)的基址和變址尋址方式指令中的兩個(gè)寄存器和一個(gè)偏移量給出操作數(shù)存放位置的有效地址。物理地址=[DS]×10H+EA=[DS]×10H+或物理地址=[SS]×10H+例如:MOVAH,[BX+SI+2468H]該指令將BX中的內(nèi)容加上SI中的內(nèi)容加上偏移量2468H后作為有效地址,對(duì)該有效地址進(jìn)行字節(jié)的讀操作,讀取結(jié)果送到AH中。MOVAH,[BX+SI+2468H]指令代碼

0110

010020000代碼段操作碼68數(shù)據(jù)段2623┇2

0

0

0DS0

11

0SI2267826AH┇0

1

0

0BX+246824┇圖3-11相對(duì)的基址和變址尋址方式操作過程過程題目1:已知當(dāng)前BX=1200H,CS=1800H,IP=0500H,DS=3000H,則執(zhí)行指令MOV[BX+2000H],12ABH后,12ABH放在哪兩個(gè)存儲(chǔ)單元(物理地址)?答案:12ABH放在33200H和33201H存儲(chǔ)單元中。其中12H放在33201H單元中,而0ABH放在33200單元中。(l)直接端口尋址方式端口地址的尋址范圍是0-0FFH,端口地址直接由指令給出。舉例:INAL,27H表示從I/O地址號(hào)為27H的端口讀取數(shù)據(jù)送到AL中。注意:端口地址的尋址范圍。27H不是立即數(shù)也不是直接地址,是端口地址,不需要加方括號(hào)。(2)間接端口尋址方式端口地址的尋址范圍是0-0FFFFH,端口地址由DX寄存器給出。舉例:OUTDX,AL表示將AL中的內(nèi)容輸出到地址由DX寄存器內(nèi)容所指定的端口中。注意:使用專用寄存器DX,不能使用其他寄存器。操作數(shù)在指令中的表示形式,DX不是寄存器直接尋址,是寄存器間接尋址,但不需要加方括號(hào)。

+2101

0121

12340代碼段操作碼操作碼0121┇┇1

2

3

4CS14562段內(nèi)直接轉(zhuǎn)移指令代碼┇0

1

2

1IP目標(biāo)指令代碼圖3-12段內(nèi)直接尋址方式過程3.3.2指令地址的尋址方式指令地址的尋址方式以下4種:(1)段內(nèi)直接尋址方式轉(zhuǎn)移的指令地址是由當(dāng)前的IP內(nèi)容和指令中規(guī)定的8位或16位偏移量之和給出。代碼段操作碼操作碼數(shù)據(jù)尋址方式┇┇CS段內(nèi)間接轉(zhuǎn)移指令代碼┇根據(jù)數(shù)據(jù)尋址方式計(jì)算EAIP目標(biāo)指令代碼Σ圖3-13段內(nèi)間接尋址方式過程(2)段內(nèi)間接尋址方式轉(zhuǎn)移的指令地址是由用寄存器或一個(gè)字存儲(chǔ)單元的內(nèi)容給出。指令執(zhí)行時(shí)用寄存器或存儲(chǔ)單元的內(nèi)容更新IP。

3412+78560代碼段操作碼操作碼1234┇┇7856CS7B972段間直接轉(zhuǎn)移代碼┇3412IP目標(biāo)指令代碼5678圖3-14段間直接尋址過程(3)段間直接尋址方式轉(zhuǎn)移的指令地址是由指令碼字節(jié)直接給出。指令碼中的16位段地址和16位地址分別更新CS和IP。圖3-15段間間接尋址方式過程代碼段操作碼操作碼數(shù)據(jù)尋址方式┇┇段間間接轉(zhuǎn)移指令代碼┇目標(biāo)指令代碼DSCSIPΣΣ數(shù)據(jù)段┇12345678┇根據(jù)數(shù)據(jù)尋址方式計(jì)算EA(4)段間間接尋址方式轉(zhuǎn)移的指令地址由一個(gè)雙字存儲(chǔ)單元的內(nèi)容給出。指令地址存放在存儲(chǔ)單元中,低位字地址單元中存放的是偏移地址,高位字地址單元中存放的是轉(zhuǎn)移段地址,分別用于更新IP和CS。3.48086指令系統(tǒng)指令系統(tǒng)按功能可分為6類:①數(shù)據(jù)傳送類指令;②算術(shù)運(yùn)算類指令;③邏輯運(yùn)算與移位類指令;④字符串指令;⑤控制轉(zhuǎn)移類指令;⑥處理器控制類指令。3.4.1數(shù)據(jù)傳送類指令分為4種:①通用數(shù)據(jù)傳送指令②累加器專用傳送指令③地址傳送指令④標(biāo)志傳送指令。通用數(shù)據(jù)傳送指令有以下五條MOV

把源操作數(shù)傳送到目的操作數(shù)PUSH指針上移,源操作數(shù)進(jìn)棧POP

出棧到目的操作數(shù),指針下移XCHG交換源,目的操作數(shù)XLAT代碼轉(zhuǎn)換1.通用數(shù)據(jù)傳送指令(1)最基本的傳送指令格式:MOV目的操作數(shù),源操作數(shù)功能:把一個(gè)字節(jié)或字的源操作數(shù)送到目標(biāo)操作數(shù)所在的單元。舉例:①M(fèi)OVBL,AL②

MOVDS,AX③

MOVDL,[DI]④MOV[BX],AX⑤

MOVDX,[1000]⑥

MOVBH,120⑦

MOVDX,1234H注意:數(shù)據(jù)傳送實(shí)質(zhì)上是復(fù)制,對(duì)源操作數(shù)無影響。

源操作數(shù)和目的操作數(shù)之間的位數(shù)必須一致,即同時(shí)為字或字節(jié)。16位數(shù)據(jù)的傳送遵循地址“高對(duì)高,低對(duì)低”的原則。立即數(shù)、CS、IP不能為目的操作數(shù),立即數(shù)和CS只能出現(xiàn)在源操作數(shù)位置。源操作數(shù)和目的操作數(shù)不能同時(shí)為存儲(chǔ)器操作數(shù);兩個(gè)存儲(chǔ)單元之間不能用一條MOV指令直接完成數(shù)據(jù)傳送。存儲(chǔ)器操作數(shù)可用任何一種存儲(chǔ)器尋址方式。立即數(shù)不能直接傳給段寄存器;段寄存器之間也不能進(jìn)行直接傳送。(這2種情況通常要通過通用寄存器間接進(jìn)行)。用BP進(jìn)行間接尋址時(shí)默認(rèn)段寄存器為SS,其他為DS。通用傳送指令不改變標(biāo)志。

修改SS和BP的兩條指令中間必須連續(xù),不插入其他任何指令。立即數(shù)存儲(chǔ)器通用寄存器AX

BXCXDXBPSPSIDI段寄存器CSDSESSSMOV指令數(shù)據(jù)傳送通道IP指令辯誤:MOVAL,CX×MOV3000H,BX×MOVAL,1200H×MOVCS,BX×MOVDS,1200H×MOVES,DS×練習(xí)題目1:已知當(dāng)前BX=1200H,CS=1800H,IP=0500H,DS=3000H,則執(zhí)行指令MOV[BX+2000H],12ABH后,12ABH放在哪兩個(gè)存儲(chǔ)單元(物理地址)?答案:12ABH放在33200H和33201H存儲(chǔ)單元中。其中12H放在33201H單元中,而0ABH放在33200單元中。題目2:將DS段中2000H單元與3000H單元的內(nèi)容互換,請(qǐng)寫出指令序列。MOVAL,[2000H]MOVBL,[3000H]MOV[2000H],BLMOV[3000H],AL(2)堆棧操作指令堆棧:是一種數(shù)據(jù)結(jié)構(gòu),是在內(nèi)存中開辟了一個(gè)比較特殊的存儲(chǔ)區(qū),這個(gè)區(qū)域中數(shù)據(jù)的存取采用“后進(jìn)先出”的原則。堆棧段:8086CPU在存儲(chǔ)器分段管理時(shí),劃分了一個(gè)專門的堆棧區(qū)。1000SS0018SP┇605040302010┇100181001A棧頂棧底1000SS0016SP┇605040302010┇ABCD100181001A棧頂棧底1000SS001ASP┇40302010┇1001A棧頂棧底10016

圖3.168086系統(tǒng)椎棧及其操作(a)堆棧原始狀態(tài)(b)執(zhí)行pushAX(c)執(zhí)行POPAX

(AX)=CDABHPOPBX后的狀態(tài)(a)(b)(c)格式:PUSH源操作數(shù)(SP)←(SP)-2,((SP)+1,(SP))←(SRC)

POP目的操作數(shù)(DST)←((SP)+1,(SP)),(SP)←(SP)+2功能:堆棧指針SP減2后,把一個(gè)字的源操作數(shù)傳送到目的操作數(shù)所在的單元。把SP指出的棧頂中的一個(gè)字傳送到目標(biāo)操作數(shù)所在的單元,然后加2。舉例:①PUSHBX②PUSHES③PUSHDS④PUSH[SI]⑤POPAX⑥POPBX⑦PUSH[DI]注意:操作數(shù)一律為16位操作數(shù),字操作。與各標(biāo)志位無關(guān),不影響標(biāo)志位。PUSH時(shí):SP-2,入棧;POP時(shí):出棧,SP+2。可以使用除立即數(shù)以外的任何數(shù)據(jù)尋址方式,源操作數(shù)和目的操作數(shù)可以是寄存器和存儲(chǔ)器。允許使用段寄存器,CS只能做源操作數(shù),即PUSHCS,但不能做目的操作數(shù),即POP操作數(shù)不允許為CS。

先進(jìn)后出的順序,即:

PUSHAXPUSHBX

POPBXPOPAX(3)交換指令格式:XCHG目的操作數(shù),源操作數(shù)功能:實(shí)現(xiàn)源操作數(shù)與目的操作數(shù)之間進(jìn)行直接交換。注意:交換指令XCHG可以實(shí)現(xiàn)字節(jié)交換,也可以實(shí)現(xiàn)字交換。目的操作數(shù)和源操作數(shù)都是雙重角色,需要遵守MOV指令的所有規(guī)定。段寄存器不能作為XCHG的操作數(shù)。舉例:①XCHGAH,BLXCHG[12H],[34]×②

XCHGDX,BXXCHGAX,CS×③

XCHG[505H],AXXCHGBX,1234H×通用寄存器AXBXCXDXBPSPSIDI

存儲(chǔ)器

XCHG指令的數(shù)據(jù)交換通路2.累加器專用傳送指令累加器是8086CPU進(jìn)行數(shù)據(jù)傳輸?shù)暮诵摹S袃深愔噶睿孩佥斎耄敵鲋噶睥趽Q碼指令(1)輸入/輸出指令——工業(yè)控制中常用的指令格式:INAC,源操作數(shù)

OUT目的操作數(shù),AC功能:IN指令是將數(shù)據(jù)從一個(gè)輸入端口傳送到累加器中,OUT指令是將數(shù)據(jù)從累加器送到一個(gè)輸出端口中。舉例:INAL,PORT------------INAL,20H把來自端口PORT的一個(gè)字節(jié)送入AL寄存器中INAX,PORT把來自PORT和PORT+1兩個(gè)端口的數(shù)據(jù)構(gòu)成一個(gè)字送入AX寄存器中OUTPORT,AL------------OUTDX,AL

把AL寄存器中的一個(gè)字節(jié)送入端口PORTOUTPORT,AX把AX寄存器中的一個(gè)字送入PORT和PORT+1兩個(gè)端口注意:①可實(shí)現(xiàn)字節(jié)和字的傳送,必須用累加器。(INBL,20H×)

②直接端口尋址范圍0-255。(OUT378H,AL×)

③間接端口是0-65536,但只能使用DX寄存器間接尋址,并且注意不加[]。(OUTBX,AL×)(INAX,[DX]×)(2)換碼指令該指令用來將一個(gè)代碼值轉(zhuǎn)換成相應(yīng)的另一種代碼值,格式:

XLAT功能:將BX的內(nèi)容和AL的內(nèi)容相加作為有效地址EA,在一個(gè)表格中找出此單元中的內(nèi)容并傳送至AL中。其功能是從轉(zhuǎn)換表中找出一個(gè)字節(jié)的內(nèi)容,用其取代AL寄存器的內(nèi)容。轉(zhuǎn)換表由用戶設(shè)計(jì),最長為256個(gè)字節(jié),換碼時(shí),應(yīng)將代碼表首地址保存在BX中,AL中保存待查字節(jié)序號(hào)(即代碼表中字符序號(hào)),換碼后,AL取得對(duì)應(yīng)的碼值。注意:①XLAT應(yīng)用時(shí),首先對(duì)應(yīng)列出代碼的對(duì)應(yīng)表格。②使用本指令之前,要求BX寄存器指向表首址,AL的內(nèi)容為表中某項(xiàng)與首地址之間的偏移量。代碼段D779數(shù)據(jù)段┇40┇780

3

0

0BX07

03008030707ALXLAT指令代碼┇+80000┇┇8

0

0

0DS803008030180307圖3-17

XLAT指令執(zhí)行過程例:假設(shè)用戶設(shè)計(jì)轉(zhuǎn)換表TABLE如下圖所示,如需要查找表中第8個(gè)單元的內(nèi)容,則可以使用指令序列:MOV

AX,SEG

TABLEMOV

DS,AXMOV

BX,OFFSET

TABLEMOV

AL,07HXLAT

TABLE+1+2+3+4+5+6+7+800H01H04H09H0FH19H24H31H40H3.地址傳送指令它包括3條指令:LEA、LDS、LES格式:LEA寄存器,源操作數(shù)功能:將源操作數(shù)的有效地址(16位偏移地址)送到指定寄存器中。說明:SRC必須是存儲(chǔ)器操作數(shù)。DEST一定是一個(gè)16位通用寄存器,而不能是8位的寄存器或段寄存器。編程時(shí),程序員不必了解數(shù)據(jù)或指令的有效地址,但有時(shí)這些地址會(huì)在程序其它部分用到,這時(shí)可以使用LEA指令。舉例:①LEAAX,[DI+1000]②LEAAX,[3721H]格式:LDS/LES寄存器,源操作數(shù)功能:把源操作數(shù)SRC指出的存儲(chǔ)單元的4個(gè)存儲(chǔ)單元取出,低地址的兩字節(jié)送目的操作數(shù),高地址的兩字節(jié)送DS/ES段寄存器。

或者:把源操作數(shù)SRC指出的存儲(chǔ)單元的字單元數(shù)據(jù)送目的操作數(shù),下一個(gè)字單元數(shù)據(jù)DS/ES段寄存器。

說明:SRC一定是存儲(chǔ)器操作數(shù)。本指令用于同時(shí)建立段地址和段內(nèi)偏移地址。舉例:①LDSSI,[2130H]②LESDI,[SI]

注意:指令對(duì)標(biāo)志無影響源操作數(shù)必須是存儲(chǔ)器尋址方式注意LEA與MOV的區(qū)別LDS與LES代碼段C578數(shù)據(jù)段┇5600201

0

0

0DS初值+2130121307856SILDSSI,[2130H]指令代碼┇┇┇36213010000圖3-18

LDS指令執(zhí)行過程2

0

0

0DS終值4.標(biāo)志傳送指令(用于保存和恢復(fù)PSW)標(biāo)志傳送指令包括4條指令:①標(biāo)志讀取指令LAHF功能:將標(biāo)志位寄存器中的低8位傳送到AH中②標(biāo)志設(shè)置指令SAHF功能:將AH寄存器的相應(yīng)位傳送到標(biāo)志寄存器低8位。③標(biāo)志寄存器壓入堆棧指令PUSHF功能:將標(biāo)志寄存器的值推入堆棧頂部,同時(shí),棧指針SP的值減2,此指令在執(zhí)行時(shí)標(biāo)志寄存器的值不變。④標(biāo)志寄存器從堆棧彈出指令POPF功能:在執(zhí)行時(shí)從堆棧中彈出一個(gè)字送到標(biāo)志寄存器中,同時(shí)堆棧指針SP的值加2。PUSHF和POPF指令一般用在子程序和中斷處理程序的首尾,起保存主程序標(biāo)志和恢復(fù)主程序標(biāo)志的作用。

說明:LAHF指令對(duì)F本身無影響。SAHF指令對(duì)F高8位無影響,對(duì)F低8位的影響要看AH的內(nèi)容。LAHF和SAHF僅傳送SFZFAFPFCF這5個(gè)。PUSHF指令對(duì)F本身無影響。POPF指令對(duì)F的影響由棧頂內(nèi)容決定。執(zhí)行PUSHF指令,堆棧指針自動(dòng)-2;執(zhí)行POPF指令,堆棧指針自動(dòng)+2。標(biāo)志寄存器和通用寄存器之間沒有直接傳送指令。Flags中各標(biāo)志位的值只有少數(shù)幾個(gè)能通過別的指令去設(shè)置,其余的只能通過上述4條指令去設(shè)置。舉例:①PUSHF

②POPBX③

PUSHCX④

POPF

OFDFIFTFSFZFAF

PFCF15

11109876543210FLAGSLAHFSAHFAH圖3-19LAHF和SAHF指令傳送操作舉例:①欲將F中的進(jìn)位標(biāo)志和奇偶標(biāo)志都設(shè)置為1,請(qǐng)寫出指令序列。MOV

AH,05HSAHF②欲將F的內(nèi)容傳送到AX中,請(qǐng)寫出指令序列。PUSHFPOPAX算術(shù)運(yùn)算類指令一覽表指令類型指令指令功能加法SUBd,sSBBd,sDECdNEGdCMPd,s加法(d)(d)+(s)帶進(jìn)位加法(d)(d)+(s)+CF加1(d)(d)+1減法ADDd,sADCd,sINCd減法(d)(d)-(s)帶借位減法(d)(d)-(s)-CF減1(d)(d)-1取負(fù)(求補(bǔ))(d)0-(d)比較(d)-(s)乘法MULsIMULs無符號(hào)數(shù)乘法帶符號(hào)數(shù)乘法字節(jié):(AX)(AL)*(s)字:(DX:AX)(AX)*(s)算術(shù)運(yùn)算類指令一覽表(續(xù))指令類型指令指令功能除法DIVsIDIVsCBWCWD無符號(hào)數(shù)除法帶符號(hào)數(shù)除法字節(jié)擴(kuò)展成字字?jǐn)U展成雙字字節(jié):(AL)(AX)/(s)的商

(AH)(AX)/(s)余數(shù)字:

(AX)

(DX:AX)/(s)的商

(DX)

(DX:AX)/(s)余數(shù)AL的符號(hào)位擴(kuò)展至AHAX的符號(hào)位擴(kuò)展至DX十進(jìn)制調(diào)整AAADAAAASDASAAMAAD加法分離BCD碼調(diào)整加法組合BCD碼調(diào)整減法分離BCD碼調(diào)整減法組合BCD碼調(diào)整乘法分離BCD碼調(diào)整減法分離BCD碼調(diào)整3.4.2算術(shù)運(yùn)算類指令1.加法指令格式:ADD目的操作數(shù),源操作數(shù)(DST)←(DST)+(SRC)

ADC目的操作數(shù),源操作數(shù)(DST)←(DST)+(SRC)+CF

INC目的操作數(shù)(DST)←(DST)+1注意:相加操作后源操作數(shù)不變??蛇M(jìn)行8位或者16位的加法,但dest與src長度要相同。src可以為通用寄存器、存儲(chǔ)器或立即數(shù)。dest可以是通用寄存器或存儲(chǔ)器,但不能是立即數(shù)、CS、IP。src

和dest不能同時(shí)使用段寄存器。src

和dest不能同時(shí)為存儲(chǔ)器操作數(shù)。相加指令A(yù)DD與ADC影響標(biāo)志位OF、SF、ZF、AF、PF、CF。加一指令I(lǐng)NC影響AF、OF、PF、SF、ZF,但是不影響CF。ADC指令用于多字節(jié)加法運(yùn)算。舉例:①ADDBL,15H

②ADDBX,SI

③ADCCX,[BX]④INCDX

錯(cuò)誤的指令:

ADDAX,BLADDDATA1,DATA2ADDCS,DX

2.減法指令格式:SUB目的操作數(shù),源操作數(shù)(DST)←(DST)-(SRC)

SBB目的操作數(shù),源操作數(shù)(DST)←(DST)-(SRC)-CF

DEC目的操作數(shù)(DST)←(DST)-1

NEG目的操作數(shù)(DST)←0-(DST)

CMP目的操作數(shù),源操作數(shù)(DST)-(SRC)舉例:①SUBAX,BX

②SUBAH,110

③SBB

[BX],AX④DECBX

注意:SUB、SBB目的操作數(shù)不能是立即數(shù)、CS、IP。SBB用于多字節(jié)減法運(yùn)算。SUB、SBB、NEG、CMP影響OF、SF、ZF、AF、CF、PF。DEC影響AF、OF、PF、SF、ZF,但不影響CF。NEG相當(dāng)于用0減去目的操作數(shù)。CMP結(jié)果影響標(biāo)志位,不送回相減結(jié)果。3.乘法指令無符號(hào)數(shù)的乘法指令格式:MUL源操作數(shù);AX←(AL)×(src)(字節(jié)乘法),

DX:AX←(AX)×(src)(字乘法)功能:將AL(8位)或AX(16位)中的數(shù)據(jù)與源操作數(shù)相乘,結(jié)果放在AX或DX與AX兩寄存器中。舉例:MULBL;AL中的8位數(shù)和BL中的8位數(shù)相乘,結(jié)果在AX中

(2)有符號(hào)數(shù)的乘法指令格式:IMUL源操作數(shù);AX←(src)×(AL)(字節(jié)乘法),

DX:AX←(src)×(AX)(字乘法)功能:功能和形式上與MUL類似,只是要求兩個(gè)乘數(shù)必須為有符號(hào)數(shù)。舉例:IMULBX;AX和BX中的兩個(gè)16位有符號(hào)數(shù)相乘,結(jié)果在DX和AX中AL操作數(shù)乘積AH

ALAX操作數(shù)乘積DX

AX(a)(b)圖3-20乘法運(yùn)算操作數(shù)及其運(yùn)算結(jié)果間關(guān)系(a)字節(jié)操作數(shù)(b)字操作數(shù)注意:源操作數(shù)作為一個(gè)乘數(shù),另一個(gè)AL或AX隱含給出。存放結(jié)果隱含給出,AX或DX,AX。乘法運(yùn)算指令MUL和IMUL在執(zhí)行時(shí),影響CF和OF,即乘積的高半部分不為0,則標(biāo)志位位CF和OF均置為1,表示AH及DX中有乘積的有效數(shù)字,否則,CF、OF均置為0,但是AFPFSFZF是不確定的,因此這4標(biāo)志位無意義。4.除法指令(1)無符號(hào)數(shù)的除法指令格式:DIV源操作數(shù);AL←(AX)/(src)的商,AH←(AX)/(src)的余數(shù)AX←(DX:AX)/(src)的商,DX←(DX:AX)/(src)余數(shù)功能:把AX(或DX,AX)中的被除數(shù)除以8位(或16位)源操作數(shù),商數(shù)放在AL(或AX),余數(shù)放在AH(或DX)中。舉例:DIVCL;AX中的數(shù)據(jù)除以CL中的數(shù)據(jù),商在AL中,余數(shù)在AH中(2)有符號(hào)數(shù)的除法指令格式:IDIV源操作數(shù);AL←(AX)/(src)的商,AH←(AX)/(src)的余數(shù)AX←(DX:AX)/(src)的商,DX←(DX:AX)/(src)余數(shù)功能:與DIV相似,不同的是除數(shù),被除數(shù),商和余數(shù)都是帶符號(hào)數(shù)。舉例:IDIVBX;將DX和AX中的32位數(shù)除以BX中的16位數(shù),運(yùn)算后,商在AX中,余數(shù)在DX中

說明:除法運(yùn)算時(shí),要求用16位數(shù)除以8位數(shù),或者用32位數(shù)除以16位數(shù),當(dāng)被除數(shù)只有8位時(shí),必須將此8位數(shù)據(jù)放在AL中,并對(duì)高8位AH進(jìn)行擴(kuò)展。同樣,當(dāng)被除數(shù)只有16位,而除數(shù)也為16位時(shí),必須將16位被除數(shù)放在AX中,并對(duì)高16位DX進(jìn)行擴(kuò)展。

注意:除法指令中,源操作數(shù)作為除數(shù),被除數(shù)隱含給出。除法運(yùn)算后,6個(gè)狀態(tài)標(biāo)志不確定,無意義。除法運(yùn)算的溢出問題,如源操作數(shù)除數(shù)是8位,則商在0—255(-128—127),如源操作數(shù)除數(shù)是16位,則商在0—65535(-32768—+32767),超出此范圍,產(chǎn)生0號(hào)中斷。IDIV指令規(guī)定余數(shù)的符號(hào)和被除數(shù)的符號(hào)相同,如-51除以9,可以得到商為-5,余數(shù)為-6。(3)將字節(jié)擴(kuò)展成字的指令格式:CBW

功能:將AL寄存器中的符號(hào)位擴(kuò)展到AH中。即(AL)<80H,則(AH)=00H,否則(AH)=FFH(4)將字?jǐn)U展成雙字的指令格式:CWD功能:用CWD指令將AX中的被除數(shù)擴(kuò)展成雙字。即(AX)<8000H,則(DX)=0000H,否則(DX)=FFFFH

注意:被除數(shù)和除數(shù)位數(shù)相同,必須進(jìn)行擴(kuò)展處理;擴(kuò)展指令執(zhí)行后,不影響標(biāo)志位。ALAH商余數(shù)操作數(shù)AX8位16位AXDX商余數(shù)操作數(shù)DXAX16位32位(a)(b)圖3-21除法運(yùn)算操作數(shù)及其運(yùn)算結(jié)果存放關(guān)系(a)字節(jié)操作數(shù)(b)字操作數(shù)5.BCD碼運(yùn)算的調(diào)整指令一般來說,兩個(gè)BCD碼相加以后,有可能得到不正確的BCD結(jié)果,可用調(diào)整指令對(duì)AL寄存器中的“和”進(jìn)行調(diào)整,即可得到預(yù)期的結(jié)果。分為兩類:組合式BCD碼和分離式BCD碼所謂組合式BCD碼(壓縮的BCD碼),是指一個(gè)字節(jié)中可以存放兩位BCD碼,高4位和低4位各存放一位。所謂分離式BCD碼(非壓縮的BCD碼),就是一個(gè)字節(jié)存放一位BCD碼(BCD碼存放在字節(jié)的低4位,高4位為零)。格式:

DAA、DAS、AAA、AAS、AAM、AAD

調(diào)整以前,先用指令A(yù)DD或ADC進(jìn)行8位數(shù)的加法運(yùn)算,相加結(jié)果放在AL中,用AAA指令調(diào)整后,非壓縮BCD碼的低位在AL寄存器,高位在AH寄存器。(1)BCD碼加法十進(jìn)制調(diào)整指令①非組合BCD碼的加法調(diào)整指令。格式:AAA(ASCIIAdjustforAddition)功能:對(duì)兩個(gè)非組合的BCD碼相加結(jié)果進(jìn)行調(diào)整,產(chǎn)生一個(gè)非組合的BCD碼。②組合BCD碼的加法調(diào)整指令。格式:DAA(DecimalAdjustforAddition)功能:對(duì)兩個(gè)組合的BCD碼相加結(jié)果(存放在AL中的二進(jìn)制和數(shù))進(jìn)行調(diào)整,產(chǎn)生一個(gè)組合的BCD碼。(2)BCD碼減法十進(jìn)制調(diào)整指令①非組合BCD碼的減法調(diào)整指令格式:AAS(ASCIIAdjustforSubstraction)功能:對(duì)兩個(gè)非組合的BCD碼的相減結(jié)果進(jìn)行調(diào)整。②組合BCD碼的減法調(diào)整指令。格式:DAS(DecimalAdjustforSubtraction)功能:對(duì)兩個(gè)組合的BCD碼數(shù)據(jù)的相減結(jié)果(存放在AL中的二進(jìn)制差數(shù))進(jìn)行調(diào)整,得到一個(gè)組合的BCD碼的差。(3)非組合BCD碼乘法調(diào)整指令格式:AAM(ASCIIAdjustforMultiplication)功能:用于將非組合BCD碼乘法的結(jié)果(在AL中)轉(zhuǎn)換成兩個(gè)非組合型BCD碼(AH和AL中)。(4)非組合BCD碼除法調(diào)整指令格式:AAD(ASCIIAdjustforDivision)功能:常用于DIV指令之前,將AX中的兩位非組合BCD碼變?yōu)槎M(jìn)制數(shù)。即:將(AH)×10+(AL)送到AL中,0送到AH中。(1)BCD碼加法十進(jìn)制調(diào)整指令①非組合BCD碼的加法調(diào)整指令。格式:AAA(ASCIIAdjustforAddition)功能:對(duì)兩個(gè)非組合的BCD碼相加結(jié)果進(jìn)行調(diào)整,產(chǎn)生一個(gè)非組合的BCD碼。調(diào)整方法:1>若AL中低4位<和或=9,且AF=0,則將AL中高4位清0,AF→CF。2>若AL中低4位>9或AF=1,則AL+6→AL,AH+1→AH,1→AF,AF→CF,AL中高4位清0。例:MOVAX,0036H;(AH)=00,(AL)=36ADDAL,35H;(AL)+35=6BHAAA;B>9,(AL)+06=0B+06=01H,(AH)+01=01H,(AX)=0101H,為11的BCD碼,

0000000100000001②組合BCD碼的加法調(diào)整指令。格式:DAA(DecimalAdjustforAddition)功能:對(duì)兩個(gè)組合的BCD碼相加結(jié)果(存放在AL中的二進(jìn)制和數(shù))進(jìn)行調(diào)整,產(chǎn)生一個(gè)組合的BCD碼。調(diào)整方法:1>若AL中低4位>9或標(biāo)志AF=1,則AL+6→AL,1→AF。

2>若AL中高4位>9或標(biāo)志CF=1,則AL+60H→AL,1→CF。DAA指令一般緊跟在ADD或ADC指令之后,影響標(biāo)志為SF、ZF、AF、PF、CF,OF無定義。例:ADDAL,BLDAA(2)BCD碼減法十進(jìn)制調(diào)整指令①非組合BCD碼的減法調(diào)整指令格式:AAS(ASCIIAdjustforSubstraction)功能:對(duì)兩個(gè)非組合的BCD碼的相減結(jié)果進(jìn)行調(diào)整。調(diào)整方法:1>若AL中低四位小于或等于9,且AF=0,則AL高4位清0,AF→CF。2>若AL中低4位大于9或AF=1,則AL-6→AL。AH-1→AH,1→AF,AF→CF,AL中高4位清0。例:MOVAX,0132HSUBAL,35H;(AL)=FDHAAS;D>9,(AL)=0D-06=07H②組合BCD碼的減法調(diào)整指令。格式:DAS(DecimalAdjustforSubtraction)功能:對(duì)兩個(gè)組合的BCD碼數(shù)據(jù)的相減結(jié)果(存放在AL中的二進(jìn)制差數(shù))進(jìn)行調(diào)整,得到一個(gè)組合的BCD碼的差。調(diào)整方法:1>若AL中低4位>9或標(biāo)志AF=1,則AL-6→AL,1→AF。2>若AL中高4位>9或標(biāo)志CF=1,則AL-60H→AL,1→CFDAS一般跟在SUB或SBB之后使用,影響標(biāo)志位為SF、ZF、AF、PF、CF,OF無定義。例:SUBAL,BLDAS

(3)非組合BCD碼乘法調(diào)整指令格式:AAM(ASCIIAdjustforMultiplication)功能:用于將非組合BCD碼乘法的結(jié)果(在AL中)轉(zhuǎn)換成兩個(gè)非組合型BCD碼(AH和AL中)。調(diào)整方法:AL/10商→AH,余數(shù)→AL。AAM指令一般跟在MUL之后使用,影響標(biāo)志位為SF、ZF、PF,其他標(biāo)志位無定義。例如:MOVAL,07HMOVBL,09HMULBL;(AX)=63D=003FHAAM;(AX)=0603H

(4)非組合BCD碼除法調(diào)整指令格式:AAD(ASCIIAdjustforDivision)功能:常用于DIV指令之前,將AX中的兩位非組合BCD碼變?yōu)槎M(jìn)制數(shù)。即:將(AH)×10+(AL)送到AL中,0送到AH中。調(diào)整方法:AH*10+AL→AL0→AHAAD用于DIV操作之前,影響的標(biāo)志位為SF、ZF、PF,其他標(biāo)志位無定義。例:MOVAX,0605H;(AH)=06MOVBL,09HAAD;(AL)=06*10+05=65H,(AH)=00DIVBL;(AX)=0065H/09H=0207H舉例:①ADCAL,[SI]DAA

ADDAL,[DI]AAA③SUBAL,[BX]

DAS

④MULDL

AAM

⑤AADDIVBL

注意:BCD碼的加法,是ADC和DAA兩條指令的組合來構(gòu)成十進(jìn)制加法運(yùn)算。只有分離BCD碼可以進(jìn)行乘法運(yùn)算,經(jīng)AAM調(diào)整后,高位在AH中,低位在AL中。加、減、乘在使用十進(jìn)制調(diào)整指令前,中間結(jié)果都存入AL中。只有分離BCD碼可以進(jìn)行除法運(yùn)算,先用AAD調(diào)整,以便進(jìn)行除法運(yùn)算。3.4.3邏輯運(yùn)算和移位指令兩組處理指令:邏輯運(yùn)算指令和移位指令。1.邏輯運(yùn)算指令格式:AND目的操作數(shù),源操作數(shù)

OR目的操作數(shù),源操作數(shù)

NOT目的操作數(shù)

XOR目的操作數(shù),源操作數(shù)

TEST目的操作數(shù),源操作數(shù)功能:AND:目的操作數(shù)和源操作數(shù)按位進(jìn)行與運(yùn)算,結(jié)果送入目的操作數(shù)。OR:目的操作數(shù)和源操作數(shù)按位進(jìn)行或運(yùn)算,結(jié)果送入目的操作數(shù)。NOT:目的操作數(shù)按位進(jìn)行非運(yùn)算,結(jié)果送入目的操作數(shù)。XOR:目的操作數(shù)和源操作數(shù)按位進(jìn)行異或運(yùn)算,結(jié)果送入目的操作數(shù)。TEST:目的操作數(shù)和源操作數(shù)按位進(jìn)行與運(yùn)算,結(jié)果不送入目的操作數(shù)。舉例:①ANDBL,0FH②ORCX,[BX+DI]③XORAX,0FF00H④TESTBX,8000H⑤NOTDH注意:按位操作,操作數(shù)可以是字節(jié)或字;目的操作數(shù)不能為立即數(shù);src

和dest不能同時(shí)為存儲(chǔ)器操作數(shù);AND指令的主要用途是將目標(biāo)操作數(shù)的某些位清零,而其他位保持不變;OR指令的主要用途是將目標(biāo)操作數(shù)的某些位置1,而其他位保持不變;XOR指令的一個(gè)用途是將寄存器清零,同時(shí)也將進(jìn)位標(biāo)志位CF清零。例如:XORAX,AX

TEST與AND相似,但不保存結(jié)果,僅僅影響標(biāo)志位。2.移位指令分為兩大類:非循環(huán)移位指令和循環(huán)移位指令。(1)非循環(huán)移位指令格式:SAL/SHL/SAR/SHR目的操作數(shù),計(jì)數(shù)值功能:算術(shù)/邏輯左移SAL/SHL:對(duì)字或字節(jié)各位進(jìn)行左移,最高位進(jìn)CF,右端補(bǔ)0算術(shù)右移指令SAR:最高位不動(dòng),其它各位右移,最低位進(jìn)CF。邏輯右移指令SHR:對(duì)字和字節(jié)進(jìn)行右移1位或CL,最低位進(jìn)CF,左端補(bǔ)0。CF0MSBLSBCFCFMSBLSBMSBLSB0SAL/SHLSHRSAR舉例:①SALAX,1②SHLAX,CL③SAR[SI],1④SHRDI,1注意:目的操作數(shù)可以是字節(jié)或字;目的操作數(shù)只能是寄存器和存儲(chǔ)器,不能為立即數(shù);計(jì)數(shù)值1或CL,最多255;算術(shù)右移位保持目的操作數(shù)的符號(hào)位不變;算術(shù)左移或右移n位,相當(dāng)于乘以或除以2n;如果移位次數(shù)等于1,且移位以后新的最高位與次高不相等,則溢出標(biāo)志位OF=1,否則OF=0。OF值表示移位是否改變符號(hào)位。算術(shù)右移指令對(duì)狀態(tài)標(biāo)志位CF、OF、PF、SF和ZF有影響,但AF的值不確定。(2)循環(huán)移位指令格式:ROL/ROR/RCL/RCR目的操作數(shù),計(jì)數(shù)值功能:ROL:不帶進(jìn)位位的循環(huán)左移指令ROR:不帶進(jìn)位位的循環(huán)右移指令RCL:帶進(jìn)位位的循環(huán)左移指令RCR:帶進(jìn)位位的循環(huán)右移指令CFMSBLSBCFCFMSBLSBMSBLSBROLRORRCRCFMSBLSBRCL舉例:①ROLAX,1②RORAH,CL③RCL[BX],1④RCRBX,1

注意:目的操作數(shù)可以是字節(jié)或字;目的操作數(shù)只能是寄存器和存儲(chǔ)器,不能為立即數(shù);計(jì)數(shù)值1或CL,最多255;循環(huán)移位,移出的目的操作數(shù)并不丟失,送回另一端;循環(huán)移位影響CF和OF,CF中總是保持著從一端移出的信息;如果循環(huán)移位次數(shù)等于l,且移位以后目的操作數(shù)新的最高位與CF不相等,則(OF)=1,否則(OF)=0。因此,OF的值表示循環(huán)移位前后符號(hào)位是否有所變化。如果移位次數(shù)不等于l,則OF的值不確定。3.4.4串操作指令串操作指令-----用一條指令實(shí)現(xiàn)對(duì)一串字符或數(shù)據(jù)的操作。串操作指令的特點(diǎn):①通過加重復(fù)前綴來實(shí)現(xiàn)串操作,規(guī)定CX寄存器存放要處理的字符串的元素個(gè)數(shù),即:字節(jié)數(shù)或字?jǐn)?shù)。②可以對(duì)字節(jié)串進(jìn)行操作,也可以對(duì)字串進(jìn)行操作。③串操作時(shí),SI和DI的增減規(guī)定由方向標(biāo)志DF設(shè)定,當(dāng)DF=1時(shí),SI和DI作自動(dòng)減量修改,當(dāng)DF=0時(shí),SI和DI作自動(dòng)增量修改,對(duì)字節(jié)串操作增減量為1,對(duì)字串操作增減量為2。④重復(fù)的字符串處理過程可以被中斷。5條串操作指令:串傳送指令MOVS、串比較指令CMPS、串檢索指令SCAS、

串裝入指令LODS、串存儲(chǔ)指令STOS。3條重復(fù)前綴:重復(fù)前綴REP、相等時(shí)重復(fù)REPE、不相等時(shí)重復(fù)REPNE。1.指令的重復(fù)前綴格式:REP串操作指令

REPE串操作指令或REPZ串操作指令

REPNE串操作指令或REPNZ串操作指令功能:REP:

無條件重復(fù)前綴---(CX)≠0時(shí)重復(fù)(CX)=0停止)REPE:

相等時(shí)重復(fù)---ZF=1且(CX)≠0時(shí)重復(fù)(CX=0或ZF=0停止)REPZ:

結(jié)果為零時(shí)重復(fù)---ZF=1且(CX)≠0時(shí)重復(fù)(CX=0或ZF=0停止)REPNE:

不相等時(shí)重復(fù)---ZF=0且(CX)≠0時(shí)重復(fù)(CX=0或ZF=1停止)REPNZ:

結(jié)果不為零時(shí)重復(fù)---ZF=0且(CX)≠0時(shí)重復(fù)(CX=0或ZF=1停止)注意:ZF=1表示相等,ZF=0表示不相等;REPE和REPZ兩者相同,REPNE和REPNZ兩者相同。2.字符串指令(1)字符串傳送指令指令格式:MOVSBMOVSW功能:MOVSB將DS:SI邏輯地址所指存儲(chǔ)單元的字節(jié)送到ES:DI邏輯址所指存儲(chǔ)單元,DF=0,DI和SI加1。MOVSW將DS:SI邏輯地址所指存儲(chǔ)單元的字送到ES:DI邏輯地所指存儲(chǔ)單元DF=0,DI和SI加2。舉例:①M(fèi)OVDS,2000H②

MOVES,3000H③

CLD④

MOVCX,20⑤

MOVSI,200H⑥

MOVDI,100H⑦

REPMOVSW注意點(diǎn)MOVSB和MOVSW指令前通常加重復(fù)指令前綴REP;使用兩指令前必須對(duì)DS,ES,SI,DI,CX,DF進(jìn)行設(shè)置;在MOVSB中CX為多少個(gè)字節(jié),在MOVSW中CX位多少個(gè)字。(2)字符串比較指令指令格式:CMPSBCMPSW功能:CMPSB將DS:SI邏輯地址所指存儲(chǔ)單元的字節(jié)與ES:DI邏輯址所指存儲(chǔ)單元的字節(jié)相比較,DF=0,DI和SI加1。CMPSW將DS:SI邏輯地址所指存儲(chǔ)單元的字與ES:DI邏輯地所指存儲(chǔ)單元的字相比較,DF=0,DI和SI加2。舉例:編程比較從邏輯地址2000H:100H開始的10個(gè)字節(jié)與邏輯地址4000H:200H開始的10個(gè)字節(jié)是否對(duì)應(yīng)相等,相等則轉(zhuǎn)DONE。

MOVDS,2000H

MOVES,4000H

MOVDI,200H

MOVSI,100H

CLDMOVCX,10REPZCMPSBJZDONERETDONE┇

注意:預(yù)先設(shè)置加上REPZ/E兩個(gè)字符串相等的時(shí)候繼續(xù)比較;加上REPNZ/NE兩個(gè)字符串不相等的時(shí)候繼續(xù)比較;退出條件檢測CX=0退出,另一種ZF不滿足條件退出,所以之后放了一條JZ或JNZ指令檢測ZF。

(3)字符串檢索指令指令格式:SCASW

SCASB功能:SCASB/SCASW在字符串中查找一個(gè)與已知數(shù)值相同或不同的元素。SCASB將AL中的字節(jié)與邏輯地址ES:DI所指單元中的字節(jié)相比較,DF=0,DI加1,DF=1,DI減1。SCASW將AX中的字與邏輯地址ES:DI所指單元中的字相比較,DF=0,DI加2,DF=1,DI減2。舉例:從邏輯地址9000H:100H開始的10個(gè)單元中如果有一個(gè)單元的內(nèi)容為2CH,則BX加1。MOVES,9000HMOVDI,100HCLDMOVCX,10MOVAL,2CHREPNZSCASBJNZAAAINCBXAAA:┇注意:預(yù)先設(shè)置加上REPZ/E兩個(gè)字符串相等的時(shí)候繼續(xù)比較;加上REPNZ/NE兩個(gè)字符串不相等的時(shí)候繼續(xù)比較;退出條件檢測CX=0退出,另一種ZF不滿足條件退出,所以之后放了一條JZ或JNZ指令檢測ZF。(4)取字符串指令指令格式:LODSBLODSW功能:LODSB將DS:SI邏輯地址所指存儲(chǔ)單元的字節(jié)取到AL,DF=0,SI加1,DF=1,SI減1。LODSW將DS:SI邏輯地址所指存儲(chǔ)單元的字取到AX,DF=0,SI加2,DF=1,SI減2。舉例:將100H:20H單元開始10個(gè)字節(jié)的內(nèi)容均加5。CLD;方向標(biāo)志清0,SI遞增MOVCX,10;置計(jì)數(shù)初值10MOVDS,100H;置DS為100H

MOVSI,20H;置SI為20,作為初始地址指針LL1:

LODSB;取1個(gè)字節(jié)到AL中,并使SI增1

ADDAL,5;加5處理MOV[SI],AL;處理結(jié)果送回

DECCX;計(jì)數(shù)值減1JNZLL1;如未處理完,轉(zhuǎn)LL1HLT;暫停注意:預(yù)先設(shè)置,DS:SI;該指令前不加前綴REP等重復(fù)指令。(5)存字符串指令指令格式:STOSB

STOSW功能:STOSB將AL中的字節(jié)存到邏輯地址ES:DI所指單元中,DF=0,DI加1,DF=1,DI減1。STOSW將AX中的字存到邏輯地址ES:DI所指單元中,DF=0,DI加2,DF=1,DI減2。舉例:將100H:20H開始的128個(gè)單元清0。CLD;清除方向標(biāo)志,DI遞增MOVCX,0080H;置計(jì)數(shù)初值128

MOVES,100H;置ES為100HMOVDI,20H;置DI為20H,作為初始地址指針XORAL,AL;AL清0REPSTOSB;將128個(gè)字節(jié)清0注意:預(yù)先設(shè)置,ES:DI;該指令前加前綴REP等。3.4.5控制轉(zhuǎn)移類指令5種轉(zhuǎn)移指令:無條件跳轉(zhuǎn)指令條件跳轉(zhuǎn)指令循環(huán)控制指令子程序調(diào)用和返回指令中斷指令

1.無條件跳轉(zhuǎn)指令指令格式:JMP目標(biāo)地址功能:無條件的跳到目標(biāo)地址位置舉例:①JMPSHORTMULTI(SHORT為短程屬性算符)②JMPNEARPTRMULT2(NEAR為近程屬性算符)③JMPCX④JMPFARPTRMULT3(FAR為遠(yuǎn)程屬性算符)⑤

JMPDWORDPTR[SI](DWORD為字屬性算符)注意:①目標(biāo)指令在JMP指令所在的代碼段內(nèi),屬段內(nèi)跳轉(zhuǎn),只需改變IP的內(nèi)容;②目標(biāo)指令在JMP指令所在的代碼段外,屬段間跳轉(zhuǎn),需改變CS和IP的內(nèi)容。③不影響標(biāo)志寄存器段內(nèi)直接跳轉(zhuǎn)段內(nèi)直接跳轉(zhuǎn)段內(nèi)間接跳轉(zhuǎn)段間直接跳轉(zhuǎn)段間間接跳轉(zhuǎn)2.條件跳轉(zhuǎn)指令3種條件轉(zhuǎn)移指令:簡單條件跳轉(zhuǎn)指令帶符號(hào)數(shù)條件跳轉(zhuǎn)指令無符號(hào)數(shù)條件跳轉(zhuǎn)指令(1)簡單條件跳轉(zhuǎn)指令指令格式:

JC目標(biāo)地址(CF=1,轉(zhuǎn)移)

JNC目標(biāo)地址(CF=0,轉(zhuǎn)移)

JZ目標(biāo)地址

JNZ目標(biāo)地址

JS目標(biāo)地址

JNS目標(biāo)地址JO目標(biāo)地址

JNO目標(biāo)地址

JP目標(biāo)地址

JNP目標(biāo)地址

JCXZ目標(biāo)地址

(CX=0,轉(zhuǎn)移)

舉例:用條件跳轉(zhuǎn)指令實(shí)現(xiàn)程序的循環(huán)

MOVSI,1000HMOVDI,2000HMOVCX,100KKK:MOVSBDECCXJNZKKK┇(2)帶符號(hào)數(shù)條件跳轉(zhuǎn)指令指令格式:

JG/JNLE目標(biāo)地址(大于(不小于且不等于)時(shí),轉(zhuǎn)移)

JGE/JNL目標(biāo)地址(不小于(大于或等于)時(shí),轉(zhuǎn)移)

JL/JNGE目標(biāo)地址(小于(不大于且不等于)時(shí),轉(zhuǎn)移)

JLE/JNG目標(biāo)地址(不大于(小于或等于)時(shí),轉(zhuǎn)移)注意:帶符號(hào)數(shù)L:lessG:greater舉例:設(shè)有2個(gè)互不相等的帶符號(hào)字節(jié)數(shù)存放在以100H單元為首地址的數(shù)據(jù)緩沖區(qū)中,試編程把較大的數(shù)送200H單元中。MOVSI,100H;首址100H送SIMOVAL,[SI];取第一個(gè)數(shù)據(jù)CMPAL,[SI+1];與第二個(gè)數(shù)相比較JGL1;如果比第二個(gè)數(shù)大,轉(zhuǎn)L1MOVAL,[SI+1];取第二個(gè)數(shù)L1:MOVSI,200H;將較大的數(shù)送至200HMOV[SI],AL(3)無符號(hào)數(shù)條件跳轉(zhuǎn)指令指令格式:

JB/JNAE目標(biāo)地址(低于(不高于且不等于)時(shí),轉(zhuǎn)移)

JNB/JAE目標(biāo)地址(不低于(高于或等于)時(shí),轉(zhuǎn)移)

JA/JNBE目標(biāo)地址(高于(不低于且不等于)時(shí),轉(zhuǎn)移)

JNA/JBE目標(biāo)地址(不高于(低于或等于)時(shí),轉(zhuǎn)移)注意:無符號(hào)數(shù)B:belowA:above指令名稱助記符轉(zhuǎn)移條件備注等于/零轉(zhuǎn)移不等于/非零轉(zhuǎn)移負(fù)轉(zhuǎn)移正轉(zhuǎn)移偶轉(zhuǎn)移奇轉(zhuǎn)移溢出轉(zhuǎn)移不溢出轉(zhuǎn)移進(jìn)位轉(zhuǎn)移無進(jìn)位轉(zhuǎn)移低于/不高于或等于轉(zhuǎn)移高于或等于/不低于轉(zhuǎn)移高于/不低于或等于轉(zhuǎn)移低于或等于/不高于轉(zhuǎn)移大于/不小于或等于轉(zhuǎn)移大于或等于/不小于轉(zhuǎn)移小于/不大于或等于轉(zhuǎn)移小于或等于/不大于轉(zhuǎn)移CX等于零轉(zhuǎn)移JE/JZJNE/JNZJSJNSJP/JPEJNP/JPOJOJNOJCJNCJB/JNAEJAE/JNB

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論