2

我真的对这个主题感到困惑。我在 Xcode 上使用 LLVM 4.1 编译器,当我在 ARC 关闭的 32 位或 x64 或 x64-x86 模式下编译这样的简单基本代码时,一切正常,但如果我使用自动引用计数模式编译;我收到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 的情况下工作!

任何人都可以帮助我吗?

4

4 回答 4

2

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

于 2013-01-03T19:21:34.093 回答
2

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

于 2013-01-04T07:05:08.050 回答
2

您不能在 OS X 上以 32 位模式使用 ARC。根据Objective-C 功能可用性指数,ARC 需要 OS X 上的 64 位系统。

于 2013-01-04T08:05:45.063 回答
0

我找到了解决方案,但不知道为什么它有效!我将给出答案,谁可以解释它。我意识到问题的主要原因与 ARC 的 x64 行为有关。所以我更改了代码并删除了“leave”和“ret”行,现在它可以工作了,但我不知道:1-为什么 ARC 即使在 x86 模式下也表现得像 x64 和 2-为什么我必须省略“leave”和“ret”新代码:

             "pushq %rbp;"
             "movq %rsp , %rbp ;"
             "movl %eax , -4(%rbp);"
             "popq %rbp;"
             );
于 2013-01-03T22:28:28.673 回答