我正在调用一个名为fpow的函数,该函数在ARM程序集中实现。

extern float fpow(float x, float y);

int main()
{
    //...
    R = fpow(x, y);
    //...
}

问题是R在调用后包含x。这个函数似乎什么也没做,因为r0是返回寄存器,所以看起来fpow正在返回x。
以下是ARM程序集的实现:
.globl fpow

fpow:

  stmfd sp!, {r4, r5, r6, lr}


  mov r4, r0
  mov r5, r1


  mov r1, #0

  bl __aeabi_fcmpeq
  ...
  bl __aeabi_fmul
  bl pow2
  ldmfd sp!, {r4, r5, r6, pc}

最佳答案

你用什么选项来编译你的C?您使用的是-mfloat-abi=hard还是soft
如果soft,C编译器将期望fpow返回值是float中的r0(IEEE binary32)位模式。
调用约定不匹配将解释如何将第一个参数视为返回值:
如果C编译器的asm使用的是浮点ABI,那么第一个FP arg传递寄存器(hard)也是FP单精度返回值寄存器。如果手工编写的asm是为s0float ABI编写的,那么它不会修改soft

关于c - 从c调用的汇编函数将被忽略,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48244891/

10-11 00:36