第三章 80X86指令系統(tǒng)和尋址方式_第1頁
第三章 80X86指令系統(tǒng)和尋址方式_第2頁
第三章 80X86指令系統(tǒng)和尋址方式_第3頁
第三章 80X86指令系統(tǒng)和尋址方式_第4頁
第三章 80X86指令系統(tǒng)和尋址方式_第5頁
已閱讀5頁,還剩192頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第3章80x86的指令系統(tǒng)和尋址方式§3.1 80x86的尋址方式§3.3 80x86的指令系統(tǒng)§3.4 80x86的機器語言指令概況基本概念—指令系統(tǒng) 每一種計算機都有一組指令集供用戶使用,這組指令集稱為該計算機的指令系統(tǒng)。指令集中的每條指令在匯編語言中都是用助記符來表示的。基本概念—指令的構(gòu)成指令由操作碼和操作數(shù)兩部分組成操作碼說明計算機要執(zhí)行哪種操作,如傳送、運算、移位、跳轉(zhuǎn)等操作,它是指令中不可缺少的組成部分操作數(shù)是指令執(zhí)行的參與者,即各種操作的對象有些指令不需要操作數(shù),通常的指令都有一個或兩個操作數(shù),也有個別指令有3個甚至4個操作數(shù)操作碼操作數(shù)基本概念—8086指令的基本格式操作碼 [目的操作數(shù)][,源操作數(shù)]][;注釋]DESTSRC[]內(nèi)的內(nèi)容可缺省書寫注意事項:操作碼與操作數(shù)至少有一個空格或制表符分隔操作數(shù)之間必須用“,”相分隔,DEST在前,SRC在后每種指令的操作碼:用一個唯一的助記符表示(指令功能的英文縮寫)對應(yīng)著機器指令的一個二進制編碼操作數(shù)類型按照指令處理的操作數(shù)存放位置分:存儲器類型:操作數(shù)存放在主存中,A為其地址信息寄存器類型:操作數(shù)存放在CPU的通用寄存器中,A為寄存器號立即數(shù)類型:操作數(shù)存放在指令(地址字段)中指令中的操作數(shù):可以是一個具體的數(shù)值可以是存放數(shù)據(jù)的寄存器或指明數(shù)據(jù)在主存位置的存儲器地址基本概念—尋址方式在指令中為了取得操作數(shù)地址所使用的方式尋找操作數(shù)的過程就是操作數(shù)的尋址不同的指令系統(tǒng)都規(guī)定一些尋址方式供編程時選用指令的尋址方式主要由操作數(shù)的形式表示出來操作數(shù)采取哪一種尋址方式,會影響機器運行的速度和效率§3.1 80x86的尋址方式一、與數(shù)據(jù)有關(guān)的尋址方式二、與轉(zhuǎn)移地址有關(guān)的尋址方式立即(數(shù))尋址寄存器尋址直接尋址寄存器間接尋址寄存器相對尋址基址變址尋址相對基址變址尋址串操作尋址端口尋址操作數(shù)可以是一個具體的數(shù)值可以是存放數(shù)據(jù)的寄存器指明數(shù)據(jù)在主存位置的存儲器地址位移量:指令中給出16位數(shù)(常數(shù)、符號)EA 基地址:由基址寄存器BX或基址指針BP給出 變址:由變址寄存器(SI或DI)給出1.立即(數(shù))尋址指令中的操作數(shù)直接存放在機器代碼中,緊跟在操作碼之后(操作數(shù)作為指令的一部分存放在操作碼之后的主存單元中)這種操作數(shù)被稱為立即數(shù)imm它可以是8位數(shù)值i8(00H~FFH)也可以是16位數(shù)值i16(0000H~FFFFH)立即數(shù)尋址方式常用來給R/M賦值立即數(shù)只能用于源操作數(shù)立即數(shù)尋址指令MOVAL,05H ;AL←05HMOVAX,0102H ;AX←0102H立即數(shù)尋址的功能立即數(shù)尋址的執(zhí)行例、

MOVAX,3064H

指令執(zhí)行后,(AX)=3064H

下圖表示了它的執(zhí)行情況,圖中指令存放在代碼段中,OP表示該指令的操作碼部分,3064H為立即數(shù),它是指令的一個組成部分。

2.寄存器尋址:

它使用CPU的內(nèi)部寄存器來存放要處理的操作數(shù),寄存器號由指令指定。

可以是:8位寄存器: AH、AL、BH、BL、CH、CL、DH、DL16位寄存器: AX、BX、CX、DX、SI、DI、BP、SP4個段寄存器seg: CS、DS、SS、ES

MOVAX,1234H ;AX←1234H MOVBX,AX ;BX←AX寄存器尋址的功能寄存器尋址的執(zhí)行存儲器操作數(shù)的尋址當(dāng)操作數(shù)存放在內(nèi)存中時,尋找操作數(shù)歸結(jié)為如何確定存儲單元的地址邏輯地址 段基值:偏移量由段寄存器的內(nèi)容給出主要確定該部分的內(nèi)容(EA)物理地址=(段寄存器)×16+EA位移量:指令中給出16位數(shù)(常數(shù)、符號)EA 基地址:由基址寄存器BX或基址指針BP給出 變址:由變址寄存器(SI或DI)給出在實際尋址過程中,可能包含不同部分,EA為它們的相加之和,可在64KB范圍內(nèi)尋址。構(gòu)成EA的3個分量的不同組合,形成了不同的尋址方式。3.直接尋址:有效地址在指令中直接給出 操作數(shù)的16位偏移量直接包含在指令中,與操作碼一起放在代碼段中用符號表示的位移量MOVBX,VAR ←

→ MOVBX,DS:VAR;表示將用符號VAR表示的字單元的內(nèi)容→AX;不聲明段則默認(rèn)為數(shù)據(jù)段,指明段寄存器則可實現(xiàn)段跨越用常數(shù)表示的位移量MOVAX,DS:[2000H];表示將數(shù)據(jù)段偏移2000H字節(jié)的字單元的內(nèi)容→AX在這種尋址方式中,操作數(shù)存放在存儲單元中,而這個存儲單元的有效地址就在指令的操作碼之后,操作數(shù)的物理地址可通過段基地址再加上這個有效地址形成。直接尋址的功能MOVAX,DS:[2000H]直接尋址的執(zhí)行MOVAX,DS:[2000H]例:MOVAX,[2000H]EA=2000H,假設(shè)(DS)=3000H,那么PA=32000H

5030AHAL50(AX)=3050

H3200030例如:

MOVAX,DATA

MOVAX,[DATA]

這里DATA是存放操作數(shù)單元的符號地址。

直接尋址方式默認(rèn)操作數(shù)在數(shù)據(jù)段中,如果操作數(shù)定義在其它段中,則應(yīng)在指令中指定段跨越前綴。

例如:

MOVAX,ES:NUMBER

MOVAX,ES:[NUMBER]

這里NUMBER是附加段中的字變量。(2)所使用的寄存器相當(dāng)于地址指針,當(dāng)修改其內(nèi)容后可指向不同的存儲單元(3)書寫時用[]括住寄存器名,以區(qū)別于寄存器尋址.4.寄存器間接尋址:

寄存器間接尋址得到的操作數(shù)存放在內(nèi)存儲器中,而操作數(shù)的偏移地址EA在指令指明的寄存器中,即寄存器的內(nèi)容為操作數(shù)的偏移地址EA。(1)操作數(shù)的偏移地址包含在變址寄存器(DI或SI)、基址寄存器(BX或BP)之一中;當(dāng)以SI、DI、BX間接尋址,操作數(shù)默認(rèn)在數(shù)據(jù)段,操作數(shù)物理地址由數(shù)據(jù)段寄存器DS與SI或DI或BX中的偏移地址構(gòu)成;當(dāng)以BP間接尋址,操作數(shù)默認(rèn)在堆棧段,操作數(shù)物理地址由堆棧段寄存器SS與BP中的偏移地址構(gòu)成。使用段超越前綴改變段。即:若用寄存器SI,DI,BX間接尋址,則操作數(shù)在當(dāng)前數(shù)據(jù)段中。

PA=(DS)×10H+EA若用寄存器BP間接尋址,則操作數(shù)在當(dāng)前堆棧段中。

PA=(SS)×10H+EA寄存器間接尋址的功能寄存器間接尋址的執(zhí)行例:MOVAX,[BX]PA=16d×(DS)+(BX)MOVAX,ES:[BX]PA=16d×(ES)+(BX)MOVAX,[BP]PA=16d×(SS)+(BP)*不允許使用AX、CX、DX存放

EA

5.寄存器相對尋址方式直接變址尋址,基址尋址,變址尋址有效地址是寄存器內(nèi)容與有符號8位或16位位移量之和,寄存器可以是BX、BP或SI、DI

EA=BX/BP或SI/DI+0/8/16位位移量段地址對應(yīng)BX/SI/DI寄存器默認(rèn)是DS,對應(yīng)BP寄存器默認(rèn)是SS;可用段超越前綴改變該方式不僅可以修改指針,還可以修改位移量,對數(shù)組操作十分方便基址尋址變址尋址基址尋址:偏移地址是指令中給定的偏移量和寄存器BX或基數(shù)指針BP的內(nèi)容之和;BX作為基址寄存器時且無段超越時,物理地址由DS和偏移地址形成;BP作為基址寄存器時且無段超越時,物理地址由SS和偏移地址形成。例如:MOVBX,DELTA[BP]變址尋址:操作數(shù)的偏移地址為指令中給定的8位或16位偏移量和變址寄存器SI或DI內(nèi)容之和;操作數(shù)的物理地址由DS和偏移地址形成。若指明是段超越的,則以指令中指定的段寄存器為基準(zhǔn)。例如:MOVAX,COUNT[DI]5.寄存器相對尋址方式MOVAX,10H[SI] ←

MOVAX,DS:10H[SI]MOVAX,ARRAY[BX]←

MOVAX,DS:ARRAY[BX]MOVTABLE[DI],AL ←

MOVDS:TABLE[DI],ALMOVTABZ[BP],BL ←

MOVSS:TABZ[BP],BL寄存器相對尋址的功能寄存器相對尋址的執(zhí)行代碼段DS數(shù)據(jù)段操作碼24H00H12H34H56H78H9AHMOVAL,0024H[SI]0024H(SI)=0 (AL)=12H(SI)=1 (AL)=34H(SI)=2 (AL)=56H(SI)=3 (AL)=78H(SI)=4 (AL)=9AHEA=24H+(SI)(SI)可看作數(shù)據(jù)起始單元的偏移量數(shù)組內(nèi)某元素距數(shù)組起始單元的偏移通過修改SI可遍歷整個數(shù)組6.基址變址尋址方式:

操作數(shù)的偏移地址為基址寄存器BX或BP的內(nèi)容加上變址寄存器SI或DI的內(nèi)容之和;

若用BX作為基址寄存器,則操作數(shù)在數(shù)據(jù)段中;若用BP作為基址寄存器,則操作數(shù)在堆棧段中。

有效地址由基址寄存器(BX或BP)的內(nèi)容加上變址寄存器(SI或DI)的內(nèi)容構(gòu)成:段地址對應(yīng)BX基址寄存器默認(rèn)是DS,對應(yīng)BP基址寄存器默認(rèn)是SS;可用段超越前綴改變6.基址變址尋址方式MOVAX,[BX][SI]

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

MOVAX,SS:[BP+DI]MOVAX,DS:[BP][DI] ←

MOVAX,

DS:[BP+DI]基址變址尋址的功能請指出圖中的錯誤!基址變址尋址的執(zhí)行例、MOVAX,[BX][DI](或?qū)憺镸OVAX,[BX+DI])

設(shè)(DS)=2100H,(BX)=0158H,(DI)=10A5H

則EA=0158H+10A5H=11FDH

物理地址=21000H+11FDH=221FDH

指令執(zhí)行情況如下圖所示,最后的執(zhí)行結(jié)果是(AX)=1234H。

7.相對基址變址尋址方式:有效地址是基址寄存器(BX/BP)、變址寄存器(SI/DI)與一個8位或16位位移量之和:EA=BX/BP+SI/DI+8/16位位移量該方式中,BX/BP選一,SI/DI選一段地址對應(yīng)BX基址寄存器默認(rèn)是DS,對應(yīng)BP基址寄存器默認(rèn)是SS;可用段超越前綴改變7.相對基址變址尋址方式MOVAX,06H[BX+SI] ←

MOVAX,DS:[BX+SI+06H]MOVAL,TAB[BX][DI]←

MOVAL,DS:TABLE[BX][DI]MOVDWORD[BP][SI],DX ←

→MOVSS:DWORD[BP][SI],DX

MOVAX,ARRAY[BX][BP] ×MOVAX,DA[SI][DI] ×31A003000:1A00例如:MOVAX,MASK[BX][SI]BX、SI分別存放數(shù)組的腳標(biāo)MOVAL,ARRAY[BX][SI]DS數(shù)據(jù)段ARRAYSIBX二維數(shù)組起始單元⊕

EA[]之間表示相加的關(guān)系 [BX][SI]←

→[BX+SI]二、與轉(zhuǎn)移地址有關(guān)的尋址方式程序代碼亦存放在存儲器中,如何控制程序的走向(轉(zhuǎn)移位置的地址CS:IP)是本部分所涉及的內(nèi)容,由于它們與具體的指令相關(guān),他們的介紹放在指令中講解。§3.3 80x86的指令系統(tǒng)指令分類功能格式數(shù)據(jù)傳送指令算術(shù)運算指令邏輯指令串操作指令程序轉(zhuǎn)移指令處理器控制指令雙操作數(shù)指令(DEST,SRC)單操作數(shù)指令(DEST)無操作數(shù)指令(隱含,按約定尋找操作數(shù))一、數(shù)據(jù)傳送指令數(shù)據(jù)傳送是計算機中最基本、最重要的一種操作傳送指令也是最常使用的一類指令傳送指令把數(shù)據(jù)從一個位置傳送到另一個位置除標(biāo)志寄存器傳送指令外,均不影響標(biāo)志位重點掌握MOVXCHGXLATPUSHPOPLEA1.通用數(shù)據(jù)傳送指令提供方便靈活的通用傳送操作有3條指令MOVXCHGXLAT1) 傳送指令MOV(move)格式:MOVDEST,SRC功能:將源操作數(shù)的內(nèi)容傳送至目的操作數(shù)中即(DEST)←(SRC)說明:DEST可以是8/16位的R(CS、IP除外)/MSRC可以是8/16位的R/M/立即數(shù)只能出現(xiàn)在源操作數(shù)的位置1)傳送指令MOV—立即數(shù)傳送MOVreg/mem,imm ;立即數(shù)送寄存器或主存moval,4 ;(al)←4,字節(jié)傳送movcx,0ffh ;(cx)←00ffh,字傳送movsi,200h ;(si)←0200h,字傳送movbyteptr[si],0ah ;byteptr

說明是字節(jié)操作movwordptr[si+2],0bh

;wordptr

說明是字操作注意立即數(shù)是字節(jié)量還是字量明確指令是字節(jié)操作還是字操作1)傳送指令MOV

—寄存器之間數(shù)據(jù)傳送MOVreg,regmov

ax,bx ;(ax)←(bx),字傳送movah,al ;(ah)←(al),字節(jié)傳送mov

ds,ax ;(ds)←(ax),字傳送

CS只能出現(xiàn)在SRC的位置1)傳送指令MOV

—寄存器與存儲器之間數(shù)據(jù)傳送MOVAL,D_BYTEMOVDX,[BP] ;DX←SS:[BP]MOVDL,[SI] ;DL←DS:[SI]1)傳送指令MOV

—使用該指令應(yīng)注意的問題SRC與DEST的長度必須一致

錯誤示例: MOVAX,BL MOVCL,3824HDEST不能為CS、IP及立即數(shù)

錯誤示例: MOVVAR1,VAR2

正確實現(xiàn): MOVAL,VAR2 MOVVAR1,ALSRC與DEST不能同時為存儲器操作數(shù)—8086不支持兩個存儲單元間數(shù)據(jù)的直接傳送SRC與DEST不能同時為段寄存器

例: DS←ES

錯誤: MOVDS,ES正確實現(xiàn): MOVAX,ES MOVDS,AX不能將立即數(shù)直接傳送到段寄存器例: MOVAX,ES

MOVDS,AX1)傳送指令MOV—數(shù)據(jù)傳送方向示意立即數(shù)段寄存器CSDSESSS通用寄存器AXBXCXDXBPSPSIDI存儲器2)交換指令XCHG(exchange)指令格式: XCHGDEST,SRC指令功能: (DEST)←

(SRC)

寄存器與寄存器之間對換數(shù)據(jù) 寄存器與存儲器之間對換數(shù)據(jù)注意:不能在存儲器與存儲器之間對換數(shù)據(jù)

2)交換指令XCHG—寄存器間交換movax,1234h ;ax=1234hmovbx,5678h ;bx=5678hxchg

ax,bx

;ax=5678h,bx=1234hxchgah,al ;ax=7856h2)交換指令XCHG

—寄存器與存儲器交換xchgax,ds:[2000h] ;字交換;等同于xchgds:[2000h],axxchgal,ds:[2000h] ;字節(jié)交換;等同于xchgds:[2000h],al2)交換指令XCHG—例題分析例:(BX)=6F30H,(BP)=0200H,(SI)=0046H,(SS)=2F00H,(2F246H)=4154H,在指令XCHGBX,[BP+SI]執(zhí)行后,相關(guān)寄存器和存儲器的內(nèi)容是什么?分析:源操作數(shù)的物理地址= (SS)×16+(BP)+(SI)= 2F000H+0200H+0046H=2F246H指令的功能:(BX)←

(2F246H)指令執(zhí)行結(jié)果:(BX)=4154H,(2F246H)=6F30H3)換碼指令XLAT(translate)指令格式:

XLAT指令功能:AL←DS:[BX+AL],將BX指定的緩沖區(qū)中、AL指定的位移處的一個字節(jié)數(shù)據(jù)取出賦給AL換碼指令執(zhí)行前:在主存建立一個字節(jié)量表格,內(nèi)含要轉(zhuǎn)換成的目的代碼表格首地址存放于BX,AL存放相對表格首地址的位移量換碼指令執(zhí)行后:將AL寄存器的內(nèi)容轉(zhuǎn)換為目標(biāo)代碼movbx,100hmoval,03hxlat(BX)(AL)DS數(shù)據(jù)段12H34H56H78H9AH78H(AL)=78H3)換碼指令XLAT—例題2.堆棧操作指令—進棧指令PUSH格式: PUSHSRC功能: SP←SP-2, SS:[SP]←(r16/m16/seg)例:pushaxpushDS:[2000h]2.堆棧操作指令—出棧指令POP格式: POPDEST功能: (r16/m16/seg)←SS:[SP]

SP←SP+2,

例:popDXpopDS:[2000h]2.堆棧操作指令—應(yīng)用舉例pushax ;進入子程序后pushbxpushds...popds

;返回主程序前popbxpopax3.地址傳送指令地址傳送指令將存儲器單元的邏輯地址送至指定的寄存器有效地址傳送指令LEA指針傳送指令LDS和LES注意不是獲取存儲器單元的內(nèi)容3.地址傳送指令

—有效地址傳送指令LEA(loadEA)格式:LEADEST,SRC16位寄存器存儲器操作數(shù)功能:DEST←SRC的有效地址EA

將存儲器操作數(shù)的有效地址傳送至指定的16位寄存器中LEABX,BUFR9A78H(BX)=9A78H3.地址傳送指令

—有效地址傳送指令LEA(例)23H093A0HBUFR78H9AH093AHDS093C3H(BX)=0023H錯誤!獲得主存單元的有效地址;不是物理地址,也不是該單元的內(nèi)容可以實現(xiàn)計算功能3.地址傳送指令 —地址指針存儲單元的邏輯地址段基值(16位)段內(nèi)偏移量(16位)地址指針(32位) M的邏輯地址在M中需4個連續(xù)的存儲單元段基值A(chǔ)D_POINTXXXX偏移量XXXX3.地址傳送指令 —指針傳送指令格式:LDSDEST,SRC功能:(DEST)←(SRC)段內(nèi)偏移量DS←(SRC+2)段基值LDS指令將主存中SRC

指定的字送至16位寄存器DEST,并將SRC的下一字送DS寄存器格式:LESDEST,SRC功能:(DEST)←(SRC)段內(nèi)偏移量ES←(SRC+2)段基值LES指令將主存中SRC

指定的字送至16位寄存器DEST,并將SRC的下一字送ES寄存器例:(DS)=B000H,(BX)=080AH,(0B080AH)=05AEH,(0B080CH)=4000H,(405AEH)=9634H,在執(zhí)行指令

LDSDI,[BX] MOVAX,[DI]

后,(AX)=?BX=080AHB0000H0B080AH40000H34H96HAEH05H00H40H405AEH05AEH0B080CH(DI)=05AEH(DS)=4000H結(jié)果: (DS)=4000H(DI)=05AEH(AX)=9634H例、設(shè)執(zhí)行前(DS)=2000H,(DI)=1050H,COUNT=100H,執(zhí)行LDSSI,COUNT[DI]

4.標(biāo)志寄存器傳送指令標(biāo)志寄存器傳送指令用來傳送標(biāo)志寄存器FLAGS的內(nèi)容,方便進行對各個標(biāo)志位的直接操作有2對4條指令低8位傳送:LAHF和SAHF16位傳送:PUSHF和POPF4、標(biāo)志寄存器傳送指令

—標(biāo)志低字節(jié)進出AH指令格式:LAHF功能:(AH)←FLAGS的低字節(jié)LAHF指令將標(biāo)志寄存器的低字節(jié)送寄存器AHSF/ZF/AF/PF/CF狀態(tài)標(biāo)志位分別送入AH的第7/6/4/2/0位,而AH的第5/3/1位任意格式:SAHF功能:FLAGS的低字節(jié)←(AH)SAHF將AH寄存器內(nèi)容送FLAGS的低字節(jié)用AH的第7/6/4/2/0位相應(yīng)設(shè)置SF/ZF/AF/PF/CF標(biāo)志4.標(biāo)志寄存器傳送指令—

標(biāo)志寄存器進出堆棧指令格式:PUSHF功能:SP←SP-2SS:[SP]←FLAGSPUSHF指令將標(biāo)志寄存器的內(nèi)容壓入堆棧,同時棧頂指針SP減2格式:POPF功能:FLAGS←SS:[SP] SP←SP+2POPF指令將棧頂字單元內(nèi)容送標(biāo)志寄存器,同時棧頂指針SP加24.標(biāo)志寄存器傳送指令—

標(biāo)志寄存器進出堆棧指令(置位單步標(biāo)志)pushf

;保存全部標(biāo)志到堆棧popax ;從堆棧中取出全部標(biāo)志orax,0100h ;設(shè)置D8=TF=1,ax其它位不變pushax ;將ax壓入堆棧popf ;FLAGS←AX;將堆棧內(nèi)容取到標(biāo)志寄存器二、算術(shù)運算指令(部分)四則運算是計算機經(jīng)常進行的一種操作。算術(shù)運算指令實現(xiàn)二進制(和十進制)數(shù)據(jù)的四則運算請注意算術(shù)運算類指令對標(biāo)志的影響1.加/減法指令格式: ADDDEST,SRC SUBDEST,SRC功能: (DEST)←(DEST)+/-(SRC)受影響標(biāo)志:CF,PF,AF,ZF,SF,OF說明:操作數(shù)可以是字節(jié)或字SRC可以是通用R、M、immDEST可以是通用R、MDEST和SRC不能同時為M

進位標(biāo)志

奇偶標(biāo)志

輔助進位標(biāo)志

零標(biāo)志

符號標(biāo)志

溢出標(biāo)志

CF:當(dāng)結(jié)果的最高位產(chǎn)生進位時,CF=1,否則CF=0。

OF:當(dāng)帶符號數(shù)運算的結(jié)果超出其所能表示范圍,則OF=1,否則OF=0。

PF:結(jié)果中含"1"的個數(shù)為偶數(shù),則PF=1,否則PF=0。

SF:結(jié)果最高位為1,則SF=1,否則SF=0。

ZF:結(jié)果為零,則ZF=1,否則ZF=0。

AF:字節(jié)運算時D3產(chǎn)生進位;字運算時D7產(chǎn)生進位,則AF=1,否則AF=0。1.加法指令—舉例ADDAX,BXADDAL,BLSUBCX,20HADDDL,DA_BYTESUBDA_WORD,DX若(AL)=0E5H,執(zhí)行ADDAL,0A4H后,AL及各標(biāo)志位的情況?1111001011010010010001001+CF=1,AF=0,PF=0,ZF=0,SF=1,OF=0若認(rèn)為是無符號數(shù),則為229+164=393=256+137若認(rèn)為是有符號數(shù),則為(-27)+(-92)=-119例:ADDAX,2520H

2.減法指令—舉例例:執(zhí)行指令 MOVAL,-73 SUBAL,-87

后,AL及個標(biāo)志位的情況101101111010100100001110—CF=0,AF=1,PF=0,ZF=0,SF=0,OF=0-73的補碼表示14-87的補碼表示AL=0EH2.帶進/借位的加/減法指令格式: ADCDEST,SRC SBBDEST,SRC功能: (DEST)←(DEST)+/-(SRC)+/-CF受影響標(biāo)志:CF,PF,AF,ZF,SF,OF說明:操作數(shù)可以是字節(jié)或字SRC可以是通用R、M、immDEST可以是通用R、MDEST和SRC不能同時為M

2.帶進/借位的加/減法指令—舉例例:實現(xiàn)2F365H和5E024H的加法運算 MOVDX,2 MOVAX,0F365H ADDAX,0E024H ADCDX,52F3655E0248D389+手工計算2F3655E0248D389+1F365E024D389+CF=1,AF=0,PF=0,ZF=0,SF=1,OF=0000200050008+0001CF=0,AF=0,PF=0,ZF=0,SF=0,OF=0AXDXAX3A79例:設(shè)在內(nèi)存BUFFER1,BUFFER2開始的兩個存區(qū)中分別存有兩個四字節(jié)數(shù)(如下圖),現(xiàn)求這兩個數(shù)之和,并

把它們的結(jié)果存入以BUFFER3為首址的存區(qū)中解:完成本任務(wù)的程序段如左下所示,該程序的逐條執(zhí)行過程可見下圖演示

AX90F0AX3512AX40633.加/減1指令格式: INCDEST DECDEST功能: (DEST)←(DEST)+/-1將DEST指定的寄存器或存儲器內(nèi)容加1或減1,然后送會寄存器或存儲器

受影響標(biāo)志:PF,AF,ZF,SF,OF;但不影響CF說明:DEST可以是字節(jié)或字R、M功能與ADD/SUB相似,但占用字節(jié)少,且不影響標(biāo)志位CF

。常用于修改地址指針及循環(huán)計數(shù)器。 例、設(shè)X、Y、Z均為雙精度數(shù),他們分別存放在地址為X,X+2;Y,Y+2;Z,Z+2的存儲單元中,存放時高位字在高地址中,低位字在低地址中;W,W+2單元存放運算結(jié)果;編寫實現(xiàn)下列二進制運算的程序段

WX+Y+24-Z

MOVAX,XMOVDX,X+2ADDAX,YADCDX,Y+2ADDAX,24ADCDX,0SUBAX,ZSBBDX,Z+2MOVW,AXMOVW+2,DX4.求補指令(求負(fù)數(shù))格式: NEGDEST功能: (DEST)←0-(DEST)受影響標(biāo)志:CF,PF,AF,ZF,SF,OF說明:DEST可以是字節(jié)或字R、M操作對象是有符號的數(shù)當(dāng)操作數(shù)取最小值(-128或-32768)時,執(zhí)行該指令后,操作數(shù)無變化,OF=1當(dāng)操作數(shù)為0時,結(jié)果為0,但CF=0,其他情況CF=14.求補指令(舉例)例:AL=13H,執(zhí)行指令

NEGAL

后AL的值1000000000001001111101101—ALAL=-13H100100100000000110010011+若AL=11010001B=[-47]補,執(zhí)行NEGAL后,

AL=00101111B=+475.比較指令CMP(compare)格式: CMPDEST,SRC功能: (DEST)-(SRC)受影響標(biāo)志:CF,PF,AF,ZF,SF,OF說明:DEST,SRC可以是字節(jié)或字R、M,長度必須一致SRC還可以是immDEST和SRC不能同時為M該指令主要用于比較兩數(shù)的關(guān)系5.比較指令CMP—應(yīng)用ZF=1 ;兩數(shù)相等兩個無符號數(shù)比較

CMPAX,BX ;

0 AX≥

BX1 AX<BX

CF= 兩個帶符號的數(shù)的比較不能用單一的符號判斷兩個數(shù)的關(guān)系

指令執(zhí)行后SF與OF相同,(DEST)>SRCSF與OF不同,(DEST)<SRC5.比較指令CMP—(CMPAL,BL)AL=-2BL=127111111100111111101111111-SF=0OF=1相異,AL<BLAL=-2BL=-11111111101111111111111111-SF=1OF=0相異,AL<BL5.比較指令CMP—(CMPAL,BL)AL=-1BL=-2111111111111111000000001-SF=0OF=0相同,AL>BLAL=127BL=-21011111111111111010000001-SF=1OF=1相同,AL>BL6.乘法指令MULr8/m8;無符號字節(jié)乘法;AX←AL×r8/m8MULr16/m16;無符號字乘法;DX.AX←AX×r16/m16IMULr8/m8;有符號字節(jié)乘法;AX←AL×r8/m8IMULr16/m16;有符號字乘法;DX.AX←AX×r16/m166.乘法指令—功能乘法指令分無符號和有符號乘法指令乘法指令的源操作數(shù)顯式給出,隱含使用另一個操作數(shù)AX和DX字節(jié)相乘:AL與r8/m8相乘,得到16位的結(jié)果,存入AX字相乘:AX與r16/m16相乘,得到32位的結(jié)果,其高字存入DX,低字存入AX乘法指令利用OF和CF判斷乘積的高一半是否具有有效數(shù)值6.乘法指令—對標(biāo)志的影響

乘法指令如下影響OF和CF標(biāo)志:MUL指令——若乘積的高一半(AH或DX)為0,則OF=CF=0;否則OF=CF=1IMUL指令——若乘積的高一半是低一半的符號擴展,則OF=CF=0;否則均為1例:設(shè)在字變量A1,A2中分別存有兩個16位無符號二進制數(shù),現(xiàn)在要求它們的積,并將積存入以BUFFER為偏移地址的連續(xù)存區(qū)中。下面是完成此過程的程序段:

MOVAX,A1

MULA2

MOVBUFFER,AX

MOVBUFFER+2,DX6.乘法指令—(例)moval,0b4h

;al=b4h=180movbl,11h

;bl=11h=17mul

bl

;ax=Obf4h=3060,OF=CF=1,AX高8位不為0moval,0b4h

;al=b4h=-76movbl,11h

;bl=11h=17imul

bl

;ax=faf4h=-1292,OF=CF=1,AX高8位有效6.除法指令DIVr8/m8

;無符號字節(jié)除法AL←AX÷r8/m8的商,Ah←AX÷r8/m8的余數(shù)DIVr16/m16

;無符號字除法;AX←DX.AX÷r16/m16的商,DX←DX.AX÷r16/m16的余數(shù)IDIVr8/m8

;有符號字節(jié)除法:AL←AX÷r8/m8的商,Ah←AX÷r8/m8的余數(shù)IDIVr16/m16

;有符號字除法:;AX←DX.AX÷r16/m16的商,DX←DX.AX÷r16/m16的余數(shù)6.除法指令—功能除法指令分無符號和有符號除法指令除法指令的除數(shù)顯式給出,隱含使用另一個操作數(shù)AX和DX作為被除數(shù)字節(jié)量除法:AX除以r8/m8,8位商存入AL,8位余數(shù)存入AH字量除法:DX.AX除以r16/m16,16位商存入AX,16位余數(shù)存入DX除法指令對標(biāo)志沒有影響除法指令會產(chǎn)生結(jié)果溢出6.除法指令—除法錯中斷當(dāng)被除數(shù)遠大于除數(shù)時,所得的商就有可能超出它所能表達的范圍。如果存放商的寄存器AL/AX不能表達,便產(chǎn)生溢出,8086CPU中就產(chǎn)生編號為0的內(nèi)部中斷——除法錯中斷對DIV指令,除數(shù)為0,或者在字節(jié)除時商超過8位,或者在字除時商超過16位,則發(fā)生除法溢出對IDIV指令,除數(shù)為0,或者在字節(jié)除時商不在-128~127范圍內(nèi),或者在字除時商不在-32768~32767范圍內(nèi),則發(fā)生除法溢6.除法指令—(例)movax,0400h

;ax=400h=1024movbl,0b4h

;bl=b4h=180divbl

;商al=05h=5,余數(shù)ah=7ch=124movax,0400h

;ax=400h=1024movbl,0b4h

;bl=b4h=-76idiv

bl

;商al=f3h=-13,余數(shù)ah=24h=367.符號擴展指令—符號擴展的概念符號擴展是指用一個操作數(shù)的符號位(即最高位)形成另一個操作數(shù),后一個操作數(shù)的各位是全0(正數(shù))或全1(負(fù)數(shù))。符號擴展不改變數(shù)據(jù)大小對于數(shù)據(jù)64H(表示數(shù)據(jù)100),其最高位D7為0,符號擴展后高8位都是0,成為0064H(仍表示數(shù)據(jù)100)對于數(shù)據(jù)ff00H(表示有符號數(shù)-256),其最高位D15為1,符號擴展后高16位都是1,成為ffffff00H(仍表示有符號數(shù)-256)7.符號擴展指令CBW

;AL的符號擴展至AH;如AL的最高有效位是0,則AH=00;AL的最高有效位為1,則AH=FFH。AL不變CWD

;AX的符號擴展至DX;如AX的最高有效位是0,則DX=00;AX的最高有效位為1,則DX=FFFFH。AX不變符號擴展指令常用于獲得雙倍長的數(shù)據(jù)7.符號擴展指令—(例:AX/BX)cwd

;DX.AX←AXidiv

bx

;AX←DX.AX÷BX

利用符號擴展指令得到除法指令所需要的倍長于除數(shù)的被除數(shù)對無符號數(shù)除法應(yīng)該采用直接使高8位或高16位清0的方法,獲得倍長的被除數(shù)例:設(shè)在字變量B1,B2中分別存有兩個16位帶符號二進制數(shù),計算B1/B2,并將其商和余數(shù)分別以RESULT為偏移地址的連續(xù)存區(qū)中。下面是完成此過程的程序段:

MOVAX,B1

CWD

IDIVB2

MOVRESULT,AX

MOVRESULT+2,DX

例:課本P67。8.十進制調(diào)整指令十進制數(shù)調(diào)整指令對二進制運算的結(jié)果進行十進制調(diào)整,以得到十進制的運算結(jié)果分成壓縮BCD碼和非壓縮BCD碼調(diào)整8.十進制調(diào)整指令

—壓縮BCD碼加、減調(diào)整指令(ADDAL,i8/r8/m8)(ADCAL,i8/r8/m8) DAA;AL←將AL的加和調(diào)整為壓縮BCD碼(SUBAL,i8/r8/m8)(SBBAL,i8/r8/m8) DAS;AL←將AL的減差調(diào)整為壓縮BCD碼使用DAA或DAS指令前,應(yīng)先執(zhí)行以AL為目的操作數(shù)的加法或減法指令DAA和DAS指令對OF標(biāo)志無影響,按結(jié)果影響其他標(biāo)志8.十進制調(diào)整指令—

壓縮BCD碼加、減調(diào)整指令(例)moval,68h ;al=68h,壓縮BCD碼表示真值68movbl,28h ;bl=28h,壓縮BCD碼表示真值28addal,bl

;二進制加法:al=68h+28h=90hdaa

;十進制調(diào)整:al=96h;實現(xiàn)壓縮BCD碼加法:68+28=96moval,68h ;al=68h,壓縮BCD碼表示真值68movbl,28h ;bl=28h,壓縮BCD碼表示真值28subal,bl ;二進制減法:al=68h-28h=40hdas

;十進制調(diào)整:al=40h;實現(xiàn)壓縮BCD碼加法:68-28=408.十進制調(diào)整指令

—非壓縮BCD碼加、減調(diào)整指令(ADDAL,i8/r8/m8)(ADCAL,i8/r8/m8) AAA;AL←將AL的加和調(diào)整為非壓縮BCD碼;AH←AH+調(diào)整的進位(SUBAL,i8/r8/m8)(SBBAL,i8/r8/m8) AAS;AL←將AL的減差調(diào)整為非壓縮BCD碼;AH←AH-調(diào)整的借位使用AAA或AAS指令前,應(yīng)先執(zhí)行以AL為目的操作數(shù)的加法或減法指令A(yù)AA和AAS指令在調(diào)整中產(chǎn)生了進位或借位,則AH要加上進位或減去借位,同時CF=AF=1,否則CF=AF=0;它們對其他標(biāo)志無影響8.十進制調(diào)整指令

—非壓縮BCD碼加、減調(diào)整指令(例)movax,0608h ;ax=0608h,非壓縮BCD碼表示真值68movbl,09h ;bl=09h,非壓縮BCD碼表示真值9addal,bl

;二進制加法:al=08h+09h=11haaa

;十進制調(diào)整:ax=0707h;實現(xiàn)非壓縮BCD碼加法:68+9=77movax,0608h

;ax=0608h,非壓縮BCD碼表示真值68movbl,09h

;bl=09h,非壓縮BCD碼表示真值9subal,bl

;二進制減法:al=08h-09h=ffhaas

;十進制調(diào)整:ax=0509h;實現(xiàn)非壓縮BCD碼減法:68-9=59例:用乘法指令實現(xiàn)32位二進制數(shù)的相乘cdabaxdxaxdxdxaxdxax×

+

b×da×db×ca×cDSEG SEGMENTPARA'Data‘num1 dw1220h,48a2hnum2 dw2398h,0ae41hprodu

dw4dup(0)DSEG ENDSabcdnum1num1+2num2num2+2produprodu+2produ+4produ+6三、邏輯指令 (邏輯)位操作類指令以二進制位為基本單位進行數(shù)據(jù)的操作;這是一類常用的指令,都應(yīng)該特別掌握邏輯運算指令測試指令移位指令1.邏輯運算指令格式:

ANDDEST,SRC ORDEST,SRC XORDEST,SRC NOTDEST功能: (DEST)←

(DEST)(SRC)∧∨∨(DEST)←

(DEST)

受影響標(biāo)志:CF=0,OF=0,

PF,ZF,SF,NOT對標(biāo)志無影響1.邏輯運算指令—應(yīng)用moval,45h ;邏輯與al=01handal,31h ;CF=OF=0,SF=0、ZF=0、PF=0moval,45h ;邏輯或al=75horal,31h ;CF=OF=0,SF=0、ZF=0、PF=0moval,45h ;邏輯異或al=74hxoral,31h ;CF=OF=0,SF=0、ZF=0、PF=1moval,45h ;邏輯非al=0bahnotal ;標(biāo)志不變1.邏輯運算指令—應(yīng)用AND指令可用于復(fù)位某些位(同0相與),不影響其他位:將BL中D3和D0位清0,其他位不變

ANDBL,11110110B

OR指令可用于置位某些位(同1相或),不影響其他位:將BL中D3和D0位置1,其他位不變

ORBL,00001001BXOR指令可用于求反某些位(同1相異或),不影響其他位:將BL中D3和D0位求反,其他不變

XORBL,00001001B XORAX,AX ;AX=0,CF=ZF=0 XOR AL,43H ;ZF=0則AL≠43H;ZF=1AL=43H則例:課本P69。例:課本P69。2.測試指令TEST格式: TESTDEST,SRC功能: 將兩個操作數(shù)進行邏輯“與”運算,結(jié)果只反映在標(biāo)志位上,對操作數(shù)無影響受影響標(biāo)志:CF=0,OF=0

,

PF,ZF,SF說明:該指令用于測試操作數(shù)的某位是否為1,被測試的位與1相“與”

TESTAL,01H ;測試D0的值ZF=0,D0=1ZF=1,D0=0例:課本P70。3.移位指令邏輯移位指令算術(shù)移位指令循環(huán)移位指令1)邏輯移位指令格式: SHLDEST,CNT SHRDEST,CNT功能: 將DEST按CNT指定的次數(shù)左/右移位,移出的位→CF,空出的位補0,結(jié)果→DEST受影響標(biāo)志:OF(CNT=1時),CF,PF,ZF,SF說明:DEST可以是字節(jié)或字R、MCNT為1或CL只在CNT=1時。CF與SF相同,OF=0;CF與SF不同,OF=1。該指令可用于無符號數(shù)÷/×2的操作邏輯左移SHLAL,12)算術(shù)移位指令格式: SALDEST,CNT SARDEST,CNT功能: SAL與SHL完全相同SAR每右移1位,最低位→CF,最高位保持不變(用于帶符號數(shù)的除法),結(jié)果→DEST受影響標(biāo)志:OF(CNT=1時),CF,PF,ZF,SF說明:DEST可以是字節(jié)或字R、MCNT為1或CL該指令可用于帶符號數(shù)÷/×2的操作邏輯移位指令的功能移位指令應(yīng)用舉例MOVCL,4MOVAL,0F0H ;AL=F0HSHLAL,1

;AL=E0H

;CF=1,SF=1、ZF=0、PF=0,OF=0SHRAL,1

;AL=70H ;CF=0,SF=0、ZF=0、PF=0、OF=1 SARAL,CL

;AL=03H

;CF=1,SF=0、ZF=0、PF=1SARAL,1

;AL=38H

;CF=0,SF=0、ZF=0、PF=0、OF=0mov

si,axshlsi,1 ;si←2×axaddsi,ax ;si←3×axmov

dx,bxmovcl,03hshl

dx,cl ;dx←8×bxsubdx,bx ;dx←7×bxadddx,si ;dx←7×bx+3×ax移位指令應(yīng)用舉例3)循環(huán)移位指令格式: ROLDEST,CNT RORDEST,CNT RCLDEST,CNT RCRDEST,CNT

功能:小循環(huán):將DEST按CNT指定的次數(shù)左/右移位,移出的位同時送CF和空出的位大循環(huán):將DEST按CNT指定的次數(shù)左/右移位,CF→空出的位,移出的位→

CF受影響標(biāo)志:OF(CNT=1時),CF說明:用大循環(huán)可完成多字節(jié)的移位操作小循環(huán)大循環(huán)不帶進位循環(huán)移位指令(小循環(huán))帶進位循環(huán)移位指令(大循環(huán))循環(huán)移位指令

—將DX.AX中32位數(shù)值左移一位SHLAX,1RCLDX,1DXAXCF0循環(huán)移位指令—位傳送;把AL最低位送BL最低位,保持AL不變RORAL,1RCLBL,1ROLAL,1ALCFBLCFALCFAL之D0循環(huán)移位指令—BCD碼合并;AH.AL分別存放著非壓縮BCD碼的兩位;將它們合并成為一個壓縮BCD碼存ALANDAX,0F0FH ;保證高4位為0MOVCL,4ROLAH,CL ;也可以用SHLAH,CLADDAL,AH ;也可以用ORAL,AH四、串操作指令串操作指令是8086指令系統(tǒng)中比較獨特的一類指令,采用比較特殊的數(shù)據(jù)串尋址方式,在操作主存連續(xù)區(qū)域的數(shù)據(jù)時,特別好用、因而常用串操作指令的操作數(shù)是主存中連續(xù)存放的數(shù)據(jù)串(String)——即在連續(xù)的主存區(qū)域中,字節(jié)或字的序列串操作指令的操作對象是以字(W)為單位的字串,或是以字節(jié)(B)為單位的字節(jié)串四、串操作指令—串尋址方式源操作數(shù)用寄存器SI尋址,默認(rèn)在數(shù)據(jù)段DS中,但允許段超越:DS:[SI]目的操作數(shù)用寄存器DI尋址,默認(rèn)在附加段ES中,不允許段超越:ES:[DI]每執(zhí)行一次串操作指令,SI和DI將自動修改:±1(對于字節(jié)串)或±2(對于字串)執(zhí)行指令CLD指令后,DF=0,地址指針增1或2執(zhí)行指令STD指令后,DF=1,地址指針減1或2串操作(7)REP1)REP;與MOVS、STOS、LODS配合使用。(REPMOVSB/REPSTOSW)指令操作:①如(CX)=0,退出串操作,CX≠0,做下一步②CX←CX-1③執(zhí)行后跟的串操作指令回到第一步重復(fù)次數(shù)由CX控制1.串傳送MOVS(movestring)把字節(jié)或字操作數(shù)從主存的源地址傳送至目的地址MOVSB

;字節(jié)串傳送:ES:[DI]←DS:[SI] ;SI←SI±1,DI←DI±1MOVSW

;字串傳送:ES:[DI]←DS:[SI] ;SI←SI±2,DI←DI±2串傳送MOVSB

(正向DF=0)串傳送MOVSW(反向DF=1)data1segmentstring1db'thisisadog.$'data1endsdata2segmentstring2db15dup(?)data2endscodesegmentassumecs:code,ds:data1,es:data2start:

movax,data1

mov

ds,ax

movax,data2

mov

es,axleasi,string1leadi,string2

movcx,15

cldrepmovsbcodeendsendstart例:把數(shù)據(jù)段中的thisisadog.$傳送到附加段中。2.串存儲STOS(storestring)把AL或AX數(shù)據(jù)傳送至目的地址STOSB

;字節(jié)串存儲:ES:[DI]←AL ;DI←DI±1STOSW

;字串存儲:ES:[DI]←AX ;DI←DI±2例:把附加段中5個字節(jié)緩沖區(qū)置為20H。datasegmentxdb5dup(?)dataendscodesegmentassumecs:code,es:datastart:

mov

ax,data

mov

es,axleadi,x

moval,20H

movcx,5;cx←傳送次數(shù)

cld;DF=0,地址增加repstosbcodeendsendstartREPZ/REPE,REPNZ/REPNE兩條都與CMPS、SCAS配合使用(REPZ/REPNZCMPSB)CX≠0且ZF=1CX←CX-1執(zhí)行串操作YNREPZ/REPECX=0或ZF=0退出串操作CX≠0且ZF=0CX←CX-1執(zhí)行串操作YNREPNZ/REPNECX=0或ZF=1退出串操作4.串比較CMPS(comparestring)將主存中的源操作數(shù)減去至目的操作數(shù),以便設(shè)置標(biāo)志(ZF),進而比較兩操作數(shù)之間的關(guān)系CMPSB

;字節(jié)串比較:DS:[SI]-ES:[DI] ;SI←SI±1,DI←DI±1CMPSW

;字串比較:DS:[SI]-ES:[DI] ;SI←SI±2,DI←DI±2注釋:1)REPZ指令中的“Z”表示的是“ZF=1”,而且“ZF=1”是重復(fù)串操作的必要條件;REPNZ中的“NZ”表示的是“ZF=0”,而且“ZF=0”是重復(fù)串操作的必要條件。2)REP指令使串操作重復(fù)CX規(guī)定的次數(shù),REPZ、REPNZ使串操作的重復(fù)可能提前結(jié)束(觀察ZF)。例:比較兩個字符串str1,str2是否相等,數(shù)據(jù)串長度為count,比較結(jié)果存入result單元,0表示相等,-1(ffh)表示不等。Leasi,str1Leadi,str2mov

cx,countcldrepz

cmpsb

jnz

unmat

moval,0

jmpoutputunmat:moval,0ffhoutput:mov

result,alZF=0,兩串不同重復(fù)運行串比較指令的幾種情況1)CX=0,ZF=1:全比完,相同2)CX=0,ZF=0:全比完,末數(shù)據(jù)不同3)CX≠0,ZF=0:未比完,遇到不同4)CX≠0,ZF=1:未比完,繼續(xù)比較data1segmentstr1db'terrorist'data1endsdata2segmentstr2db'terrorist'data2endscodesegmentassumecs:code,ds:data1,es:data2start:

movax,data1

mov

ds,ax

movax,data2

mov

es,axleasi,str1leadi,str2

mov

bl,[si]

mov

bh,es:[di]incsiincdi

movcx,8

cld

cmp

bl,bh

repe

cmpsb例:比較兩個字符串str1,str2是否相等,字符串長度為9,0表示相等,1表示不等。ZF=0,兩串不同重復(fù)運行串比較指令的幾種情況1)CX=0,ZF=1:全比完,相同2)CX=0,ZF=0:全比完,末數(shù)據(jù)不同3)CX≠0,ZF=0:未比完,遇到不同4)CX≠0,ZF=1:未比完,繼續(xù)比較jnzno

moval,0;equipment

jmpexitno:

moval,1

exit:hltcodeendsendstart5.串掃描SCAS(scanstring)將AL/AX減去至目的操作數(shù),以便設(shè)置標(biāo)志(ZF),進而比較AL/AX與操作數(shù)之間的關(guān)系SCASB

;字節(jié)串掃描:(AL)-ES:[DI] ;DI←DI±1SCASW

;字串掃描:(AX)-ES:[DI] ;DI←DI±2例:課本P83。例:從字符串str(字符串長度為9)中查找字符f,0表示找到,1表示沒有找到。datasegment

strdb'terrorist'dataendscodesegmentassumecs:code,es:datastart:

mov

ax,data

mov

es,ax

mov

al,'f'leadi,str

mov

bl,es:[di]incdi

movcx,8

cld

cmp

al,bl

repne

scasb

jzequip

moval,1;nofind

jmpexitequip:

moval,0;find

exit:hltcodeendsendstart注釋 使用帶重復(fù)前綴的串比較和串搜索指令指令時,REPZ和REPNZ的選擇:對字符串比較,比較兩個字符串是否相等,用REPZ(如相等,則繼續(xù)比較;如遇到不等的數(shù)據(jù)則退出);如要求找出兩串相等的位置,應(yīng)使用REPNZ(兩數(shù)據(jù)不等,繼續(xù)比較);對串搜索來說,一般使用REPNZ(當(dāng)前數(shù)據(jù)不是要找的,繼續(xù)搜索),但有時也可能用到REPZ,如已知一個數(shù)據(jù)塊應(yīng)該都是0FFH,要查找其中是否有非FF,關(guān)鍵字(只能)用FF,重復(fù)前綴應(yīng)使用REPZ。

重復(fù)前綴指令(repeat)串操作指令執(zhí)行一次,僅對數(shù)據(jù)串中的一個字節(jié)或字量進行操作。但是串操作指令前,都可以加一個重復(fù)前綴,實現(xiàn)串操作的重復(fù)執(zhí)行。重復(fù)次數(shù)隱含在CX寄存器中重復(fù)前綴分2類,3條指令:配合不影響標(biāo)志的MOVS、STOS(和LODS)指令的REP前綴配合影響標(biāo)志的CMPS和SCAS指令的REPZ和REPNZ前綴1、無條件轉(zhuǎn)移指令(1).段內(nèi)轉(zhuǎn)移·直接尋址

JMPSHORTLABEL;IP←IP+8位偏移量

JMPNEARPTRLABEL;IP←IP+16位偏移量注釋:①指令中“LABEL”稱為“標(biāo)號”,是某一條指令的名字,其物理意義為指令在內(nèi)存中的偏移地址。②段內(nèi):不改變段寄存器(在當(dāng)前代碼段內(nèi)),只改變指令指針寄存器;直接尋址:匯編指令中直接給出了轉(zhuǎn)移目標(biāo)的地址,但從指令的操作來說,應(yīng)屬相對尋址。③短轉(zhuǎn)移的轉(zhuǎn)移范圍:相對于JMP的下一條指令,轉(zhuǎn)移范圍為-128~+127;近轉(zhuǎn)移:相對于JMP的下一條指令,轉(zhuǎn)移范圍為-32768~+32767。五、控制轉(zhuǎn)移指令(2).段內(nèi)轉(zhuǎn)移·間接尋址

JMPr16/m16;IP←r16或IP←m16

指令舉例

JMPSHORTL_PRO1;短轉(zhuǎn)移,目標(biāo)指令為L_PRO1JMPNEARPTR L_PRO2;JMPSI;IP←SI,通過寄存器間接給出指令偏移地址。

JMPBX;IP←BXJMPWORD PTR[BX];通過存儲器間接給出指令的偏移地址,而存儲器尋址方式為寄存器BX間接尋址。

JMPWORDPTR[BP+DI+20H];(3).段間轉(zhuǎn)移·直接尋址

JMP(FARPTR)LABEL;IP←LABEL的偏移地址,CS←LABEL的段地址注釋:“LABEL”是位于另一個代碼段的某一條指令的名字;另外,指令中的“FARPTR”可以省略,因為匯編程序可以自動識別:“LABEL”與相應(yīng)的“JMP”指令是否在同一代碼段內(nèi),從而產(chǎn)生段內(nèi)或段間轉(zhuǎn)移指令的機器代碼?!? CODE2SEGMENTCODE1SEGMENT … … PRO1:MOV…JMPFARPTRPRO1 … …CODE1ENDSCODE2ENDS……操作碼50020020………………CODE1段CODE2段PRO1新(IP)=0250新(CS)=200020000H20250H(4).段間轉(zhuǎn)移·間接尋址JMPDWORDPTRmem;IP←(EA),CS←(EA+2)注釋:通過存儲器的一個雙字單元提供轉(zhuǎn)移目標(biāo)的段地址和偏移地址,低位字為偏移地址,高位字為段地址。

JMPDWORDPTR[BX+DI]DS=4000H,BX=1230H,SI=02H計算物理地址:40000H+1230H+2=41232HCSIPx≤0?按6x-3計算函數(shù)值NY按3x計算函數(shù)值例、編寫一程序計算下列分段函數(shù):y=3x(x≤0)6x-3(x>0)2、條件轉(zhuǎn)移指令條件轉(zhuǎn)移指令概述①條件轉(zhuǎn)移指令的通用格式為:JccOPR

如條件滿足,則發(fā)生轉(zhuǎn)移:IP←IP+8位偏移量如條件不滿足,則不轉(zhuǎn)移,順序執(zhí)行下條指令。②所有的條件轉(zhuǎn)移指令均為兩字節(jié)機器指令,第2字節(jié)為8位偏移量,因而轉(zhuǎn)移范圍與“JMPSHORT”指令相同。③指令中的條件即為狀態(tài)標(biāo)志的狀態(tài)或狀態(tài)的組合。指令功能測試條件JZ(或JE)OPR=或結(jié)果為零則轉(zhuǎn)移ZF=1JNZ(或JNE)OPR≠或結(jié)果不為零則轉(zhuǎn)移ZF=0JSOPR結(jié)果為負(fù)則轉(zhuǎn)移SF=1JNSOPR結(jié)果為正則轉(zhuǎn)移SF=0JOOPR溢出則轉(zhuǎn)移OF=1JNOOPR不溢出則轉(zhuǎn)移OF=0JP(或JPE)OPR奇偶位為1則轉(zhuǎn)移PF=1JNP(或JPO)OPR奇偶位為0則轉(zhuǎn)移PF=0無符號數(shù)比較,并根據(jù)比較結(jié)果轉(zhuǎn)移指令功能測試條件JB(或JNAE,或JC)OPR<或CF=1則轉(zhuǎn)移CF=1JNB(或JAE,或JNC)OPR≥或CF=0則轉(zhuǎn)移CF=0JBE(或JNA)OPR≤則轉(zhuǎn)移CF∨ZF=1JNBE(或JA)OPR>則轉(zhuǎn)移CF∨ZF=0帶符號數(shù)比較,并根據(jù)比較結(jié)果轉(zhuǎn)移指令功能測試條件JL(或JNGE)OPR<則轉(zhuǎn)移SFOF=1JNL(或JGE)OPR≥則轉(zhuǎn)移SFOF=0JLE(或JNG)OPR≤則轉(zhuǎn)移SFOF∨ZF=1JNLE(或JG)OPR>則轉(zhuǎn)移SFOF∨ZF=0例:比較無符號數(shù)大小,將較大的數(shù)存放AX寄存器。CMP AX,BX;(AX)-(BX)JNB NEXT ;若AX>=BX,轉(zhuǎn)移到NEXTXCHG AX,BX;若AX<BX,交換NEXT:…例:比較有符號數(shù)大小,將較大的數(shù)存放在AX寄存器。CMP AX,BX ;(AX)-(BX)JNL NEXT ;若AX>=BX,轉(zhuǎn)移到NEXTXCHG AX,BX ;若AX<BX,交換NEXT:…x≤0?按6x-3計算函數(shù)值NY按3x計算函數(shù)值例、編寫一程序計算下列分段函數(shù):y=3x(x≤0)6x-3(x>0)datasegmentxdb10ydw?dataendscodesegmentassumecs:code,ds:datastart:

mov

ax,data

mov

ds,ax

mov

al,x

cmpal,0

jnley1

movbl,3

imul

bl

jmpy2y1:movbl,6

imul

blsubax,3y2:movy,axcodeendsendstart4.CX為零轉(zhuǎn)移指令JCXZ語句格式:JCXZ短標(biāo)號測試CX的值為0則轉(zhuǎn)移指令功能測試條件JCXZOPRCX寄存器的內(nèi)容為零則轉(zhuǎn)移(CX)=0例、編寫一程序計算1+2+3+4+5(帶符號數(shù)),并把結(jié)果存入Z單元中。datasegmentzdw?dataendscodesegmentassumecs:code,ds:datastart:

mov

ax,data

mov

ds,ax

movbx,1

movax,0

movcx,5loop1:addax,bxincbx

dec

cx

jcxzexit

jmploop1exit:

mov

z,axcodeendsendstart六、循環(huán)指令1.循環(huán)指令LOOP2.相等/為零循環(huán)指令LOOPZ3.不相等/不為零循環(huán)指令LOOPNZ4.CX為零轉(zhuǎn)移指令JCXZ1.循環(huán)指令LOOP語句格式:LOOP短標(biāo)號測試條件:(CX)≠0指令操作:(1)、(CX)=(CX)-1;(2)、檢查測試條件是否滿足測試條件,如果滿足則程序轉(zhuǎn)移到標(biāo)號處執(zhí)行;否則,順序執(zhí)行。說明:使用LOOP指令可代替兩條指令:DECCXJNE短標(biāo)號L

溫馨提示

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

評論

0/150

提交評論