8086 指令集2024年8月29日 | 阅读 7 分钟 指令根据其执行的功能进行分类。它们分为以下主要类型: 数据传输指令所有执行数据移动的指令都属于此类别。源数据可以是寄存器、内存位置、端口等,目的地可以是寄存器、内存位置或端口。以下指令属于此类别: 指令 | 描述 |
---|
MOV | 将数据从寄存器移动到寄存器,寄存器移动到内存,内存移动到寄存器,内存移动到累加器,累加器移动到内存等。 | LDS | 从指定的内存位置加载一个字到指定的寄存器。它还将从接下来的两个内存位置加载一个字到DS寄存器。 | LES | 从指定的内存位置加载一个字到指定的寄存器。它还将从接下来的两个内存位置加载一个字到ES寄存器。 | LEA | 将偏移地址加载到指定的寄存器中。 | LAHF | 将标志寄存器的低8位加载到AH寄存器中。 | SAHF | 将AH寄存器的内容存储到标志寄存器的低位中。 | XLAT/XLATB | 从查找表中读取一个字节。 | XCHG | 交换指定的16位或8位寄存器的内容与AX寄存器、指定的寄存器或内存位置的内容。 | PUSH | 将指定的寄存器或内存位置的内容压入(发送、写入或移动)堆栈顶部。 | POP | 从堆栈顶部弹出(读取)两个字节,并将其保存在指定的寄存器或内存位置中。 | POPF | 从堆栈顶部弹出(读取)两个字节,并将其保存在标志寄存器中。 | IN | 将数据从端口传输到累加器或AX、DX或AL寄存器。 | OUT | 将数据从累加器或AL或AX寄存器传输到指令的第二个字节标识的I/O端口。 |
算术指令此组指令执行加法、减法、乘法、除法、增量、减量、比较、ASCII和十进制调整等操作。 以下指令属于此类别: 指令 | 描述 |
---|
ADD | 将数据添加到累加器,即AL或AX寄存器或内存位置。 | ADC | 添加指定的运算数和进位状态(即前一阶段的进位)。 | SUB | 从累加器、内存或寄存器中减去立即数。 | SBB | 从累加器、内存或寄存器中带借位减去立即数。 | MUL | 无符号8位或16位乘法。 | IMUL | 带符号8位或16位乘法。 | DIV | 无符号8位或16位除法。 | IDIV | 带符号8位或16位除法。 | INC | 将寄存器或内存加1。 | DEC | 将寄存器或内存减1。 | DAA | BCD加法后的十进制调整:当两个BCD数相加时,DAA在ADD或ADC指令后使用,以获得BCD中的正确答案。 | DAS | BCD减法后的十进制调整:当两个BCD数相减时,DAS在SUB或SBB指令后使用,以获得BCD中的正确答案。 | AAA | 加法后的ASCII调整:当两个十进制数字的ASCII码相加时,AAA在加法后使用,以获得解压BCD中的正确答案。 | AAD | 除法的AX寄存器调整:它将AX中的两个未打包BCD数字转换为等效的二进制数。此调整在AX中将两个未打包BCD数字除以一个未打包BCD字节之前完成。 | AAM | BCD乘法结果调整:此指令在两个未打包BCD数字相乘后使用。 | AAS | 减法后的ASCII调整:此指令用于在一个数字的ASCII码减去另一个数字的ASCII码后,在未打包BCD中获得正确结果。 | CBW | 将带符号字节转换为带符号字。 | CWD | 将带符号字转换为带符号双字。 | NEG | 获取指定的8位或16位寄存器或内存位置内容的2的补码(即负数)。 | CMP | 将立即数、寄存器或内存与累加器、寄存器或内存位置进行比较。 |
逻辑指令此组指令执行逻辑AND、OR、XOR、NOT和TEST操作。以下指令属于此类别: 指令 | 描述 |
---|
并且 | 对两个操作数执行按位逻辑AND操作,并将结果放置在指定的目标中。 | 或 | 对两个操作数执行按位逻辑OR操作,并将结果放置在指定的目标中。 | XOR | 对两个操作数执行按位逻辑XOR操作,并将结果放置在指定的目标中。 | NOT | 对指定的寄存器或内存位置的内容取反(1的补码)。 | TEST | 对指定的运算数与另一个指定的运算数执行逻辑AND操作。 |
循环指令以下指令属于此类别: 指令 | 描述 |
---|
RCL | 通过进位标志将操作数的所有位向左循环指定的位数。 | RCR | 通过进位标志将操作数的所有位向右循环指定的位数。 | ROL | 将操作数的所有位向左循环指定的位数。 | ROR | 将操作数的所有位向右循环指定的位数。 |
移位指令以下指令属于此类别: 指令 | 描述 |
---|
SAL或SHL | 将操作数的每个位向左移位指定的位数,并在LSB位置放入零。 | SAR | 将任何操作数的每个位向右移位指定的位数。将旧的MSB复制到新的MSB中。 | SHR | 将操作数的每个位向右移位指定的位数,并在MSB位置放入零。 |
分支指令它也称为程序执行转移指令。此组指令将程序执行从正常的指令序列转移到指定的目标。以下指令属于此类别: 指令 | 描述 |
---|
JA或JNBE | 如果高于、不低于或等于则跳转,即当CF和ZF = 0时。 | JAE/JNB/JNC | 如果高于、不低于、等于或无进位则跳转,即当CF = 0时。 | JB/JNAE/JC | 如果低于、不高于、等于或有进位则跳转,即当CF = 0时。 | JBE/JNA | 如果低于、不高于或等于则跳转,即当CF和ZF = 1时。 | JCXZ | 如果CX寄存器 = 0则跳转。 | JE/JZ | 如果零或等于则跳转,即当ZF = 1时。 | JG/JNLE | 如果大于、不小于或等于则跳转,即当ZF = 0且CF = OF时。 | JGE/JNL | 如果大于、不小于或等于则跳转,即当SF = OF时。 | JL/JNGE | 如果小于、不大于或等于则跳转,即当SF ≠ OF时。 | JLE/JNG | 如果小于、等于或不大于则跳转,即当ZF = 1且SF ≠ OF时。 | JMP | 导致程序执行无条件跳转到指令中给出的内存地址或标签。 | CALL | 调用指令中给出地址的子程序,并将其返回地址保存到堆栈中。 | RET | 将程序执行从子程序(子例程)返回到下一条指令或主程序。 | IRET | 将程序执行从中断服务程序(子例程)返回到主程序。 | INT | 用于在程序的所需点生成软件中断。 | INTO | 算术运算后指示溢出的软件中断。 | LOOP | 跳转到定义标签,直到CX = 0。 | LOOPZ/LOOPE | 递减CX寄存器,如果CX ≠ 0且ZF = 1则跳转。 | LOOPNZ/LOOPNE | 递减CX寄存器,如果CX ≠ 0且ZF = 0则跳转。 |
这里,CF = 进位标志 ZF = 零标志 OF = 溢出标志 SF = 符号标志 CX = 寄存器 标志操作和处理器控制指令此指令集的指令与标志操作和机器控制相关。以下指令属于此类别: 指令 | 描述 |
---|
CLC | 清除进位标志:此指令将进位标志CF重置为0。 | CLD | 清除方向标志:此指令将方向标志DF重置为0。 | CLI | 清除中断标志:此指令将中断标志IF重置为0。 | CMC | 此指令对进位标志CF取反。 | STC | 将进位标志CF设置为1。 | STD | 将方向标志设置为1。 | STI | 将中断标志IF设置为1。 | HLT | 停止处理。它停止程序执行。 | NOP | 不执行任何操作。 | ESC | 逃逸:使总线对外部主设备(如协处理器或外围设备)空闲。 | WAIT | 当执行WAIT指令时,处理器进入空闲状态,在此状态下处理器不进行任何处理。 | LOCK | 这是一个前缀指令。它使LOCK引脚保持低电平,直到下一条指令执行完毕。 |
字符串指令字符串是存储在连续内存位置的字节序列或字序列。8086提供了一些处理字符串操作的指令,例如字符串移动、比较、扫描、加载和存储。 以下指令属于此类别: 指令 | 描述 |
---|
MOVS/MOVSB/MOVSW | 将SI寄存器寻址的内存位置的8位或16位数据移动到DI寄存器寻址的内存位置。 | CMPS/CMPSB/CMPSW | 将DI寄存器寻址的内存位置的内容与SI寄存器寻址的内存位置的内容进行比较。 | SCAS/SCASB/SCASW | 将累加器的内容与ES附加段中DI寄存器寻址的内存位置的内容进行比较。 | LODS/LODSB/LODSW | 将SI寄存器寻址的内存位置的8位或16位数据加载到AL或AX寄存器。 | STOS/STOSB/STOSW | 将AL或AX寄存器的8位或16位数据存储到DI寄存器寻址的内存位置。 | REP | 重复给定的指令,直到CX ≠ 0 | REPE/ REPZ | 重复给定的指令,直到CX ≠ 0且ZF = 1 | REPNE/REPNZ | 重复给定的指令,直到CX ≠ 0且ZF = 0 |
|