来自:http://blog.sina.com.cn/s/blog_4a92ce12010006m0.html
一、数据传送指令
1.通用数据传送指令
MOV(Move)传送
PUSH(Push onto the stack)进栈
POP(Pop from the stack)出栈
XCHG(Exchange)交换
.MOV指令
格式为: MOV
执行的操作:(DST)<-(SRC)
.PUSH进栈指令
格式为:PUSH
执行的操作:(SP)<-(SP)-2
.POP出栈指令
格式为:POP
执行的操作:(DST)<-((SP+1),(SP))
.XCHG 交换指令
格式为:XCHG
执行的操作:(OPR1)<-->(OPR2)
2.累加器专用传送指令
IN(Input)
OUT(Output)
XLAT(Translate)
这组指令只限于使用累加器AX或AL传送信息.
.IN 输入指令
长格式为:
执行的操作:
短格式为:
执行的操作:
.OUT 输出指令
长格式为:
执行的操作:
短格式为:
执行的操作:
.XLAT
格式为:
或:
执行的操作:(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指令
格式为:
执行的操作:(REG)<-(SRC)
.LES 指针送寄存器和ES指令
格式为:
执行的操作: (REG)<-(SRC)
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
.POPF 标志出栈
格式为:
执行的操作:(PWS)<-((SP)+1,(SP))
二、算术指令
1.加法指令
ADD(add)加法
ADC(add with carry)带进位加法
INC(increment)加1
.ADD
格式:
执行的操作:(DST)<-(SRC)+(DST)
.ADC
格式:
执行的操作:(DST)<-(SRC)+(DST)+CF
.ADD
格式:
执行的操作:(OPR)<-(OPR)+1
2.减法指令
SUB(subtract)减法
SBB(subtract with borrow)带借位减法
DEC(Decrement)减1
NEG(Negate)求补
CMP(Compare)比较
.SUB
格式:
执行的操作:(DST)<-(DST)-(SRC)
.SBB
格式:
执行的操作:(DST)<-(DST)-(SRC)-CF
.DEC
格式:
执行的操作:(OPR)<-(OPR)-1
.NEG
格式:
执行的操作:(OPR)<- -(OPR)
.CMP
格式:
执行的操作:(OPR1)-(OPR2)
3.乘法指令
MUL(Unsigned Multiple)无符号数乘法
IMUL(Signed Multiple)带符号数乘法
.MUL 无符号数乘法指令
格式:
执行的操作:
.IMUL 带符号数乘法指令
格式:
执行的操作:与MUL相同,但必须是带符号数,而MUL是无符号数.
4.除法指令
DIV(Unsigned divide)无符号数除法
IDIV(Signed divide)带符号数除法
CBW(Convert byte to word)字节转换为字
CWD(Contert word to double word)字转换为双字
.DIV
格式:
执行的操作:
.IDIV
格式:
执行的操作:与DIV相同,但操作数必须是带符号数,商和余数也均为带符号数,且余数的符号与被除数的符号相同.
.CBW 字节转换为字指令
格式:
执行的操作:AL的内容符号扩展到AH.即如果(AL)的最高有效位为0,则(AH)=00;如(AL)的最高有效位为1,则(AH)=0FFH
.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
格式:
执行的操作:(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) 带进位循环右移
格式:
其中OPR可以是除立即数以外的任何寻址方式.移位次数由CNT决定,CNT可以是1或CL.
四、串处理指令
1.与REP相配合工作的MOVS,STOS和LODS指令
.REP重复串操作直到(CX)=0为上
格式:
其中String Primitive可为MOVS,LODS或STOS指令
执行的操作:
1)如(CX)=0则退出REP,否则往下执行.
2)(CX)<-(CX)-1
3)执行其中的串操作
4)重复1)~3)
.MOVS
格式:可有三种
其中第二、三种格式明确地注明是传送字节或字,第一种格式则应在操作数中表明是字还是字节操作,例如:
执行的操作:
1)((DI))<-((SI))
2)字节操作:
3)字操作:
该指令不影响条件码.
.CLD(Clear direction flag)该指令使DF=0,在执行串操作指令时可使地址自动增量;
.STD(Set direction flag)该指令使DF=1,在执行串操作指令时可使地址自动减量.
.STOS
格式:
执行的操作:
该指令把AL或AX的内容存入由(DI)指定的附加段的某单元中,并根据DF的值及数据类型修改DI的内容,当它与REP联用时,可把AL或AX的内容存入一个长度为(CX)的缓冲区中.
.LODS
格式:
执行的操作:
该指令把由(SI)指定的数据段中某单元的内容送到AL或AX中,并根据方向标志及数据类型修改SI的内容.指令允许使用段跨越前缀来指定非数据段的存储区.该指令也不影响条件码.
2.与REPE/REPZ和REPNZ/REPNE联合工作的CMPS和SCAS指令
.REPE/REPZ
格式:
其中String Primitive可为CMPS或SCAS指令.
执行的操作:
1)如(CX)=0或ZF=0(即某次比较的结果两个操作数不等)时退出,否则往下执行
2)(CX)<-(CX)-1
3)执行其后的串指令
4)重复1)~3)
.REPNE/REPNZ
格式:
其中String Primitive可为CMPS或SCAS指令
执行的操作:
.CMPS
格式:
执行的操作:
1)((SI))-((DI))
2)字节操作:(SI)<-(SI)+-1,(DI)<-(DI)+-1
指令把由(SI)指向的数据段中的一个字(或字节)与由(DI)指向的附加段中的一个字(或字节)相减,但不保存结果,只根据结果设置条件码,指令的其它特性和MOVS指令的规定相同.
.SCAS
格式:
执行的操作:
该指令把AL(或AX)的内容与由(DI)指定的在附加段中的一个字节(或字)进行比较,并不保存结果,只根据结果置条件码.指令的其他特性和MOVS的规定相同.
五、控制转移指令
.JMP(jmp)
1)段内直接短转移
格式:JMP
执行的操作:(IP)<-(IP)+8位位移量
2)段内直接近转移
格式:JMP
执行的操作:(IP)<-(IP)+16位位移量
3)段内间接转移
格式:JMP
执行的操作:(IP)<-(EA)
4)段间直接(远)转移
格式:JMP
执行的操作:(IP)<-OPR的段内偏移地址
5)段间间接转移
格式:JMP
执行的操作:(IP)<-(EA)
2.条件转移指令
1)根据单个条件标志的设置情况转移
.JZ(或JE)(Jump if zero,or equal)
格式:JE(或JZ)
测试条件:ZF=1
.JNZ(或JNE)(Jump if not zero,or not equal) 结果不为零(或不相等)则转移
格式:JNZ(或JNE)
测试条件:ZF=0
.JS(Jump if sign)
格式:
测试条件:SF=1
.JNS(Jump if not sign)
格式: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则转移
格式:
测试条件: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
4)测试CX的值为0则转移指令
.JCXZ(Jump if CX register is zero)
格式:JCXZ
测试条件:(CX)=0
注:条件转移全为8位短跳!
3.循环指令
.LOOP 循环指令
格式: LOOP
测试条件:(CX)<>0
.LOOPZ/LOOPE 当为零或相等时循环指令
格式: LOOPZ(或LOOPE)
测试条件:(CX)<>0且ZF=1
.LOOPNZ/LOOPNE 当不为零或不相等时循环指令
格式: LOOPNZ(或LOOPNE)
测试条件:(CX)<>0且ZF=0
这三条指令的步骤是:
1)(CX)<-(CX)-1
2)检查是否满足测试条件,如满足则(IP)<-(IP)+D8的符号扩充.
4.子程序
.CALL调用指令
.RET返回指令
5.中断
.INT指令
格式:
或
执行的操作:(SP)<-(SP)-2
.INTO
执行的操作:若OF=1则:
.IRET
格式:
执行的操作:(IP)<-((SP)+1,(SP))
六、处理机控制指令
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)