[ARM-assembly]-ARMv8-A64指令集总结和学习
★★★ 個(gè)人博客導(dǎo)讀首頁(yè)—點(diǎn)擊此處 ★★★
文章目錄
- 1、一個(gè)簡(jiǎn)單的aarch64架構(gòu)圖
- 2、A64指令集的特點(diǎn):
- 3、跳轉(zhuǎn)指令
- (1)、條件跳轉(zhuǎn)指令
- (2)、無(wú)條件跳轉(zhuǎn)label指令
- (3)、無(wú)條件跳轉(zhuǎn)register指令
- 4、異常產(chǎn)生和返回
- (1)、異常產(chǎn)生指令
- (2)、異常返回指令
- (3)、debug的異常指令
- 5、系統(tǒng)訪問(wèn)指令
- (1)、系統(tǒng)寄存器訪問(wèn)指令
- (2)、系統(tǒng)操作指令
- 6、提示指令Hint instructions
- 7、Barriers指令
- 7、指針授權(quán)指令:Pointer authentication instructions
- 8、存取指令 : Loads and stores
- (1)、存取指令的尋址模式
- (2)、load/store指令的介紹
- a、Load-Store Pair
- b、LDNP and STNP 非暫存指令
- c、Load-Store Unprivileged
- d、Load-Store Exclusive
- e、Load-Acquire / Store-Release
1、一個(gè)簡(jiǎn)單的aarch64架構(gòu)圖
2、A64指令集的特點(diǎn):
- x0-x30 : 31個(gè)通用寄存器(general-purpose register),且都擴(kuò)展到了64位, 其中x30是sp(Stack Pointer)
- Zero Register: XZR/WZR,在大多數(shù)情況下,作為源寄存器使用時(shí), 讀出來(lái)的值 是0; 作為目標(biāo)寄存器使用時(shí), 丟棄結(jié)果。
- 不再有LDM、STM、PUSH、POP指令, 取而代之的是STP、LDP
- 條件指令大量的減少了
- 不能將CPSR作為單個(gè)寄存器訪問(wèn),確認(rèn)代之的是PSTATE
- 刪除了"協(xié)處理器"概念,取而代之的是通過(guò)系統(tǒng)寄存器訪問(wèn)
o System register access
o Cache/TLB management
o VAPA translation
o Barriers and CLREX
o Architectural hints (WFI, etc)
o Debug
通用寄存器分類
PSTATE寄存器:
3、跳轉(zhuǎn)指令
指令統(tǒng)計(jì)
- 條件跳轉(zhuǎn)指令 : 5個(gè)
- 無(wú)條件跳轉(zhuǎn)label指令 : 2個(gè)
- 無(wú)條件跳轉(zhuǎn)register指令 : 3個(gè)
(1)、條件跳轉(zhuǎn)指令
(偏移范圍為±1MiB)
- b.cond label
- cbz Xn|Wn, label
- cbnz Xn|Wn, label
- tbz Xn|Wn, #uimm6, label //如果Xn的第uimm的bit位位0,則跳轉(zhuǎn)到label
- tbnz Xn|Wn, #uimm6, label
(b.cond的condition條件)
(b.cond的應(yīng)用)
.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的應(yīng)用b el0_sync_abortcheck_vector_size el0_sync_a64(cbz、cbnz的應(yīng)用)
當(dāng)調(diào)用__cpu_spin_trylock(lock)時(shí)
(tbz、tbnz的應(yīng)用)
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; */(2)、無(wú)條件跳轉(zhuǎn)label指令
(偏移范圍為 : ±128MiB)
- b label
- bl label
(3)、無(wú)條件跳轉(zhuǎn)register指令
(偏移范圍為 : 無(wú)限制)
- br Xn
- blr Xn
- ret {Xn}
4、異常產(chǎn)生和返回
- 異常產(chǎn)生指令 : 5個(gè)
- 異常返回指令 : 1個(gè)
- debug的異常指令 : 4個(gè)
(1)、異常產(chǎn)生指令
- BRK Breakpoint Instruction BRK
- HLT Halt Instruction //停止指令
- HVC
- SMC
- SVC
(2)、異常返回指令
- ERET
(3)、debug的異常指令
DCPS1 Debug switch to Exception level 1
DCPS2 Debug switch to Exception level 2
DCPS3 Debug switch to Exception level 3
DRPS Debug restore PE state
5、系統(tǒng)訪問(wèn)指令
- 系統(tǒng)寄存器訪問(wèn)指令 : 1個(gè)
- 系統(tǒng)操作指令 : 6個(gè)
(1)、系統(tǒng)寄存器訪問(wèn)指令
- MRS
- MSR
(2)、系統(tǒng)操作指令
- SYS
- SYSL
- IC
- DC
- AT
- TLBI
6、提示指令Hint instructions
提示指令Hint instructions : 8個(gè)
- NOP
- YIELD
- WFE
- WFI
- SEV
- SEVL
- HINT
- DGH
7、Barriers指令
Barriers指令 : 4個(gè)
- CLREX // Clear Exclusives monitor
- DMB
- DSB
- ISB
還有一些特殊的barriers指令,如果未實(shí)現(xiàn),則等效于 NOP
CSDB
ESB
PSB
PSSB
SB
SSBB
TSB
7、指針授權(quán)指令:Pointer authentication instructions
有很多寄存器,目前(2020)基本沒(méi)有使用,暫不介紹
8、存取指令 : Loads and stores
(1)、存取指令的尋址模式
[Rn, offset]! 前變址尋址
最終訪問(wèn)內(nèi)存的地址 = Rn+offset
操作后Rn的值 = Rn+offset
[Rn], offset 后變址尋址
最終訪問(wèn)內(nèi)存的地址 = Rn
操作后Rn的值 = Rn+offset
[Rn, offset] 偏移尋址
最終訪問(wèn)內(nèi)存的地址 = Rn+offset
操作后Rn的值不變
示例:
(1)、在進(jìn)程切換調(diào)用的cpu_switch_to函數(shù)中,使用到了后變址尋址
(2)、load/store指令的介紹
術(shù)語(yǔ):
sign-extends :符號(hào)擴(kuò)展,前面補(bǔ)符合位和0 zero-extends :0擴(kuò)展,即前面補(bǔ)0S : sign-extends B : byte H : half-word R :register P : pair 雙字操作a、Load-Store Pair
LDP Wt1, Wt2, addr //從addr處讀取兩個(gè)word到Wt1和Wt2 LDP Xt1, Xt2, addr //從addr處讀取兩個(gè)double-word到Xt1和Xt2 LDPSW Xt1, Xt2, addr //從addr處讀取兩個(gè)word到Xt1和Xt2, sign-extends STP Wt1, Wt2, addr //將Wt1和Wt2寫(xiě)入addr地址處 STP Xt1, Xt2, addr //將Xt1和Xt2寫(xiě)入addr地址處b、LDNP and STNP 非暫存指令
非暫存指令(Non-temporal),不會(huì)加載到cache
LDNP Wt1, Wt2, [base,#imm] LDNP Xt1, Xt2, [base,#imm] STNP Wt1, Wt2, [base,#imm] STNP Xt1, Xt2, [base,#imm]c、Load-Store Unprivileged
在EL1中執(zhí)行數(shù)據(jù)的加載和寫(xiě)入,權(quán)限等是按照EL0的配置來(lái)執(zhí)行
LDTR Wt, [base,#simm9] LDTR Xt, [base,#simm9] LDTRB Wt, [base,#simm9] 加載一個(gè)字節(jié)并sign-extends擴(kuò)展到Wt, 在EL1下執(zhí)行的,但是按照EL0的權(quán)限來(lái)執(zhí)行 LDTRSB Wt, [base,#simm9] LDTRSB Xt, [base,#simm9] LDTRH Wt, [base,#simm9] LDTRSH Wt, [base,#simm9] LDTRSH Xt, [base,#simm9] LDTRSW Xt, [base,#simm9] STTR Wt, [base,#simm9] STTR Xt, [base,#simm9] STTRB Wt, [base,#simm9] STTRH Wt, [base,#simm9]d、Load-Store Exclusive
【補(bǔ)充armv8的exclusive操作】
為了解決多核情況下的鎖競(jìng)爭(zhēng)問(wèn)題,arm引入了exclusive操作,并添加了相應(yīng)的指令。
exclusive的操作的核心,就是會(huì)將鎖,用一個(gè)狀態(tài)機(jī)進(jìn)行維護(hù),該狀態(tài)機(jī)有2種狀態(tài),open狀態(tài)和exclusive狀態(tài)。要想成功的對(duì)鎖進(jìn)行上鎖,狀態(tài)必須要從exclusive狀態(tài)切換到open狀態(tài),其他狀態(tài),都是失敗的。
LDXR指令,將狀態(tài)從open狀態(tài)切換到exclusive狀態(tài),STXR指令,將狀態(tài)從exclusive狀態(tài)切換到open狀態(tài)
e、Load-Acquire / Store-Release
標(biāo)記物理地址為非獨(dú)占訪問(wèn)
(Non-exclusive)
LDAR Wt, [base{,#0}] LDAR Xt, [base{,#0}] LDARB Wt, [base{,#0}] LDARH Wt, [base{,#0}] STLR Wt, [base{,#0}] STLR Xt, [base{,#0}] STLRB Wt, [base{,#0}] STLRH Wt, [base{,#0}](Exclusive)
LDAXR Wt, [base{,#0}] LDAXR Xt, [base{,#0}] LDAXRB Wt, [base{,#0}] LDAXRH Wt, [base{,#0}] LDAXP Wt, Wt2, [base{,#0}] LDAXP Xt, Xt2, [base{,#0}] STLXR Ws, Wt, [base{,#0}] STLXR Ws, Xt, [base{,#0}] STLXRB Ws, Wt, [base{,#0}] STLXRH Ws, Xt|Wt, [base{,#0}] STLXP Ws, Wt, Wt2, [base{,#0}] STLXP Ws, Xt, Xt2, [base{,#0}]總結(jié)
以上是生活随笔為你收集整理的[ARM-assembly]-ARMv8-A64指令集总结和学习的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: [Issue Fixed]-Ubuntu
- 下一篇: leetcode刷题练习