在gcc内联汇编中使用标签会导致奇怪的错误访问错误

时间:2012-04-10 23:10:11

标签: ios loops assembly arm

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

例如,请考虑以下代码:

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

为什么导致此代码段崩溃?我正在使用Xcode 4.3.1和gcc 4.2。

1 个答案:

答案 0 :(得分:0)

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

或者 asm volatile(     “0:\ n”
    :     :     : );

呀!我知道...... Apple工具链很可怜。 XCode上的内联臂装配还有很多问题。