微处理器 - 8086 指令集


8086微处理器支持8种类型的指令 -

  • 数据传输说明
  • 算术指令
  • 位操作指令
  • 字符串指令
  • 程序执行传输指令(分支和循环指令)
  • 处理器控制指令
  • 迭代控制指令
  • 中断指令

现在让我们详细讨论这些指令集。

数据传输说明

这些指令用于将数据从源操作数传输到目标操作数。以下是该组下的指令列表 -

转移单词的指令

  • MOV - 用于将字节或字从提供的源复制到提供的目的地。

  • PPUSH - 用于将单词放在堆栈顶部。

  • POP - 用于将单词从堆栈顶部获取到提供的位置。

  • PUSHA - 用于将所有寄存器放入堆栈中。

  • POPA - 用于将字从堆栈获取到所有寄存器。

  • XCHG - 用于交换两个位置的数据。

  • XLAT - 用于使用内存中的表转换 AL 中的字节。

输入输出口传输指令

  • IN - 用于从提供的端口读取字节或字到累加器。

  • OUT - 用于将一个字节或字从累加器发送到提供的端口。

地址转移说明

  • LEA - 用于将操作数的地址加载到提供的寄存器中。

  • LDS - 用于从内存加载 DS 寄存器和其他提供的寄存器

  • LES - 用于从内存加载 ES 寄存器和其他提供的寄存器。

传送标志寄存器的指令

  • LAHF - 用于将标志寄存器的低字节加载到 AH。

  • SAHF - 用于将 AH 寄存器存储到标志寄存器的低字节。

  • PUSHF - 用于复制堆栈顶部的标志寄存器。

  • POPF - 用于将堆栈顶部的字复制到标志寄存器。

算术指令

这些指令用于执行加、​​减、乘、除等算术运算。

以下是该组下的指令列表 -

执行添加的说明

  • ADD - 用于将提供的字节与字节/字与字相加。

  • ADC - 用于加进位。

  • INC - 用于将提供的字节/字加 1。

  • AAA - 用于在添加后调整 ASCII。

  • DAA - 用于调整加法/减法运算后的小数。

执行减法的说明

  • SUB - 用于从字节中减去字节/从字中减去字。

  • SBB - 用于执行带借位的减法。

  • DEC - 用于将提供的字节/字减 1。

  • NPG - 用于对所提供的字节/字的每一位取反并添加 1/2 的补码。

  • CMP - 用于比较 2 个提供的字节/字。

  • AAS - 用于调整减法后的 ASCII 代码。

  • DAS - 用于调整减法后的小数。

执行乘法的指令

  • MUL - 用于将无符号字节乘以字节/字乘以字。

  • IMUL - 用于将有符号字节乘以字节/字乘以字。

  • AAM - 用于在乘法后调整 ASCII 代码。

执行除法的说明

  • DIV - 用于按字节划分无符号字或按字划分无符号双字。

  • IDIV - 用于按字节划分有符号字或按字划分有符号双字。

  • AAD - 用于调整分割后的 ASCII 代码。

  • CBW - 用于用低字节符号位的副本填充字的高字节。

  • CWD - 用于用低位字的符号位填充双字的高位字。

位操作指令

这些指令用于执行涉及数据位的操作,即逻辑、移位等操作。

以下是该组下的指令列表 -

执行逻辑运算的指令

  • NOT - 用于反转字节或字的每一位。

  • AND - 用于将一个字节/字中的每个位与另一个字节/字中的相应位相加。

  • OR - 用于将一个字节/字中的每个位与另一个字节/字中的相应位相乘。

  • XOR - 用于对一个字节/字中的每个位与另一个字节/字中的相应位执行异或运算。

  • TEST - 用于添加操作数来更新标志,而不影响操作数。

执行移位操作的指令

  • SHL/SAL - 用于向左移动字节/字的位并将零(S)放入LSB中。

  • SHR - 用于将字节/字的位向右移动并在 MSB 中放入零(S)。

  • SAR - 用于向右移动字节/字的位并将旧的 MSB 复制到新的 MSB。

执行旋转操作的指令

  • ROL - 用于向左旋转字节/字的位,即 MSB 到 LSB 并进位标志 [CF]。

  • ROR - 用于向右旋转字节/字的位,即LSB 到MSB 并进位标志[CF]。

  • RCR - 用于向右旋转字节/字的位,即LSB到CF和CF到MSB。

  • RCL - 用于向左旋转字节/字的位,即 MSB 到 CF 和 CF 到 LSB。

字符串指令

字符串是一组字节/字,它们的内存始终按顺序分配。

以下是该组下的指令列表 -

  • REP - 用于重复给定的指令,直到 CX ≠ 0。

  • REPE/REPZ - 用于重复给定指令,直到 CX = 0 或零标志 ZF = 1。

  • REPNE/REPNZ - 用于重复给定指令,直到 CX = 0 或零标志 ZF = 1。

  • MOVS/MOVSB/MOVSW - 用于将字节/字从一个字符串移动到另一个字符串。

  • COMS/COMPSB/COMPSW - 用于比较两个字符串字节/字。

  • INS/INSB/INSW - 用作从 I/O 端口到提供的内存位置的输入字符串/字节/字。

  • OUTS/OUTSB/OUTSW - 用作从提供的内存位置到 I/O 端口的输出字符串/字节/字。

  • SCAS/SCASB/SCASW - 用于扫描字符串并将其字节与 AL 中的字节或字符串字与 AX 中的字进行比较。

  • LODS/LODSB/LODSW - 用于将字符串字节存储到 AL 中或将字符串字存储到 AX 中。

程序执行转移指令(分支和循环指令)

这些指令用于在执行期间转移/分支指令。它包括以下说明 -

在执行期间无条件传输指令的指令 -

  • CALL - 用于调用过程并将其返回地址保存到堆栈中。

  • RET - 用于从过程返回到主程序。

  • JMP - 用于跳转到提供的地址以继续执行下一条指令。

在某些条件下执行期间传输指令的指令 -

  • JA/JNBE - 如果高于/不低于/等于指令满足则用于跳转。

  • JAE/JNB - 如果满足以上/不低于指令则用于跳转。

  • JBE/JNA - 用于在低于/等于/不高于指令满足时跳转。

  • JC - 如果进位标志 CF = 1,则用于跳转

  • JE/JZ - 用于在等于/零标志 ZF = 1 时跳转

  • JG/JNLE - 用于在大于/不小于/等于指令满足时跳转。

  • JGE/JNL - 用于在大于/等于/不小于指令满足时跳转。

  • JL/JNGE - 用于在小于/不大于/等于指令满足时跳转。

  • JLE/JNG - 用于在小于/等于/不大于指令满足时跳转。

  • JNC - 用于在没有进位标志时跳转(CF = 0)

  • JNE/JNZ - 用于在不等于/零标志 ZF = 0 时跳转

  • JNO - 如果没有溢出标志 OF = 0,则用于跳转

  • JNP/JPO - 如果没有奇偶校验/奇偶校验 PF = 0,则用于跳转

  • JNS - 如果没有符号 SF = 0,则用于跳转

  • JO - 如果溢出标志 OF = 1,则用于跳转

  • JP/JPE - 用于在奇偶校验/偶校验 PF = 1 时跳转

  • JS - 如果符号标志 SF = 1,则用于跳转

处理器控制指令

这些指令用于通过设置/重置标志值来控制处理器操作。

以下是该组下的说明 -

  • STC - 用于将进位标志 CF 设置为 1

  • CLC - 用于清除/重置进位标志 CF 为 0

  • CMC - 用于将补码置于进位标志 CF 的状态。

  • STD - 用于将方向标志 DF 设置为 1

  • CLD - 用于清除/重置方向标志 DF 为 0

  • STI - 用于将中断使能标志设置为1,即使能INTR 输入。

  • CLI - 用于将中断使能标志清除为0,即禁用INTR输入。

迭代控制指令

这些指令用于执行给定指令一定次数。以下是该组下的指令列表 -

  • LOOP - 用于循环一组指令,直到满足条件,即 CX = 0

  • LOOPE/LOOPZ - 用于循环一组指令,直到满足 ZF = 1 & CX = 0

  • LOOPNE/LOOPNZ - 用于循环一组指令,直到满足 ZF = 0 & CX = 0

  • JCXZ - 如果 CX = 0,则用于跳转到提供的地址

中断指令

这些指令用于在程序执行期间调用中断。

  • INT - 用于在执行和调用指定服务期间中断程序。

  • INTO - 如果 OF = 1,则用于在执行期间中断程序

  • IRET - 用于从中断服务返回主程序