[ARM-assembly]-ARM ASM内联汇编学习
★★★個人博客導讀首頁—點擊此處 ★★★
格式
__asm__ qualifiers ( // 匯編代碼部分: OutputOperands //在內聯匯編代碼中被修改的變量列表: InputOperands //在內聯匯編代碼中用到的變量列表: Clobbers //在內聯匯編代碼中用到的寄存器列表 );qualifiers:一般是用 volatile 修飾詞
(1)、OutputOperands //在內聯匯編代碼中被修改的變量列表
[asmSymbolicName] “constraint”(cvariablename)
asmSymbolicName:表示變量在內聯匯編代碼中的別名,代碼中就可以通過%[asmSymbolicName]去使用該變量
cvariablename:表示變量原來的名字;
constraint:一般填=r
(2)、InputOperands //在內聯匯編代碼中用到的變量列表
[asmSymbolicName] “constraint”(cexpression)
按OutputOperands列表的順序再列一遍,但是constraint用數字代替從0開始,然后才是寫其他只讀變量,只讀變量constraint填r
(3)、Clobbers //在內聯匯編代碼中用到的寄存器列表
Clobbers: 一般是"cc", "memory"開頭,然后接著填內聯匯編中用到的通用寄存器和向量寄存器
"cc"表示內聯匯編代碼修改了標志寄存器;
"memory"表示匯編代碼對輸入和輸出操作數執行內存讀取或寫入操作
示例1:
const uint8_t *src = ...; uint8_t *dst = ...; int neonLen = ...; const int test = ...;#ifdef __aarch64__ // armv8__asm__ volatile(// 匯編代碼部分:[src] "=r"(src),[dst] "=r"(dst),[neonLen] "=r"(neonLen):[src] "0"(src),[dst] "1"(dst),[neonLen] "2"(neonLen),[test] "r"(test):"cc", "memory", "v0", "v1", "v2", "v3", "v4", "v5",...); #else // armv7__asm__ volatile(// 匯編代碼部分:[src] "=r"(src),[dst] "=r"(dst),[neonLen] "=r"(neonLen):[src] "0"(src),[dst] "1"(dst),[neonLen] "2"(neonLen),[test] "r"(test):"cc", "memory", "q0", "q1", "q2", "q3", "q4", "q5",...); #endif示例2:
static inline unsigned long arch_local_save_flags(void) {unsigned long flags;asm volatile("mrs %0, daif // arch_local_save_flags": "=r" (flags):: "memory");return flags; }/** restore saved IRQ state*/ static inline void arch_local_irq_restore(unsigned long flags) {asm volatile("msr daif, %0 // arch_local_irq_restore":: "r" (flags): "memory"); }static inline void arch_local_irq_disable(void) {asm volatile("msr daifset, #2 // arch_local_irq_disable"::: "memory"); }#define local_fiq_enable() asm("msr daifclr, #1" : : : "memory") #define local_fiq_disable() asm("msr daifset, #1" : : : "memory") #define sev() asm volatile("sev" : : : "memory") #define wfe() asm volatile("wfe" : : : "memory") #define wfi() asm volatile("wfi" : : : "memory")#define isb() asm volatile("isb" : : : "memory") #define dmb(opt) asm volatile("dmb " #opt : : : "memory") #define dsb(opt) asm volatile("dsb " #opt : : : "memory")#define mb() dsb(sy) #define rmb() dsb(ld) #define wmb() dsb(st)(這是自己寫的virt_to_phys的代碼,將虛擬地址寫入寄存器,然后再從另外的寄存器讀出物理地址)
#define DEFINE_REG_READ_FUNC_(reg, type, asmreg) \ static inline type read_##reg(void) \ { \type val; \\asm volatile("mrs %0, " #asmreg : "=r" (val)); \return val; \ }#define DEFINE_U64_REG_READ_FUNC(reg) \DEFINE_REG_READ_FUNC_(reg, uint64_t, reg)DEFINE_U64_REG_READ_FUNC(par_el1)static inline void write_at_s1e1r(uint64_t va) {asm volatile ("at S1E1R, %0" : : "r" (va)); }總結
以上是生活随笔為你收集整理的[ARM-assembly]-ARM ASM内联汇编学习的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [register]-04-ARMv8的
- 下一篇: [ARM-assembly]-汇编示例: