x86架构基础汇编知识

举报
白茶加冰 发表于 2023/09/15 00:07:48 2023/09/15
【摘要】 ​  ​通用寄存器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 无法直接通过汇编操作

例子

mov al,0xff
add al,1
产生截断

mov al,0xff
add ax,1
产生进位


状态寄存器

状态寄存器(Status Register),也称为标志寄存器(Flag
Register),是计算机中的一种特殊寄存器。状态寄存器用于保存关于计算机状态和执行结果的信息,通常由一组二进制位组成,每个位都对应一个特定的状态标志。

在x86架构中,状态寄存器通常由一些标志位组成,其中包括:

  1. 零标志位(Zero Flag,ZF):指示最近的运算结果是否为零。如果运算结果为零,则ZF被置为1,否则为0。
  2. 进位标志位(Carry Flag,CF):用于处理进位和借位操作。如果最近的运算产生了进位(或借位),CF被置为1,否则为0。
  3. 溢出标志位(Overflow Flag,OF):用于检测运算结果是否溢出。如果最近的运算结果造成了溢出,OF标志被置为1,否则为0。
  4. 符号标志位(Sign Flag,SF):指示最近的运算结果的符号。如果结果为负数,则SF被置为1,否则为0。
  5. 奇偶标志位(Parity Flag,PF):指示最近的运算结果中设置了偶数个位的数量。如果结果中偶数个位被设置为1,则PF被置为1,否则为0。
  6. 调整标志位(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架构中,状态寄存器通常由一些标志位组成,其中包括:

  1. 零标志位(Zero Flag,ZF):指示最近的运算结果是否为零。如果运算结果为零,则ZF被置为1,否则为0。
  2. 进位标志位(Carry Flag,CF):用于处理进位和借位操作。如果最近的运算产生了进位(或借位),CF被置为1,否则为0。
  3. 溢出标志位(Overflow Flag,OF):用于检测运算结果是否溢出。如果最近的运算结果造成了溢出,OF标志被置为1,否则为0。
  4. 符号标志位(Sign Flag,SF):指示最近的运算结果的符号。如果结果为负数,则SF被置为1,否则为0。
  5. 奇偶标志位(Parity Flag,PF):指示最近的运算结果中设置了偶数个位的数量。如果结果中偶数个位被设置为1,则PF被置为1,否则为0。
  6. 调整标志位(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

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。