80888086指令系統(tǒng)課件_第1頁
80888086指令系統(tǒng)課件_第2頁
80888086指令系統(tǒng)課件_第3頁
80888086指令系統(tǒng)課件_第4頁
80888086指令系統(tǒng)課件_第5頁
已閱讀5頁,還剩181頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1

8088/8086指令系統(tǒng)

23.1概述指令——控制計(jì)算機(jī)完成指定操作的命令機(jī)器指令——指令的二進(jìn)制代碼形式。例如:CD21H匯編指令——助記符形式的指令。例如:MOVAX,21H指令系統(tǒng)——CPU所有指令及其使用規(guī)則的集合8088/8086指令系統(tǒng)指令向后兼容(x86系列)3指令按功能分為六大類(92種)(1)數(shù)據(jù)傳送類;(2)算術(shù)運(yùn)算類;(3)邏輯運(yùn)算和移位;(4)串操作;(5)控制轉(zhuǎn)移類;(6)處理器控制。4部分8088常用指令P94指令類型助記符數(shù)據(jù)傳送數(shù)據(jù)傳送MOV,PUSH/POP,XCHG等地址傳送LEA,LDS,LES輸入輸出IN,OUT算術(shù)運(yùn)算加法ADD,ADC,INC減法SUB,SBB,DEC,NEG,CMP乘/除法MUL,IMUL,DIV,IDIV邏輯AND,OR,NOT,XOR,TEST移位SHL/SHR/SAR,ROL/ROR,RCL/RCR串操作MOVS,CMPS,SCAS,LODS,STOS控制轉(zhuǎn)移JMP,JXX,LOOP,CALL/RET,INT/IRET5一.

指令的基本構(gòu)成操作碼[目的操作數(shù)],[源操作數(shù)]要執(zhí)行的操作操作的對(duì)象0個(gè)、1個(gè)或2個(gè)6ADDAX,[SI]MOVAL,BLINCBX例7三類操作數(shù)立即操作數(shù)寄存器操作數(shù)存儲(chǔ)器操作數(shù)81.立即數(shù)操作數(shù)具有固定數(shù)值的數(shù),即常數(shù)。表3-28位16位無符號(hào)數(shù)00H-FFH(0-255)0000H-FFFFH(0-65535)帶符號(hào)數(shù)80H-7FH(-128~127)8000H-7FFFH(-32768~32767)立即數(shù)只能用作源操作數(shù),如:MOV AX,0FA00H ;正確MOV 8000H,DX ;錯(cuò)誤92.寄存器操作數(shù)放在8個(gè)通用寄存器或4個(gè)段寄存器中的操作數(shù)既可以作為源操作數(shù),也可以用作目的操作數(shù)通用寄存器可存放字節(jié)操作數(shù)(如AH),也可存放字操作數(shù)(AX)SI,DI,BP及SP只能存放字操作數(shù)段寄存器只能存放當(dāng)前操作數(shù)的段基地址不允許將立即數(shù)傳送到段寄存器103.存儲(chǔ)器操作數(shù)存儲(chǔ)器操作數(shù)字節(jié)字雙字124類型存儲(chǔ)單元個(gè)數(shù)一般不允許兩個(gè)操作數(shù)同時(shí)為存儲(chǔ)器操作數(shù)尋找存儲(chǔ)器操作數(shù):所在段+偏移地址段寄存器尋址方式11若指令中沒有指明所涉及的段寄存器,CPU就采用默認(rèn)的段寄存器來確定操作數(shù)所在的段。表3.3段寄存器使用的一些基本約定P9612一條指令的執(zhí)行時(shí)間:二.

指令的執(zhí)行時(shí)間(時(shí)鐘周期數(shù))取指令取操作數(shù)執(zhí)行指令傳送結(jié)果表3.4常用指令執(zhí)行時(shí)間P96結(jié)論:

1)盡量使用寄存器作為操作數(shù)

2)若有可能,用移位代替乘除法

3)盡量使用簡單的尋址方式13——尋找操作數(shù)地址的方法

尋找操作數(shù)的地址(一般指源操作數(shù))

尋找要執(zhí)行的下一條指令的地址在8086指令系統(tǒng)中,尋址方式可分為8種:

①立即尋址⑤寄存器相對(duì)尋址

②直接尋址⑥基址-變址尋址

③寄存器尋址⑦相對(duì)的基址-變址尋址

④寄存器間接尋址⑧隱含尋址3.28086的尋址方式14

操作數(shù)直接由指令給出——立即數(shù)立即尋址只能用于源操作數(shù)例:

MOVAX,1C8FHMOVBYTEPTR[2A00H],8FH

MOV2A00H,AX;錯(cuò)誤!

一.

立即尋址15立即數(shù)操作碼低8位高8位代碼段立即尋址指令在存儲(chǔ)器中的存放形式存儲(chǔ)器MOV操作碼02H31HAHAL代碼段AX例3-1MOVAX,3102H;AX3102H

執(zhí)行后,(AH)=31H,(AL)=02H16二.直接尋址

指令中直接給出操作數(shù)的16位偏移地址

偏移地址也稱為有效地址(EA,EffectiveAddress)

默認(rèn)的段寄存器為DS,但也可以顯式地指定其他段寄存器——稱為段超越前綴偏移地址也可用符號(hào)地址來表示,如ADDR

例:

MOVAX,[2A00H]MOVDX,ES:[2A00H]

MOVSI,TABLE_PTR17例3-2MOVAX,[3102H]AL(3102H),AH(3103H)如果(DS)=2000H,(23012H)=CDH,(23013H)=ABH則操作數(shù)的物理地址為:

20000H+3102H=23102H指令執(zhí)行后:(AX)=ABCDHMOV操作碼02H31HAHAL23102HCDHABH存儲(chǔ)器代碼段數(shù)據(jù)段..18三.

寄存器尋址

操作數(shù)在寄存器中源操作數(shù)與目的操作數(shù)字長要相同寄存器尋址與段地址無關(guān)例:

MOVAX,BXMOV[3F00H],AXMOVCL,AL×MOVAX,BL

;×MOVES:AX,DX;字長不同寄存器與段無關(guān)19AXSI2233H2233H例3-4MOVSI,AX;SI(AX)

指令執(zhí)行前:(AX)=2233H

指令執(zhí)行后:(AX)=2233H,(SI)=2233H20四.

寄存器間接尋址

操作數(shù)的偏移地址(EA)放在間址寄存器中只有SI、DI、BX和BP可作間址寄存器物理地址=(DS)左移四位+(BX)或(SI)或(DI)物理地址=(SS)左移四位+(BP)例:MOV

AX,[BX]MOVCL,CS:[DI]×MOVAX,[DX]×MOVCL,[AX]EA=(BX)(BP)(SI)(DI)21例3-5MOVAX,[SI]若(DS)=6000H,

(SI)=1200H,(61200H)=44H,(61201H)=33H則指令執(zhí)行后,(AX)=44H33H60001200DSSI6000061200

61200HAX存儲(chǔ)器數(shù)據(jù)段

+)120044H33H334422EA=間址寄存器的內(nèi)容加上一個(gè)8/16位的位移量寄存器相對(duì)尋址常用于存取表格或一維數(shù)組中的元素——把表格的起始地址作為位移量,元素的下標(biāo)值放在間址寄存器中(或反之)EA=(BX)(BP)(SI)(DI)+8位16位位移量(相對(duì)值)

五.

寄存器相對(duì)尋址23物理地址=(DS)左移四位+(BX)或(SI)或

(DI)+位移量物理地址=(SS)左移四位+(BP)+位移量例:MOVAX,[BX]XYZMOVAX,XYZ[BX]MOVAX,[BX+XYZ]MOVAX,[SI]40HMOVAX,40H[SI]MOVAX,[SI+40H]24

例:MOVAX,[BX+8]MOVCX,TABLE[SI]MOVAX,[BP];默認(rèn)段寄存器為SS例3-7MOVAX,DATA[BX]

若(DS)=6000H,(BX)=1000H,DATA=2A00H,(63A00H)=66H,(63A01H)=55H

則物理地址=60000H+1000H+2A00H=63A00H指令執(zhí)行后:(AX)=5566H25操作碼00偏移量低2A偏移量高DS6000BX1000+DATA2A0063A0063A00HAHALAX代碼段數(shù)據(jù)段.........66H55HMOVAX,DATA[BX]26六.

基址-變址尋址

若操作數(shù)的偏移地址:由基址寄存器(BX或BP)給出——

基址尋址方式由變址寄存器(SI或DI)給出——

變址尋址方式

由一個(gè)基址寄存器的內(nèi)容和一個(gè)變址寄存器的內(nèi)容相加而形成操作數(shù)的偏移地址,稱為基址-變址尋址。EA=(BX)(BP)+(SI)(DI)

同一組內(nèi)的寄存器不能同時(shí)出現(xiàn)。27若基址寄存器用BX,則段寄存器用DS物理地址=(DS)左移四位+(BX)+(SI)或(DI)若基址寄存器用BP,則段寄存器用SS物理地址=(SS)左移四位+(BP)+(SI)或(DI)28例:

MOVAX,[BX][SI]MOVAX,[BX+SI]MOVAX,DS:[BP][DI]×MOVAX,[BX][BP]

×

MOVAX,[DI][SI]2983000操作碼DS

8000BX

2000+SI

100083000HAHALAX代碼段數(shù)據(jù)段.........YYXX例3-9MOVAX,[BX][SI]假定:(DS)=8000H,(BX)=2000H,SI=1000H則物理地址=指令執(zhí)行后:(AL)=(AH)=80000H+2000H+1000H=83000H[83000H][83001H]30七.相對(duì)的基址-變址尋址

在基址-變址尋址的基礎(chǔ)上再加上一個(gè)相對(duì)位移量注意事項(xiàng)同基址-變址尋址EA=(BX)(BP)+(SI)(DI)+8位16位位移量

例:MOVAX,BASE[SI][BX]MOVAX,[BX+BASE][SI]MOVAX,[BX+SI+BASE]MOVAX,[BX]BASE[SI]MOVAX,[BX+SI]BASE31例3-10MOVAX,DATA[DI][BX]若(DS)=8000H,(BX)=2000H,(DI)=1000H,DATA=200H則指令執(zhí)行后(AH)=[83201H],(AL)=[83200H]8320083200HAHALAX+DATA0200操作碼代碼段數(shù)據(jù)段.........YYXXDS

8000BX

2000

DI

100032使用相對(duì)的基址-變址尋址方式可以很方便地訪問二維數(shù)組?;芳拇嫫鲾?shù)組首地址變址寄存器數(shù)組元素行址位移量數(shù)組元素列址(偏移地址)33八.

隱含尋址

指令中的操作數(shù)是隱含的例:MULBL

指令隱含了被乘數(shù)AL及乘積AX

類似的指令還有:DIV、CBW、MOVS等(AL)×(BL)→AX34小結(jié)指令由()和()構(gòu)成如何取得操作數(shù)——稱為()操作碼操作數(shù)尋址35尋址方式可分為立即尋址直接尋址寄存器相對(duì)尋址寄存器尋址基址-變址尋址基址-變址相對(duì)尋址寄存器間接尋址隱含尋址36寄存器間接、寄存器相對(duì)、基址變址、相對(duì)基址變址四種尋址方式的比較:

尋址方式指令操作數(shù)形式

寄存器間接——只有一個(gè)寄存器(BX/BP/SI/DI之一)寄存器相對(duì)——一個(gè)寄存器加上位移量基址—變址——兩個(gè)不同類別的寄存器相對(duì)基址-變址——兩不同類別的寄存器加上位移量37本節(jié)習(xí)題P1523.2383.38086指令系統(tǒng)6類指令系統(tǒng):數(shù)據(jù)傳送指令算術(shù)運(yùn)算指令

邏輯運(yùn)算和移位指令

串操作指令

程序控制指令

處理器控制指令39一.數(shù)據(jù)傳送類指令

存儲(chǔ)器寄存器I/O

數(shù)據(jù)傳送類指令又可分為如下四種:

通用數(shù)據(jù)傳送

輸入輸出

地址傳送

標(biāo)志傳送401.通用數(shù)據(jù)傳送指令(1)

MOVdest,src;dest←src

傳送的是字節(jié)還是字取決于指令中涉及的寄存器是8位還是16位。具體來說可實(shí)現(xiàn):

①M(fèi)OVmem/reg1,mem/reg2

指令中兩操作數(shù)中至少有一個(gè)為寄存器

MOV CL,DLMOV AX,BX MOV [SI],CX MOV CL,[BX+5]41②MOVreg,data;立即數(shù)送寄存器

MOVAX,1000HMOVBH,12H③MOVmem,data;立即數(shù)送存儲(chǔ)單元

MOV

[SI],0F932HMOVAPR[BP],5CH④MOVacc,mem;存儲(chǔ)單元送累加器

MOVAX,[BX]4MOVAL,[BP][DI]⑤MOVmem,acc;累加器送存儲(chǔ)單元

MOV[SI][BP]4,AXMOV[1000H],AL⑥MOVsegreg,mem/reg;存儲(chǔ)單元/寄存器送段寄存器

MOVDS,XYZMOVES,AX⑦M(jìn)OVmem/reg,segreg;段寄存器送存儲(chǔ)單元/寄存器

MOV[SI],SSMOVCX,ES

42MOV指令使用規(guī)則:1)IP和CS不能作目的寄存器2)不允許mem←mem3)不允許segreg←segreg4)立即數(shù)不允許作為目的操作數(shù)5)不允許segreg←立即數(shù)6)源操作數(shù)與目的操作數(shù)類型要一致43幾個(gè)不能傳送的解決辦法:用AX作橋梁

存儲(chǔ)器←存儲(chǔ)器:

MOVAX,MEM1 MOVMEM2,AX段寄存器←段寄存器:

MOVAX,DS MOVES,AX段寄存器←立即數(shù):

MOVAX,DATA MOVDS,AXP107–10844應(yīng)用舉例MOVAL,CLMOVDL,CH若(CX)=2233H,則(AL)=?(DL)=?DEBUG的使用45例:把內(nèi)存中首地址為MEM1的200個(gè)字節(jié)送到首地址為MEM2的區(qū)域中

MOVSI,OFFSETMEM1

MOVDI,OFFSETMEM2MOVCX,200NEXT:MOVAL,[SI]MOV[DI],ALINCSIINCDIDECCXJNZNEXTHLT46堆棧按“后進(jìn)先出(LIFO)”方式工作的存儲(chǔ)區(qū)域堆棧以字為單位進(jìn)行壓入彈出操作。為什么要設(shè)置堆棧為什么要按“后進(jìn)先出”方式工作?(2)堆棧操作指令47轉(zhuǎn)子程序2(a)(b)子程序調(diào)用示意圖(a)主程序調(diào)子程序;(b)子程序嵌套示意圖主程序IP繼續(xù)執(zhí)行主程序執(zhí)行子程序轉(zhuǎn)子程序壓棧彈出返回主程序主程序IPIP(下)繼續(xù)執(zhí)行主程序轉(zhuǎn)子程序1返回主程序IP’執(zhí)行子程序2返回子程序1IP’(下)執(zhí)行子程序1繼續(xù)執(zhí)行子程序1壓棧彈出IP(下)48SS指示堆棧段的段基址堆棧指針SP始終指向堆棧的頂部SP的初值規(guī)定了所用堆棧區(qū)的大小堆棧的最高地址叫棧底。SPSS堆棧段進(jìn)棧方向退棧方向棧底棧頂一個(gè)字49

①壓棧指令

PUSHsrc ;src為16位的寄存器或存儲(chǔ)器操作數(shù)例:PUSH AX ;將AX內(nèi)容壓棧執(zhí)行操作:(SP)←(SP)-2

(SP)+1←高字節(jié)AH

(SP)←低字節(jié)AL

50設(shè)(AX)=1020H低地址存儲(chǔ)區(qū)(SS段)執(zhí)行前(AX)=1020(SP)存儲(chǔ)區(qū)(SS段)進(jìn)棧方向執(zhí)行后2010(AL)(AH)PUSHAX指令執(zhí)行示意圖(SP)-2(SP)高地址低地址高地址(SP)-151

②彈出指令

POP dest例:POP BX ;將棧頂內(nèi)容彈至BX

執(zhí)行操作:(BL)←(SP)

(BH)←(SP)+1

(SP)←(SP)+252低地址存儲(chǔ)區(qū)(SS段)出棧方向執(zhí)行前2010POPBX指令執(zhí)行示意圖(SP)存儲(chǔ)區(qū)(SS段)執(zhí)行后(BX)=1020(SP)(SP)+1(SP)+2BX2010高地址低地址高地址53堆棧指令使用時(shí)應(yīng)注意幾點(diǎn):①堆棧操作總是按字進(jìn)行②不能從棧頂彈出一個(gè)字給CS③堆棧指針為SS:SP,SP永遠(yuǎn)指向棧頂④SP自動(dòng)進(jìn)行增減量(-2,+2)54格式:XCHGreg,mem/reg功能:交換兩操作數(shù)的內(nèi)容。要求:兩操作數(shù)中必須有一個(gè)在寄存器中;操作數(shù)不能為段寄存器和立即數(shù);源和目地操作數(shù)類型要一致。舉例:

XCHG AX,BXXCHG [2000],CL(3)交換指令XCHG55(4)查表轉(zhuǎn)換指令XLAT功能:AL←[(BX)+(AL)]根據(jù)表項(xiàng)序號(hào)查出表中對(duì)應(yīng)代碼的內(nèi)容表的首地址(偏移地址)送到BX中表項(xiàng)序號(hào)存于AL中。

例3-15:內(nèi)存數(shù)據(jù)段有一張16進(jìn)制數(shù)的ASCII碼表,設(shè)首地址為2000H,如欲查出表中第11個(gè)代碼(代碼序號(hào)從0開始)即十六進(jìn)制數(shù)B的ASCII碼。ASCII表在DS段中,并假設(shè)首地址為HEX。‘’56303132...394142...4546...HEX+0HEX+11‘0’‘1’‘2’‘9’‘A’‘B’‘E’‘F’十六進(jìn)制數(shù)ASCII碼表存儲(chǔ)器57可用如下幾條指令實(shí)現(xiàn):LEABX,HEX;(BX)←表首地址MOVAL,0BH;(AL)←序號(hào)XALT;查表轉(zhuǎn)換執(zhí)行后得到:(AL)=42H=’B’注意:轉(zhuǎn)換表長度最大為256個(gè)表項(xiàng)(字節(jié))。58(5)字位擴(kuò)展指令格式:CBW;把AL的符號(hào)位復(fù)制到AHCWD;把AX的符號(hào)位復(fù)制到DX用途:用于有符號(hào)數(shù)的除法。說明:CBW(1)當(dāng)(AL)為正時(shí),則(AH)=00H(2)當(dāng)(AL)為負(fù)時(shí),則(AH)=FFHCWD(1)當(dāng)(AX)為正時(shí),則(DX)=0000H(2)當(dāng)(AX)為負(fù)時(shí),則(DX)=FFFFH例:(AL)=A7H,則執(zhí)行CBW后,AH的內(nèi)容為FFH。592.輸入輸出(I/O)指令例:INAL,80H;(AL)←(80H端口)

MOVDX,1234H

INAL,DX;(AL)←(1234H端口)只限于用累加器AL或AX來傳送信息。功能:(累加器)←→I/O端口(1)輸入指令I(lǐng)N

INAL,n;從8位的端口號(hào)輸入一個(gè)字節(jié)給ALINAX,n;從8位的端口號(hào)輸入一個(gè)字給AXINAL,DX;從16位的端口號(hào)輸入一字節(jié)給ALINAX,DX;從16位的端口號(hào)輸入一個(gè)字給AX60在使用間接尋址的IN/OUT指令時(shí),要事先用傳送指令把I/O端口號(hào)設(shè)置到DX寄存器,如:

MOVDX,220HINAL,DX;將220H端口內(nèi)容讀入AL(2)輸出指令OUT

OUTn,AL;將一個(gè)字節(jié)輸出到8位的端口地址

OUTn,AX;將一個(gè)字輸出到8位的端口地址

OUTDX,AL;將一個(gè)字節(jié)輸出到16位的端口地址

OUTDX,AX;將一個(gè)字輸出到16位的端口地址例:OUT68H,AX;(69H,68H)←(AX)

OUTDX,AL;((DX))←(AL)61要求:

1)源操作數(shù)必須是一個(gè)存儲(chǔ)器操作數(shù);

2)目的操作數(shù)必須是一個(gè)16位的通用(間址)寄存器。3.地址傳送指令用途:用于傳送操作數(shù)的地址傳送偏移地址格式:LEAreg,mem;將指定內(nèi)存單元的偏移地址送到指定寄存器傳送地址指針格式:LDSreg,mem32;DS:reg←(mem開始的四個(gè)內(nèi)存單元的內(nèi)容)

LESreg,mem32;同上,但DS改為ES62注意以下二條指令差別:

LEABX,BUFFER

MOVBX,BUFFER前者表示將符號(hào)地址為BUFFER的存儲(chǔ)單元的偏移地址取到

BX中;后者表示將BUFFER存儲(chǔ)單元中的內(nèi)容取到

BX中.例3-22LEA BX,[BX+50H]

MOV

BX,[BX+50H]63下面兩條指令等效:

LEABX,BUFFERMOVBX,OFFSETBUFFER其中OFFSETBUFFER表示存儲(chǔ)器單元BUFFER的偏移地址。二者都可用于取存儲(chǔ)器單元的偏移地址,但LEA指令可以取動(dòng)態(tài)的地址,OFFSET只能取靜態(tài)的地址。644.標(biāo)志傳送指令(1)讀標(biāo)志指令LAHF

LAHF把標(biāo)志寄存器低8位中的5個(gè)標(biāo)志位傳送到AH中的指定位:OFDFIFTFSFZFAFPFCFAHFLAG65(2)設(shè)置標(biāo)志指令SAHF

SAHF的功能與LAHF的功能相反:OFDFIFTFSFZFAFPFCFAHFLAG66

執(zhí)行的操作:(SP)-1←標(biāo)志寄存器高8位

(SP)-2←標(biāo)志寄存器低8位

(SP)←(SP)-2(4)從棧頂彈出標(biāo)志寄存器指令POPF

執(zhí)行的操作:標(biāo)志寄存器低8位←(SP)

標(biāo)志寄存器高8位←(SP)+1

(SP)←(SP)+2PUSHF和POPF指令用于保護(hù)和恢復(fù)標(biāo)志寄存器內(nèi)容。(3)把標(biāo)志寄存器推入棧頂指令PUSHF67例如:

PUSH AXPUSH CX

PUSHF;保護(hù)標(biāo)志寄存器內(nèi)容

;這段程序要用到AX,CX以及標(biāo)志位

POPF ;恢復(fù)標(biāo)志寄存器內(nèi)容

POP CXPOP AX...68數(shù)據(jù)傳送指令中,除SAHF和POPF這兩條指令外,其余所有指令均不影響標(biāo)志位。69二.算術(shù)運(yùn)算指令1.加法指令2.減法指令

3.乘法指令4.除法指令70算術(shù)運(yùn)算的溢出問題

算術(shù)運(yùn)算涉及兩種類型數(shù)據(jù):無符號(hào)數(shù)和有符號(hào)數(shù)。對(duì)加減法指令,并不區(qū)分無符號(hào)數(shù)和有符號(hào)數(shù),但:參加的操作數(shù)必須同是無符號(hào)數(shù)或同是有符號(hào)數(shù)。無符號(hào)數(shù)和有符號(hào)數(shù)的運(yùn)算結(jié)果是否溢出,判斷方法是不同的。71CF標(biāo)志可用來表示無符號(hào)數(shù)的溢出,OF標(biāo)志可用來表示有符號(hào)數(shù)的溢出。有符號(hào)數(shù)的溢出是一種出錯(cuò)狀態(tài),在運(yùn)算過程中應(yīng)當(dāng)避免。72(1)不帶進(jìn)位的加法指令A(yù)DD

格式:ADD OPD1,OPD2

操作:(OPD1)(OPD1)+(OPD2)

說明:兩操作數(shù)不能同時(shí)為mem且不能是段寄存器

實(shí)例:

ADD AL,30HADD SI,[BX+20H] ADD CX,SI ADD [DI],200H1.加法指令73

7EH=01111110

+5BH=01011011

11011001

結(jié)果:CF=0,ZF=0,PF=0,AF=1,OF=1,SF=1ADD指令對(duì)6個(gè)狀態(tài)標(biāo)志均產(chǎn)生影響例3-24:MOVAL,7EH

ADDAL,5BH74(2)帶進(jìn)位位的加法指令A(yù)DC格式:ADCOPD1,OPD2操作:(OPD1)(OPD1)+(OPD2)+CF相加時(shí)要包括進(jìn)位標(biāo)志CF的內(nèi)容,例如:

ADCAL,68H;AL←(AL)+68H+(CF) ADCAX,CX;AX←(AX)+(CX)+(CF)ADCBX,[DI];BX←(BX)+[DI+1][DI]+(CF)75例3-26求兩個(gè)4字節(jié)的無符號(hào)數(shù)的和

0107A379H+10067E4FH=?設(shè)被加數(shù)、加數(shù)分別存放在BUFFER1及BUFFER2開始的兩個(gè)存儲(chǔ)區(qū)內(nèi),結(jié)果放回BUFFER1存儲(chǔ)區(qū)。(與書方法不同,見下頁圖)

因CPU只能進(jìn)行8位或16位的加法運(yùn)算,為此可將兩數(shù)分成低字和高字分別相加。ADC指令用于多字節(jié)加法運(yùn)算中76多字節(jié)加法示意圖A3H79H10H06HBUFFER1BUFFER201H07H7EH4FH被加數(shù)加數(shù)數(shù)據(jù)段......77程序段如下:

MOVAX,BUFFER2 ADDBUFFER1,AX

;低字相加

MOVAX,BUFFER2+2 ADCBUFFER1+2,AX;高字相加,

;包括低字的進(jìn)位78格式:INCreg/mem功能:類似于C語言中的++操作:對(duì)指定的操作數(shù)加1例:INCALINCSIINCBYTEPTR[BX+4]注:本指令不影響CF標(biāo)志。(3)加1指令I(lǐng)NC(單操作數(shù)指令)79ADD/ADC對(duì)條件標(biāo)志位的影響CF位表示無符號(hào)數(shù)相加的溢出。OF位表示帶符號(hào)數(shù)相加的溢出。1結(jié)果為負(fù)0否則SF=1結(jié)果為00否則ZF=1和的最高有效位有向高位的進(jìn)位0否則CF=1兩個(gè)操作數(shù)符號(hào)相同,而結(jié)果符號(hào)與之相反0否則OF=80例:

SUBAL,60HSUB[BX+20H],DXSUBAX,CX2.減法指令(1)不考慮借位的減法指令SUB

格式:

SUB

OPD1,OPD2

操作:OPD1←(OPD1)-(OPD2)1.源和目的操作數(shù)不能同時(shí)為存儲(chǔ)器操作數(shù)2.立即數(shù)不能作為目的操作數(shù)81SBB指令主要用于多字節(jié)的減法格式:

SBBOPD1,OPD2操作:OPD1←(OPD1)-(OPD2)-CF例:

SBBAX,CXSBBWORDPTR[SI],2080HSBB[SI],DX(2)考慮借位的減法指令SBB82例:x、y、z均為32位數(shù),分別存放在地址為X,X+2;Y,Y+2;Z,Z+2的存儲(chǔ)單元中,用指令序列實(shí)現(xiàn)w

x+y+24-z,結(jié)果放在W,W+2單元中。

MOVAX,XMOVDX,X+2ADDAX,YADCDX,Y+2;x+yADDAX,24ADCDX,0;x+y+24

SUBAX,ZSBBDX,Z+2;x+y+24-zMOVW,AXMOVW+2,DX;結(jié)果存入W,W+2單元83作用類似于C語言中的子“--”操作符。格式:DECopr 操作:opr←(opr)-1例:

DECCLDECBYTEPTR[DI+2]DECSI(3)減1指令DEC84例:若(AL)=0FCH,則執(zhí)行NEGAL 后,

(AL)=04H,CF=10FCH為-4的補(bǔ)碼,執(zhí)行求補(bǔ)指令后,即得到4(-4的絕對(duì)值)。(4)求補(bǔ)指令NEG格式:NEGopr操作:opr←0-(opr)對(duì)一個(gè)操作數(shù)取補(bǔ)碼相當(dāng)于用0減去此操作數(shù),故利用NEG指令可得到負(fù)數(shù)的絕對(duì)值。85SUB/SBB對(duì)標(biāo)志位(CF/OF/ZF/SF)的影響

CF=1表示無符號(hào)數(shù)減法溢出。

OF=1表示帶符號(hào)數(shù)減法溢出。NEG指令對(duì)CF/OF的影響:

CF:操作數(shù)為0時(shí),求補(bǔ)的結(jié)果使CF=0,否則CF=1。

OF:字節(jié)運(yùn)算對(duì)-128求補(bǔ)或字運(yùn)算對(duì)-32768求補(bǔ)時(shí)OF=1,

否則OF=0。1被減數(shù)的最高有效位有向高位的借位0否則CF=1兩個(gè)操作數(shù)符號(hào)相反,而結(jié)果的符號(hào)與減數(shù)相同0否則OF=86例:

CMPAL,0AHCMPCX,SICMPDI,[BX+03](5)比較指令CMP格式:CMPdest,src操作:(dest)-(src)結(jié)果不送目標(biāo)操作數(shù),其結(jié)果只反映在標(biāo)志位上。比較指令在使用時(shí),一般在其后緊跟一條條件轉(zhuǎn)移指令,判斷比較結(jié)果的轉(zhuǎn)向。87根據(jù)標(biāo)志位來判斷比較的結(jié)果②比較的是兩個(gè)有符號(hào)數(shù)若OF⊕SF=0,則dest>src;

若OF⊕SF=1,則dest<src。1)根據(jù)ZF判斷兩個(gè)數(shù)是否相等。若ZF=1,則兩數(shù)相等。2)若兩個(gè)數(shù)不相等,則分兩種情況考慮:①比較的是兩個(gè)無符號(hào)數(shù)若CF=0,則dest>src;

若CF=1,則dest<src。88例:比較AL、BL、CL中帶符號(hào)數(shù)的大小,將最小數(shù)放在AL中。

CMPAL,BL;AL和BL比較

JNG

BBB

;若AL≤BL,則轉(zhuǎn)

XCHGAL,BL;若AL>BL,則交換

BBB:CMPAL,CL;AL和CL比較

JNG

CCC;若AL≤CL,則轉(zhuǎn)

XCHGAL,CL;若AL>CL,則交換

CCC:HLT89(1)無符號(hào)數(shù)的乘法指令MUL(MEM/REG)格式:MULsrc操作:字節(jié)操作數(shù)(AX)

(AL)×(src)

字操作數(shù)(DX,AX)

(AX)×(src)3.乘法指令8位*8位→16位乘積 16位*16位→32位乘積MULBL;(AL)×(BL),乘積在AX中

MULCX;(AX)×(CX),乘積在DX,AX中

MULBYTEPTR[BX]MULAX;錯(cuò)90格式與MUL指令類似,只是要求兩操作數(shù)均為有符號(hào)數(shù)。例:

IMULBL;(AX)←(AL)×(BL)IMULWORDPTR[SI]

;(DX,AX)←(AX)×([SI+1][SI])

(2)有符號(hào)數(shù)乘法指令I(lǐng)MUL注意:MUL/IMUL指令中

●AL(AX)為隱含的乘數(shù)寄存器;

●AX(DX,AX)為隱含的乘積寄存器;

SRC不能為立即數(shù);

●除CF和OF外,對(duì)其它標(biāo)志位無定義。91乘法指令對(duì)CF/OF的影響:00乘積的高一半為零11否則MUL指令:CF/OF=00乘積的高一半是低一半的符號(hào)擴(kuò)展11否則

IMUL指令:CF/OF=924.除法指令

被除數(shù) 商 余數(shù)字節(jié)除法AX AL AH

字除法 DX:AX AX DX16位/8位→8位商 32位/16位→16位商93格式:DIVsrc操作:字節(jié)操作(AL)

(AX)/(SRC)的商

(AH)

(AX)/(SRC)的余數(shù)字操作(AX)

(DX,AX)/(SRC)的商

(DX)

(DX,AX)/(SRC)的余數(shù)例:

DIVCLDIVWORDPTR[BX]注:若除數(shù)為零或AL中商大于FFH,(或AX中商大于FFFFH),則CPU產(chǎn)生一個(gè)類型0的內(nèi)部中斷。(1)無符號(hào)數(shù)除法指令DIV94(2)有符號(hào)數(shù)除法指令I(lǐng)DIV注意:對(duì)于DIV/IDIV指令

AX(DX,AX)為隱含的被除數(shù)寄存器。

AL(AX)為隱含的商寄存器。

AH(DX)為隱含的余數(shù)寄存器。

src不能為立即數(shù)。

對(duì)所有條件標(biāo)志位均無定義。格式:IDIVsrc操作與DIV類似。商及余數(shù)均為有符號(hào)數(shù),且余數(shù)符號(hào)總是與被除數(shù)符號(hào)相同。95除法運(yùn)算要求被除數(shù)字長是除數(shù)字長的兩倍,若不滿足則需對(duì)被除數(shù)進(jìn)行擴(kuò)展,否則產(chǎn)生錯(cuò)誤。對(duì)于無符號(hào)數(shù)除法擴(kuò)展,只需將AH或DX清零即可。對(duì)有符號(hào)數(shù)而言,則是符號(hào)位的擴(kuò)展。可使用前面介紹過的符號(hào)擴(kuò)展指令CBW和CWD關(guān)于除法操作中的字長擴(kuò)展問題96例:寫出34H÷25H的程序段。

MOVAL,34HMOVBL,25HCBW;AL的符號(hào)擴(kuò)展到AHDIVBL;0034H÷25H,結(jié)果為

;(AH)=0FH,(AL)=01HP123例3-29975.BCD碼運(yùn)算的十進(jìn)制調(diào)整指令專用于對(duì)BCD碼運(yùn)算的結(jié)果進(jìn)行調(diào)整DAA、AAA、DAS、AAS、AAM、AAD均為隱含尋址,隱含的操作數(shù)為AL和AH為何要對(duì)BCD碼的運(yùn)算結(jié)果進(jìn)行調(diào)整?

BCD碼本質(zhì)上是十進(jìn)制數(shù),即應(yīng)遵循逢十進(jìn)一的規(guī)則。而計(jì)算機(jī)是按二進(jìn)制(十六進(jìn)制)進(jìn)行運(yùn)算,并未按十進(jìn)制規(guī)則進(jìn)行運(yùn)算。981)加法的十進(jìn)制調(diào)整指令(1)非壓縮BCD碼加法調(diào)整AAAAAA指令只影響AF和CF,其余標(biāo)志無定義AAA指令應(yīng)緊跟在ADD或ADC指令之后。如果AL的低4位>9∨AF=1,則:

①AL←(AL)+6,(AH)←(AH)+1,AF←1②AL←((AL)∧0FH)③CF←AF

否則AL←(AL)∧0FH99調(diào)整原理:計(jì)算8+900001000

+0000100100010001=11

這個(gè)1代表了16,而實(shí)際上僅應(yīng)為10,即多進(jìn)了6,個(gè)位就會(huì)少6,這就要進(jìn)行加6調(diào)正。當(dāng)?shù)?位的結(jié)果>9(即A~F之間)時(shí),也應(yīng)進(jìn)行加6調(diào)正。原因是逢十沒有進(jìn)位,故用加6的方法強(qiáng)行產(chǎn)生進(jìn)位。100例2:有兩個(gè)字符串形式的十進(jìn)制數(shù),2658和

3619,求二者之和。即2658+3619=?由題意知,被加數(shù)和加數(shù)的每一位都以ASCII碼形式存放在內(nèi)存中。假定二數(shù)在內(nèi)存中均是低位在前,高位在后,另留出5個(gè)單元存放相加的結(jié)果。內(nèi)存中數(shù)據(jù)存放形式:10136H32H39H31HSTRING1STRING238H35H36H33H被加數(shù)加數(shù)數(shù)據(jù)段‘8’‘5’‘6’‘2’‘9’‘1’‘6’‘3’SUM結(jié)果......102程序段為:

LEASI,STRING1;STRING1偏移地址送SILEADI,STRING2;STRING2偏移地址送DI

LEABX,SUM;SUM偏移地址送BXMOVCX,4;循環(huán)4次

CLC

;清進(jìn)位標(biāo)志AGAIN:MOVAL,[SI]ADCAL,[DI];帶進(jìn)位加

AAA

;未壓縮BCD碼調(diào)正

MOV[BX],AL

;結(jié)果存入SUMINCSI;調(diào)整指針

INCDIINCBXDECCX;循環(huán)計(jì)數(shù)器減1

JNZAGAIN;若未處理完,則轉(zhuǎn)AGAIN103用AAA指令也可對(duì)字符串形式的十進(jìn)制數(shù)加法進(jìn)行調(diào)整,所以它又被稱為加法的ASCII調(diào)正指令。為什么AAA指令既可對(duì)非壓縮BCD碼加法進(jìn)行調(diào)整,也可對(duì)ASCII碼形式的十進(jìn)制數(shù)進(jìn)行調(diào)整?AAA指令的第②步104(2)壓縮BCD碼加法調(diào)整DAA兩個(gè)壓縮BCD碼相加結(jié)果在AL中,通過DAA調(diào)整得到一個(gè)正確的壓縮BCD碼.指令操作(調(diào)整方法):若AL的低4位>9∨AF=1

則(AL)←(AL)+6,AF←1

若AL的高4位>9∨CF=1

則(AL)←(AL)+60H,CF←1除OF外,DAA指令影響所有其它標(biāo)志。DAA指令應(yīng)緊跟在ADD或ADC指令之后。105例3-30

0100100048H

MOVAL,48H

+00100111

27H

MOVBL,27H011011116FHADDAL,BL

+00000110

06H

DAA

01110101

75H106(1)非壓縮BCD碼減法的十進(jìn)制調(diào)正指令A(yù)AS對(duì)AL中由兩個(gè)非壓縮的BCD碼相減的結(jié)果進(jìn)行調(diào)整。調(diào)整操作為:若AL的低4位>9或AF=1,則:

①AL←(AL)-6,AH←(AH)-1,AF←1②AL←(AL)∧0FH③CF←AF

否則:AL←(AL)∧0FH2)減法的十進(jìn)制調(diào)整指令107(2)壓縮BCD碼減法的十進(jìn)制調(diào)正指令DAS

對(duì)AL中由兩個(gè)壓縮BCD碼相減的結(jié)果進(jìn)行調(diào)整。調(diào)整操作為:

若AL的低4位>9∨AF=1,則:

AL←(AL)-6,且AF←1

若AL的高4位>9∨CF=1,則:

AL←(AL)-60H,且CF←1

DAS對(duì)OF無定義,但影響其余標(biāo)志位。DAS指令要求跟在減法指令之后。1083)乘法的十進(jìn)制調(diào)正指令A(yù)AM對(duì)AX中由兩個(gè)非壓縮BCD碼相乘的結(jié)果進(jìn)行調(diào)整。調(diào)整操作為:

(AL)/0AH,(AH)←商,(AL)←余數(shù)隱含的操作寄存器為AL和AH;AAM跟在MUL指令之后使用;影響標(biāo)志位PF、SF、ZF,其它無定義;用AAM可實(shí)現(xiàn)≤99的二-十進(jìn)制轉(zhuǎn)換。109例3-32按十進(jìn)制乘法計(jì)算7×9=?

MOV AL,07H ;(AL)=07H MOV BL,09H ;(BL)=09H MUL BL ;(AX)=003FH AAM ;(AH)=06H,(AL)=03H

所得結(jié)果為非壓縮的BCD碼。例:把3AH轉(zhuǎn)換成等值的十進(jìn)制數(shù)。

MOVAL,3AH;58AAM;(AH)=05H,(AL)=08H1104)除法的十進(jìn)制調(diào)正指令A(yù)AD對(duì)非壓縮BCD除法運(yùn)算進(jìn)行調(diào)整。調(diào)整操作為:

(AL)←(AH)×0AH+(AL)AH←0隱含的操作寄存器為AH,AL;AAD要在DIV指令之前使用;影響標(biāo)志位PF、SF、ZF,其它無定義;用AAD可實(shí)現(xiàn)≤99的十-二進(jìn)制轉(zhuǎn)換。111例3-33按十進(jìn)制除法計(jì)算55÷7=?

MOV AX,0505H ;(AX)=55BCD MOV CL,07H ;(CL)=7 AAD ;(AX)=0037H DIV CL ;(AH)=6,(AL)=7

所得結(jié)果為非壓縮的BCD碼(商7余6)。例2:把73轉(zhuǎn)換成等值的二進(jìn)制數(shù)。

MOVAX,0703H;(AX)=73BCDAAD;(AX)=0049H112三.邏輯運(yùn)算和移位指令邏輯運(yùn)算指令●運(yùn)算規(guī)則:按位操作,無進(jìn)/借位

●對(duì)標(biāo)志位的影響(除NOT指令外):

CFOFSFZFPFAF

00***無定義

根據(jù)運(yùn)算結(jié)果設(shè)置113(1)邏輯“與”AND例1:保留AL中低4位,高4位清0。

ANDAL,0FH例2:AL中有字符’a’~’z’,將其轉(zhuǎn)換成大寫。

ANDAL,01011111B例3:使AX的C和F標(biāo)志位清0

ANDAX,AX對(duì)兩個(gè)操作數(shù)進(jìn)行按位邏輯“與”操作。格式:ANDdest,src用途:保留操作數(shù)的某幾位,清零其他位。AX88114例4:測試AL的bit7,bit5,bit2是否都是1。

ANDAL,10100100B CMPAL,10100100BJZYES<notall1>

…YES:115對(duì)兩個(gè)操作數(shù)進(jìn)行按位邏輯”或”操作。格式:ORdest,src用途:對(duì)操作數(shù)的某幾位置1;對(duì)兩操作數(shù)進(jìn)行組合。(2)邏輯“或”O(jiān)R例1:ORAL,30H例2:ORAX,00FFH例3:把AL的第5位置為1ORAL,00100000B116對(duì)操作數(shù)進(jìn)行按位邏輯“非”操作。格式:NOTmem/regNOT指令對(duì)標(biāo)志位無影響例:NOTCXNOTBYTEPTR[DI](3)邏輯“非”(取反)NOT117對(duì)兩個(gè)操作數(shù)按位進(jìn)行”異或”操作。格式:XORdest,src用途:對(duì)reg清零(自身異或)

把reg/mem的某幾位變反(與’1’異或)(4)邏輯“異或”XOR

例1:把AX寄存器清零。

①M(fèi)OVAX,0②XORAX,AX③ANDAX,0④SUBAX,AX例2:把DH的bit4,3變反

XORDH,00011000B即:XORDH,18H118操作與AND指令類似,但不將”與”的結(jié)果送回,只影響標(biāo)志位。TEST指令常用于位測試,與條件轉(zhuǎn)移指令一起用例:測試AL的內(nèi)容是否為負(fù)數(shù)。

TESTAL,80H;檢查AL中D7=1?

JNZMINUS;是1(負(fù)數(shù)),轉(zhuǎn)MINUS

;否則為正數(shù)MINUS:(5)測試指令TEST1192.移位指令(1)非循環(huán)移位指令算術(shù)左移指令SAL(ShiftArithmeticLeft)

算術(shù)右移指令SAR(ShiftArithmeticRight)

邏輯左移指令SHL(ShiftLeft)

邏輯右移指令SHR(ShiftRight)這4條指令的格式相同,以SAL為例:

SALmem/reg,CL;移位位數(shù)大于1時(shí)1;移位位數(shù)等于1時(shí)!例:MOVCL,4SALAL,CL120移位指令執(zhí)行的操作示意:最低位最高位CF0(a)算術(shù)/邏輯左移SAL/SHL最低位最高位CF(b)算術(shù)右移SAR最低位最高位CF(c)邏輯右移SHR0121結(jié)果未溢出時(shí):左移1位≡操作數(shù)*2

右移1位≡操作數(shù)/2

算術(shù)移位——把操作數(shù)看做有符號(hào)數(shù);邏輯移位——把操作數(shù)看做無符號(hào)數(shù)。

影響C,P,S,Z,O標(biāo)志122例:把AL中的數(shù)x乘10

10=8+2=23+21 SALAL,1;2x MOVAH,AL;暫存,作為加數(shù)

MOVCL,2 SALAL,CL;8xADDAL,AH;8x+2x=10x例3-37P130123

不含進(jìn)位位的循環(huán)左移指令ROL

不含進(jìn)位位的循環(huán)右移指令ROR

含進(jìn)位位的循環(huán)左移指令RCL

含進(jìn)位位的循環(huán)右移指令RCR格式同非循環(huán)移位指令。移位位數(shù)放在CL寄存器中,如果只移1位,也可以直接寫在指令中。循環(huán)移位指令只影響標(biāo)志位CF和OF。(2)循環(huán)移位指令124這4條指令的功能如下圖示:最低位最高位CF(a)ROL最低位最高位CF(c)RCL最低位最高位CF(b)ROR最低位最高位CF(d)RCR125例:前例中計(jì)算x*10。(1)采用乘法指令:

MOV BL,10MUL BL

共需70~77個(gè)T周期。(2)采用移位和加法指令:

SAL AL,1;2TMOV AH,AL;2TSAL AL,1;2TSAL AL,1;2TADD AL,AH;3T

只需11個(gè)T周期,僅相當(dāng)于乘法的1/7。用移位操作代替乘除法可提高運(yùn)算速度126循環(huán)移位舉例例2:將連續(xù)兩個(gè)內(nèi)存單元中的操作數(shù)帶進(jìn)位位循環(huán)右移1位

RCRWORDPTR[SI],1例1:將AL的高4位與低4位互換。

MOVCL,4ROLAL,CL127四.串操作指令串:順序放在內(nèi)存中的一組相同類型的數(shù)據(jù)。串操作:對(duì)串中的元素進(jìn)行相同的操作。串操作的尋址方式:源操作數(shù)指針———DS:SI(DS可超越)

目的操作數(shù)指針——ES:DI每次串操作后:串操作指令自動(dòng)修改SI和DI——字節(jié)±1,字±2。DF標(biāo)志決定±。注意:退出串操作后,指針指向最后操作的元素的下一個(gè)元素。128

可完成存儲(chǔ)單元到存儲(chǔ)單元的傳送、比較有的串操作指令前面可加重復(fù)前綴當(dāng)使用重復(fù)前綴時(shí),操作重復(fù)次數(shù)由CX決定(CX自動(dòng)減量)。該指令重復(fù)執(zhí)行,直至(CX)=0。執(zhí)行串指令的設(shè)置(初始化)源串首地址(末地址)→SI目的串首地址(末地址)→DI串長度→CX建立方向標(biāo)志(CLD使DF=0,STD使DF=1)

129重復(fù)前綴REP:無條件重復(fù)前綴-----(CX)≠0時(shí)重復(fù)格式:REP

串指令執(zhí)行:(1)若(CX)=0則退出REP,否則執(zhí)行(2)(2)(CX)(CX)-1(3)執(zhí)行串指令

(4)重復(fù)(1)~(3)130REPE/REPZ:相等/為零時(shí)重復(fù)

(ZF)=1且(CX)≠0時(shí)重復(fù)格式:REPE/REPZ

串指令執(zhí)行:(1)若(CX)=0或ZF=0則退出循環(huán),否則執(zhí)行(2)(2)(CX)(CX)-1(3)執(zhí)行串指令

(4)重復(fù)(1)~(3)REPE/REPZ與CMPS配合實(shí)現(xiàn)串比較REPNE/REPNZ:不相等/不為零時(shí)重復(fù)

(ZF)=0且(CX)≠0時(shí)重復(fù)退出條件為ZF=1或(CX)=0,其余與REPE/REPZ相同該指令與SCAS配合實(shí)現(xiàn)字符查找131指令也可寫成:MOVSdest,src但要求:

①src用DS:SI尋址,dest用ES:DI尋址②傳送是字節(jié)還是字,由操作數(shù)的類型決定⒈串傳送指令MOVSB/MOVSW指令執(zhí)行的操作為:MOVSB:((ES):(DI))←((DS):(SI))SI±1,DI±1

MOVSW:((ES):(DI+1)(DI))←((DS):(SI+1)(SI))SI±2,DI±2

132例3-41將2000:1200地址開始的100個(gè)字節(jié)傳送到6000:0000開始的內(nèi)存單元

MOVAX,2000 MOVDS,AX MOVAX,6000 MOVES,AX

MOVSI,1200 MOVDI,0 MOVCX,100 CLD REPMOVSB …133⒉串比較指令CMPSB/CMPSWCMPSB:((DS):(SI))-((ES):(DI))

SI±1,DI±1CMPSW:((DS):(SI+1)(SI))-((ES):(DI+1)(DI))

SI±2,DI±2指令也可寫成:CMPSdest,src比較的結(jié)果只反映在標(biāo)志位上,串本身無變化。本指令可用來檢查兩個(gè)串是否相等。134例3-42比較兩個(gè)字符串是否相同,并找出其中第一個(gè)不相等字符的地址,將該地址送BX,不相等字符送AL,兩個(gè)字符串的長度均為200B,M1為源串首地址,M2為目標(biāo)串首地址

LEASI,M1

LEADI,M2

MOVCX,200CLDREPECMPSBJZSTOP

DECSIMOVBX,SIMOVAL,[SI]STOP:HLT

135⒊串掃描SCASB/SCASW搜索指令執(zhí)行的仍是比較(減法)操作,結(jié)果只影響標(biāo)志位。要搜索的關(guān)鍵字放在AL(字節(jié))或AX(字)中。本指令用于在串中查找指定的信息。對(duì)字節(jié):(AL)-((ES):(DI))

DI±1

對(duì)字:(AX)-((ES):(DI+1)(DI))

DI±2136SCAS指令加上重復(fù)前綴后,可對(duì)串進(jìn)行連續(xù)掃描比較:若前綴為REPZ,則表示比較結(jié)果相等(ZF=1)且串未結(jié)束(CX≠0),則繼續(xù)比較。若前綴為REPNZ,則表示比較結(jié)果不相等(ZF=0)且串未結(jié)束(CX≠0)就繼續(xù)比較。137例3-43在ES段的偏移2000H開始處存有10個(gè)ASCII碼。搜索’A’,若找到則記下搜索次數(shù)及存放地址,并在屏幕上顯示’Y’;若未找到則顯示’N’。2000H414243444546’A’’B’’C’’D’’F’...ES段’E’

在屏幕上顯示一個(gè)字符的指令段如下

(參見附錄C.3)MOVDL,<字符>

MOVAH,2;單字符顯示的功能號(hào)

INT21H;系統(tǒng)功能調(diào)用138

MOVDI,2000H

;(DI)←串偏移地址

MOVCX,0AH

;(CX)←串長度

MOVAL,‘A’

;搜索關(guān)鍵字=‘A’

CLD

;從低地址到高地址進(jìn)行搜索

REPNZSCASB;若未找到,繼續(xù)搜索

JZFOUND;找到,轉(zhuǎn)FOUNDMOVDL,’N’;串中無‘A’JMPDONE;轉(zhuǎn)DONEFOUND:DECDI;(DI)-1MOVDATA2,DI;DATA2←‘A’的地址

SUBDI,2000HMOVDATA1,DI;DATA1←搜索次數(shù)

溫馨提示

  • 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)論