寄存器:CPU内部的存储单元,用于存放从内存读取而来的数据(包括指令)和CPU运算的中间结果。

使用寄存器来临时存放数据而不直接操作内存原因如下:

  1. CPU的工作原理决定了有些操作只能在CPU内部进行。

  2. CPU读写寄存器的速度比读写内存的速度要快很多。

为便于交流和使用汇编语言编程,CPU厂商为每个寄存器都取了名字,如ADM64 CPU的rax、rbx、rcx等,这样就很方便的在汇编代码中直接使用寄存器的名称来进行编程,来看段Go编写的一行代码来直观的感受下寄存器的使用:

a := b + c

ADM64 Linux平台下用Go编译器编译上述代码可得如下AT&T格式的汇编代码:

mov   (%rsp),%rdx      //把变量b的值从内存中读取到寄存器rdxmov   0x8(%rsp),%rax   //把变量c的值从内存中读取到寄存器raxadd   %rdx,%rax        //把寄存器rdx和rax里面的值相加,之后将结果放回寄存器raxmov   %rax,0x10(%rsp)  //把寄存器rax中的值写回变量a所在的寄存器rsp

由上述汇编代码可以看到,一行Go代码被编译成了四行汇编指令,上述汇编代码里面的rsp、rap、rdp都是寄存器的名称(说明:AT&T格式的汇编代码中所有的寄存器名字前面都有一个%符号)。

可以看到,虽然只有四条指令,但也从侧面说明汇编代码比较简单,因为它所做的工作仅仅只是把数据在内存和寄存器中来回倒腾或是做一些基础的数学以及逻辑运算。

不同体系结构的CPU在其内部存在的寄存器的数量、类型以及名称可能会不同,本文只看ADM64 CPU这一种体系结构,这种CPU在其内部存在二十多个可直接被汇编语言中使用的调度器,还有几种仅在操作系统代码中才会出现,应用层的话,通常只会用到如下三个分类共19个调度器:

  1. 通用寄存器。共有rax、rbx、rcx、rdx、rsi、rdi、rbp、rsp、r8、r9、r10、r11、r12、r13、r14、r15这16个寄存器,CPU对它们的用途没有做特殊规定,可以自定义其用途(其中rsp、rbp这两个寄存器有特殊用途)。

  2. 程序计数寄存器(rip寄存器,也叫PC寄存器、IP寄存器)。用来存放下一条即将用来执行的指令的地址,它决定程序执行的流程。

  3. 段寄存器(fs、gs寄存器)。用来实现线程本地存储(TLS),比如ADM64 Linux下Go语言和pthread线程库都用fs存储器来实现线程的TLS(本地存储)。

上述存储器除了段寄存器是16位的,其它都是64位的,也就是八个字节,但是通用寄存器还可以当做32/16/8位存储器来使用。

不过使用的时候就需要换个名字了,比如可用eax来表示一个32位的寄存器,它使用的是rax寄存器的低32位。为方便各位查阅,下表为64位通用寄存器对应32/16/8位存储器的名称,如下:

64位 32位 16位 8位
rax eax ax al/ah
rbx ebx bx bl/bh
rcx ecx cx cl/ch
rdx edx dx dl/dh
rsi esi si -
rdi edi di -
rbp ebp bp -
rsp esp sp -
r8~r15 r8d~r15d r8w~r15w r8b~r15b

接下来看下rip、rsp、rbp这三个特殊的寄存器。

1、rip寄存器:存放CPU即将执行的下一条指令在内存中的地址。

来看段汇编语言:

0x0000000000400770: add   %rdx,%rax0x0000000000400773: mov   $0x0,%ecx

假设当前CPU正在执行第一条指令,我们可以看到,这条指令在内存中的地址就是0x0000000000400770,很明显,紧随其后的下一条将执行的指令在内存中的地址就是0x0000000000400773,此时,rip寄存器中所存储的值就是0x0000000000400773。

只需要记住,rip寄存器中存储的值不是CPU正在执行的指令在内存中的地址,而是紧随其后那一条将要被执行的指令在内存中的地址。

这里有人可能会问了,上述代码片段中并没有指令来让CPU去修改rip寄存器中的值呀,那rip寄存器是怎么实现上述功能的呢?

修改rip寄存器中的值这个操作是CPU自动控制的,不需要通过指令去修改,当然,CPU对外也提供了几条间接修改rip寄存器的指令,这个后面再详聊。

2、rsp栈顶寄存器以及rbp栈基寄存器。

上述两个寄存器都和函数调用栈相关,其中rsp寄存器一般用来存放函数调用栈的栈顶在内存中的地址,rbp寄存器通常用来存放函数的栈帧在内存中的起始地址。

编译器一般使用上述寄存器加一定偏移来访问函数局部变量或是函数参数,如下:

mov    0x8(%rsp),%rdx

上述汇编语言代码的指令把地址为0x8(%rsp)的内存中的值拷贝到寄存器rdx,此操作就是使用rsp寄存器加一定偏移来读取内存中的值。

到此基础的CPU寄存器相关内容聊得差不多了,这并不是需要了解的全部内容,后续文章中会有体现,喜欢本文的话,欢迎来个三连击。

扫码关注公众号,获取更多优质内容。

聊一聊基础的CPU寄存器~相关推荐

  1. 计算机基础--认识CPU

    计算机基础- -认识CPU 文章目录 计算机基础- -认识CPU 一.CPU是什么 二.CPU实际做什么 三.CPU的内部结构 1.程序编译执行的过程 2.CPU是寄存器的集合体 计算机语言 汇编语言 ...

  2. Intel X86 CPU寄存器学习笔记

    本文对Intel CPU寄存器做一些浅显的介绍.Intel处理器寄存器在很多教科书上有,网络也有很多文章涉及到.因此本文在这些基础上做一些归纳总结,另外也参考了Intel IA32架构软件开发手册. ...

  3. ARM 汇编的操作 设置CPU寄存器BASEPRI

    前言 RTOS 移植到ARM平台上时,使用了较多的ARM汇编指令,需要修改 CPU 寄存器 BASEPRI BASEPRI 是什么 基础优先级屏蔽寄存器,设置为 0x00时,不屏蔽 任何异常 这里使用 ...

  4. 应用服务器cpu类型,服务器基础知识+CPU分类详细+电源标准讲解

    <服务器基础知识+CPU分类详细+电源标准讲解>由会员分享,可在线阅读,更多相关<服务器基础知识+CPU分类详细+电源标准讲解(17页珍藏版)>请在人人文库网上搜索. 1.服务 ...

  5. 通过 RDTSC 指令从 CPU 寄存器中直接获取系统时钟

    很多时候我们使用函数 gettimeofday 以及 clock_gettime 作为我们获取 wall lock的时钟函数. 因为这两种函数是 glibc 提供的用户封装,简单易用,而且能够精确到 ...

  6. 深入iOS系统底层之CPU寄存器介绍

    一弹指六十刹那,一刹那九百生灭. --<仁王经> 组件 计算机是一种数据处理设备,它由CPU和内存以及外部设备组成.CPU负责数据处理,内存负责存储,外部设备负责数据的输入和输出,它们之间 ...

  7. 理解CPU/寄存器/内存三者关系

    CPU/寄存器/内存 CPU,全名Central Processing Unit(中央处理器).这是一块超大规模的集成电路,包含上亿的晶体管,是一台计算机的运算核心(Core)和控制核心(Contro ...

  8. linux基础知识——CPU相关知识

    1.CPU处理程序过程 \qquad在存储介质中,从下至上是进程的时间加载的先后顺序,也是存储空间大小的顺序. 2.MMU(内存管理单元) \qquadMMU是位于CPU内部的一个物理器件.在程序运行 ...

  9. 数据结构是如何装入 CPU 寄存器的?

    作者|码农的荒岛求生 来源|码农的荒岛求生 有同学问了这样一个问题:既然CPU内部的寄存器数量有限,容量有限,那么我们使用的庞大的数据结构是怎样装入寄存器供CPU计算的呢? 这篇文章就为你讲解一下这个 ...

最新文章

  1. O-GAN:简单修改,让GAN的判别器变成一个编码器!
  2. 鸟哥的Linux私房菜(基础学习,服务器架设)
  3. unlink与close关系
  4. windows文件路径 正则表达式_Windows非常实用的四款软件
  5. dba的前景_运维、测试、程序员,这些技术岗位哪个更有前景?
  6. WebApp匯入資料之From Excel
  7. 这周,我们作前端,实现统一的过滤搜索
  8. NOIP1996复赛 普及组 第二题 python
  9. 权限管理系统设计_多校区的教育培训机构,如何选择培训学校crm管理系统?
  10. 总结一下安装linux系统经验-版本选择-安装ubuntu
  11. RedHat 7配置keepalived+LVS实现高可用的Web负载均衡
  12. Android查看appPackage和Activity的多种方法
  13. 停车场计费算法 php,时段计费算法,一般用于停车计费
  14. 700页JVM虚拟机实战手册,呕心巨作,值得一看
  15. 手机原来也能把照片制作成视频?1分钟包你学会,发朋友圈超有范
  16. linux 时钟同步
  17. 中国热泵热水器行业发展趋势及投资风险研究报告
  18. 中国文化悲哀之一个馒头引发的强奸案
  19. Streambox Ripper的问题
  20. 在word中输入带方块的对号

热门文章

  1. MapReduce核心map reduce shuffle (spill sort partition merge)详解
  2. 字符集与字符编码的基础知识
  3. 花儿绽放斩获金梧奖金奖,智能营销赋能品牌增长
  4. 聊聊浏览器的标准模式和怪异模式
  5. VS Visual Studio 魔兽插件开发工具 AddOn Studio for WOW 1 0 含有LUA编辑
  6. java 生鲜在线购买网站 ssm生鲜商城
  7. 南昌大专计算机学校有哪些,江西南昌大专单招学校有哪些
  8. spring security技术分享
  9. 计算机组成原理第一章课件,计算机组成原理第一章课件.ppt
  10. Python创建进程的四种方式