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

下載本文檔

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

文檔簡(jiǎn)介

第3章80x86尋址方式和指令系統(tǒng)3.1執(zhí)行指令和非執(zhí)行指令3.28086/8088指令編碼格式3.38086/8088尋址方式3.48086/8088指令系統(tǒng)3.580X86的尋址方式和新擴(kuò)展指令3.1執(zhí)行指令和非執(zhí)行指令

可執(zhí)行指令和非執(zhí)行指令(偽指令)的主要區(qū)別是前者有操作碼,后者無操作碼。操作碼是指揮計(jì)算機(jī)各邏輯電路正確工作的機(jī)器代碼??蓤?zhí)行指令和非執(zhí)行指令的相同之處是有的不需要操作數(shù),有的需要1個(gè)或多個(gè)操作數(shù)。操作數(shù)是指令執(zhí)行或程序識(shí)別時(shí)所需的數(shù)據(jù)信息或數(shù)據(jù)存放的地址信息??蓤?zhí)行指令簡(jiǎn)稱指令,本書所提的“指令”,在不加申明的場(chǎng)合均是指可執(zhí)行指令。為區(qū)別計(jì),非執(zhí)行指令又稱偽指令。

無論哪種計(jì)算機(jī),都必須要求它的指令通過操作碼明白無誤地告訴CPU完成什么樣的功能操作。大多數(shù)指令由兩部分組成:第一部分為操作碼,指出實(shí)現(xiàn)哪種操作,比如是傳送數(shù)據(jù)到存儲(chǔ)單元或I/O端口,還是進(jìn)行算術(shù)邏輯運(yùn)算等等;第二部分為操作數(shù),指明操作數(shù)是什么或者存放的地址,以及操作結(jié)果送到什么地方去。無操作數(shù)指令只有第一部分。指令以二進(jìn)制數(shù)形式存放在內(nèi)存代碼段中。編制程序時(shí)如果直接用二進(jìn)制數(shù)書寫指令,既不方便又易出錯(cuò),為此編程使用的指令都是以符號(hào)形式出現(xiàn)的,其中操作碼使用易于識(shí)別的助記符,操作數(shù)使用立即數(shù)、寄存器名或存儲(chǔ)單元的地址。80X86指令的基本格式為:助記符目的操作數(shù)(可選),源操作數(shù)(可選)

(MnemonicsDestinationOperand,SourceOperand)

當(dāng)把指令格式鍵入到微機(jī)中時(shí),機(jī)內(nèi)的編譯程序自動(dòng)將其譯為二進(jìn)制數(shù)機(jī)器碼并放入內(nèi)存,讓CPU取指并執(zhí)行。80X86CPU字長(zhǎng)有限,為讓指令系統(tǒng)有較強(qiáng)的字長(zhǎng)處理功能,指令格式安排上常采取如下一些做法:1、單操作數(shù)的操作結(jié)果送回存放操作數(shù)的地方;2、雙操作數(shù)的操作結(jié)果送回存放目的操作數(shù)的地方,由此得知立即數(shù)在任何指令中都不能成為目的操作數(shù);3、存儲(chǔ)單元的地址使用邏輯地址,考慮到段寄存器和存放偏移量的寄存器要配對(duì)使用,因此指令中只出現(xiàn)存放偏移量的寄存器名,只有在段跨越情況下才同時(shí)出現(xiàn)段寄存器名和偏移量寄存器名;4、無論是操作碼,還是操作數(shù),機(jī)器碼都以字節(jié)為單位;

5、操作數(shù)為寄存器內(nèi)容時(shí),指令直接使用寄存器名;6、操作數(shù)為存儲(chǔ)單元內(nèi)容時(shí),指令中出現(xiàn)的是存儲(chǔ)單元的地址,存儲(chǔ)單元的內(nèi)容不會(huì)出現(xiàn)在指令中;7、指令劃分方法有兩種:按字節(jié)長(zhǎng)度劃分和按操作數(shù)個(gè)數(shù)劃分,前者將指令劃分為單字節(jié)指令和多字節(jié)指令,后者分為無操作數(shù)、單操作數(shù)和雙操作數(shù)3種;8、多字節(jié)指令機(jī)器碼必須按順序存放在代碼段中,遇到有16位地址偏移量或16位立即數(shù),應(yīng)當(dāng)將低字節(jié)放入低地址,高字節(jié)放入高地址。

9、偽指令無操作碼,因此不能被計(jì)算機(jī)執(zhí)行,也不能驅(qū)動(dòng)相關(guān)邏輯電路動(dòng)作,只能被匯編程序識(shí)別,用于對(duì)程序的說明。偽指令的基本格式為:偽操作助記符操作數(shù)(可選)

10、

段跨越前綴:存儲(chǔ)單元的地址用邏輯地址“基址:偏移量”表示時(shí),指令中為了簡(jiǎn)便起見,只出現(xiàn)偏移量表示,對(duì)段寄存器采取默認(rèn)(又名“缺省”)的方式,例如傳送指令MOVAX,[BX]的源操作數(shù)就在存儲(chǔ)器中,其偏移量就放在BX中,與BX配套的段寄存器默認(rèn)為DS,計(jì)算機(jī)將到數(shù)據(jù)段中地址為DS×10H+BX的存儲(chǔ)單元去取源操作數(shù)。如果源操作數(shù)不在數(shù)據(jù)段而在其它段,例如在附加段中,偏移量卻依舊在BX中,那么就應(yīng)將指令格式修改成MOVAX,ES:[BX]。這種情況被稱為“段跨越”,跨越到其它段去找操作數(shù),ES不是BX默認(rèn)配套的段寄存器。段跨越又稱為段越界。

有3種情況不能使用段跨越:

①程序只能在代碼段中;②使用SP尋址的堆棧操作,段寄存器只能用SS;③使用DI的目的串操作,段寄存器只能用ES。

3.28086/8088尋址方式

指令中尋找操作數(shù)的方式稱為尋址方式。通常在存儲(chǔ)器中的尋址方式越多,編制程序越靈活。但無論哪種計(jì)算機(jī),相應(yīng)的尋址方式只有5種,因?yàn)椴僮鲾?shù)只可能在5個(gè)地方:1、隱含在指令中;2、以立即數(shù)形式直接出現(xiàn)在指令中;3、在寄存器中;4、在存儲(chǔ)器中;5、在I/O設(shè)備中。

1.隱含尋址

操作數(shù)不在指令中出現(xiàn)的尋址方式稱為隱含尋址,這種方式用于對(duì)特定的寄存器實(shí)現(xiàn)特定操作。例如DAA,指令中無AL出現(xiàn),機(jī)器碼27H中無AL編碼出現(xiàn),其功能卻是將AL的內(nèi)容調(diào)整為十進(jìn)制數(shù)。

2.立即尋址

操作數(shù)直接出現(xiàn)在指令中的尋址方式稱為立即尋址,相應(yīng)的操作數(shù)稱為立即數(shù)。例如指令“ADDAX,04A5H”,對(duì)源操作數(shù)04A5H就是立即尋址(對(duì)目的操作數(shù)AX是寄存器尋址)。規(guī)定立即數(shù)只能是8位或16位整數(shù),不能為小數(shù)或其它類型。如果是16位,則機(jī)器碼中以字節(jié)為單位排放,低字節(jié)在前,高字節(jié)在后,本條指令機(jī)器碼就是81C0A504H。立即數(shù)只能作源操作數(shù),不能作目的操作數(shù)。立即尋址用于給寄存器或存儲(chǔ)器賦初值。

3.寄存器尋址

操作數(shù)在CPU內(nèi)部寄存器中且指令給出寄存器名的尋址方式,稱為寄存器尋址。操作數(shù)有8位、16位之分,如果是8位操作數(shù),則只能是AH、AL、BH、BL、CH、CL、DH、DL中的一個(gè);如果是16位操作數(shù),則只能是8個(gè)通用寄存器AX、BX、CX、DX、SP、BP、SI、DI和4個(gè)段寄存器CS、DS、SS、ES中的一個(gè)。例如:INCCX;CX+1→CX,機(jī)器碼為41H,目的操作數(shù)為寄存器尋址MOVDS,AX;DS←AX,機(jī)器碼為8EC8H,目的操作數(shù)和源操作數(shù)都為寄存器尋址

4.存儲(chǔ)器尋址

指令中給出存儲(chǔ)單元地址的尋址方式,稱為存儲(chǔ)器尋址。有段跨越時(shí),指令中出現(xiàn)“段寄存器名:偏移量”;無段跨越時(shí),僅有偏移量出現(xiàn)在指令中,相應(yīng)段寄存器采用默認(rèn)的方式。偏移量用有效地址EA表示,一般計(jì)算公式為

按照偏移量的表現(xiàn)形式,a.存儲(chǔ)器尋址分為直接尋址、b.寄存器間接尋址、c.寄存器相對(duì)尋址、d.基址加變址、e.相對(duì)基址加變址、f.串操作尋址、g.轉(zhuǎn)移類指令尋址共7種方式。各種尋址方式的EA計(jì)算如圖3-1所示,圖中PA(PhysicsAddress)為物理地址。圖3-1存儲(chǔ)器尋址方式(a)直接尋址;(b)寄存器間接尋址;(c)寄存器相對(duì)尋址;(d)基址加變址尋址;(e)相對(duì)基址加變址尋址;(f)串操作尋址;(g)轉(zhuǎn)移類指令尋址1)直接尋址

出現(xiàn)在指令中的EA是位移量DISP,即EA=DISP。在無段跨越情況下,默認(rèn)操作數(shù)在數(shù)據(jù)段DS中,操作數(shù)的地址為DS:DISP。有段跨越時(shí)到跨越的段去找操作數(shù)。

2)寄存器間接尋址

這種尋址方式的特點(diǎn)是操作數(shù)在存儲(chǔ)器中,存儲(chǔ)單元的有效地址由BX、BP、SI和DI中的一個(gè)給出。指令中若沒有用跨越指明段寄存器,則BP默認(rèn)SS,其余3個(gè)默認(rèn)DS。3)寄存器相對(duì)尋址

這種尋址方式的特點(diǎn)是EA由一個(gè)基址或變址寄存器內(nèi)容加上一個(gè)8/16位位移量得到。寄存器為BX、BP、SI或DI,無段跨越時(shí),BP默認(rèn)SS,其余3個(gè)寄存器默認(rèn)DS;有段跨越時(shí),操作數(shù)在跨越段中。

4)基址加變址尋址

使用基址加變址尋址方式,有效地址EA由一個(gè)基址寄存器內(nèi)容加上一個(gè)變址寄存器內(nèi)容組成,指令中只可能出現(xiàn)[BX+SI]、[BX+DI]、[BP+SI]、[BP+DI]4種格式。在不發(fā)生段跨越的情況下,無BP出現(xiàn)的格式默認(rèn)DS段寄存器;有BP出現(xiàn)的格式默認(rèn)SS段寄存器。有段跨越時(shí)到跨越段中去尋找操作數(shù)。

5)相對(duì)基址加變址尋址

有效地址EA由一個(gè)基址寄存器內(nèi)容、一個(gè)變址寄存器內(nèi)容和一個(gè)8位位移量相加而成,默認(rèn)段寄存器方法同上。

6)串操作尋址

數(shù)據(jù)串又稱字符串,是存儲(chǔ)器中若干依次排放數(shù)據(jù)的集合。數(shù)據(jù)串常用它的首地址(第1個(gè)數(shù)據(jù)的地址)和長(zhǎng)度(數(shù)據(jù)個(gè)數(shù))表示。源數(shù)據(jù)串首址存放在DS:SI中;目的數(shù)據(jù)串首址存放在ES:DI中。源數(shù)據(jù)串允許段跨越;目的數(shù)據(jù)串不允許段跨越。

7)轉(zhuǎn)移類指令尋址

轉(zhuǎn)移類指令分為段內(nèi)轉(zhuǎn)移和段間轉(zhuǎn)移兩種。1、所有的條件轉(zhuǎn)移指令都只能實(shí)現(xiàn)段內(nèi)轉(zhuǎn)移,指令中出現(xiàn)的是8位位移量,轉(zhuǎn)移地址范圍限于本條指令地址的-128~+127字節(jié)內(nèi),稱之為段內(nèi)短轉(zhuǎn)移。2、無條件轉(zhuǎn)移指令和調(diào)用指令有段內(nèi)短轉(zhuǎn)移、段內(nèi)區(qū)間轉(zhuǎn)移、段內(nèi)長(zhǎng)轉(zhuǎn)移、段間區(qū)間轉(zhuǎn)移和段間長(zhǎng)轉(zhuǎn)移5種,具體轉(zhuǎn)移尋址方法在3.4.5節(jié)中討論。【例3-8】設(shè)CS=2000H,DS=3000H,SS=4000H,ES=5000H,BX=1020H,BP=3040H,SI=5060H,DI=7080H,DISP=0102H,討論下列指令源操作數(shù)的尋址方式,并計(jì)算EA和PA。

(1)MOVAX,[0A0AH]這是一條直接尋址的指令,EA=0A0AH,PA=DS×10H+EA=30A0AH,指令執(zhí)行結(jié)果是把數(shù)據(jù)段中3000H:0A0AH和3000H:0A0BH兩單元的內(nèi)容送AX。(2)MOVDX,ES:[76B0H]這是一條直接尋址的有段跨越指令,EA=76B0H,PA=ES×10H+EA=576B0H,指令執(zhí)行結(jié)果是把附加段中5000H:76B0H和5000H:76B1H兩單元的內(nèi)容送DX。

(3)MOVCL,[BX]這是一條寄存器間接尋址的指令,EA=1020H,PA=DS×10H+EA=31020H,指令執(zhí)行結(jié)果是把數(shù)據(jù)段中3000H:1020H單元的內(nèi)容送CL。(4)MOVCX,CS:1234H[BP]這是一條寄存器相對(duì)尋址有段跨越的指令,EA=4274H,PA=CS×10H+EA=24274H,指令執(zhí)行結(jié)果是把代碼段中2000H:4274H和2000H:4275H兩個(gè)單元的內(nèi)容送CX。該指令也可以寫成“MOVCX,CS:[BP+1234H]”。格式中的1234H(一般為8/16位位移量DISP)也可以用符號(hào)表示,如寫成“MOVCX,CS:COUNT[BP]”或“MOVCX,CS:[BP+COUNT]”,這時(shí)EA=BP+COUNT,而COUNT的大小需先用偽指令定義。

(5)MOVSS,[BP+SI]這是一條基址加變址尋址的指令,EA=80A0H,PA=SS×10H+EA=480A0H,指令執(zhí)行結(jié)果是把堆棧段中的4000H:80A0H和4000H:80A1H兩個(gè)單元的內(nèi)容送SS,該指令也可以寫成“MOVSS,[BP][SI]”。(6)MOVDX,DISP[BP][DI]這是一條相對(duì)基址加變址尋址的指令,EA=A122H,PA=SS×10H+EA=4A122H,源操作數(shù)邏輯地址是堆棧段中的4000H:A122H和4000H:A123H兩個(gè)單元,該指令還可寫成“MOVDX,DISP[BP+DI]”或“MOVDX,[DISP+BP+DI]”。

堆棧是存儲(chǔ)器的一部分,堆棧操作的尋址方式有兩種。一種用SS:BP,專用于數(shù)據(jù)存取,尋址方式如上所述。另一種用SS:SP,專用于入、出棧操作,但SP不會(huì)出現(xiàn)在指令中,入棧時(shí)只有源操作數(shù)出現(xiàn)在指令中,入棧時(shí)的目的操作數(shù)SS:SP屬于隱含尋址。出棧時(shí)只有目的操作數(shù)出現(xiàn)在指令中,出棧時(shí)的源操作數(shù)SS:SP也屬于隱含尋址。

在存儲(chǔ)器尋址方式中,BX和BP分別稱為基址寄存器和基址指針,它們均可作基址使用。例如“MOVCX,COUNT[BP]”可用于堆棧段中的表格處理,將BP作表格的基址,改變COUNT位移量值,可查得表中的對(duì)應(yīng)值。5.I/O端口尋址

80X86指令系統(tǒng)使用I/O指令對(duì)I/O端口尋址,有直接和DX間接尋址兩種方式。前一種的特點(diǎn)是用8位二進(jìn)制數(shù)表示的I/O端口地址直接出現(xiàn)在指令中,例如“INAL,36H”,含義是地址為36H的I/O端口內(nèi)容送AL。源操作數(shù)就是直接I/O端口尋址方式,目的操作數(shù)屬于寄存器尋址。后一種的特點(diǎn)是16位端口地址放在DX中,例如INAL,DX,含義為DX指明的I/O端口內(nèi)容送AL,源操作數(shù)就是DX間接尋址方式,目的操作數(shù)屬于寄存器尋址。3.38086/8088指令系統(tǒng)3.3.1數(shù)據(jù)傳送指令數(shù)據(jù)傳送是微機(jī)內(nèi)最基本、最重要、最頻繁、任何一個(gè)程序內(nèi)使用次數(shù)最多的操作。它的功能是完成寄存器與寄存器之間、寄存器與存儲(chǔ)器之間、寄存器與I/O端口之間字節(jié)或字的傳送,以及把8位或16位立即數(shù)送至寄存器或存儲(chǔ)器。在存儲(chǔ)器成為操作數(shù)的時(shí)候,可以使用任何一種尋址方式。這類指令又可以分為通用傳送、地址傳送、標(biāo)志傳送和累加器專用傳送4類,如表3-7所示,它們中僅僅只有SAHF和POPF指令影響FLAGS。表3-7數(shù)據(jù)傳送指令

1.通用傳送指令

通用傳送指令包括基本傳送指令MOV、堆棧操作指令PUSH和POP、數(shù)據(jù)交換指令XCHG3種。

1)MOV指令格式:MOVDST,SRC

功能:DST←SRC,把一個(gè)字節(jié)或一個(gè)字從源傳送到目的。使用通用傳送指令應(yīng)注意:(1)立即數(shù)不能成為目的操作數(shù);(2)CS不能成為目的操作數(shù);(3)IP、FLAGS不能成為源或目的操作數(shù);(4)不允許存儲(chǔ)單元同時(shí)成為源和目的操作數(shù);(5)不允許立即數(shù)送段寄存器;(6)不允許段寄存器同時(shí)成為源和目的操作數(shù)。

此外,在給SS寄存器賦值時(shí),系統(tǒng)將自動(dòng)禁止外部中斷,直到本條和下條指令執(zhí)行后,才開中斷。這樣,可用連續(xù)兩條MOV指令依次給SS、SP賦值,有效制止堆棧空間改變過程中去響應(yīng)中斷。

【例3-9】將立即數(shù)2000H送段寄存器DS,建立數(shù)據(jù)段基址。

解由于不允許立即數(shù)直接送段寄存器,因此用8個(gè)通用寄存器之一作橋梁:

MOVAX,2000H

MOVDS,AX;也可以使用其它的通用寄存器,但多使用AX,其它7個(gè)多作專用【例3-10】判斷指令正誤:MOVCS,AX錯(cuò);不允許對(duì)CS賦值MOVAX,CS對(duì)MOVSS,SP 對(duì) MOVAX,ES 對(duì)MOVDS,CS錯(cuò);源目的操作數(shù)不能同為段寄存器MOVAX,IP 錯(cuò);IP不能作為源和目的操作數(shù)MOVBYTEPTR[BX],CS 錯(cuò);源目的操作數(shù)類型不符(源為字節(jié),目的為字)MOVWORDPTR[BX],CS 對(duì)MOVBYTEPTR[BX],256 錯(cuò);源目的操作數(shù)類型不符(源為字節(jié),目的為字)MOVBYTEPTR[BX],255 對(duì)【例3-11】MOVAH,AL為字節(jié)傳送:AH←AL。

【例3-12】MOVAL,AH功能是什么?答有兩種可能:

REG→REG;立即數(shù)AH→AL。

為了防止混亂起見,以字母開頭的立即數(shù)前加“0”或“?!?,即:MOVAL,AH是AH→AL;MOVAL,0AH是10→AL。

從MOVSI,[5678H]和MOVCL,[5678H]比較看出,指令中的寄存器名稱已經(jīng)決定了前一個(gè)為字操作,后一個(gè)為字節(jié)操作。但為了清楚起見,在地址偏移量前面用“WORDPTR”和“BYTEPTR”分別表示“字參數(shù)”和“字節(jié)參數(shù)”。

指令中出現(xiàn)的位移量常常使用符號(hào)代替,例如MOVSI,[5678H]可用MOVSI,[BUFFER]取代(含義為DS:BUFFER和DS:BUFFER+1兩個(gè)單元的內(nèi)容送SI)。符號(hào)BUFFER在本條指令中等于5678H。關(guān)于符號(hào)位移量說明如下:

(1)在指令中使用符號(hào)的好處是能把指令表示成一般的形式,符號(hào)取不同的值,代表了所有的8位或16位位移量。

(2)符號(hào)作地址偏移量時(shí),括號(hào)可以省去,如MOVSI,[BUFFER]可以簡(jiǎn)寫成MOVSI,BUFFER,即MOVSI,[BUFFER]和MOVSI,BUFFER執(zhí)行結(jié)果相同。

(3)8位或16位位移量作地址偏移量時(shí),括號(hào)不能省。試比較MOVSI,[5678H]和MOVSI,5678H,前者把存儲(chǔ)單元中的內(nèi)容送到SI,源操作數(shù)用的是存儲(chǔ)器尋址方式中的直接尋址;后者把立即數(shù)送到SI,源操作數(shù)用的是立即尋址。兩條指令的執(zhí)行結(jié)果不同。

(4)MOVSI,5678H中的立即數(shù)也可以用符號(hào)代替,例如使用名為NUMBER的符號(hào),但是必須要加上“OFFSET”,寫成MOVSI,OFFSETNUMBER。指令中OFFSET稱為屬性操作符,又稱為數(shù)值返回操作符,表示其后緊跟的是存儲(chǔ)單元的立即數(shù)地址,而不是存儲(chǔ)單元的內(nèi)容。使用16位數(shù)字量和符號(hào)的典型用法如表3-8所示。表3-8MOV指令中的數(shù)字量和符號(hào)用例【例3-13】設(shè)DS=2000H,則指令MOVSI,[5678H]的執(zhí)行示意圖如圖5-3所示。

在字傳送時(shí),位于數(shù)據(jù)段DS:5678H單元的內(nèi)容送SI的低8位,DS:5679H單元內(nèi)容送SI的高8位,執(zhí)行結(jié)果SI=0B7AH。圖5-3MOVSI,[5678H]的執(zhí)行示意圖2)堆棧操作指令(1)入棧指令。格式:PUSHSRC示意圖如圖3-4所示。功能:分兩步完成(SS×10H+SP-2)←SRC(16位)。第1步,SP←SP-1,(SS×10H+SP)←SRC高8位;第2步,SP←SP-1,(SS×10H+SP)←SRC低8位。圖5-4PUSH指令(2)出棧指令。格式:POPDST示意圖如圖3-5所示。功能:分兩步完成DST(16位)←(SS×10H+SP+2)。第1步,DST低8位←(SS×10H+SP),SP←SP+1;第2步,DST高8位←(SS×10H+SP),SP←SP+1。圖5-5POP指令

堆棧操作指令有如下特征:1、堆棧操作為字操作;2、能入棧的只能是8個(gè)通用寄存器AX、BX、CX、DX、SP、BP、SI、DI,4個(gè)段寄存器DS、SS、ES、CS,以及字存儲(chǔ)單元;3、能出棧的只能是8個(gè)通用寄存器AX、BX、CX、DX、SP、BP、SI、DI和3個(gè)段寄存器DS、SS、ES,以及字存儲(chǔ)單元;

4、字?jǐn)?shù)據(jù)入、出棧,遵循低字節(jié)在低址、高字節(jié)在高址的數(shù)據(jù)存放規(guī)則,即入棧時(shí)高字節(jié)先入、低字節(jié)后入,出棧時(shí)低字節(jié)先出、高字節(jié)后出。

PUSHAH、POPCL等字節(jié)操作是非法的,PUSH0A0AH、PUSHIP、PUSHFLAGS、POP0A0AH、POPIP、POPFLAGS、POPCS等指令格式也是非法的。3)字節(jié)或字交換指令

格式:XCHGDST,SRC

示意圖如圖3-6所示。

功能:DST和SRC互換內(nèi)容。僅限于8/16位通用寄存器之間、8/16位通用寄存器和存儲(chǔ)單元之間互換內(nèi)容。圖5-6XCHG指令指令格式:XCHGREG/MEM,REG【例3-14】設(shè)AX=0123H,(DS×10H+SI+0400H)=4567H。執(zhí)行XCHGAX,[SI+0400H]后,AX=4567H,(DS×10H+SI+0400H)=0123H。

2.地址傳送指令

地址傳送指令包括送地址偏移量指令LEA、送“DS:偏移量”指令LDS、送“ES:偏移量”指令LES3種,用于傳送段基址和偏移地址。

1)LEA指令

格式:LEADST,SRC

示意圖如圖3-7所示。功能:把存儲(chǔ)單元的16位有效偏移地址EA送指定的寄存器。圖5-7LEA指令【例3-15】執(zhí)行前SI=2030H。執(zhí)行LEASI,[4A1BH]后,SI=4A1BH,為把某單元的偏移地址4A1BH送SI。執(zhí)行MOVSI,4A1BH后,SI=4A1BH,為把立即數(shù)4A1BH送SI。執(zhí)行LEASI,[SI+4A1BH]后,SI=6A4BH。2)LDS指令(LDS是“LoadDataSegment”的簡(jiǎn)寫)

格式:LDSDST,SRC

示意圖如圖3-8所示。功能:把內(nèi)存4個(gè)單元的32位數(shù)送到段寄存器DS和由DST指出的偏移量寄存器。低16位→BX/SI/DI,高16位→DS,且低字節(jié)→低位,高字節(jié)→高位。圖5-8LDS指令【例3-16】執(zhí)行LDSSI,[DI+100AH]指令的結(jié)果是SI←(DS×10H+DI+100AH,DS×10H+DI+100BH),DS←(DS×10H+DI+100CH,DS×10H+DI+100DH)。設(shè)執(zhí)行前DS=2000H,SI=A024H,DI=0005H,則指令指出的存儲(chǔ)單元地址為:20000H+0005H+100AH=2100FH,21010H,21011H,21012H。設(shè)4個(gè)單元的內(nèi)容如下:則指令執(zhí)行后,DS=2230H,SI=0180H,DI=0005H。圖5-9LES指令【例3-17】LESDI,[BX]指令使用BX間接尋址,表明源操作數(shù)在數(shù)據(jù)段內(nèi)。設(shè)執(zhí)行前DS=B000H,ES=2A00H,BX=080AH,(B080AH)=A2H,(B080BH)=05H,(B080CH)=00H,(B080DH)=40H,則執(zhí)行后,DI=05A2H,ES=4000H,BX=080AH。

3.標(biāo)志位傳送指令

標(biāo)志位傳送指令包括讀標(biāo)志指令LAHF、寫標(biāo)志指令SAHF、FLAGS入棧指令PUSHF、FLAGS出棧指令POPF共4種,用于了解或保存標(biāo)志寄存器的內(nèi)容,或設(shè)置某些標(biāo)志位。

1)讀標(biāo)志指令LAHF

格式:LAHF

功能:AH←FLAGSL(內(nèi)含5個(gè)標(biāo)志位CF、PF、AF、ZF、SF)。2)寫標(biāo)志指令SAHF格式:SAHFLAHF和SAHF指令示意圖如圖3-10所示。功能:FLAGL(內(nèi)含5個(gè)標(biāo)志位CF、PF、AF、ZF、SF)←AH。圖3-10LAHF和SAHF指令3)FLAGS入棧指令PUSHF

格式:PUSHF

功能:FLAGS入棧。入棧操作步驟依次為SP←SP-1,(SS×10H+SP)←FLAGSH,SP←SP-1,(SS×10H+SP)←FLAGSL。FLAGSH和FLAGSL是FLAGS的高、低8位。4)FLAGS出棧指令POPF

格式:POPF

功能:FLAGS出棧。出棧操作步驟依次為FLAGSL←(SS×10H+SP),SP←SP+1,F(xiàn)LAGSH←(SS×10H+SP),SP←SP+1。入、出棧指令常成對(duì)使用,分別用于子程序和中斷服務(wù)程序首尾,保護(hù)和恢復(fù)主程序的各個(gè)標(biāo)志位。

5)LES指令(LES是“LoadExtraSegment”的簡(jiǎn)寫)

格式:LESDST,SRC

功能:把指令指出的源操作數(shù)4個(gè)存儲(chǔ)單元的內(nèi)容分別送存放EA的寄存器和ES。低16位→BX/SI/DI,高16位→ES,且低字節(jié)→低位,高字節(jié)→高位。

4.累加器專用傳送指令

1)I/O數(shù)據(jù)傳送指令

(1)輸入指令I(lǐng)N。格式:INAC,PORT

功能:I/O端口的8/16位二進(jìn)制數(shù)傳送到AL/AX。格式中AC表示AL或AX;PORT表示I/O端口地址。I/O端口地址為8位時(shí),PORT可以是用8位立即數(shù)表示的直接地址,地址編號(hào)為0~255(00H~FFH),也可以是已定義過的8位符號(hào)常量;I/O端口地址為16位時(shí),PORT只能是DX間接尋址,地址編號(hào)為0~65535(0000H~FFFFH)。IN指令的格式有4種形式:INAX,8位PORT;INAL,8位PORT;INAX,DX;INAL,DX。

(2)輸出指令OUT。

格式:OUTPORT,AC

功能:AL/AX的8/16位二進(jìn)制數(shù)傳送到I/O端口。格式中AC表示AL或AX;PORT表示I/O端口地址,說明同于IN指令。OUT指令的格式也有4種形式:OUT8位PORT,AX;OUT8位PORT,AL;OUTDX,AX;OUTDX,AL。2)字節(jié)翻譯指令(代碼轉(zhuǎn)換指令或者查表指令)XLAT

格式:XLAT

功能:AL←(BX+AL)。本條指令完成一個(gè)字節(jié)的編碼轉(zhuǎn)換,轉(zhuǎn)換前要先在內(nèi)存中建立一個(gè)代碼轉(zhuǎn)換表。例如將十進(jìn)制數(shù)0~9轉(zhuǎn)換為數(shù)碼顯示的七段顯示碼表,設(shè)表首址DS=1000H,偏移量為0030H,則內(nèi)存相應(yīng)單元如下:顯示“2”的程序段為:MOVAX,#1000H MOVDS,AX ;建立段基址MOVBX,0030H ;BX←0030H,首址→BXMOVAL,02H ;要轉(zhuǎn)換的十進(jìn)制數(shù)2→AL,AL=2HXLAT ;(DS×16+BX+AL)→AL,AL=24H, 將2轉(zhuǎn)換為24H3.4.2算術(shù)運(yùn)算指令表3-9算術(shù)運(yùn)算指令表3-9算術(shù)運(yùn)算指令1.加法指令

加法指令包括不帶進(jìn)位位的加法指令A(yù)DD、帶進(jìn)位位的加法指令A(yù)DC、加1指令I(lǐng)NC,共3種。

1)不帶進(jìn)位位的加法指令格式:ADDDST,SRC

功能:DST←DST+SRC,CF←進(jìn)位位。將目的操作數(shù)DST和源操作數(shù)SRC相加,結(jié)果放入DST中,進(jìn)位位放入CF中。源操作數(shù)允許8位或16位立即數(shù)、通用寄存器和存儲(chǔ)單元,目的操作數(shù)不允許是立即數(shù),其它和源操作數(shù)相同,但不允許兩者同為存儲(chǔ)器操作數(shù),由此有5種格式:ADDREG,DATA ;REG+DATA→REG,CF←進(jìn)位位ADDMEM,DATA ;MEM+DATA→MEM,CF←進(jìn)位位ADDMEM,REG ;MEM+REG→MEM,CF←進(jìn)位位ADDREG,REG ;REG+REG→REG,CF←進(jìn)位位ADDREG,MEM ;REG+MEM→REG,CF←進(jìn)位位

2)帶進(jìn)位位的加法指令A(yù)DC

格式:ADCDST,SRC

功能:DST←DST+SRC+CF,CF←進(jìn)位位。與ADD指令不同的是,ADC要把CF進(jìn)位標(biāo)志加入,且加法完成后CF將得新值。ADC的5種格式以及對(duì)DST、SRC的要求同于ADD指令。

【例3-19】多字節(jié)無符號(hào)數(shù)相加。以4字節(jié)為例,32位二進(jìn)制數(shù)相加,設(shè)X=0007A379H,Y=00057E4FH,求X+Y,且和放在DX:AX中。試編程。

解:將第一個(gè)加數(shù)X放入DX:AX中,第二個(gè)加數(shù)放入BX:CX中。MOVAX,A379H MOVDX,0007H ;DX:AX=0007A379HMOVCX,7E4FH MOVBX,0005H ;BX:CX=00057E4FHADDAXCX ;實(shí)現(xiàn)低16位相加,和→AX,進(jìn)位→CFADCDX,BX ;兩高16位及低16位來的進(jìn)位位相加,和→DX,進(jìn) 位→CF程序執(zhí)行完,DX:AX=000D21C8H,CF=0。3)加1指令I(lǐng)NC

格式:INCDST

功能:DST←DST+1。DST為8/16位通用寄存器或存儲(chǔ)器操作數(shù),不允許為立即數(shù)。

2.減法指令

減法指令包括不帶借位位的減法指令SUB、帶借位位的減法指令SBB、減1指令DEC、求補(bǔ)指令NEG、比較指令CMP,共5種。

1)不帶借位位的減法指令SUB

格式:SUBDST,SRC

功能:DST-SRC→DST,借位→CF。實(shí)現(xiàn)8/16位二進(jìn)制數(shù)減法,目的操作數(shù)是被減數(shù),源操作數(shù)是減數(shù),差放入目的操作數(shù)內(nèi),借位位送入CF標(biāo)志位。目的操作數(shù)容許是8/16位通用寄存器、存儲(chǔ)器,立即數(shù)不能作被減數(shù);源操作數(shù)容許是8/16位通用寄存器、存儲(chǔ)器、立即數(shù),但不允許存儲(chǔ)器同時(shí)為目的操作數(shù)和源操作數(shù)。通用寄存器指8個(gè)8位寄存器AH、AL、BH、BL、CH、CL、DH和DL以及8個(gè)16位寄存器AX、BX、CX、DX、SP、BP、SI和DI。涉及存儲(chǔ)單元操作數(shù)的,可以使用任何一種尋址方式。這一類指令包括5種類型,如圖3-11所示。圖5-11SUBDST,SRC指令的類型通用REG←通用REG-通用REG;(b)通用REG←通用REG-存儲(chǔ)器;(c)存儲(chǔ)器←存儲(chǔ)器-REG;(d)存儲(chǔ)器←存儲(chǔ)器-立即數(shù);(e)通用REG←通用REG-立即數(shù)【例3-21】設(shè)CS=2000H,IP=9248H,DS=4000H,BX=3160H,SI=1020H,(41020H)=2130H,則指令SUBBX,[SI]的操作結(jié)果為BX=3160H-2130H=1030H,標(biāo)志寄存器FLAGS的各位分別是:CF=0,PF=0,AF=0,ZF=0,SF=1,OF=0。2)帶借位位的減法指令SBB

格式:SBBDST,SRC

功能:DST-SRC-CF→DST,借位→CF。完成帶借位位的二進(jìn)制數(shù)相減,與SUB指令的執(zhí)行過程基本相同,不同的是多了一個(gè)減少CF的原狀態(tài),結(jié)果的借位位能使CF成為新狀態(tài)。

3)減1指令DEC

格式:DECDST

功能:DST←DST-1。不影響CF位,但影響其它5個(gè)標(biāo)志位。4)求補(bǔ)指令NEG

格式:NEGDST

功能:DST←0-DST,或DST←DST+1,或?qū)懗蒁ST←0FFFFH-DST+1。所有位按位求反后加1,DST為8/16位通用寄存器或存儲(chǔ)器操作數(shù)。本條指令說明如下:

①“+1”是指DST的所有位逐位求反后再加1,與“0-DST”的結(jié)果是一樣的。例如設(shè)AL=00000100B=+4,逐位求反再加1后得+1=11111100=(-4)補(bǔ),而0-DST=00000000-00000100,也得11111100=(-4)補(bǔ)。

②這條指令所說的“求補(bǔ)”實(shí)質(zhì)上是:若DST為正數(shù),求補(bǔ)得絕對(duì)值相等的負(fù)數(shù)(補(bǔ)碼);若DST為負(fù)數(shù)(補(bǔ)碼),求補(bǔ)得絕對(duì)值相等的正數(shù)。顯然,求補(bǔ)指令的“求補(bǔ)”不同于第1章介紹的補(bǔ)碼求法。第1章中求補(bǔ)的方法是:正數(shù)的補(bǔ)碼是其原碼自身;負(fù)數(shù)的補(bǔ)碼是其反碼加1。③因指令實(shí)現(xiàn)0-DST,除DST為0外,必然有借位,使CF=1。④當(dāng)操作數(shù)為80H(-128)或8000H(-32768)時(shí),執(zhí)行NEG指令后,結(jié)果不變。但OF置1,有溢出。【例3-22】已知CH=1AH=00011010B=+26,執(zhí)行NEGCH后,CH=?

解執(zhí)行NEGCH后,CH為(-26)補(bǔ),CH=(-26)補(bǔ)=11100110B=E6H。

【例3-23】已知CH=E6H=11010110B=-26,執(zhí)行NEGCH后,CH=?

解執(zhí)行NEGCH后,CH為(+26)補(bǔ),CH=(+26)補(bǔ)=00011010B=1AH。5)比較指令CMP

格式:CMPDST,SRC

功能:DST-SRC。不送結(jié)果,僅置標(biāo)志位,可進(jìn)行8/16位二進(jìn)制數(shù)比較,對(duì)于目的操作數(shù)和源操作數(shù)的限制以及指令的5種類型都同于SUB指令。比如立即數(shù)不能作被減數(shù),兩存儲(chǔ)單元數(shù)不能比較。以下是根據(jù)標(biāo)志位判斷兩數(shù)大小的一些做法:

兩個(gè)無符號(hào)數(shù)相減,用CF判斷:CF=0表示被減數(shù)大;CF=1表示減數(shù)大。

兩個(gè)有符號(hào)數(shù)相減,由OF⊕SF判斷:OF⊕SF=0表示DST≥SRC;OF⊕SF=1表示DST<SRC。無論有符號(hào)數(shù)還是無符號(hào)數(shù),若ZF=1則表示DST=SRC;ZF=0則表示DST≠SRC。【例3-24】給下列程序作注解。CMPCOUNT[SI],CX ;內(nèi)存(DS×10H+SI+COUNT)-CXJNZLONG ;上述運(yùn)算結(jié)果不為0時(shí),轉(zhuǎn)LONGMOVDX,AX ;CMP運(yùn)算結(jié)果為0時(shí),執(zhí)行下一條指令

3.乘法指令

1)無符號(hào)數(shù)乘法指令格式:MULSRC

功能:實(shí)現(xiàn)兩個(gè)8/16位無符號(hào)二進(jìn)制數(shù)相乘,一個(gè)乘數(shù)因子是AL/AX,另一個(gè)是SRC,SRC為8/16位通用寄存器或存儲(chǔ)器操作數(shù)。1、8位數(shù)相乘時(shí),執(zhí)行AX←AL×SRC,16位乘積送入AX中;2、16位數(shù)相乘時(shí),執(zhí)行DX:AX←AX×SRC,32位乘積的高16位送入DX,低16位送入AX。當(dāng)運(yùn)算結(jié)果使高位字節(jié)AH≠0(8位乘)或高位字DX≠0(16位乘)時(shí),標(biāo)志位CF、OF均為1,其余標(biāo)志位任意?!纠?-25】已知AX=AB12H,DS=6000H,BX=789AH,(6789CH)=66H,執(zhí)行MULBYTEPTR[BX+02H]后,AX=?DS=?BX=?標(biāo)志位=?

AX=12H×66H=072CH,DS、BX不變。OF=CF=1,SF、ZF、AF、PF任意。2)有符號(hào)數(shù)乘法指令

格式:IMULSRC

功能:除符號(hào)位外,IMUL其余與MUL指令相同。相乘方法是:將參加運(yùn)算的操作數(shù)變?yōu)樵a,符號(hào)位與符號(hào)位相乘,數(shù)值位與數(shù)值位相乘,給乘積賦予正確的符號(hào),并變?yōu)檠a(bǔ)碼,就是最終結(jié)果。當(dāng)AH為AL的符號(hào)位擴(kuò)展,即AH=00H或AH=FFH時(shí),OF=CF=0,否則OF=CF=1,其余標(biāo)志位任意?!纠?-26】設(shè)AX=00FEH,CH=11H,執(zhí)行IMULCH后,AX=?CH=?

解設(shè)AL=FEH為(X)補(bǔ),X=-2,CH=11H=(+17)補(bǔ),符號(hào)位運(yùn)算得-1,數(shù)值位運(yùn)算得34,配上符號(hào)(-1),求得AX=(-34)補(bǔ)=FFDEH,CH不變,AH由AL符號(hào)位擴(kuò)展而得,OF=CF=0。4.除法指令

除法指令包括無符號(hào)數(shù)除法指令DIV、有符號(hào)數(shù)除法指令I(lǐng)DIV、擴(kuò)展指令CBW和CWD共3種。要求:被除數(shù)為除數(shù)字長(zhǎng)的兩倍。它們所在的位置如下:

除數(shù)為0位時(shí),產(chǎn)生類型0中斷。類型0中斷的過程為:①FLAGS入棧;②IF和TF清0;③CS、IP入棧;④內(nèi)存(0000H)→IP,(0002H)→CS;⑤進(jìn)入中斷服務(wù)程序。1)無符號(hào)數(shù)除法指令

格式:DIVSRC

功能:=AL余AH; =AX余DX。SRC為8/16位通用寄存器或存儲(chǔ)器操作數(shù)。2)有符號(hào)數(shù)除法指令I(lǐng)DIV

有符號(hào)數(shù)除法指令I(lǐng)DIV的格式和功能同于DIV。被除數(shù)、除數(shù)、商數(shù)和余數(shù)都是有符號(hào)數(shù),最高位為符號(hào)位,做除法時(shí)應(yīng)化補(bǔ)碼為原碼,用真值算。例如設(shè)AX=1500H,[BX+SI]=22H,執(zhí)行指令DIVBYTEPTR[BX+SI],有AX/(BX+SI)=1500H/22H=5376/34=158余4,結(jié)果AX=049EH。當(dāng)遇到被除數(shù)和除數(shù)的符號(hào)不同時(shí),要求余數(shù)符號(hào)與被除數(shù)符號(hào)相同。例如設(shè)AX=FFDDH=(-35)補(bǔ),CH=06H=(+6)補(bǔ),除法(-35)÷6的結(jié)果有兩個(gè):一個(gè)是商-6余+1,一個(gè)是商-5余-5。執(zhí)行IDIVCH,微機(jī)內(nèi)得到后一個(gè)結(jié)果。商AL=(-5)補(bǔ)=FBH,余數(shù)AH=(-5)補(bǔ)=FBH。如果除數(shù)是8位(16位),而被除數(shù)也只有8位(16位)字節(jié)(字)數(shù)據(jù),并且放在AL(AX)中,那么應(yīng)當(dāng)將8位(16位)字節(jié)(字)數(shù)據(jù)進(jìn)行符號(hào)位擴(kuò)展,從AL(AX)擴(kuò)展到AX(DX:AX),使其成為16位(32位)數(shù)據(jù),再做除法。字節(jié)除法商的范圍為-128~+127,字除法商的范圍為-32768~+32767。商超出此范圍時(shí)當(dāng)作除數(shù)為0處理,內(nèi)部產(chǎn)生一個(gè)類型0中斷。3)擴(kuò)展指令CBW和CWD

這兩條指令不影響標(biāo)志位。

CBW的功能是將AL的符號(hào)位擴(kuò)展到AH中,將字節(jié)擴(kuò)展為字。當(dāng)AL<80H時(shí),擴(kuò)展后AH=00H;當(dāng)AL≥80H時(shí),擴(kuò)展后AH=FFH。CWD的功能是將AX的符號(hào)位擴(kuò)展到DX中,將字?jǐn)U展成雙字。當(dāng)AX<8000H時(shí),擴(kuò)展后DX=0000H;當(dāng)AX≥8000H時(shí),擴(kuò)展后DX=FFFFH。5.十進(jìn)制調(diào)整指令

十進(jìn)制調(diào)整指令有6條,對(duì)用組合BCD碼、未組合BCD碼及ASCII碼表示的數(shù)算術(shù)運(yùn)算后調(diào)整。

1)組合BCD碼加法十進(jìn)制調(diào)整指令DAA

DAA位于ADD和ADC指令后。功能:若ADD或ADC指令運(yùn)算后,使AL低4位>1001B或AF=1,則AL+06H→AL且使CF=1;若ADD或ADC指令運(yùn)算后,使AL高4位>1001B或CF=1,則AL+60H→AL且使CF=1。

2)未組合BCD碼加法十進(jìn)制調(diào)整指令A(yù)AA

AAA也稱為ASCII碼調(diào)整指令,接在ADD或ADC之后。功能:若ADD或ADC指令使AL低4位>1001或AF=1,則AL+06H→AL,且使AF=1,AH+1→AH;執(zhí)行AL←AL∧0FH,即將AL高4位清0,CF←AF。如果ADD或ADC指令使AL低4位≤1001且AF=0,則直接執(zhí)行上述后兩步,此時(shí)AF=0。

3)組合BCD碼減法的十進(jìn)制調(diào)整指令DAS

DAS接在SUB或SBB指令中。功能:對(duì)AL中的運(yùn)算結(jié)果調(diào)整。方法:若AL低4位>1001或AF=1,則進(jìn)行AL-06H→AL,且使AF=1;若AL高4位>1001或CF=1,則進(jìn)行AL-60H→AL,且使CF=1。

DAS指令對(duì)OF無影響,對(duì)其余5個(gè)標(biāo)志位有影響。

【例3-27】設(shè)AL=60H=01100000B,AH=21H=00100001B,則執(zhí)行SUBAL,AHDAS后,AL=?

SUBAL,AH的執(zhí)行結(jié)果為AL=3FH。DAS執(zhí)行完后,AL=39H,OF=0,AF=1。若事先存放在AL和AH中的是BCD碼,則DAS后AL中也是BCD碼。

4)未組合BCD碼減法的十進(jìn)制調(diào)整指令A(yù)AS

AAS也稱為減法的ASCII碼調(diào)整指令,要求參加SUB、SBB運(yùn)算的兩個(gè)數(shù)是未組合BCD或ASCII碼,在SUB或SBB指令(一定以AL為目的)后執(zhí)行。功能:①若AL低4位>1001或AF=1,則AL-6→AL,AH-1→AH,且使AF=1;②AL←AL∧0FH,即將AL高4位清0;③CF←AF?!纠?-28】設(shè)AX=0103H,BL=06H,則執(zhí)行SUBAL,BLAAS后的結(jié)果如何?

解第1條指令執(zhí)行后AL=11111101B;第2條指令執(zhí)行后,AX=0007H,CF=1,AF=1,BL=06H。

5)未組合BCD碼乘法的十進(jìn)制調(diào)整指令A(yù)AM

AAM也稱為乘法的ASCII碼調(diào)整指令,在MUL指令后執(zhí)行。參加MUL相乘的兩個(gè)數(shù)應(yīng)當(dāng)是高4位為0的8位未組合BCD碼。功能:AL÷0AH后,商→AH,余數(shù)→AL。

【例3-29】AL和BL為兩個(gè)未組合BCD碼,AL=08H,BL=07H。執(zhí)行MULBL后,AX=0038H。執(zhí)行AAM后,AX=0506H,表示十進(jìn)制數(shù)8×7=56,影響PF、SF、ZF標(biāo)志。

6)未組合BCD碼除法的十進(jìn)制調(diào)整指令A(yù)AD

AAD也稱為除法的ASCII碼調(diào)整指令,在DIV指令之前進(jìn)行。參加DIV除法運(yùn)算的3個(gè)8位數(shù)(位于AH、AL和DIV指令指出的源操作數(shù))都應(yīng)為未組合BCD碼。

功能:將AX中的未組合BCD碼(兩位十進(jìn)制數(shù),十位數(shù)在AH中,個(gè)位數(shù)在AL中)變成二進(jìn)制數(shù),并放入AL?!纠?-30】設(shè)AX=0607H,即AH=06H,AL=07H,BL=02H,則執(zhí)行AADDIVBL;后的結(jié)果如何?

解第1條指令執(zhí)行后,AX=0043H=67,PF=0(AL中奇數(shù)個(gè)1),SF=0,ZF=0;第2條指令執(zhí)行后,AX=0121H(AH=01為余數(shù),AL=33為商),對(duì)標(biāo)志位無影響。(運(yùn)算結(jié)果為二進(jìn)制數(shù))3.4.3邏輯運(yùn)算和移位循環(huán)指令表3-10邏輯運(yùn)算和移位循環(huán)指令1.邏輯運(yùn)算指令

1)邏輯“與”指令A(yù)ND

格式:ANDDST,SRC

功能:DST←DST∧SRC。目的操作數(shù)限于使用8/16位通用寄存器、存儲(chǔ)單元,源操作數(shù)允許使用8/16位通用寄存器、存儲(chǔ)單元和立即數(shù),但目的操作數(shù)和源操作數(shù)不允許同時(shí)為存儲(chǔ)器操作數(shù)。指令影響PF、SF和ZF標(biāo)志位,且使CF=0,OF=0,不影響AF?!纠?-31】ANDAL,AL有什么作用?

解功能為AL∧AL→AL,所以AL內(nèi)容維持不變。

使標(biāo)志位CF清零。

2)邏輯“或”指令OR

格式:ORDST,SRC

功能:DST←DST?SRC。對(duì)DST和SRC按位相或,其限制及標(biāo)志位影響同于“與”指令。

【例3-32】ORAL,80H的作用為將AL的D7位置1。3)邏輯“異或”指令XOR

格式:XORDST,SRC

功能:DST←DST⊕SRC。對(duì)DST和SRC的限制及標(biāo)志位影響同于“與”指令。XOR可用于使寄存器清零。如XORBX,BX能使BX=0000H。

【例3-33】編程使某存儲(chǔ)單元(位于DS段,用BX尋址)清零,要求使用異或指令。

解因?yàn)閄OR[BX],[BX]是非法的,所以程序如下:XORAX,AXMOVWORDPTR[BX],AX4)求反指令NOT

格式:NOTDST

功能:DST←DST,將DST所有位逐位求反。DST為8/16位通用或存儲(chǔ)器操作數(shù)。

【例3-36】設(shè)AX=0100000010000110B=4086H,則執(zhí)行NOTAX后,AX=BF79H。

【例3-37】寫出兩條使DI→DI的指令。

NOTDI;XORDI,0FFH。5)測(cè)試指令TEST

格式:TESTDST,SRC

功能:DST∧SRC。相“與”后不送結(jié)果,僅影響標(biāo)志位。對(duì)標(biāo)志位影響同于“與”。

【例3-38】指令TESTAL,02H用于測(cè)試AL的D1位,若該位為0,則ZF=1,否則ZF=0。【例3-34】寫出5條能使SI清零的指令。

XORSI,SI;MOVSI,0000H;ANDSI,0000H;LEASI,[0000H];SUBSI,SI。

【例3-35】寫出5條能使CF清零但又不影響寄存器內(nèi)容的指令。

ANDAX,AX;ORAX,AX;XORAX,00H;TESTAX,00H;TESTAX,AX。2.移位指令移位指令有4條,分別是算術(shù)左移SAL(ShiftArithmeticLeft)、算術(shù)右移SAR(ShiftArithmeticRight)、邏輯左移SHL(ShiftLogicLeft)和邏輯右移SHR(ShiftLogicRight)。4條指令有完全相同的格式,指令中的目的操作數(shù)REG/MEM限于使用8/16位通用寄存器和存儲(chǔ)器;源操作數(shù)CNT是移位次數(shù),限于CL或1,最多能移255位。4條指令對(duì)標(biāo)志位的影響也相同,除AF任意外,操作結(jié)果影響CF、PF、ZF、SF和OF。移位指令的操作功能如圖3-12所示。算術(shù)左移和邏輯左移的操作結(jié)果完全相同。算術(shù)右移可保持目的操作數(shù)的符號(hào)位不變,因此常用于有符號(hào)數(shù)移位。算術(shù)左(右)移n位,相當(dāng)于把二進(jìn)制數(shù)乘以(除以)2n。邏輯右移時(shí),目的操作數(shù)最高位補(bǔ)0,可用于截取字節(jié)或字中某些位。圖5-12移位指令(a)算術(shù)左移;(b)算術(shù)右移;(c)邏輯左移;(d)邏輯右移【例3-39】設(shè)執(zhí)行前BL=75H,CL=03H,求指令SALBL,CL的執(zhí)行結(jié)果。

BL內(nèi)容算術(shù)左移3位:【例3-40】下面兩段程序均能完成X×10的運(yùn)算,X在AL中,比較它們的執(zhí)行時(shí)間。程序1: MULCL ;設(shè)CL=0AH,查表需時(shí)最少70T

程序2: SALAL,1 ;左移1位,X×2,查表需時(shí)2T

MOVBL,AL;暫存X×2,查表需時(shí)2T

SALAL,1 ;左移1位,X×4,查表需時(shí)2T

SALAL,1 ;左移1位,X×8,查表需時(shí)2T

ADDAL,BL;X×8+X×2=X×10,查表需時(shí) 3T,共需時(shí)11T

3.循環(huán)指令循環(huán)指令有4條,如圖5-13所示,分別是:不含進(jìn)位位的循環(huán)左移指令ROL(RotateLeft);不含進(jìn)位位的循環(huán)右移指令ROR(RotateRight);包含進(jìn)位位的循環(huán)左移指令RCL(RotatethroughCFLeft);包含進(jìn)位位的循環(huán)右移指令RCR(RotatethroughCFRight)。圖5-13循環(huán)指令(a)不含進(jìn)位位的循環(huán)左移;(b)不含進(jìn)位位的循環(huán)右移;(c)包含進(jìn)位位的循環(huán)左移;(d)包含進(jìn)位位的循環(huán)右移

循環(huán)指令可以分成不含進(jìn)位位的循環(huán)和包含進(jìn)位位的循環(huán)兩類,每一類又有左移、右移兩種。不含進(jìn)位位時(shí),僅有目的操作數(shù)進(jìn)行循環(huán)操作;包含進(jìn)位位時(shí),CF位于循環(huán)圈內(nèi)。循環(huán)雖然也是一種移位,但循環(huán)指令和移位指令的明顯區(qū)別是:循環(huán)移位是一種閉環(huán)移位,移出的目的操作數(shù)某一位并不丟失,而是移到另一端。循環(huán)指令又稱為循環(huán)移位指令,而移位指令又稱為非循環(huán)移位指令。循環(huán)指令的移位格式、對(duì)目的操作數(shù)和源操作數(shù)的要求完全同于移位指令,但它們只影響CF和OF標(biāo)志位,不影響其它標(biāo)志位。5.4.4串操作指令所謂“字符串”是指一個(gè)數(shù)據(jù)塊或多個(gè)字符的集合,簡(jiǎn)稱“串”。微機(jī)經(jīng)常要對(duì)字符串執(zhí)行一些諸如計(jì)算串長(zhǎng)度、查找關(guān)鍵字、修改字符參數(shù)、判斷兩個(gè)串是否相同等操作,這些操作統(tǒng)稱為“串操作”。使用串操作指令能夠方便地完成8/16位數(shù)據(jù)串或字符串的傳送、比較、搜索、讀和寫。串操作指令如表3-11所示,分成重復(fù)前綴和字符串操作兩類。這些指令是指令系統(tǒng)中惟一一組能直接處理源和目的操作數(shù)都在存儲(chǔ)器內(nèi)的指令。每次串操作后,存放操作數(shù)偏移地址的SI和DI內(nèi)容將自動(dòng)修改。如果用CLD指令使方向標(biāo)志DF=0,則修改時(shí)SI和DI按增量修改(字節(jié)操作加1,字操作加2);如果用STD指令使DF=1,則減量修改。串操作指令采用隱含尋址方式(源操作數(shù)起址為DS:SI,目的操作數(shù)起址為ES:DI),字符串長(zhǎng)度存放于CX中,被處理的長(zhǎng)度最長(zhǎng)達(dá)64KB。串操作指令前可以加重復(fù)前綴指令,使串操作指令重復(fù)進(jìn)行,直至CX=0為止。每一種串操作指令格式雖有3種,但因采取隱含尋址,故指令只需寫出助記符即可。表3-11串操作指令表3-11串操作指令1.重復(fù)前綴指令重復(fù)前綴指令有3條,不能單獨(dú)使用。

1)無條件重復(fù)前綴REP

用途:用于任一條串操作指令前,使指令執(zhí)行到CX=0為止。

2)當(dāng)相等/為0時(shí)重復(fù)前綴REPE/REPZ

用途:常與串比較指令CMPS連用,比較的兩數(shù)不相等時(shí),使指令執(zhí)行到Z=0(比較的兩數(shù)不相等)或CX=0(所有的數(shù)比較完畢)為止。

3)當(dāng)不等/不為0時(shí)重復(fù)前綴REPNE/REPNZ

用途:常與串搜索SCAS指令連用,使指令執(zhí)行到Z=1或CX=1為止。

2.基本字符串指令基本字符串指令有5條。

1)串傳送(MoveString)

格式:MOVS目的串,源串

MOVSB/MOVSW

功能:將源串(DS:SI)所指存儲(chǔ)單元內(nèi)容傳送到目的串(ES:DI)所指存儲(chǔ)單元,傳送后SI、DI將自動(dòng)修改。指令不影響標(biāo)志位。MOVSB用于傳送一個(gè)字節(jié),MOVSW用于傳送一個(gè)字。指令的基本格式是MOVS,但需指明是字節(jié)傳送還是字傳送,例如

MOVSBLOAK1,BLOAK2指令在使用前就應(yīng)先定義BLOAK1和BLOAK2是字節(jié)數(shù)據(jù)還是字?jǐn)?shù)據(jù),并且BLOAK1一定要在附加段中,BLOAK2一定要在數(shù)據(jù)段中。有了事先的說明后,匯編程序就能根據(jù)操作數(shù)的屬性自動(dòng)判斷,才不會(huì)出差錯(cuò)。MOVSB和MOVSW是MOVS的替代符,由于指令助記符已用“B”、“W”標(biāo)明是字節(jié)數(shù)據(jù)或字?jǐn)?shù)據(jù),因此不再需要操作數(shù)。其它基本字符串指令都可以使用替代符,使編程方便又不易出錯(cuò)?!纠?-41】將1000H:2000H地址開始的100個(gè)字節(jié)數(shù)傳送到3000H:4000H開始的單元中。

MOV AX,1000H

MOV DS,AX ;設(shè)立DS段首址

MOV AX,3000H

MOV ES,AX ;設(shè)立ES段首址

MOV SI,2000H ;送源串首址偏移量

MOV DI,4000H ;送目的首址偏移量

MOV CX,064H ;送串長(zhǎng)度

CLD ;置DF←0,使SI、DI按增量方向修改NEXT:MOVSB;將(DS:DX)1個(gè)字節(jié)傳送到(ES:DI),SI、DI各自動(dòng)加1

DECCX;CX減1

JNZNEXT;64H個(gè)字節(jié)未傳送完,轉(zhuǎn)NEXT繼續(xù)傳送,直至傳送完,退出【例3-42】上例程序如果使用重復(fù)前綴REP,則可取代哪些語(yǔ)句?答上例最后3條指令可以用一條指令REPMOVSB代替。

【例3-43】上例程序能否使用MOVSW實(shí)現(xiàn)?答可以,前6條設(shè)置段首址、偏移量指令相同,第7條指令以后修改如下:

MOV CX,50;送串長(zhǎng)度

CLD ;置DF←0,使SI、DI按增量方向修改NEXT:MOVSW ;傳送1個(gè)字,SI、DI各自動(dòng)加2

DEC CX ;CX減1

JNZ NEXT ;50個(gè)字未傳送完,轉(zhuǎn)NEXT繼續(xù)傳送,直至傳送完,退出2)串比較(CompareString)

格式:CMPS源串,目的串

CMPSB/CMPSW

功能:將源串(DS:SI)所指存儲(chǔ)單元內(nèi)容減去目的串(ES:DI)所指存儲(chǔ)單元內(nèi)容,但不送結(jié)果,僅置標(biāo)志位(OSZAPC位),并使SI、DI自動(dòng)修改指向下一單元。CMPSB用于比較一個(gè)字節(jié),CMPSW用于比較一個(gè)字。常和重復(fù)前綴REPE/REPZ使用。串比較指令的幾種格式中,常用替代符CMPSB(字節(jié)比較)和CMPSW(字比較),如果要用CMPS這種形式,與MOVS指令一樣,要事先對(duì)操作數(shù)說明。此外特別要注意的是:本條指令“源操作數(shù)”在前,“目的操作數(shù)”在后,這是80X86指令系統(tǒng)中的惟一一個(gè)例外,其它兩操作數(shù)指令都是“目的操作數(shù)”在前,“源操作數(shù)”在后,編程時(shí)要格外當(dāng)心。為防止疏忽出錯(cuò),最好使用替代符?!纠?-44】比較兩個(gè)數(shù)據(jù)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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)論