8088/8086的指令系统相关指令整理

时间:2022-10-31 00:43:18

近来无事就将近来做的汇编整理了一下,由于本人刚刚开始接触汇编,各方面还很欠缺,若有不足之处请莫见笑,予以指出,在下感激不尽。由于在下使用的是emu8086,下将8088/8086的指令系统相关指令整理如下:

 

一、数据传送指令

1.通用数据传送指令
MOVMove)传送
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可以是1CL.  循环移位指令可以改变操作数中所有位的位置;移位指令则常常用来做乘以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与其他处理机协同工作时,该指令可避免破坏有用信息。

 

下面就来做几个简单的