使用64位整数而没有C运行时 - 链接错误__alldiv

时间:2009-01-27 08:14:56

标签: c html 64-bit linker runtime

我正在尝试在不使用C运行时(msvcrt或libcmt)的情况下构建Windows控制台应用程序。那就是链接到kernel32.lib并使用WIN32 API的控制台函数而不是printf等。

我的问题是在链接期间编译器无法找到__alldiv,它似乎处理32位应用程序中的64位整数除法。我试过微软的编译器和英特尔的。

此函数存在于运行时库中。像64位整数那样基本的东西需要完整的C运行时才是非常烦人的。

任何想法如何克服这个问题?

3 个答案:

答案 0 :(得分:2)

可以处理大于硬件分频器可以处理的除数的扩展精度除法程序比您想象的更复杂。我曾经不得不写一个函数来将128个值除以64位值,这是相当痛苦的(在一般情况下很慢)。

看看Randall Hyde在"Art of Assembly Language" text (Volume 4, Section 4.2.5 - Extended Precision Division)中讨论的算法。

以下是摘录:

  

使用DIV和IDIV指令无法合成一般的n位/ m位除法运算。必须使用一系列移位和减法指令来执行这样的操作,并且非常混乱。然而,使用DIV指令可以容易地合成较少的一般操作,将n位量除以32位量。本节介绍了扩展精度划分的两种方法。

     

在描述如何执行多精度除法运算之前,您应该注意到某些运算需要扩展精度除法,即使它们看起来可以用单个DIV或IDIV指令计算。只要得到的商适合32位,将64位数量除以32位数就很容易。 DIV和IDIV指令将直接处理。但是,如果商不符合32位,则必须将此问题作为扩展精度除法处理。这里的技巧是将除数的(零或符号扩展的)H.O双字除以除数,然后用余数和L.O.重复该过程。分红的dword。

因此,您可能想要做的一件事是确定您是否真的需要在除数中使用64位数量 - 如果不是,您可以轻松编写将执行任务的函数。如果你真的需要将64位值除以64位值,你仍然可以这样做,但这是一个更难的问题。更具体地说,它可能不适合编译器“内联” - 因此它是一个库例程。

哦,不要忘了 - MS提供了库源代码。 __alldiv()lldiv.asm中的汇编语言函数。将该文件添加到项目中并将其链接到没有库的其余部分应该不会太难。

答案 1 :(得分:2)

找到了__alldiv链接问题的解决方案:

在msdev安装中找到 lldiv.obj 。 我可以将该对象文件添加到链接而不是C运行库。

对我来说,道路是:

c:\ Program Files(x86)\ Microsoft Visual Studio 9.0 \ VC \ crt \ src \ intel \ mt_lib \ lldiv.obj。

答案 2 :(得分:0)

_alldiv的msdn页面说明它的使用取决于编译器优化设置,而不说它依赖的设置是什么。

你可以借用葡萄酒中的_alldiv。