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.pswp.cn/web/22844.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/22844.shtml
英文地址,請注明出處:http://en.pswp.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;想要靠高考改變命運很…