ARM64匯編02 - 寄存器與指令基本格式

最近的文章可能會有較多修改,請關注博客哦

異常級別

ARMv8處理器支持4種異常等級(Exception Level,EL)。

  • EL0 為非特權模式,用于運行應用程序,其他資源訪問受限,權限不夠。

  • EL1 為特權模式,用于操作系統內核,可以訪問系統的所有資源

  • EL2 用于運行虛擬化管理管理程序(hypervisor)。

  • EL3 用于運行安全世界中的管理程序,安全模式(secure monitor)。

這里的異常概念不同于程序中的異常概念。當作中斷理解會好點。

執行狀態

ARMv8 架構定義了兩種執行狀態, AArch64和AArch32。當處于 AArch64 狀態時,處理器執行 A64 指令集。當處于 AArch32 狀態時,處理器可以執行 A32(在早期版本的架構中稱為 ARM)或 T32 (Thumb) 指令集。所以,ARMv8的設備可以運行老程序,它是向前兼容的。

注意,AArch64 OS 運行 AArch32 程序時,當應用程序調用(SVC)指令,或接收中斷,會切換到 EL1 和 AArch64。

寄存器

AArch64執行狀態提供了32個在任何時間任何特權級下都可訪問的64位的通用寄存器。

每個寄存器都有64位寬,它們通常被稱為寄存器X0-X30。

每個AArch64 64位通用寄存器(X0-X30)也具有32位(W0-W30)形式。

也就是說,64位模式下寄存器名字叫 Xn,32位模式下名字叫 Wn。這些東西與 CSAPP 里面講的都是差不多的,只不過它講的是 X86 架構。

每個寄存器的用途如下:

在aarch64中,沒有x31或w31寄存器,但是在一些指令或軟件編碼中,經常將數字31作為XZR或SP

  • X0-X7:用于參數傳遞

  • X9-X15:調用方需要保存這些寄存器的值,因為被調用函數可能會修改這些寄存器

  • X19-X29:被調用方保存這些寄存器的值,退出時再恢復,因為函數返回后可能調用方還會用到這些寄存器的值

  • X8, X16-X18, X29, X30:這些都是特殊用途的寄存器

特殊寄存器

  • X8:?用于儲存間接結果的寄存器,比如返回一個結構體的時候,該寄存器儲存的是結構體地址。

  • X18:不管

  • sp:保存棧頂地址

  • fp:保存棧底地址

  • lr:保存調用跳轉指令?bl?指令的下一條指令的內存地址

  • zr:xzr/wzr分別代表 64/32 位,可用于清零的操作,零寄存器

  • pc:?保存將要執行的指令的地址

PSTATE

程序狀態寄存器,程序中會存在很多分支,具體走哪條分支,是由狀態寄存器決定的,比如一些比較指令執行時,需要根據狀態寄存器的負數標志來決定是否進行邏輯分支跳轉。

在aarch64中,只能可以通過MSR/MRS指令訪問特殊寄存器(special-purpose)的方式讀寫這些位。除了這些特殊寄存器中表示的位,PSTATE的其它位都是不能訪問的。

指令格式

ARM指令的基本格式如下:

<opcode> {<cond>} {S} <Rd>, <Rn>{,<operand2>}

其中<>號內的項是必須的,{}號內的項是可選的。各項的說明如下:

  • opcode:指令助記符

  • cond:執行條件

  • S:是否影響CPSR寄存器的值

  • Rd:目標寄存器

  • Rn:第一個操作數的寄存器

  • operand2:第2個操作數

ARM指令格式舉例:

  • LDR R0, [R1]:讀取R1地址上的存儲單元內容,執行條件AL;

  • BEQ DATAEVEN:條件執行分支指令,執行條件EQ,即相等則跳轉到DATAEVEN;

  • ADDS R2, R1, #1:加法指令,R2<-R1+1,影響CPSR寄存器;

  • SUBNES R2, R1,#0x20:條件執行的減法運算,執行條件NE,R1-0x20->R2,影響CPSR寄存器

AArch64沒有直接與ARMv7中的CPSR等價的寄存器,但是可以訪問PSTATE中對應的字段。

尋址方式

我覺的 csapp 在這方面講的是真的好,一個表格就讓初學者對匯編了解很多。看一個例子:

這個表格就說清楚了各種尋址方式對應的匯編格式。

我們看看 arm64 的尋址方式。

立即尋址

立即尋址也叫立即數尋址,這是一種特殊的尋址方式,操作數本身就在指令中給出,只要取出指令也就取到了操作數,這個操作數被稱為立即數,對應的方式也稱為立即尋址

ADD W0, W1, *#0x05*

寄存器尋址

寄存器尋址也就是利用寄存器中的數值作為操作數,這是一種常見的方式,也是效率比較高的尋址方式

ADD W0, W1, W2

寄存器間接尋址

寄存器間接尋址就是以寄存器中值作為操作數的地址,而操作數本身存放在存儲器中

ADD W0, W1, [W2]
LDR W3, [W0]

基址變址尋址

基址變址尋址就是將寄存器(該寄存器一般稱作基址寄存器)的內容與指令中給出的地址偏移量相加,從而得到一個操作數的有效地址。變址尋址方式常用于訪問某基地址附近的地址單元, 常見的有以下幾種形式:

LDR W0, [W1, #4]        ;將寄存器w1中內容加上4作為地址,然后將該地址處的數據存入寄存器w0中
LDR W0, [W1, #4]!       ;將寄存器w1中內容加上4作為地址,然后將該地址處的數據存入寄存器w0中,然后w1中的內容自增4
LDR W0, [W1], #4        ;將寄存器w1中的內容作為地址,然后將該地址處的數據存入w0中,并將w1中內容自增4
LDR W0, [W1, W2]        ;將w1和w2中的內容相加作為地址,然后將該地址處的數據存入w0

后綴

上面有個例子:

LDR W0, [W1, #4]!

匯編后面有個感嘆號。ARM中的指令可以帶后綴,從而豐富該指令的功能,常用的后綴有:

位數后綴

B(byte):功能不變,操作長度變為8位(依賴CPU位數,以下相同)?
H(Halfword):功能不變,操作長度變為16位

例如:ldr指令族:ldrb,ldrh,ldrsb ldrsh,從內存中加載指定長度的數據

S后綴

影響CPSR里的NZCV標識位。指令中使用”S“后綴時、指令執行后程序狀態寄存器的條件標志位將被刷新。相當于有符號運算。

例如:

SUB    X1,X0,X3       ;X1=X0-X3  ,CPSR值不變
SUBS X1,X0,X3        ;X1=X0-X3 , 如果計算結果為負數,CPSR寄存器的N被置位

! 后綴

指令中地址表達式含有“!”后綴時,指令執行后,基址寄存器中的地址值將會發生變化。變化的結果是 (base+offset)。

例如:

LDR X3,[X0,#4]       //X3=X0+4
LDR X3,[X0,#4]!      //X3=X0+4; X0+=4;

注意:“!”不能用于寄存器PC后面

條件后綴

ARM架構中,允許在指令后面添加條件后綴來完成指令條件執行的目的。指令條件執行就是說,指令根據CPSR中條件碼的狀態和指令的條件域有條件的執行。當指令的執行條件滿足時,指令被執行,否則指令將被忽略。

例如:

ADD X4,X2,#1                    ; 無條件執行 X4=X2+1
ADDEQ  X4,X2,#1             ;添加有條件執行后綴EQ,當CPSR中的Z標志置位(之前某條CMP結果相等)時,該指令才執行。注意:如果條件后綴和“S”標識同時出現,則S在條件后綴的后面,例如:
ADDEQS  X4,X2,#1          ;即為有條件執行X4=X2+1,結果更新條件標志位

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/718713.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/718713.shtml
英文地址,請注明出處:http://en.pswp.cn/news/718713.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【王道操作系統】ch1計算機系統概述-06虛擬機

文章目錄 【王道操作系統】ch1計算機系統概述-06虛擬機01傳統計算機02虛擬機的基本概念&#xff08;1&#xff09;第一類虛擬機管理程序&#xff08;2&#xff09; 第二類虛擬機管理程序&#xff08;3&#xff09; 兩類虛擬機管理程序的對比 【王道操作系統】ch1計算機系統概述…

效果炸裂、刷爆各大視頻網站的EMO到底是怎么做到的?

文章鏈接&#xff1a;https://arxiv.org/abs/2402.17485 今天分享的工作是刷爆各大視頻平臺的EMO的背后的工作原理。提出的初衷是著手解決增強發言者的頭部特寫視頻生成中的現實感和表現力的挑戰&#xff0c;重點關注音頻提示與面部動作之間的動態和微妙關系。傳統技術具有局限…

【HarmonyOS】鴻蒙開發之Stage模型-UIAbility的啟動模式——第4.4章

UIAbi lity的啟動模式簡介 一共有四種:singleton,standard,specified,multion。在項目目錄的:src/main/module.json5。默認開啟模式為singleton(單例模式)。如下圖 singleton&#xff08;單實例模式&#xff09;啟動模式 每個UIAbility只存在唯一實例。任務列表中只會存在一…

測試管理進階 | 量力而行:避免成為替罪羊

職場中,我們常常面臨是否幫助他人的抉擇。盡管善良是美德,但過度的好人卡可能會給自己帶來麻煩。本文將探討如何在職場中量力而行,避免成為替罪羊,以及如何保持高效和合理的職責劃分。 我們在工作中常常會遇到一些需要幫助他人的情況,作為團隊的一員,我們希望能夠積極地協…

Linux運維_Bash腳本_編譯安裝libGD-2.3.3

Linux運維_Bash腳本_編譯安裝libGD-2.3.3 Bash (Bourne Again Shell) 是一個解釋器&#xff0c;負責處理 Unix 系統命令行上的命令。它是由 Brian Fox 編寫的免費軟件&#xff0c;并于 1989 年發布的免費軟件&#xff0c;作為 Sh (Bourne Shell) 的替代品。 您可以在 Linux 和…

六、繼承(一)

1 繼承的引入 以往我們想分別實現描述學生、老師的類&#xff0c;可能會這樣子做&#xff1a; class Student {string _name;string _number;int _tel;int id;string _address;int _age; }; class Teacher {string _name;int _level;int _tel;int id;string _address;int _ag…

【歸并排序】 詳細解析 動圖演示 逐圖解析 洛谷P1177【模板】排序 sort【快速排序】

文章目錄 歸并排序1.歸并排序的復雜度分析2.細節解釋3.歸并排序動圖演示3(1) 我們的拆分過程如下↓ 4.code↓ 洛谷P1177【模板】排序數據規模與約定code&#xff08;歸并排序&#xff09;↓code&#xff08;sort排序【快速排序】&#xff09; 完結撒花(&#xffe3;▽&#xff…

閱讀筆記 | REFORMER: THE EFFICIENT TRANSFORMER

閱讀論文&#xff1a; Kitaev, Nikita, ?ukasz Kaiser, and Anselm Levskaya. “Reformer: The efficient transformer.” arXiv preprint arXiv:2001.04451 (2020). 背景與動機 這篇論文發表較早&#xff0c;主要關注Transformer的效率問題。標準的Transformer模型在許多自然…

數據中臺:數字中國戰略關鍵技術實施

這里寫目錄標題 前言為何要建設數據中臺數據中臺建設痛點數據中臺學習資料聚焦前沿&#xff0c;方法論體系更新與時俱進&#xff0c;緊跟時代熱點深入6大行業&#xff0c;提煉實踐精華大咖推薦&#xff0c;數字化轉型必備案頭書 前言 在數字中國這一國家戰略的牽引下&#xff0…

測試基礎|質量保障體系從1到N的思考

在2023年,重點構建了團隊的質量保障體系,基本完成了從0到1的過程積累,也在多個不同的場合做了相關的分享,收獲了很多同行給的建議和意見。今年的首個工作目標是把這套質量保障體系運營好,去覆蓋更多的團隊,完成從1到N的過程,讓更多的團隊從這個質量體系中獲益,保障基本…

Node插件開發(1)-快速入門

在使用Electron開發客戶端時&#xff0c;如果現有Node模塊所提供的功能無法滿足需求&#xff0c;我們可以使用C開發自定義的Node模塊&#xff0c;也稱插件&#xff08;addon&#xff09;。 Node.js插件的擴展名為.node&#xff0c;是二進制文件&#xff0c;其本質上是動態鏈接…

基于springboot+vue的響應式企業員工績效考評系統(源碼+論文)

文章目錄 前言 一、功能設計 1 普通員工功能 2 主管功能 3 系統管理員功能 4 評分標準功能 5 PC端與手機端 6 制圖 二、功能實現 普通員工 1普通員工登錄 2公告板塊 3日志板塊 主管 1主管登錄 2公告板塊 3日志板塊 4績效評分板塊 5個人信息板塊 系統管理員…

TypeScript 日期格式化工具方法

工具方法 創建工具文件&#xff1a;util.ts /*** 獲取時間并格式化函數* param M 格式模板 如: YYYY-MM-DD ...* param Time 可選傳入時間參數 默認為 Now*/ export const getFormatDate (M: string, Time: Date | null | string | number null) > {let date: Date Tim…

在 Linux 環境下安裝 Kibana

目錄 一、Kibana 是什么 二、在 Linux 環境下安裝 Kibana 1、下載安裝包 2、解壓 3、修改 Kibana的配置文件 config/kibana.yml 4、啟動 5、瀏覽器登錄 Kibana 6、測試查詢 一、Kibana 是什么 Kibana 是通向 Elastic 產品集的窗口。 它可以在 Elasticsearch 中對數據進…

品牌推廣的兩種飛輪:非酋飛輪與歐皇飛輪

在品牌推廣的世界里&#xff0c;存在著兩種截然不同的飛輪效應&#xff0c;我們稱之為“非酋飛輪”與“歐皇飛輪”。這兩種飛輪象征著品牌發展的兩種不同路徑和策略&#xff0c;而迅騰文化則以其獨特的“繁”的原則&#xff0c;巧妙地將這兩種飛輪結合&#xff0c;助力品牌形成…

Linux安裝JumpServer并結合內網穿透實現公網訪問本地服務

&#x1f49d;&#x1f49d;&#x1f49d;歡迎來到我的博客&#xff0c;很高興能夠在這里和您見面&#xff01;希望您在這里可以感受到一份輕松愉快的氛圍&#xff0c;不僅可以獲得有趣的內容和知識&#xff0c;也可以暢所欲言、分享您的想法和見解。 推薦:kwan 的首頁,持續學…

Kubernetes 學習總結(46)—— Pod 不停重啟問題分析與解決

我們在做性能測試的時候&#xff0c;往往會發現我們的pod服務&#xff0c;頻繁重啟&#xff0c;通過kubectl get pods 命令&#xff0c;我們來逐步定位問題。 現象:running的pod&#xff0c;短時間內重啟次數太多。 定位問題方法:查看pod日志 kubectl get event …

【Element】實現基于 Element UI el-tabs 的左右滑動動畫

實現基于 Element UI el-tabs 的左右滑動動畫 引言 在構建現代 web 應用時&#xff0c;為用戶提供平滑的動畫效果是提升用戶體驗的關鍵。本篇博客將詳細介紹如何在使用 Vue 以及 Element UI 時&#xff0c;實現一個具有左右滑動效果的 tab 切換動畫。 使用 el-tabs 創建 tab…

Flutter 中的 SliverGrid 和 GridView:區別與使用場景

在 Flutter 中&#xff0c;SliverGrid 和 GridView 都是用于展示網格布局的組件&#xff0c;但它們有著不同的特點和適用場景。本文將介紹它們之間的區別以及在實際開發中的使用場景。 SliverGrid 和 GridView 的區別 SliverGrid&#xff1a; SliverGrid 是 CustomScrollView …

第十五屆藍橋杯第三期模擬賽題單

目錄 第一題&#xff1a; 第二題&#xff1a; 第三題&#xff1a; 第四題: 第五題&#xff1a; 第六題&#xff1a; 第七題 第八題 第九題 第十題 第一題 【問題描述】 請問 2023 有多少個約數&#xff1f;即有多少個正整數&#xff0c;使得 2023 是這個正整數的整數倍…