日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

02-Armv8-A Instruction Set Architecture

發布時間:2025/3/21 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 02-Armv8-A Instruction Set Architecture 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

ARMV9 Instruction set 指令 在線速查

1、Overview

術語
Instruction Set Architecture (ISA) – 指令集架構

指令集架構 (ISA) 是計算機抽象模型的一部分。 它定義了軟件如何控制處理器。
Arm ISA 允許您編寫符合 Arm 規范的軟件和固件。 這意味著,如果您的軟件或固件符合規范,任何基于 Arm 的處理器都將以相同的方式執行它。
本指南介紹了 A64 指令集,用于 64 位 Armv8-A 架構,也稱為 AArch64。
本文不會涵蓋本指南中的每一條指令。 Arm 架構參考手冊 (Arm ARM) 中詳細介紹了所有指令。 相反,本文將介紹指令的格式、不同類型的指令以及用匯編程序編寫的代碼如何與編譯器生成的代碼進行交互。

2、為什么要關心ISA

作為開發人員,你可能很少去寫匯編程序。 但是,匯編程序在某些領域仍然很重要,例如第一階段引導軟件或一些低級內核活動。
即使您不直接編寫匯編代碼,了解指令集可以做什么,以及編譯器如何使用這些指令,也可以幫助您編寫更高效的代碼。 它還可以幫助您理解編譯器的輸出。 這在調試時很有用

3、Instruction sets in the Armv8-A

Armv8-A 支持三種指令集:A32、T32 和 A64。
在 AArch64 執行狀態下執行時使用 A64 指令集。 它是一個固定長度的 32 位指令集。 名稱中的“64”指的是 AArch64 執行狀態使用該指令。 它不是指內存中指令的大小。
A32 和 T32 指令集也分別稱為“ARM”和“Thumb”。

4、 Instruction set resources

每個版本的 Arm 架構都有自己的 Arm Architecture Reference Manual,可以在 Arm 開發人員網站上找到。每個 Arm ARM 都提供了每條指令的詳細說明,包括:

  • 編碼 - 指令在內存中的表示。
  • 參數 - 指令的輸入。
  • 偽代碼 - 指令的作用,以 Arm 偽代碼語言表示。
  • 限制 - 當指令不能使用時,或者它可以觸發的異常。

A64 的指令描述也有 XML 和 HTML 格式。如果您需要經常參考說明,XML 和 HTML 格式非常有用。 XML 和 HTML 格式可以在 Arm 開發人員網站上找到。您可以在本指南的相關信息部分找到一個鏈接。 XML 可以作為壓縮檔案下載,HTML 可以使用 Web 瀏覽器查看和搜索。

注意:XML/HTML 和 Arm Architecture Reference Manual 中的信息取自同一來源,但格式可能略有不同。

5、Simple sequential execution

Arm 架構描述了遵循簡單順序執行 (SSE) 模型的指令。 這意味著處理器的行為就像處理器一次提取、解碼和執行一條指令,并且按照指令在內存中出現的順序。
實際上,現代處理器的流水線可以一次執行多條指令,并且可能會亂序執行。 此圖顯示了 Arm Cortex 處理器的示例管道:

你會記得架構是一個功能描述。 這意味著它沒有指定單個處理器的工作方式。 每個處理器的行為都必須與簡單的順序執行模型一致,即使它在內部對指令進行重新排序。

6、Registers in AArch64

6.1 、General-purpose registers

31個通用寄存器、PSTATE、PC、SP、XZR

6.2、 特殊寄存器

6.3、 System registers

系統寄存器就多了,有以下種類:

7 、 Data processing

7.1 、Arithmetic and logic operations
7.2 、 Floating point
7.2.1 、Is floating point support optional?
7.3 、 Bit manipulation
7.4 、 Extension and saturation
7.4.1 、Sub-register-sized integer data processing
7.5 、 Format conversion
7.6 、 Vector data

8 、 Loads and stores

8.1、Load-Store Single Register 單寄存器讀寫
ldr{<size>} Rd, <addr> str{<size>} Rd, <addr><size> : b h sb sh sw
8.2、Load-Store Single Register (unscaled offset) offset為-256 ~ +256對齊讀寫
ldur{<size>} Rd, <addr> stur{<size>} Rd, <addr><size> : b h sb sh sw
8.3、Load-Store Pair 雙寄存器讀寫
ldp{<size>} Rd, <addr> stp{<size>} Rd, <addr><size> : b h sb sh sw
8.4、Load-Store Non-temporal Pair 直接讀寫外存,跳過cache
ldnp{<size>} Rd, <addr> stnp{<size>} Rd, <addr><size> : b h sb sh sw
8.5、Load-Store Unprivileged 以EL0身份讀寫
ldtr{<size>} Rd, <addr> sttr{<size>} Rd, <addr><size> : b h sb sh sw
8.6、Load-Store Exclusive 獨占
ldxr{<size>} Rd, <addr> stxr{<size>} Rd, <addr>ldxp{<size>} Rd, <addr> stxp{<size>} Rd, <addr><size> : b h sb sh sw
8.7、Load-Acquire / Store-Release 帶有aruire/release語義的讀寫
(Non-exclusive) ldar{<size>} Rd, <addr> stlr{<size>} Rd, <addr>(exclusive) ldaxr{<size>} Rd, <addr> stlxr{<size>} Rd, <addr><size> : b h sb sh sw
8.8、總結以上指令

9 、 Program flow

指令統計

  • 條件跳轉指令 : 5個
  • 無條件跳轉label指令 : 2個
  • 無條件跳轉register指令 : 3個
9.1、條件跳轉指令

(偏移范圍為±1MiB)

  • b.cond label
  • cbz Xn|Wn, label
  • cbnz Xn|Wn, label
  • tbz Xn|Wn, #uimm6, label //如果Xn的第uimm的bit位位0,則跳轉到label
  • tbnz Xn|Wn, #uimm6, label

(b.cond的condition條件)

(b.cond的應用)

.align 7, INV_INSN el0_sync_a64:restore_mappingmrs x2, esr_el1mrs x3, sp_el0lsr x2, x2, #ESR_EC_SHIFTcmp x2, #ESR_EC_AARCH64_SVCb.eq el0_svc //-----------b.cond的應用b el0_sync_abortcheck_vector_size el0_sync_a64

(cbz、cbnz的應用)
當調用__cpu_spin_trylock(lock)時

FUNC __cpu_spin_trylock , :mov x1, x0mov w2, #SPINLOCK_LOCK .loop: ldaxr w0, [x1]cbnz w0, .cpu_spin_trylock_out //------相當于是在檢查參數的合法性,lock==NULL時直接返回stxr w0, w2, [x1]cbnz w0, .loop .cpu_spin_trylock_out:ret END_FUNC __cpu_spin_trylock

(tbz、tbnz的應用)

LOCAL_FUNC el1_sync_abort , :mov x0, spmsr spsel, #0mov x3, sp /* Save original sp *//** Update core local flags.* flags = (flags << THREAD_CLF_SAVED_SHIFT) | THREAD_CLF_ABORT;*/ldr w1, [x0, #THREAD_CORE_LOCAL_FLAGS]lsl w1, w1, #THREAD_CLF_SAVED_SHIFTorr w1, w1, #THREAD_CLF_ABORTtbnz w1, #(THREAD_CLF_SAVED_SHIFT + THREAD_CLF_ABORT_SHIFT), \ //--------------tbnz的使用.Lsel_tmp_sp/* Select abort stack */ldr x2, [x0, #THREAD_CORE_LOCAL_ABT_STACK_VA_END]b .Lset_sp .Lsel_tmp_sp:/* Select tmp stack */ldr x2, [x0, #THREAD_CORE_LOCAL_TMP_STACK_VA_END]orr w1, w1, #THREAD_CLF_TMP /* flags |= THREAD_CLF_TMP; */
9.2、無條件跳轉label指令

(偏移范圍為 : ±128MiB)

  • b label
  • bl label
9.3、無條件跳轉register指令

(偏移范圍為 : 無限制)

  • br Xn
  • blr Xn
  • ret {Xn}

10 、 Function calls

11 、 Procedure Call Standard

12 、 System calls

13、學習資料

總結

以上是生活随笔為你收集整理的02-Armv8-A Instruction Set Architecture的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。