32位体系结构上的64位红利,在汇编中工作,但在C中不工作

32位体系结构上的64位红利,在汇编中工作,但在C中不工作,c,gcc,x86,integer-division,C,Gcc,X86,Integer Division,我有64位的除数和32位的除数 GCC似乎无法创建此类程序集。它抱怨未定义对“\uu udivdi3”的引用,我知道这是因为我使用了-nostlib标志。不过,我不能使用任何STDLIB 64位变量的类型为无符号long 除了这个内联程序集,还有其他更优雅的方法吗? 我的目标是:my64位/32位除数 volatile uint32_t high = my64bit >> 32; volatile uint32_t low = my64bit; volatile uint32_t o

我有64位的除数和32位的除数

GCC似乎无法创建此类程序集。它抱怨
未定义对“\uu udivdi3”
的引用,我知道这是因为我使用了
-nostlib
标志。不过,我不能使用任何STDLIB

64位变量的类型为
无符号long

除了这个内联程序集,还有其他更优雅的方法吗? 我的目标是:
my64位/32位除数

volatile uint32_t high = my64bit >> 32;
volatile uint32_t low = my64bit;
volatile uint32_t out;

__asm__ __volatile__ (
    "movl %0, %%edx\n\t"
    "movl %1, %%eax\n\t"
    "div %2\n\t"
    "movl %%eax, (%3)\n\t"
::  "r" (high), "r" (low), "r" (32bitDivisor) "r" (&out)
:   "%eax", "%edx"
);

从glibc源代码复制该函数?对于操作系统开发(这似乎是),我建议使用交叉编译器(如i686 elf gcc)并链接到
-ffreestanding-nostlib-lgcc
<代码>\uUDIVDI3是GCC libgcc的一部分,而不是C库
libgcc
可以在独立代码中使用,但是使用像通用i686 elf这样的交叉编译器将确保没有特定于主机操作系统的代码。udivdi3用于uint64/uint64(仅受x86-64支持,32位模式需要依赖于库函数),但您需要的是uint64/uint32(在32位模式下可用)。按照这个逻辑,您可以尝试打开优化,有可能GCC会跳过整数提升,让您在不触发udivdi3的情况下逃脱。现在还不清楚-您是否希望在不使用内联汇编的情况下在C中进行除法?如果是这样的话,那么发布a以及编译器和开关的详细信息以及错误消息将非常有用。这不是对您的问题的回答,而是通过更好地利用输入和输出约束来稍微清理内联程序集,您可以这样做:
\uu asm\uu(“div%[divisor]:“=a”(out),“=d”(余数):[divisor]“rm”(divisor32),“1”(高),"0"(低):"cc";。如果不使用
余数
进行优化,编译器应该能够轻松地消除它。我还质疑您在代码中使用volatile变量,但因为我不知道上下文,所以不能肯定您在这里不需要它们