一、數(shù)據(jù)傳送指令 1.通用數(shù)據(jù)傳送指令 MOV(Move)傳送 PUSH(Push onto the stack)進棧 POP(Pop from the stack)出棧 XCHG(Exchange)交換 .MOV指令 格式為: MOV DST,SRC 執(zhí)行的操作:(DST)<-(SRC) .PUSH進棧指令 格式為:PUSH SRC 執(zhí)行的操作:(SP)<-(SP)-2 ((SP)+1,(SP))<-(SRC) .POP出棧指令 格式為:POP DST 執(zhí)行的操作:(DST)<-((SP+1),(SP)) (SP)<-(SP)+2 .XCHG 交換指令 格式為:XCHG OPR1,OPR2 執(zhí)行的操作:(OPR1)<-->(OPR2)
2.累加器專用傳送指令 IN(Input) 輸入 OUT(Output) 輸出 XLAT(Translate) 換碼 這組指令只限于使用累加器AX或AL傳送信息. .IN 輸入指令 長格式為: 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 輸出指令 長格式為: OUT PORT,AL(字節(jié)) OUT PORT,AX(字) 執(zhí)行的操作: (PORT)<-(AL)(字節(jié)) (PORT+1,PORT)<-(AX)(字) 短格式為: OUT DX,AL(字節(jié)) OUT DX,AX(字) 執(zhí)行的操作: ((DX))<-(AL)(字節(jié)) ((DX)+1,(DX))<-AX(字) 在IBM-PC機里,外部設(shè)備最多可有65536個I/O端口, 端口(即外設(shè)的端口地址)為0000~FFFFH.其中前256個端 口(0~FFH)可以直接在指令中指定,這就是長格式中的PORT, 此時機器指令用二個字節(jié)表示,第二個字節(jié)就是端口號.所以 用長格式時可以在指定中直接指定端口號,但只限于前256個 端口.當(dāng)端口號>=256時,只能使用短格式,此時,必須先把端 口號放到DX寄存器中(端口號可以從0000到0FFFFH),然后 再用IN或OUT指令來 傳送信息. .XLAT 換碼指令 格式為: XLAT OPR 或: XLAT 執(zhí)行的操作:(AL)<-((BX)+(AL))
3.有效地址送寄存器指令 LEA(Load effective address)有效地址送寄存器 LDS(Load DS with Pointer)指針?biāo)图拇嫫骱虳S LES(Load ES with Pointer)指針?biāo)图拇嫫骱虴S .LEA 有效地址送寄存器 格式為: LEA REG,SRC 執(zhí)行的操作:(REG)<-SRC 指令把源操作數(shù)的有效地址送到指定的寄存器中. .LDS 指針?biāo)图拇嫫骱虳S指令 格式為: LDS REG,SRC 執(zhí)行的操作:(REG)<-(SRC) (DS)<-(SRC+2) 把源操作數(shù)指定的4個相繼字節(jié)送到由指令指定的寄存器 及DS寄存器中.該指令常指定SI寄存器. .LES 指針?biāo)图拇嫫骱虴S指令 格式為: LES REG,SRC 執(zhí)行的操作: (REG)<-(SRC) (ES)<-(SRC+2) 把源操作數(shù)指定的4個相繼字節(jié)送到由指令指定的寄存器 及ES寄存器中.該指令常指定DI寄存器.
4.標(biāo)志寄存器傳送指令 LAHF(Load AH with flags)標(biāo)志送AH SAHF(store AH into flags)AH送標(biāo)志寄存器 PUSHF(push the flags) 標(biāo)志進棧 POPF(pop the flags) 標(biāo)志出棧 .LAHF 標(biāo)志送AH 格式為: LAHF 執(zhí)行的操作:(AH)<-(PWS的低字節(jié)) .SAHF AH送標(biāo)志寄存器 格式為: SAHF 執(zhí)行的操作:(PWS的低字節(jié))<-(AH) .PUSHF 標(biāo)志進棧 格式為: PUSHF 執(zhí)行的操作:(SP)<-(SP)-2 ((SP)+1,(SP))<-(PSW) .POPF 標(biāo)志出棧 格式為: POPF 執(zhí)行的操作:(PWS)<-((SP)+1,(SP)) (SP)<-(SP+2)
二、算術(shù)指令 1.加法指令 ADD(add)加法 ADC(add with carry)帶進位加法 INC(increment)加1 .ADD 加法指令 格式: ADD DST,SRC 執(zhí)行的操作:(DST)<-(SRC)+(DST) .ADC 帶進位加法指令 格式: ADC DST,SRC 執(zhí)行的操作:(DST)<-(SRC)+(DST)+CF .ADD 加1指令
"> 格式: INC OPR 執(zhí)行的操作:(OPR)<-(OPR)+1
2.減法指令 SUB(subtract)減法 SBB(subtract with borrow)帶借位減法 DEC(Decrement)減1 NEG(Negate)求補 CMP(Compare)比較 .SUB 減法指令 格式: SUB DST,SRC 執(zhí)行的操作:(DST)<-(DST)-(SRC) .SBB 帶借位減法指令 格式: SBB DST,SRC 執(zhí)行的操作:(DST)<-(DST)-(SRC)-CF .DEC 減1指令 格式: DEC OPR 執(zhí)行的操作:(OPR)<-(OPR)-1 .NEG 求補指令 格式: NEG OPR 執(zhí)行的操作:(OPR)<- -(OPR) .CMP 比較指令 格式: CMP OPR1,OPR2 執(zhí)行的操作:(OPR1)-(OPR2) 該指令與SUB指令一樣執(zhí)行減法操作,但不保存結(jié)果, 只是根據(jù)結(jié)果設(shè)置條件標(biāo)志西半球.
3.乘法指令 MUL(Unsigned Multiple)無符號數(shù)乘法 IMUL(Signed Multiple)帶符號數(shù)乘法 .MUL 無符號數(shù)乘法指令 格式: MUL SRC 執(zhí)行的操作: 字節(jié)操作數(shù):(AX)<-(AL)*(SRC) 字操作數(shù):(DX,AX)<-(AX)*(SRC) .IMUL 帶符號數(shù)乘法指令 格式: IMUL SRC 執(zhí)行的操作:與MUL相同,但必須是帶符號數(shù),而MUL是無符號數(shù).
4.除法指令 DIV(Unsigned divide)無符號數(shù)除法 IDIV(Signed divide)帶符號數(shù)除法 CBW(Convert byte to word)字節(jié)轉(zhuǎn)換為字 CWD(Contert word to double word)字轉(zhuǎn)換為雙字 .DIV 無符號數(shù)除法指令 格式: DIV SRC 執(zhí)行的操作: 字節(jié)操作:(AL)<-(AX)/(SRC)的商 (AH)<-(AX)/(SRC)的余數(shù) 字操作: (AX)<-(DX,AX)/(SRC)的商 (AX)<-(DX,AX)/(SRC)的余數(shù) .IDIV 帶符號數(shù)除法指令 格式: DIV SRC 執(zhí)行的操作:與DIV相同,但操作數(shù)必須是帶符號數(shù),商和余數(shù) 也均為帶符號數(shù),且余數(shù)的符號與被除數(shù)的符號相同. .CBW 字節(jié)轉(zhuǎn)換為字指令 格式: CBW 執(zhí)行的操作:AL的內(nèi)容符號擴展到AH.即如果(AL)的最高有效 位為0,則(AH)=00;如(AL)的最高有效位為1,則(AH)=0FFH .CWD 字轉(zhuǎn)換為雙字指令 格式: CWD 執(zhí)行的操作:AX的內(nèi)容符號擴展到DX.即如(AX)的最高有效位 為0,則(DX)=0;否則(DX)=0FFFFH. 這兩條指令都不影響條件碼.
三、邏輯指令 1.邏輯運算指令 AND(and) 邏輯與 OR(or) 邏輯或 NOT(not) 邏輯非 XOR(exclusive or)異或 TEST(test) 測試 .AND 邏輯與指令 格式: AND DST,SRC 執(zhí)行的操作:(DST)<-(DST)^(SRC) .OR 邏輯或指令 格式: OR DST,SRC 執(zhí)行的操作:(DST)<-(DST)V(SRC) .NOT 邏輯非指令 格式: NOT OPR 執(zhí)行的操作:(OPR)<-(OPR) .XOR 異或指令 格式: XOR DST,SRC 執(zhí)行的操作:(DST)<-(DST)V(SRC) .TEST 測試指令 格式: TEST OPR1,OPR2 執(zhí)行的操作:(DST)^(SRC) 兩個操作數(shù)相與的結(jié)果不保存,只根據(jù)其特征置條件碼
2.移位指令 SHL(shift logical left) 邏輯左移 SAL(shift arithmetic left) 算術(shù)左移 SHR(shift logical right) 邏輯右移 SAR(shift arithmetic right) 算術(shù)右移 ROL(Rotate left) 循環(huán)左移 ROR(Rotate right) 循環(huán)右移 RCL(Rotate left through carry) 帶進位循環(huán)左移 RCR(Rotate right through carry) 帶進位循環(huán)右移 格式: SHL OPR,CNT(其余的類似) 其中OPR可以是除立即數(shù)以外的任何尋址方式.移位次數(shù)由CNT決定, CNT可以是1或CL.循環(huán)移位指令可以改變操作數(shù)中所有位的位置;移 位指令則常常用來做乘以2除以2操作.其中算術(shù)移位指令適用于帶符 號數(shù)運算,SAL用來乘2,
SAR用來除以2;而邏輯移位指令則用來無符 號數(shù)運算,SHL用來乘2,SHR用來除以2.
四、串處理指令 1.與REP相配合工作的MOVS,STOS和LODS指令 .REP重復(fù)串操作直到(CX)=0為上 格式: REP string primitive 其中String Primitive可為MOVS,LODS或STOS指令 執(zhí)行的操作: 1)如(CX)=0則退出REP,否則往下執(zhí)行. 2)(CX)<-(CX)-1 3)執(zhí)行其中的串操作 4)重復(fù)1)~3) .MOVS 串傳送指令 格式:可有三種 MOVS DST,SRC MOVSB(字節(jié)) MOVSW(字) 其中第二、三種格式明確地注明是傳送字節(jié)或字,第一種格式則應(yīng) 在操作數(shù)中表明是字還是字節(jié)操作,例如: MOVS ES:BYTE PTR[DI],DS:[SI] 執(zhí)行的操作: 1)((DI))<-((SI)) 2)字節(jié)操作: (SI)<-(SI)+(或-)1,(DI)<-(DI)+(或-)1 當(dāng)方向標(biāo)志DF=0時用+,當(dāng)方向標(biāo)志DF=1時用- 3)字操作: (SI)<-(SI)+(或-)2,(DI)<-(DI)+(或-)2 當(dāng)方向標(biāo)志DF=0時用+,當(dāng)方向標(biāo)志DF=1時用- 該指令不影響條件碼. .CLD(Clear direction flag)該指令使DF=0,在執(zhí)行串操作 指令時可使地址自動增量; .STD(Set direction flag)該指令使DF=1,在執(zhí)行串操作指 令時可使地址自動減量. .STOS 存入串指令 格式: STOS DST STOSB(字節(jié)) STOSW(字) 執(zhí)行的操作: 字節(jié)操作:((DI))<-(AL),(DI)<-(DI)+-1 字操作: ((DI))<-(AX),(DI)<-(DI)+-2 該指令把AL或AX的內(nèi)容存入由(DI)指定的附加段的某單元中,并根 據(jù)DF的值及數(shù)據(jù)類型修改DI的內(nèi)容,當(dāng)它與REP聯(lián)用時,可把AL或AX 的內(nèi)容存入一個長度為(CX)的緩沖區(qū)中. .LODS 從串取指令 格式: LODS SRC LODSB LODSW 執(zhí)行的操作: 字節(jié)操作:(AL)<-((SI)),(SI)<-(SI)+-1 字操作: (AX)<-((SI)),(SI)<-(SI)+-2 該指令把由(SI)指定的數(shù)據(jù)段中某單元的內(nèi)容送到AL或AX中,并根據(jù) 方向標(biāo)志及數(shù)據(jù)類型修改SI的內(nèi)容.指令允許使用段跨越前綴來指定非 數(shù)據(jù)段的存儲區(qū).該指令也不影響條件碼.一般說來,該指令不和REP聯(lián) 用.有時緩沖區(qū)中的一串字符需要逐次取出來測試時,可使用本指令. 2.與REPE/REPZ和REPNZ/REPNE聯(lián)合工作的CMPS和SCAS指令 .REPE/REPZ 當(dāng)相等/為零時重復(fù)串操作 格式: REPE(或REPZ) String Primitive 其中String Primitive可為CMPS或SCAS指令. 執(zhí)行的操作: 1)如(CX)=0或ZF=0(即某次比較的結(jié)果兩個操作數(shù)不等)時退出, 否則往下執(zhí)行 2)(CX)<-(CX)-1 3)執(zhí)行其后的串指令 4)重復(fù)1)~3) .REPNE/REPNZ 當(dāng)不相等/不為零時重復(fù)串操作 格式: REPNE(或REPNZ) String Primitive 其中String Primitive可為CMPS或SCAS指令 執(zhí)行的操作: 除退出條件(CX=0)或ZF=1外,其他操作與REPE完全相同. .CMPS 串比較指令 格式: CMP SRC,DST CMPSB CMPSW 執(zhí)行的操作: 1)((SI))-((DI)) 2)字節(jié)操作:(SI)<-(SI)+-1,(DI)<-(DI)+-1 字操作: (SI)<-(SI)+-2,(DI)<-(DI)+-2 指令把由(SI)指向的數(shù)據(jù)段中的一個字(或字節(jié))與由(DI)指向的 附加段中的一個字(或字節(jié))相減,但不保存結(jié)果,只根據(jù)結(jié)果設(shè)置條 件碼,指令的其它特性和MOVS指令的規(guī)定相同. .SCAS 串掃描指令 格式: SCAS DST SCASB SCASW 執(zhí)行的操作: 字節(jié)操作:(AL)-((DI)),(DI)<-(DI)+-1 字操作: (AL)-((DI)),(DI)<-(DI)+-2 該指令把AL(或AX)的內(nèi)容與由(DI)指定的在附加段中的一個字節(jié)(或字)進行比較,并不保存結(jié)果,只根據(jù)結(jié)果置條件碼.指令的其他特性和MOVS的規(guī)定相同.
五、控制轉(zhuǎn)移指令 1.無條件轉(zhuǎn)移指令 .JMP(jmp) 跳轉(zhuǎn)指令 1)段內(nèi)直接短轉(zhuǎn)移 格式:JMP SHORT OPR 執(zhí)行的操作:(IP)<-(IP)+8位位移量 2)段內(nèi)直接近轉(zhuǎn)移 格式:JMP NEAR PTR OPR 執(zhí)行的操作:(IP)<-(IP)+16位位移量 3)段內(nèi)間接轉(zhuǎn)移 格式:JMP WORD PTR OPR 執(zhí)行的操作:(IP)<-(EA) 4)段間直接(遠(yuǎn))轉(zhuǎn)移 格式:JMP FAR PTR OPR 執(zhí)行的操作:(IP)<-OPR的段內(nèi)偏移地址 (CS)<-OPR所在段的段地址 5)段間間接轉(zhuǎn)移 格式:JMP DWORD PTR OPR 執(zhí)行的操作:(IP)<-(EA) &n
|