8086/8088指令系统

一、数据传送指令
1.
通用数据传送指令
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

2.
累加器专用传送指令

IN(Input) 
输入
OUT(Output) 
输出
XLAT(Translate) 
换码
这组指令只限于使用累加器AXAL传送信息.
.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(字节)
             OUT   PORT,AX(
)
执行的操作:  (PORT) <- AL(字节
)
             (PORT+1,PORT) <- AX(
)
短格式为:    OUT  DX,AL(字节
)
             OUT  DX,AX(
)
执行的操作:  (DX) <- AL(字节
)
             (DX+1,DX) <- AX(
)
   
IBM-PC机里,外部设备最多可有65536I/O端口,端口(即外设的端口地址)0000~FFFFH.其中前256个端口(0~FFH)可以直接在指令中指定,这就是长格式中的PORT,此时机器指令用二个字节表示,第二个字节就是端口号.所以用长格式时可以在指定中直接指定端口号,但只限于前256个端口.当端口号>=256,只能使用短格式,此时,必须先把端口号放到DX寄存器中(端口号可以从00000FFFFH),然后再用INOUT指令来 传送信息
.
.XLAT 
换码指令

格式为:    XLAT  OPR
:        XLAT
执行的操作
: AL <- (BX+AL)

3.
有效地址送寄存器指令

LEA(Load effective address)
有效地址送寄存器
LDS(Load DS with Pointer)
指针送寄存器和DS
LES(Load ES with Pointer)
指针送寄存器和
ES
.LEA
有效地址送寄存器

格式为:  LEA   REG,SRC
执行的操作
: 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
格式为
:    LAHF
执行的操作: AH <- PWS的低字节

.SAHF AH
送标志寄存器
格式为:    SAHF
执行的操作: PWS的低字节
<- AH
.PUSHF
标志进栈

格式为:    PUSHF
执行的操作
: SP <- SP-2
            SP+1,SP <- PSW
.POPF
标志出栈

格式为:    POPF
执行的操作
: PWS <-  SP+1,SP
            SP <- SP+2

二、算术指令

1.
加法指令
ADD(add)
加法
ADC(add with carry)
带进位加法
INC(increment)
1
.ADD 
加法指令

格式:    ADD   DST,SRC
执行的操作
:(DST)<-(SRC)+(DST)
.ADC 
带进位加法指令

格式:    ADC   DST,SRC
执行的操作
:(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指令

格式:  DEC  OPR
执行的操作
:(OPR)<-(OPR)-1
.NEG 
求补指令

格式:  NEG  OPR
执行的操作
:(OPR)<- -(OPR)
.CMP 
比较指令

格式:  CMP  OPR1,OPR2
执行的操作
:(OPR1)-(OPR2)
   
该指令与SUB指令一样执行减法操作,但不保存结果,只是根据结果设置条件标志西半球
.

3.
乘法指令

MUL(Unsigned Multiple)
无符号数乘法
IMUL(Signed Multiple)
带符号数乘法
.MUL
无符号数乘法指令
格式:   MUL  SRC
执行的操作
:
   
字节操作数
:(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 
无符号数除法指令
格式:   DIV  SRC
执行的操作
:
 
字节操作:(AL)<-(AX)/(SRC)的商

           (AH)<-(AX)/(SRC)
的余数
 
字操作:  (AX)<-(DX,AX)/(SRC)的商
           (AX)<-(DX,AX)/(SRC)
的余数
.IDIV 
带符号数除法指令
格式:   DIV  SRC
执行的操作: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 
逻辑与指令
格式:    AND   DST,SRC
执行的操作
:(DST)<-(DST)^(SRC)
.OR 
逻辑或指令

格式:    OR   DST,SRC
执行的操作
:(DST)<-(DST)V(SRC)
.NOT 
逻辑非指令

格式:    NOT   OPR
执行的操作
:(OPR)<-(OPR)
.XOR 
异或指令

格式:    XOR   DST,SRC
执行的操作
:(DST)<-(DST)V(SRC)
.TEST 
测试指令

格式:    TEST   OPR1,OPR2
执行的操作
:(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,STOSLODS指令
.REP
重复串操作直到(CX)=0为上
格式:  REP   string primitive
其中String Primitive可为MOVS,LODSSTOS指令

执行的操作:
1)
(CX)=0则退出REP,否则往下执行
.
2)(CX)<-(CX)-1
3)
执行其中的串操作

4)
重复1)~3)
.MOVS 
串传送指令

格式:可有三种
    MOVS  DST,SRC
    MOVSB(
字节)
    MOVSW(
)
其中第二、三种格式明确地注明是传送字节或字,第一种格式则应在操作数中表明是字还是字节操作,例如:

            MOVS    ES:BYTE PTR[DI],DS:[SI]
执行的操作:
1)((DI))<-((SI))
2)
字节操作
:
   (SI)<-(SI)+(
-)1,(DI)<-(DI)+(
-)1
  
当方向标志DF=0时用+,当方向标志DF=1时用
-
3)
字操作
:
   (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(
字节
)
        STOSW(
)
执行的操作
:
  
字节操作
:((DI))<-(AL),(DI)<-(DI)+ -1
  
字操作
:  ((DI))<-(AX),(DI)<-(DI)+ -2
该指令把ALAX的内容存入由(DI)指定的附加段的某单元中,并根据DF的值及数据类型修改DI的内容,当它与REP联用时,可把ALAX的内容存入一个长度为(CX)的缓冲区中
.
.LODS 
从串取指令

格式:    LODS  SRC
         LODSB
         LODSW
执行的操作
:
  
字节操作
:(AL)<-((SI)),(SI)<-(SI)+ -1
   
字操作
: (AX)<-((SI)),(SI)<-(SI)+ -2
该指令把由(SI)指定的数据段中某单元的内容送到ALAX,并根据方向标志及数据类型修改SI的内容.指令允许使用段跨越前缀来指定非数据段的存储区.该指令也不影响条件码
.
   
一般说来,该指令不和REP联用.有时缓冲区中的一串字符需要逐次取出来测试时,可使用本指令
.
  
2.
REPE/REPZREPNZ/REPNE联合工作的CMPSSCAS指令

.REPE/REPZ 
当相等/为零时重复串操作
格式:     REPE(REPZ)    String Primitive
其中String Primitive可为CMPSSCAS指令
.
执行的操作
:
1)
(CX)=0ZF=0(即某次比较的结果两个操作数不等)时退出,否则往下执行

2)(CX)<-(CX)-1
3)
执行其后的串指令
4)
重复1)~3)
.REPNE/REPNZ 
当不相等/不为零时重复串操作

格式:     REPNE(REPNZ)   String Primitive
其中String Primitive可为CMPSSCAS指令

执行的操作:
   
除退出条件(CX=0)ZF=1,其他操作与REPE完全相同
.
.CMPS 
串比较指令

格式:     CMP   SRC,DST
          CMPSB
          CMPSW
执行的操作
:
1)((SI))-((DI))
2)
字节操作
:(SI)<-(SI)+-1,(DI)<-(DI)+-1
 
字操作
:  (SI)<-(SI)+-2,(DI)<-(DI)+-2
指令把由(SI)指向的数据段中的一个字(或字节)与由(DI)指向的附加段中的一个字(或字节)相减,但不保存结果,只根据结果设置条件码,指令的其它特性和MOVS指令的规定相同
.
.SCAS 
串扫描指令

格式:   SCAS   DST
        SCASB
        SCASW
执行的操作
:
   
字节操作
:(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) 
结果为负则转移

格式:  JS  OPR
测试条件
:SF=1
.JNS(Jump if not sign) 
结果为正则转移

格式:JNS  OPR
测试条件
:SF=0
.JO(Jump if overflow) 
溢出则转移

格式:   JO  OPR
测试条件
:OF=1
.JNO(Jump if not overflow) 
不溢出则转移

格式:   JNO OPR
测试条件
:OF=0
.JP(
JPE)(Jump if parity,or parity even) 奇偶位为1则转移

格式:   JP  OPR
测试条件
: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的符号扩充
.

4.
子程序

.CALL
调用指令
.RET
返回指令
5.
中断
.INT
指令
格式:    INT  TYPE
       INT
执行的操作
:(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   
从中断返回指令

格式:     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与其他处理机协同工作时,该指令可避免破坏有用信息.

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值