2010-12-10 84 views
0

我一直使用Google搜索了很長時間,但仍然找不到解決方案。我希望有人能幫助我。inline asm在XCode for Simulator中編譯但未能編譯爲設備

我有如下三個一字排列的ASM功能:

static __inline__ int Bsf(uint32_t Operand) { 
    int eax; 
    asm __volatile__ (
    "bsfl %0, %0" "\n\t" 
    : "=a" (eax) 
    : "0" (Operand) 
); 
    return eax; 
} 

static __inline__ int Bsr(uint32_t Operand) { 
    int eax; 
    asm __volatile__ (
    "bsrl %0, %0" "\n\t" 
    : "=a" (eax) 
    : "0" (Operand) 
); 
    return eax; 
} 

static __inline__ uint64_t TimeStampCounter(void) { 
    uint32_t eax, edx; 
    asm __volatile__ (
    "rdtsc" "\n\t" 
    : "=a" (eax), "=d" (edx) 
    : 
); 
    return MAKE_LONG_LONG(eax, edx); 
} 

他們都在XCode中編譯成功的模擬器,但是當我切換到建立設備故障 - 4.1(iPhone版)。我得到的消息是「在asm中不可能的約束」。我相信問題是上述彙編代碼不適用於基於ARM的cpu。有人可以闡明如何重新編寫代碼,以便編譯爲iPhone cpu嗎?它可以是彙編或純C代碼。提前致謝!

利奧

+0

你想做什麼? – 2010-12-10 19:15:25

+0

只是猜測,但你發佈的程序集是x86和iOS設備是基於ARM的,所以你可能需要編寫ARM程序集來做你想做的事情。 – 2010-12-12 09:44:10

+0

@Dean。你是完全正確的,那實際上是我的問題。如何重新編寫ARM cpu的代碼?你有什麼主意嗎?如果您能夠在使用ARM程序集或純C代碼重新編寫代碼的過程中對此有所瞭解,我們將非常感激。 – user538220 2010-12-13 15:42:07

回答

0

你可以嘗試ARM clz指令來取代bsr。我不知道其他兩個人有什麼好的替代品。

編輯:OP澄清了一些情況。

您需要獲取Intel® 64 and IA-32 Architectures Software Developer's Manuals。它們包含一個完整的指令集引用,它可以幫助你。甚至僞代碼bsf/bsr指令是在那裏,並且可以容易地轉化爲它們的C當量:

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; 
} 

rdtsc指令讀取處理器的時間戳計數器,這是一個64位的值遞增每個時鐘週期:

處理器在每個時鐘週期單調遞增時間戳計數器MSR,並在處理器復位時將其重置爲0。

你需要弄清楚爲什麼你的程序需要這些信息,以及如何最好地將它翻譯成你的ARM案例。

+0

謝謝Carl。我會嘗試。 – user538220 2010-12-10 19:50:03

+0

不,它給了我同樣的錯誤。 – user538220 2010-12-13 15:48:04

+0

非常感謝您的幫助。我會嘗試使用你的代碼,並讓它知道它是否有效。我想現在是我學習一些小程序的時候了。 :) – user538220 2010-12-13 21:32:27