inline asm compiled in XCode for Simulator but failed to compile for Device
我已经搜寻了很长时间,但仍然找不到解决方案。 我希望有人可以帮助我。
我有以下三个内联asm函数:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | static __inline__ int Bsf(uint32_t Operand) { int eax; asm __volatile__ ( "bsfl %0, %0""\ \\t" :"=a" (eax) :"0" (Operand) ); return eax; } static __inline__ int Bsr(uint32_t Operand) { int eax; asm __volatile__ ( "bsrl %0, %0""\ \\t" :"=a" (eax) :"0" (Operand) ); return eax; } static __inline__ uint64_t TimeStampCounter(void) { uint32_t eax, edx; asm __volatile__ ( "rdtsc""\ \\t" :"=a" (eax),"=d" (edx) : ); return MAKE_LONG_LONG(eax, edx); } |
它们都在XCode for Simulator中成功编译,但是当我切换为Device-4.1(对于iPhone)构建时失败。 我收到的消息是" asm中不可能的约束"。 我相信问题是以上汇编代码不适用于基于ARM的cpu。 有人可以阐明如何重新编写代码以便它可以为iPhone cpu编译吗? 它可以是汇编代码,也可以是纯C代码。 提前致谢!
狮子座
您可以尝试使用ARM
编辑:OP澄清了一些上下文。
您需要获得Intel吗? 64和IA-32体系结构软件开发人员手册。 它们包含完整的指令集参考,可为您提供帮助。 甚至
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | int Bsf(uint32_t n) { { int m; for (m = 0; m < 32; m++) { if (n & (1 << m)) return m; } return 32; } int Bsr(uint32_t n) { { int m; for (m = 31; m >= 0; m--) { if (n & (1 << m)) return m; } return 32; } |
The processor monotonically increments the time-stamp counter MSR every clock cycle and resets it to 0 whenever the processor is reset.
您需要弄清楚为什么您的程序需要该信息,以及如何最好地将其转换为ARM情况。