类似于这里的问题: Returning structs in registers - ARM ABI in GCC
我希望我可以告诉 GCC 结果是已注册的(不要理会它们)并且保持堆栈不变,但它只是“大部分”有效,我怀疑这只是运气。
编译时,我留下了未定义的引用 __aeabi_uldivmod(),我正在尝试对其进行补充。谷歌有一个不错的 _uldivmod.S,但我正在寻找一个 C 解决方案。
目前,我正在尝试类似:
res = __udivdi3(u, v);
mod = __umoddi3(u, v);
{
register uint32_t r0 asm("r0") = (res&0xFFFFFFFF);
register uint32_t r1 asm("r1") = (res>>32);
register uint32_t r2 asm("r2") = (mod&0xFFFFFFFF);
register uint32_t r3 asm("r3") = (mod>>32);
printk("r0 %08X : %08X : %08X : %08X\n",r0, r1, r2, r3);
asm volatile(""
: "=r"(r0), "=r"(r1), "=r"(r2),"=r"(r3) // output
: "r"(r0), "r"(r1), "r"(r2), "r"(r3)); // input
return r0;
}
kernel: [ 3457.959207] r0 00000000 : 00000000 : 00000000 : 70000000
udivdi3: 7000000000000000/7000000080000000 != 000000000000003f rem dfffffe080000000
__udvi3() 和 __umoddi3() 是标准的 C 函数。
我不仅返回了一些东西(堆栈),而且并不总是单独留下 r1-r3,因为我认为 ASM 语句的“输出字段”只影响 ASM 语句本身,而不影响我的 __aeabi_uldivmod 的函数声明。
海合会 4.4.3
不能做吗?