当前位置: 首页 > news >正文

x86架构基础汇编知识

 

通用寄存器

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)
JCXZCX/ECX为零
JECXZECX为零
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
产生进位

状态寄存器

​编辑

2023-08-30T09:03:45.png

状态寄存器(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)
JCXZCX/ECX为零
JECXZECX为零
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)

​编辑

2023-08-30T09:14:35.png

汇编指令

分类示例指令功能
数据传输指令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开中断
http://www.lryc.cn/news/166885.html

相关文章:

  • ThreadLocal的原理
  • Chrome 108版(64-bit 108.0.5359.125)网盘下载
  • Mars3d插件参考开发教程并在相关页面引入
  • Windows 性能突然打鸡血,靠 Bug 修复了多年顽疾
  • 亚马逊封买家账号的原因有哪些
  • 1.0零基础尝试DCM通讯(c-store)
  • vue之封装tab类组件
  • 固定资产管理中净值怎么算
  • SQlite操作后如何正确退出
  • phpcmsV9.6.0sql注入漏洞分析
  • 深入理解正则表达式:高效处理文本数据的利器
  • 张雪峰说网络空间安全专业
  • day11-ArrayList学生管理系统
  • java springboot 如何实现小程序支付
  • 题目:2839.判断通过操作能否让字符串相等 I
  • 【Prometheus】Prometheus+Grafana部署
  • 无CDN场景下的传统架构接入阿里云WAF防火墙的配置实践
  • 和鲸技术!国家气象信息中心人工智能气象应用基础技术平台上线
  • GIT高级使用技巧
  • JavaScript中的垃圾回收机制
  • Java替换 html 中隐藏的空格字符
  • 微博情绪分类
  • 探索项目追踪平台的多样性及功能特点
  • git简单命令
  • Fiber 架构的起源和含义
  • Vue3高频面试题+八股文
  • 对数据库三大范式的理解
  • (matplotlib)如何不显示x轴或y轴刻度(ticks)
  • U8用友ERP本地部署异地远程访问:内网端口映射外网方案
  • 怎么提取一个python文件中所有得函数名称