【问题标题】:Why inline assembly doesn't work with ARC in Xcode?为什么内联汇编不适用于 Xcode 中的 ARC?
【发布时间】:2013-01-03 19:18:11
【问题描述】:

我真的对这个主题感到困惑。我在 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 的情况下工作!

谁能帮我解决这个问题?

【问题讨论】:

  • ARC in XCode??错了,XCode 只是像 AppCode 一样的编辑器。你的问题应该在Arc in Cocoa
  • 你是对的。 ARC 在 Cocoa 中。
  • 嗯...如果我们吹毛求疵,ARC 实际上是 ObjC 功能,而不是 Cocoa 功能。引用计数在 libobjc 中实现。

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 谢谢。但不幸的是,我最近从 Visual Studio 搬到了 Xcode。我不知道应该在哪里访问编译器设置以设置为 -fno-objc-arc。如果你能帮助我,我将不胜感激
    • 点击项目(左上角,蓝色的东西),然后在右边选择你的目标,构建阶段,编译源代码。双击你要de-arc的文件,然后-fno-objc-arc :)
    • 同样的问题!但至少我学会了使用 Xcode 编译器。感谢那。我认为我的代码有问题。似乎在“movl %esp, %ebp;”行之后ARC 丢失主堆栈指针地址。你能看一下代码本身吗?
    • 自 2009 年以来我就没有编写过汇编程序,而且我从来没有那么精通。对不起,我对你没用哈哈。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

                   "pushq %rbp;"
                   "movq %rsp , %rbp ;"
                   "movl %eax , -4(%rbp);"
                   "popq %rbp;"
                   );
      

      【讨论】:

      • “x86 模式下的 ARC”是什么意思?根据Objective-C Feature Availability Index,ARC 需要 OS X 上的 64 位系统。
      • 谢谢,我不知道。您可以将其作为答案而不是我可以将其标记为正确答案的评论。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-25
      • 1970-01-01
      • 1970-01-01
      • 2012-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多