检查是否设置了进位标志

标签 c gcc x86 carryflag eflags

使用内联汇编程序[gcc, intel, c],如何检查操作后是否设置了进位标志?

最佳答案

sbb %eax,%eax 如果设置了进位标志,将在 eax 中存储 -1,如果清除则为 0。无需预先将 eax 清零;从自身中减去 eax 可以为您做到这一点。这种技术非常强大,因为您可以将结果用作位掩码来修改计算结果,而不是使用条件跳转。

您应该知道,只有通过在内联 asm block 内部执行的算术设置进位标志时,测试进位标志才有效。您无法测试在 C 代码中执行的计算的进位,因为编译器可以通过各种方式优化/重新排序会破坏进位标志的内容。

关于检查是否设置了进位标志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3139772/

相关文章:

c - 我将如何创建自己的虚拟机?

c - 原始套接字和 NF_INET_POST_ROUTING

c - 如果传递的参数是常量值,C 中会发生什么

c - 在 LGPL/GPL 许可下是否有面向堆栈的编程语言的解释器?

c - 如何使用 Gtk+3 定义 GtkButton 的颜色(在 C 中)

c++ - 内联调用always_inline '__m256d _mm256_broadcast_sd(const double*)'失败

performance - clflush 是否也会删除 TLB 条目?

c - C 中的正则表达式(使用 regex.h)用于识别罗马数字

c++ - gcc 发出的这个越界警告是错误的吗?

c - 从静态编译函数返回时子例程线程 JIT x86 机器代码段错误