聊一聊基础的CPU寄存器~
寄存器:CPU内部的存储单元,用于存放从内存读取而来的数据(包括指令)和CPU运算的中间结果。
使用寄存器来临时存放数据而不直接操作内存原因如下:
CPU的工作原理决定了有些操作只能在CPU内部进行。
CPU读写寄存器的速度比读写内存的速度要快很多。
为便于交流和使用汇编语言编程,CPU厂商为每个寄存器都取了名字,如ADM64 CPU的rax、rbx、rcx等,这样就很方便的在汇编代码中直接使用寄存器的名称来进行编程,来看段Go编写的一行代码来直观的感受下寄存器的使用:
a := b + c
ADM64 Linux平台下用Go编译器编译上述代码可得如下AT&T格式的汇编代码:
mov (%rsp),%rdx //把变量b的值从内存中读取到寄存器rdx
mov 0x8(%rsp),%rax //把变量c的值从内存中读取到寄存器rax
add %rdx,%rax //把寄存器rdx和rax里面的值相加,之后将结果放回寄存器rax
mov %rax,0x10(%rsp) //把寄存器rax中的值写回变量a所在的寄存器rsp
由上述汇编代码可以看到,一行Go代码被编译成了四行汇编指令,上述汇编代码里面的rsp、rap、rdp都是寄存器的名称(说明:AT&T格式的汇编代码中所有的寄存器名字前面都有一个%符号)。
可以看到,虽然只有四条指令,但也从侧面说明汇编代码比较简单,因为它所做的工作仅仅只是把数据在内存和寄存器中来回倒腾或是做一些基础的数学以及逻辑运算。
不同体系结构的CPU在其内部存在的寄存器的数量、类型以及名称可能会不同,本文只看ADM64 CPU这一种体系结构,这种CPU在其内部存在二十多个可直接被汇编语言中使用的调度器,还有几种仅在操作系统代码中才会出现,应用层的话,通常只会用到如下三个分类共19个调度器:
通用寄存器。共有rax、rbx、rcx、rdx、rsi、rdi、rbp、rsp、r8、r9、r10、r11、r12、r13、r14、r15这16个寄存器,CPU对它们的用途没有做特殊规定,可以自定义其用途(其中rsp、rbp这两个寄存器有特殊用途)。
程序计数寄存器(rip寄存器,也叫PC寄存器、IP寄存器)。用来存放下一条即将用来执行的指令的地址,它决定程序执行的流程。
段寄存器(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,%rax
0x0000000000400773: 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寄存器~相关推荐
- 计算机基础--认识CPU
计算机基础- -认识CPU 文章目录 计算机基础- -认识CPU 一.CPU是什么 二.CPU实际做什么 三.CPU的内部结构 1.程序编译执行的过程 2.CPU是寄存器的集合体 计算机语言 汇编语言 ...
- Intel X86 CPU寄存器学习笔记
本文对Intel CPU寄存器做一些浅显的介绍.Intel处理器寄存器在很多教科书上有,网络也有很多文章涉及到.因此本文在这些基础上做一些归纳总结,另外也参考了Intel IA32架构软件开发手册. ...
- ARM 汇编的操作 设置CPU寄存器BASEPRI
前言 RTOS 移植到ARM平台上时,使用了较多的ARM汇编指令,需要修改 CPU 寄存器 BASEPRI BASEPRI 是什么 基础优先级屏蔽寄存器,设置为 0x00时,不屏蔽 任何异常 这里使用 ...
- 应用服务器cpu类型,服务器基础知识+CPU分类详细+电源标准讲解
<服务器基础知识+CPU分类详细+电源标准讲解>由会员分享,可在线阅读,更多相关<服务器基础知识+CPU分类详细+电源标准讲解(17页珍藏版)>请在人人文库网上搜索. 1.服务 ...
- 通过 RDTSC 指令从 CPU 寄存器中直接获取系统时钟
很多时候我们使用函数 gettimeofday 以及 clock_gettime 作为我们获取 wall lock的时钟函数. 因为这两种函数是 glibc 提供的用户封装,简单易用,而且能够精确到 ...
- 深入iOS系统底层之CPU寄存器介绍
一弹指六十刹那,一刹那九百生灭. --<仁王经> 组件 计算机是一种数据处理设备,它由CPU和内存以及外部设备组成.CPU负责数据处理,内存负责存储,外部设备负责数据的输入和输出,它们之间 ...
- 理解CPU/寄存器/内存三者关系
CPU/寄存器/内存 CPU,全名Central Processing Unit(中央处理器).这是一块超大规模的集成电路,包含上亿的晶体管,是一台计算机的运算核心(Core)和控制核心(Contro ...
- linux基础知识——CPU相关知识
1.CPU处理程序过程 \qquad在存储介质中,从下至上是进程的时间加载的先后顺序,也是存储空间大小的顺序. 2.MMU(内存管理单元) \qquadMMU是位于CPU内部的一个物理器件.在程序运行 ...
- 数据结构是如何装入 CPU 寄存器的?
作者|码农的荒岛求生 来源|码农的荒岛求生 有同学问了这样一个问题:既然CPU内部的寄存器数量有限,容量有限,那么我们使用的庞大的数据结构是怎样装入寄存器供CPU计算的呢? 这篇文章就为你讲解一下这个 ...
最新文章
- 亿级流量网关设计思路
- Android状态栏
- 设计模式之 - 简单工厂模式
- 多线程:线程安全?如何实现?
- megacli通过盘符定位物理盘_柴少鹏的官方网站
- 逆向工程核心原理学习笔记(十):IA-32寄存器基本讲解
- windows下安装zabbix_agent
- 详解SpringMVC中Controller的方法中参数的工作原理[附带源码分析] good
- ORACLE登录错误的解决方法
- 如何查看IIS的80端口被占用?
- yolov3聚类自己数据的anchor box
- Android studio 配置file encoding 无效,中文乱码解决办法
- SpringMVC之分析HandlerMethodArgumentResolver请求对应处理器方法参数的解析过程(一)
- SQL Server从入门到精通pdf
- 超强数据恢复软件【含注册码】
- excel把多个工作表合并
- Ubuntu 18.04实现实时显示网速
- git push -u 简单理解
- android接口的作用是什么意思,Android开发中接口的用处
- 前端展示m3u8视频
热门文章
- 看计算机文档有浏览记录吗,怎样查找电脑文件-怎么查看电脑浏览过的文件 – 手机爱问...
- 饭局上领导递两根烟接哪根?员工不懂“六不”礼数,心态当场崩了
- 面试过阿里的P7大佬分享:180+道Java面试题目!含答案解析!
- 几张产生视觉错觉的图片
- Maven基础(2):Maven详解
- 【Mac 教程系列第 16 篇】如何查看 Apple 产品的真伪
- 跨域的三种主流解决方案
- 南昌大专计算机学校有哪些,江西南昌单招大专学校有哪些学校
- JAVA基础6.59——抽象类(2)
- 1815. 得到新鲜甜甜圈的最多组数 状态压缩