kernel中通過機器碼編寫匯程式設計序

2021-09-17 02:41:26 字數 1309 閱讀 3632

在c源中除了通過asm來嵌入式彙編,例如asm(「fsinx %1, %0」:」=f」(result):」f」(angle));

也可以通過下面的方式來寫,例如

/* stp x0, x1, [sp, #-16]! */

insn = aarch64_insn_gen_load_store_pair(aarch64_insn_reg_0,

aarch64_insn_reg_1,

aarch64_insn_reg_sp,

-16,

aarch64_insn_variant_64bit,

aarch64_insn_ldst_store_pair_pre_index);

例如這裡的stp 就可以用aarch64_insn_gen_load_store_pair來代替

u32 aarch64_insn_gen_load_store_pair(enum aarch64_insn_register reg1,

enum aarch64_insn_register reg2,

enum aarch64_insn_register base,

int offset,

enum aarch64_insn_variant variant,

enum aarch64_insn_ldst_type type)

}而aarch64_insn_get_stp_pre_value()的實現如下:arch/arm64/include/asm/insn.h

#define __aarch64_insn_funcs(abbr, mask, val) \

static __always_inline bool aarch64_insn_is_##abbr(u32 code) \

\static __always_inline u32 aarch64_insn_get_##abbr##_value(void) \

__aarch64_insn_funcs(store_ex, 0x3f400000, 0x08000000)

__aarch64_insn_funcs(stp_post, 0x7fc00000, 0x28800000)

__aarch64_insn_funcs(ldp_post, 0x7fc00000, 0x28c00000)

__aarch64_insn_funcs(stp_pre, 0x7fc00000, 0x29800000)

__aarch64_insn_funcs(ldp_pre, 0x7fc00000, 0x29c00000)

可以看到這裡的stp 對應的機器碼就是0x29800000

jmp指令的機器碼編寫

1.首先直接的jmp分3種 short jump 短跳轉 機器碼 eb rel8 只能跳轉到256位元組的範圍內 near jump 近跳轉 機器碼 e9 rel16 32 可跳至同乙個段的範圍內的位址 far jump 遠跳轉 機器碼ea ptr 16 16 32 可跳至任意位址,使用48位 32...

通過機器碼程式理解馮諾依曼體系

這篇文章的排版和內容都很糟糕,我會找個時間重寫他。簡介現今所有的商用計算機都是基於馮諾依曼體系的計算機。馮 諾依曼體系結構馮 諾依曼理論的要點是 計算機的數制採用二進位制 計算機應該按照程式順序執行。儲存程式原理,把程式本身當作資料來對待,程式和該程式處理的資料用同樣的方式儲存,二者地位是相等的。通...

彙編中call指令和其對應的機器碼

call這個指令很神奇,他和別的指令不太一樣 對比下,當我們執行 mov eax,1 的時候,他的對應機器碼是 66 b8 01 00 00 00 這其中 66 b8 對應的是 mov eax,x 後面的 01 00 00 00 就是 1 在32位中的little endian了 所以說,在對mov...