目录
一、基础汇编指令
-
MOV - 数据传输指令
-
功能:将一个操作数的值复制到另一个操作数。
-
格式:
MOV 目标, 源
-
示例:
MOV AX, 100
(将立即数100复制到AX寄存器) -
作用:用于在寄存器之间、内存和寄存器之间传输数据。
-
-
ADD - 算术指令
-
功能:将两个操作数相加,并将结果存储在第一个操作数中。
-
格式:
ADD 目标, 源
-
示例:
ADD AX, BX
(将AX和BX中的值相加,结果存入AX) -
作用:用于执行加法运算,同时更新标志寄存器。
-
-
SUB - 算术指令
-
功能:从第一个操作数中减去第二个操作数,并将结果存储在第一个操作数中。
-
格式:
SUB 目标, 源
-
示例:
SUB AX, BX
(从AX中减去BX的值,结果存入AX) -
作用:用于执行减法运算,同时更新标志寄存器。
-
-
MUL - 算术指令
-
功能:将两个操作数相乘。
-
格式:
MUL 源
-
示例:
MUL BX
(将AX和BX中的值相乘,结果存入AX和DX中;对于8位数据,结果存入AL和AH中) -
作用:用于执行无符号乘法,结果根据操作数的大小存放在特定寄存器中。
-
-
DIV - 算术指令
-
功能:执行无符号数除法。
-
格式:
DIV 除数
-
示例:
DIV BX
(EAX中的值除以BX,商存放在EAX中,余数存放在EDX中;对于8位数据,AL中的值除以DL,商存放在AL中,余数存放在AH中) -
作用:用于执行无符号除法,结果根据操作数的大小存放在特定寄存器中。
-
-
INC - 算术指令
-
功能:将指定操作数增加1。
-
格式:
INC 操作数
-
示例:
INC AX
(AX中的值加1) -
作用:用于增加操作数的值,更新相关标志位。
-
-
DEC - 算术指令
-
功能:将指定操作数减少1。
-
格式:
DEC 操作数
-
示例:
DEC AX
(AX中的值减1) -
作用:用于减少操作数的值,更新相关标志位。
-
-
AND - 逻辑指令
-
功能:对两个操作数执行按位与操作。
-
格式:
AND 目标, 源
-
示例:
AND AX, BX
(执行AX和BX的按位与操作,结果存入AX) -
作用:用于执行按位与运算,更新标志寄存器。
-
-
OR - 逻辑指令
-
功能:对两个操作数执行按位或操作。
-
格式:
OR 目标, 源
-
示例:
OR AX, BX
(执行AX和BX的按位或操作,结果存入AX) -
作用:用于执行按位或运算,更新标志寄存器。
-
-
XOR - 逻辑指令
-
功能:对两个操作数执行按位异或操作。
-
格式:
XOR 目标, 源
-
示例:
XOR AX, BX
(执行AX和BX的按位异或操作,结果存入AX) -
作用:用于执行按位异或运算,更新标志寄存器。
-
-
NOT - 逻辑指令
-
功能:对操作数执行按位取反操作。
-
格式:
NOT 操作数
-
示例:
NOT AX
(AX中的值按位取反) -
作用:用于执行按位取反运算,更新标志寄存器。
-
-
CMP - 比较指令
-
功能:比较两个操作数,但不存储结果,只设置标志位。
-
格式:
CMP 操作数1, 操作数2
-
示例:
CMP AX, BX
(比较AX和BX的值) -
作用:用于比较,更新标志寄存器,以便后续条件跳转指令使用。
-
-
JMP - 无条件跳转指令
-
功能:无条件跳转到指定的内存地址继续执行代码。
-
格式:
JMP 目标地址
-
示例:
JMP label
(跳转到标签处执行) -
作用:用于改变程序执行流程,跳到指定位置。
-
-
JE/JZ - 条件跳转指令
-
功能:如果上一个比较指令的结果为相等(零标志位为1),则跳转。
-
格式:
JE/JZ 目标地址
-
示例:
JE label
(如果零标志位为1,则跳转) -
作用:用于条件跳转,零标志位为1时执行跳转。
-
-
JNE/JNZ - 条件跳转指令
-
功能:如果上一个比较指令的结果不相等(零标志位为0),则跳转。
-
格式:
JNE/JNZ 目标地址
-
示例:
JNE label
(如果零标志位为0,则跳转) -
作用:用于条件跳转,零标志位为0时执行跳转。
-
-
JL/JNGE - 条件跳转指令
-
功能:如果上一个比较指令的结果为小于(带符号小于),则跳转。
-
格式:
JL/JNGE 目标地址
-
示例:
JL label
(如果符号标志位和零标志位指示小于,则跳转) -
作用:用于条件跳转,带符号小于条件满足时执行跳转。
-
-
JLE/JNG - 条件跳转指令
-
功能:如果上一个比较指令的结果为小于或等于(带符号小于或等于),则跳转。
-
格式:
JLE/JNG 目标地址
-
示例:
JLE label
(如果符号标志位和零标志位指示小于等于,则跳转) -
作用:用于条件跳转,带符号小于等于条件满足时执行跳转。
-
-
JG/JNLE - 条件跳转指令
-
功能:如果上一个比较指令的结果为大于(带符号大于),则跳转。
-
格式:
JG/JNLE 目标地址
-
示例:
JG label
(如果符号标志位和零标志位指示大于,则跳转) -
作用:用于条件跳转,带符号大于条件满足时执行跳转。
-
-
JGE/JNL - 条件跳转指令
-
功能:如果上一个比较指令的结果为大于或等于(带符号大于或等于),则跳转。
-
格式:
JGE/JNL 目标地址
-
示例:
JGE label
(如果符号标志位和零标志位指示大于等于,则跳转) -
作用:用于条件跳转,带符号大于等于条件满足时执行跳转。
-
-
JA/JNBE - 无符号大于条件跳转指令
-
功能:如果上一个比较指令的结果为无符号大于,则跳转。
-
格式:
JA/JNBE 目标地址
-
示例:
JA label
(如果无符号大于,则跳转) -
作用:用于条件跳转,无符号大于条件满足时执行跳转。
-
-
JB/JNAE - 无符号小于条件跳转指令
-
功能:如果上一个比较指令的结果为无符号小于,则跳转。
-
格式:
JB/JNAE 目标地址
-
示例:
JB label
(如果无符号小于,则跳转) -
作用:用于条件跳转,无符号小于条件满足时执行跳转。
-
-
JAE/JNB - 无符号大于等于条件跳转指令
-
功能:如果上一个比较指令的结果为无符号大于等于,则跳转。
-
格式:
JAE/JNB 目标地址
-
示例:
JAE label
(如果无符号大于等于,则跳转) -
作用:用于条件跳转,无符号大于等于条件满足时执行跳转。
-
-
JBE/JNA - 无符号小于等于条件跳转指令
-
功能:如果上一个比较指令的结果为无符号小于等于,则跳转。
-
格式:
JBE/JNA 目标地址
-
示例:
JBE label
(如果无符号小于等于,则跳转) -
作用:用于条件跳转,无符号小于等于条件满足时执行跳转。
-
-
CALL - 调用指令
-
功能:调用子程序,保存返回地址。
-
格式:
CALL 目标地址
-
示例:
CALL label
(调用子程序,并将返回地址压入堆栈) -
作用:用于调用子程序,程序执行跳转到子程序后,可以通过RET指令返回。
-
-
RET - 返回指令
-
功能:从子程序返回到调用它的程序。
-
格式:
RET
-
示例:
RET
(从子程序返回,并从堆栈中弹出返回地址) -
作用:用于从子程序返回,程序执行跳转回调用指令之前的位置。
-
-
PUSH - 堆栈操作指令
-
功能:将一个操作数压入堆栈。
-
格式:
PUSH 操作数
-
示例:
PUSH AX
(将AX的值压入堆栈) -
作用:用于将数据保存到堆栈中,供以后使用。
-
-
POP - 堆栈操作指令
-
功能:从堆栈中弹出一个操作数。
-
格式:
POP 操作数
-
示例:
POP AX
(从堆栈弹出数据到AX中) -
作用:用于从堆栈中恢复数据,将其存入指定位置。
-
-
PUSHAD - 堆栈操作指令
-
功能:将所有通用寄存器压入堆栈。
-
格式:
PUSHAD
-
示例:
PUSHAD
(将EAX, ECX, EDX, EBX, ESP, EBP, ESI, EDI依次压入堆栈) -
作用:用于保存当前寄存器状态,以便程序执行其他操作后恢复。
-
-
POPAD - 堆栈操作指令
-
功能:从堆栈中弹出所有通用寄存器。
-
格式:
POPAD
-
示例:
POPAD
(从堆栈弹出数据依次恢复到EDI, ESI, EBP, ESP, EBX, EDX, ECX, EAX) -
作用:用于恢复之前保存的寄存器状态。
-
-
INT - 中断指令
-
功能:调用中断处理程序。
-
格式:
INT 中断号
-
示例:
INT 21h
(调用DOS中断处理程序) -
作用:用于请求系统的中断服务,如处理输入输出、内存管理等。
-
-
IRET - 中断返回指令
-
功能:从中断程序返回到被中断的程序。
-
格式:
IRET
-
示例:
IRET
(从中断程序返回,并恢复标志寄存器和EIP) -
作用:用于恢复中断前的程序状态,继续执行被中断的程序。
-
-
HLT - 停止指令
-
功能:停止CPU。
-
格式:
HLT
-
示例:
HLT
(停止CPU执行指令) -
作用:用于暂停CPU执行,通常在程序结束时使用。
-
-
NOP - 无操作指令
-
功能:占位或空操作。
-
格式:
NOP
-
示例:
NOP
(执行空操作,不改变任何状态) -
作用:用于占位或创建延时循环。
-
-
LEA - 加载有效地址指令
-
功能:将操作数的地址加载到指定的寄存器。
-
格式:
LEA 寄存器, 操作数
-
示例:
LEA EAX, [EBX + ECX*4 + 10]
(将EBX + ECX*4 + 10的地址加载到EAX) -
作用:用于计算内存地址,而不进行实际的数据读取或写入。
-
-
LAHF - 加载AH寄存器标志位指令
-
功能:将标志寄存器的低字节加载到AH寄存器。
-
格式:
LAHF
-
示例:
LAHF
(将标志寄存器的低字节加载到AH中) -
作用:用于保存标志寄存器的部分状态,以便之后使用。
-
-
SAHF - 存储AH寄存器标志位指令
-
功能:将AH寄存器的低字节存储到标志寄存器。
-
格式:
SAHF
-
示例:
SAHF
(将AH中的值存储到标志寄存器的低字节) -
作用:用于恢复标志寄存器的部分状态。
-
-
TEST - 测试指令
-
功能:对两个操作数进行按位与操作,但不存储结果,只设置标志位。
-
格式:
TEST 操作数1, 操作数2
-
示例:
TEST AX, AX
(执行AX和AX的按位与操作,只更新标志位) -
作用:用于测试特定位是否为1,更新标志寄存器以供条件判断。
-
-
SHL - 移位指令
-
功能:将操作数的位左移指定的位数。
-
格式:
SHL 操作数, 移位数
-
示例:
SHL AX, 2
(将AX的值左移2位) -
作用:用于将数据左移,相当于乘以2的幂次。
-
-
SHR - 移位指令
-
功能:将操作数的位右移指定的位数。
-
格式:
SHR 操作数, 移位数
-
示例:
SHR AX, 2
(将AX的值右移2位) -
作用:用于将数据右移,相当于除以2的幂次。
-
-
SAL - 算术左移指令
-
功能:与SHL相同,算术左移。
-
格式:
SAL 操作数, 移位数
-
示例:
SAL AX, 2
(将AX的值算术左移2位) -
作用:用于执行算术左移,与SHL相同。
-
-
SAR - 算术右移指令
-
功能:与SHR相同,但保留符号位。
-
格式:
SAR 操作数, 移位数
-
示例:
SAR AX, 2
(将AX的值算术右移2位) -
作用:用于执行算术右移,保持符号位不变。
-
-
NEG - 求反指令
-
功能:将操作数取反(变为相反数)。
-
格式:
NEG 操作数
-
示例:
NEG AX
(将AX的值取反) -
作用:用于将正数变为负数,更新标志寄存器。
-
-
PUSHF - 堆栈操作指令
-
功能:将标志寄存器压入堆栈。
-
格式:
PUSHF
-
示例:
PUSHF
(将标志寄存器的值压入堆栈) -
作用:用于保存当前的标志寄存器状态。
-
-
POPF - 堆栈操作指令
-
功能:将标志寄存器从堆栈弹出。
-
格式:
POPF
-
示例:
POPF
(从堆栈弹出数据恢复到标志寄存器) -
作用:用于恢复之前保存的标志寄存器状态。
-
-
CMC - 补码指令
-
功能:将进位标志位取反。
-
格式:
CMC
-
示例:
CMC
(将CF标志位取反) -
作用:用于在加法和减法之间切换,常用于有符号数的运算。
-
-
STC - 设置进位标志位指令
-
功能:将进位标志位设置为1。
-
格式:
STC
-
示例:
STC
(将CF标志位设置为1) -
作用:用于手动设置进位标志位,常用于无符号数的运算。
-
-
CLC - 清除进位标志位指令
-
功能:将进位标志位设置为0。
-
格式:
CLC
-
示例:
CLC
(将CF标志位设置为0) -
作用:用于手动清除进位标志位,常用于无符号数的运算。
-
二、高级指令
-
ADC - 带进位加法指令,用于将两个操作数相加,并加上进位标志位,结果存储在第一个操作数中。
-
SBB - 带借位减法指令,用于从第一个操作数中减去第二个操作数,并减去借位标志位,结果存储在第一个操作数中。
-
ROL/RROL - 旋转指令,用于将操作数中的位左旋转或右旋转指定的位数。
-
ROR/RROR - 旋转指令,与ROL相同,但方向相反。
-
RCR - 带进位右旋转指令,用于将操作数中的位右旋转,并带上进位标志位。
-
RCL - 带进位左旋转指令,用于将操作数中的位左旋转,并带上进位标志位。
-
SHLD - 双精度左移指令,用于将两个操作数视为一个双精度数左移。
-
SHRD - 双精度右移指令,用于将两个操作数视为一个双精度数右移。
-
BSWAP - 字节交换指令,用于交换寄存器中字的高低字节。
-
MUL - 无符号乘法指令,用于无符号数相乘。
-
IMUL - 有符号乘法指令,用于有符号数相乘。
-
IDIV - 有符号除法指令,用于有符号数除法。
-
ADC - 带进位加法指令,用于无带进位加法。
-
CMOVB/CMOVNAE - 条件移动指令,如果进位标志位为1,则移动操作数。
-
CMOVZ/CMOVE - 条件移动指令,如果零标志位为1,则移动操作数。
-
CMOVL/CMOVNGE - 条件移动指令,如果符号标志位与进位标志位不一致,则移动操作数。
-
CMOVLE/CMOVNG - 条件移动指令,如果符号标志位与进位标志位不一致或零标志位为1,则移动操作数。
-
CMOVG/CMOVNLE - 条件移动指令,如果符号标志位与进位标志位一致且零标志位为0,则移动操作数。
-
CMOVA/CMOVNBE - 条件移动指令,如果进位标志位和零标志位均为0,则移动操作数。
-
CMOVL/CMOVNGE - 条件移动指令,如果符号标志位与进位标志位不一致,则移动操作数。
-
CMOVLE/CMOVNG - 条件移动指令,如果符号标志位与进位标志位不一致或零标志位为1,则移动操作数。
-
CMOVS - 条件移动指令,如果符号标志位为1,则移动操作数。
-
CMOVP/CMOVPE - 条件移动指令,如果奇偶标志位为1,则移动操作数。
-
CMOVC/CMOVNAE - 条件移动指令,如果进位标志位为1,则移动操作数。
-
CMOVAE/CMOVNB - 条件移动指令,如果进位标志位为0,则移动操作数。
三、内存访问指令
-
PUSH - 压入堆栈指令,用于将操作数压入堆栈。
-
POP - 弹出堆栈指令,用于将操作数从堆栈弹出。
-
LEA - 加载有效地址指令,用于将地址值加载到寄存器中,但不进行内存访问。
-
XCHG - 交换指令,用于交换两个寄存器或寄存器与内存操作数的值。
四、其他控制指令
-
INT - 中断指令,用于生成一个中断请求。
-
IRET - 中断返回指令,用于从中断服务程序返回到中断前的程序位置。
-
HLT - 停止指令,用于暂停CPU的执行。
-
NOP - 无操作指令,用于在程序中插入一个空操作。
五、标志位相关指令
-
CMC - 补码指令,用于将进位标志位取反。
-
STC - 设置进位标志位指令,用于将进位标志位设置为1。
-
CLC - 清除进位标志位指令,用于将进位标志位设置为0。
六、逻辑和条件指令
-
TEST - 测试指令,用于对两个操作数进行按位与操作,但不存储结果,只设置标志位。
-
SETCC - 设置条件指令,用于将条件码设置为1或0,以响应某个条件。
-
CMPS - 比较字符串指令,用于按字节或字比较两个字符串。
-
CMPSB/CMPSD/CMPSW - 比较字符串指令,用于按字节、双字或字比较两个字符串。
-
CMOVxx - 条件移动指令,根据条件码将源操作数移动到目标操作数。