C 表达式中的汇编指令

2020-01-18 19:38:31于海丽
允许使用内存操作数,以及机器通常支持的任何类型的地址 o 允许使用内存操作数,但前提是地址是可偏移的 V 允许使用内存操作数,不可偏移的内存地址,与 "o'互斥 r 允许在通用寄存器中使用的寄存器操作数,其中可以指定寄存器,如 a(%rax), b(%rbx) i 允许使用立即整数操作数 n 允许使用具有已知数值的立即整数操作数, ‘I', ‘J', ‘K', … ‘P' 更应该使用 n F 允许使用浮点立即数 g 允许使用任何寄存器,内存或立即数整数操作数,但非通用寄存器除外 X 允许任何操作数, ‘0', ‘1', ‘2', … ‘9' p 允许使用有效内存地址的操作数

标识符约束

标识符 说明
= 表示此操作数是由该指令写入的:先前的值将被丢弃并由新数据替换
+ 表示该操作数由指令读取和写入
& 表示(在特定替代方法中)此操作数是早期指令操作数,它是在使用输入操作数完成指令之前写入的,故输入操作数部分不能分配与输出操作数相同的寄存器
% 表示该操作数与后续操作数的可交换指令

内核示例

x86 的内存屏障指令。


// 避免编译器的优化,声明此处内存可能发生破坏
#define barrier() asm volatile("" ::: "memory")
// 在32位的CPU下,lock 指令为锁总线,加上一条内存操作指令就达到了内存屏障的作用,64位的cpu已经有新增的 *fence 指令可以使用
// mb() 执行一个内存屏障作用的指令,为指定CPU操作;破坏列表声明 cc memory 指示避免编译器进行优化
#ifdef CONFIG_X86_32
#define mb() asm volatile(ALTERNATIVE("lock; addl $0,-4(%%esp)", "mfence", 
        X86_FEATURE_XMM2) ::: "memory", "cc")
#define rmb() asm volatile(ALTERNATIVE("lock; addl $0,-4(%%esp)", "lfence", 
        X86_FEATURE_XMM2) ::: "memory", "cc")
#define wmb() asm volatile(ALTERNATIVE("lock; addl $0,-4(%%esp)", "sfence", 
        X86_FEATURE_XMM2) ::: "memory", "cc")
#else
#define mb() asm volatile("mfence":::"memory")
#define rmb() asm volatile("lfence":::"memory")
#define wmb() asm volatile("sfence" ::: "memory")
#endif

x86 下获取 current 的值