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

下載本文檔

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

文檔簡介

會計(jì)學(xué)1的尋址方式和指令系統(tǒng)23-18086的尋址方式指令由操作碼和操作數(shù)兩部分組成

操作碼:指出所要執(zhí)行的操作(操作的性質(zhì))

操作數(shù):指出所需的操作數(shù)據(jù)(操作的對象)根據(jù)操作數(shù)的個(gè)數(shù),指令可分為:

①雙操作數(shù)指令:前者為目的操作數(shù),后者為源操作數(shù)

②單操作數(shù)指令:只有一個(gè)操作數(shù):如NOT,INC等有兩個(gè)操作數(shù),隱含其中一個(gè):

如PUSH,POP等③無操作數(shù)指令:沒有操作數(shù):NOP

隱含一個(gè)操作數(shù):CLI,CLD等第1頁/共118頁3根據(jù)操作數(shù)的來源,可分為:

①立即數(shù):數(shù)據(jù)直接放在指令代碼中

②寄存器操作數(shù):存放在CPU內(nèi)部的寄存器中

③存儲器操作數(shù):存放在內(nèi)部存儲器中(絕大部分情況)

④I/O端口操作數(shù):存放在接口電路的寄存器中(適用于IN/OUT指令)指令中的操作數(shù)部分可以是操作數(shù)本身,也可以是操作數(shù)地址或地址的一部分,還可以是指向操作數(shù)地址的指針或其他有關(guān)操作數(shù)的信息。第2頁/共118頁4尋址方式:指令中說明操作數(shù)所在地址的方法。尋址方式的多少反映了尋找操作數(shù)的靈活程度,尋址方式越多,則計(jì)算機(jī)的功能越強(qiáng),靈活性也越大,能更有效地處理各種數(shù)據(jù)。執(zhí)行速度最快的兩種尋址為寄存器尋址和立即數(shù)尋址。8086中主要的七種尋址方式如下:(與數(shù)據(jù)有關(guān)的尋址方式)第3頁/共118頁51、立即尋址方式(ImmediateAddressing)

操作數(shù)就在指令中,常用來給寄存器賦初值。如:MOVAX,2000HMOVBL,12H

第4頁/共118頁6注:a、立即數(shù)只能作源,不能作目的

MOV2000H,AX非法。b、若16進(jìn)制立即數(shù)以A~F打頭,為區(qū)別其他符號名,應(yīng)在前面加數(shù)字0,因符號名的命名規(guī)則為第一個(gè)字符不能為數(shù)字。如:MOVAX,0F123Hc、若用等值偽指令EQU定義的為符號常量名,如:COUNTEQU100MOVAX,COUNT

此處COUNT即為立即尋址。第5頁/共118頁72、寄存器尋址方式(RegisterAddressing)

操作數(shù)在指定的寄存器中因寄存器位于CPU內(nèi)部,其執(zhí)行速度最高。如:MOVAX,BXMOVAL,BL注:源和目的的長度應(yīng)一致。第6頁/共118頁8下面五種(3~7)屬于存儲器尋址,由于操作數(shù)來自內(nèi)存中,要耗用總線周期才能訪問到,故執(zhí)行速度較前兩種尋址方式要慢。要尋找到存儲器操作數(shù),必須提供完整的邏輯地址(段基址:偏移地址),而指令中一般只提供偏移地址(又稱為有效地址EA),段基址的來源只需參考段寄存器與偏移地址寄存器的基本約定,或用段超越前綴提供。兩者疊加算出物理地址PA(PhysicalAddress)。根據(jù)有效地址EA(EffectiveAddress)的構(gòu)成方式,存儲器尋址分為以下五種:第7頁/共118頁9段寄存器使用的基本約定

第8頁/共118頁103、直接尋址方式(DirectAddressing)EA就在指令中,默認(rèn)段寄存器為DS如:MOVAX,[2000H]設(shè)DS=3000H則EA=2000H,PA=DS×16+EA=32000H,操作數(shù)來自32000H(或3000H:2000H處),結(jié)果AX=3514H第9頁/共118頁11注:a、可使用段超越前綴指定其它段寄存器如:MOVAX,ES:[2000H]b、在匯編語言中,可以用符號地址代替數(shù)值地址,實(shí)際上是給存儲單元起一個(gè)名字。如:COUNTDW1234HMOVAX,COUNT→直接尋址或MOVAX,[COUNT]其中DW為定義字變量(DefineWord)偽指令,說明符號地址COUNT處存放著一個(gè)字,字內(nèi)容為1234H,結(jié)果AX=1234HDW與EQU定義符號的不同點(diǎn):

①尋址方式不同;

②用DW定義,COUNT單元中的內(nèi)容可修改,用EQU定義,COUNT為常數(shù)。第10頁/共118頁124、寄存器間接尋址方式(RegisterIndirectAddressing)EA在指定的寄存器中,只能是基址BX、BP,變址SI、DI四者之一。MOVAX,[DX](非法)默認(rèn)關(guān)系:SS:BP,DS:BX、SI、DI

可進(jìn)行段超越,如MOVAX,DS:[BP]

第11頁/共118頁13例:MOVAX,[BX]已知BX=5000H,DS=3000H,則EA=(BX)=5000H,PA=DS×16+EA=35000H該指令執(zhí)行完,AX=32A0H第12頁/共118頁145、寄存器相對尋址方式(RegisterRelativeAddressing)EA=(BX、BP、SI、DI之一)+(8位或16位位移量)默認(rèn)關(guān)系及段超越同寄存器間接尋址第13頁/共118頁15例:MOVAX,COUNT[DI]或MOVAX,[COUNT+DI]已知:DI=1000H,DS=3000H,位移量COUNT=0510H則EA=(DI)+COUNT=1510H,PA=DS×16+EA=31510H,該指令執(zhí)行完,AX=5698H第14頁/共118頁166、基址變址尋址方式(BasedIndexedAddressing)EA=基址(BX、BP之一)+變址(SI、DI之一)默認(rèn)關(guān)系取決于使用的基址寄存器,只要出現(xiàn)BP即默認(rèn)SS,也可進(jìn)行段超越。只有四種組合:BX+SI,BX+DI均與DS結(jié)合

BP+SI,BP+DI均與SS結(jié)合注意:MOVAX,[BX+BP]及MOVAX,[SI+DI]非法。第15頁/共118頁17如:MOVAX,[BX+SI]或MOVAX,[BX][SI]設(shè)BX=2000H,DS=5000H,SI=0006H,則EA=(BX)+(SI)=2006H,PA=(DS)×16+EA=52006H則該指令執(zhí)行后,AX=AB78H。MOVAX,[BX+SI]第16頁/共118頁187、相對基址變址尋址方式(RelativeBasedIndexedAddressing)

EA=(BX、BP之一)+(SI、DI之一)+偏移量(8、16位)

默認(rèn)關(guān)系與段超越同基址變址尋址。

例如:MOVAX,COUNT[BX][SI]MOVAX,COUNT[BX+SI]MOVAX,[BX+SI+COUNT]以上三者等價(jià)第17頁/共118頁19如MOV

AX,MASK[BX][SI]設(shè)DS=4100H,位移量MASK=0134H,BX=2500H,SI=1200H

則EA=(BX)+(SI)+MASK=3834H,PA=(DS)×16+EA=44834H,該指令執(zhí)行完后,AX=5698H

第18頁/共118頁20其它尋址方式1、隱含尋址:DAA隱含對AL中數(shù)據(jù)進(jìn)行十進(jìn)制調(diào)整。2、I/O端口尋址:

直接端口:前256個(gè)端口,端口號范圍(OOH~FFH),可直接出現(xiàn)在指令中,如INAL,23H;OUT56H,AL

間接端口:端口號范圍0000~FFFFH,共64K個(gè)端口,由DX間接提供,如:MOVDX,1000H

INAL,DX3、一條指令中含幾種尋址方式如:MOV[BX],AL完整描述:源操作數(shù)采用寄存器尋址,目的操作數(shù)采用寄存器間接尋址。4、轉(zhuǎn)移類指令尋址(與轉(zhuǎn)移地址有關(guān)的尋址方式)段內(nèi)直接、段內(nèi)間接、段間直接、段間間接共四種(將在控制轉(zhuǎn)移指令中介紹)第19頁/共118頁213-2指令的機(jī)器碼表示方法一、基本概念

匯編語言源程序:用匯編語言編寫的程序。

匯編程序:將匯編語言源程序翻譯成二進(jìn)制代碼的目標(biāo)程序(機(jī)器語言指令)的工具。

匯編:將匯編語言源程序翻譯成機(jī)器語言的過程。匯編匯編語言源程序------------→目標(biāo)程序(匯編程序)二、機(jī)器語言指令的編碼特點(diǎn)8086指令系統(tǒng)采用變長指令,長度由1~6字節(jié)組成。第20頁/共118頁22

1、最短為單字節(jié)指令:只包含8位操作碼,沒有操作數(shù),如CLC等。

2、最長為6字節(jié)指令:如MOV[BX+2100H],1234H操作碼1字節(jié),尋址方式1字節(jié),16位位移量2字節(jié),16位立即數(shù)2字節(jié)三、機(jī)器語言指令代碼的編制介紹手工匯編的規(guī)律(略)但目前已有宏匯編程序(MASM等),可實(shí)現(xiàn)機(jī)器匯編(自動匯編)。第21頁/共118頁233-38086的指令系統(tǒng)通常一條指令對應(yīng)著一種基本操作。計(jì)算機(jī)所能執(zhí)行的全部指令,構(gòu)成了計(jì)算機(jī)的指令系統(tǒng)。計(jì)算機(jī)的主要功能由指令系統(tǒng)來體現(xiàn)。一般來說,若某臺計(jì)算機(jī)的指令越豐富,尋址方式越多,且每條指令的執(zhí)行速度都較快,則它的總體功能越強(qiáng)。每種計(jì)算機(jī)都有自己固有的指令系統(tǒng)。8086的指令按功能可分為六大類:數(shù)據(jù)傳送指令、算術(shù)運(yùn)算指令、邏輯運(yùn)算和移位指令、字符串處理指令、控制轉(zhuǎn)移指令、處理器控制指令。第22頁/共118頁24一、數(shù)據(jù)傳送指令:負(fù)責(zé)數(shù)據(jù)在寄存器、存儲器、I/O端口之間的傳遞,特點(diǎn)是不影響標(biāo)志位。1.通用數(shù)據(jù)傳送指令(1)MOV

傳送指令(Move)格式:MOV目的,源;(源)→(目的)第23頁/共118頁25MOV指令使用規(guī)則:①立即數(shù)不能直接傳入段寄存器

MOVDS,2000H(非法)②立即數(shù)不能作為目的操作數(shù)

MOV2000H,AX(非法)③兩個(gè)段寄存器之間不能直接傳送

MOVDS,ES(非法)④源、目的操作數(shù)不能同時(shí)為存儲器操作數(shù)(兩內(nèi)存單元之間不能直接用MOV傳送)MOV[BX],[2000H](非法)⑤段寄存器CS不能作為目的操作數(shù),但可作為源操作數(shù)MOVCS,AX(非法)第24頁/共118頁26⑥源和目的操作數(shù)字長應(yīng)一致(8位立即數(shù)→16位寄存器例外)MOVAX,BL非法;⑦指令中至少要有一項(xiàng)明確說明傳送的是字節(jié)還是字,故8位立即數(shù)送內(nèi)存操作時(shí),要用類型說明符BYTEPTR或WORDPTR指明內(nèi)存類型MOV[2000H],12H非法可改為:MOVBYTEPTR[2000H],12H;字節(jié)操作

MOVWORD

PTR[2000H],12H;字操作⑧IP和PSW不能出現(xiàn)在MOV指令中第25頁/共118頁27(2)堆棧操作指令

PUSH

源;進(jìn)棧指令①SP-2→SP②源→棧頂

POP

目的;出棧指令

①棧頂→目的②SP+2→SP注意:①只能對字操作,不能對字節(jié)操作;

PUSHAL(非法)②立即數(shù)不能入棧;

PUSH2000H(非法)③CS可入棧,但不能彈出內(nèi)容到CSPUSHCS(合法)POPCS(非法)第26頁/共118頁28堆棧主要用于保護(hù)和恢復(fù)數(shù)據(jù),也可進(jìn)行數(shù)據(jù)交換。規(guī)定由SS指示堆棧段的段基址,SP始終指向堆棧的頂部,SP的初值規(guī)定了所用堆棧段的大小。堆棧的最高地址叫棧底。SPSS堆棧段進(jìn)棧方向退棧方向棧底棧頂?shù)?7頁/共118頁29(3)XCHG

交換指令(Exchange)格式:XCHGOPR1,OPR2

;寄存器之間,寄存器與存儲器之間執(zhí)行操作:(OPR1)(OPR2)注意:①立即數(shù)不能出現(xiàn)在交換指令中;②段寄存器不能出現(xiàn)在交換指令中;③存儲單元之間不能直接交換;

XCHG[1000H],[2000H](非法)

第28頁/共118頁30(4)XLAT

表轉(zhuǎn)換指令(換碼、查表)(Translation)格式:XLAT

或XLAT轉(zhuǎn)換表名

功能:完成一個(gè)字節(jié)的查表轉(zhuǎn)換。

((DS)×16+(BX)+(AL))

→AL

步驟:①首先在內(nèi)存中建表;(TABLEDB…)②使BX指向表的首地址;

(MOVBX,OFFSETTABLE)

③查表中某項(xiàng)時(shí),將該項(xiàng)相對于表首地址的偏移量→AL;(MOVAL,5)

④執(zhí)行XLAT,轉(zhuǎn)換后的結(jié)果→AL。

(AL=12H,即5的七段顯示碼)第29頁/共118頁312.輸入輸出指令:累加器(AX或AL)←→I/O端口(1)INAX(或AL),端口地址;輸入(Input)指令(2)OUT

端口地址,AX(或AL);輸出(Output)指令①直接I/O指令:端口號直接出現(xiàn)在指令中,尋址范圍為0~255,最大端口號為FFH(255)如:INAL,12HOUT34H,AL②間接I/O指令:端口號由DX間接指定,可尋址范圍為整個(gè)64K個(gè)端口(0000H~FFFFH)注:I/O指令中的其中一個(gè)操作數(shù)必為累加器(AL或AX),如為AX,則為16位端口的字操作,16位端口由兩個(gè)地址連續(xù)的8位端口組成。如:MOVDX,300HOUTDX,AXAL

300H端口AH

301H端口第30頁/共118頁323.地址目標(biāo)傳送指令:將地址(段地址和偏移地址)送入指定的寄存器。(1)LEA取有效地址指令

(LoadEffectiveAddress)格式:LEA目的,源;源的EA→目的寄存器功能:常用于使某個(gè)寄存器作為地址指針。注意:a、源只能是存儲器操作數(shù),不能為立即數(shù)或寄存器操作數(shù);b、目的只能為16位寄存器,不能為8位寄存器及段寄存器。第31頁/共118頁33注意:LEASP,[BX]及MOVSP,[BX]的區(qū)別例:設(shè)BX=1234H,DS=2000H,(21234H)=78H,(21235H)=56H則LEA執(zhí)行完后,SP=1234H

MOV執(zhí)行完后,SP=5678H總結(jié):設(shè)置地址指針有2種方法。

①LEABX,TABLE

②MOVBX,OFFSETTABLE

上面兩條指令等價(jià)。第32頁/共118頁34(2)LDS

雙字指針?biāo)虳S和寄存器指令

(LoadPointerusingDS)格式為:LDS目的,源;目的和源的規(guī)定同LEA功能:將源指向的前2個(gè)字節(jié)內(nèi)容(EA)→目的(常用SI)將源指向的后2個(gè)字節(jié)內(nèi)容(段基址)→DS(3)LES

雙字指針?biāo)虴S和寄存器指令

(LoadPointerusingES)注意:雙字指針包含完整的段基址和偏移地址。

雙字指針在內(nèi)存中存放占用連續(xù)的4個(gè)字節(jié)地址,規(guī)律為:偏移地址(或EA)→低地址字單元

段基址→高地址字單元第33頁/共118頁354.標(biāo)志傳送指令:讀出或改寫PSW(1)LAHF

;PSW的低位字節(jié)→AH(LoadAHfromFlags)

(2)SAHF

;PSW的低位字節(jié)←AH(StoreAHintoFlags)(3)PUSHF;PSW內(nèi)容入棧(PushFlagsontoStack)(4)POPF

;棧頂內(nèi)容彈出到PSW

(PopFlagsoffStack)注意:前兩條為兼容8位CPU的指令,不常用;后兩條(PUSHF和POPF)一般成對出現(xiàn)于子程序和中斷服務(wù)程序的開頭和結(jié)尾處,用于保護(hù)和恢復(fù)現(xiàn)場。第34頁/共118頁36總結(jié):數(shù)據(jù)傳送指令中除SAHF及POPF外,均不影響PSW中的各標(biāo)志位。第35頁/共118頁37二、算術(shù)運(yùn)算指令:加、減、乘、除特點(diǎn):均影響PSW中的狀態(tài)標(biāo)志位。計(jì)算機(jī)中的數(shù)分為:(1)二進(jìn)制

無符號:所有位均為數(shù)值位。

帶符號:最高位表示符號位,0正1負(fù),用補(bǔ)碼表示。(2)十進(jìn)制

壓縮:每4位表示一個(gè)十進(jìn)制數(shù)位,1個(gè)字節(jié)可表示2位十進(jìn)制數(shù)

非壓縮:1個(gè)字節(jié)表示1位十進(jìn)制數(shù)(只用低4位表示十進(jìn)制數(shù)位,高4位為0或無意義)如:19D=壓縮:0001,1001BCD(即19H)=非壓縮:0000,0001,0000,1001BCD(即0109H)第36頁/共118頁38雙操作數(shù)指令:其中至少有一個(gè)為寄存器操作數(shù),但不能為段寄存器(立即數(shù)與存儲器運(yùn)算結(jié)果→存儲器除外)單操作數(shù)指令:不能為立即數(shù)及段寄存器結(jié)論:(1)加減運(yùn)算:無符號數(shù)與帶符號數(shù)可采用同一套指令。(2)乘除運(yùn)算:無符號數(shù)與帶符號數(shù)有各自的一套指令。注意:在二進(jìn)制加減運(yùn)算中,

CF:衡量無符號數(shù)運(yùn)算的結(jié)果是否有進(jìn)位

OF:衡量帶符號數(shù)運(yùn)算的結(jié)果是否有溢出第37頁/共118頁391.加法指令(1)ADD

加法指令(Addition)格式:ADD目的,源;源+目的→目的

a.影響所有狀態(tài)標(biāo)志

b.段寄存器不能出現(xiàn)

c.兩個(gè)操作數(shù)不能同為存儲器操作數(shù)

d.類型一致(B/W)(2)ADC

帶進(jìn)位加法指令(AdditionwithCarry)功能:除兩操作數(shù)相加外,還應(yīng)加上CF(源+目的+CF→目的)用于多字(多字節(jié))加法運(yùn)算中的高字(高字節(jié))加法中如雙精度數(shù)運(yùn)算(指雙字?jǐn)?shù)據(jù),即32位長度)第38頁/共118頁40(3)INC

增量指令(加1指令)(Increment)

格式:INC

目的;目的+1→目的單操作數(shù)指令,影響除CF之外的其余5個(gè)狀態(tài)標(biāo)志。功能:a.修改地址指針(增量修改)

b.修改循環(huán)計(jì)數(shù)器(正計(jì)數(shù)法)如為存儲器操作數(shù),則應(yīng)加上類型說明符PTR進(jìn)行說明。

如:INC[BX](非法)

可改為:INCBYTEPTR[BX];字節(jié)操作INCWORDPTR[BX];字操作第39頁/共118頁41(4)DAA

壓縮BCD碼加法調(diào)整指令

(DecimalAdjustforAddition)調(diào)整原理:

化16進(jìn)1(每4個(gè)二進(jìn)制位為一體)為逢10進(jìn)1例:08H+07H應(yīng)得15H對0FH+6調(diào)整(因F非BCD碼)09H+09H應(yīng)得18H對12H+6調(diào)整(因AF=1)結(jié)論:如AF=1或低4位二進(jìn)制數(shù)碼對應(yīng)的BCD碼大于9時(shí),則加6進(jìn)行調(diào)整;往上則考查CF是否為1。DAA隱含對AL中的數(shù)據(jù)調(diào)整成壓縮BCD碼形式,應(yīng)緊跟ADD或ADC指令之后。典型應(yīng)用:ADD(或ADC)AL,源;二進(jìn)制加法

DAA

;調(diào)整為十進(jìn)制結(jié)果第40頁/共118頁42具體調(diào)整方法:a.如AF=1或AL中低4位為A~F,則AL+06H→AL且使AF=1;b.如CF=1或AL中高4位為A~F,則AL+60H→AL且使CF=1;對AL中二進(jìn)制加法結(jié)果用DAA調(diào)整后,AL可能:

①不變(高、低4位均未調(diào)整,AF=CF=0)

②+06H(只調(diào)整了低4位,AF=1,CF=0)③+60H(只調(diào)整了高4位,CF=1,AF=0)

④+66H(高、低4位均調(diào)整,AF=CF=1)【例如】ADDAL,BL

DAA若執(zhí)行前:AL=28H,BL=68H,則執(zhí)行ADD后:AL=90H,CF=0,AF=1;執(zhí)行DAA指令后:AL=96H,CF=0,AF=1。第41頁/共118頁43(5)AAA

非壓縮BCD碼加法調(diào)整

(ASCIIAdjustforAddition)隱含對AL進(jìn)行調(diào)整,但調(diào)整后影響AH。應(yīng)用情況同DAA,緊跟ADD或ADC指令之后。調(diào)整方法:a、AL低4位如為A~F或AF=1

則AL+6→AL,AH+1→AH,使AF=1b、清AL高4位

c、AF值送CF特點(diǎn):執(zhí)行后AF和CF只能為相同值。第42頁/共118頁442.減法指令(1)SUB減法指令(Subtraction)格式SUB目的,源;目的-源→目的

(2)SBB

帶借位的減法指令(SubtractwithBorrow)格式:SBB目的,源;目的-源-CF→目的

↓進(jìn)/借位標(biāo)志用于多字節(jié)(多字)減法運(yùn)算中。(3)DEC

減量指令(減1指令)(Decrement)格式:DEC目的;目的-1→目的影響除CF之外的其余5個(gè)狀態(tài)標(biāo)志功能:①修改地址指針(減量修改)

②修改循環(huán)計(jì)數(shù)器(減計(jì)數(shù)法)注意:由于是單操作數(shù)指令,如為存儲器操作數(shù),應(yīng)加類型說明符PTR進(jìn)行說明。第43頁/共118頁45(4)NEG

求補(bǔ)(取負(fù))指令(Negate)格式:NEG目的;0-目的→目的功能:正數(shù)變負(fù)數(shù),負(fù)數(shù)變正數(shù)。

NEG例如:11111111(-1的補(bǔ)碼)←→00000001(+1的補(bǔ)碼)可用于求負(fù)數(shù)的絕對值單操作數(shù)指令,規(guī)定同INC、DEC指令。(5)CMP

比較指令(Compare)格式:CMP目的,源;目的-源(但不保存結(jié)果)實(shí)質(zhì)上是相減操作,但不保存相減的結(jié)果,只是減法運(yùn)算影響各標(biāo)志位。希望比較兩個(gè)數(shù)的大小,而又不破壞兩個(gè)操作數(shù)的場合。其后一般緊跟條件轉(zhuǎn)移指令。第44頁/共118頁46CMP指令主要用來比較兩數(shù)大小、相等關(guān)系。①比較兩個(gè)數(shù)是否相等,看ZF標(biāo)志位,ZF=1則相等②比較兩數(shù)大小時(shí)a.無符號數(shù):看CF標(biāo)志位(是否夠減)CF=0,無借位,被減數(shù)大,減數(shù)小CF=1,有借位,被減數(shù)小,減數(shù)大b.帶符號數(shù):看SF和OF標(biāo)志位

SF⊕OF=0

SF=0,0F=0被減數(shù)大,

SF=1,0F=1減數(shù)小SF⊕0F=1

SF=1,0F=0被減數(shù)小,SF=0,0F=1減數(shù)大第45頁/共118頁47(6)DAS

壓縮BCD碼減法調(diào)整指令

(DecimalAdjustforSubtraction)應(yīng)緊跟在SUB或SBB之后,隱含對AL中數(shù)據(jù)的調(diào)整。格式:SUB(或SBB)AL,源

DAS具體調(diào)整:相應(yīng)位減06H(置AF位)及減60H(置CF位)經(jīng)DAS后,AL有可能不變、-06H、-60H、-66H。(7)AAS

非壓縮BCD碼減法調(diào)整指令

(ASCIIAdjustforSubtraction)隱含對AL進(jìn)行調(diào)整,但調(diào)整后影響AH。AF和CF只能為相同值??偨Y(jié):BCD碼的加法調(diào)整和減法調(diào)整指令都隱含操作數(shù)在AL中,即對AL中結(jié)果進(jìn)行調(diào)整。因此對BCD數(shù)據(jù)的加減運(yùn)算只能以字節(jié)為單位,如果以字為單位進(jìn)行加減,則低字節(jié)向高字節(jié)的進(jìn)位及高字節(jié)中的低半字節(jié)向高半字節(jié)的進(jìn)位均無法判斷,失去了調(diào)整的依據(jù)。第46頁/共118頁483.乘法指令(1)MUL

無符號數(shù)乘法指令(Multiply)格式:MUL源(2)IMUL帶符號數(shù)乘法指令(IntegerMultiply)格式:IMUL源隱含被乘數(shù)來源于與源操作數(shù)長度相等的累加器中(AX或AL)

字節(jié)乘法:字節(jié)(AL)*字節(jié)(源)→字(AX)

字乘法:字(AX)*字(源)→雙字(DX,AX)若指令中為存儲器操作數(shù),也需應(yīng)用PTR指明其類型。第47頁/共118頁49乘法指令只影響0F和CF位(且同時(shí)影響),其余無定義(狀態(tài)不定)(1)對于MUL,字節(jié)乘法后AH=0或字乘法后DX=0,則0F=CF=0,否則均為1(2)對于IMUL,如果乘積的高一半是低一半的符號擴(kuò)展,則CF=0F=0,否則均為1(即看結(jié)果的高一半是否包含有效數(shù)字位)利用OF和CF狀態(tài)可決定是否需要保存積的高位字節(jié)或高位字。注:帶符號數(shù)的乘法是先化為正數(shù)×正數(shù)的形式,如結(jié)果應(yīng)為負(fù),再對結(jié)果取補(bǔ)碼即可。第48頁/共118頁50(3)AAM

非壓縮BCD碼乘法調(diào)整指令

(ASCIIAdjustforMultiply)對存于AL中的兩個(gè)非壓縮十進(jìn)制數(shù)相乘的乘積進(jìn)行調(diào)整,結(jié)果存于AX中。具體調(diào)整過程:

AL÷10→AH(商)

AL(余數(shù))注:BCD碼的乘法要求兩個(gè)乘數(shù)均為非壓縮BCD碼,且為字節(jié)數(shù)據(jù),這樣8位*8位=16位(結(jié)果高8位必為00H,因最大乘法9*9=81,只需AL就可放下),因此只需對AL中結(jié)果進(jìn)行調(diào)整。第49頁/共118頁51【例】MULBL

AAM若執(zhí)行前:AL=06H,BL=09H,則執(zhí)行MULBL

后,AX=0036H,再執(zhí)行AAM指令后,正確的結(jié)果為:AH=05H,AL=04H。第50頁/共118頁524.除法指令(1)DIV

無符號數(shù)除法指令(Divide)格式:DIV源(2)IDIV

帶符號數(shù)除法指令(IntegerDivide)格式:IDIV源隱含被除數(shù)

字節(jié)除法:字(AX)÷字節(jié)(源)→AL(商),AH(余數(shù))

字除法:雙字(DX,AX)÷字(源)→AX(商),DX(余數(shù))注意:①除法操作后,若結(jié)果超出商的表示范圍(AL或AX放不下),則看作除法為0的情況,產(chǎn)生0號中斷;②IDIV指令執(zhí)行后,余數(shù)的符號一定要和被除數(shù)相同;③在作除法前,保證被除數(shù)一定為除數(shù)的兩倍長度,否則要進(jìn)行擴(kuò)展;第51頁/共118頁53無符號數(shù):清除AH(字節(jié)除法)或DX(字除法)帶符號數(shù):要進(jìn)行符號擴(kuò)展:兩條符號擴(kuò)展指令如下:(3)CBW

字節(jié)轉(zhuǎn)換為字指令(ConvertBytetoWord)功能:AL中的字節(jié)→AX中的字(字節(jié)除法)若AL最高有效位D7=0,則AH=0;若AL最高有效位D7=1,則AH=FFH。(4)CWD

字轉(zhuǎn)換為雙字指令(ConvertWordtoDoubleWord)功能:AX中的字→DX,AX中的雙字(字除法)若AX最高有效位D15=0,則DX=0;若AX最高有效位D15=1,則DX=FFFFH。第52頁/共118頁54【例】5678H÷1234HMOVAX,5678H;被除數(shù)MOVBX,1234H;除數(shù)MOVDX,0或

CWD;被除數(shù)擴(kuò)展DIVBX或IDIVBX;執(zhí)行除法第53頁/共118頁55(5)AAD

非壓縮BCD除法調(diào)整指令(ASCIIAdjustforDivide)BCD碼的除法要求兩操作數(shù)均為非壓縮BCD碼,且只能進(jìn)行字節(jié)除法,即16÷8=8余8,其中被除法來自AX中。調(diào)整方法是在作除法之前對被除數(shù)進(jìn)行調(diào)整:

AH*10+AL→AL

0→AH第54頁/共118頁56【例】將十進(jìn)制數(shù)45除以7,商和余數(shù)分別存于數(shù)據(jù)段1000H和1001H單元。

MOVAX,0405H;非壓縮BCD碼形式

MOVBL,07H;除數(shù)

AAD

;AL=2DH=45D,AH=0DIVBLMOV[1000H],AL;存商,AL=6MOV[1001H],AH;存余數(shù),AH=3注:如不用AAD調(diào)整,則0405H=4*256+5=1029,除以7之后結(jié)果為147余0。第55頁/共118頁57總結(jié):BCD碼運(yùn)用指令中,對加、減、乘,先是利用普通二進(jìn)制運(yùn)算指令算出二進(jìn)制結(jié)果,然后用專門調(diào)整指令對結(jié)果進(jìn)行調(diào)整,對于除法,則是先對被除數(shù)進(jìn)行調(diào)整,再用普通除法指令進(jìn)行運(yùn)算。第56頁/共118頁58三、邏輯運(yùn)算和移位指令(位處理指令)特點(diǎn):按位操作,必須化為二進(jìn)制1.邏輯運(yùn)算指令操作數(shù)規(guī)定同算術(shù)運(yùn)算指令雙操作數(shù)指令:使CF=0F=0,AF無定義,影響SF、ZF、PF單操作數(shù)指令(NOT):不影響標(biāo)志位

(1)AND

邏輯與指令(LogicalAnd)

運(yùn)算規(guī)則:全1出1,有0出0某些位保持不變(與“1”),另外一些位屏蔽掉(與“0”)例:ANDAL,OFH;屏蔽AL高4位,低4位保持不變第57頁/共118頁59(2)OR

邏輯或指令(LogicalOr)

運(yùn)算規(guī)則:有1出1,全0出0某些位保持不變(或“0”),另外一些位置1(或“1”)例:ORAL,0FH;使AL低4位置1,高4位保持不變(3)XOR

異或指令(ExclusiveOr)

運(yùn)算規(guī)則:相同為0,相異為1某些位保持不變(異或“0”),另外一些位取反(異或“1”)例:XORAL,OFH;使AL低4位取反,高4位保持不變用于判斷兩個(gè)數(shù)是否相等:XORAX,BX實(shí)現(xiàn)某個(gè)操作數(shù)清零:XORAX,AX使操作數(shù)各位取反:XORAX,0FFFFH第58頁/共118頁60(4)NOT

取反指令(LogicalNot)

運(yùn)算規(guī)則:按位取反如操作數(shù)為存儲器操作數(shù),應(yīng)用PTR指明其類型。

NOTALINCAL等價(jià)于NEGAL(5)TEST

測試指令(Test)功能:進(jìn)行“與”運(yùn)算,但不保存結(jié)果,影響標(biāo)志位。用于在不想改變兩數(shù)的情況下,檢測某位或某幾位是否滿足條件,后面緊跟條件轉(zhuǎn)移指令,從而引出分支。一般情況下,TEST指令的源操作數(shù)設(shè)置為一個(gè)立即數(shù),其中需要測試的位為1,其它位為0。測試正負(fù)數(shù):TESTAL,80H或TESTAX,8000H之后判斷ZF=1,正數(shù);ZF=0,負(fù)數(shù)測試奇偶數(shù):TESTAL,01H或TESTAX,0001H之后判斷ZF=1,偶數(shù);ZF=0,奇數(shù)第59頁/共118頁612.算術(shù)邏輯移位指令(非循環(huán)移位)特點(diǎn):移位后操作數(shù)逐漸丟失格式:操作碼目的,移位次數(shù)注意:a.移位次數(shù)為1,可直接出現(xiàn)在指令中,移位次數(shù)如大于1,則應(yīng)將其放入CL中,由CL間接指定;b.影響CF、OF、PF、SF、ZF,但AF位無定義c.移位前后如符號位發(fā)生變化,則OF置1,(移位次數(shù)>1,則OF不確定),而CF為最后移出的一位。第60頁/共118頁62(1)SHL

邏輯左移指令(ShiftLogicalLeft)(2)SAL

算術(shù)左移指令(ShiftArithmeticLeft)

兩者功能相同,左移1位相當(dāng)于乘2運(yùn)算(3)SHR邏輯右移指令(ShiftLogicalRight)右移1位相當(dāng)于無符號數(shù)除2運(yùn)算(4)SAR算術(shù)右移指令(ShiftArithmeticRight)

將操作數(shù)看成帶符號數(shù),移位過程中符號位保持不變。右移1位相當(dāng)于帶符號數(shù)除2運(yùn)算注:因移位指令執(zhí)行速度快,而乘除法執(zhí)行速度慢,故常用來編制乘除法程序。第61頁/共118頁63【例】AL*5→AL(不計(jì)溢出)MOVBL,AL;暫存原始值

MOVCL,2;移位次數(shù)SHL(或SAL)AL,CLADDAL,BL第62頁/共118頁643.循環(huán)移位指令特點(diǎn):移位后不丟失有效位格式及操作數(shù)規(guī)定同算術(shù)邏輯移位指令。(1)ROL

循環(huán)左移指令(RotateLeft)(2)ROR

循環(huán)右移指令(RotateRight)(3)RCL

帶進(jìn)位循環(huán)左移指令(RotatethroughCarryLeft)(4)RCR

帶進(jìn)位循環(huán)右移指令(RotatethroughCarryRight)其中RCL和RCR將CF也包含在循環(huán)圈中。第63頁/共118頁65四、字符串處理指令功能:用一條指令實(shí)現(xiàn)對一串字符或數(shù)據(jù)的操作(字節(jié)串/字串)串處理的隱含約定:(1)源串由DS:SI指向(可進(jìn)行段超越)(2)目的串由ES:DI指向(固定組合)(3)SI、DI自動修改(±1字節(jié)串,±2字串)(4)DF控制串處理的方向

DF=0,增量修改SI、DI(+1或+2),CLD指令

DF=1,減量修改SI、DI(-1或-2),STD指令(5)串長度(字節(jié)數(shù)或字?jǐn)?shù))由CX指定第64頁/共118頁66為加快執(zhí)行速度,可在基本指令前加三種重復(fù)前綴。(1)REP

無條件重復(fù)(重復(fù)條件:CX≠0)用于MOVS和STOS前面(2)REPE/REPZ

相等/結(jié)果為0則重復(fù)(重復(fù)條件:CX≠0且ZF=1)用于CMPS和SCAS前面(3)REPNE/REPNZ

不相等/結(jié)果非0則重復(fù)(重復(fù)條件:CX≠0且ZF=0)用于CMPS和SCAS前面第65頁/共118頁671.MOVS

字符串傳送指令(MoveString)格式:a.MOVS目的串,源串b.MOVSB/MOVSW

;字節(jié)串或字串傳送執(zhí)行的操作:(1)(DS:SI)→(ES:DI)(2)SI±1→SI,DI±1→DI

或SI±2→SI,DI±2→DI注:DF=0,用“+”;當(dāng)DF=1時(shí),用“-”

字節(jié)串±

1,字串±

2第66頁/共118頁68與REP前綴聯(lián)用:REPMOVSB/MOVSW操作:(1)若CX=0,則退出串處理(2)CX-1→CX

(3)執(zhí)行一次MOVSB/MOVSW,跳回(1)所以,應(yīng)用之前需完成4件事:①DS:SI指向源串②ES:DI指向目的串③數(shù)據(jù)串的長度→CX④CLD或STD決定串處理方向【例】將數(shù)據(jù)段中以SRC_MESS為偏移地址的一串字符“HELLO!”,傳送到附加段中以NEW_LOC開始的單元中。第67頁/共118頁69DATASEGMENT;數(shù)據(jù)段SRC_MESSDB‘HELLO!’;源串DATAENDSEXTRASEGMENT;附加段NEW_LOCDB6DUP(?)

;目的串EXTRAENDSCODESEGMENT;代碼段ASSUMECS:CODE,DS:DATA,ES:EXTRA;段分配START:MOVAX,DATAMOVDS,AX;初始化DSMOVAX,EXTRAMOVES,AX;初始化ES第68頁/共118頁70

LEASI,SRC_MESS;SI指向源串LEADI,NEW_LOC;DI指向目的串MOVCX,6;CX存放串長度CLD;增量修改地址指針REPMOVSB;重復(fù)串傳送CODEENDSENDSTART

;源程序結(jié)束執(zhí)行完后,SI=SRC_MESS+6,DI=NEW_LOC+6,CX=0第69頁/共118頁71【例】將數(shù)據(jù)段中偏移地址為1000H開始的一串字符“HELLO!”傳送到附加段中偏移地址為2000H開始的單元中。MOVSI,1000HMOVDI,2000HMOVCX,6CLDREPMOVSB執(zhí)行完后,SI=1006H,DI=2006H,CX=0第70頁/共118頁722.CMPS

字符串比較指令(CompareString)格式:a.CMPS目的串,源串

b.CMPSB/CMPSW執(zhí)行的操作:(1)(DS:SI)-(ES:DI)

不保存結(jié)果,只影響標(biāo)志位(主要看ZF)(2)SI±1→SI,DI±1→DI

或SI±2→SI,DI±2→DI第71頁/共118頁73常用來比較兩個(gè)數(shù)據(jù)區(qū)是否全部相等,此時(shí)與REPZ(REPE)聯(lián)用。格式:REPZ(REPE)CMPSB/CMPSW重復(fù)條件:CX≠0且ZF=1,即上次比較相等且串未比較完操作:①CX=0或ZF=0,則退出串處理②CX-1→CX③執(zhí)行CMPSB/CMPSW一次,跳回①第72頁/共118頁74主要用來實(shí)現(xiàn)在兩個(gè)數(shù)據(jù)區(qū)中尋找第一個(gè)不相等的元素(與REPZ/REPE聯(lián)用)或第一個(gè)相等的元素(與REPNZ/REPNE聯(lián)用)?!纠勘容^兩個(gè)字符串,一個(gè)是設(shè)定的口令串PASSWORD,另一個(gè)是從鍵盤輸入的字符串IN_WORD,若兩者相同,程序正常執(zhí)行,否則發(fā)出警告聲音。DATASEGMENT;數(shù)據(jù)段PASSWORDDB‘8086CPU’;口令串IN_WORDDB‘8088CPU’;輸入串COUNTEQU8;串長度DATAENDS第73頁/共118頁75CODESEGMENT;代碼段ASSUMECS:CODE,DS:DATA,ES:DATA

;段分配START:……;初始化段寄存器LEASI,PASSWORD;SI指向源串LEADI,IN_WORD;DI指向目的串MOVCX,COUNT;CX存放串長度CLD;增量修改地址指針REPZCMPSB;重復(fù)串比較JNESOUND;ZF=0(不等),轉(zhuǎn)SOUND處OK:……;ZF=1,口令通過SOUND:……;口令未通過,發(fā)聲警告CODEENDSENDSTART第74頁/共118頁76【例】將存在0700H~070FH單元中的非壓縮BCD數(shù)與存在0800H~080FH單元中的非壓縮BCD數(shù)進(jìn)行比較,已知有一對數(shù)相等,找出該數(shù),并存入AL中,將該數(shù)在源串中所處存儲單元的偏移地址存入DX中。MOVSI,0700HMOVDI,0800HMOVCX,10HCLDREPNECMPSB;CX≠0且ZF=0(兩數(shù)不等)時(shí),重復(fù)。DECSI;找到后,指針減1MOVDX,SIMOVAL,[SI]第75頁/共118頁773.SCAS字符串掃描指令(串搜索)(ScanString)格式:a.SCAS目的串

b.SCASB/SCASW執(zhí)行的操作:(1)AL(或AX)-(ES:DI)

不保存結(jié)果,只影響標(biāo)志位(主要看ZF)(2)DI±1→DI或DI±2→DI第76頁/共118頁78常用來搜索某數(shù)據(jù)區(qū)中是否含有關(guān)鍵字(關(guān)鍵字送入AL或AX中),此時(shí)與前綴REPNZ/REPNE聯(lián)用格式:REPNZ(REPNE)SCASB/SCASW重復(fù)條件:CX≠0且ZF=0(上次比較不等且串未比較完)操作:①CX=0或ZF=1(找到)則退出串處理②CX-1→CX③執(zhí)行一次SCASB/SCASW,跳回①如與REPZ(REPE)則用來搜索數(shù)據(jù)區(qū)中第一個(gè)不等于關(guān)鍵字的單元。第77頁/共118頁79【例】在某一字符串中搜索是否有字符A,若有,則把搜索次數(shù)記下來,送到BX中;若沒有,則將BX清0。

MOVDI,OFFSETSTRING;DI指向目的串MOVCX,COUNT;CX存放串長度

MOVAL,‘A’;AL放關(guān)鍵字CLD;增量修改地址指針REPNESCASB;重復(fù)串搜索JZFIND;ZF=1(搜到),轉(zhuǎn)FIND處MOVDI,0;ZF=0,未搜到FIND:MOVBX,DI;搜到第78頁/共118頁80【例】從地址為1000H單元開始,存放長度為256個(gè)字節(jié)的字符串,找出字符串中第一個(gè)‘$’(ASCI碼為24H),并將其存放地址偏移量存入DX中。(如串中無‘$’,則存入0作為標(biāo)記)

MOVDX,0;以0作為標(biāo)記

MOVDI,1000HMOVAL,24HMOVCX,256CLDPEPNZSCASBJNZEXIT;串中無‘$’,跳EXITDECDJMOVDX,DJEXIT:HLT;停機(jī)指令第79頁/共118頁814.LODS

數(shù)據(jù)串裝入指令(從串?。?/p>

(LoadString)格式:a.LODS源串

b.LODSB/LODSW執(zhí)行的操作:(1)(DS:SI)→AL(或AX)(2)SI±1→SI或SI±2→SI

類似于MOVAX(AL),[SI]區(qū)別在于自動修改地址指針SI一般不與REP聯(lián)用。如與REP聯(lián)用,AL或AX將不斷被刷新,只能保留最后寫入的數(shù)據(jù)。第80頁/共118頁825.STOS

數(shù)據(jù)串存儲指令(存入串)

(StoreString)格式:a.STOS目的串

b.STOSB/STOSW執(zhí)行的操作:(1)AL(或AX)→(ES:DI)(2)DI±1→DI或DI±2→DI

常與REP聯(lián)用,用AL或AX中的常數(shù)來初始化一片內(nèi)存。第81頁/共118頁83【例】將附加段中偏移地址為0400H開始的256個(gè)字節(jié)單元清0。

MOVDI,0400H或MOVDI,0400HMOVAL,0MOVAX,0MOVCX,256MOVCX,128CLDCLDREPSTOSBREPSTOSW第82頁/共118頁84注意:一般在循環(huán)程序中,LODS常與STOS聯(lián)用,先由LODS將數(shù)據(jù)取入AL(AX)中處理后,再用STOS存入另一數(shù)據(jù)區(qū)中。【例】在存儲器數(shù)據(jù)段中有一數(shù)據(jù)塊,起始地址為BLOCK,數(shù)據(jù)塊中的數(shù)為8位帶符號數(shù),要求把正、負(fù)數(shù)分開,分別送至附加段的兩個(gè)緩沖區(qū),存放正數(shù)的起始地址為PLUS_DATA,存放負(fù)數(shù)的起始地址為MINUS_DATA。第83頁/共118頁85MOVSI,OFFSETBLOCK;SI指向源串

MOVDI,OFFSETPLUS_DATA;DI指向正數(shù)區(qū)

MOVBX,OFFSETMINUS_DATA;BX指向負(fù)數(shù)區(qū)

MOVCX,COUNT;CX放循環(huán)次數(shù)CLD;增量方向GOON:LODSB

;源串的一個(gè)字節(jié)→AL

TESTAL,80H

;測試符號位(最高位)JNZMINUS;ZF=0,為負(fù)數(shù),轉(zhuǎn)MINUS

STOSB

;存正數(shù)

JMPAGAIN;轉(zhuǎn)到循環(huán)判斷MINUS:XCHGBX,DI;交換正負(fù)數(shù)區(qū)的指針

STOSB

;存負(fù)數(shù)XCHGBX,DI;恢復(fù)正負(fù)數(shù)區(qū)的指針AGAIN:DECCX;次數(shù)減1JNZGOON;未完,繼續(xù)處理下一個(gè)第84頁/共118頁86總結(jié):①當(dāng)用REP前綴時(shí),執(zhí)行完串處理后,SI和DI均指向數(shù)據(jù)區(qū)末地址的下一個(gè)字節(jié)(或字)單元,CX則減為0。②當(dāng)用REPZ和REPNZ前綴時(shí),有兩種情況結(jié)束串處理:

a.條件一直滿足,直到比較完最后一個(gè)單元,此時(shí)CX=0,SI、DI指向數(shù)據(jù)區(qū)末地址+1或+2處;可用ZF判斷最后一次比較是否相等(ZF并不因CX遞減為0而置1)。b.條件不滿足,此時(shí)CX≠0,SI、DI分別指向違反條件的單元地址的下一個(gè)單元處。③MOVS、LODS、STOS不影響標(biāo)志位;CMPS和SCAS影響標(biāo)志位,主要看對ZF的影響。④若源串和目的串位于同一段中,應(yīng)把DS和ES初始化為相同數(shù)值。a.分配同一段ASSUME…DS:DATA,ES:DATAb.初始化相同值

MOVAX,DATAMOVDS(ES),AX第85頁/共118頁87五、控制轉(zhuǎn)移指令特點(diǎn):改變CS和IP,用來控制程序的執(zhí)行流程。轉(zhuǎn)移方式可分為:

段內(nèi)轉(zhuǎn)移:只改變IP值,不改變CS值

段間轉(zhuǎn)移:CS和IP都改變

直接轉(zhuǎn)移:轉(zhuǎn)移地址由指令直接提供

間接轉(zhuǎn)移:轉(zhuǎn)移地址由寄存器或內(nèi)存單元間接提供第86頁/共118頁88與轉(zhuǎn)移地址有關(guān)的尋址方式共有4種:(以JMP指令為例)(1)段內(nèi)直接尋址格式1:JMPSHORTLP;段內(nèi)短轉(zhuǎn)移格式2:JMPNEARPTRLP;段內(nèi)近轉(zhuǎn)移

LP為轉(zhuǎn)移的符號地址(標(biāo)號)短跳轉(zhuǎn)要求LP所指向指令與JMP下一條指令的距離為-128~+127(偏移量為8位);近跳轉(zhuǎn)要求LP所指向的指令與JMP下一條指令的距離為-32768~+32767。

第87頁/共118頁89(2)段內(nèi)間接尋址:轉(zhuǎn)向的IP值由寄存器或存儲單元提供。格式1:JMPBX;BX→IP格式2:JMPWORDPTR[BX];內(nèi)存DS:BX的字內(nèi)容→IP其中WORDPTR用以區(qū)分段間間接方式,可缺省。【例】設(shè)BX=2000H,DS=3000H,(32000H)=40H,

(32000H)=50H,則執(zhí)行JMPBX后,IP=2000H而執(zhí)行JMP[BX]后,IP=5040H注:新的IP再與CS(不變)結(jié)合即可得出轉(zhuǎn)向的物理地址。第88頁/共118頁90(3)段間直接尋址:指令中直接提供了轉(zhuǎn)向的段基址和偏移地址格式:JMPFARPTRLPLP為標(biāo)號(轉(zhuǎn)向的符號地址)

注:LP所指向的指令與本JMP指令不在同一段內(nèi)(4)段間間接尋址:用存儲器中連續(xù)4個(gè)字節(jié)單元的內(nèi)容分別取代IP和CS。具體:前2個(gè)字節(jié)內(nèi)容→IP后2個(gè)字節(jié)內(nèi)容→CS注:只能用存儲器尋址方式提供,且用DWORDPTR(雙字)指明。第89頁/共118頁91【例】JMPDWORDPTR[BX]設(shè)DS=2000H,BX=1000H,(21000H)=10H,(21001H)=20H,(21002H)=30H,(21003H)=40H,

則執(zhí)行后:CS=4030H,IP=2010H

轉(zhuǎn)向地址為4030H:2010H

注:段間方式可轉(zhuǎn)到內(nèi)存中任意一個(gè)地方去。注:無條件轉(zhuǎn)移指令(JMP)及過程調(diào)用指令(CALL)可采用上述4種尋址方式;而所有的條件轉(zhuǎn)移指令及循環(huán)控制指令只能采用段內(nèi)直接尋址方式,且只能為段內(nèi)短轉(zhuǎn)移(轉(zhuǎn)移范圍為-128~+127字節(jié)之間)。第90頁/共118頁921.無條件轉(zhuǎn)移和過程調(diào)用指令(1)JMP

無條件轉(zhuǎn)移指令(Jump)格式:JMP目的可轉(zhuǎn)向內(nèi)存中任何地方。(2)CALL

、RET

過程調(diào)用和返回指令

(Call、Return)過程又稱子程序①CALL過程名分兩步執(zhí)行:a.將返回地址(CALL指令下一條指令的地址)入棧

b.轉(zhuǎn)移到子程序入口地址(由CALL的操作數(shù)提供)第91頁/共118頁931)段內(nèi)直接調(diào)用:格式:CALLNEARPTRPROC1其中NEARPTR可缺省

無段內(nèi)短調(diào)用指令。2)段內(nèi)間接調(diào)用:格式1:CALLSI格式2:CALLWORDPTR[BX];WORDPTR可缺省注:對于段內(nèi)調(diào)用,具體操作如下:a.SP-2→SP,返回地址IP入棧

b.子程序入口地址→IP特點(diǎn):主、子程序在同一個(gè)代碼段中,只改變IP,不改變CS第92頁/共118頁943)段間直接調(diào)用:格式:CALLFARPTRPROC24)段間間接調(diào)用:格式:CALLDWORDPTR[BP][SI]注:對于段間調(diào)用,具體操作如下:a.SP-4→SP,返回地址CS、IP入棧(先CS后IP)

b.子程序入口地址→CS和IP特點(diǎn):主、子程序不在同一代碼段中,CS和IP均要改變。第93頁/共118頁95②RET:過程返回,放在子程序末尾執(zhí)行操作:將堆棧中的返回地址彈回如為段內(nèi)調(diào)用的RET,則彈出一個(gè)字→IP,SP+2→SP如為段間調(diào)用的RET,則彈出兩個(gè)字→IP和CS,SP+4→SP(先IP后CS)注:CALL指令保護(hù)返回地址的入棧順序與RET指令恢復(fù)返回地址的出棧順序正好相反。第94頁/共118頁96帶參數(shù)的返回指令:RETn

;n應(yīng)為偶數(shù)執(zhí)行步驟:①執(zhí)行RET指令②SP+n→SP實(shí)質(zhì):在返回地址出棧后,還可以修改堆棧指針,從而釋放一些已使用過數(shù)據(jù)所占的單元。這些數(shù)據(jù)一般是主程序在調(diào)用子程序之前先把一些參數(shù)放入堆棧,在子程序中已經(jīng)使用了這些參數(shù),故返回主程序后,應(yīng)該修改SP來釋放單元?!纠縍ET8設(shè)執(zhí)行之前,SP=3000H,則執(zhí)行后

SP=3000H+2+8=300AH(段內(nèi)返回)

SP=3000H+4+8=300CH(段間返回)第95頁/共118頁972.條件轉(zhuǎn)移指令:只支持段內(nèi)短轉(zhuǎn)移根據(jù)上一條指令所設(shè)置的標(biāo)志位來判斷測試條件。格式:J***短標(biāo)號;***表示測試條件①滿足條件,則轉(zhuǎn)移到標(biāo)號處執(zhí)行②不滿足條件,順序執(zhí)行下一條指令(不轉(zhuǎn)移)(1)直接標(biāo)志轉(zhuǎn)移指令測試單個(gè)條件標(biāo)志(除AF外的其它5個(gè)狀態(tài)標(biāo)志)①JZ(JE)測試條件:ZF=1

相等(為0)則轉(zhuǎn)移②JNZ(JNE)測試條件:ZF=0

不相等(不為0)則轉(zhuǎn)移③、④

JC/JNC

測試條件:CF=1/CF=0

⑤、⑥

JS/JNS

測試條件:SF=1/SF=0⑦、⑧

JO/JNO測試條件:OF=1/OF=0⑨、⑩

JP/JNP測試條件:PF=1/PF=0第96頁/共118頁98【例3.87】求AL和BL寄存器中的兩數(shù)之和,若有進(jìn)位,則AH置1,否則AH清0。(P111)

ADDAL,BL

JC

NEXT;有進(jìn)位,轉(zhuǎn)NEXTMOVAH,0;無進(jìn)位JMPEXIT;跳到統(tǒng)一出口NEXT:MOVAH,1;有進(jìn)位EXIT:;統(tǒng)一出口第97頁/共118頁99(2)間接標(biāo)志轉(zhuǎn)移指令比較兩個(gè)無符號數(shù)

E等于(Equal)測試條件:ZF=1

A高于(Above)測試條件:CF=0

B低于(Below)測試條件:CF=1①JA(JNBE)高于;不低于或等于②JB(JNAE)低于;不高于或等于③JAE(JNB)高于或等于;不低于④JBE(JNA)低于或等于;不高于第98頁/共118頁100b.比較兩個(gè)帶符號數(shù)

E等于(Equal)測試條件:ZF=1

G大于(Great)測試條件:SF⊕OF=0

L小于(Less)測試條件:SF⊕OF=1①JG(JNLE)大于(>);不小于或等于②JL(JNGE)小于(<);不大于或

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論