0

类似于这里的问题: 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

不能做吗?

4

0 回答 0