通用寄存器
EAX 32位 函数返回值
AX 低16位 AH 高八位 AL 低八位
EBX 32位
ECX 32位 循环次数,this指针
EDX 32位
EBP 32位 栈底寄存器
ESP 32位 栈顶寄存器
ESI 源索引寄存器
EDI 目标索引寄存器
EIP 无法直接通过汇编操作
例子
- mov al,0xff
- add al,1
- 产生截断
-
- mov al,0xff
- add ax,1
- 产生进位
状态寄存器(Status Register),也称为标志寄存器(Flag
Register),是计算机中的一种特殊寄存器。状态寄存器用于保存关于计算机状态和执行结果的信息,通常由一组二进制位组成,每个位都对应一个特定的状态标志。在x86架构中,状态寄存器通常由一些标志位组成,其中包括:
- 零标志位(Zero Flag,ZF):指示最近的运算结果是否为零。如果运算结果为零,则ZF被置为1,否则为0。
- 进位标志位(Carry Flag,CF):用于处理进位和借位操作。如果最近的运算产生了进位(或借位),CF被置为1,否则为0。
- 溢出标志位(Overflow Flag,OF):用于检测运算结果是否溢出。如果最近的运算结果造成了溢出,OF标志被置为1,否则为0。
- 符号标志位(Sign Flag,SF):指示最近的运算结果的符号。如果结果为负数,则SF被置为1,否则为0。
- 奇偶标志位(Parity Flag,PF):指示最近的运算结果中设置了偶数个位的数量。如果结果中偶数个位被设置为1,则PF被置为1,否则为0。
- 调整标志位(Adjust Flag,AF):在二进制代码运算中用于处理BCD码(二进制编码的十进制数)。在一般的计算中不常使用。
除了上述标志位外,不同架构和处理器还可能存在其他特定的标志位。
状态寄存器广泛用于控制和判断程序的执行流程,以及进行条件分支和循环控制。通过检查和设置状态寄存器中的标志位,程序可以根据运算结果和条件进行相应的操作。
JCC指令
指令 | 条件 |
---|---|
JZ | 等于(ZF=1) |
JE | 等于(ZF=1) |
JNZ | 不等于(ZF=0) |
JNE | 不等于(ZF=0) |
JA | 无符号大于(CF=0且ZF=0) |
JNBE | 无符号大于(CF=0且ZF=0) |
JAE | 无符号大于等于(CF=0) |
JNB | 无符号大于等于(CF=0) |
JNC | 无符号大于等于(CF=0) |
JB | 无符号小于(CF=1) |
JNAE | 无符号小于(CF=1) |
JBE | 无符号小于等于(CF=1或ZF=1) |
JNA | 无符号小于等于(CF=1或ZF=1) |
JCXZ | CX/ECX为零 |
JECXZ | ECX为零 |
JG | 有符号大于(ZF=0且SF=OF) |
JNLE | 有符号大于(ZF=0且SF=OF) |
JGE | 有符号大于等于(SF=OF) |
JNL | 有符号大于等于(SF=OF) |
JL | 有符号小于(SF≠OF) |
JNGE | 有符号小于(SF≠OF) |
JLE | 有符号小于等于(ZF=1或SF≠OF) |
JNG | 有符号小于等于(ZF=1或SF≠OF) |
JO | 溢出(OF=1) |
JNO | 未溢出(OF=0) |
JS | 负数(SF=1) |
JNS | 非负数(SF=0) |
分类 | 示例指令 | 功能 |
---|---|---|
数据传输指令 | MOV | 从一个位置复制数据到另一个位置 |
PUSH | 将数据推入堆栈 | |
POP | 将数据从堆栈弹出 | |
XCHG | 交换两个位置的数据 | |
LEA | 加载地址 | |
MOVS | 将一个字符串的数据复制到另一个字符串 | |
LODS | 将数据从一个位置加载到累加器 | |
STOS | 将累加器中的数据存储到一个位置 | |
算术和逻辑指令 | ADD | 将两个数相加 |
SUB | 从一个数中减去另一个数 | |
MUL | 执行无符号乘法 | |
DIV | 执行无符号除法 | |
AND | 执行逻辑与操作 | |
OR | 执行逻辑或操作 | |
XOR | 执行异或操作 | |
NOT | 执行逻辑非操作 | |
控制流指令 | JMP | 无条件跳转到指定地址 |
Jcc | 条件跳转指令,根据标志位执行跳转 | |
CALL | 调用子程序或函数 | |
RET | 返回子程序或函数调用点 | |
INT | 触发中断服务例程 | |
LOOP | 根据计数器值循环执行指令 | |
HLT | 暂停处理器运行 | |
状态标志位指令 | CMP | 比较两个数 |
TEST | 按位进行与操作并更新标志位 | |
CLC | 清除进位标志位 | |
STC | 设置进位标志位 | |
CMC | 取反进位标志位 | |
CLD | 清除方向标志位 | |
STD | 设置方向标志位 | |
字符串和循环指令 | MOVS | 将一个字符串的数据复制到另一个字符串 |
CMPS | 比较两个字符串的数据 | |
SCAS | 在字符串中搜索指定的数据 | |
REP | 重复执行指令块 | |
REPE/REPZ | 如果相等则重复执行指令块 | |
REPNE/REPNZ | 如果不相等则重复执行指令块 | |
堆栈指令 | PUSH | 将数据推入堆栈 |
POP | 将数据从堆栈弹出 | |
PUSHAD | 将所有通用寄存器的值推入堆栈 | |
POPAD | 将所有通用寄存器的值从堆栈弹出 | |
PUSHA | 将通用寄存器的值推入堆栈 | |
POPA | 将通用寄存器的值从堆栈弹出 | |
过程和函数指令 | CALL | 调用子程序或函数 |
RET | 返回子程序或函数调用点 | |
ENTER | 建立堆栈帧 | |
LEAVE | 恢复调用者的堆栈帧 | |
PROC | 定义一个过程 | |
ENDP | 定义过程结束 | |
I/O指令 | IN | 从指定端口读取数据 |
OUT | 将数据写入指定端口 | |
INS | 从数据端口读取数据到字符串 | |
OUTS | 将字符串的数据写入到数据端口 | |
CLI | 关中断 | |
STI | 开中断 |
EAX 32位 函数返回值
AX 低16位 AH 高八位 AL 低八位
EBX 32位
ECX 32位 循环次数,this指针
EDX 32位
EBP 32位 栈底寄存器
ESP 32位 栈顶寄存器
ESI 源索引寄存器
EDI 目标索引寄存器
EIP 无法直接通过汇编操作
例子
- mov al,0xff
- add al,1
- 产生截断
-
- mov al,0xff
- add ax,1
- 产生进位
状态寄存器(Status Register),也称为标志寄存器(Flag
Register),是计算机中的一种特殊寄存器。状态寄存器用于保存关于计算机状态和执行结果的信息,通常由一组二进制位组成,每个位都对应一个特定的状态标志。在x86架构中,状态寄存器通常由一些标志位组成,其中包括:
- 零标志位(Zero Flag,ZF):指示最近的运算结果是否为零。如果运算结果为零,则ZF被置为1,否则为0。
- 进位标志位(Carry Flag,CF):用于处理进位和借位操作。如果最近的运算产生了进位(或借位),CF被置为1,否则为0。
- 溢出标志位(Overflow Flag,OF):用于检测运算结果是否溢出。如果最近的运算结果造成了溢出,OF标志被置为1,否则为0。
- 符号标志位(Sign Flag,SF):指示最近的运算结果的符号。如果结果为负数,则SF被置为1,否则为0。
- 奇偶标志位(Parity Flag,PF):指示最近的运算结果中设置了偶数个位的数量。如果结果中偶数个位被设置为1,则PF被置为1,否则为0。
- 调整标志位(Adjust Flag,AF):在二进制代码运算中用于处理BCD码(二进制编码的十进制数)。在一般的计算中不常使用。
除了上述标志位外,不同架构和处理器还可能存在其他特定的标志位。
状态寄存器广泛用于控制和判断程序的执行流程,以及进行条件分支和循环控制。通过检查和设置状态寄存器中的标志位,程序可以根据运算结果和条件进行相应的操作。
JCC指令
指令 | 条件 |
---|---|
JZ | 等于(ZF=1) |
JE | 等于(ZF=1) |
JNZ | 不等于(ZF=0) |
JNE | 不等于(ZF=0) |
JA | 无符号大于(CF=0且ZF=0) |
JNBE | 无符号大于(CF=0且ZF=0) |
JAE | 无符号大于等于(CF=0) |
JNB | 无符号大于等于(CF=0) |
JNC | 无符号大于等于(CF=0) |
JB | 无符号小于(CF=1) |
JNAE | 无符号小于(CF=1) |
JBE | 无符号小于等于(CF=1或ZF=1) |
JNA | 无符号小于等于(CF=1或ZF=1) |
JCXZ | CX/ECX为零 |
JECXZ | ECX为零 |
JG | 有符号大于(ZF=0且SF=OF) |
JNLE | 有符号大于(ZF=0且SF=OF) |
JGE | 有符号大于等于(SF=OF) |
JNL | 有符号大于等于(SF=OF) |
JL | 有符号小于(SF≠OF) |
JNGE | 有符号小于(SF≠OF) |
JLE | 有符号小于等于(ZF=1或SF≠OF) |
JNG | 有符号小于等于(ZF=1或SF≠OF) |
JO | 溢出(OF=1) |
JNO | 未溢出(OF=0) |
JS | 负数(SF=1) |
JNS | 非负数(SF=0) |
分类 | 示例指令 | 功能 |
---|---|---|
数据传输指令 | MOV | 从一个位置复制数据到另一个位置 |
PUSH | 将数据推入堆栈 | |
POP | 将数据从堆栈弹出 | |
XCHG | 交换两个位置的数据 | |
LEA | 加载地址 | |
MOVS | 将一个字符串的数据复制到另一个字符串 | |
LODS | 将数据从一个位置加载到累加器 | |
STOS | 将累加器中的数据存储到一个位置 | |
算术和逻辑指令 | ADD | 将两个数相加 |
SUB | 从一个数中减去另一个数 | |
MUL | 执行无符号乘法 | |
DIV | 执行无符号除法 | |
AND | 执行逻辑与操作 | |
OR | 执行逻辑或操作 | |
XOR | 执行异或操作 | |
NOT | 执行逻辑非操作 | |
控制流指令 | JMP | 无条件跳转到指定地址 |
Jcc | 条件跳转指令,根据标志位执行跳转 | |
CALL | 调用子程序或函数 | |
RET | 返回子程序或函数调用点 | |
INT | 触发中断服务例程 | |
LOOP | 根据计数器值循环执行指令 | |
HLT | 暂停处理器运行 | |
状态标志位指令 | CMP | 比较两个数 |
TEST | 按位进行与操作并更新标志位 | |
CLC | 清除进位标志位 | |
STC | 设置进位标志位 | |
CMC | 取反进位标志位 | |
CLD | 清除方向标志位 | |
STD | 设置方向标志位 | |
字符串和循环指令 | MOVS | 将一个字符串的数据复制到另一个字符串 |
CMPS | 比较两个字符串的数据 | |
SCAS | 在字符串中搜索指定的数据 | |
REP | 重复执行指令块 | |
REPE/REPZ | 如果相等则重复执行指令块 | |
REPNE/REPNZ | 如果不相等则重复执行指令块 | |
堆栈指令 | PUSH | 将数据推入堆栈 |
POP | 将数据从堆栈弹出 | |
PUSHAD | 将所有通用寄存器的值推入堆栈 | |
POPAD | 将所有通用寄存器的值从堆栈弹出 | |
PUSHA | 将通用寄存器的值推入堆栈 | |
POPA | 将通用寄存器的值从堆栈弹出 | |
过程和函数指令 | CALL | 调用子程序或函数 |
RET | 返回子程序或函数调用点 | |
ENTER | 建立堆栈帧 | |
LEAVE | 恢复调用者的堆栈帧 | |
PROC | 定义一个过程 | |
ENDP | 定义过程结束 | |
I/O指令 | IN | 从指定端口读取数据 |
OUT | 将数据写入指定端口 | |
INS | 从数据端口读取数据到字符串 | |
OUTS | 将字符串的数据写入到数据端口 | |
CLI | 关中断 | |
STI | 开中断 |