C++:提高篇: 栈-寄存器和函数状态:windows X86-64寄存器介绍
寄存器
- 1、什么是寄存器
- 2、寄存器分类
- 3、windows X86寄存器命名规则
- 4、寄存器相关术语
- 5、寄存器分类
- 5.1、RAX(accumulator register)
- 5.2、RBX(Base register)
- 5.3、RDX(Data register)
- 5.4、RCX(counter register)
- 5.5、RSI(Source index)
- 5.6、RDI(Destination index)
- 5.7、RSP(stack pointer)
- 5.8、RBP(Base pointer)
- 5.9、RIP(instruction pointer)
- 6、普通寄存器
- 6.1、R8~R15
- 6.2、YMM0~15
- 7、特别说明
- 8、汇编指令
- 8.1、数据格式
- 8.2:操作数格式(寻址方式)
- 8.3:汇编指令
- 8.3.1:数据传送指令
- 8.3.2:压入和弹出栈数据
- 8.3.3:算术和逻辑操作
- 8.3.4:控制指令
本篇博客是:栈-寄存器和函数状态专题第一篇文章,主要解释计算机中寄存器相关知识技术,下面的分析,我们都是基于下面这张图。
💙💙💙💙:重点
%ebp 和 %esp:栈是从高地址向低地址延伸的。每个函数的每次调用,都有它自己独立的一个栈帧,%esp总是指向当前栈帧的顶部(低地址),而%ebp通常指向当前栈帧的底部(高地址),用于在栈帧中寻址
1、什么是寄存器
寄存器实际上知识存储数据的地方,只不过它集成在CPU里,访问寄存器的速度比访问内存更快,而内存的访问速度比硬盘更快。
2、寄存器分类
由于寄存器属于底层基础设施,贴近硬件,因此在不同体系结构和操作系统上,寄存器使用方式各异,但是基本上可以分为特殊功能寄存器和普通寄存器,特殊功能寄存器一般用于特定的功能,而普通寄存器可以随意使用。
3、windows X86寄存器命名规则
- 前缀R:表示64位寄存器。例如:RAX
- 前缀E:表示32位寄存器。例如:EAX
- 后缀L:表示寄存器的低8位。
- 后缀H:表示寄存器的9~16位
4、寄存器相关术语
- byte:字节单位,表示8位二进制,是计算机的最小存储单元
- WORD:字。一个字通常是指;两个字节(16位),针对windows X64平台,这个规则总是成立的,其他一些小众的平台不一定满足这一点。
- DWORD:windows API的类型,用于表示“double world”的数据,即32位。
- QWORD:windows API的类型,用于表示“qual word”的数据,即63位。
- x86_x64:这是intel最先推出的指令集
- 栈帧:用于记录程序在某时刻栈的状态,例如在调用一个函数之前,需要保存栈帧,用于在完成调用之后恢复现场。
5、寄存器分类
特殊功能寄存器分为:通用寄存器,索引寄存器。(我们以64位寄存器为例介绍)
---------------------------------------------------------------🎄🎄下面介绍通用寄存器-------------------------------------
-
通用功能寄存器:主要有四种即 【AX,BX,CX,DX】
-

-
细节方面:AX,BX,CX,DX可以再往下划分
👩AX(Accumlator Register):累加寄存器,它主要用于输入/输出和大规模的指令运算
👩BX(Base Register):基址寄存器,用来存储基础访问地址。
👩CX(Count Register):计数寄存器,在迭代的操作中会循环计数。
👩DX(Data Register):数据寄存器,它用于输入/输出操作,它还与AX一起使用,用于涉及大数值的乘法和除法运算。 -
这四种寄存器可以分为上半部分和下半部分。
👨【AX寄存器可以分为两个独立的 8位 AH 和 AL寄存器】
👨【BX寄存器可以分为两个独立的 8位 BH 和 BL寄存器】
👨【CX寄存器可以分为两个独立的 8位 CH 和 CL寄存器】
👨【DX寄存器可以分为两个独立的 8位 DH 和 DL寄存器】


👩🦰 AX的地位(0-7)位构成了 AL 寄存器,高8位(8-15)位构成了AH寄存器。 -
在认识了寄存器之后,我们通过一个示例看一下数据的具体存储方式。
比如:数据 19, 它在16 位存储器中所存储的表示如下:

寄存器的存储方式先是存储 低位,如果低位满足不了就存储高位,如果低位能够满足,高位就用0补全,在其他低位也能满足的情况下,其余位也用0补全。
-------------------------------------------------------🎪🎪🎢索引寄存器---------------------------------------------------
🎈🎈下面介绍索引寄存器
- 索引寄存器主要包含段地址的偏移量,索引寄存器主要分为:
- BP (Base Pointer): 基础指针,它是栈寄存器上的偏移量,用来定位栈上的变量。
- SP (Stack Point): 栈指针,它是栈寄存器上的偏移量,用来定位栈顶。
- SI (Source Index):变址寄存器,用来拷贝源字符串。
- DI(Destination Index): 目标变址寄存器,用来复制目标字符串。
------------------------------------------------🎭🎭🎭控制寄存器----------------------------------------------------------
🎀🎀下面介绍状态和控制寄存器
这两种寄存器是指令指针寄存器和 标志寄存器
IP (Instruction Pointer):指令指针寄存器,它是从Code Segment代码寄存器处的偏移来存储执行的下一条指令。
FLAG:FLAG寄存器用于存储当前进程的状态,这些状态有
- 位置(Direction):用于数据块的传输方向,是向上传输还是向下传输
- 中断标志位(Interrupt): 1–允许,0 --禁止
- 陷入位(Trap) : 确定每条指令执行完成后,CPU是否应该停止。1–开启,0—关闭
- 进位(Carry) :设置最后一个无符号算术是否带有进位
- 溢出(Overflow): 设置最后一个由符号的运算是否溢出
- 符号(Sign): 如果最后一次算术运算为负,则设置 1 —负, 0 —正
- 零位(Zero) :如果最后一次算术运算结果为零, 1–零
- 辅助进位(Aux Carry): 用于第三位到第四位的进位
- 奇偶校验 (Parity):用于奇偶校验
5.1、RAX(accumulator register)
-
accumulator register, 累加寄存器,👩通常用于存储函数的返回值,它主要用于输入/输出和大规模的指令运算,AX 寄存器可以说是使用频率最高的寄存器。
-
也可以用于存储其他值,只是通过RAX存储函数返回值属于惯例。

-
上图我们可以看到这个寄存器分为8个字节(每个字节8位),RAX是64位寄存器的称呼。
🤶🎅🤶 但是这个寄存器是可以拆分的,例如我们操作EAX,就是在对RAX的低32位进行操作。
同样类推:
AX表示RAX的低16位
AH表示RAX低16位中的高8位
AL表示RAX低16位中的低8位
除了了 RIP之外,其余的寄存器都可以做类似的拆分。 -
举例
mov ax,20 /* 将数字20存入寄存器 AX中*/
mov ah,80 /* 将数字80 存入寄存器 AX中的 AH(高位寄存器)中*/
mov al,10 /* 将数字10 存入寄存器 AX中的 AL(低位寄存器)中*/
5.2、RBX(Base register)
base register 基址寄存器,一般用于访问内存的基址
👩 :BX也被称为数据寄存器,即表明其能够暂存一般数据,同样也可以将BX当做两个独立的 8位寄存器使用即 BH 和BL

👨 BX除了具有暂存数据的功能之外,还用于寻址(即寻找物理地址),这就是为什么也有人将其称为基址寄存器,那么它存放的数据一般就用来作为偏移地址使用,因为偏移地址是相对于基址地址上的偏移。
5.3、RDX(Data register)
🧑:DX也是数据寄存器,能够暂存一般性数据。

5.4、RCX(counter register)
👧:counter register,计数寄存器。一般用于循环计数。
- 也可以称为数据寄存器,能够暂存一般性数据,可以分为CH 和CL
- 它也有专门功能:即计数器功能,当汇编指令使用 循环LOOP时,可以通过 CX来指定需要循环的次数,每次执行循环LOOP时间,CPU会做两件事
一件事是:计数器自动减1
另一件事是:判断CX中的值,如果CX中的值为0则跳出循环,继续执行循环下面的指令,如果CX中的值不为0,则会继续执行循环中所指定的指令。

--------------------------------------索引寄存器--------------------------------------------------------------------
5.5、RSI(Source index)
source index : 源变址寄存器,字符串运算时常应用于源指针

5.6、RDI(Destination index)
destination index 目标变址寄存器,字符串运算时常用于目标指针。

5.7、RSP(stack pointer)
- stack Pointer 栈指针寄存器
- 正常情况下存放栈顶地址
- 如果用于其他事务,使用完成之后需要恢复原先的数据

5.8、RBP(Base pointer)
- base pointer 基址寄存器
- 正常情况用于访问栈底地址,与RBP功能类似
- 如果用于其他事务,使用完成之后需要恢复原先的数据

---------------------------------------🧶🧶🧶控制寄存器--------------------------------------------------------------
5.9、RIP(instruction pointer)
- instruction pointer 指令指针
- 只读且不可拆分,指向下一条需要执行指令的地址

6、普通寄存器
6.1、R8~R15
- R8,R9, R10…R15属于普通寄存器,一般是可以任意使用的,不指定特定用途,支持拆分
- 拆分规则与特殊功能寄存器有所不同。 32位拆分寄存器以 D作为后缀(DWORD),16位寄存器以 W作为后缀 (WORD),8位则以 B作为后缀 (BYTE)。

6.2、YMM0~15
YMM015专门用于存储浮点数(包括float和double)。单个寄存器可以存放多个浮点数。例如YMM#支持存放四个64位数值或者8个32位值。支持拆分成XMM015。

7、特别说明
- RSP, RBP最好只用作常规用途。
- 如果另作他用,使用完之后应该恢复原来的数据,因为这两个寄存器包含栈帧信息,这对程序非常重要。
- 一般的寄存器只能存放一个值,但是XMM和YMM寄存器可以看作是数组,它们可以存放多个浮点数。
8、汇编指令
8.1、数据格式
| intel数据类型 | 汇编代码后缀 |
|---|---|
| 字节 | b |
| 字(2字节) | w |
| 双字(4字节) | l |
| 四字(8字节) | q |
| 单精度(4字节) | s |
| 双精度(8字节) | l |
1: Intel使用 字(word)表示 16位数据类型
2:汇编指令除了要指明操作对象,还要指明操作对象的数据类型和长度,所以为指明操作对象的数据类型和长度,可以在指令后面加上表示数据类型的后缀,如:movl 和 movq 分别表示操作对象为双字和四字。
但是操作长度也可以通过寄存器给出,如:eax表示 32位,rax 表示64位
8.2:操作数格式(寻址方式)

8.3:汇编指令
8.3.1:数据传送指令



------------------------💜💜 数据传送指令举例💜💜-----------------------
- move : 数据传递指令,目的操作数不能是立即数,数据不能从内存直接传送到内存(如一定需要,转化成2条指令,从内存取数据到寄存器,然后从寄存器到内存)
💛💛💛💛 move $4, 17(%rsp) : 把数据4 存储到 17(%rsp)所在内存的地址值里。 - lea:(load effective address)其实是mov的变形,它的源操作数看上去是一个内存引用,但并非从指定位置读入数据,而是将有效地址写入到目的操作数,目的操作时只能为寄存器。
💚💚💚💚 lea17(%rsp), %rax :把17(%rsp)的内存地址的值写入到 %rax寄存器中。
8.3.2:压入和弹出栈数据
这两个操作都会修改 %rsp的值

8.3.3:算术和逻辑操作
注意,ADD S,D 由四条加法指令组成,即 addb, addw, addl 和 addq,其他指令也是如此

Intel把16字节的数称为八字(oct word)。下面是一些特殊的指令:

8.3.4:控制指令
-----------------------------------------💔💔条件码💔💔---------------------------------
CPU维护着一组单个位的条件码寄存器,它们描述了最近的算数或者逻辑操作的属性,可以检查这些寄存器来执行条件分支指令。最常用的条件码有:
-
CF:进位标志,最近的操作使最高位产生了进位,可用于检查无符号操作的溢出。
-
ZF:零标志,最近的操作得出的结果为0。
-
SF:符号标志,最近的操作得到的结果为负数 。
-
OF:溢出标志,最近的操作导致一个补码溢出(正溢出获负溢出)。
算术和逻辑操作列出的指令中,除了leaq,其他指令都会修改条件码寄存器。
除了算数和逻辑操作指令可以改变条件码寄存器,下面的指令也可以改变:

-----------------------------------------💔💔访问条件码💔💔----------------------------
条件码通常不会直接读取,常用的使用方法有三种。
- 更具条件码的某种组合,将一个字节设置为0或者1
- 根据条件码进行跳转
- 有条件地传送数据

-----------------------------------------💔💔跳转指令💔💔----------------------------

--------------------------------💔💔条件传送指令💔💔----------------------------

--------------------------------💔💔转移控制💔💔----------------------------

相关文章:
C++:提高篇: 栈-寄存器和函数状态:windows X86-64寄存器介绍
寄存器1、什么是寄存器2、寄存器分类3、windows X86寄存器命名规则4、寄存器相关术语5、寄存器分类5.1、RAX(accumulator register)5.2、RBX(Base register)5.3、RDX(Data register)5.4、RCX(counter register)5.5、RSI(Source index)5.6、RDI(Destination index)5.7、RSP(stac…...
MyBatis-Plus入门案例
MyBatis-Plus入门案例一、MyBatis-Plus简介1、简介2、特性3、支持数据库4、框架结构5、代码及文档地址二、入门案例1、开发环境2、建库建表3、创建Spring Boot工程a>初始化工程b>引入依赖4、编写代码a>配置application.yml 或者 application.propertiesb>添加实体c…...
适用于 Windows 11/10/8/7 的 10 大数据恢复软件分享
适用于 Windows 11/10/8/7 的 最佳数据恢复软件综述。选择首选的专业数据/文件恢复软件,轻松恢复丢失的数据或删除的照片、视频等文件、SSD、外接硬盘、USB、SD卡等存储设备中的文件等。流行的sh流行的数据恢复软件也包括在内。 10 大数据恢复软件分享 为了帮助您恢…...
在线支付系列【23】支付宝支付接入指南
有道无术,术尚可求,有术无道,止于术。 文章目录前言接入指南1. 创建应用2. 绑定应用3. 配置密钥4. 上线应用5. 开通产品沙箱环境开发前准备(沙箱环境)1. 获取参数、秘钥、证书2. 下载支付宝客户端3. 案例演示前言 在之…...
linux系统常用命令
目录 一、系统介绍 二、Linux常用命令 1、Linux命令格式 2、文件目录操作命令:ls 3、文件目录操作命令:cd 4、文件目录操作命令:cat 5、文件目录操作命令:more 6、文件目录操作命令:tail 7、创建文件命令&…...
面试(十一)new与delete(整理) 及 内存泄露
c语言经常使用的是free与malloc,而c++又引入了new和delete它们的区别是什么呢? 内置类型 对于内置类型来说,free和delete、malloc和new几乎没什么区别,但如果是连续的空间,malloc和free只能申请和释放一块空间的内容,而new[] 和 delete[] 可以申请和释放一段连续的空间。…...
2D图像处理:2D ShapingMatching_缩放_旋转_ICP_显示ROI
文章目录 调试结果参考调试说明问题0:并行运行问题问题1:模板+Mask大小问题问题2:组合缩放和旋转问题3:可以直接将计算边缘的代码删除问题4:如何在原始图像上显示匹配到的ROI问题5:计算的原始旋转角度不需要判断,直接可以在ICP中使用问题6:绘制坐标轴问题7:绘制ROI调试…...
(考研湖科大教书匠计算机网络)第四章网络层-第一、二节:网络层概述及其提供的服务
获取pdf:密码7281专栏目录首页:【专栏必读】考研湖科大教书匠计算机网络笔记导航 文章目录一:网络层概述(1)概述(2)学习内容二:网络层提供的两种服务(1)面向连…...
概论_第8章_假设检验的基本步骤__假设检验的类型
一. 假设检验的基本步骤如下:第1步 根据实际问题提出原假设 及备择假设 , 要求 与 有且仅有一个为真;第2步 选取适当的检验统计量, 并在原假设 成立的条件下确定该检验统计量的分布;第3步 按问题的具体要求, 选取适当…...
SpringMVC--简介和入门案例
SpringMVC简介 什么是MVC MVC是一种软件架构的思想,将软件按照模型、视图、控制器来划分 M:Model,模型层,指工程中的JavaBean,作用是处理数据 JavaBean分为两类: 一类称为实体类Bean:专门存储业务数据的,如 Studen…...
Cmake入门02-检测环境(笔记)
文章目录检测操作系统处理平台相关源码处理编译器相关源码编译编译处理器相关源码检查cpu是32位还是64位的检测cpu架构处理 CPU指令相关源码案例展示 Eigen3向量化加速项目设置编译器开启向量化优化《CMake cookbook》笔记检测操作系统 cmake中通过CMAKE_SYSTEM_NAME变量来识别…...
Android JNI C++读写本地文件
文章目录小结Android JNI使用CAndroid JNI读写本地文件有关权限创建文件夹访问 /storage/emulated/0/访问/data/data/example.jniwritefile/时间戳Cant determine type for tag参考小结 进行Android JNI C读写本地文件,取得了想要的效果。 Android JNI使用C 对于…...
图形化深度学习开发平台PaddleStudio(代码开源)
目录一、PaddleStudio概述二、环境准备2.1 安装PaddlePaddle2.2 安装依赖库三、基本使用介绍3.1 启动3.2 快速体验3.2.1 下载示例项目3.2.2 训练3.2.3 评估3.2.4 测试3.2.5 静态图导出四、数据集格式4.1 图像分类4.2 目标检测4.3 语义分割4.4 实例分割五、趣味项目实战…...
【力扣-LeetCode】1138. 字母板上的路径-C++题解
1138. 字母板上的路径难度中等98收藏分享切换为英文接收动态反馈我们从一块字母板上的位置 (0, 0) 出发,该坐标对应的字符为 board[0][0]。在本题里,字母板为board ["abcde", "fghij", "klmno", "pqrst", &quo…...
基于Java+SpringBoot+Vue前后端分离酒店管理系统设计与实现
博主介绍:✌全网粉丝3W,全栈开发工程师,从事多年软件开发,在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建、毕业项目实战、项目定制✌ 博主作品:《微服务实战》专栏是本人的实战经验总结,《S…...
【软考系统架构设计师】2022下综合知识历年真题
【软考系统架构设计师】2022下综合知识历年真题 【2022下架构真题第01题:绿色】 01.云计算服务体系结构如下图所示,图中①、②、③分别与SaaS、PaaS、Iaas相对应,图中①、②、③应为( ) A.应用层、基础设施层、平台层 B.应用层、平台层、基础…...
【计组】理解Disruptor--《计算机组成原理》(十五)
Disruptor 的开发语言,并不是很多人心目中最容易做到性能极限的 C/C,而是性能受限于 JVM 的 Java。其实只要通晓硬件层面的原理,即使是像 Java 这样的高级语言,也能够把 CPU 的性能发挥到极限。 一、Padding Cache Lineÿ…...
Windows11 安装Apache24全过程
Windows11 安装Apache24全过程 一、准备工作 1、apache-httpd-2.4.55-win64-VS17.zip - 蓝奏云 2、Visual Studio Code-x64-1.45.1.exe - 蓝奏云 二、实际操作 1、将下载好的zip文件解压放到指定好的文件夹。我的是D:\App\PHP下 个人习惯把版本号带上。方便检测错误。 2…...
1302机器翻译(队列)
目录 题目描述 提示 解题思路 代码部分 题目描述 小晨的电脑上安装了一个机器翻译软件,他经常用这个软件来翻译英语文章。 这个翻译软件的原理很简单,它只是从头到尾,依次将每个英文单词用对应的中文含义来替换。对于每个英文单词&#…...
AcWing、第 90 场周赛:4806. 首字母大写、4807. 找数字、4808. 构造字符串(C++)
目录 4806. 首字母大写 题目描述: 实现代码: 4807. 找数字 题目描述: 实现代码: 回溯(超时): 原理思路: 贪心: 原理思路: 4808. 构造字符串 问题…...
从零实现STL哈希容器:unordered_map/unordered_set封装详解
本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说,直接开始吧! 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...
拉力测试cuda pytorch 把 4070显卡拉满
import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试,通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小,增大可提高计算复杂度duration: 测试持续时间(秒&…...
爬虫基础学习day2
# 爬虫设计领域 工商:企查查、天眼查短视频:抖音、快手、西瓜 ---> 飞瓜电商:京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空:抓取所有航空公司价格 ---> 去哪儿自媒体:采集自媒体数据进…...
聊一聊接口测试的意义有哪些?
目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开,首…...
图表类系列各种样式PPT模版分享
图标图表系列PPT模版,柱状图PPT模版,线状图PPT模版,折线图PPT模版,饼状图PPT模版,雷达图PPT模版,树状图PPT模版 图表类系列各种样式PPT模版分享:图表系列PPT模板https://pan.quark.cn/s/20d40aa…...
JVM虚拟机:内存结构、垃圾回收、性能优化
1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...
Go 并发编程基础:通道(Channel)的使用
在 Go 中,Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式,用于在多个 Goroutine 之间传递数据,从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...
【LeetCode】算法详解#6 ---除自身以外数组的乘积
1.题目介绍 给定一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O…...
深入浅出Diffusion模型:从原理到实践的全方位教程
I. 引言:生成式AI的黎明 – Diffusion模型是什么? 近年来,生成式人工智能(Generative AI)领域取得了爆炸性的进展,模型能够根据简单的文本提示创作出逼真的图像、连贯的文本,乃至更多令人惊叹的…...
渗透实战PortSwigger靶场:lab13存储型DOM XSS详解
进来是需要留言的,先用做简单的 html 标签测试 发现面的</h1>不见了 数据包中找到了一个loadCommentsWithVulnerableEscapeHtml.js 他是把用户输入的<>进行 html 编码,输入的<>当成字符串处理回显到页面中,看来只是把用户输…...
