Intel64 Inside: 寄存器

更多文章关注公众好【白羊哈哈】

1 通用寄存器

Intel64下有1664bit的通用寄存器:rax rbx rcx rdx rdi rsi rbp rsp r8~r15

在上面这些通用寄存器当中,rsp是栈顶指针,rbp是栈帧基址指针。

从上图可以看到,栈区由一个个栈帧组成。rsp指向最上层栈帧的顶部,rbp指向这个栈帧的最底部。

16个寄存器不仅可以按照64bit访问,还可以按照8bit16bit32bit访问。

从上图可以看到,对于寄存器rax rbx rcx rdx除了可以访问最低的8bit之外,还可以访问8bit~15bit

2 段寄存器

Intel64下有616bit段寄存器:cs ds ss es fs gs

32位系统下,这些段寄存器里面存储着段描述符。

64位系统下使用线性地址,已经不需要分段寻址了,除了fsgs寄存器,无论给剩下的段寄存器设置什么值,最终CPU都把它们的值当成0来使用。而寄存器fsgs的值,可能在计算线性地址中使用到。

3 状态寄存器

状态寄存器记录系统和程序执行过程中的各种状态,比如进行加法操作时是否发生了进位等等。

32位系统下,状态寄存器记为eflags。在64位系统下,状态寄存器被扩充到了64bit,记为rflags

rflags虽然有64bit,但是其高32bit被保留未使用,低32biteflags寄存器的一样:

4 指令指针寄存器

Intel64下指令指针寄存器记为rip

rip寄存器存储着下一条要执行的指令地址:

从上图可以看到,使用lldb打印rip的值和断点处的汇编代码地址是一样的。因为断点处的汇编代码,就是要执行的下条指令。

5 xmm 寄存器

Intel64下有16128bitxmm寄存器,记为xmm0~xmm15

Intel CPU规范中,1个字(word)等于16bit

因此,每一个xmm寄存器可以一次存储4个单精度浮点数,2个双精度浮点数,161字节整数,81字整数,42字整数,24字整数。

由于xmm寄存器可以处理浮点数,因此现代应用处理浮点数都使用xmm寄存器,用来取代x87 FPU寄存器。

上图中可以看到,汇编代码里面使用xmm来操作的浮点数计算,对应的OC代码如下:

ObjectiveC 复制代码
+ (void)testDouble {
    double d1 = 2.0;
    double d2 = 3.0f;
    double d3 = d1 + d2;
    NSLog(@"%f", d3);
}

本文由mdnice多平台发布

相关推荐
小二·28 分钟前
Spring框架入门:深入理解Spring DI的注入方式
java·后端·spring
毕设源码-钟学长37 分钟前
【开题答辩全过程】以 基于springboot和协同过滤算法的线上点餐系统为例,包含答辩的问题和答案
java·spring boot·后端
计算机毕设小月哥1 小时前
【Hadoop+Spark+python毕设】中风患者数据可视化分析系统、计算机毕业设计、包括数据爬取、Spark、数据分析、数据可视化、Hadoop
后端·python·mysql
q***44151 小时前
Spring Security 新版本配置
java·后端·spring
计算机毕设匠心工作室1 小时前
【python大数据毕设实战】强迫症特征与影响因素数据分析系统、Hadoop、计算机毕业设计、包括数据爬取、数据分析、数据可视化、机器学习、实战教学
后端·python·mysql
o***74171 小时前
Springboot中SLF4J详解
java·spring boot·后端
雨中散步撒哈拉2 小时前
18、做中学 | 初升高 | 考场一 | 面向过程-家庭收支记账软件
开发语言·后端·golang
韩立学长2 小时前
【开题答辩实录分享】以《智慧物业管理系统的设计与实现》为例进行答辩实录分享
java·后端·mysql
d***95623 小时前
springboot接入deepseek深度求索 java
java·spring boot·后端
iOS开发上架哦3 小时前
Swift中对象实例方法名混淆问题详细解决方法
后端