繁体   English   中英

为什么内联汇编不能在Xcode中与ARC一起使用?

[英]Why inline assembly doesn't work with ARC in Xcode?

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

有人可以帮我吗?

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM