R..*_*R.. 6 c assembly gcc inline-assembly
我正在编写一些代码,其中非常需要从嵌入式asm块中获取条件标志,并将其用作在调用C代码中分支的条件。我不想存储标志(那将是无用的且效率低下的;已经有更有效的方法来实现结果),而是直接使用标志。有什么方法可以使用GNU C内联asm约束来实现这一目标?我对适用于多种指令集体系结构的方法感兴趣,目的是将其与体系结构的LL / SC样式原子产生的条件标志一起使用。当然,另一个明显的使用情况(与我正在做的事情不同)是允许外部C代码在内联asm中的操作的进位标志结果上分支。
从 x86 上的 GCC6 开始,您实际上可以"=@ccCOND"
用作输出(其中COND
是任何有效的 x86 条件代码)。
示例最初来自here,由大卫的建议清理:
int variable_test_bit(long n, volatile const unsigned long *addr)
{
int oldbit;
asm volatile("bt %[value],%[bit]"
: "=@ccc" (oldbit)
: [value] "m" (*addr), [bit] "Jr" (n));
return oldbit;
}
Run Code Online (Sandbox Code Playgroud)
在使用它之前,您应该测试是否__GCC_ASM_FLAG_OUTPUTS__
已定义。