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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第3章80x86的指令系統(tǒng)和尋址方式§3.1 80x86的尋址方式§3.3 80x86的指令系統(tǒng)§3.4 80x86的機器語言指令概況基本概念—指令系統(tǒng) 每一種計算機都有一組指令集供用戶使用,這組指令集稱為該計算機的指令系統(tǒng)。指令集中的每條指令在匯編語言中都是用助記符來表示的。基本概念—指令的構成指令由操作碼和操作數(shù)兩部分組成操作碼說明計算機要執(zhí)行哪種操作,如傳送、運算、移位、跳轉等操作,它是指令中不可缺少的組成部分操作數(shù)是指令執(zhí)行的參與者,即各種操作的對象有些指令不需要操作數(shù),通常的指令都有一個或兩個操作數(shù),也有個別指令有3個甚至4個操作數(shù)操作碼操作數(shù)基本概念—8086指令的基本格式操作碼 [目的操作數(shù)][,源操作數(shù)]][;注釋]DESTSRC[]內的內容可缺省書寫注意事項:操作碼與操作數(shù)至少有一個空格或制表符分隔操作數(shù)之間必須用“,”相分隔,DEST在前,SRC在后每種指令的操作碼:用一個唯一的助記符表示(指令功能的英文縮寫)對應著機器指令的一個二進制編碼操作數(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ù)有關的尋址方式二、與轉移地址有關的尋址方式立即(數(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的內部寄存器來存放要處理的操作數(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ù)的尋址當操作數(shù)存放在內存中時,尋找操作數(shù)歸結為如何確定存儲單元的地址邏輯地址 段基值:偏移量由段寄存器的內容給出主要確定該部分的內容(EA)物理地址=(段寄存器)×16+EA位移量:指令中給出16位數(shù)(常數(shù)、符號)EA 基地址:由基址寄存器BX或基址指針BP給出 變址:由變址寄存器(SI或DI)給出在實際尋址過程中,可能包含不同部分,EA為它們的相加之和,可在64KB范圍內尋址。構成EA的3個分量的不同組合,形成了不同的尋址方式。3.直接尋址:有效地址在指令中直接給出 操作數(shù)的16位偏移量直接包含在指令中,與操作碼一起放在代碼段中用符號表示的位移量MOVBX,VAR ←

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

5030AHAL50(AX)=3050

H3200030例如:

MOVAX,DATA

MOVAX,[DATA]

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

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

例如:

MOVAX,ES:NUMBER

MOVAX,ES:[NUMBER]

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

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

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

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.寄存器相對尋址方式直接變址尋址,基址尋址,變址尋址有效地址是寄存器內容與有符號8位或16位位移量之和,寄存器可以是BX、BP或SI、DI

EA=BX/BP或SI/DI+0/8/16位位移量段地址對應BX/SI/DI寄存器默認是DS,對應BP寄存器默認是SS;可用段超越前綴改變該方式不僅可以修改指針,還可以修改位移量,對數(shù)組操作十分方便基址尋址變址尋址基址尋址:偏移地址是指令中給定的偏移量和寄存器BX或基數(shù)指針BP的內容之和;BX作為基址寄存器時且無段超越時,物理地址由DS和偏移地址形成;BP作為基址寄存器時且無段超越時,物理地址由SS和偏移地址形成。例如:MOVBX,DELTA[BP]變址尋址:操作數(shù)的偏移地址為指令中給定的8位或16位偏移量和變址寄存器SI或DI內容之和;操作數(shù)的物理地址由DS和偏移地址形成。若指明是段超越的,則以指令中指定的段寄存器為基準。例如: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ù)組內某元素距數(shù)組起始單元的偏移通過修改SI可遍歷整個數(shù)組6.基址變址尋址方式:

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

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

有效地址由基址寄存器(BX或BP)的內容加上變址寄存器(SI或DI)的內容構成:段地址對應BX基址寄存器默認是DS,對應BP基址寄存器默認是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](或寫為MOVAX,[BX+DI])

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

則EA=0158H+10A5H=11FDH

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

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

7.相對基址變址尋址方式:有效地址是基址寄存器(BX/BP)、變址寄存器(SI/DI)與一個8位或16位位移量之和:EA=BX/BP+SI/DI+8/16位位移量該方式中,BX/BP選一,SI/DI選一段地址對應BX基址寄存器默認是DS,對應BP基址寄存器默認是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ù)組的腳標MOVAL,ARRAY[BX][SI]DS數(shù)據(jù)段ARRAYSIBX二維數(shù)組起始單元⊕

EA[]之間表示相加的關系 [BX][SI]←

→[BX+SI]二、與轉移地址有關的尋址方式程序代碼亦存放在存儲器中,如何控制程序的走向(轉移位置的地址CS:IP)是本部分所涉及的內容,由于它們與具體的指令相關,他們的介紹放在指令中講解。§3.3 80x86的指令系統(tǒng)指令分類功能格式數(shù)據(jù)傳送指令算術運算指令邏輯指令串操作指令程序轉移指令處理器控制指令雙操作數(shù)指令(DEST,SRC)單操作數(shù)指令(DEST)無操作數(shù)指令(隱含,按約定尋找操作數(shù))一、數(shù)據(jù)傳送指令數(shù)據(jù)傳送是計算機中最基本、最重要的一種操作傳送指令也是最常使用的一類指令傳送指令把數(shù)據(jù)從一個位置傳送到另一個位置除標志寄存器傳送指令外,均不影響標志位重點掌握MOVXCHGXLATPUSHPOPLEA1.通用數(shù)據(jù)傳送指令提供方便靈活的通用傳送操作有3條指令MOVXCHGXLAT1) 傳送指令MOV(move)格式:MOVDEST,SRC功能:將源操作數(shù)的內容傳送至目的操作數(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

—使用該指令應注意的問題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í)行后,相關寄存器和存儲器的內容是什么?分析:源操作數(shù)的物理地址= (SS)×16+(BP)+(SI)= 2F000H+0200H+0046H=2F246H指令的功能:(BX)←

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

XLAT指令功能:AL←DS:[BX+AL],將BX指定的緩沖區(qū)中、AL指定的位移處的一個字節(jié)數(shù)據(jù)取出賦給AL換碼指令執(zhí)行前:在主存建立一個字節(jié)量表格,內含要轉換成的目的代碼表格首地址存放于BX,AL存放相對表格首地址的位移量換碼指令執(zhí)行后:將AL寄存器的內容轉換為目標代碼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.堆棧操作指令—應用舉例pushax ;進入子程序后pushbxpushds...popds

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

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

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

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

指定的字送至16位寄存器DEST,并將SRC的下一字送DS寄存器格式:LESDEST,SRC功能:(DEST)←(SRC)段內偏移量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結果: (DS)=4000H(DI)=05AEH(AX)=9634H例、設執(zhí)行前(DS)=2000H,(DI)=1050H,COUNT=100H,執(zhí)行LDSSI,COUNT[DI]

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

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

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

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

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

進位標志

奇偶標志

輔助進位標志

零標志

符號標志

溢出標志

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

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

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

SF:結果最高位為1,則SF=1,否則SF=0。

ZF:結果為零,則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及各標志位的情況?1111001011010010010001001+CF=1,AF=0,PF=0,ZF=0,SF=1,OF=0若認為是無符號數(shù),則為229+164=393=256+137若認為是有符號數(shù),則為(-27)+(-92)=-119例:ADDAX,2520H

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

后,AL及個標志位的情況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受影響標志: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例:設在內存BUFFER1,BUFFER2開始的兩個存區(qū)中分別存有兩個四字節(jié)數(shù)(如下圖),現(xiàn)求這兩個數(shù)之和,并

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

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

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

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

WX+Y+24-Z

MOVAX,XMOVDX,X+2ADDAX,YADCDX,Y+2ADDAX,24ADCDX,0SUBAX,ZSBBDX,Z+2MOVW,AXMOVW+2,DX4.求補指令(求負數(shù))格式: NEGDEST功能: (DEST)←0-(DEST)受影響標志:CF,PF,AF,ZF,SF,OF說明:DEST可以是字節(jié)或字R、M操作對象是有符號的數(shù)當操作數(shù)取最小值(-128或-32768)時,執(zhí)行該指令后,操作數(shù)無變化,OF=1當操作數(shù)為0時,結果為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)受影響標志:CF,PF,AF,ZF,SF,OF說明:DEST,SRC可以是字節(jié)或字R、M,長度必須一致SRC還可以是immDEST和SRC不能同時為M該指令主要用于比較兩數(shù)的關系5.比較指令CMP—應用ZF=1 ;兩數(shù)相等兩個無符號數(shù)比較

CMPAX,BX ;

0 AX≥

BX1 AX<BX

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

指令執(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位的結果,存入AX字相乘:AX與r16/m16相乘,得到32位的結果,其高字存入DX,低字存入AX乘法指令利用OF和CF判斷乘積的高一半是否具有有效數(shù)值6.乘法指令—對標志的影響

乘法指令如下影響OF和CF標志:MUL指令——若乘積的高一半(AH或DX)為0,則OF=CF=0;否則OF=CF=1IMUL指令——若乘積的高一半是低一半的符號擴展,則OF=CF=0;否則均為1例:設在字變量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除法指令對標志沒有影響除法指令會產(chǎn)生結果溢出6.除法指令—除法錯中斷當被除數(shù)遠大于除數(shù)時,所得的商就有可能超出它所能表達的范圍。如果存放商的寄存器AL/AX不能表達,便產(chǎn)生溢出,8086CPU中就產(chǎn)生編號為0的內部中斷——除法錯中斷對DIV指令,除數(shù)為0,或者在字節(jié)除時商超過8位,或者在字除時商超過16位,則發(fā)生除法溢出對IDIV指令,除數(shù)為0,或者在字節(jié)除時商不在-128~127范圍內,或者在字除時商不在-32768~32767范圍內,則發(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(負數(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ù)除法應該采用直接使高8位或高16位清0的方法,獲得倍長的被除數(shù)例:設在字變量B1,B2中分別存有兩個16位帶符號二進制數(shù),計算B1/B2,并將其商和余數(shù)分別以RESULT為偏移地址的連續(xù)存區(qū)中。下面是完成此過程的程序段:

MOVAX,B1

CWD

IDIVB2

MOVRESULT,AX

MOVRESULT+2,DX

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

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

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

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

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

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

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

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

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

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

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

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

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

;十進制調整: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ù)的操作;這是一類常用的指令,都應該特別掌握邏輯運算指令測試指令移位指令1.邏輯運算指令格式:

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

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

(DEST)

受影響標志:CF=0,OF=0,

PF,ZF,SF,NOT對標志無影響1.邏輯運算指令—應用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 ;標志不變1.邏輯運算指令—應用AND指令可用于復位某些位(同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ù)進行邏輯“與”運算,結果只反映在標志位上,對操作數(shù)無影響受影響標志:CF=0,OF=0

,

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

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

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

CF受影響標志: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尋址,默認在數(shù)據(jù)段DS中,但允許段超越:DS:[SI]目的操作數(shù)用寄存器DI尋址,默認在附加段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í)行后跟的串操作指令回到第一步重復次數(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ù),以便設置標志(ZF),進而比較兩操作數(shù)之間的關系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”是重復串操作的必要條件;REPNZ中的“NZ”表示的是“ZF=0”,而且“ZF=0”是重復串操作的必要條件。2)REP指令使串操作重復CX規(guī)定的次數(shù),REPZ、REPNZ使串操作的重復可能提前結束(觀察ZF)。例:比較兩個字符串str1,str2是否相等,數(shù)據(jù)串長度為count,比較結果存入result單元,0表示相等,-1(ffh)表示不等。Leasi,str1Leadi,str2mov

cx,countcldrepz

cmpsb

jnz

unmat

moval,0

jmpoutputunmat:moval,0ffhoutput:mov

result,alZF=0,兩串不同重復運行串比較指令的幾種情況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,兩串不同重復運行串比較指令的幾種情況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ù),以便設置標志(ZF),進而比較AL/AX與操作數(shù)之間的關系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注釋 使用帶重復前綴的串比較和串搜索指令指令時,REPZ和REPNZ的選擇:對字符串比較,比較兩個字符串是否相等,用REPZ(如相等,則繼續(xù)比較;如遇到不等的數(shù)據(jù)則退出);如要求找出兩串相等的位置,應使用REPNZ(兩數(shù)據(jù)不等,繼續(xù)比較);對串搜索來說,一般使用REPNZ(當前數(shù)據(jù)不是要找的,繼續(xù)搜索),但有時也可能用到REPZ,如已知一個數(shù)據(jù)塊應該都是0FFH,要查找其中是否有非FF,關鍵字(只能)用FF,重復前綴應使用REPZ。

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

JMPSHORTLABEL;IP←IP+8位偏移量

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

JMPr16/m16;IP←r16或IP←m16

指令舉例

JMPSHORTL_PRO1;短轉移,目標指令為L_PRO1JMPNEARPTR L_PRO2;JMPSI;IP←SI,通過寄存器間接給出指令偏移地址。

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

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

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

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、條件轉移指令條件轉移指令概述①條件轉移指令的通用格式為:JccOPR

如條件滿足,則發(fā)生轉移:IP←IP+8位偏移量如條件不滿足,則不轉移,順序執(zhí)行下條指令。②所有的條件轉移指令均為兩字節(jié)機器指令,第2字節(jié)為8位偏移量,因而轉移范圍與“JMPSHORT”指令相同。③指令中的條件即為狀態(tài)標志的狀態(tài)或狀態(tài)的組合。指令功能測試條件JZ(或JE)OPR=或結果為零則轉移ZF=1JNZ(或JNE)OPR≠或結果不為零則轉移ZF=0JSOPR結果為負則轉移SF=1JNSOPR結果為正則轉移SF=0JOOPR溢出則轉移OF=1JNOOPR不溢出則轉移OF=0JP(或JPE)OPR奇偶位為1則轉移PF=1JNP(或JPO)OPR奇偶位為0則轉移PF=0無符號數(shù)比較,并根據(jù)比較結果轉移指令功能測試條件JB(或JNAE,或JC)OPR<或CF=1則轉移CF=1JNB(或JAE,或JNC)OPR≥或CF=0則轉移CF=0JBE(或JNA)OPR≤則轉移CF∨ZF=1JNBE(或JA)OPR>則轉移CF∨ZF=0帶符號數(shù)比較,并根據(jù)比較結果轉移指令功能測試條件JL(或JNGE)OPR<則轉移SFOF=1JNL(或JGE)OPR≥則轉移SFOF=0JLE(或JNG)OPR≤則轉移SFOF∨ZF=1JNLE(或JG)OPR>則轉移SFOF∨ZF=0例:比較無符號數(shù)大小,將較大的數(shù)存放AX寄存器。CMP AX,BX;(AX)-(BX)JNB NEXT ;若AX>=BX,轉移到NEXTXCHG AX,BX;若AX<BX,交換NEXT:…例:比較有符號數(shù)大小,將較大的數(shù)存放在AX寄存器。CMP AX,BX ;(AX)-(BX)JNL NEXT ;若AX>=BX,轉移到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為零轉移指令JCXZ語句格式:JCXZ短標號測試CX的值為0則轉移指令功能測試條件JCXZOPRCX寄存器的內容為零則轉移(CX)=0例、編寫一程序計算1+2+3+4+5(帶符號數(shù)),并把結果存入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為零轉移指令JCXZ1.循環(huán)指令LOOP語句格式:LOOP短標號測試條件:(CX)≠0指令操作:(1)、(CX)=(CX)-1;(2)、檢查測試條件是否滿足測試條件,如果滿足則程序轉移到標號處執(zhí)行;否則,順序執(zhí)行。說明:使用LOOP指令可代替兩條指令:DECCXJNE短標號L

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論