首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >标志/EFLAGS是"CC“(条件控制)的一部分吗?

标志/EFLAGS是"CC“(条件控制)的一部分吗?
EN

Stack Overflow用户
提问于 2014-02-04 02:33:55
回答 1查看 1.6K关注 0票数 4

这是对扩展汇编程序中的"=qm“是什么的跟进。

当使用RDRAND时,它设置(或取消)带旗(CF):

代码语言:javascript
复制
char rc;
unsigned int val;

__asm__ volatile(
    "rdrand %0 ; setc %1"
    : "=r" (val), "=qm" (rc)
);

// 1 = success, 0 = underflow
if(rc) {
    // use val
    ...
}

FLAGSEFLAGS寄存器是否被视为条件控制的一部分,以便将正确的信息传递给编译器?如将上述文字写成:

代码语言:javascript
复制
__asm__ volatile(
    "rdrand %0 ; setc %1"
    : "=r" (val), "=qm" (rc)
    :
    : "cc"
);

还是"cc"的使用是虚假的?

我知道在没有必要的情况下使用它是无害的。来自扩展ASM

如果您的汇编程序指令可以更改条件代码寄存器,请将‘cc’添加到失败寄存器列表中。某些机器上的GCC将条件代码表示为特定的硬件寄存器;“cc”用于命名此寄存器。在其他机器上,条件代码的处理方式不同,指定‘cc’没有任何效果。但不管机器是什么,它都是有效的。

如果它是假的,那么它适用于什么体系结构?(我猜想ARM和CPSR寄存器,但我可能弄错了)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-02-04 12:06:42

根据手册,是的- cc被击倒了.RDRAND还设置了SF、ZF、AF、PF <- 0.

在实践中,gcc假设__asm__块总是破坏x86的[E|R]FLAGS条件代码寄存器。我没有引用,但是您可以在各种GNU包中使用的longlong.h头之类的地方看到这种假设。

正如你所说,如果不使用,它是无害的。由于这个原因,您最好将其包括在内,因为它仍然提供语义意图,或者最坏的情况下提供评论。还请考虑一下,Clang和ICC实施GCC asm语法,如果他们遵守"cc" clobber,而不是假设它--尽管这是不太可能的--他们就会遵守文档。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21541968

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档