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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

[ARM-assembly]-ARM ASM内联汇编学习

發(fā)布時間:2025/3/21 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [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"表示匯編代碼對輸入和輸出操作數執(zhí)行內存讀取或寫入操作

示例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内联汇编学习的全部內容,希望文章能夠幫你解決所遇到的問題。

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