匯編語言課件:第3章 80x86的指令系統(tǒng)和尋址方式_第1頁
匯編語言課件:第3章 80x86的指令系統(tǒng)和尋址方式_第2頁
匯編語言課件:第3章 80x86的指令系統(tǒng)和尋址方式_第3頁
匯編語言課件:第3章 80x86的指令系統(tǒng)和尋址方式_第4頁
匯編語言課件:第3章 80x86的指令系統(tǒng)和尋址方式_第5頁
已閱讀5頁,還剩106頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、 指令系統(tǒng) 一組指令的集合第3章 80 x86的指令系統(tǒng)和尋址方式 操作碼 操作數(shù) . 操作數(shù)指令 尋址方式 與數(shù)據(jù)有關(guān)的尋址方式 與轉(zhuǎn)移地址有關(guān)的尋址方式1. 8086的尋址方式 與數(shù)據(jù)有關(guān)的尋址方式:以 MOV 指令為例 立即尋址 MOV AX , 3069H寄存器尋址 MOV AL , BH直接尋址 MOV AX , 2000H 寄存器間接尋址 MOV AX , BX 寄存器相對尋址 MOV AX , COUNT SI 基址變址尋址 MOV AX , BP DI 相對基址變址尋址 MOV AX , MASK BX SI 存儲器尋址(1) 立即尋址方式* 操作數(shù)在指令中給出 指令格式: M

2、OV AL, 5 MOV AX, 3064H MOV AL, A* 只能用于 SRC 字段 MOV 40H, AL * SRC 和 DST 的字長一致 MOV AH, 3064H (2) 寄存器尋址方式* 操作數(shù)在指定的寄存器中 MOV AX, BX MOV AL, BH MOV AX, 3064H* 字節(jié)寄存器只有 AH AL BH BL CH CL DH DL* SRC 和 DST 的字長一致 MOV AH, BX * CS 不能用 MOV 指令改變 MOV CS, AX (3) 直接尋址方式* 有效地址EA由指令直接給出 例:MOV AX, 2000H EA=2000H, 假設(shè)(DS)=

3、3000H, 那么PA=32000H* 隱含的段為數(shù)據(jù)段 DS* 可使用段跨越前綴 MOV AX, ES: 2000H* 操作數(shù)地址可由變量(符號地址)表示, 但要注意VALUE DB 10 變量的屬性MOV AH, VALUE MOV AX, VALUE MOV AX, WORD PTR VALUE 5030 32000AH AL3050(AX) = 3050H寄存器間接尋址* EA 在基址寄存器(BX/BP) 或變址寄存器(SI/DI) 中 MOV AX, BX PA = 16d (DS) + (BX) MOV AX, ES:BX PA = 16d (ES) + (BX) MOV AX,

4、BP PA = 16d (SS) + (BP) * 不允許使用AX、CX、DX 存放 EA MOV AX, CX * SRC 和 DST 的字長一致 MOV DL, BX ; BX指示一個字節(jié)單元 MOV DX, BX ; BX指示一個字單元 * 適于數(shù)組、字符串、表格的處理 有效地址 =(BX)(BP) 8位(SI) 16位(DI)+位移量(5) 寄存器相對尋址方式* 指令格式: MOV AX, COUNTSI 或 MOV AX, COUNT+SI 假設(shè) (DS)=3000H, (SI)=2000H, COUNT=3000H, 則: PA = 35000H 假設(shè)(35000H)=1234H,

5、 那么 (AX)=1234H* 適于數(shù)組、字符串、表格的處理(6) 基址變址尋址方式*指令格式: MOV AX, BX DI MOV AX, BX+DI MOV AX, ES:BX SI* 適于數(shù)組、字符串、表格的處理* 必須是一個基址寄存器和一個變址寄存器的組合 MOV AX, BX BP MOV AX, SI DI 有效地址 =(BX) (SI)(BP) (DI)+( 7 ) 相對基址變址尋址方式 MOV AX, MASK BX SI 或 MOV AX, MASK BX+SI 或 MOV AX, MASK+BX+SI 有效地址 =(BX) (SI) 8位(BP) (DI) 16位+位移量訪

6、問存儲器的方式 默認(rèn)的段寄存器可跨越的段寄存器偏移地址取指令 CS 無 IP堆棧操作 SS 無 SP一般數(shù)據(jù)訪問 DS CS ES SS 有效地址EABP作為基址的尋址 SS CS DS ES BP串操作的源操作數(shù) DS CS ES SS SI串操作的目的操作數(shù) ES 無 DI段 寄 存 器 的 使 用 規(guī) 定例:編寫一段顯示字符串STRING的程序 DATA SEGMENT STRING DB HAPPY NEW YEAR! , 0DH , 0AH , $ COUNT DW 17 DATA ENDS ( 1 ) 直接尋址 mov dl, string mov ah, 2 int 21h ;

7、顯示字符H mov dl, string+1 mov ah, 2 int 21h ; 顯示字符A : :( 2 ) 寄存器間接尋址 mov cx, count ; mov cx, 17 mov bx, offset string ; string的偏址 bxNext : mov dl, bx mov ah, 2 int 21h ; 顯示一個字符 inc bx loop next ; 循環(huán)指令( 3 ) 寄存器相對尋址 mov cx, count ; mov cx, 17 mov si, 0 Next : mov dl, stringsi ; mov dl, string+si mov ah,

8、2 int 21h ; 顯示一個字符 inc si loop next ; 循環(huán)指令( 4 ) 基址變址尋址 mov cx, count ; mov cx, 17 mov bx, offset string ; string的偏址 bx mov si, 0Next : mov dl, bx si ; mov dl, bx+si mov ah, 2 int 21h ; 顯示一個字符 inc si loop next ; 循環(huán)指令( 5 ) DOS 顯示字符串功能 mov dx, offset string ; string的偏址 dx ; lea dx, string mov ah, 9 int

9、 21h ; 顯示一串字符80 x86 新增的尋址方式 EA= (基址寄存器) + (變址寄存器) 比例因子 + 位移量( 1 ) 比例變址尋址方式 例:MOV EAX, COUNT ESI 4 (2) 基址比例變址尋址方式 例:MOV ECX, EAX EDI 4 (3) 相對基址比例變址尋址方式 例:MOV EAX, TABLE EBP EDI 4 16位和32位尋址的差異地址成分 16位尋址 32位尋址基址寄存器 BX、BP 任何32位通用寄存器變址寄存器 SI、DI 除ESP外的任何32位通用寄存器比例因子 1 1、2、4、8 與轉(zhuǎn)移地址有關(guān)的尋址方式: 段內(nèi)尋址 段內(nèi)直接尋址 JMP

10、 NEAR PTR NEXT 段內(nèi)間接尋址 JMP TABLE BX 段間尋址 段間直接尋址 JMP FAR PTR NEXT 段間間接尋址 JMP DWORD PTR BX 用來確定轉(zhuǎn)移指令及轉(zhuǎn)子指令的轉(zhuǎn)向地址。(1) 段內(nèi)直接尋址轉(zhuǎn)向的有效地址 = 當(dāng)前(IP) + 位移量(8bit/16bit) 例: JMP NEAR PTR NEXT 近轉(zhuǎn)移 -32768 +32767 JMP SHORT NEXT 短轉(zhuǎn)移 -128 +127 (2) 段內(nèi)間接尋址 轉(zhuǎn)向的有效地址是一個寄存器或存儲單元的內(nèi)容。 (可用除立即數(shù)以外的任何一種數(shù)據(jù)尋址方式得到) 例: TABLE = 20A2H (BX)

11、= 1256H (SI) = 528EH (DS) = 2000H (232F8H) = 3280H (264E4H) = 2450H JMP BX ; (IP)=1256H JMP TABLEBX JMP WORD PTR TABLEBX ; (IP)=3280H JMP BXSI JMP WORD PTR BXSI ; (IP)=2450Hcode1 segment jmp far ptr next code1 endscode2 segment next: . code2 ends(3) 段間直接尋址 用指令中提供的轉(zhuǎn)向段地址和偏移地址取代CS 和 IP 例:(4) 段間間接尋址 用存儲

12、器中的兩個相繼字的內(nèi)容取代CS 和 IP (存儲單元的地址可用存儲器尋址方式得到) 例: JMP DWORD PTR INTERS+BX PA=(DS)24 + (BX) + INTERS (PA+1, PA)IP (PA+3, PA+2) CS第3章 練習(xí)Page 107 3.1 3.3 3.5 3.7 3.11 3.13 數(shù)據(jù)傳送指令 算術(shù)指令 邏輯指令 串處理指令 控制轉(zhuǎn)移指令 處理機(jī)控制與雜項操作指令2. 8086的指令系統(tǒng)重點(diǎn)關(guān)注:指令的匯編格式指令的基本功能指令支持的尋址方式指令的執(zhí)行對標(biāo)志位的影響指令的特殊要求數(shù)據(jù)傳送指令: 通用數(shù)據(jù)傳送指令 MOV、PUSH、POP、XCHG

13、累加器專用傳送指令 IN、OUT、XLAT 地址傳送指令 LEA、LDS、LES 標(biāo)志寄存器傳送指令 LAHF、SAHF、PUSHF、POPF 類型轉(zhuǎn)換指令 CBW、CWD 傳送指令: MOV DST, SRC執(zhí)行操作: (DST) (SRC)注意: * DST、SRC 不能同時為段寄存器 MOV DS, ES * 立即數(shù)不能直接送段寄存器 MOV DS, 2000H * DST 不能是立即數(shù)和CS* DST、SRC 不能同時為存儲器尋址* 不影響標(biāo)志位 通用數(shù)據(jù)傳送指令MOV AX, DSEGMOV DS, AX 進(jìn)棧指令: PUSH SRC 執(zhí)行操作: (SP) (SP) 2 ( (SP)

14、+1, (SP) ) (SRC) 出棧指令: POP DST 執(zhí)行操作: (DST) ( (SP)+1, (SP) ) (SP) (SP) + 2堆棧:先進(jìn)后出的存儲區(qū),段地址存放在SS中, SP在任何時候都指向棧頂,進(jìn)出棧后自動修改SP。 注意: * 堆棧操作必須以字為單位。 * 不影響標(biāo)志位 * 不能用立即尋址方式 PUSH 1234H * DST不能是CS POP CS 例:假設(shè) (AX) = 2107 H , 執(zhí)行 PUSH AX* * * * *(SP)PUSH AX 執(zhí)行前(SP)* * * * *07H21H低地址 高地址PUSH AX 執(zhí)行后進(jìn)棧方向(SP)* * * * *0

15、7H21HPOP BX 執(zhí)行前(SP)* * * * *07H21H低地址 高地址 POP BX 執(zhí)行后 (BX) = 2107H例: POP BX出棧方向例: PUSH DS SUB AX, AX PUSH AX RET例: PUSH AX PUSH BX PUSH CX ;其間用到AX、BX、CX POP CX ; 后進(jìn)先出 POP BX POP AX 交換指令: XCHG OPR1, OPR2 執(zhí)行操作: (OPR1) (OPR2)注意: * 不影響標(biāo)志位 * 不允許使用段寄存器 例:XCHG BX, BP+SI XCHG AL, BH 累加器專用傳送指令(只限使用AX或AL) 輸入指令

16、 IN (I/O CPU) 長格式: IN AL, PORT (字節(jié)) IN AX, PORT (字) 執(zhí)行操作:(AL) ( PORT ) (字節(jié)) (AX) ( PORT+1, PORT )(字) 短格式: IN AL, DX (字節(jié)) IN AX, DX (字) 執(zhí)行操作:(AL) ( (DX) ) (字節(jié)) (AX) ( (DX)+1, (DX) )(字) 輸出指令 OUT (CPU I/O)長格式: OUT PORT, AL (字節(jié)) OUT PORT, AX (字)執(zhí)行操作:( PORT ) (AL) (字節(jié)) ( PORT+1, PORT ) (AX)(字)短格式: OUT DX

17、, AL (字節(jié)) OUT DX, AX (字)執(zhí)行操作:( (DX) ) (AL) (字節(jié)) ( (DX)+1, (DX) ) (AX)(字)注意: * 不影響標(biāo)志位* 前256個端口號00HFFH可直接在指令中指定(長格式)* 如果端口號 256,端口號 DX(短格式)例: IN AX, 28H MOV DATA_WORD, AX例: MOV DX, 3FCH IN AX, DX例: OUT 5, AL例:測試某狀態(tài)寄存器(端口號27H)的第2位是否為1 IN AL, 27H TEST AL, 00000100B JNZ ERROR ;若第2位為1,轉(zhuǎn)ERROR處理例:Sound程序 mo

18、v dx, 100 in al, 61h and al,11111100bsound: xor al, 2 ; 1 0 1 out 61h, al ;ON OFF ON mov cx, 140h ;脈寬Wait1: loop wait1 dec dx jne sound設(shè)備控制寄存器端口61H1 / 0 0 控制其它外部設(shè)備與門放大器2號定時器門控1 0(BX) 30 H F004031 H F0041 (AL) = 3 32 H F0042 33 H F0043TABLE(DS)=F000H換碼指令:XLAT 或XLAT OPR執(zhí)行操作:(AL) ( (BX) + (AL) )例:MOV B

19、X, OFFSET TABLE ; (BX)=0040H MOV AL, 3 XLAT TABLE 指令執(zhí)行后 (AL)=33H注意: * 不影響標(biāo)志位* 字節(jié)表格(長度不超過256) 首地址 (BX)* 需轉(zhuǎn)換的代碼位移量 (AL) 地址傳送指令 有效地址送寄存器指令: LEA REG, SRC 執(zhí)行操作: (REG) SRC 指針?biāo)图拇嫫骱虳S指令: LDS REG, SRC 執(zhí)行操作: (REG) (SRC) (DS) (SRC+2) 相繼二字 寄存器、DS 指針?biāo)图拇嫫骱虴S指令: LES REG, SRC 執(zhí)行操作: (REG) (SRC) (ES) (SRC+2) 相繼二字 寄存器

20、、ES 例:LEA BX, BX+SI+0F62H LDS SI, 10H LES DI, BX40 H00 H00 H30 H TABLE(DS):1000HMOV BX, TABLE ; (BX)=0040HMOV BX, OFFSET TABLE ; (BX)=1000HLEA BX, TABLE ; (BX)=1000HLDS BX, TABLE ; (BX)=0040H ; (DS)=3000HLES BX, TABLE ; (BX)=0040H ; (ES)=3000H注意: * 不影響標(biāo)志位 * REG 不能是段寄存器 * SRC 必須為存儲器尋址方式 標(biāo)志寄存器傳送指令 標(biāo)志送

21、AH指令: LAHF 執(zhí)行操作: (AH) (FLAGS的低字節(jié)) AH送標(biāo)志寄存器指令: SAHF 執(zhí)行操作: (FLAGS的低字節(jié)) (AH) 標(biāo)志進(jìn)棧指令: PUSHF 執(zhí)行操作: (SP) (SP) - 2 ( (SP)+1, (SP) ) (FLAGS) 標(biāo)志出棧指令: POPF 執(zhí)行操作: (FLAGS) ( (SP)+1, (SP) ) (SP) (SP) + 2* 影響標(biāo)志位 類型轉(zhuǎn)換指令 CBW AL AX 執(zhí)行操作: 若(AL)的最高有效位為0,則(AH)= 00H 若(AL)的最高有效位為1,則(AH)= FFH CWD AX (DX,AX) 執(zhí)行操作:若(AX)的最高有

22、效位為0,則(DX)= 0000H 若(AX)的最高有效位為1,則(DX)= FFFFH 例:(AX) = 0BA45H CBW ; (AX)=0045H CWD ; (DX)=0FFFFH (AX)=0BA45H注意: * 無操作數(shù)指令 * 隱含對AL 或AX 進(jìn)行符號擴(kuò)展 * 不影響條件標(biāo)志位算術(shù)指令: 加法指令 ADD、ADC、INC 減法指令 SUB、SBB、DEC、NEG、CMP 乘法指令 MUL、IMUL 除法指令 DIV、IDIV 十進(jìn)制調(diào)整指令 DAA、DAS、 AAA、AAS、AAM、AAD 加法指令 加法指令: ADD DST, SRC 執(zhí)行操作: (DST) (SRC)

23、+ (DST) 帶進(jìn)位加法指令: ADC DST, SRC 執(zhí)行操作: (DST) (SRC) + (DST) + CF 加1指令: INC OPR 執(zhí)行操作: (OPR) (OPR) + 1注意: * 除INC指令不影響CF標(biāo)志外,均對條件標(biāo)志位有影響。加法指令對條件標(biāo)志位的影響CF 位表示 無符號數(shù) 相加的溢出。OF 位表示 帶符號數(shù) 相加的溢出。1 結(jié)果為負(fù)0 否則SF=1 結(jié)果為00 否則ZF=1 和的最高有效位 有 向高位的進(jìn)位0 否則CF=1 兩個操作數(shù)符號相同,而結(jié)果符號與之相反0 否則OF=舉例: n=8 bit 帶符號數(shù)(-128127) , 無符號數(shù)(0255) 0 0 0

24、 0 0 1 0 0 + 0 0 0 0 1 0 1 1 0 0 0 0 1 1 1 1帶:(+4)+(+11)=+15 OF=0無:4+11=15 CF=0帶符號數(shù)和無符號數(shù)都不溢出 0 0 0 0 1 0 0 1 + 0 1 1 1 1 1 0 0 1 0 0 0 0 1 0 1 帶: (+9)+(+124)=-123 OF=1 無: 9+124=133 CF=0帶符號數(shù)溢出無符號數(shù)溢出 0 0 0 0 0 1 1 1 + 1 1 1 1 1 0 1 1 1 0 0 0 0 0 0 1 0帶:(+7)+(-5)=+2 OF=0無:7+251=2 CF=1帶符號數(shù)和無符號數(shù)都溢出 1 0 0

25、 0 0 1 1 1 + 1 1 1 1 0 1 0 1 1 0 1 1 1 1 1 0 0帶:(-121)+(-11)=+124 OF=1無:135+245=124 CF=1例:雙精度數(shù)的加法 (DX) = 0002H (AX) = 0F365H (BX) = 0005H (CX) = 8100H 指令序列 ADD AX, CX ; (1) ADC DX, BX ; (2) (1) 執(zhí)行后,(AX) = 7465H CF=1 OF=1 SF=0 ZF=0 (2) 執(zhí)行后,(DX) = 0008H CF=0 OF=0 SF=0 ZF=0 減法指令減法指令: SUB DST, SRC 執(zhí)行操作:

26、 (DST) (DST) - (SRC)帶借位減法指令: SBB DST, SRC 執(zhí)行操作: (DST) (DST) - (SRC) - CF減1指令: DEC OPR 執(zhí)行操作: (OPR) (OPR) - 1求補(bǔ)指令: NEG OPR 執(zhí)行操作: (OPR) - (OPR)比較指令: CMP OPR1, OPR2 執(zhí)行操作: (OPR1) - (OPR2)注意: * 除DEC指令不影響 CF標(biāo)志外,均對條 件標(biāo)志位有影響。減法指令對條件標(biāo)志位(CF/OF/ZF/SF)的影響:CF 位表示 無符號數(shù) 減法的溢出。OF 位表示 帶符號數(shù) 減法的溢出。1 被減數(shù)的最高有效位 有 向高位的借位0

27、 否則CF=1 兩個操作數(shù)符號相反,而結(jié)果的符號與減數(shù)相同0 否則OF=1 減法轉(zhuǎn)換為加法運(yùn)算時 無 進(jìn)位0 否則CF=或NEG 指令對CF/OF的影響0 操作數(shù)為01 否則CF =1 操作數(shù)為 -128 (字節(jié)運(yùn)算)或 操作數(shù)為 -32768 (字運(yùn)算)0 否則OF = 0 0 0 1 1 1 1 0 + 0 0 0 1 1 1 1 1NEG 指令對CF/OF的影響0 操作數(shù)為01 否則CF =1 操作數(shù)為 -128 (字節(jié)運(yùn)算)或 操作數(shù)為 -32768 (字運(yùn)算)0 否則 OF = 0 0 0 0 1 1 1 1 + 0 0 0 1 1 0 0 0 0 1 0 0 0 0 1 1 1 +

28、 0 0 0 1 1 0 0 0例:x、y、z 均為雙精度數(shù),分別存放在地址為X, X+2; Y, Y+2;Z, Z+2的存儲單元中,用指令序列實現(xiàn) w x + y + 24 - z ,并用W, W+2單元存放wMOV AX, XMOV DX, X+2ADD AX, YADC DX, Y+2 ; x+yADD AX, 24ADC DX, 0 ; x+y+24SUB AX, ZSBB DX, Z+2 ; x+y+24-zMOV W, AXMOV W+2, DX ; 結(jié)果存入W, W+2單元 乘法指令 無符號數(shù)乘法指令: MUL SRC 帶符號數(shù)乘法指令: IMUL SRC 執(zhí)行操作: 字節(jié)操作數(shù)

29、 (AX) (AL) * (SRC) 字操作數(shù) (DX, AX) (AX) * (SRC)注意: * AL (AX) 為隱含的乘數(shù)寄存器。* AX (DX,AX) 為隱含的乘積寄存器。* SRC不能為立即數(shù)。* 除CF和OF外,對條件標(biāo)志位無定義。乘法指令對 CF/OF 的影響:例:(AX) = 16A5H,(BX) = 0611H (1) IMUL BL ; (AX) (AL) * (BL) ; A5*11 5B*11=060B F9F5 ; (AX) = 0F9F5H CF=OF=1 (2) MUL BX ; (DX, AX) (AX) * (BX) ; 16A5*0611=0089 5E

30、F5 ; (DX)=0089H (AX)=5EF5H CF=OF=100 乘積的高一半為零11 否則MUL指令: CF,OF =00 乘積的高一半是低一半的符號擴(kuò)展11 否則 IMUL指令: CF,OF =1010 01010101 1011 除法指令 無符號數(shù)除法指令: DIV SRC 帶符號數(shù)除法指令: IDIV SRC 執(zhí)行操作: 字節(jié)操作 (AL) (AX) / (SRC) 的商 (AH) (AX) / (SRC) 的余數(shù) 字操作 (AX) (DX, AX) / (SRC) 的商 (DX) (DX, AX) / (SRC) 的余數(shù)注意: * AX (DX,AX) 為隱含的被除數(shù)寄存器。

31、 * AL (AX) 為隱含的商寄存器。 * AH (DX) 為隱含的余數(shù)寄存器。 * SRC不能為立即數(shù)。 * 對所有條件標(biāo)志位均無定義。如何判別結(jié)果有效?例:x , y , z , v 均為16位帶符號數(shù),計算 ( v - ( x*y + z 540 ) ) / xMOV AX, X IMUL Y ; x*y (DX,AX)MOV CX, AXMOV BX, DXMOV AX, ZCWD ;Z (DX,AX)ADD CX, AXADC BX, DX ; x*y+z (BX,CX)SUB CX, 540 SBB BX, 0 ; x*y+z-540MOV AX, VCWD ;V (DX,AX)

32、SUB AX, CXSBB DX, BX ; v-(x*y+z-540)IDIV X ; (v-(x*y+z-540)/x(AX) 余數(shù)(DX) 十進(jìn)制調(diào)整指令BCD碼:用二進(jìn)制編碼的十進(jìn)制數(shù),又稱二-十進(jìn)制數(shù)壓縮的BCD碼:用 4 位二進(jìn)制數(shù)表示 1 位十進(jìn)制數(shù) 例:( 59 )10 ( 0101 1001 )BCD非壓縮的BCD碼:用 8 位二進(jìn)制數(shù)表示 1 位十進(jìn)制數(shù) 例:( 59 )10 ( 0000 0101 0000 1001 )BCD數(shù)字的 ASCII 碼是一種 非壓縮的 BCD 碼 DIGIT ASCII BCD030H0011 0000131H0011 0001232H001

33、1 0010 939H0011 1001例:寫出( 3590 )10的壓縮 BCD 碼和非壓縮BCD碼,并分 別 把它們存入數(shù)據(jù)區(qū) PAKED 和 UNPAK壓縮BCD:( 3590 )10( 0011 0101 1001 0000 )BCD非壓縮BCD: ( 3590 )10( 00000011 00000101 00001001 00000000 )BCD PAKED 90H 35H UNPAK 00H 09H 05H 03H問題的提出:十進(jìn)制調(diào)整指令19 壓縮BCD: 0001 1001 27 0010 0001 + 110 + 08 + 0000 1000 (0010 0111)BCD

34、 AF=1(1)壓縮的BCD碼調(diào)整指令 DAA 加法的十進(jìn)制調(diào)整指令 DAS 減法的十進(jìn)制調(diào)整指令 (2)非壓縮的BCD碼調(diào)整指令 AAA 加法的ASCII碼調(diào)整指令 AAS 減法的ASCII碼調(diào)整指令 AAM 乘法的ASCII碼調(diào)整指令 AAD 除法的ASCII碼調(diào)整指令壓縮BCD運(yùn)算舉例:(1) MOV AL, BCD1 ; BCD1=34H ADD AL, BCD2 ; BCD2=59H, (AL)=8DH DAA ; 8DH+06H=93H MOV BCD3, AL ; BCD3=93H(2) MOV AL, BCD1 ; BCD1=34H SUB AL, BCD2 ; BCD2=59

35、H , (AL)=0DBH DAS ; 0DBH60H06H=75H MOV BCD3, AL ; BCD3= 75 = - 25 (10n補(bǔ)碼)非壓縮BCD運(yùn)算舉例:(1) MUL BL ; (AX)=(AL)(BL)=08 09 AAM ; (AL)/0AH= 48H /0AH 0702(2)AAD ; (AX) (AH) 0AH+(AL)=48H DIV BL ; (AL) = (AX)/(BL)=48H/4=12H AAM ; (AL)/0AH=12H/0AH=0108第3章作業(yè)Page 109 3.14 3.17 邏輯指令: 邏輯運(yùn)算指令 AND、OR、NOT、XOR、TEST 移位

36、指令 SHL、SHR 、 SAL 、SAR、 ROL、ROR、RCL、RCR邏輯非指令:NOT OPR * OPR不能為立即數(shù)執(zhí)行操作: (OPR) (OPR) * 不影響標(biāo)志位 邏輯與指令:AND DST, SRC執(zhí)行操作: (DST) (DST) (SRC)邏輯或指令:OR DST, SRC執(zhí)行操作: (DST) (DST) (SRC)異或指令: XOR DST, SRC執(zhí)行操作: (DST) (DST) (SRC)測試指令: TEST OPR1, OPR2執(zhí)行操作: (OPR1) (OPR2)CF OF SF ZF PF AF 0 0 * * * 無定義 根據(jù)運(yùn)算結(jié)果設(shè)置 邏輯運(yùn)算指令例

37、:屏蔽AL的第0、1兩位 AND AL, 0FCH例:置AL的第5位為1 OR AL, 20H 例:使AL的第0、1位變反 XOR AL, 3例:測試某些位是0是1 TEST AL, 1 JZ EVEN * * * * * * * * OR 0 0 1 0 0 0 0 0 * * 1 * * * * * * * * * * * 0 1 XOR 0 0 0 0 0 0 1 1 * * * * * * 1 0 * * * * * * * * AND 1 1 1 1 1 1 0 0 * * * * * * 0 0 * * * * * * * * AND 0 0 0 0 0 0 0 1 0 0 0 0

38、 0 0 0 *邏輯左移 SHL OPR, CNT邏輯右移 SHR OPR, CNT算術(shù)左移 SAL OPR, CNT(同邏輯左移)算術(shù)右移 SAR OPR, CNT CF 0 0 CFCF 移位指令循環(huán)左移 ROL OPR, CNT循環(huán)右移 ROR OPR, CNT帶進(jìn)位循環(huán)左移 RCL OPR, CNT帶進(jìn)位循環(huán)右移 RCR OPR, CNTCF CFCFCF注意: * OPR可用除立即數(shù)以外的任何尋址方式 * CNT=1,SHL OPR, 1 CNT1,MOV CL, CNT SHL OPR, CL ; 以SHL為例* 條件標(biāo)志位: CF = 移入的數(shù)值 1 CNT=1時,最高有效位的值

39、發(fā)生變化 0 CNT=1時,最高有效位的值不變 移位指令: SF、ZF、PF 根據(jù)移位結(jié)果設(shè)置,AF無定義 循環(huán)移位指令: 不影響 SF、ZF、PF、AFOF =例:(AX)= 0012H,(BX)= 0034H,把它們裝配成(AX)= 1234H 例:(BX) = 84F0H (1) (BX) 為無符號數(shù),求 (BX) / 2 SHR BX, 1 ; (BX) = 4278H (2) (BX) 為帶符號數(shù),求 (BX) 2 SAL BX, 1 ; (BX) = 09E0H, OF=1 (3) (BX) 為帶符號數(shù),求 (BX) / 4 MOV CL, 2 SAR BX, CL ; (BX)

40、= 0E13CHMOV CL, 8ROL AX, CLADD AX, BXMOV CH, 4 ; 循環(huán)次數(shù)MOV CL, 4 ; 移位次數(shù)NEXT: ROL BX, CLMOV AX, BXAND AX, 0FHPUSH AXDEC CHJNZ NEXT00080004000F 0000 (SP)(3) (BX)=84F0H,把 (BX) 中的 16 位數(shù)每 4 位壓入堆棧串處理指令: 設(shè)置方向標(biāo)志指令 CLD、STD 串處理指令 串重復(fù)前綴 MOVSB / MOVSW REP STOSB / STOSW REPE / REPZ LODSB / LODSW REPNE / REPNZ CMPS

41、B / CMPSW SCASB / SCASW 與 REP 配合工作的 MOVS / STOS / LODS REP 執(zhí)行操作:(1) 如 (CX)=0 則退出 REP,否則轉(zhuǎn)(2)(2) (CX) (CX) -1(3) 執(zhí)行 MOVS / STOS / LODS(4) 重復(fù) (1) (3)MOVS 串傳送指令:MOVS DST, SRCMOVSB (字節(jié))MOVSW (字)例:MOVS ES: BYTE PTR DI, DS: SI 執(zhí)行操作: (1) (DI) (SI) (2) 字節(jié)操作:(SI)(SI)1, (DI)(DI)1 字操作: (SI)(SI)2, (DI)(DI)2 方向標(biāo)志

42、 DF=0 時用 + ,DF=1 時用 - 。 REP MOVS:將數(shù)據(jù)段中的整串?dāng)?shù)據(jù)傳送到附加段中。 源串(數(shù)據(jù)段) 目的串(附加段)執(zhí)行 REP MOVS 之前,應(yīng)先做好:(1) 源串首地址(末地址) SI(2) 目的串首地址(末地址) DI(3) 串長度 CX(4) 建立方向標(biāo)志 ( CLD 使 DF=0,STD 使 DF=1 ) (SI) (DI) DF=0DF=1數(shù)據(jù)段 附加段(SI) (DI) data segment mess1 db personal_computerdata endsextra segment mess2 db 17 dup (?)extra endscode

43、 segment mov ax, data movds,ax movax, extra mov es, ax lea si, mess1 lea di, mess2 mov cx, 17 cld rep movsb code endslea si, mess1+16lea di, mess2+16mov cx, 17stdrep movsbdata segment mess1 db personal_computer mess2 db 17 dup (?)data endscode segment mov ax, data movds, ax mov es, ax lea si, mess1

44、lea di, mess2 mov cx, 17 cld rep movsb code endsSTOS 存入串指令:STOS DSTSTOSB (字節(jié))STOSW (字)執(zhí)行操作: 字節(jié)操作:(DI)(AL), (DI)(DI)1 字操作:(DI)(AX), (DI)(DI)2例:把 附加段 中的 10 個字節(jié)緩沖區(qū)置為 20Hlea di, mess2mov al, 20Hmov cx, 10cldrep stosblea di, mess2mov ax, 2020Hmov cx, 5cldrep stoswLODS 從串取指令: LODS SRC LODSB (字節(jié)) LODSW (字)

45、執(zhí)行操作: 字節(jié)操作:(AL)(SI), (SI)(SI)1 字操作:(AX)(SI), (SI)(SI)2注意: * LODS 指令一般不與 REP 聯(lián)用* 源串一般在數(shù)據(jù)段中(允許使用段跨越前綴來修改), 目的串必須在附加段中* 不影響條件標(biāo)志位與 REPE / REPZ(REPNE / REPNZ)配合工作的 CMPS 和 SCAS REPE / REPZ REPNE / REPNZ 執(zhí)行操作: (1) 如 (CX)=0 或 ZF=0 (ZF=1) 則退出串操作, 否則轉(zhuǎn)(2) (2) (CX)(CX) -1 (3) 執(zhí)行 CMPS / SCAS (4) 重復(fù) (1) (3)CMPS 串

46、比較指令: CMPS SRC, DST CMPSB (字節(jié)) CMPSW (字) 執(zhí)行操作: (1) (SI) - (DI) 根據(jù)比較結(jié)果置條件標(biāo)志位:相等 ZF=1 不等 ZF=0 (2) 字節(jié)操作:(SI)(SI)1, (DI)(DI)1 字操作: (SI)(SI)2, (DI)(DI)2SCAS 串掃描指令: SCAS DST SCASB (字節(jié)) SCASW (字)執(zhí)行操作: 字節(jié)操作:(AL) - (DI), (DI)(DI)1 字操作: (AX) - (DI), (DI)(DI)2例:從一個字符串中查找一個指定的字符 mess db COMPUTER lea di, mess mo

47、v al, T mov cx, 8 cld repne scasbCOMPUTER(di) (di):相匹配字符的下一個地址 (cx):剩下還未比較的字符個數(shù)(di) (CX)=2例:比較兩個字符串,找出它們不相匹配的位置例:反向傳送lea si, mess1lea di, mess2mov cx, 8cldrepe cmpsblea si, mess1+7lea di, mess2+7mov cx, 8STdrep movsb 控制轉(zhuǎn)移指令: 無條件轉(zhuǎn)移指令 JMP 條件轉(zhuǎn)移指令JZ / JNZ 、 JE / JNE、 JS / JNS、 JO / JNO、JP / JNP、 JB / JN

48、B、 JL / JNL、 JBE / JNBE、JLE / JNLE、 JCXZ 循環(huán)指令 LOOP、LOOPZ / LOOPE、LOOPNZ / LOOPNE 子程序調(diào)用和返回指令 CALL、RET 中斷與中斷返回指令 INT、INTO、IRET無條件轉(zhuǎn)移指令:段內(nèi)直接短轉(zhuǎn)移:JMP SHORT OPR 執(zhí)行操作:(IP) (IP) + 8位位移量段內(nèi)直接近轉(zhuǎn)移:JMP NEAR PTR OPR 執(zhí)行操作:(IP) (IP) + 16位位移量段內(nèi)間接轉(zhuǎn)移: JMP WORD PTR OPR 執(zhí)行操作: (IP) (EA)段間直接遠(yuǎn)轉(zhuǎn)移:JMP FAR PTR OPR 執(zhí)行操作:(IP) OP

49、R 的段內(nèi)偏移地址 (CS) OPR 所在段的段地址段間間接轉(zhuǎn)移: JMP DWORD PTR OPR 執(zhí)行操作: (IP) (EA) (CS) (EA+2)條件轉(zhuǎn)移指令:注意:只能使用段內(nèi)直接尋址的8 位位移量(1) 根據(jù)單個條件標(biāo)志的設(shè)置情況轉(zhuǎn)移 格式 測試條件JZ(JE) OPR ZF = 1JNZ(JNE) OPR ZF = 0JS OPR SF = 1JNS OPR SF = 0JO OPR OF = 1JNO OPR OF = 0JP OPR PF = 1JNP OPR PF = 0JC OPR CF = 1JNC OPR CF = 0(2) 比較兩個無符號數(shù),并根據(jù)比較結(jié)果轉(zhuǎn)移*

50、 格式 測試條件 JB (JNAE,JC) OPR CF = 1 JNB (JAE,JNC) OPR CF = 0 JBE (JNA) OPR CFZF = 1 JNBE (JA) OPR CFZF = 0* 適用于地址或雙精度數(shù)低位字的比較(3) 比較兩個帶符號數(shù),并根據(jù)比較結(jié)果轉(zhuǎn)移* 格式 測試條件 JL (JNGE) OPR SFOF = 1 JNL (JGE) OPR SFOF = 0 JLE (JNG) OPR (SFOF)ZF = 1 JNLE (JG) OPR (SFOF)ZF = 0* 適用于帶符號數(shù)的比較(4) 測試 CX 的值為 0 則轉(zhuǎn)移 格式 測試條件 JCXZ OPR

51、 (CX)=0例:如果 X50,轉(zhuǎn)到TOO_HIGH;否則 |X-Y| RESULT, 如果溢出轉(zhuǎn)到 OVERFLOW, JGJOJNS MOV AX, XCMP AX, 50 TOO_HIGHSUB AX, Y OVERFLOW NONNEGNEG AX NONNEG: MOV RESULT, AXTOO_HIGH: OVERFLOW: 例:、 是雙精度數(shù),分別存于 DX,AX 及 BX,CX 中, 時轉(zhuǎn) L1 ,否則轉(zhuǎn) L2 CMP DX, BX JG L1 JL L2 CMP AX, CX JA L1L2: L1: 循環(huán)指令:注意:* CX 中存放循環(huán)次數(shù)* 只能使用段內(nèi)直接尋址的8 位

52、位移量LOOPLOOPZ / LOOPELOOPNZ / LOOPNE 執(zhí)行步驟: (1) (CX) (CX) - 1 (2) 檢查是否滿足測試條件,如滿足則 (IP) (IP) + 8位位移量,實行循環(huán); 不滿足則 IP 不變,退出循環(huán)。循環(huán)指令:LOOP OPR測試條件:(CX) 0為零或相等時循環(huán)指令:LOOPZ(LOOPE) OPR測試條件:ZF=1 且 (CX) 0不為零或不相等時循環(huán)指令:LOOPNZ(LOOPNE) OPR測試條件:ZF=0 且 (CX) 0LOOP AGAIN DEC CX JNZ AGAIN例:求首地址為 ARRAY 的 M 個字之和, 結(jié)果存入 TOTALM

53、OV CX, MMOV AX, 0MOV SI, AXAGAIN: ADD AX, ARRAYSIADD SI, 2LOOP AGAINMOV TOTAL, AX例:在多重循環(huán)的程序結(jié)構(gòu)中,CX 計數(shù)器的保存和恢復(fù) MOV CX, MAGAIN: PUSH CX MOV CX, NNEXT: LOOP NEXT POP CX LOOP AGAIN MOV DI, MAGAIN: MOV CX, NNEXT: LOOP NEXT DEC DI JNZ AGAIN子程序調(diào)用和返回指令:code1 segmentmain proc far call far ptr subp retmain endp

54、code1 endscode2 segmentsubp proc far retsubp endpcode2 ends 段間調(diào)用和返回code segmentmain proc far call subp retmain endpsubp proc near retsubp endpcode ends 段內(nèi)調(diào)用和返回 CALL 調(diào)用指令段內(nèi)直接近調(diào)用:CALL DST執(zhí)行操作: (SP) (SP) - 2 ( (SP)+1,(SP) ) (IP) (IP) (IP) + 16位位移量段內(nèi)間接近調(diào)用:CALL DST執(zhí)行操作: (SP) (SP) - 2 ( (SP)+1,(SP) ) (IP)

55、 (IP) (EA)段間直接遠(yuǎn)調(diào)用:CALL DST執(zhí)行操作: (SP) (SP) - 2 ( (SP)+1,(SP) ) (CS) (SP) (SP) - 2 ( (SP)+1,(SP) ) (IP) (IP) 偏移地址 (CS) 段地址段間間接遠(yuǎn)調(diào)用:CALL DST執(zhí)行操作: (SP) (SP) - 2 ( (SP)+1,(SP) ) (CS) (SP) (SP) - 2 ( (SP)+1,(SP) ) (IP) (IP) (EA) (CS) (EA+2)RET 返回指令段內(nèi)近返回:RET執(zhí)行操作: (IP) ( (SP)+1,(SP) ) (SP) (SP) + 2段內(nèi)帶立即數(shù)近返回:

56、RET EXP段間遠(yuǎn)返回:RET執(zhí)行操作: (IP) ( (SP)+1,(SP) ) (SP) (SP) + 2 (CS) ( (SP)+1,(SP) ) (SP) (SP) + 2段間帶立即數(shù)遠(yuǎn)返回:RET EXP例:帶立即數(shù)返回(SP) 堆棧段code segmentmain proc far push ax push bx push cx call sub retmain endpsub proc near ret 6sub endpcode ends(IP)(cx)(bx)(ax)(SP)(SP)中斷指令: 類型0的(IP) 類型0的(CS) 類型1的(IP) 類型1的(CS) 類型N的(IP) 類型N的(CS) 類型255的(IP) 類型255的(CS)0000000004 4*N003FC中斷向量表中斷向量:中

溫馨提示

  • 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

提交評論