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架构下汇编指令加法操作的运行机制。如果有任何疑问或需要进一步探讨,欢迎在评论区留言!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/22844.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【python】python租房数据分析可视化(源码+数据+报告)【独一无二】

👉博__主👈:米码收割机 👉技__能👈:C/Python语言 👉公众号👈:测试开发自动化【获取源码商业合作】 👉荣__誉👈:阿里云博客专家博主、5…

在Go语言中如何使用变量

1. 变量 Go 中的变量是标识符。例如,我们可能需要存储客户的电子邮件地址,但还需要确保它是有效的。这种情况下,可以创建一个名为 email 的变量来存储电子邮件的值。电子邮件地址可以分配给 email 变量。 变量引用一个内存地址,赋…

OpenCV学习(4.3) 图像阈值

1.目的 在本教程中: 你会学到简单阈值法,自适应阈值法,以及 Otsu 阈值法(俗称大津法)等。你会学到如下函数:**cv.threshold,cv.adaptiveThreshold** 等。 2.简单阈值法 此方法是直截了当的。如果像素值大于阈值&am…

word2016版本中同时显示多个页面

为了方便查看word内容,我们会将多个页面同时显示。 对于2016版,操作方法如下: 视图 ---》多页

Jan任意文件读取/下载和上传漏洞

自从ChatGPT横空出世以来,我一直想找一个可以自己训练的AI大模型,然而在使用Jan的过程中,数据包中传递的参数引起了我的兴趣,简单尝试后发现了任意文件读取和任意文件上传漏洞。 简介 Jan是ChatGPT的开源替代品,它在…

vuInhub靶场实战系列--bulldog-1

免责声明 本文档仅供学习和研究使用,请勿使用文中的技术源码用于非法用途,任何人造成的任何负面影响,与本人无关。 目录 免责声明前言一、环境配置1.1 靶场信息1.2 靶场配置 二、信息收集2.1 主机发现2.1.1 netdiscover2.1.2 nmap主机扫描2.1.3 arp-scan主机扫描 2.2 端口扫描…

友思特案例 | 自动快速定位:使用波长选择器测量滤光片的关键光学性能指标

导读 光学滤光片检测的手动调节校准的传统方法存在诸多不确定误差和高昂的成本消耗。友思特全自动可调谐光源检测解决方案,可全自动调节波长带宽,快速收集光谱数据,缩短检测时间、降低质检成本,实现极高的准确率和快速检测效率。…

RA8D1-Vision Board上OSPI-Flash实践

Vision-Board 开发板是 RT-Thread 推出基于瑞萨 Cortex-M85 架构 RA8D1 芯片,拥有Helium和TrustZone技术的加持,性能非常强大。 内核:480 MHz Arm Cortex-M85,包含Helium和TrustZone技术 存储:集成2MB/1MB闪存和1MB SRAM(包括TCM,512KB ECC保护) 外设:兼容xSPI的四线O…

gorse修改开源项目后,如何使用Docker compose发布

代码修改 git checkout v0.4.15 修改代码后提交。 镜像构建 export GOOSlinux export GOARCHamd64 export GOMAXPROCS8go build -ldflags"-s -w -X github.com/zhenghaoz/gorse/cmd/version.Version$(git describe --tags $(git rev-parse HEAD)) -X github.com/zhengh…

如何在强数据一致性要求下设计数据库的高可用架构

在高可用的三大架构设计(基于数据层的高可用、基于业务层的高可用,以及融合的高可用架构设计)中。仅仅解决了业务连续性的问题:也就是当服务器因为各种原因,发生宕机,导致MySQL 数据库不可用之后,快速恢复业务。但对有状态的数据库服务来说,在一些核心业务系统中,比如…

运营商卷大模型,云厂商霸主地位不保?

文|艺 思 编|王一粟 经过了2023年的小试牛刀,2024年,三大运营商带着大模型一路狂飙。 刚刚过去的5月,中国电信、中国移动、中国联通三大运营商集体完成了新一轮的大模型进化,特别是围绕大模型的研发与…

【区分vue2和vue3下的element UI TimePicker 时间选择器组件,分别详细介绍属性,事件,方法如何使用,并举例】

在 Vue 2 中,我们通常使用 Element UI 来实现时间选择器(TimePicker)组件。然而,在 Vue 3 中,Element UI 没有官方支持 Vue 3 的版本。但是,有一个名为 Element Plus 的库,它是 Element UI 的 V…

04--Tomcat

前言:本章整理tomcat的知识点,tomcat知识点相较nginx比较少,但是也是运维必会的软件,这里结合实际项目整理一下。 1、tomcat简介 Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器&#x…

强烈安利10款手机App!

AI视频生成:小说文案智能分镜智能识别角色和场景批量Ai绘图自动配音添加音乐一键合成视频https://aitools.jurilu.com/ 1.听书神器——昊昊听书 昊昊听书app是一款专门为用户提供有声读物的应用程序。它不仅提供了各种类型的有声书籍,还有各种知名的电…

pw命令1

1、查看集群状态命令 gs_om -t status --detail 2、备节点升主(本例子升2节点为主) date && time cm_ctl switchover -n 2 -D /database/panweidb/data 3、cm_ctl是全局的,在一个节点运行 cm_ctl stop && cm_ctl start 就重…

铸铁机械5G智能工厂工业物联数字孪生平台,推进制造业数字化转型

铸铁机械5G智能工厂工业物联数字孪生平台,推进制造业数字化转型。工业物联数字孪生平台以5G技术为基础,通过工业物联网连接铸铁机械生产过程中的各个环节,运用数字孪生技术构建虚拟工厂,实现生产过程的实时监测、模拟与优化&#…

垃圾回收算法

垃圾回收基于“对象不再使用”的原则,自动检测并回收不再被引用的对象。JVM通过跟踪对象的引用关系来判断对象是否仍在使用中。当一个对象没有任何引用指向它时,垃圾回收器就会将其标记为可回收对象。 垃圾回收的工作机制 标记-清除(Mark-S…

ros与硬件的交互

(一) 与usb相机的交互 第一个链接是 先从usb中拿到图像,然后再发布和订阅 【C】ROS:cv_bridge包使用与图像转换示例_cvbridge-CSDN博客 第二个链接是使用方法 ROS学习笔记--cv_bridge_cvbridge-CSDN博客 第三个链接是,…

C语言的printf输出问题

看到这段代码的时候&#xff0c;想到这个printf输出的值是多少? 若您想到的答案是1-2&#xff0c;真的是这样吗&#xff1f; #include <stdio.h>int main(int argc, char *argv[]) {int i 1;printf("%d-%d\r\n", i, i);return 0; }先了解一个知识点&#xf…

2024.6.05总结1102

今天刷到一个视频&#xff0c;话题非常沉重&#xff0c;看完后感觉整个人特别压抑。 这个话题是&#xff1a;“高考能改变一个人的命运吗&#xff1f;”在这个视频中&#xff0c;主持人采访了很多个人&#xff0c;但很多人的观点是今时不同往日&#xff0c;想要靠高考改变命运很…