CPU内部结构窥探·「2」

2024-06-06 02:52
文章标签 cpu 内部结构 窥探

本文主要是介绍CPU内部结构窥探·「2」,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

从一条汇编加法指令出发,分析cpu内部发生了什么?

本文将详细剖析ARMv8架构中加法指令的执行过程,深入理解其在CPU上的运行机制。

ARMv8汇编基础

在ARMv8汇编语言中,加法指令ADD的基本格式如下:

ADD destination, source1, source2

例如:

ADD X0, X1, X2

这条指令将寄存器X1和X2中的值相加,并将结果存储到寄存器X0中。

加法指令的详细工作原理

ADD X0, X1, X2为例,详细剖析其在ARMv8架构的CPU上的执行过程。

1. 指令获取(Instruction Fetch)

指令获取是整个指令执行过程的第一步,主要涉及程序计数器(Program Counter, PC)和指令缓存(Instruction Cache, I-Cache)。

  • 程序计数器(Program Counter, PC):保存当前执行指令的内存地址。假设当前PC的值为0x1000,表示正在获取存储在地址0x1000处的指令。
  • 指令缓存(Instruction Cache, I-Cache):高速缓存,从中读取指令以减少访问内存的延迟。

详细流程

  1. PC读取地址:cpu将当前PC指向的地址0x1000发送到内存系统。
  2. 从I-Cache读取指令:如果指令缓存中包含该地址的指令,则直接从I-Cache中读取ADD X0, X1, X2指令。否则,从主内存读取指令,并将其加载到I-Cache中。
  3. 加载到指令寄存器(Instruction Register, IR):指令被加载到指令寄存器IR中,准备进行下一步的译码。

2. 指令译码(Instruction Decode)

指令译码阶段,指令寄存器中的指令被送到指令译码单元(Instruction Decode Unit),并解析出操作码和操作数。

详细流程

  1. 解析操作码:译码单元识别出这是一个ADD指令。
  2. 解析操作数:译码单元识别出涉及的寄存器:目标寄存器X0,源寄存器X1和X2。
  3. 生成控制信号:根据操作码和操作数生成控制信号,用于指导后续的操作数获取和指令执行。

3. 操作数获取(Operand Fetch)

在操作数获取阶段,CPU从寄存器文件中读取操作数,即X1和X2寄存器的值。

详细流程

  1. 寄存器地址:根据指令译码单元的解析结果,确定操作数寄存器的地址X1和X2。
  2. 读取寄存器文件(Register File):寄存器文件根据地址读取X1和X2中的值。例如,假设X1的值为5,X2的值为3。
  3. 传递给ALU:将读取到的操作数(5和3)传递给算术逻辑单元(ALU)。

4. 执行(Execution)

执行阶段,算术逻辑单元(ALU)进行实际的加法运算。

详细流程

  1. 输入操作数:ALU的输入端接收来自寄存器X1和X2的值,分别为5和3。
  2. 二进制加法:ALU内部的加法器执行二进制加法操作:
    • 位加法:每个位执行加法操作,并考虑进位。例如,第0位的加法为1 + 1 = 10(二进制),产生一个进位。
    • 进位传播:将进位传递到下一高位进行进一步加法。
  3. 结果生成:加法运算完成后,ALU输出寄存器中存储的结果为8。

5. 结果写回(Write Back)

在结果写回阶段,ALU的计算结果写回寄存器文件。

详细流程

  1. 结果输出:ALU将结果8输出到目标寄存器X0。
  2. 写回寄存器文件:将8写入寄存器文件中的X0寄存器。
  3. 更新寄存器状态:X0寄存器现在包含值8,更新寄存器文件的状态。

6. 更新程序状态寄存器(Update Program Status Register, PSR)

最后,更新程序状态寄存器(Program Status Register, PSR),以反映加法操作的状态。

详细流程

  1. 进位标志(Carry Flag, C):如果加法运算产生了进位,则设置进位标志。
  2. 溢出标志(Overflow Flag, V):如果加法运算产生了符号位错误,则设置溢出标志。
  3. 零标志(Zero Flag, Z):如果加法结果为零,则设置零标志。
  4. 负数标志(Negative Flag, N):如果加法结果为负数,则设置负数标志。

具体示例

为了更清晰地说明,让我们看一个具体的示例代码片段及其执行过程:

MOV X1, #5      ; 将立即数5加载到X1寄存器
MOV X2, #3      ; 将立即数3加载到X2寄存器
ADD X0, X1, X2  ; 将X1和X2中的值相加,并将结果存储到X0中

执行步骤如下:

  1. MOV X1, #5

    • 指令获取:从内存中获取指令MOV X1, #5
    • 指令译码:解析出这是一个MOV指令,将立即数5加载到X1寄存器。
    • 操作数获取:立即数5。
    • 执行:将5写入X1寄存器。
    • 结果写回:X1寄存器现在包含5。
  2. MOV X2, #3

    • 类似步骤1,将3加载到X2寄存器。
  3. ADD X0, X1, X2

    • 指令获取:获取指令ADD X0, X1, X2
    • 指令译码:解析出这是一个ADD指令,涉及X0、X1和X2寄存器。
    • 操作数获取:读取X1和X2寄存器的值,分别为5和3。
    • 执行:ALU执行加法运算,5 + 3 = 8。
    • 结果写回:将结果8写回X0寄存器。此时,X0寄存器包含8。
    • 更新程序状态寄存器:根据结果8更新程序状态寄存器中的条件标志。

小结

了解汇编指令的执行过程对于深入理解计算机体系结构和优化程序性能具有重要意义。希望这篇博客能帮助你更好地理解ARMv8架构下汇编指令加法操作的运行机制。如果有任何疑问或需要进一步探讨,欢迎在评论区留言!

这篇关于CPU内部结构窥探·「2」的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1034898

相关文章

Java程序到CPU上执行 的步骤

相信很多的小伙伴在最初学习编程的时候会容易产生一个疑惑❓,那就是编写的Java代码究竟是怎么一步一步到CPU上去执行的呢?CPU又是如何执行的呢?今天跟随小编的脚步去化解开这个疑惑❓。 在学习这个过程之前,我们需要先讲解一些与本内容相关的知识点 指令 指令是指导CPU运行的命令,主要由操作码+被操作数组成。 其中操作码用来表示要做什么动作,被操作数是本条指令要操作的数据,可能是内存地址,也

win10不用anaconda安装tensorflow-cpu并导入pycharm

记录一下防止忘了 一、前提:已经安装了python3.6.4,想用tensorflow的包 二、在pycharm中File-Settings-Project Interpreter点“+”号导入很慢,所以直接在cmd中使用 pip install -i https://mirrors.aliyun.com/pypi/simple tensorflow-cpu下载好,默认下载的tensorflow

定位cpu占用过高的线程和对应的方法

如何定位cpu占用过高的线程和对应的方法? 主要是通过线程id找到对应的方法。 1 查询某个用户cpu占用最高的进程号 top -u 用户名 2 查询这个进程中占用cpu最高的线程号 top –p 进程号-H    3 查询到进程id后把进程相关的代码打印到jstack文件 jstack -l pid > jstack.txt 4 在jstack文件中通过16进制的线程id搜索到

CPU亲和性设置 代码示例 sched_setaffinity sched_getaffinity

视频教程在这: cpu亲和性设置,NCCL,sched_setaffinity sched_getaffinity,CPU_ZERO、SET、ISSET、linux_哔哩哔哩_bilibili 一、CPU亲和性简介 CPU亲和性(CPU Affinity)设置是操作系统中一个重要的性能优化手段,它允许程序或进程被绑定到特定的CPU核心上运行。这样做的好处包括减少缓存未命中、降低线程迁移(co

ubuntu16.04 caffe(github源码cpu)+python3.5+opencv3.4.5安装编译

https://www.cnblogs.com/hanjianjian90/p/10604926.html

Ubuntu 标题栏实时显示网速CPU内存

1.用 wget 下载 indicator-sysmonitor,终端执行命令: $ wget -c https://launchpad.net/indicator-sysmonitor/trunk/4.0/+download/indicator-sysmonitor_0.4.3_all.deb2.安装依赖: sudo apt-get install python python-psu

木马导致inetinfo.exe进程占100% CPU的解决方法

电脑进程inetinfo.exe主要用于支持微软Windows IIS网络服务的除错。正常情况下,inetinfo.exe 是 IIS admin Service 或 world wide web publishing service 。这个程序对你系统的正常运行是非常重要的。inetinfo.exe进程属于系统组件,请不要试图停止和删除!   但是如果inetinfo.exe占用CPU 10

cisvc.exe进程占用大量内存和CPU的解决方法

推荐:用电脑尽情K歌、练歌,一展歌喉。打造自己的MTV音乐专辑,分享给所有网友   我的电脑现在反映非常的慢,打开任务管理器发现cisvc.exe这个进程占用了大量的内存和CPU,才导致变慢的。   上网查询之后得知,这是微软Windows 操作系统自带的一个程序,CIDAEMON.EXE和CISVC.EXE都不是木马程序,用来监测CIDAEMON.EXE内存信息的,防止可用内存太低

CPU大小端字节序的检测

机器的字节序有两种,即大端字节序和小端字节序。 大端字节序:在内存中,低地址存放数据的 高位,高地址存放数据的 低位 小端字节序:在内存中,低地址存放数据的 低位,高地址存放数据的 高位 如例:定义数据  a = 0x01020304 小端方式:01 02 03 04 大端方式:04 03 02 01 那么如何判断呢,方式如下--> 一、 指

CPU 虚拟化技术概述

  CPU 虚拟化 CPU虚拟化基础知识  CPU虚拟化是一种技术,它允许多个操作系统在同一个物理CPU上运行。这种技术可以提高计算机的性能和安全性。 CPU 虚拟化是系统虚拟化技术中最核心的部分,因为 CPU 是计算机中最核心的组件,直接控制着整个系统的运行。同时内存访问(内存虚拟化)与 I/O 操作(I/O 虚拟化)也都直接依赖于 CPU,因此 CPU 虚拟化