当我尝试在内联汇编代码中使用标签时,由于无法理解的EAX_BAD_ACCESS
错误,应用程序会立即在asm语句之后崩溃。
例如,请考虑以下代码:
asm volatile (
"myloop: \n"
:
:
:
);
为什么导致此代码段崩溃?我正在使用Xcode 4.3.1和gcc 4.2。
答案 0 :(得分:0)
问题在于苹果工具链中的链接器。我也遇到过这个问题。 链接器从生成的程序集中获取任何标签,并假定它是函数的开始,并从标签开始重新定位节。这导致一些代码被截断而没有函数epilog并且使PC变为孤立并且漂移到下一个地址处的任何部分/函数/例程。 链接器以两种方式理解本地标签(正如我从反向工具中理解的那样)。 1.在标签名称的开头使用大写'L'。这是编译器标记自己的本地标签(循环等)的方式。 2.使用数字标签,例如“0:”等,并使用方向分支,如“b 0f”用于向前跳转,“b 0b”用于向后跳转。 因此解决你的问题: asm volatile( “Lmyloop:\ n” : : : );
或者
asm volatile(
“0:\ n”
:
:
:
);
呀!我知道...... Apple工具链很可怜。 XCode上的内联臂装配还有很多问题。