【发布时间】:2016-11-05 02:45:30
【问题描述】:
目前,我为非常大的无符号整数编写了自己的小库,用于算术和逻辑运算。为了提高性能,我决定在汇编中实现一些功能。所以这是我的问题。 在减去两个无符号整数时,当我从 0 中减去任何数字时,就会设置进位标志。
但是为什么在这种情况下会设置进位标志呢?进位标志仅在发生溢出时设置,但如果我从零中减去任何数字,我不会得到溢出。 还是我错了?
【问题讨论】:
-
注意:在汇编中编写自己的操作可能无法提供您预期的优化。编译器不检查内联汇编,也无法优化它们。如果您只提供逻辑 C 代码,您可能会发现编译器会在优化方面做得更好。
-
感谢您的建议。但我不做内联汇编。我在汇编中编写单独的部分,并将此目标文件与 C 代码链接。
-
那么在代码的整体结构中,汇编程序例程的优化机会就更小了。不要误会我的意思,我不是在尝试使用汇编程序来提高速度,我曾经认为它也总是会更快,但总是将代码与链接汇编的性能与直接编写的代码的性能进行比较具有完整编译器优化的 C(
-O3在大多数-Ofast上用于 gcc 版本 >= 4.6.0)。今天的编译器非常擅长优化,直接 C 的 9/10 倍会更快。 -
好的,谢谢,我会记住的。我遇到的最大问题是,在 C 语言中没有简单的方法来检查进位标志的状态并在进一步的操作中使用它。所以目前我使用无符号整数类型的最高位作为进位标志。但我对此并不满意。这就是为什么我要在汇编程序中实现减法和加法的核心逻辑。但也许有人有更好的主意来做到这一点。我总是愿意接受其他建议。