为什么内联汇编在Xcode中不适用于ARC?

时间:2013-01-03 19:18:11

标签: xcode automatic-ref-counting llvm inline-assembly

我真的很困惑这个话题。我在Xcode上使用LLVM 4.1编译器,当我在32位或x64或x64-x86模式下编译一个简单的基本代码时,关闭ARC,一切正常 但如果我使用自动参考计数模式进行编译;我收到BAD_ACCESS错误。

这是一个示例代码:

-(void) doNothing{

__asm__ volatile(
             "pushl %ebp;"
             "movl %esp , %ebp ;" 
             "movl %eax , -4(%ebp);"
             "movl %ebp, %esp;"
             "popl %ebp;"
             "leave;" 
             "ret  "    // retl in x86
             );

}

我试图找出错误的来源,我发现推/弹是唯一可以在ARC模式下工作的部分!

令人沮丧的是因为我已经在内联汇编中编写了一个巨大的代码,现在我必须将它与ARC的模块联合起来。现在,如果我无法解决它,我可能需要修改所有模块,以便在没有ARC的情况下工作!

任何人都可以帮助我吗?

3 个答案:

答案 0 :(得分:2)

可能有一个解决方案,但如果您无法修复它,您可以将有问题的方法的实现移动到一个类别中,并使用-fno-objc-arc编译该类别。这样你的objc代码仍然是弧形的,你让汇编程序工作

答案 1 :(得分:2)

我建议尝试将汇编程序代码放在C或C ++函数中,而不是ObjC消息。并将__attribute__((naked))添加到函数声明。

答案 2 :(得分:2)

您不能在OS X上以32位模式使用ARC。根据Objective-C Feature Availability Index,ARC在OS X上需要64系统。