x86架构基础汇编知识

2023-09-14 23:51:17

 

通用寄存器

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开中断
更多推荐

【Mysql系列】mysql中删除数据的几种方法

写在前面在MySQL数据库中,删除数据是一个常见的操作,它允许从表中移除不再需要的数据。在执行删除操作时,需要谨慎,以免误删重要数据。方法介绍以下是MySQL中删除数据的几种方法:DELETE语句DROPTABLE语句TRUNCATETABLE使用外键约束1.DELETE语句DELETE语句是最常用的删除数据方法之一。

pyarmor 加密许可证的使用

一pyarmor许可证的用处文档:5.许可模式和许可证—Pyarmor8.3.6文档试用版本有如下的限制:加密功能对脚本大小有限制,不能加密超过限制的大脚本。混淆字符串功能在试用版中无法使用。RFT加密模式,BCC加密模式在试用版无法使用。不可以应用于商用产品。特别的,如果商用产品的累计销售额小于基础版许可证费用乘以3

Rocky Linux 安装图解(替代centos)服务器+桌面

centos自从20年底转变为不稳定版本后,有很多替代方案经过近3年的发展,rockylinux算是一个比较好的选择,一是依照redhat企业版来做,二是rocky的发起者也是centos的创始人如果想安装debian,可以参考:debian图解安装如果想安装ubuntu,可以参考:ubuntu图解安装2023.9.1

MySQL中的事务基础

文章目录事务的ACID特性事务的隔离级别数据并发问题事务的隔离级别事务的ACID特性MySQL中的事务指的是在数据库操作中,将一组SQL语句作为一个不可分割的执行单元进行处理的机制。事务具有原子性、一致性、隔离性和持久性的特性(ACID特性)。原子性(Atomicity):事务中的所有操作要么全部成功执行,要么全部失败

机器学习技术(八)——朴素贝叶斯算法实操

机器学习技术(八)——朴素贝叶斯算法实操文章目录机器学习技术(八)——朴素贝叶斯算法实操一、引言二、导入相关依赖库三、读取并查看数据四、数据预处理五、构建两种模型进行比较1、只考虑Dayofweek以及District2、加入犯罪时间节点六、总结一、引言上文讲述了逻辑回归在分类任务上的应用及算法原理:https://b

Layui快速入门之第五节 导航

目录一:基本概念导航依赖element模块API渲染属性事件二:水平导航常规用法:三:垂直导航四:侧边垂直导航五:导航主题六:加入徽章等元素七:面包屑导航ps:面包屑导航渲染一:基本概念导航是指支持用户导航、进入和退出应用中不同内容片段的交互。导航菜单包含水平导航和垂直导航,在2.x版本中,nav组件属于element

MySQL如何进行增量备份与恢复?

目录一、MySQL介绍二、增量备份三、备份恢复一、MySQL介绍MySQL是一款开源的关系型数据库管理系统(RDBMS),它以其可靠性、灵活性和易于使用而备受赞誉。以下是关于MySQL数据库的介绍:MySQL是由瑞典公司MySQLAB开发,随后被SunMicrosystems收购,最终被甲骨文公司(OracleCorp

计算机竞赛 机器学习股票大数据量化分析与预测系统 - python 计算机竞赛

文章目录0前言1课题背景2实现效果UI界面设计web预测界面RSRS选股界面3软件架构4工具介绍Flask框架MySQL数据库LSTM5最后0前言🔥优质竞赛项目系列,今天要分享的是🚩机器学习股票大数据量化分析与预测系统该项目较为新颖,适合作为竞赛课题方向,学长非常推荐!🥇学长这里给一个题目综合评分(每项满分5分)

【学习】一致性哈希与哈希环

一致性哈希一致性哈希(ConsistentHashing)是一种用于数据分布和负载均衡的算法,其核心思想是将数据和节点都映射到一个虚拟的哈希环上,并通过哈希值来确定数据应该分布到哪个节点上。以下是一致性哈希的基本实现步骤:1、确定哈希函数:首先,选择一个合适的哈希函数,它将数据映射到一个足够大的哈希空间,通常是一个整数

【C++】标准流与命名空间简介 ( Visual Studio 2019 中创建 C++ 项目 | iostream 标准流 | std 标准命名空间 | cout 控制台输出 )

文章目录一、VisualStudio2019中创建C++项目二、C++代码编写1、iostream标准流2、std标准命名空间3、cout控制台输出4、代码示例一、VisualStudio2019中创建C++项目打开VisualStudio2019,选择"菜单栏/文件/新建/项目"选项,创建新项目;选择Windows平

【C++】面向对象编程引入 ( 面向过程编程 | 查看 iostream 依赖 | 面向对象编程 )

文章目录一、面向过程编程二、查看iostream依赖三、面向对象编程一、面向过程编程给定圆的半径,求该圆的周长和面积;半径为rrr,周长就是2πr2\pir2πr,面积是πr2\pir^2πr2;使用面向过程的方法解决上述问题,只能是令程序顺序执行,如果要求多个圆的面积,则需要重复执行过程代码;代码示例://包含C++

热文推荐