我在.s文件中有几行汇编程序臂代码。我只需要调用几个例程。它在为设备构建时工作正常,但是当我切换到iPhone模拟器时,我得到“没有这样的指令”错误。我尝试使用我所知道的有条件地编译部分.s文件:
#if !TARGET_IPHONE_SIMULATOR
但是汇编程序不能识别这些预处理程序指令(当然)并且没有任何我能记住或找到的汇编程序的条件编译技术,所以我现在正在摸索如何避免编译汇编程序构建模拟器时的代码。我也没有在Xcode中看到一个项目选项,允许我根据目标平台编译文件。
解决:
我失踪的是汇编程序文件中正确的#import。我没有考虑添加它,因为Xcode语法突出显示绿色(注释)中的任何预处理器指令,这使我假设这些命令在实际上工作正常时无法识别。
这有效:
#import "TargetConditionals.h"
#if !TARGET_IPHONE_SIMULATOR
... asm code here ...
#endif
答案 0 :(得分:2)
您使用预处理器宏执行此操作。它们在TargetConditionals.h中定义TARGET_IPHONE_SIMULATOR
应该在那里! (但你确实需要#include它。)
答案 1 :(得分:1)
以下是我用于检测ARM与Thumb与模拟器的代码:
#include "TargetConditionals.h"
#if defined(__arm__)
# if defined(__thumb__)
# define COMPILE_ARM_THUMB_ASM 1
# else
# define COMPILE_ARM_ASM 1
# endif
#endif
#if TARGET_IPHONE_SIMULATOR
// Simulator defines
#else
// ARM or Thumb mode defines
#endif
//这就是你如何使用它
uint32_t
test_compare_shifted_operand(uint32_t w1) {
uint32_t local;
#if defined(COMPILE_ARM_ASM)
const uint32_t shifted = (1 << 8);
__asm__ __volatile__ (
"mov %[w2], #1\n\t"
"cmp %[w2], %[w1], lsr #8\n\t"
"moveq %[w2], #10\n\t"
"movne %[w2], #11\n\t"
: \
[w1] "+l" (w1),
[w2] "+l" (local)
: \
[shifted] "l" (shifted)
);
#else // COMPILE_ARM_ASM
if ((w1 >> 8) == 1) {
local = 10;
} else {
local = 11;
}
#endif // COMPILE_ARM_ASM
return local;
}