使用条件标志作为GNU C内联asm输出

R..*_*R.. 6 c assembly gcc inline-assembly

我正在编写一些代码,其中非常需要从嵌入式asm块中获取条件标志,并将其用作在调用C代码中分支的条件。我不想存储标志(那将是无用的且效率低下的;已经有更有效的方法来实现结果),而是直接使用标志。有什么方法可以使用GNU C内联asm约束来实现这一目标?我对适用于多种指令集体系结构的方法感兴趣,目的是将其与体系结构的LL / SC样式原子产生的条件标志一起使用。当然,另一个明显的使用情况(与我正在做的事情不同)是允许外部C代码在内联asm中的操作的进位标志结果上分支。

cht*_*htz 6

从 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__已定义。

https://gcc.gnu.org 上的文档