微处理器 - 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 − 用于将字节/字的位向左移动并将零放入 LSB。
SHR − 用于将字节/字的位向右移动并将零放入 MSB。
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 −用于从中断服务返回到主程序