从c调用的汇编函数被忽略

时间:2018-01-13 22:31:03

标签: c assembly arm

我正在调用一个名为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} 

2 个答案:

答案 0 :(得分:2)

您使用哪些选项来编译C?您使用的是-mfloat-abi=hard还是soft

如果soft,C编译器会将fpow返回值视为float中的r0(IEEE binary32)位模式。

调用约定不匹配会解释将第一个arg视为返回值:

如果C编译器的asm使用hard float-ABI,则第一个FP arg传递寄存器(s0)也是FP单精度返回值寄存器。如果您的手写asm是为soft float ABI编写的,则不会修改s0

答案 1 :(得分:1)

你的extern声明了powf但是你打电话(并且似乎实现了fpow)。修复它以便所有三个匹配,现在我怀疑(虽然我不确定)你遇到了C&C处理未声明函数的问题。