1

一旦我尝试在内联汇编代码中使用标签,由于无法理解的EAX_BAD_ACCESS错误,应用程序会在一致的 asm 语句之后立即崩溃。

例如考虑以下代码:

asm volatile (
    "myloop:    \n"
    :
    :
    :
);

为什么导致这个片段总是崩溃?我将 Xcode 4.3.1 与 gcc 4.2 一起使用。

4

1 回答 1

1

问题在于苹果工具链中的链接器。我也遇到过这个问题。链接器从生成的程序集中获取任何标签,并假定它是一个函数开始,并从标签开始重新定位节。这会导致一些代码在没有函数 Epilog 的情况下被截断,并使 PC 成为孤立的并漂移到下一个地址处的任何部分/函数/例程。链接器以两种方式理解本地标签(正如我从反向工程中理解的那样。) 1. 在标签名称的开头使用大写的“L”。这就是编译器标记自己的本地标签(循环等)的方式。2. 使用数字标签,例如“0:”等,并使用方向分支,如“b 0f”用于向前跳转,“b 0b”用于向后跳转。因此,您的问题的解决方案: asm volatile ("Lmyloop: \n" : : : );

或 asm volatile ("0: \n"
: : : );

于 2013-01-22T09:20:31.583 回答