x86架构基础汇编知识
【摘要】 通用寄存器EAX 32位 函数返回值AX 低16位 AH 高八位 AL 低八位EBX 32位ECX 32位 循环次数,this指针EDX 32位EBP 32位 栈底寄存器ESP 32位 栈顶寄存器ESI 源索引寄存器EDI 目标索引寄存器EIP 无法直接通过汇编操作例子mov al,0xffadd al,1产生截断mov al,0xffadd ax,1产生进位状态寄存器状态寄存器(...
通用寄存器
EAX 32位 函数返回值
AX 低16位 AH 高八位 AL 低八位
EBX 32位
ECX 32位 循环次数,this指针
EDX 32位
EBP 32位 栈底寄存器
ESP 32位 栈顶寄存器
ESI 源索引寄存器
EDI 目标索引寄存器
EIP 无法直接通过汇编操作
例子
状态寄存器
状态寄存器(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 无法直接通过汇编操作
例子
状态寄存器
状态寄存器(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 | 开中断 |
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)