x86的x86汇编指令详解数量是固定的吗?

X86汇编指令
一、数据传送指令<span STYLE="CoLor: #.通用数据传送指令MOV(Move)传送
PUSH(Push onto the stack)进栈
POP(Pop from the stack)出栈
XCHG(Exchange)交换.MOV指令
格式为: MOV&& DST,SRC
执行的操作:(DST)&-(SRC).PUSH进栈指令
格式为:PUSH&& SRC
执行的操作:(SP)&-(SP)-2
&&&&&&&&&&&
((SP)+1,(SP))&-(SRC).POP出栈指令
格式为:POP&& DST
执行的操作:(DST)&-((SP+1),(SP))
&&&&&&&&&&&
(SP)&-(SP)+2.XCHG 交换指令
格式为:XCHG&& OPR1,OPR2
执行的操作:(OPR1)&--&(OPR2)
<span STYLE="CoLor: #.累加器专用传送指令IN(Input)&&
OUT(Output)&& 输出
XLAT(Translate)&& 换码
这组指令只限于使用累加器AX或AL传送信息..IN
长格式为:&&&&
IN&& AL,PORT(字节)
IN&& AX,PORT(字)
执行的操作:&&
(AL)&-(PORT)(字节)
&&&&&&&&&&&&&
(AX)&-(PORT+1,PORT)(字)
短格式为:&&&&
IN&& AL,DX(字节)
&&&&&&&&&&&&&
IN&& AX,DX(字)
执行的操作:&&
AL&-((DX))(字节)
&&&&&&&&&&&&&
AX&-((DX)+1,DX)(字).OUT 输出指令
长格式为:&&&&
OUT&& PORT,AL(字节)
&&&&&&&&&&&&&
PORT,AX(字)
执行的操作:&&
(PORT)&-(AL)(字节)
&&&&&&&&&&&&&
(PORT+1,PORT)&-(AX)(字)
短格式为:&&&&
OUT&& DX,AL(字节)
&&&&&&&&&&&&&
OUT&& DX,AX(字)
执行的操作:&&
((DX))&-(AL)(字节)
&&&&&&&&&&&&&
((DX)+1,(DX))&-AX(字)
在IBM-PC机里,外部设备最多可有65536个I/O端口,端口(即外设的端口地址)为0000~FFFFH.其中前256个端口(0~FFH)可以
直接在指令中指定,这就是长格式中的PORT,此时机器指令用二个字节表示,第二个字节就是端口号.所以用长格式时可以在指定中直接指定端口号,但只限于
前256个端口.当端口号&=256时,只能使用短格式,此时,必须先把端口号放到DX寄存器中(端口号可以从0000到0FFFFH),然后再用
IN或OUT指令来 传送信息. .XLAT&&
格式为:&&&&
XLAT&& OPR
或:&&&&&&&&
执行的操作:(AL)&-((BX)+(AL))
<span STYLE="CoLor: #.有效地址送寄存器指令LEA(Load
effective address)有效地址送寄存器
LDS(Load DS with Pointer)指针送寄存器和DS
LES(Load ES with Pointer)指针送寄存器和ES.LEA 有效地址送寄存器
执行的操作:(REG)&-SRC
指令把源操作数的有效地址送到指定的寄存器中..LDS 指针送寄存器和DS指令
LDS&& REG,SRC
执行的操作:(REG)&-(SRC)
&&&&&&&&&&&
(DS)&-(SRC+2)
把源操作数指定的4个相继字节送到由指令指定的寄存器及DS寄存器中.该指令常指定SI寄存器..LES
指针送寄存器和ES指令
LES&& REG,SRC
执行的操作: (REG)&-(SRC)
&&&&&&&&&&&&
(ES)&-(SRC+2)
把源操作数指定的4个相继字节送到由指令指定的寄存器及ES寄存器中.该指令常指定DI寄存器.
<span STYLE="CoLor: #.标志寄存器传送指令LAHF(Load AH with flags)标志送AH
SAHF(store AH into flags)AH送标志寄存器
PUSHF(push the flags) 标志进栈
POPF(pop the flags) 标志出栈.LAHF 标志送AH格式为:&&&&
执行的操作:(AH)&-(PWS的低字节)
AH送标志寄存器格式为:&&&&
执行的操作:(PWS的低字节)&-(AH).PUSHF 标志进栈格式为:&&&&
执行的操作:(SP)&-(SP)-2
&&&&&&&&&&&
((SP)+1,(SP))&-(PSW).POPF 标志出栈格式为:&&&&
执行的操作:(PWS)&-((SP)+1,(SP))
&&&&&&&&&&&
(SP)&-(SP+2)
二、算术指令<span STYLE="CoLor: #.加法指令ADD(add)加法
ADC(add with carry)带进位加法
INC(increment)加1.ADD&&
加法指令格式:&&&&
执行的操作:(DST)&-(SRC)+(DST).ADC&&
带进位加法指令格式:&&&&
执行的操作:(DST)&-(SRC)+(DST)+CF.ADD&&
加1指令格式:&&&&
INC&&& OPR
执行的操作:(OPR)&-(OPR)+1
<span STYLE="CoLor: #.减法指令SUB(subtract)减法
SBB(subtract with borrow)带借位减法
DEC(Decrement)减1
NEG(Negate)求补
CMP(Compare)比较.SUB&&
减法指令格式:&&
SUB&& DST,SRC
执行的操作:(DST)&-(DST)-(SRC).SBB&&
带借位减法指令格式:&&
SBB&& DST,SRC
执行的操作:(DST)&-(DST)-(SRC)-CF.DEC&&
减1指令格式:&&
执行的操作:(OPR)&-(OPR)-1.NEG&&
求补指令格式:&&
执行的操作:(OPR)&- -(OPR).CMP&&
比较指令格式:&&
CMP&& OPR1,OPR2
执行的操作:(OPR1)-(OPR2)
该指令与SUB指令一样执行减法操作,但不保存结果,只是根据结果设置条件标志西半球.
<span STYLE="CoLor: #.乘法指令MUL(Unsigned Multiple)无符号数乘法
IMUL(Signed Multiple)带符号数乘法.MUL
无符号数乘法指令格式:&&&
执行的操作:
字节操作数:(AX)&-(AL)*(SRC)
字操作数:(DX,AX)&-(AX)*(SRC).IMUL 带符号数乘法指令格式:&&&
IMUL&& SRC
执行的操作:与MUL相同,但必须是带符号数,而MUL是无符号数.
<span STYLE="CoLor: #.除法指令DIV(Unsigned divide)无符号数除法
IDIV(Signed divide)带符号数除法
CBW(Convert byte to word)字节转换为字
CWD(Contert word to double word)字转换为双字.DIV&&
无符号数除法指令格式:&&&
执行的操作:
&&字节操作:(AL)&-(AX)/(SRC)的商
&&&&&&&&&&&
(AH)&-(AX)/(SRC)的余数
(AX)&-(DX,AX)/(SRC)的商
&&&&&&&&&&&
(AX)&-(DX,AX)/(SRC)的余数.IDIV&&
带符号数除法指令
执行的操作:与DIV相同,但操作数必须是带符号数,商和余数也均为带符号数,且余数的符号与被除数的符号相同..CBW
字节转换为字指令
格式:&&& CBW
执行的操作:AL的内容符号扩展到AH.即如果(AL)的最高有效位为0,则(AH)=00;如(AL)的最高有效位为1,则(AH)=0FFH
字转换为双字指令
格式:&& CWD
执行的操作:AX的内容符号扩展到DX.即如(AX)的最高有效位为0,则(DX)=0;否则(DX)=0FFFFH.
这两条指令都不影响条件码.
三、逻辑指令<span STYLE="CoLor: #.逻辑运算指令AND(and)&&&&&&&&&&
OR(or)&&&&&&&&&&&
NOT(not)&&&&&&&&&
XOR(exclusive or)异或
TEST(test)&&&&&&&
测试.AND&&
逻辑与指令格式:&&&&
执行的操作:(DST)&-(DST)^(SRC).OR&&
逻辑或指令格式:&&&&
执行的操作:(DST)&-(DST)V(SRC).NOT&&
逻辑非指令格式:&&&&
NOT&&& OPR
执行的操作:(OPR)&-(OPR).XOR&&
异或指令格式:&&&&
执行的操作:(DST)&-(DST)V(SRC).TEST&&
测试指令格式:&&&&
执行的操作:(DST)^(SRC)
两个操作数相与的结果不保存,只根据其特征置条件码<span STYLE="CoLor: #.移位指令SHL(shift logical
left)&&&&&&&&&&
SAL(shift arithmetic
left)&&&&&&
SHR(shift logical
right)&&&&&&&&
SAR(shift arithmetic
right)&&&&&
ROL(Rotate
left)&&&&&&&&&&&&&&&&&
ROR(Rotate
right)&&&&&&&&&&&&&&&&
RCL(Rotate left through carry)&&
带进位循环左移
RCR(Rotate right through carry) 带进位循环右移格式:&&&&
SHL&& OPR,CNT(其余的类似)
其中OPR可以是除立即数以外的任何寻址方式.移位次数由CNT决定,CNT可以是1或CL.
循环移位指令可以改变操作数中所有位的位置;移位指令则常常用来做乘以2除以2操作.其中算术移位指令适用于带符号数运算,SAL用来乘2,SAR用来除以2;而逻辑移位指令则用来无符号数运算,SHL用来乘2,SHR用来除以2.
四、串处理指令1.与REP相配合工作的MOVS,STOS和LODS指令
.REP重复串操作直到(CX)=0为上
格式:&&REP&&&
string primitive
其中String Primitive可为MOVS,LODS或STOS指令
执行的操作:
1)如(CX)=0则退出REP,否则往下执行.
2)(CX)&-(CX)-1
3)执行其中的串操作
4)重复1)~3).MOVS&&
串传送指令
格式:可有三种
&&&&MOVS&&
MOVSB(字节)
其中第二、三种格式明确地注明是传送字节或字,第一种格式则应在操作数中表明是字还是字节操作,例如:
&&&&&&&&&&&&MOVS&&&&
ES:BYTE PTR[DI],DS:[SI]
执行的操作:
1)((DI))&-((SI))
2)字节操作:
(SI)&-(SI)+(或-)1,(DI)&-(DI)+(或-)1
当方向标志DF=0时用+,当方向标志DF=1时用-
(SI)&-(SI)+(或-)2,(DI)&-(DI)+(或-)2
当方向标志DF=0时用+,当方向标志DF=1时用-
该指令不影响条件码..CLD(Clear
direction flag)该指令使DF=0,在执行串操作指令时可使地址自动增量;
.STD(Set direction flag)该指令使DF=1,在执行串操作指令时可使地址自动减量.
存入串指令
STOS&& DST
STOSB(字节)
执行的操作:
字节操作:((DI))&-(AL),(DI)&-(DI)+-1
((DI))&-(AX),(DI)&-(DI)+-2
该指令把AL或AX的内容存入由(DI)指定的附加段的某单元中,并根据DF的值及数据类型修改DI的内容,当它与REP联用时,可把AL或AX的内容存入一个长度为(CX)的缓冲区中.
从串取指令
LODS&& SRC
执行的操作:
字节操作:(AL)&-((SI)),(SI)&-(SI)+-1
字操作: (AX)&-((SI)),(SI)&-(SI)+-2
该指令把由(SI)指定的数据段中某单元的内容送到AL或AX中,并根据方向标志及数据类型修改SI的内容.指令允许使用段跨越前缀来指定非数据段的存储区.该指令也不影响条件码.
一般说来,该指令不和REP联用.有时缓冲区中的一串字符需要逐次取出来测试时,可使用本指令.
2.与REPE/REPZ和REPNZ/REPNE联合工作的CMPS和SCAS指令.REPE/REPZ&&
当相等/为零时重复串操作格式:&&&&&
REPE(或REPZ)&&&&
String Primitive
其中String
Primitive可为CMPS或SCAS指令.
执行的操作:
<span STYLE="CoLor: #)如(CX)=0或ZF=0(即某次比较的结果两个操作数不等)时退出,否则往下执行
<span STYLE="CoLor: #)(CX)&-(CX)-1
<span STYLE="CoLor: #)执行其后的串指令
<span STYLE="CoLor: #)重复1)~3)
.REPNE/REPNZ&&
当不相等/不为零时重复串操作
格式:&&&&&
REPNE(或REPNZ)&&&
String Primitive
其中String
Primitive可为CMPS或SCAS指令
执行的操作:
除退出条件(CX=0)或ZF=1外,其他操作与REPE完全相同.
串比较指令
格式:&&&&&
&&&&&&&&&&
&&&&&&&&&&
执行的操作:
<span STYLE="CoLor: #)((SI))-((DI))
<span STYLE="CoLor: #)字节操作:(SI)&-(SI)+-1,(DI)&-(DI)+-1
(SI)&-(SI)+-2,(DI)&-(DI)+-2
指令把由(SI)指向的数据段中的一个字(或字节)与由(DI)指向的附加段中的一个字(或字节)相减,但不保存结果,只根据结果设置条件码,指令的其它特性和MOVS指令的规定相同.
串扫描指令格式:&&&
执行的操作:
字节操作:(AL)-((DI)),(DI)&-(DI)+-1
(AL)-((DI)),(DI)&-(DI)+-2
该指令把AL(或AX)的内容与由(DI)指定的在附加段中的一个字节(或字)进行比较,并不保存结果,只根据结果置条件码.指令的其他特性和MOVS的规定相同.
五、控制转移指令
&&1.无条件转移指令.JMP(jmp)&&
跳转指令<span STYLE="CoLor: #)段内直接短转移格式:JMP&& SHORT
执行的操作:(IP)&-(IP)+8位位移量
2)段内直接近转移格式:JMP&& NEAR
执行的操作:(IP)&-(IP)+16位位移量
3)段内间接转移格式:JMP&& WORD
执行的操作:(IP)&-(EA)
4)段间直接(远)转移格式:JMP&& FAR PTR
执行的操作:(IP)&-OPR的段内偏移地址
&&&&&&&&&&&
(CS)&-OPR所在段的段地址
5)段间间接转移
格式:JMP&& DWORD
执行的操作:(IP)&-(EA)
&&&&&&&&&&&
(CS)&-(EA+2)
2.条件转移指令<span STYLE="CoLor: #)根据单个条件标志的设置情况转移.JZ(或JE)(Jump if zero,or
结果为零(或相等)则转移格式:JE(或JZ)&&
测试条件:ZF=1
.JNZ(或JNE)(Jump if not zero,or not
equal) 结果不为零(或不相等)则转移格式:JNZ(或JNE)&&
测试条件:ZF=0
.JS(Jump if
结果为负则转移格式:&&
测试条件:SF=1
.JNS(Jump if not
结果为正则转移格式:JNS&&
测试条件:SF=0
.JO(Jump if
overflow)&&
溢出则转移格式:&&&
测试条件:OF=1
.JNO(Jump if not
overflow)&&
不溢出则转移格式:&&&
测试条件:OF=0
.JP(或JPE)(Jump if parity,or parity
even) 奇偶位为1则转移格式:&&&
测试条件:PF=1
.JNP(或JPO)(Jump if not parity,or
parity odd) 奇偶位为0则转移格式:&&&
JNP(或JPO)&& OPR
测试条件:PF=0
.JB(或JNAE,JC)(Jump if below,or not
above or equal,or carry)
低于,或者不高于或等于,或进位位为1则转移格式:JB(或JNAE,JC)&&
测试条件:CF=1
.JNB(或JAE,JNC)(Jump if not below,or
above or equal,or not carry)
不低于,或者高于或者等于,或进位位为0则转移格式:JNB(或JAE,JNC)&&
测试条件:CF=0
2)比较两个无符号数,并根据比较的结果转移.JB(或JNAE,JC)格式:同上
.JNB(或JAE,JNC)格式:同上
.JBE(或JNA)(Jump if below or equal,or
not above) 低于或等于,或不高于则转移格式:JBE(或JNA)&&
测试条件:CFVZF=1
.JNBE(或JA)(Jump if not below or
equal,or above) 不低于或等于,或者高于则转移格式:JNBE(或JA)&&
测试条件:CFVZF=0
3)比较两个带符号数,并根据比较的结果转移
.JL(或LNGE)(Jump if less,or not greater
or equal) 小于,或者不大于或者等于则转移格式:JL(或JNGE)&&
测试条件:SFVOF=1
.JNL(或JGE)(Jump if not less,or greater
or equal)不小于,或者大于或者等于则转移格式:JNL(或JGE)&&
测试条件:SFVOF=0
.JLE(或JNG)(Jump if less or equal,or
not greater) 小于或等于,或者不大于则转移格式:JLE(或JNG)&&
测试条件:(SFVOF)VZF=1
.JNLE(或JG)(Jump if not less or
equal,or greater) 不小于或等于,或者大于则转移格式:JNLE(或JG)&&
测试条件:(SFVOF)VZF=0
<span STYLE="CoLor: #)测试CX的值为0则转移指令.JCXZ(Jump if CX register is
CX寄存器的内容为零则转移
格式:JCXZ&& OPR
测试条件:(CX)=0注:条件转移全为8位短跳!
3.循环指令.LOOP
格式: LOOP&& OPR
测试条件:(CX)&&0
.LOOPZ/LOOPE
当为零或相等时循环指令
格式: LOOPZ(或LOOPE)&& OPR
测试条件:(CX)&&0且ZF=1.LOOPNZ/LOOPNE 当不为零或不相等时循环指令
格式: LOOPNZ(或LOOPNE)&& OPR
测试条件:(CX)&&0且ZF=0这三条指令的步骤是:
1)(CX)&-(CX)-1
2)检查是否满足测试条件,如满足则(IP)&-(IP)+D8的符号扩充.
4.子程序.CALL调用指令
.RET返回指令
.INT指令格式:&&&&
INT&& TYPE
执行的操作:(SP)&-(SP)-2
&&&&&&&&&&&
((SP)+1,(SP))&-(PSW)
&&&&&&&&&&&
(SP)&-(SP)-2
&&&&&&&&&&&
((SP)+1,(SP))&-(CS)
&&&&&&&&&&&
(SP)&-(SP)-2
&&&&&&&&&&&
((SP)+1,(SP))&-(IP)
&&&&&&&&&&&
(IP)&-(TYPE*4)
&&&&&&&&&&&
(CS)&-(TYPE*4+2).INTO&&
若溢出则中断执行的操作:若OF=1则:
&&&&&&&&&&&
(SP)&-(SP)-2
&&&&&&&&&&&
((SP)+1,(SP))&-(PSW)
&&&&&&&&&&&
(SP)&-(SP)-2
&&&&&&&&&&&
((SP)+1,(SP))&-(CS)
&&&&&&&&&&&
(SP)&-(SP)-2
&&&&&&&&&&&
((SP)+1,(SP))&-(IP)
&&&&&&&&&&&
(IP)&-(10H)
&&&&&&&&&&&
(CS)&-(12H).IRET&&&&
从中断返回指令格式:&&&&&
执行的操作:(IP)&-((SP)+1,(SP))
&&&&&&&&&&&
(SP)&-(SP)+2
&&&&&&&&&&&
(CS)&-((SP)+1,(SP))
&&&&&&&&&&&
(SP)&-(SP)+2
&&&&&&&&&&&
(PSW)&-((SP)+1,(SP))
&&&&&&&&&&&
(SP)&-(SP)+2
六、处理机控制指令1.标志处理指令.CLC进位位置0指令(Clear carry)CF&-0
.CMC进位位求反指令(Complement carry)CF&-CF
.STC进位位置1指令(Set
carry)CF&-1
.CLD方向标志置0指令(Clear direction)DF&-0
.STD方向标志置1指令(Set
direction)DF&-1
.CLI中断标志置0指令(Clear
interrupt)IF&-0
.STI中断标志置1指令(Set
interrupt)IF&-0
2.其他处理机控制指令NOP(No
Opreation)&&&
HLT(Halt)&&&&&&&&&&&
WAIT(Wait)&&&&&&&&&&
ESC(Escape)&&&&&&&&&
LOCK(Lock)&&&&&&&&&&
封锁这些指令可以控制处理机状态.这们都不影响条件码..NOP
无操作指令&&&&
该指令不执行任何操作,其机器码占有一个字节,在调试程序时往往用这条指令占有一定的存储单元,以便在正式运行时用其他指令取代..HLT停机指令
该指令可使机器暂停工作,使处理机处于停机状态以便等待一次外部中断到来,中断结束后可继续执行下面的程序..WAIT等待指令
该指令使处理机处于空转状态,它也可以用来等待外部中断的发生,但中断结束后仍返回WAIT指令继续德行..ESC换码指令
格式ESC&& mem
其中mem指出一个存储单元,ESC指令把该存储单元的内容送到数据总线去.当然ESC指令不允许使用立即数和寄存器寻址方式.这条指令在使用协处理机
(Coprocessor)执行某些操作时,可从存储器指得指令或操作数.协处理机(如8087)则是为了提高速度而可以选配的硬件.
.LOCK封锁指令
该指令是一种前缀,它可与其他指令联合,用来维持总线的锁存信号直到与其联合的指令执行完为止.当CPU与其他处理机协同工作时,该指令可避免破坏有用信息.
一、数据传送指令<span STYLE="CoLor: #.通用数据传送指令MOV(Move)传送
PUSH(Push onto the stack)进栈
POP(Pop from the stack)出栈
XCHG(Exchange)交换.MOV指令
格式为: MOV&& DST,SRC
执行的操作:(DST)&-(SRC).PUSH进栈指令
格式为:PUSH&& SRC
执行的操作:(SP)&-(SP)-2
&&&&&&&&&&&
((SP)+1,(SP))&-(SRC).POP出栈指令
格式为:POP&& DST
执行的操作:(DST)&-((SP+1),(SP))
&&&&&&&&&&&
(SP)&-(SP)+2.XCHG 交换指令
格式为:XCHG&& OPR1,OPR2
执行的操作:(OPR1)&--&(OPR2)
<span STYLE="CoLor: #.累加器专用传送指令IN(Input)&&
OUT(Output)&& 输出
XLAT(Translate)&& 换码
这组指令只限于使用累加器AX或AL传送信息..IN
长格式为:&&&&
IN&& AL,PORT(字节)
IN&& AX,PORT(字)
执行的操作:&&
(AL)&-(PORT)(字节)
&&&&&&&&&&&&&
(AX)&-(PORT+1,PORT)(字)
短格式为:&&&&
IN&& AL,DX(字节)
&&&&&&&&&&&&&
IN&& AX,DX(字)
执行的操作:&&
AL&-((DX))(字节)
&&&&&&&&&&&&&
AX&-((DX)+1,DX)(字).OUT 输出指令
长格式为:&&&&
OUT&& PORT,AL(字节)
&&&&&&&&&&&&&
PORT,AX(字)
执行的操作:&&
(PORT)&-(AL)(字节)
&&&&&&&&&&&&&
(PORT+1,PORT)&-(AX)(字)
短格式为:&&&&
OUT&& DX,AL(字节)
&&&&&&&&&&&&&
OUT&& DX,AX(字)
执行的操作:&&
((DX))&-(AL)(字节)
&&&&&&&&&&&&&
((DX)+1,(DX))&-AX(字)
在IBM-PC机里,外部设备最多可有65536个I/O端口,端口(即外设的端口地址)为0000~FFFFH.其中前256个端口(0~FFH)可以
直接在指令中指定,这就是长格式中的PORT,此时机器指令用二个字节表示,第二个字节就是端口号.所以用长格式时可以在指定中直接指定端口号,但只限于
前256个端口.当端口号&=256时,只能使用短格式,此时,必须先把端口号放到DX寄存器中(端口号可以从0000到0FFFFH),然后再用
IN或OUT指令来 传送信息. .XLAT&&
格式为:&&&&
XLAT&& OPR
或:&&&&&&&&
执行的操作:(AL)&-((BX)+(AL))
<span STYLE="CoLor: #.有效地址送寄存器指令LEA(Load
effective address)有效地址送寄存器
LDS(Load DS with Pointer)指针送寄存器和DS
LES(Load ES with Pointer)指针送寄存器和ES.LEA 有效地址送寄存器
执行的操作:(REG)&-SRC
指令把源操作数的有效地址送到指定的寄存器中..LDS 指针送寄存器和DS指令
LDS&& REG,SRC
执行的操作:(REG)&-(SRC)
&&&&&&&&&&&
(DS)&-(SRC+2)
把源操作数指定的4个相继字节送到由指令指定的寄存器及DS寄存器中.该指令常指定SI寄存器..LES
指针送寄存器和ES指令
LES&& REG,SRC
执行的操作: (REG)&-(SRC)
&&&&&&&&&&&&
(ES)&-(SRC+2)
把源操作数指定的4个相继字节送到由指令指定的寄存器及ES寄存器中.该指令常指定DI寄存器.
<span STYLE="CoLor: #.标志寄存器传送指令LAHF(Load AH with flags)标志送AH
SAHF(store AH into flags)AH送标志寄存器
PUSHF(push the flags) 标志进栈
POPF(pop the flags) 标志出栈.LAHF 标志送AH格式为:&&&&
执行的操作:(AH)&-(PWS的低字节)
AH送标志寄存器格式为:&&&&
执行的操作:(PWS的低字节)&-(AH).PUSHF 标志进栈格式为:&&&&
执行的操作:(SP)&-(SP)-2
&&&&&&&&&&&
((SP)+1,(SP))&-(PSW).POPF 标志出栈格式为:&&&&
执行的操作:(PWS)&-((SP)+1,(SP))
&&&&&&&&&&&
(SP)&-(SP+2)
二、算术指令<span STYLE="CoLor: #.加法指令ADD(add)加法
ADC(add with carry)带进位加法
INC(increment)加1.ADD&&
加法指令格式:&&&&
执行的操作:(DST)&-(SRC)+(DST).ADC&&
带进位加法指令格式:&&&&
执行的操作:(DST)&-(SRC)+(DST)+CF.ADD&&
加1指令格式:&&&&
INC&&& OPR
执行的操作:(OPR)&-(OPR)+1
<span STYLE="CoLor: #.减法指令SUB(subtract)减法
SBB(subtract with borrow)带借位减法
DEC(Decrement)减1
NEG(Negate)求补
CMP(Compare)比较.SUB&&
减法指令格式:&&
SUB&& DST,SRC
执行的操作:(DST)&-(DST)-(SRC).SBB&&
带借位减法指令格式:&&
SBB&& DST,SRC
执行的操作:(DST)&-(DST)-(SRC)-CF.DEC&&
减1指令格式:&&
执行的操作:(OPR)&-(OPR)-1.NEG&&
求补指令格式:&&
执行的操作:(OPR)&- -(OPR).CMP&&
比较指令格式:&&
CMP&& OPR1,OPR2
执行的操作:(OPR1)-(OPR2)
该指令与SUB指令一样执行减法操作,但不保存结果,只是根据结果设置条件标志西半球.
<span STYLE="CoLor: #.乘法指令MUL(Unsigned Multiple)无符号数乘法
IMUL(Signed Multiple)带符号数乘法.MUL
无符号数乘法指令格式:&&&
执行的操作:
字节操作数:(AX)&-(AL)*(SRC)
字操作数:(DX,AX)&-(AX)*(SRC).IMUL 带符号数乘法指令格式:&&&
IMUL&& SRC
执行的操作:与MUL相同,但必须是带符号数,而MUL是无符号数.
<span STYLE="CoLor: #.除法指令DIV(Unsigned divide)无符号数除法
IDIV(Signed divide)带符号数除法
CBW(Convert byte to word)字节转换为字
CWD(Contert word to double word)字转换为双字.DIV&&
无符号数除法指令格式:&&&
执行的操作:
&&字节操作:(AL)&-(AX)/(SRC)的商
&&&&&&&&&&&
(AH)&-(AX)/(SRC)的余数
(AX)&-(DX,AX)/(SRC)的商
&&&&&&&&&&&
(AX)&-(DX,AX)/(SRC)的余数.IDIV&&
带符号数除法指令
执行的操作:与DIV相同,但操作数必须是带符号数,商和余数也均为带符号数,且余数的符号与被除数的符号相同..CBW
字节转换为字指令
格式:&&& CBW
执行的操作:AL的内容符号扩展到AH.即如果(AL)的最高有效位为0,则(AH)=00;如(AL)的最高有效位为1,则(AH)=0FFH
字转换为双字指令
格式:&& CWD
执行的操作:AX的内容符号扩展到DX.即如(AX)的最高有效位为0,则(DX)=0;否则(DX)=0FFFFH.
这两条指令都不影响条件码.
三、逻辑指令<span STYLE="CoLor: #.逻辑运算指令AND(and)&&&&&&&&&&
OR(or)&&&&&&&&&&&
NOT(not)&&&&&&&&&
XOR(exclusive or)异或
TEST(test)&&&&&&&
测试.AND&&
逻辑与指令格式:&&&&
执行的操作:(DST)&-(DST)^(SRC).OR&&
逻辑或指令格式:&&&&
执行的操作:(DST)&-(DST)V(SRC).NOT&&
逻辑非指令格式:&&&&
NOT&&& OPR
执行的操作:(OPR)&-(OPR).XOR&&
异或指令格式:&&&&
执行的操作:(DST)&-(DST)V(SRC).TEST&&
测试指令格式:&&&&
执行的操作:(DST)^(SRC)
两个操作数相与的结果不保存,只根据其特征置条件码<span STYLE="CoLor: #.移位指令SHL(shift logical
left)&&&&&&&&&&
SAL(shift arithmetic
left)&&&&&&
SHR(shift logical
right)&&&&&&&&
SAR(shift arithmetic
right)&&&&&
ROL(Rotate
left)&&&&&&&&&&&&&&&&&
ROR(Rotate
right)&&&&&&&&&&&&&&&&
RCL(Rotate left through carry)&&
带进位循环左移
RCR(Rotate right through carry) 带进位循环右移格式:&&&&
SHL&& OPR,CNT(其余的类似)
其中OPR可以是除立即数以外的任何寻址方式.移位次数由CNT决定,CNT可以是1或CL.
循环移位指令可以改变操作数中所有位的位置;移位指令则常常用来做乘以2除以2操作.其中算术移位指令适用于带符号数运算,SAL用来乘2,SAR用来除以2;而逻辑移位指令则用来无符号数运算,SHL用来乘2,SHR用来除以2.
四、串处理指令1.与REP相配合工作的MOVS,STOS和LODS指令
.REP重复串操作直到(CX)=0为上
格式:&&REP&&&
string primitive
其中String Primitive可为MOVS,LODS或STOS指令
执行的操作:
1)如(CX)=0则退出REP,否则往下执行.
2)(CX)&-(CX)-1
3)执行其中的串操作
4)重复1)~3).MOVS&&
串传送指令
格式:可有三种
&&&&MOVS&&
MOVSB(字节)
其中第二、三种格式明确地注明是传送字节或字,第一种格式则应在操作数中表明是字还是字节操作,例如:
&&&&&&&&&&&&MOVS&&&&
ES:BYTE PTR[DI],DS:[SI]
执行的操作:
1)((DI))&-((SI))
2)字节操作:
(SI)&-(SI)+(或-)1,(DI)&-(DI)+(或-)1
当方向标志DF=0时用+,当方向标志DF=1时用-
(SI)&-(SI)+(或-)2,(DI)&-(DI)+(或-)2
当方向标志DF=0时用+,当方向标志DF=1时用-
该指令不影响条件码..CLD(Clear
direction flag)该指令使DF=0,在执行串操作指令时可使地址自动增量;
.STD(Set direction flag)该指令使DF=1,在执行串操作指令时可使地址自动减量.
存入串指令
STOS&& DST
STOSB(字节)
执行的操作:
字节操作:((DI))&-(AL),(DI)&-(DI)+-1
((DI))&-(AX),(DI)&-(DI)+-2
该指令把AL或AX的内容存入由(DI)指定的附加段的某单元中,并根据DF的值及数据类型修改DI的内容,当它与REP联用时,可把AL或AX的内容存入一个长度为(CX)的缓冲区中.
从串取指令
LODS&& SRC
执行的操作:
字节操作:(AL)&-((SI)),(SI)&-(SI)+-1
字操作: (AX)&-((SI)),(SI)&-(SI)+-2
该指令把由(SI)指定的数据段中某单元的内容送到AL或AX中,并根据方向标志及数据类型修改SI的内容.指令允许使用段跨越前缀来指定非数据段的存储区.该指令也不影响条件码.
一般说来,该指令不和REP联用.有时缓冲区中的一串字符需要逐次取出来测试时,可使用本指令.
2.与REPE/REPZ和REPNZ/REPNE联合工作的CMPS和SCAS指令.REPE/REPZ&&
当相等/为零时重复串操作格式:&&&&&
REPE(或REPZ)&&&&
String Primitive
其中String
Primitive可为CMPS或SCAS指令.
执行的操作:
<span STYLE="CoLor: #)如(CX)=0或ZF=0(即某次比较的结果两个操作数不等)时退出,否则往下执行
<span STYLE="CoLor: #)(CX)&-(CX)-1
<span STYLE="CoLor: #)执行其后的串指令
<span STYLE="CoLor: #)重复1)~3)
.REPNE/REPNZ&&
当不相等/不为零时重复串操作
格式:&&&&&
REPNE(或REPNZ)&&&
String Primitive
其中String
Primitive可为CMPS或SCAS指令
执行的操作:
除退出条件(CX=0)或ZF=1外,其他操作与REPE完全相同.
串比较指令
格式:&&&&&
&&&&&&&&&&
&&&&&&&&&&
执行的操作:
<span STYLE="CoLor: #)((SI))-((DI))
<span STYLE="CoLor: #)字节操作:(SI)&-(SI)+-1,(DI)&-(DI)+-1
(SI)&-(SI)+-2,(DI)&-(DI)+-2
指令把由(SI)指向的数据段中的一个字(或字节)与由(DI)指向的附加段中的一个字(或字节)相减,但不保存结果,只根据结果设置条件码,指令的其它特性和MOVS指令的规定相同.
串扫描指令格式:&&&
执行的操作:
字节操作:(AL)-((DI)),(DI)&-(DI)+-1
(AL)-((DI)),(DI)&-(DI)+-2
该指令把AL(或AX)的内容与由(DI)指定的在附加段中的一个字节(或字)进行比较,并不保存结果,只根据结果置条件码.指令的其他特性和MOVS的规定相同.
五、控制转移指令
&&1.无条件转移指令.JMP(jmp)&&
跳转指令<span STYLE="CoLor: #)段内直接短转移格式:JMP&& SHORT
执行的操作:(IP)&-(IP)+8位位移量
2)段内直接近转移格式:JMP&& NEAR
执行的操作:(IP)&-(IP)+16位位移量
3)段内间接转移格式:JMP&& WORD
执行的操作:(IP)&-(EA)
4)段间直接(远)转移格式:JMP&& FAR PTR
执行的操作:(IP)&-OPR的段内偏移地址
&&&&&&&&&&&
(CS)&-OPR所在段的段地址
5)段间间接转移
格式:JMP&& DWORD
执行的操作:(IP)&-(EA)
&&&&&&&&&&&
(CS)&-(EA+2)
2.条件转移指令<span STYLE="CoLor: #)根据单个条件标志的设置情况转移.JZ(或JE)(Jump if zero,or
结果为零(或相等)则转移格式:JE(或JZ)&&
测试条件:ZF=1
.JNZ(或JNE)(Jump if not zero,or not
equal) 结果不为零(或不相等)则转移格式:JNZ(或JNE)&&
测试条件:ZF=0
.JS(Jump if
结果为负则转移格式:&&
测试条件:SF=1
.JNS(Jump if not
结果为正则转移格式:JNS&&
测试条件:SF=0
.JO(Jump if
overflow)&&
溢出则转移格式:&&&
测试条件:OF=1
.JNO(Jump if not
overflow)&&
不溢出则转移格式:&&&
测试条件:OF=0
.JP(或JPE)(Jump if parity,or parity
even) 奇偶位为1则转移格式:&&&
测试条件:PF=1
.JNP(或JPO)(Jump if not parity,or
parity odd) 奇偶位为0则转移格式:&&&
JNP(或JPO)&& OPR
测试条件:PF=0
.JB(或JNAE,JC)(Jump if below,or not
above or equal,or carry)
低于,或者不高于或等于,或进位位为1则转移格式:JB(或JNAE,JC)&&
测试条件:CF=1
.JNB(或JAE,JNC)(Jump if not below,or
above or equal,or not carry)
不低于,或者高于或者等于,或进位位为0则转移格式:JNB(或JAE,JNC)&&
测试条件:CF=0
2)比较两个无符号数,并根据比较的结果转移.JB(或JNAE,JC)格式:同上
.JNB(或JAE,JNC)格式:同上
.JBE(或JNA)(Jump if below or equal,or
not above) 低于或等于,或不高于则转移格式:JBE(或JNA)&&
测试条件:CFVZF=1
.JNBE(或JA)(Jump if not below or
equal,or above) 不低于或等于,或者高于则转移格式:JNBE(或JA)&&
测试条件:CFVZF=0
3)比较两个带符号数,并根据比较的结果转移
.JL(或LNGE)(Jump if less,or not greater
or equal) 小于,或者不大于或者等于则转移格式:JL(或JNGE)&&
测试条件:SFVOF=1
.JNL(或JGE)(Jump if not less,or greater
or equal)不小于,或者大于或者等于则转移格式:JNL(或JGE)&&
测试条件:SFVOF=0
.JLE(或JNG)(Jump if less or equal,or
not greater) 小于或等于,或者不大于则转移格式:JLE(或JNG)&&
测试条件:(SFVOF)VZF=1
.JNLE(或JG)(Jump if not less or
equal,or greater) 不小于或等于,或者大于则转移格式:JNLE(或JG)&&
测试条件:(SFVOF)VZF=0
<span STYLE="CoLor: #)测试CX的值为0则转移指令.JCXZ(Jump if CX register is
CX寄存器的内容为零则转移
格式:JCXZ&& OPR
测试条件:(CX)=0注:条件转移全为8位短跳!
3.循环指令.LOOP
格式: LOOP&& OPR
测试条件:(CX)&&0
.LOOPZ/LOOPE
当为零或相等时循环指令
格式: LOOPZ(或LOOPE)&& OPR
测试条件:(CX)&&0且ZF=1.LOOPNZ/LOOPNE 当不为零或不相等时循环指令
格式: LOOPNZ(或LOOPNE)&& OPR
测试条件:(CX)&&0且ZF=0这三条指令的步骤是:
1)(CX)&-(CX)-1
2)检查是否满足测试条件,如满足则(IP)&-(IP)+D8的符号扩充.
4.子程序.CALL调用指令
.RET返回指令
.INT指令格式:&&&&
INT&& TYPE
执行的操作:(SP)&-(SP)-2
&&&&&&&&&&&
((SP)+1,(SP))&-(PSW)
&&&&&&&&&&&
(SP)&-(SP)-2
&&&&&&&&&&&
((SP)+1,(SP))&-(CS)
&&&&&&&&&&&
(SP)&-(SP)-2
&&&&&&&&&&&
((SP)+1,(SP))&-(IP)
&&&&&&&&&&&
(IP)&-(TYPE*4)
&&&&&&&&&&&
(CS)&-(TYPE*4+2).INTO&&
若溢出则中断执行的操作:若OF=1则:
&&&&&&&&&&&
(SP)&-(SP)-2
&&&&&&&&&&&
((SP)+1,(SP))&-(PSW)
&&&&&&&&&&&
(SP)&-(SP)-2
&&&&&&&&&&&
((SP)+1,(SP))&-(CS)
&&&&&&&&&&&
(SP)&-(SP)-2
&&&&&&&&&&&
((SP)+1,(SP))&-(IP)
&&&&&&&&&&&
(IP)&-(10H)
&&&&&&&&&&&
(CS)&-(12H).IRET&&&&
从中断返回指令格式:&&&&&
执行的操作:(IP)&-((SP)+1,(SP))
&&&&&&&&&&&
(SP)&-(SP)+2
&&&&&&&&&&&
(CS)&-((SP)+1,(SP))
&&&&&&&&&&&
(SP)&-(SP)+2
&&&&&&&&&&&
(PSW)&-((SP)+1,(SP))
&&&&&&&&&&&
(SP)&-(SP)+2
六、处理机控制指令1.标志处理指令.CLC进位位置0指令(Clear carry)CF&-0
.CMC进位位求反指令(Complement carry)CF&-CF
.STC进位位置1指令(Set
carry)CF&-1
.CLD方向标志置0指令(Clear direction)DF&-0
.STD方向标志置1指令(Set
direction)DF&-1
.CLI中断标志置0指令(Clear
interrupt)IF&-0
.STI中断标志置1指令(Set
interrupt)IF&-0
2.其他处理机控制指令NOP(No
Opreation)&&&
HLT(Halt)&&&&&&&&&&&
WAIT(Wait)&&&&&&&&&&
ESC(Escape)&&&&&&&&&
LOCK(Lock)&&&&&&&&&&
封锁这些指令可以控制处理机状态.这们都不影响条件码..NOP
无操作指令&&&&
该指令不执行任何操作,其机器码占有一个字节,在调试程序时往往用这条指令占有一定的存储单元,以便在正式运行时用其他指令取代..HLT停机指令
该指令可使机器暂停工作,使处理机处于停机状态以便等待一次外部中断到来,中断结束后可继续执行下面的程序..WAIT等待指令
该指令使处理机处于空转状态,它也可以用来等待外部中断的发生,但中断结束后仍返回WAIT指令继续德行..ESC换码指令
格式ESC&& mem
其中mem指出一个存储单元,ESC指令把该存储单元的内容送到数据总线去.当然ESC指令不允许使用立即数和寄存器寻址方式.这条指令在使用协处理机
(Coprocessor)执行某些操作时,可从存储器指得指令或操作数.协处理机(如8087)则是为了提高速度而可以选配的硬件.
.LOCK封锁指令
该指令是一种前缀,它可与其他指令联合,用来维持总线的锁存信号直到与其联合的指令执行完为止.当CPU与其他处理机协同工作时,该指令可避免破坏有用信息.
一、数据传送指令<span STYLE="CoLor: #.通用数据传送指令MOV(Move)传送
PUSH(Push onto the stack)进栈
POP(Pop from the stack)出栈
XCHG(Exchange)交换.MOV指令
格式为: MOV&& DST,SRC
执行的操作:(DST)&-(SRC).PUSH进栈指令
格式为:PUSH&& SRC
执行的操作:(SP)&-(SP)-2
&&&&&&&&&&&
((SP)+1,(SP))&-(SRC).POP出栈指令
格式为:POP&& DST
执行的操作:(DST)&-((SP+1),(SP))
&&&&&&&&&&&
(SP)&-(SP)+2.XCHG 交换指令
格式为:XCHG&& OPR1,OPR2
执行的操作:(OPR1)&--&(OPR2)
<span STYLE="CoLor: #.累加器专用传送指令IN(Input)&&
OUT(Output)&& 输出
XLAT(Translate)&& 换码
这组指令只限于使用累加器AX或AL传送信息..IN
长格式为:&&&&
IN&& AL,PORT(字节)
IN&& AX,PORT(字)
执行的操作:&&
(AL)&-(PORT)(字节)
&&&&&&&&&&&&&
(AX)&-(PORT+1,PORT)(字)
短格式为:&&&&
IN&& AL,DX(字节)
&&&&&&&&&&&&&
IN&& AX,DX(字)
执行的操作:&&
AL&-((DX))(字节)
&&&&&&&&&&&&&
AX&-((DX)+1,DX)(字).OUT 输出指令
长格式为:&&&&
OUT&& PORT,AL(字节)
&&&&&&&&&&&&&
PORT,AX(字)
执行的操作:&&
(PORT)&-(AL)(字节)
&&&&&&&&&&&&&
(PORT+1,PORT)&-(AX)(字)
短格式为:&&&&
OUT&& DX,AL(字节)
&&&&&&&&&&&&&
OUT&& DX,AX(字)
执行的操作:&&
((DX))&-(AL)(字节)
&&&&&&&&&&&&&
((DX)+1,(DX))&-AX(字)
在IBM-PC机里,外部设备最多可有65536个I/O端口,端口(即外设的端口地址)为0000~FFFFH.其中前256个端口(0~FFH)可以
直接在指令中指定,这就是长格式中的PORT,此时机器指令用二个字节表示,第二个字节就是端口号.所以用长格式时可以在指定中直接指定端口号,但只限于
前256个端口.当端口号&=256时,只能使用短格式,此时,必须先把端口号放到DX寄存器中(端口号可以从0000到0FFFFH),然后再用
IN或OUT指令来 传送信息. .XLAT&&
格式为:&&&&
XLAT&& OPR
或:&&&&&&&&
执行的操作:(AL)&-((BX)+(AL))
<span STYLE="CoLor: #.有效地址送寄存器指令LEA(Load
effective address)有效地址送寄存器
LDS(Load DS with Pointer)指针送寄存器和DS
LES(Load ES with Pointer)指针送寄存器和ES.LEA 有效地址送寄存器
执行的操作:(REG)&-SRC
指令把源操作数的有效地址送到指定的寄存器中..LDS 指针送寄存器和DS指令
LDS&& REG,SRC
执行的操作:(REG)&-(SRC)
&&&&&&&&&&&
(DS)&-(SRC+2)
把源操作数指定的4个相继字节送到由指令指定的寄存器及DS寄存器中.该指令常指定SI寄存器..LES
指针送寄存器和ES指令
LES&& REG,SRC
执行的操作: (REG)&-(SRC)
&&&&&&&&&&&&
(ES)&-(SRC+2)
把源操作数指定的4个相继字节送到由指令指定的寄存器及ES寄存器中.该指令常指定DI寄存器.
<span STYLE="CoLor: #.标志寄存器传送指令LAHF(Load AH with flags)标志送AH
SAHF(store AH into flags)AH送标志寄存器
PUSHF(push the flags) 标志进栈
POPF(pop the flags) 标志出栈.LAHF 标志送AH格式为:&&&&
执行的操作:(AH)&-(PWS的低字节)
AH送标志寄存器格式为:&&&&
执行的操作:(PWS的低字节)&-(AH).PUSHF 标志进栈格式为:&&&&
执行的操作:(SP)&-(SP)-2
&&&&&&&&&&&
((SP)+1,(SP))&-(PSW).POPF 标志出栈格式为:&&&&
执行的操作:(PWS)&-((SP)+1,(SP))
&&&&&&&&&&&
(SP)&-(SP+2)
二、算术指令<span STYLE="CoLor: #.加法指令ADD(add)加法
ADC(add with carry)带进位加法
INC(increment)加1.ADD&&
加法指令格式:&&&&
执行的操作:(DST)&-(SRC)+(DST).ADC&&
带进位加法指令格式:&&&&
执行的操作:(DST)&-(SRC)+(DST)+CF.ADD&&
加1指令格式:&&&&
INC&&& OPR
执行的操作:(OPR)&-(OPR)+1
<span STYLE="CoLor: #.减法指令SUB(subtract)减法
SBB(subtract with borrow)带借位减法
DEC(Decrement)减1
NEG(Negate)求补
CMP(Compare)比较.SUB&&
减法指令格式:&&
SUB&& DST,SRC
执行的操作:(DST)&-(DST)-(SRC).SBB&&
带借位减法指令格式:&&
SBB&& DST,SRC
执行的操作:(DST)&-(DST)-(SRC)-CF.DEC&&
减1指令格式:&&
执行的操作:(OPR)&-(OPR)-1.NEG&&
求补指令格式:&&
执行的操作:(OPR)&- -(OPR).CMP&&
比较指令格式:&&
CMP&& OPR1,OPR2
执行的操作:(OPR1)-(OPR2)
该指令与SUB指令一样执行减法操作,但不保存结果,只是根据结果设置条件标志西半球.
<span STYLE="CoLor: #.乘法指令MUL(Unsigned Multiple)无符号数乘法
IMUL(Signed Multiple)带符号数乘法.MUL
无符号数乘法指令格式:&&&
执行的操作:
字节操作数:(AX)&-(AL)*(SRC)
字操作数:(DX,AX)&-(AX)*(SRC).IMUL 带符号数乘法指令格式:&&&
IMUL&& SRC
执行的操作:与MUL相同,但必须是带符号数,而MUL是无符号数.
<span STYLE="CoLor: #.除法指令DIV(Unsigned divide)无符号数除法
IDIV(Signed divide)带符号数除法
CBW(Convert byte to word)字节转换为字
CWD(Contert word to double word)字转换为双字.DIV&&
无符号数除法指令格式:&&&
执行的操作:
&&字节操作:(AL)&-(AX)/(SRC)的商
&&&&&&&&&&&
(AH)&-(AX)/(SRC)的余数
(AX)&-(DX,AX)/(SRC)的商
&&&&&&&&&&&
(AX)&-(DX,AX)/(SRC)的余数.IDIV&&
带符号数除法指令
执行的操作:与DIV相同,但操作数必须是带符号数,商和余数也均为带符号数,且余数的符号与被除数的符号相同..CBW
字节转换为字指令
格式:&&& CBW
执行的操作:AL的内容符号扩展到AH.即如果(AL)的最高有效位为0,则(AH)=00;如(AL)的最高有效位为1,则(AH)=0FFH
字转换为双字指令
格式:&& CWD
执行的操作:AX的内容符号扩展到DX.即如(AX)的最高有效位为0,则(DX)=0;否则(DX)=0FFFFH.
这两条指令都不影响条件码.
三、逻辑指令<span STYLE="CoLor: #.逻辑运算指令AND(and)&&&&&&&&&&
OR(or)&&&&&&&&&&&
NOT(not)&&&&&&&&&
XOR(exclusive or)异或
TEST(test)&&&&&&&
测试.AND&&
逻辑与指令格式:&&&&
执行的操作:(DST)&-(DST)^(SRC).OR&&
逻辑或指令格式:&&&&
执行的操作:(DST)&-(DST)V(SRC).NOT&&
逻辑非指令格式:&&&&
NOT&&& OPR
执行的操作:(OPR)&-(OPR).XOR&&
异或指令格式:&&&&
执行的操作:(DST)&-(DST)V(SRC).TEST&&
测试指令格式:&&&&
执行的操作:(DST)^(SRC)
两个操作数相与的结果不保存,只根据其特征置条件码<span STYLE="CoLor: #.移位指令SHL(shift logical
left)&&&&&&&&&&
SAL(shift arithmetic
left)&&&&&&
SHR(shift logical
right)&&&&&&&&
SAR(shift arithmetic
right)&&&&&
ROL(Rotate
left)&&&&&&&&&&&&&&&&&
ROR(Rotate
right)&&&&&&&&&&&&&&&&
RCL(Rotate left through carry)&&
带进位循环左移
RCR(Rotate right through carry) 带进位循环右移格式:&&&&
SHL&& OPR,CNT(其余的类似)
其中OPR可以是除立即数以外的任何寻址方式.移位次数由CNT决定,CNT可以是1或CL.
循环移位指令可以改变操作数中所有位的位置;移位指令则常常用来做乘以2除以2操作.其中算术移位指令适用于带符号数运算,SAL用来乘2,SAR用来除以2;而逻辑移位指令则用来无符号数运算,SHL用来乘2,SHR用来除以2.
四、串处理指令1.与REP相配合工作的MOVS,STOS和LODS指令
.REP重复串操作直到(CX)=0为上
格式:&&REP&&&
string primitive
其中String Primitive可为MOVS,LODS或STOS指令
执行的操作:
1)如(CX)=0则退出REP,否则往下执行.
2)(CX)&-(CX)-1
3)执行其中的串操作
4)重复1)~3).MOVS&&
串传送指令
格式:可有三种
&&&&MOVS&&
MOVSB(字节)
其中第二、三种格式明确地注明是传送字节或字,第一种格式则应在操作数中表明是字还是字节操作,例如:
&&&&&&&&&&&&MOVS&&&&
ES:BYTE PTR[DI],DS:[SI]
执行的操作:
1)((DI))&-((SI))
2)字节操作:
(SI)&-(SI)+(或-)1,(DI)&-(DI)+(或-)1
当方向标志DF=0时用+,当方向标志DF=1时用-
(SI)&-(SI)+(或-)2,(DI)&-(DI)+(或-)2
当方向标志DF=0时用+,当方向标志DF=1时用-
该指令不影响条件码..CLD(Clear
direction flag)该指令使DF=0,在执行串操作指令时可使地址自动增量;
.STD(Set direction flag)该指令使DF=1,在执行串操作指令时可使地址自动减量.
存入串指令
STOS&& DST
STOSB(字节)
执行的操作:
字节操作:((DI))&-(AL),(DI)&-(DI)+-1
((DI))&-(AX),(DI)&-(DI)+-2
该指令把AL或AX的内容存入由(DI)指定的附加段的某单元中,并根据DF的值及数据类型修改DI的内容,当它与REP联用时,可把AL或AX的内容存入一个长度为(CX)的缓冲区中.
从串取指令
LODS&& SRC
执行的操作:
字节操作:(AL)&-((SI)),(SI)&-(SI)+-1
字操作: (AX)&-((SI)),(SI)&-(SI)+-2
该指令把由(SI)指定的数据段中某单元的内容送到AL或AX中,并根据方向标志及数据类型修改SI的内容.指令允许使用段跨越前缀来指定非数据段的存储区.该指令也不影响条件码.
一般说来,该指令不和REP联用.有时缓冲区中的一串字符需要逐次取出来测试时,可使用本指令.
2.与REPE/REPZ和REPNZ/REPNE联合工作的CMPS和SCAS指令.REPE/REPZ&&
当相等/为零时重复串操作格式:&&&&&
REPE(或REPZ)&&&&
String Primitive
其中String
Primitive可为CMPS或SCAS指令.
执行的操作:
<span STYLE="CoLor: #)如(CX)=0或ZF=0(即某次比较的结果两个操作数不等)时退出,否则往下执行
<span STYLE="CoLor: #)(CX)&-(CX)-1
<span STYLE="CoLor: #)执行其后的串指令
<span STYLE="CoLor: #)重复1)~3)
.REPNE/REPNZ&&
当不相等/不为零时重复串操作
格式:&&&&&
REPNE(或REPNZ)&&&
String Primitive
其中String
Primitive可为CMPS或SCAS指令
执行的操作:
除退出条件(CX=0)或ZF=1外,其他操作与REPE完全相同.
串比较指令
格式:&&&&&
&&&&&&&&&&
&&&&&&&&&&
执行的操作:
<span STYLE="CoLor: #)((SI))-((DI))
<span STYLE="CoLor: #)字节操作:(SI)&-(SI)+-1,(DI)&-(DI)+-1
(SI)&-(SI)+-2,(DI)&-(DI)+-2
指令把由(SI)指向的数据段中的一个字(或字节)与由(DI)指向的附加段中的一个字(或字节)相减,但不保存结果,只根据结果设置条件码,指令的其它特性和MOVS指令的规定相同.
串扫描指令格式:&&&
执行的操作:
字节操作:(AL)-((DI)),(DI)&-(DI)+-1
(AL)-((DI)),(DI)&-(DI)+-2
该指令把AL(或AX)的内容与由(DI)指定的在附加段中的一个字节(或字)进行比较,并不保存结果,只根据结果置条件码.指令的其他特性和MOVS的规定相同.
五、控制转移指令
&&1.无条件转移指令.JMP(jmp)&&
跳转指令<span STYLE="CoLor: #)段内直接短转移格式:JMP&& SHORT
执行的操作:(IP)&-(IP)+8位位移量
2)段内直接近转移格式:JMP&& NEAR
执行的操作:(IP)&-(IP)+16位位移量
3)段内间接转移格式:JMP&& WORD
执行的操作:(IP)&-(EA)
4)段间直接(远)转移格式:JMP&& FAR PTR
执行的操作:(IP)&-OPR的段内偏移地址
&&&&&&&&&&&
(CS)&-OPR所在段的段地址
5)段间间接转移
格式:JMP&& DWORD
执行的操作:(IP)&-(EA)
&&&&&&&&&&&
(CS)&-(EA+2)
2.条件转移指令<span STYLE="CoLor: #)根据单个条件标志的设置情况转移.JZ(或JE)(Jump if zero,or
结果为零(或相等)则转移格式:JE(或JZ)&&
测试条件:ZF=1
.JNZ(或JNE)(Jump if not zero,or not
equal) 结果不为零(或不相等)则转移格式:JNZ(或JNE)&&
测试条件:ZF=0
.JS(Jump if
结果为负则转移格式:&&
测试条件:SF=1
.JNS(Jump if not
结果为正则转移格式:JNS&&
测试条件:SF=0
.JO(Jump if
overflow)&&
溢出则转移格式:&&&
测试条件:OF=1
.JNO(Jump if not
overflow)&&
不溢出则转移格式:&&&
测试条件:OF=0
.JP(或JPE)(Jump if parity,or parity
even) 奇偶位为1则转移格式:&&&
测试条件:PF=1
.JNP(或JPO)(Jump if not parity,or
parity odd) 奇偶位为0则转移格式:&&&
JNP(或JPO)&& OPR
测试条件:PF=0
.JB(或JNAE,JC)(Jump if below,or not
above or equal,or carry)
低于,或者不高于或等于,或进位位为1则转移格式:JB(或JNAE,JC)&&
测试条件:CF=1
.JNB(或JAE,JNC)(Jump if not below,or
above or equal,or not carry)
不低于,或者高于或者等于,或进位位为0则转移格式:JNB(或JAE,JNC)&&
测试条件:CF=0
2)比较两个无符号数,并根据比较的结果转移.JB(或JNAE,JC)格式:同上
.JNB(或JAE,JNC)格式:同上
.JBE(或JNA)(Jump if below or equal,or
not above) 低于或等于,或不高于则转移格式:JBE(或JNA)&&
测试条件:CFVZF=1
.JNBE(或JA)(Jump if not below or
equal,or above) 不低于或等于,或者高于则转移格式:JNBE(或JA)&&
测试条件:CFVZF=0
3)比较两个带符号数,并根据比较的结果转移
.JL(或LNGE)(Jump if less,or not greater
or equal) 小于,或者不大于或者等于则转移格式:JL(或JNGE)&&
测试条件:SFVOF=1
.JNL(或JGE)(Jump if not less,or greater
or equal)不小于,或者大于或者等于则转移格式:JNL(或JGE)&&
测试条件:SFVOF=0
.JLE(或JNG)(Jump if less or equal,or
not greater) 小于或等于,或者不大于则转移格式:JLE(或JNG)&&
测试条件:(SFVOF)VZF=1
.JNLE(或JG)(Jump if not less or
equal,or greater) 不小于或等于,或者大于则转移格式:JNLE(或JG)&&
测试条件:(SFVOF)VZF=0
<span STYLE="CoLor: #)测试CX的值为0则转移指令.JCXZ(Jump if CX register is
CX寄存器的内容为零则转移
格式:JCXZ&& OPR
测试条件:(CX)=0注:条件转移全为8位短跳!
3.循环指令.LOOP
格式: LOOP&& OPR
测试条件:(CX)&&0
.LOOPZ/LOOPE
当为零或相等时循环指令
格式: LOOPZ(或LOOPE)&& OPR
测试条件:(CX)&&0且ZF=1.LOOPNZ/LOOPNE 当不为零或不相等时循环指令
格式: LOOPNZ(或LOOPNE)&& OPR
测试条件:(CX)&&0且ZF=0这三条指令的步骤是:
1)(CX)&-(CX)-1
2)检查是否满足测试条件,如满足则(IP)&-(IP)+D8的符号扩充.
4.子程序.CALL调用指令
.RET返回指令
.INT指令格式:&&&&
INT&& TYPE
执行的操作:(SP)&-(SP)-2
&&&&&&&&&&&
((SP)+1,(SP))&-(PSW)
&&&&&&&&&&&
(SP)&-(SP)-2
&&&&&&&&&&&
((SP)+1,(SP))&-(CS)
&&&&&&&&&&&
(SP)&-(SP)-2
&&&&&&&&&&&
((SP)+1,(SP))&-(IP)
&&&&&&&&&&&
(IP)&-(TYPE*4)
&&&&&&&&&&&
(CS)&-(TYPE*4+2).INTO&&
若溢出则中断执行的操作:若OF=1则:
&&&&&&&&&&&
(SP)&-(SP)-2
&&&&&&&&&&&
((SP)+1,(SP))&-(PSW)
&&&&&&&&&&&
(SP)&-(SP)-2
&&&&&&&&&&&
((SP)+1,(SP))&-(CS)
&&&&&&&&&&&
(SP)&-(SP)-2
&&&&&&&&&&&
((SP)+1,(SP))&-(IP)
&&&&&&&&&&&
(IP)&-(10H)
&&&&&&&&&&&
(CS)&-(12H).IRET&&&&
从中断返回指令格式:&&&&&
执行的操作:(IP)&-((SP)+1,(SP))
&&&&&&&&&&&
(SP)&-(SP)+2
&&&&&&&&&&&
(CS)&-((SP)+1,(SP))
&&&&&&&&&&&
(SP)&-(SP)+2
&&&&&&&&&&&
(PSW)&-((SP)+1,(SP))
&&&&&&&&&&&
(SP)&-(SP)+2
六、处理机控制指令1.标志处理指令.CLC进位位置0指令(Clear carry)CF&-0
.CMC进位位求反指令(Complement carry)CF&-CF
.STC进位位置1指令(Set
carry)CF&-1
.CLD方向标志置0指令(Clear direction)DF&-0
.STD方向标志置1指令(Set
direction)DF&-1
.CLI中断标志置0指令(Clear
interrupt)IF&-0
.STI中断标志置1指令(Set
interrupt)IF&-0
2.其他处理机控制指令NOP(No
Opreation)&&&
HLT(Halt)&&&&&&&&&&&
WAIT(Wait)&&&&&&&&&&
ESC(Escape)&&&&&&&&&
LOCK(Lock)&&&&&&&&&&
封锁这些指令可以控制处理机状态.这们都不影响条件码..NOP
无操作指令&&&&
该指令不执行任何操作,其机器码占有一个字节,在调试程序时往往用这条指令占有一定的存储单元,以便在正式运行时用其他指令取代..HLT停机指令
该指令可使机器暂停工作,使处理机处于停机状态以便等待一次外部中断到来,中断结束后可继续执行下面的程序..WAIT等待指令
该指令使处理机处于空转状态,它也可以用来等待外部中断的发生,但中断结束后仍返回WAIT指令继续德行..ESC换码指令
格式ESC&& mem
其中mem指出一个存储单元,ESC指令把该存储单元的内容送到数据总线去.当然ESC指令不允许使用立即数和寄存器寻址方式.这条指令在使用协处理机
(Coprocessor)执行某些操作时,可从存储器指得指令或操作数.协处理机(如8087)则是为了提高速度而可以选配的硬件.
.LOCK封锁指令
该指令是一种前缀,它可与其他指令联合,用来维持总线的锁存信号直到与其联合的指令执行完为止.当CPU与其他处理机协同工作时,该指令可避免破坏有用信息.
一、数据传送指令
1.通用数据传送指令
MOV(Move)传送
PUSH(Push onto the stack)进栈
POP(Pop from the stack)出栈
XCHG(Exchange)交换
格式为: MOV&& DST,SRC
执行的操作:(DST)&-(SRC)
.PUSH进栈指令
格式为:PUSH&& SRC
执行的操作:(SP)&-(SP)-2
&&&&&&&&&&&
((SP)+1,(SP))&-(SRC)
.POP出栈指令
格式为:POP&& DST
执行的操作:(DST)&-((SP+1),(SP))
&&&&&&&&&&&
(SP)&-(SP)+2
.XCHG 交换指令
格式为:XCHG&& OPR1,OPR2
执行的操作:(OPR1)&--&(OPR2)
2.累加器专用传送指令
IN(Input)&& 输入
OUT(Output)&& 输出
XLAT(Translate)&& 换码
这组指令只限于使用累加器AX或AL传送信息.
.IN 输入指令
长格式为:&&&&
IN&& AL,PORT(字节)
IN&& AX,PORT(字)
执行的操作:&&
(AL)&-(PORT)(字节)
&&&&&&&&&&&&&
(AX)&-(PORT+1,PORT)(字)
短格式为:&&&&
IN&& AL,DX(字节)
&&&&&&&&&&&&&
IN&& AX,DX(字)
执行的操作:&&
AL&-((DX))(字节)
&&&&&&&&&&&&&
AX&-((DX)+1,DX)(字)
.OUT 输出指令
长格式为:&&&&
OUT&& PORT,AL(字节)
&&&&&&&&&&&&&
PORT,AX(字)
执行的操作:&&
(PORT)&-(AL)(字节)
&&&&&&&&&&&&&
(PORT+1,PORT)&-(AX)(字)
短格式为:&&&&
OUT&& DX,AL(字节)
&&&&&&&&&&&&&
OUT&& DX,AX(字)
执行的操作:&&
((DX))&-(AL)(字节)
&&&&&&&&&&&&&
((DX)+1,(DX))&-AX(字)
在IBM-PC机里,外部设备最多可有65536个I/O端口,端口(即外设的端口地址)为0000~FFFFH.其中前256个端口(0~FFH)可以
直接在指令中指定,这就是长格式中的PORT,此时机器指令用二个字节表示,第二个字节就是端口号.所以用长格式时可以在指定中直接指定端口号,但只限于
前256个端口.当端口号&=256时,只能使用短格式,此时,必须先把端口号放到DX寄存器中(端口号可以从0000到0FFFFH),然后再用
IN或OUT指令来 传送信息.
.XLAT&& 换码指令
格式为:&&&&
XLAT&& OPR
或:&&&&&&&&
执行的操作:(AL)&-((BX)+(AL))
3.有效地址送寄存器指令
LEA(Load effective address)有效地址送寄存器
LDS(Load DS with Pointer)指针送寄存器和DS
LES(Load ES with Pointer)指针送寄存器和ES
.LEA 有效地址送寄存器
执行的操作:(REG)&-SRC
指令把源操作数的有效地址送到指定的寄存器中.
.LDS 指针送寄存器和DS指令
LDS&& REG,SRC
执行的操作:(REG)&-(SRC)
&&&&&&&&&&&
(DS)&-(SRC+2)
把源操作数指定的4个相继字节送到由指令指定的寄存器及DS寄存器中.该指令常指定SI寄存器.
.LES 指针送寄存器和ES指令
LES&& REG,SRC
执行的操作: (REG)&-(SRC)
&&&&&&&&&&&&
(ES)&-(SRC+2)
把源操作数指定的4个相继字节送到由指令指定的寄存器及ES寄存器中.该指令常指定DI寄存器.
4.标志寄存器传送指令
LAHF(Load AH with flags)标志送AH
SAHF(store AH into flags)AH送标志寄存器
PUSHF(push the flags) 标志进栈
POPF(pop the flags) 标志出栈
.LAHF 标志送AH
格式为:&&&&
执行的操作:(AH)&-(PWS的低字节)
.SAHF AH送标志寄存器
格式为:&&&&
执行的操作:(PWS的低字节)&-(AH)
.PUSHF 标志进栈
格式为:&&&&
执行的操作:(SP)&-(SP)-2
&&&&&&&&&&&
((SP)+1,(SP))&-(PSW)
.POPF 标志出栈
格式为:&&&&
执行的操作:(PWS)&-((SP)+1,(SP))
&&&&&&&&&&&
(SP)&-(SP+2)
二、算术指令
1.加法指令
ADD(add)加法
ADC(add with carry)带进位加法
INC(increment)加1
.ADD&& 加法指令
执行的操作:(DST)&-(SRC)+(DST)
.ADC&& 带进位加法指令
执行的操作:(DST)&-(SRC)+(DST)+CF
.ADD&& 加1指令
INC&&& OPR
执行的操作:(OPR)&-(OPR)+1
2.减法指令
SUB(subtract)减法
SBB(subtract with borrow)带借位减法
DEC(Decrement)减1
NEG(Negate)求补
CMP(Compare)比较
.SUB&& 减法指令
SUB&& DST,SRC
执行的操作:(DST)&-(DST)-(SRC)
.SBB&& 带借位减法指令
SBB&& DST,SRC
执行的操作:(DST)&-(DST)-(SRC)-CF
.DEC&& 减1指令
执行的操作:(OPR)&-(OPR)-1
.NEG&& 求补指令
执行的操作:(OPR)&- -(OPR)
.CMP&& 比较指令
CMP&& OPR1,OPR2
执行的操作:(OPR1)-(OPR2)
该指令与SUB指令一样执行减法操作,但不保存结果,只是根据结果设置条件标志西半球.
3.乘法指令
MUL(Unsigned Multiple)无符号数乘法
IMUL(Signed Multiple)带符号数乘法
.MUL 无符号数乘法指令
执行的操作:
字节操作数:(AX)&-(AL)*(SRC)
字操作数:(DX,AX)&-(AX)*(SRC)
.IMUL 带符号数乘法指令
IMUL&& SRC
执行的操作:与MUL相同,但必须是带符号数,而MUL是无符号数.
4.除法指令
DIV(Unsigned divide)无符号数除法
IDIV(Signed divide)带符号数除法
CBW(Convert byte to word)字节转换为字
CWD(Contert word to double word)字转换为双字
.DIV&& 无符号数除法指令
执行的操作:
& 字节操作:(AL)&-(AX)/(SRC)的商
&&&&&&&&&&&
(AH)&-(AX)/(SRC)的余数
(AX)&-(DX,AX)/(SRC)的商
&&&&&&&&&&&
(AX)&-(DX,AX)/(SRC)的余数
.IDIV&& 带符号数除法指令
执行的操作:与DIV相同,但操作数必须是带符号数,商和余数也均为带符号数,且余数的符号与被除数的符号相同.
.CBW 字节转换为字指令
格式:&&& CBW
执行的操作:AL的内容符号扩展到AH.即如果(AL)的最高有效位为0,则(AH)=00;如(AL)的最高有效位为1,则(AH)=0FFH
.CWD 字转换为双字指令
格式:&& CWD
执行的操作:AX的内容符号扩展到DX.即如(AX)的最高有效位为0,则(DX)=0;否则(DX)=0FFFFH.
这两条指令都不影响条件码.
三、逻辑指令
1.逻辑运算指令
AND(and)&&&&&&&&&&
OR(or)&&&&&&&&&&&
NOT(not)&&&&&&&&&
XOR(exclusive or)异或
TEST(test)&&&&&&&
.AND&& 逻辑与指令
执行的操作:(DST)&-(DST)^(SRC)
.OR&& 逻辑或指令
执行的操作:(DST)&-(DST)V(SRC)
.NOT&& 逻辑非指令
NOT&&& OPR
执行的操作:(OPR)&-(OPR)
.XOR&& 异或指令
执行的操作:(DST)&-(DST)V(SRC)
.TEST&& 测试指令
执行的操作:(DST)^(SRC)
两个操作数相与的结果不保存,只根据其特征置条件码
2.移位指令
SHL(shift logical
left)&&&&&&&&&&
SAL(shift arithmetic
left)&&&&&&
SHR(shift logical
right)&&&&&&&&
SAR(shift arithmetic
right)&&&&&
ROL(Rotate
left)&&&&&&&&&&&&&&&&&
ROR(Rotate
right)&&&&&&&&&&&&&&&&
RCL(Rotate left through carry)&&
带进位循环左移
RCR(Rotate right through carry) 带进位循环右移
SHL&& OPR,CNT(其余的类似)
其中OPR可以是除立即数以外的任何寻址方式.移位次数由CNT决定,CNT可以是1或CL.
循环移位指令可以改变操作数中所有位的位置;移位指令则常常用来做乘以2除以2操作.其中算术移位指令适用于带符号数运算,SAL用来乘2,SAR用来除以2;而逻辑移位指令则用来无符号数运算,SHL用来乘2,SHR用来除以2.
四、串处理指令
1.与REP相配合工作的MOVS,STOS和LODS指令
.REP重复串操作直到(CX)=0为上
REP&&& string
其中String Primitive可为MOVS,LODS或STOS指令
执行的操作:
1)如(CX)=0则退出REP,否则往下执行.
2)(CX)&-(CX)-1
3)执行其中的串操作
4)重复1)~3)
.MOVS&& 串传送指令
格式:可有三种
MOVS&& DST,SRC
MOVSB(字节)
其中第二、三种格式明确地注明是传送字节或字,第一种格式则应在操作数中表明是字还是字节操作,例如:
&&&&&&&&&&&
ES:BYTE PTR[DI],DS:[SI]
执行的操作:
1)((DI))&-((SI))
2)字节操作:
(SI)&-(SI)+(或-)1,(DI)&-(DI)+(或-)1
当方向标志DF=0时用+,当方向标志DF=1时用-
(SI)&-(SI)+(或-)2,(DI)&-(DI)+(或-)2
当方向标志DF=0时用+,当方向标志DF=1时用-
该指令不影响条件码.
.CLD(Clear direction flag)该指令使DF=0,在执行串操作指令时可使地址自动增量;
.STD(Set direction flag)该指令使DF=1,在执行串操作指令时可使地址自动减量.
.STOS&& 存入串指令
STOS&& DST
STOSB(字节)
执行的操作:
字节操作:((DI))&-(AL),(DI)&-(DI)+-1
((DI))&-(AX),(DI)&-(DI)+-2
该指令把AL或AX的内容存入由(DI)指定的附加段的某单元中,并根据DF的值及数据类型修改DI的内容,当它与REP联用时,可把AL或AX的内容存入一个长度为(CX)的缓冲区中.
.LODS&& 从串取指令
LODS&& SRC
执行的操作:
字节操作:(AL)&-((SI)),(SI)&-(SI)+-1
字操作: (AX)&-((SI)),(SI)&-(SI)+-2
该指令把由(SI)指定的数据段中某单元的内容送到AL或AX中,并根据方向标志及数据类型修改SI的内容.指令允许使用段跨越前缀来指定非数据段的存储区.该指令也不影响条件码.
一般说来,该指令不和REP联用.有时缓冲区中的一串字符需要逐次取出来测试时,可使用本指令.
2.与REPE/REPZ和REPNZ/REPNE联合工作的CMPS和SCAS指令
.REPE/REPZ&& 当相等/为零时重复串操作
格式:&&&&&
REPE(或REPZ)&&&&
String Primitive
其中String Primitive可为CMPS或SCAS指令.
执行的操作:
1)如(CX)=0或ZF=0(即某次比较的结果两个操作数不等)时退出,否则往下执行
2)(CX)&-(CX)-1
3)执行其后的串指令
4)重复1)~3)
.REPNE/REPNZ&&
当不相等/不为零时重复串操作
格式:&&&&&
REPNE(或REPNZ)&&&
String Primitive
其中String Primitive可为CMPS或SCAS指令
执行的操作:
除退出条件(CX=0)或ZF=1外,其他操作与REPE完全相同.
.CMPS&& 串比较指令
格式:&&&&&
&&&&&&&&&&
&&&&&&&&&&
执行的操作:
1)((SI))-((DI))
2)字节操作:(SI)&-(SI)+-1,(DI)&-(DI)+-1
(SI)&-(SI)+-2,(DI)&-(DI)+-2
指令把由(SI)指向的数据段中的一个字(或字节)与由(DI)指向的附加段中的一个字(或字节)相减,但不保存结果,只根据结果设置条件码,指令的其它特性和MOVS指令的规定相同.
.SCAS&& 串扫描指令
执行的操作:
字节操作:(AL)-((DI)),(DI)&-(DI)+-1
(AL)-((DI)),(DI)&-(DI)+-2
该指令把AL(或AX)的内容与由(DI)指定的在附加段中的一个字节(或字)进行比较,并不保存结果,只根据结果置条件码.指令的其他特性和MOVS的规定相同.
五、控制转移指令
& 1.无条件转移指令
.JMP(jmp)&& 跳转指令
1)段内直接短转移
格式:JMP&& SHORT OPR
执行的操作:(IP)&-(IP)+8位位移量
2)段内直接近转移
格式:JMP&& NEAR PTR OPR
执行的操作:(IP)&-(IP)+16位位移量
3)段内间接转移
格式:JMP&& WORD PTR OPR
执行的操作:(IP)&-(EA)
4)段间直接(远)转移
格式:JMP&& FAR PTR OPR
执行的操作:(IP)&-OPR的段内偏移地址
&&&&&&&&&&&
(CS)&-OPR所在段的段地址
5)段间间接转移
格式:JMP&& DWORD PTR OPR
执行的操作:(IP)&-(EA)
&&&&&&&&&&&
(CS)&-(EA+2)
2.条件转移指令
1)根据单个条件标志的设置情况转移
.JZ(或JE)(Jump if zero,or equal)&&
结果为零(或相等)则转移
格式:JE(或JZ)&& OPR
测试条件:ZF=1
.JNZ(或JNE)(Jump if not zero,or not equal) 结果不为零(或不相等)则转移
格式:JNZ(或JNE)&& OPR
测试条件:ZF=0
.JS(Jump if sign)&& 结果为负则转移
测试条件:SF=1
.JNS(Jump if not sign)&&
结果为正则转移
格式:JNS&& OPR
测试条件:SF=0
.JO(Jump if overflow)&&
溢出则转移
测试条件:OF=1
.JNO(Jump if not overflow)&&
不溢出则转移
格式:&&& JNO
测试条件:OF=0
.JP(或JPE)(Jump if parity,or parity even) 奇偶位为1则转移
测试条件:PF=1
.JNP(或JPO)(Jump if not parity,or parity odd) 奇偶位为0则转移
JNP(或JPO)&& OPR
测试条件:PF=0
.JB(或JNAE,JC)(Jump if below,or not above or equal,or carry)
低于,或者不高于或等于,或进位位为1则转移
格式:JB(或JNAE,JC)&& OPR
测试条件:CF=1
.JNB(或JAE,JNC)(Jump if not below,or above or equal,or not carry)
不低于,或者高于或者等于,或进位位为0则转移
格式:JNB(或JAE,JNC)&& OPR
测试条件:CF=0
2)比较两个无符号数,并根据比较的结果转移
.JB(或JNAE,JC)
.JNB(或JAE,JNC)
.JBE(或JNA)(Jump if below or equal,or not above) 低于或等于,或不高于则转移
格式:JBE(或JNA)&& OPR
测试条件:CFVZF=1
.JNBE(或JA)(Jump if not below or equal,or above)
不低于或等于,或者高于则转移
格式:JNBE(或JA)&& OPR
测试条件:CFVZF=0
3)比较两个带符号数,并根据比较的结果转移
.JL(或LNGE)(Jump if less,or not greater or equal)
小于,或者不大于或者等于则转移
格式:JL(或JNGE)&& OPR
测试条件:SFVOF=1
.JNL(或JGE)(Jump if not less,or greater or
equal)不小于,或者大于或者等于则转移
格式:JNL(或JGE)&& OPR
测试条件:SFVOF=0
.JLE(或JNG)(Jump if less or equal,or not greater)
小于或等于,或者不大于则转移
格式:JLE(或JNG)&& OPR
测试条件:(SFVOF)VZF=1
.JNLE(或JG)(Jump if not less or equal,or greater)
不小于或等于,或者大于则转移
格式:JNLE(或JG)&& OPR
测试条件:(SFVOF)VZF=0
4)测试CX的值为0则转移指令
.JCXZ(Jump if CX register is
zero)&& CX寄存器的内容为零则转移
格式:JCXZ&& OPR
测试条件:(CX)=0
注:条件转移全为8位短跳!
3.循环指令
.LOOP 循环指令
格式: LOOP&& OPR
测试条件:(CX)&&0
.LOOPZ/LOOPE 当为零或相等时循环指令
格式: LOOPZ(或LOOPE)&& OPR
测试条件:(CX)&&0且ZF=1
.LOOPNZ/LOOPNE 当不为零或不相等时循环指令
格式: LOOPNZ(或LOOPNE)&& OPR
测试条件:(CX)&&0且ZF=0
这三条指令的步骤是:
1)(CX)&-(CX)-1
2)检查是否满足测试条件,如满足则(IP)&-(IP)+D8的符号扩充.
.CALL调用指令
.RET返回指令
INT&& TYPE
执行的操作:(SP)&-(SP)-2
&&&&&&&&&&&
((SP)+1,(SP))&-(PSW)
&&&&&&&&&&&
(SP)&-(SP)-2
&&&&&&&&&&&
((SP)+1,(SP))&-(CS)
&&&&&&&&&&&
(SP)&-(SP)-2
&&&&&&&&&&&
((SP)+1,(SP))&-(IP)
&&&&&&&&&&&
(IP)&-(TYPE*4)
&&&&&&&&&&&
(CS)&-(TYPE*4+2)
.INTO&& 若溢出则中断
执行的操作:若OF=1则:
&&&&&&&&&&&
(SP)&-(SP)-2
&&&&&&&&&&&
((SP)+1,(SP))&-(PSW)
&&&&&&&&&&&
(SP)&-(SP)-2
&&&&&&&&&&&
((SP)+1,(SP))&-(CS)
&&&&&&&&&&&
(SP)&-(SP)-2
&&&&&&&&&&&
((SP)+1,(SP))&-(IP)
&&&&&&&&&&&
(IP)&-(10H)
&&&&&&&&&&&
(CS)&-(12H)
从中断返回指令
格式:&&&&&
执行的操作:(IP)&-((SP)+1,(SP))
&&&&&&&&&&&
(SP)&-(SP)+2
&&&&&&&&&&&
(CS)&-((SP)+1,(SP))
&&&&&&&&&&&
(SP)&-(SP)+2
&&&&&&&&&&&
(PSW)&-((SP)+1,(SP))
&&&&&&&&&&&
(SP)&-(SP)+2
六、处理机控制指令
1.标志处理指令
.CLC进位位置0指令(Clear carry)CF&-0
.CMC进位位求反指令(Complement carry)CF&-CF
.STC进位位置1指令(Set carry)CF&-1
.CLD方向标志置0指令(Clear direction)DF&-0
.STD方向标志置1指令(Set direction)DF&-1
.CLI中断标志置0指令(Clear interrupt)IF&-0
.STI中断标志置1指令(Set interrupt)IF&-0
2.其他处理机控制指令
Opreation)&&&
HLT(Halt)&&&&&&&&&&&
WAIT(Wait)&&&&&&&&&&
ESC(Escape)&&&&&&&&&
LOCK(Lock)&&&&&&&&&&
这些指令可以控制处理机状态.这们都不影响条件码.
.NOP 无操作指令
该指令不执行任何操作,其机器码占有一个字节,在调试程序时往往用这条指令占有一定的存储单元,以便在正式运行时用其他指令取代.
.HLT停机指令
该指令可使机器暂停工作,使处理机处于停机状态以便等待一次外部中断到来,中断结束后可继续执行下面的程序.
.WAIT等待指令
该指令使处理机处于空转状态,它也可以用来等待外部中断的发生,但中断结束后仍返回WAIT指令继续德行.
.ESC换码指令
格式ESC&& mem
其中mem指出一个存储单元,ESC指令把该存储单元的内容送到数据总线去.当然ESC指令不允许使用立即数和寄存器寻址方式.这条指令在使用协处理机
(Coprocessor)执行某些操作时,可从存储器指得指令或操作数.协处理机(如8087)则是为了提高速度而可以选配的硬件.
.LOCK封锁指令
该指令是一种前缀,它可与其他指令联合,用来维持总线的锁存信号直到与其联合的指令执行完为止.当CPU与其他处理机协同工作时,该指令可避免破坏有用信息.
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

我要回帖

更多关于 工程指令单格式 的文章

 

随机推荐