我正在尝试在不使用 C 运行时(msvcrt 或 libcmt)的情况下构建 Windows 控制台应用程序。也就是说,仅链接 kernel32.lib 并使用 WIN32 API 中的控制台函数而不是 printf 等。
我的问题是,在链接期间,编译器无法找到 __alldiv,它似乎可以处理 32 位应用程序中的 64 位整数除法。我尝试了微软的编译器和英特尔的编译器。
该函数存在于运行时库中。令人烦恼的是,像 64 位整数这样的基本数据将需要完整的 C 运行时。
有什么想法如何克服这个问题吗?
扩展精度除法例程可以处理比硬件除法器可以处理的除数更大的除数,这比您想象的要复杂。我曾经不得不编写一个函数来将 128 位值除以 64 位值,这是相当痛苦的(并且在一般情况下很慢)。
看看 Randall Hyde 在他的文章中讨论的算法《汇编语言的艺术》文本(第 4 卷,第 4.2.5 节 - 扩展精度除法) http://webster.cs.ucr.edu/AoA/Windows/HTML/AdvancedArithmetica2.html.
这是摘录:
您无法使用 DIV 和 IDIV 指令合成一般的 n 位/m 位除法运算。这样的操作必须使用一系列移位和减法指令来执行,并且非常混乱。然而,使用 DIV 指令可以轻松合成一个不太通用的操作,即将 n 位数量除以 32 位数量。本节介绍两种扩展精度除法的方法。
在描述如何执行多精度除法运算之前,您应该注意,某些运算需要扩展精度除法,即使它们看起来可以使用单个 DIV 或 IDIV 指令进行计算。将 64 位数量除以 32 位数量很容易,只要所得商适合 32 位即可。 DIV 和 IDIV 指令将直接处理此问题。但是,如果商不能容纳 32 位,那么您必须将这个问题作为扩展精度除法来处理。这里的技巧是将被除数的(零或符号扩展)H.O 双字除以除数,然后用余数和 L.O 重复该过程。股息的双字。
因此,您可能想做的一件事是确定是否确实需要在除数中使用 64 位数量 - 如果不需要,您可以轻松编写一个执行该任务的函数。如果您确实需要将 64 位值除以 64 位值,您仍然可以这样做,但这是一个更困难的问题。更具体地说,它可能不适合编译器“内联” - 因此它是一个库例程。
哦,不要忘记 - MS 提供了库源代码。__alldiv()
是一个汇编语言函数lldiv.asm
。将该文件添加到您的项目中并在没有库的其余部分的情况下链接它应该不会太难。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)