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。
DAABCD加法后的十进制调整:当两个BCD数相加时,DAA在ADD或ADC指令后使用,以获得BCD中的正确答案。
DASBCD减法后的十进制调整:当两个BCD数相减时,DAS在SUB或SBB指令后使用,以获得BCD中的正确答案。
AAA加法后的ASCII调整:当两个十进制数字的ASCII码相加时,AAA在加法后使用,以获得解压BCD中的正确答案。
AAD除法的AX寄存器调整:它将AX中的两个未打包BCD数字转换为等效的二进制数。此调整在AX中将两个未打包BCD数字除以一个未打包BCD字节之前完成。
AAMBCD乘法结果调整:此指令在两个未打包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

下一主题#