匯編語言程序設(shè)計_第1頁
匯編語言程序設(shè)計_第2頁
匯編語言程序設(shè)計_第3頁
匯編語言程序設(shè)計_第4頁
匯編語言程序設(shè)計_第5頁
已閱讀5頁,還剩183頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第二章匯編語言程序設(shè)計80X86的尋址方式

80X86的指令系統(tǒng)匯編語言程序格式匯編語言程序設(shè)計方法一條指令就是完成一種操作命令,它由操作碼和操作數(shù)構(gòu)成,用二進(jìn)制數(shù)表示。操作碼表示計算機(jī)所要執(zhí)行的操作,操作數(shù)表示操作的對象,也就是指令執(zhí)行操作的過程中所需要的數(shù)據(jù)或地址。一條指令一定包含這樣的信息:是做什么操作?操作數(shù)從哪里來?一般說來,操作數(shù)可以跟隨在指令的操作碼之后,稱為立即數(shù);也可以存放在CPU內(nèi)部的存放器中,稱為存放器操作數(shù)。絕大多數(shù)的操作數(shù)存放在內(nèi)存中,稱為存儲器操作數(shù)。指令規(guī)定了操作數(shù)存放的位置,在執(zhí)行指令時需要根據(jù)這個信息找到需要的操作數(shù)。所謂尋址方式,就是尋找操作數(shù)的方式或過程,處理器設(shè)計了許多方式用來指明操作數(shù)的位置。根據(jù)操作數(shù)可能的存放位置,有各種不同的尋址方式。第一節(jié)80X86的尋址方式固定尋址立即數(shù)尋址存放器尋址存儲器尋址I/O端口尋址與轉(zhuǎn)移地址有關(guān)的尋址1、固定尋址是一種特定的單操作數(shù)指令,其操作數(shù)隱含在操作碼中,常常是對某一個固定的存放器進(jìn)行操作,而這個存放器名又隱含在操作碼中??傊?,在固定尋址的指令中,操作數(shù)是被隱含在指令中的,不需要執(zhí)行總線周期,執(zhí)行速度快。例如:CBW;(AL)→(AX)該指令指定的操作數(shù)在AL存放器中,其功能是將AL存放器中的符號位擴(kuò)展到AH中。形成16位的操作數(shù)存放在AX中。PUSHAX;源操作數(shù)是AX存放器,目的操作數(shù)被隱含在存儲器的堆棧中,其操作數(shù)地址是堆棧棧頂。該指令的功能是將AX存放器的內(nèi)容壓入堆棧。2、立即數(shù)尋址這種尋址方式下,操作數(shù)就包含在指令中,作為指令的一局部,它與操作碼一起存放在代碼段中。它的特點(diǎn)是執(zhí)行速度快,主要用來給存放器賦值。立即數(shù)可以是8位的或16位的。立即數(shù)尋址只能用于源操作數(shù)的尋址,而不能用于目的操作數(shù)的尋址。因?yàn)椴僮鲾?shù)是直接從指令中取得,不需要執(zhí)行總線周期,執(zhí)行速度非常快。例如:MOVAL,02H;將一個8位立即數(shù)送AL存放器。指令執(zhí)行完后,〔AL〕=02H。MOVAX,1102H;給AX存放器賦值MOVBX,0A123H;將一個16位立即數(shù)送BX存放器。指令執(zhí)行完后,〔BX〕=0A123H。

MOVBX,0A123H

指令執(zhí)行后(BX)=0A123HBX:代碼段A123OP:存儲器例:3、存放器尋址操作數(shù)在CPU內(nèi)部的存放器中,指令指定存放器名,操作數(shù)的位數(shù)由存放器名決定。這種存放器尋址方式的操作數(shù)就在存放器中,不需要訪問內(nèi)存來取得操作數(shù),所以它的執(zhí)行速度比較快。例如:MOVAX,BX;將BX的內(nèi)容送AX中。MOV[1234H],BX;將BX內(nèi)容送地址為1234H的內(nèi)存單元中。INCCX;CX存放器中的內(nèi)容加1。4、存儲器尋址如果操作數(shù)存放在內(nèi)存儲器中,那么指令中需要給出操作數(shù)的地址信息。用存儲器尋址的指令,其操作數(shù)一定在數(shù)據(jù)段、附加段、堆棧段的主存儲器中,指令中一定包含有存儲器單元的地址或產(chǎn)生存儲器單元地址的信息。執(zhí)行這類指令時,CPU首先根據(jù)指令提供的地址信息計算出偏移地址,用地址產(chǎn)生器產(chǎn)生能直接訪問內(nèi)存單元的物理地址,從內(nèi)存中取得操作數(shù),再執(zhí)行指令規(guī)定的操作。雙操作數(shù)指令的兩個操作數(shù)中,只能有一個使用存儲器尋址方式。80X86允許使用段跨域前綴來改變系統(tǒng)所指定的默認(rèn)段,如允許數(shù)據(jù)存放在除DS段以外的其他段,此時程序中應(yīng)使用段跨越前綴。但是在下面三種情況下,不允許使用段跨越前綴。〔1〕串處理指令的目的串必須用ES段?!?〕PUSH指令的目的操作數(shù)和POP指令的源操作數(shù)必須使用SS段。〔3〕指令必須放在CS段中。直接尋址方式存放器間接尋址方式存放器相對尋址方式基址變址尋址方式相對基址變址尋址方式比例變址尋址方式4、存儲器尋址操作數(shù)的偏移地址直接由指令給出〔就包含在指令中〕,其默認(rèn)段在數(shù)據(jù)段。也就是說,通常用DS存放器的內(nèi)容作段基址,也可以通過段跨越前綴來取得其他段中的操作數(shù)。直接尋址方式適合處理單個變量。⑴直接尋址方式例如:MOVAL,[2000H];將DS段中偏移地址為2000H的字節(jié)單元內(nèi)容送存放器AL中.MOVAX,ES:[2000H];將附加段中偏移地址為2000H的字單元內(nèi)容送存放器AX中.MOVAX,[1122H];

設(shè)(DS)=3000H存儲器中操作碼后面是操作數(shù)的偏移地址.物理地址=3000H*16+1122H=31122H,該內(nèi)存單元的內(nèi)容送AX存放器.執(zhí)行指令后,(AX)=3456H例:操作數(shù)的偏移地址存放在指令指定的存放器中,存放器作為指針指向內(nèi)存單元,這樣的存放器稱為間址存放器。操作數(shù)在存儲器中。16位系統(tǒng)中,間址存放器可以是基址存放器BX、BP或變址存放器SI、DI。存放器間接尋址方式下,指令會根據(jù)所使用的間址存放器指定默認(rèn)的段。存放器間接尋址方式主要用來處理一維數(shù)組或表格,只要改變間址存放器的內(nèi)容,用一條存放器間接尋址指令就可以對連續(xù)的內(nèi)存單元的內(nèi)容進(jìn)行訪問。⑵存放器間接尋址方式〔1〕如果指令指定BX、SI、DI存放器為間址存放器,那么操作數(shù)默認(rèn)在數(shù)據(jù)段中,用DS存放器作段基地址,操作數(shù)的物理地址是DS存放器的內(nèi)容左移4位加上間址存放器的內(nèi)容。例如:MOVAX,[BX];數(shù)據(jù)段中一個字送AXMOVAX,ES:[DI];附加段中一個字送AX〔2〕如果指令指定BP存放器為間址存放器,那么操作數(shù)默認(rèn)在堆棧段中,用SS存放器內(nèi)容作段首地址,操作數(shù)的物理地址是SS存放器的內(nèi)容左移4位加上間址存放器BP的內(nèi)容。例如:MOVAX,[BP];堆棧段中一個字送AXMOVAX,DS:[BP];數(shù)據(jù)段中一個字送AX例:MOVAX,[BX];

設(shè)(DS)=2000H,(BX)=1234H物理地址=20000H+1234H=21234H指令執(zhí)行后(AX)=5678H操作數(shù)的偏移地址是間址存放器的內(nèi)容加上位移量,位移量是地址的一局部。位移量是一個帶符號的整數(shù)。通常可以將數(shù)組或表格的首地址設(shè)置成位移量,利用修改基址存放器或變址存放器的內(nèi)容來取得數(shù)組或表格中的值。⑶存放器相對尋址方式例如:MOVAX,1000H[BX]MOVAX,ES:10H[SI]MOVAX,TABLE[SI];位移量TABLE是表的首地址,間址存放器SI的內(nèi)容加上位移量就是要訪問的表中的某一數(shù)據(jù).MOVAX,COUNT[BX]

(DS)=3000H,(BX)=1234H,COUNT=1000H

物理地址=30000H+1234H+1000H=32234H

指令執(zhí)行后

(AX)=5678H例:操作數(shù)的偏移地址一局部在基址存放器,一局部在變址存放器,基址存放器的內(nèi)容與變址存放器的內(nèi)容之和就是操作數(shù)的偏移地址。對于16位系統(tǒng),假設(shè)用BX作基址存放器,操作數(shù)隱含在數(shù)據(jù)段中,DS存放器的內(nèi)容是操作數(shù)的段首地址;假設(shè)用BP作基址存放器,操作數(shù)隱含在堆棧段中,SS存放器的內(nèi)容是操作數(shù)的段首地址。⑷基址變址尋址方式存放在基址存放器〔BX或BP〕中的內(nèi)容是基地址,它通常用來指向數(shù)據(jù)段中數(shù)組或字符串的首地址;而存放在變址存放器〔SI或DI〕中的內(nèi)容是變址,它通常用來訪問數(shù)組中的某個元素或字符串中的某個字符。這種尋址方式適合于數(shù)組的處理,通常用基址存放器保存數(shù)組的起始地址,而用變址存放器指示數(shù)組中元素的相對位置。這種基址加變址的尋址方式也可以用來處理數(shù)組或表格,改變基址、變址存放器的內(nèi)容,就可以用來處理二維數(shù)組。例如:MOVAX,[BX][SI];假設(shè)〔DS〕=3000H,〔BX〕=0158H,〔SI〕=10A4H,那么偏移地址為0158H+10A4H=11FCH,物理地址為30000H+11FCH=311FCH。指令執(zhí)行后,將311FCH和311FDH相鄰兩個單元的內(nèi)容送AX存放器,其中,高地址單元內(nèi)容送AH,低地址單元內(nèi)容送AL。MOVAX,ES:[BX][SI];BX和SI存放器的內(nèi)容之和就是操作數(shù)的偏移地址,它在附加段中,它的段首地址就是ES存放器的內(nèi)容。MOVAX,[BX][SI](DS)=2100H,(SI)=1234H,(BX)=1100H

物理地址=21000H+1234H+1100H=23334H

指令執(zhí)行后

(AX)=5678H例:帶位移量的基址變址尋址稱為相對的基址變址尋址方式。關(guān)于操作數(shù)所在段的隱含規(guī)定,與上述基址變址尋址方式一樣,也是由基址存放器決定選擇哪個段存放器。相對基址變址尋址方式下的偏移地址的計算方法是:16位偏移地址=基址存放器的內(nèi)容+變址存放器的內(nèi)容+8位或16位的位移量其中,基址存放器可以是BX或BP;變址存放器可以是SI或DI。位移量可以是8位或16位的帶符號數(shù)。⑸相對基址變址尋址方式這種尋址方式為訪問堆棧段中的數(shù)組帶來方便,如果用基址存放器BP存放堆棧頂?shù)牡刂?,用位移量表示棧頂?shù)綌?shù)組第一個元素的距離,那么可以用變址存放器來訪問數(shù)組中的每一個元素。這種尋址方式也可以用于二維數(shù)組的尋址。例如:MOVAX,100H[BX][SI];BX和SI存放器的內(nèi)容之和加上位移量就是操作數(shù)的偏移地址,操作數(shù)在數(shù)據(jù)段中。MOVAX,ES:100H[BX][SI];該指令的操作數(shù)的偏移地址與上例相同,但它在附加段中。MOVAX,100H[BP][SI];這是16位尋址,基址存放器BP與變址存放器SI的內(nèi)容之和,加上位移量100H,就是操作數(shù)的偏移地址,操作數(shù)隱含在堆棧段中。將堆棧段中的偏移地址為BP+SI+100H的一個字?jǐn)?shù)據(jù)送AX中。比例變址尋址方式只能在32位及以后的系統(tǒng)中使用。操作數(shù)的有效地址是變址存放器的內(nèi)容乘以指令中指定的比例因子再加上位移量。例如:MOVAX,[EBX+4*EDI+20H];這是32位尋址,指令執(zhí)行的結(jié)果是將數(shù)據(jù)段中偏移地址為(EBX)+4*(EDI)+20H的內(nèi)存單元的一個字?jǐn)?shù)據(jù)送AX存放器中.⑹比例變址尋址方式5、I/O端口尋址⑴直接端口尋址——指令中包含I/O端口的直接地址(8位端口),直接端口尋址的端口數(shù)是256個。INAL,80H;將80H端口的字節(jié)數(shù)據(jù)〔8位〕輸入到AL存放器中。INAX,80H;將80H端口的字?jǐn)?shù)據(jù)〔16位〕輸入到AX存放器中。OUT80H,AL;將AL存放器的內(nèi)容輸出到80H端口〔寫數(shù)據(jù)〕,這時80H端口寬度〔數(shù)據(jù)位〕是8位的。OUT80H,AX;將AX存放器的內(nèi)容輸出到80H端口〔寫數(shù)據(jù)〕,這時80H端口寬度〔數(shù)據(jù)位〕是16位的。直接端口地址也可以用符號表示。OUTPORT,AX⑵間接端口尋址——用DX存放器間接訪問端口(16位端口),如果端口地址≥256〔16位地址〕可尋址65536個端口,就必須用間接端口尋址了。先把端口號〔0000H~FFFFH〕存放入DX存放器中并間接訪問該端口,用于間接尋址端口的存放器只能使用DX存放器。MOVDX,200H;將端口號200H存入DX中OUTDX,AL;將(AL)輸出到〔DX〕所指的端口中MOVDX,200H;將端口號200H存入DX中INAX,DX;將〔DX〕所指的端口輸入一個字到AX存放器中6、與轉(zhuǎn)移地址有關(guān)的尋址轉(zhuǎn)移指令用來改變程序的正常執(zhí)行順序,指令中提供了轉(zhuǎn)移地址的段地址和偏移地址。段內(nèi)轉(zhuǎn)移和段間轉(zhuǎn)移都可以使用直接尋址和間接尋址。⑴段內(nèi)直接尋址。JMPLABEL⑵段內(nèi)間接尋址。JMPBX;JMPWORDPTR[BP]⑶段間直接尋址。JMPFARPTRLABEL⑷段間間接尋址。JMPDWORDPTR[SI]求下面兩條轉(zhuǎn)移指令的轉(zhuǎn)移地址A1和A2分別是多少?(1)3000:0110

EBF7JMPA1(2)3000:0110

EB09JMPA2(1)A1的地址=0112

+-9(F7)0109H下一條指令的IP=0110+2=0112(2)A2的地址=0112

+9

011BH例:

段內(nèi)直接尋址轉(zhuǎn)向的有效地址=當(dāng)前(IP)+位移量(8位/16位)JMPSHORTLMOVAX,0MOVBX,0MOVAX,0L:RET反匯編后:轉(zhuǎn)移指令轉(zhuǎn)向的偏移地址是0007H+09H=0010H。JMPSHORTL;短轉(zhuǎn)移(-128∽+127)JMPNEARPTRL;近轉(zhuǎn)移(-32768∽+32767)當(dāng)它用于條件轉(zhuǎn)移指令時,只允許8位的位移量。L:MOVAX,0MOVBX,0MOVAX,0JOLRET例:注意:位移量是負(fù)數(shù),F(xiàn)5是補(bǔ)碼。所以,轉(zhuǎn)向的偏移地址=0010H+FFF5H=0005H。反匯編后:段內(nèi)間接尋址例:設(shè)〔DS〕=2000H,〔BX〕=1256H,〔SI〕=528FH,位移量VAL=20A1H,〔232F7〕=3280H,〔264E5H〕=2450H。那么JMPBX;執(zhí)行該指令后,〔IP〕=1256HJMPWORDPTR[BX][SI];指令執(zhí)行后,〔IP〕=〔20000H+1256H+528FH〕=〔264E5H〕=2450HJMPWORDPTR[BX+VAL];指令執(zhí)行后,〔IP〕=〔20000H+1256H+20A1H〕=〔232F7H〕=3280Hcode1segment

┊jmpfarptrnext

┊code1endscode2segment┊next:……

┊code2ends

段間直接尋址用指令中提供的轉(zhuǎn)向的段地址和偏移地址取代CS和IP例:段間間接轉(zhuǎn)移指令格式:JMPDWORDPTR[SI]JMPDWORDPTR[TABLE+BX]JMPDWORDPTR[ADDR]其中,[SI]與[TABLE+BX]說明數(shù)據(jù)尋址方式為存儲器尋址方式;DWORDPTR為雙字操作符,說明轉(zhuǎn)移地址需取雙字為段間轉(zhuǎn)移地址。其中高字是段地址,裝入CS存放器;低字是偏移地址,裝入IP存放器。第二節(jié)80X86的指令系統(tǒng)

數(shù)據(jù)傳送類指令地址傳送類指令算術(shù)運(yùn)算類指令邏輯運(yùn)算類指令串操作類指令控制轉(zhuǎn)移類指令處理器控制類指令

請重點(diǎn)關(guān)注:指令的匯編格式指令的根本功能指令支持的尋址方式指令的執(zhí)行對標(biāo)志位的影響指令的特殊要求1、數(shù)據(jù)傳送類指令數(shù)據(jù)傳送指令數(shù)據(jù)交換指令堆棧操作指令標(biāo)志存放器操作指令輸入/輸出指令換碼指令⑴數(shù)據(jù)傳送指令指令格式:MOVDST,SRCMOVCL,40HMOVCX,AXMOVDS,AXMOVBH,[200H]MOVBX,[200H]MOVEAX,10H[EBX+ESI]數(shù)據(jù)傳送指令不影響標(biāo)志位

注意:〔1〕目的操作數(shù)與源操作數(shù)的類型必須一致?!?〕不允許立即數(shù)作為目的操作數(shù)。〔3〕不允許在兩個主存單元之間直接傳送?!?〕不允許在兩個段存放器之間直接傳送?!?〕不能將立即數(shù)送段存放器?!?〕不允許用CS和IP存放器作為目的操作數(shù)。⑵數(shù)據(jù)交換指令指令格式:XCHGOPR1,OPR2XCHGAX,BXXCHGBX,[SI]例〔BX〕=1230H,〔SI〕=0046H,〔DS〕=2000H,〔20046H〕=1234HXCHGESI,EDI數(shù)據(jù)交換指令不影響標(biāo)志位⑶堆棧操作指令指令格式:

PUSHSRC;POPDSTPUSHAXPUSHDWORDPTR[BX]PUSHDSPOPBXPOPES堆棧指令不影響標(biāo)志位PUSHAX;AX=1122H2211AHAL(1)(SP)-2→(SP)(2)AX→((SP))SP→11低地址高地址22例:〔1〕MOVAX,AXCHGAX,BMOVB,AX例:交換存儲單元A與B中的內(nèi)容.設(shè):A與B已定義為字.〔2〕MOVAX,AMOVBX,BMOVA,BXMOVB,AX〔3〕PUSHAPUSHBPOPAPOPB⑷標(biāo)志存放器操作指令①LAHF;標(biāo)志存放器的低8位送入AH存放器②SAHF;AH的內(nèi)容送入標(biāo)志存放器的低8位③PUSHF;將16位標(biāo)志存放器內(nèi)容壓入堆棧④POPF;將堆棧頂一個字彈出送入標(biāo)志存放器⑤PUSHFD;將32位標(biāo)志存放器壓入堆棧⑥POPFD;將32位標(biāo)志存放器出棧⑦標(biāo)志位操作指令CLC;(Clearcarry)進(jìn)位標(biāo)志清零CMC;(Complementcarry)進(jìn)位標(biāo)志取反STC;(Setcarry)進(jìn)位標(biāo)志置1CLD;(Cleardirection)方向標(biāo)志清零STD;(Setdirection)方向標(biāo)志置1CLI;(Clearinterrupt)禁止可屏蔽中斷STI;(Setinterrupt)開放可屏蔽中斷⑸輸入/輸出指令①直接端口尋址:INAX,80H;從指定端口讀一個字?jǐn)?shù)據(jù)到AX.OUT2FH,AL;把AL內(nèi)容送往指定端口.②間接端口尋址MOVDX,2F0H;將16位端口地址送DX.INAL,DX;從指定端口讀一個字節(jié)數(shù)據(jù)到AL.⑹換碼指令指令格式:XLAT;執(zhí)行的操作:(AL)←((DS)×16+(BX)+(AL))這是一種固定尋址。它可以將AL存放器中設(shè)定的一個字節(jié)數(shù)據(jù)轉(zhuǎn)換為存放內(nèi)存的一張連續(xù)表格中的另一個相應(yīng)的代碼,以實(shí)現(xiàn)兩種編碼的轉(zhuǎn)換,它是以查表的方式完成代碼轉(zhuǎn)換的。使用這條指令之前,必須先建立一張字節(jié)表格,其最大容量為256字節(jié),表格的首地址由BX存放器指向,相對于表格首地址的位移量存放在AL存放器中。也就是說,AL存放器中存放著待查的碼,用它表示表中某一項與表首地址的距離,表格的內(nèi)容就是需要轉(zhuǎn)換的代碼,該指令執(zhí)行后,AL存放器中得到轉(zhuǎn)換后的代碼。表格TAB中存放著數(shù)字0∽9對應(yīng)的ASCⅡ碼表.將表格中位移量為3的代碼取到AL中。30H31H32H33H34HTABMOVBX,OFFSETTABMOVAL,3XLATAL例:2、地址傳送類指令偏移地址送存放器指令邏輯地址送存放器和段存放器指令⑴偏移地址送存放器指令指令格式:LEAREG,MEM;目的操作數(shù)不能是段存放器,源操作數(shù)是存儲器操作數(shù).例如:①LEABX,[BX+SI+0F62H]例〔BX〕=0400H+003CH+0F62H=139EH與MOVBX,OFFSET[BX+SI+0F62H]指令等價②LEADX,[BX]③LEADX,TAB;傳送地址注:MOVDX,TAB;傳送該地址中的內(nèi)容TAB=001200100011001300140015281102FFLEASI,TAB;執(zhí)行后:(SI)=0012HMOVSI,TAB;執(zhí)行后:(SI)=1128HLEA指令與MOV指令的區(qū)別:⑵邏輯地址送存放器和

段存放器指令①32位指針?biāo)?6位存放器和段存放器DS指令格式:LDSREG16,MEM例如:LDSDI,[BX]LDSSI,[1010H]②32位指針?biāo)?6位存放器和段存放器ES指令格式:LESREG16,MEM例如:LESDI,[BX]LESSI,[1010H]LDS或LES指令將源操作數(shù)指定的4個連續(xù)字節(jié)單元內(nèi)容分別送指令指定的存放器和DS或ES中.其中:低16位送存放器,高16位送DS或ES中。22H11H44H33H(DS)=C000H,(C2000H)=1122H,(C2002H)=3344HC000:2000HC000:2001HC000:2002HC000:2003H11223344SIDS執(zhí)行指令:LDSSI,[2000H]例:3、算術(shù)運(yùn)算類指令

加法類指令

減法類指令

乘法指令

除法指令

十進(jìn)制調(diào)整指令1.加法類指令〔1〕加法指令A(yù)DD〔2〕帶進(jìn)位的加法指令A(yù)DC〔3〕加1指令I(lǐng)NC⑴加法類指令A(yù)DDDX,0F0FH;

ADCAX,[BX];

ADCAX,BX;

INCSI;

INCWORDPTR[SI]ADD和ADC指令會影響CF,ZF,SF,AF,OF和PF標(biāo)志位INC指令會影響OF,SF,ZF,AF和PF標(biāo)志,但不影響進(jìn)位標(biāo)志CF.例:ADDDX,0F0F0H;(DX)=4652H4652H0100011001010010

+F0F0

+111100001111000000110111010000101(DX)=3742H,ZF=0,SF=0,CF=1,OF=0例:ADCAX,CX;(AX)=0F365H,(CX)=0E024H,CF=1F365E024

+1D38A1(AX)=0D38AHSF=1,ZF=0,CF=1,OF=0OF表示帶符號數(shù)是否溢出。帶符號數(shù)發(fā)生溢出,表示運(yùn)算結(jié)果出錯。這可以通過雙進(jìn)位判別法來判斷:如果用表示符號位的進(jìn)位,用表示數(shù)值局部最高位向符號位的進(jìn)位,那么它們相異或的結(jié)果表示溢出標(biāo)志的狀態(tài)。即,那么,表示無溢出;,那么,表示運(yùn)算結(jié)果溢出。2.減法類指令〔1〕減法指令SUB〔2〕帶借位的減法指令SBB〔3〕減1指令DEC〔4〕求補(bǔ)指令NEC〔5〕比較指令CMP⑵減法類指令SUBDX,0F0FHSBBAX,[BX]DECSIDECWORDPTR[SI]NEGBXCMPBL,50SUB,SBB和CMP,NEG指令會影響CF,ZF,SF,AF,OF和

PF標(biāo)志位.DEC指令會影響OF,SF,ZF,AF和PF標(biāo)志不影響CF標(biāo)志減法運(yùn)算MOVAX,5678H;〔AX〕=5678HSUBAX,1234H;〔AX〕=4444H,OF=0,SF=0,ZF=0,CF=0MOVBX,0354H;〔BX〕=0354HSUBBX,3340H;〔BX〕=D014H,OF=0,SF=1,ZF=0,CF=1MOVCX,4336HSUBCX,0136H;(CX)=4200H,OF=0,SF=0,ZF=0,CF=0MOVDL,41HSUBDL,5AH;〔DL〕=0E7H,OF=0,SF=1,ZF=0,CF=1例:求補(bǔ)運(yùn)算。〔1〕MOVAL,64HNEGAL;〔AL〕=9CH,OF=0,SF=1,ZF=0,CF=1〔2〕MOVBX,0FFFFHNEGBX;〔BX〕=0001H,OF=0,SF=0,ZF=0,CF=1〔3〕MOVCX,0000HNEGCX;〔CX〕=0000H,OF=0,SF=0,ZF=1,CF=0〔5〕比較指令CMP指令格式:CMPOPR1,OPR2指令執(zhí)行的操作:〔OPR1〕-〔OPR2〕;該指令與SUB指令一樣,CMP指令也是執(zhí)行兩操作數(shù)相減,但它并不保存結(jié)果,只是根據(jù)兩操作數(shù)相減后的結(jié)果影響標(biāo)志位OF、SF、ZF、PF和CF的狀態(tài),根據(jù)受影響的標(biāo)志位狀態(tài)就可以判斷兩個操作數(shù)比較的結(jié)果。CMP指令后往往跟著一條條件轉(zhuǎn)移指令,根據(jù)比較結(jié)果產(chǎn)生不同的程序分支。這是分支程序設(shè)計常用的一種方法。⑶乘法指令①無符號數(shù)乘法:MULSRC②帶符號數(shù)乘法:IMULSRC;字節(jié)乘:(AX)←(AL)*(SRC);字乘:(DX,AX)←(AX)*(SRC);32位乘:(EDX,EAX)←(EAX)*(SRC);乘法指令只對CF和OF標(biāo)志位有影響,對SF,ZF,AF,PF標(biāo)志位的狀態(tài)不確定

執(zhí)行乘法指令后,對CF和OF標(biāo)志位的影響如下。對于無符號數(shù)乘法MUL指令,如果乘積的高一半為0,即字節(jié)操作時的〔AH〕=0或字操作時的〔DX〕=0,或32位操作時的〔EDX〕=0,那么CF和OF均為0;如果乘積的高一半不為0,那么CF和OF均為1。這樣,可以用CF和OF標(biāo)志位的狀態(tài)來檢查字節(jié)相乘的結(jié)果是字節(jié)還是字,或者可以檢查字相乘的結(jié)果是字還是雙字。對于有符號乘法IMUL指令,如果乘積的高一半是低一半的符號擴(kuò)展,那么CF和OF均為0,;否那么CF和OF均為1。⑷除法指令①無符號數(shù)除法:DIVSRC②帶符號數(shù)除法:IDIVSRC

字節(jié)操作:

(AL)←(AX)/(SRC)的商;(AH)←(AX)/(SRC)余數(shù)

字操作:(AX)←(DX,AX)/(SRC)的商;(DX)←(DX,AX)/(SRC)的余數(shù)

雙字操作:

(EAX)←(EDX,EAX)/(SRC)的商;

(EDX)←(EDX,EAX)/(SRC)的余數(shù)執(zhí)行除法指令后,所有狀態(tài)標(biāo)志位OF、SF、ZF、AF、PF、CF的狀態(tài)均不確定。如果被除數(shù)遠(yuǎn)大于除數(shù)時,其商超出了它可以表達(dá)的范圍,就是溢出。例如,除數(shù)為0的溢出,或字節(jié)操作時商超出了AL〔8位〕可以表達(dá)的范圍,或字操作時商超出了AX〔16位〕可以表達(dá)的范圍,或雙字操作時超出了32位,都算溢出。使用帶符號數(shù)除法IDIV指令的字操作時,商的范圍是-32768~+32767;字節(jié)操作時,商的范圍是-128~+127.如果超出了這個范圍,系統(tǒng)將其視為除法出錯〔溢出〕,系統(tǒng)直接調(diào)用0號中斷〔異?!橙ヌ幚恚⒔K止程序的運(yùn)行。而不是用溢出標(biāo)志OF來表示除法溢出。除法指令執(zhí)行前,常常要進(jìn)行位的擴(kuò)展或符號擴(kuò)展,可以防止這種溢出。⑸位擴(kuò)展指令①CBW;字節(jié)擴(kuò)展為字。將AL存放器中的符號位〔最高位〕擴(kuò)展到AH存放器中。常用于8位的帶符號數(shù)除法指令。②CWD;字?jǐn)U展為雙字。將AX存放器中的符號位〔最高位〕擴(kuò)展到DX存放器中。常用于16位的帶符號數(shù)除法指令。③CWDE;字?jǐn)U展為雙字④CDQ;雙字?jǐn)U展為4字⑤MOVSX;符號擴(kuò)展⑥MOVZX;零位擴(kuò)展⑹十進(jìn)制調(diào)整指令指令格式說明DAA壓縮的BCD碼加法調(diào)整DAS壓縮的BCD碼減法調(diào)整AAA非壓縮的BCD碼加法調(diào)整AAS非壓縮的BCD碼減法調(diào)整AAM乘法后的BCD碼調(diào)整AAD除法前的BCD碼調(diào)整注意:〔1〕80x86指令系統(tǒng)中只允許采用非壓縮的十進(jìn)制數(shù)乘法和除法運(yùn)算。〔2〕用BCD碼進(jìn)行乘除法運(yùn)算時,只能使用無符號數(shù)形式,因而AAM和AAD應(yīng)固定地出現(xiàn)在MUL指令之后和DIV之前。例:用壓縮BCD碼作十進(jìn)制數(shù)〔28+68〕運(yùn)算,結(jié)果用壓縮BCD碼表示。MOVAL,28HMOVBL,68HADDAL,BL;二進(jìn)制加法DAA;十進(jìn)制調(diào)整那么執(zhí)行ADD后,AL=90H,AF=1;再執(zhí)行DAA指令后,正確的結(jié)果為AL=96H,CF=0,AF=1。例:用非壓縮BCD碼作十進(jìn)制數(shù)〔7×9〕運(yùn)算,結(jié)果用非壓縮BCD碼表示。MOVAL,07H;將十進(jìn)制數(shù)7和9分別用非壓縮BCD碼表示MOVBL,09HMULBLAAM;乘法后的BCD碼調(diào)整那么執(zhí)行MULBL后,AX=003FH,再執(zhí)行AAM指令后,AX=0603H。相當(dāng)于十進(jìn)制運(yùn)算7×9=63例:設(shè)AX=0103H,BL=06H〔分別表示非壓縮BCD碼13和6〕。AAD;0103H→000DHDIVBL;〔AL〕=02H,〔AH〕=1那么執(zhí)行上述指令序列后,商〔AL〕=02H,余數(shù)〔AH〕=1。實(shí)際上,該程序段就是做十進(jìn)制的13除以6,其中13和6分別用非壓縮的BCD碼表示為0103H和06H。執(zhí)行AAD指令,就將AH中的內(nèi)容乘以10,再加到AL中,得到的結(jié)果為〔AX〕=000DH。例:MOVAL,04HMOVCL,08HMULCL;AX=0020HAAM;AX=0302H例:MOVCL,08HMOVAX,0303HAAD;0303H→0021HDIVCL;AX=0104HAX/CL=33/8=4余1邏輯運(yùn)算指令移位指令4、邏輯運(yùn)算類指令

⑴邏輯運(yùn)算指令ORAX,00FFH;低8位置1,高8位不變ANDAX,00FFH;高8位清0,低8位不變XORAL,03H;使D0D1位變反其余位不變TESTAL,80H;測試AL最高位NOTAX;對〔AX〕按位取反對標(biāo)志位的影響:CF和OF置0,AF標(biāo)志位不確定,而SF、ZF和PF那么根據(jù)運(yùn)算結(jié)果設(shè)置。主要功能:AND指令用于對某些位清0,其余位保持不變;OR指令用于對某些位置1,其余位保持不變;XOR指令是某些位取反,其余位保持不變;TEST指令用于測試某些位而不保存結(jié)果;NOT指令對操作數(shù)按位取反后再回送該操作數(shù)。邏輯運(yùn)算指令主要用于處理操作數(shù)的某些位〔如使某些位置1或置0或取反等操作〕,而使其余位保持不變。XOR指令常用于測試某一操作數(shù)是否與另一確定的操作數(shù)相等。這種操作常用在檢查地址是否匹配。TEST指令通常用于檢測一些位是否滿足特定的條件,但又不希望改變原操作數(shù)的情況,這是它與AND指令最大的區(qū)別。例:屏蔽AL的第0、1兩位

ANDAL,0FCH例:置AL的第5位為1

ORAL,20H

例:使AL的第0、1位變反

XORAL,3例:測試某些位是0是1

TESTAL,1JNZO

AL=

********OR00100000**1*****

AL=

******01XOR00000011

******10

AL=********AND11111100******00AL=

********AND000000010000000*⑵移位指令SHLOPR,CNT;邏輯左移SALOPR,CNT;算術(shù)左移SHROPR,CNT;邏輯右移SAROPR,CNT;算術(shù)右移ROLOPR,CNT;不帶進(jìn)位循環(huán)左移ROROPR,CNT;不帶進(jìn)位循環(huán)右移RCLOPR,CNT;帶進(jìn)位循環(huán)左移RCROPR,CNT;帶進(jìn)位循環(huán)右移邏輯左移SHLOPR,CNT算術(shù)左移SALOPR,CNT邏輯右移SHROPR,CNT算術(shù)右移SAROPR,CNT

CF0

0CFCF循環(huán)左移ROLOPR,CNT循環(huán)右移ROROPR,CNT帶進(jìn)位循環(huán)左移RCLOPR,CNT帶進(jìn)位循環(huán)右移RCROPR,CNTCF

CFCFCF說明:移位指令可以改變操作數(shù)中所有位的位置。OPR為存放器或存儲器操作數(shù),不能用立即數(shù)。移位一次那么移位次數(shù)CNT為1,移位次數(shù)大于1時,CNT預(yù)先保存在CL存放器中。邏輯移位和算術(shù)移位指令還常常用來完成一些算術(shù)運(yùn)算左移n位相當(dāng)于對操作數(shù)乘以。右移n位相當(dāng)于對操作數(shù)除以。它們最大的好處是比用乘除法指令快得多。說明:循環(huán)移位操作不喪失任何數(shù)據(jù)。循環(huán)移位指令可以用來檢查存放器或存儲器操作數(shù)中含1或0的個數(shù),只要檢測CF就可以對1或0計數(shù)。對n位數(shù)據(jù)用小循環(huán)移位指令循環(huán)n次,數(shù)據(jù)恢復(fù)原狀;大循環(huán)移位指令循環(huán)n+1次,數(shù)據(jù)也恢復(fù)原狀。對標(biāo)志位的影響〔1〕按照操作數(shù)移入CF的位設(shè)置進(jìn)位標(biāo)志CF。算術(shù)左右移和邏輯左右移指令根據(jù)移位后的結(jié)果影響SF、ZF、PF標(biāo)志,假設(shè)移位后操作數(shù)為0,那么ZF=1;SHL或SAL以及SAR指令根據(jù)結(jié)果的最高位設(shè)置SF標(biāo)志位;而SHR指令執(zhí)行后SF標(biāo)志清0。AF標(biāo)志不確定?!?〕所有循環(huán)移位指令對CF和OF以外的狀態(tài)標(biāo)志不影響?!?〕移位次數(shù)為1時,OF位才有效,當(dāng)移位次數(shù)大于1時,OF不確定。設(shè)(AL)=B9H,(CF)=1,確定以下指令單獨(dú)執(zhí)行后AX的狀態(tài):SHLAL,1;(AL)=72H,CF=1,OF=1SARAL,1;(AL)=DCH,CF=1,OF=0SHRAL,1;(AL)=5CH,CF=1,OF=1RORAL,1;(AL)=DCH,CF=1,OF=1ROLAL,1;(AL)=73H,CF=1,OF=1RCLAL,1;(AL)=73H,CF=1,OF=1RCRAL,1;(AL)=DCH,CF=1,OF=0SHLAX,2;相當(dāng)于AX內(nèi)容乘以4SHLAX,5;相當(dāng)于AX內(nèi)容乘以32SARAX,3;相當(dāng)于AX中帶符號數(shù)除以8SARAX,8;相當(dāng)于AX中的帶符號數(shù)除以256例:將裝在(DX,AX)中的32位數(shù)據(jù)左移1位,也就是將32位無符號數(shù)乘以2。SHLAX,1RCLDX,1;將(DX,AX)*2→(DX,AX)大循環(huán)移位指令與移位指令聯(lián)合使用可以實(shí)現(xiàn)雙精度數(shù)或多倍精度數(shù)的左右移位。例:將BX中的帶符號數(shù)除以4,取整,并回送BX中.MOVCL,2;移位次數(shù)保存在CL存放器中SAR BX,CL;完成(BX)/4→BX的運(yùn)算,取整,不保存余數(shù)。例:設(shè)(AX)=0011H,(BX)=0022H,將BX與AX中的數(shù)據(jù)合并,使(AX)=1122H.MOVCL,8SHLAX,CLORAX,BX例:將一個字節(jié)數(shù)據(jù)的高4位和低4位交換.MOVAL,56H;AL=56HMOVCL,4ROLAL,CL;AL=65H,CF=1,OF=1例:統(tǒng)計BX中1的個數(shù)并存入CH存放器中.用CL存放器作循環(huán)計數(shù).MOVCX,0010H;(CH)=00H,(CL)=10HTESTBX,0FFFFH;測試BX是否為0JZEXT;(BX)=0那么退出R1:ROLBX,1;循環(huán)左移一位,將BX最高位移入CFJCCOUNT;CF=1那么轉(zhuǎn)移JMPR2COUNT:INCCH;統(tǒng)計BX中1的個數(shù)R2:DECCL;CF=0那么循環(huán)計數(shù)減1JNZR1;重復(fù)操作┊EXT:┊例:將數(shù)組整體右移一位.ARYDD3DUP(81818181H)MOVESI,0;ESI是數(shù)組的偏移量SHRARY[ESI+8],1;將高地址的雙字右移一位RCRARY[ESI+4],1;中間的雙字循環(huán)右移一位RCRARY[ESI],1;低地址的雙字循環(huán)右移一位例:5、串操作類指令串傳送指令〔MoveString〕存串指令〔StoreString〕取串指令〔LoadString〕串比較指令〔CompareString〕串掃描指令〔ScanString〕串輸入〔InputString〕串輸出(OutputString)重復(fù)前綴〔Repeat〕特點(diǎn):〔1〕可以對字節(jié)串、字串進(jìn)行操作,32位系統(tǒng)還可以對雙字串操作?!?〕源串默認(rèn)在數(shù)據(jù)段,用SI存放器間接尋址,而目的串默認(rèn)在附加段,使用DI存放器間接尋址?!?〕串操作時地址指針SI和DI將根據(jù)方向標(biāo)志DF自動修改:DF=1時SI和DI減1或2,DF=0時,SI和DI加1或2?!?〕執(zhí)行串操作指令中的串傳送、存串和取串指令后不影響標(biāo)志位。而執(zhí)行串比較和串掃描指令后將不保存結(jié)果,而是根據(jù)操作結(jié)果影響狀態(tài)標(biāo)志CF、PF、AF、ZF、SF、OF。

重復(fù)前綴REP;〔CX〕←〔CX〕-1,執(zhí)行其后的串操作,CX=0退出重復(fù)操作REPZ;或REPE;ZF=1〔相等〕時重復(fù)執(zhí)行其后的串操作,CX=0或ZF=0時結(jié)束串操作REPNZ;或REPNE;ZF=0〔不相等〕時重復(fù)執(zhí)行其后的串操作,CX=0或ZF=1時結(jié)束串操作重復(fù)前綴不能單獨(dú)使用,只能用在串操作指令前,以實(shí)現(xiàn)串操作的重復(fù)執(zhí)行,CX存放器的內(nèi)容是默認(rèn)的重復(fù)次數(shù),每執(zhí)行一次重復(fù)操作,(CX)減1,(CX)是剩下還未處理的單元數(shù),(CX)=0那么退出重復(fù)操作,說明已經(jīng)處理完所有的單元.⑴串傳送指令MOVSB;MOVSW;MOVSD;MOVSDST,SRC;將源串?dāng)?shù)據(jù)傳送到目的串執(zhí)行:REPMOVSB或REPMOVSW

之前,應(yīng)先做好:(1)源串首地址(末地址)

→SI(2)目的串首地址(末地址)

→DI(3)串長度→CX(4)建立方向標(biāo)志

(CLD使DF=0,STD使DF=1)leasi,mess1leadi,mess2movcx,17cldrepmovsb例:〔SI〕〔DI〕數(shù)據(jù)段附加段〔SI〕〔DI〕DF=0DF=0傳送之前傳送之后例:數(shù)據(jù)段中有一個以SRC為首地址的字串長度為800,將其傳送到附加段中以DST位首地址的緩沖區(qū)中。用串傳送指令實(shí)現(xiàn)。LEASI,SRC;源串的首地址由SI指向LEADI,DST;目的串的首地址由DI指向MOVBX,800;傳送次數(shù)送BX存放器CLDL:MOVSW;傳送一個字DECBX;完成一個字的傳送后,傳送次數(shù)減1JNZL;判斷BX是否為0。不為0,那么繼續(xù)執(zhí)行串傳送指令;否那么,結(jié)束串操作如果使用重復(fù)前綴,用一條REPMOVSW指令就可以完成以上800個數(shù)據(jù)的傳送,但這時必須用CX存放器存放串的長度。LEASI,SRC;源串的首地址由SI指向LEADI,DST;目的串的首地址由DI指向MOVCX,800;傳送次數(shù)必須存放在CX存放器中CLD;設(shè)置方向標(biāo)志DF=0,地址增量,從低地址向高地址傳送REPMOVSW;重復(fù)執(zhí)行串傳送指令,直到傳送完〔CX=0〕退出⑵存串指令STOSB;STOSW;STOSD;STOSDST;將AL或AX或EAX中的數(shù)據(jù)裝入目的串中LEADI,DST;由DI指向目的串的首地址MOVAL,0;初始化ALMOVCX,100;用CX存放傳送次數(shù)CLD;DF=0,使地址增量L:STOSB;傳送一個字節(jié)DECCX;傳送次數(shù)減1JNZL;CX≠0,那么繼續(xù);;否那么,結(jié)束存串操作┊例:

LEADI,DST;DI指向目的串首地址MOVAL,0;初始化ALMOVCX,100;用CX存放傳送次數(shù)CLD;DF=0,使地址增量REPSTOSB;將100個字節(jié)清零例:

⑶取串指令LODSB;LODSW;LODSD;LODSSRC;將源串中的數(shù)據(jù)存入AL或AX或EAX中LEASI,SRC;用SI指向字節(jié)串SRC首地址LEADI,EVEN;用DI指向存放偶數(shù)的緩沖區(qū)首地址LEABX,ODD;用BX指向存放奇數(shù)的緩沖區(qū)MOVCX,100;待處理的串長度存CX中CLD;使DF=0,地址增量G:LODSES:[SI];取一個數(shù)TESTAL,01H;測D0位,D0=0為偶數(shù),D0=1為奇數(shù)JNZO;為奇數(shù)那么轉(zhuǎn)移E:STOSB;把偶數(shù)存入以EVEN為首地址的緩沖區(qū)JMPAG;無條件轉(zhuǎn)移到AG去執(zhí)行程序O:XCHGBX,DI;使DI暫時指向存放奇數(shù)的緩沖區(qū)STOSB;將奇數(shù)存放在ODD為首地址的緩沖區(qū)中XCHGBX,DI;交換指針的內(nèi)容AG:DECCX;CX總是保存著未處理數(shù)據(jù)的個數(shù)JNZG;數(shù)據(jù)未處理完那么繼續(xù)例:⑷串比較指令CMPSB;CMPSW;CMPSD;CMPSSRC,DST;源串與目的串相減,不回送結(jié)果SRCDD20DUP(1234ABCDH);定義雙字變量DSTDD20DUP(1234ABCDH);定義雙字變量┊CLD;DF=0,向高地址方向比較MOVECX,20;建立REP的計數(shù)器LEAESI,SRC;使ESI指針指向源串LEAEDI,DST;使EDI指針指向目的串REPECMPSD;比較雙字?jǐn)?shù)據(jù)串,直到ECX=0或找到不相同的位置例:⑸串掃描指令SCASB;SCASW;SCASD;SCASDST;將AL或AX或EAX的內(nèi)容與目的串相減,不回送結(jié)果STRDB‘XYZABCD’LEADI,STR;DI指向串STR首地址MOVAL,‘A’;AL中存放要查找的字符MOVCX,CN;存串長度CLDREPNZSCASB;ZF=0且CX≠0重復(fù)查找JZFOUND;ZF=1,找到字符A,轉(zhuǎn)移JMPEXT;未找到(ZF=0并且CX=0),那么退出FOUND:┆EXT:┉例:⑹串輸入INSDST,DX;INSB;INSW;INSD;將端口數(shù)據(jù)輸入到附加段的目的串中從端口地址03A0H的I/O設(shè)備輸入100個字節(jié)數(shù)據(jù),設(shè)I/O設(shè)備總是準(zhǔn)備好傳送數(shù)據(jù).LEADI,LIST;用DI指向目的串MOVDX,03A0H;端口地址送DXCLD;DI自動加1MOVCX,100;CX裝計數(shù)值REPINSB;從端口輸入數(shù)據(jù)存入

DI指向的內(nèi)存單元例:⑺串輸出OUTSDX,SRC;OUTSB;OUTSW;OUTSD;將數(shù)據(jù)段中的源串?dāng)?shù)據(jù)輸出到端口將存放在數(shù)據(jù)段中的100個字節(jié)數(shù)據(jù)ARY傳送到端口地址03A2H的I/O設(shè)備中.假設(shè)I/O設(shè)備總是準(zhǔn)備好的狀態(tài).LEASI,ARY;用SI指向數(shù)組MOVDX,03A2H;端口地址送DXCLD;SI自動加1MOVCX,100;CX裝計數(shù)值REPOUTSB;將SI指向的內(nèi)存單元數(shù)據(jù)輸出到端口例:6、控制轉(zhuǎn)移類指令無條件轉(zhuǎn)移指令〔JMP〕子程序調(diào)用與返回指令(CALL和RET)條件轉(zhuǎn)移指令〔JCC〕循環(huán)控制指令〔LOOP〕中斷與返回指令〔INT和IRET〕處理器控制類指令⑴無條件轉(zhuǎn)移指令根據(jù)轉(zhuǎn)移范圍的不同可以分為段內(nèi)轉(zhuǎn)移和段間轉(zhuǎn)移。根據(jù)轉(zhuǎn)移地址的尋址方式的不同可以分為直接轉(zhuǎn)移和間接轉(zhuǎn)移。無條件轉(zhuǎn)移指令不影響標(biāo)志位。JMPDISP;段內(nèi)直接轉(zhuǎn)移,位移量DISP可以是

8位、16位或32位JMPBX;段內(nèi)間接轉(zhuǎn)移,BX內(nèi)容是段內(nèi)偏移地址JMPWORDPTR[SI];段內(nèi)間接轉(zhuǎn)移,SI指向的內(nèi)存單元中的一個字是段內(nèi)偏移地址JMPEBX;段內(nèi)間接轉(zhuǎn)移,EBX內(nèi)容是偏移地址JMPDWORDPTR[ESI];段內(nèi)間接轉(zhuǎn)移,ESI指向的內(nèi)存單元的一個雙字是偏移地址JMPFWORDPTR[ADDR];段間間接轉(zhuǎn)移,ADDR中存放一個48位的指針,其中低32位送EIP存放器,高16位送CS存放器.JMPFWORDPTR[EBX];段間間接轉(zhuǎn)移,EBX指向的內(nèi)存中的48位內(nèi)容就是轉(zhuǎn)移地址,其中的低32位送EIP存放器,高16位送CS存放器.⑵子程序調(diào)用與返回指令根據(jù)主程序和子程序是否在同一個代碼段內(nèi),它們可以分為段內(nèi)調(diào)用、段內(nèi)返回以及段間調(diào)用、段間返回。根據(jù)子程序入口地址DST的尋址方式的不同可以分為直接調(diào)用和間接調(diào)用。子程序調(diào)用指令和子程序返回指令均不影響標(biāo)志位。⑵子程序調(diào)用與返回指令CALLDISP16;段內(nèi)直接調(diào)用,16位的位移量CALLDISP32;段內(nèi)直接調(diào)用,32位的位移量CALLDISP48;段間直接調(diào)用,48位的邏輯地址CALLMEM16;段內(nèi)間接調(diào)用,16位指針作為偏移地址送IPCALLMEM32;段內(nèi)間接調(diào)用,32位指針是偏移地址送EIPCALLMEM48;段間間接調(diào)用,48位指針是邏輯地址CS:EIPCALLREG16;段內(nèi)間接調(diào)用,16位指針作為偏移地址送IPCALLREG32;段內(nèi)間接調(diào)用,32位指針是偏移地址送EIPRET;NEAR或FAR類型的子程序返回RETn;子程序返回,并修改堆棧指針:

SP←SP內(nèi)容加n,或ESP←ESP內(nèi)容加n。⑶條件轉(zhuǎn)移指令判斷單個標(biāo)志位狀態(tài)的轉(zhuǎn)移指令比較無符號數(shù)大小的轉(zhuǎn)移指令比較有符號數(shù)大小的轉(zhuǎn)移指令判斷計數(shù)器CX是否為0的轉(zhuǎn)移指令⑶條件轉(zhuǎn)移指令JZ/JE;ZF=1轉(zhuǎn)移JNZ/JNE;ZF=0轉(zhuǎn)移JS;SF=1轉(zhuǎn)移JNS;SF=0轉(zhuǎn)移JO;OF=1轉(zhuǎn)移JNO;OF=0轉(zhuǎn)移JP;PF=1轉(zhuǎn)移JNP;PF=0轉(zhuǎn)移JCXZ;CX=0轉(zhuǎn)移條件轉(zhuǎn)移指令都不影響標(biāo)志位。利用標(biāo)志位作為測試條件,不同的條件轉(zhuǎn)移指令有不同的測試條件.無符號數(shù)比較〔above高于,below低于,equal等于〕JC/JB/JNZEJNC/JNB/JAEJBE/JNAJNBE/JA帶符號數(shù)比較〔greater大于,less小于〕JL/JNGEJNL/JGEJLE/JNGJNLE/JGAX中存放一個帶符號數(shù),假設(shè)AX為正數(shù),使DX清零;假設(shè)AX為負(fù)數(shù),使DX=FFFFH.TESTAX,8000HJZZEROMOVDX,0FFFFHJMPNEXTZERO:MOVDX,0NEXT:┊例:⑷循環(huán)控制指令LOOPOPR;CX←CX-1;CX≠0那么循環(huán)LOOPZOPR;CX←CX-1;ZF=1且CX≠0那么循環(huán)LOOPNZOPR;CX←CX-1;ZF=0且CX≠0那么循環(huán)MOVCX,10;循環(huán)次數(shù)N:┊;循環(huán)體┊LOOPN;計數(shù)器減1.CX≠0循環(huán);CX=0退出循環(huán)可用DECCX代替LOOPNJNZN⑸中斷與返回指令I(lǐng)NTn;中斷類型碼n(00H∽FFH)INTO;溢出標(biāo)志OF=1啟動的中斷IRET;從堆棧中恢復(fù)程序斷點(diǎn),返回7、處理器控制類指令

⑴狀態(tài)標(biāo)志位處理指令CLC(Clearcarry);進(jìn)位標(biāo)志CF=0STC(Setcarry);進(jìn)位標(biāo)志CF=1CMC(Complementcarry);進(jìn)位標(biāo)志求反CLD(Cleardirection);方向標(biāo)志DF=0STD(Setdirection);方向標(biāo)志DF=1CLI(Clearinterrupt);中斷標(biāo)志IF=0(關(guān)中斷)STI(Setinterrupt);中斷標(biāo)志IF=1(開中斷)⑵其它處理器控制指令NOP(Nooperation);空操作指令,常用來作延時,或取代其他指令作調(diào)試之用.HLT(Halt);停機(jī)指令,CPU暫停執(zhí)行程序,等待硬件中斷。ESC(Escape);換碼指令,80486以后已成為未定義指令.WAIT(Wait);等待指令,使處理器處于空轉(zhuǎn)狀態(tài),也可以用來等待外部中斷發(fā)生,但中斷處理完后仍返回WAIT指令繼續(xù)等待.LOCK(Lock);封鎖指令,作為指令的前綴可位于任何指令的前端,而不是一條獨(dú)立的指令,凡帶有LOCK前綴的指令,在該指令執(zhí)行過程中都禁止其他協(xié)處理器占用總線,故它可稱為總線鎖定前綴.第三節(jié)匯編語言程序格式匯編語言特性偽指令匯編語言源程序舉例匯編語言程序的調(diào)試〔常用的DEBUG命令〕匯編語言程序的開發(fā)步驟:〔1〕用編輯程序建立擴(kuò)展名為.ASM的源文件?!?〕用匯編程序〔MASM程序〕把ASM文件轉(zhuǎn)換成目標(biāo)文件〔OBJ文件〕?!?〕用連接程序〔LINK程序〕把目標(biāo)文件轉(zhuǎn)換成可執(zhí)行文件〔EXE文件〕?!?〕用DOS命令直接輸入文件名就可以執(zhí)行該程序?!?〕用調(diào)試程序〔如DEBUG調(diào)試程序〕對源程序進(jìn)行調(diào)試。1、匯編語言特性1.程序注釋:用一個分號開始,可以放在一條指令之后,也可以自成一行,不產(chǎn)生機(jī)器碼,目的只是增加源程序的可讀性。2.保存字:具有特定意義的字,如存放器名,指令助記符,偽指令助記符,運(yùn)算符,預(yù)定義符號。3.標(biāo)識符:由字母、數(shù)字和特殊字符〔如“?、_、@〞等〕組成的字符串。有兩類標(biāo)識符—變量名和標(biāo)號〔1〕變量名:是一個數(shù)據(jù)的符號地址,如:VARDB12H〔2〕標(biāo)號:是指令、過程或段的符號地址。標(biāo)號和變量都具有如下三種屬性。段屬性、偏移屬性、類型屬性。注意:變量和標(biāo)號是不同的。〔1〕變量是指數(shù)據(jù)區(qū)的名字,而標(biāo)號是指某條執(zhí)行指令起始地址的符號表示?!?〕變量的類型是指數(shù)據(jù)項存取的單位的字節(jié)數(shù),標(biāo)號是類型是指使用該標(biāo)號的指令之間的距離是段內(nèi)〔NEAR型〕或段間〔FAR型〕。4.語句:語句類型和語句格式語句類型〔1〕指令語句:匯編程序把他們翻譯成目標(biāo)碼,對應(yīng)著計算機(jī)的一種操作?!?〕偽指令語句:不產(chǎn)生目標(biāo)代碼,只是完成某種對應(yīng)的操作〔偽操作〕。語句格式:標(biāo)示符操作符操作數(shù);注釋操作數(shù):常數(shù)、存放器、標(biāo)號、變量、表達(dá)式例如:HERE:LEABX,BUF;設(shè)置緩沖區(qū)指針VARDW1234H;給變量分配一個字單元,并賦值1.運(yùn)算符:

算術(shù)運(yùn)算符邏輯運(yùn)算符關(guān)系運(yùn)算符數(shù)值返回運(yùn)算符屬性運(yùn)算符2.運(yùn)算符的優(yōu)先級:見P96表2.4例:VARDW1234H〔1〕MOVBX,SEGVAR〔2〕MOVBX,OFFSETVAR〔3〕MOVAL,TYPEVAR匯編結(jié)果是:MOVAL,2〔4〕MOVBYTEPTR[BX],8〔5〕MOVWORDPTR[BX],8〔6〕JMPFARPTRNEXT〔7〕MOVAX,ES:[BX+SI]〔8〕MOVAH,HIGH1234H〔9〕MOVAL,LOW1234H首先,CPU指令是給CPU的命令,在程序運(yùn)行時由CPU執(zhí)行,每條指令對應(yīng)CPU的一種特定的操作,例如傳送、做加法等;而偽指令是給匯編程序的命令,在匯編過程中由匯編程序進(jìn)行處理,例如定義數(shù)據(jù)、分配存儲區(qū)、定義段以及定義過程等。其次,匯編以后,每條CPU指令會產(chǎn)生一一對應(yīng)的目標(biāo)代碼;而偽指令那么不產(chǎn)生與之相應(yīng)的目標(biāo)代碼。二者區(qū)別:無論表示形式或其在語句中所處的位置,都與CPU指令相似,因此稱偽指令。2、偽指令分為以下幾類:〔1〕變量定義偽指令〔2〕相等偽指令〔3〕段定義偽指令〔4〕子程序定義偽指令〔5〕結(jié)束偽指令

①變量定義偽指令DB:定義字節(jié)變量,每一個表達(dá)式占一個字節(jié).DW:定義字變量,每一個表達(dá)式占兩個字節(jié),低字節(jié)在低地址,高字節(jié)在高地址。DD:定義雙字變量,每一個表達(dá)式占四個字節(jié),低字在低地址,高字在高地址。DQ:定義四字變量,每一個表達(dá)式占八個字節(jié),低字在低地址,高字在高地址。DT:定義十個字節(jié),每一個表達(dá)式占十個字節(jié),低字在低地址,高字在高地址。例:BDATADB10,?,3*2,‘AB’WDATADW100HARRAYDB2DUP〔0,2,?〕〔1〕MOVAL,BDATA+2〔2〕MOVAX,WORDPTRARRAY;〔AX〕=0200H〔3〕MOVBDATA,41H操作數(shù):常數(shù)、表達(dá)式、字符串、問號“?〞、重復(fù)操作符“DUP〞格式:變量名偽指令助記符操作數(shù);注釋②

相等偽指令為常量定義一個符號,有兩種:等號偽指令格式:名字=表達(dá)式COU=1234H;允許重復(fù)定義,屢次使用…COU=COU+1EQU偽指令格式:名字EQU表達(dá)式〔常數(shù)、符號、數(shù)值表達(dá)式、地址表達(dá)式〕COUNTEQU123;不能重新賦值,可屢次使用③

完整的段定義偽指令SEGMENT/ENDS偽指令必須成對使用,共同定義一個邏輯段。如:段名SEGMENT[定位類型][組合類型][‘類別’]┊;匯編語言指令序列段名ENDS〔1〕定位類型。如何確定段的邊界,默認(rèn)值是PARA〔2〕組合類型。如何組合幾個不同的段,默認(rèn)值是NONE〔3〕類別。作用是在連接時決定各邏輯段的裝入順序。必須位于單引號之間,常用的類別有STACK、CODE和DATA等。ASSUME偽指令指定程序中段與段存放器之間的關(guān)系。但不為段存放器設(shè)定初值。程序中必須用指令給段存放器賦初值。CS存放器例外。如:ASSUMECS:CODE,DS:DATA,...ORG偽指令用來指出源程序或數(shù)據(jù)塊在內(nèi)存中的起點(diǎn)偏移地址。假設(shè)省略O(shè)RG,那么從本段起始地址0開始連續(xù)存放。如:ORG100HDATASEGMENT;定義數(shù)據(jù)段BUFDB11H,22H;定義字節(jié)數(shù)據(jù)緩沖區(qū)DATAENDS;數(shù)據(jù)段結(jié)束STACKSEGMENT;定義堆棧段STDB50DUP(?);設(shè)置堆棧的大小是50字節(jié)STACKENDS;堆棧段結(jié)束CODESEGMENT;定義代碼段ASSUMECS:CODE,DS:DATA,SS:STACKMAINPROCFAR;把主程序定義為子程序START:┊;匯編指令序列MOVAH,4CHINT21H;返回DOSMAINENDP;子程序結(jié)束CODEENDS;代碼段結(jié)束

ENDSTART;程序結(jié)束④

簡化的段定義偽指令.MODELSMALL;定義程序的存儲模式.STACK;建立一個堆棧段.DATA;建立一個數(shù)據(jù)段┊;在數(shù)據(jù)段中定義變量.CODE;建立一個代碼段.STARTUP;設(shè)置程序的起始點(diǎn)┊;可執(zhí)行指令構(gòu)成的程序段.EXIT0;程序結(jié)束,返回操作系統(tǒng)

END;匯編結(jié)束⑤

子程序定義偽指令子程序名PROC[類型];子程序開始┊;匯編語言指令序列

RET;子程序返回到調(diào)用處子程序名ENDP;子程序結(jié)束子程序名是子程序入口的符號地址;類型屬性有NEAR和FAR;如果類型默認(rèn),系統(tǒng)默認(rèn)是NEAR型。子程序是完成一個特定功能的指令序列,用CALL指令調(diào)用子程序,RET指令返回到調(diào)用處。⑥

處理器選擇偽指令.8086選擇8086指令系統(tǒng)〔缺省情況〕.286選擇80286指令系統(tǒng).286P選擇保護(hù)模式下的80286指令系統(tǒng).386選擇80386指令系統(tǒng).386P選擇保護(hù)模式下的80386指令系統(tǒng).486選擇80486指令系統(tǒng).486P選擇保護(hù)模式下的80486指令系統(tǒng).586選擇Pentium指令系統(tǒng).586P選擇保護(hù)模式下Pentium指令系統(tǒng)⑦結(jié)束偽指令格式:END[標(biāo)號︱過程名]作用:表示源程序結(jié)束,匯編程序?qū)υ闯绦騾R編時,遇到END那么結(jié)束匯編。其中,標(biāo)號表示程序開始執(zhí)行的起始地址。假設(shè)有多個模塊相連接,那么只有主模塊要使用標(biāo)號,其它模塊只使用END而不必指定標(biāo)號。3、匯編語言源程序舉例

實(shí)現(xiàn)從鍵盤接收十進(jìn)制數(shù)并存入BX中..MODELTINY;建立微型存儲模式.CODE;建立一個代碼段.STARTUP;設(shè)置程序的起始點(diǎn)

MOVBX,0C:MOVAH,1;DOS調(diào)用:鍵盤輸入

INT21HSUBAL,30HJLEX;小于0退出CMPAL,9JGEX;大于9退出

CBWXCHGAX,BXMOVCX,10MULCXXCHGAX,BXADDBX,AXJMPCEX:

.EXIT;程序結(jié)束,返回操作系統(tǒng)

END;匯編結(jié)束4、匯編語言程序的調(diào)試

〔常用的DEBUG命令〕DEBUG是常用的匯編語言級調(diào)試工具,為匯編語言程序員提供了分析指令、跟蹤程序的有效手段。-A匯編 -U反匯編-T單步執(zhí)行-G斷點(diǎn)執(zhí)行-D數(shù)據(jù)顯示-R存放器-E修改內(nèi)存-Q退出DEBUG-I端口輸入-O端

溫馨提示

  • 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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論