Intel64 Inside: 寄存器

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

1 通用寄存器

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

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

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

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

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

2 段寄存器

Intel64下有6个16bit段寄存器:cs ds ss es fs gs。

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

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

3 状态寄存器

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

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

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

4 指令指针寄存器

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

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

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

5 xmm 寄存器

Intel64下有16个128bit的xmm寄存器,记为xmm0~xmm15。

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

因此,每一个xmm寄存器可以一次存储4个单精度浮点数,2个双精度浮点数,16个1字节整数,8个1字整数,4个2字整数,2个4字整数。

由于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多平台发布

相关推荐
Cosolar1 小时前
不收费、不加水印、数据归你:我做了个开源的在线简历工具
后端·面试·前端框架
小蒜学长2 小时前
基于Spring Boot+Vue3的在线医疗咨询系统的设计与实现(代码+数据库+LW)
java·spring boot·后端·在线问诊·在线医疗咨询系统
陈随易3 小时前
下载神器!Motrix 停更三年后重写回归
前端·后端·程序员
每天一道题3 小时前
CAP、Raft 与多数派:分布式系统如何达成一致?
分布式·后端·微服务
前端的日常3 小时前
一个人+AI做情侣食谱小程序,0 费用的服务器
前端·后端
IT_陈寒4 小时前
Vue的v-for里用了个临时变量,页面直接挂了
前端·人工智能·后端
ServBay5 小时前
本地模型已经跑起来了,Copilot Fusion 为什么还要联网?
后端·ai编程·github copilot
武子康5 小时前
H3-World 的动作没按时发生,先检查时间线变成了什么
人工智能·后端·agent
苍何5 小时前
腾讯 Buddy One 来了,办公全家桶一键打通WorkBuddy(附教程)
后端
GIS数据转换器6 小时前
基于CIM的城市智慧供热监管服务平台
java·大数据·开发语言·人工智能·后端·物联网·struts