2014-01-10 53 views
2

我想通過交換指針指向的地址對程序集執行操作,現在我遇到的問題是我無法找到將指針傳遞到寄存器的方式,然後在數據中執行操作然後存儲該值指向另一個輸出指針。NDK中的arm內聯彙編,如何處理指針和尖銳的數據?

這是我的代碼: 我在想什麼?

void asmfunc(short *pOut, short *pIn) { 
    asm volatile(
      "ldr r0, [in];" 
      "ldr r1, [out];" 
      "mov r2, r0;" 
      "lsr r2, [r2], #1;" 
      "str r1, [r2];" 
      :[out] "=m" (pOut) 
      :[in] "m" (pIn) 
    ); 
} 
+0

[中] - >%[中],[出] - >%[出],LSR將不訪問你的內存。應該有很多關於這些的教程。 http://www.ethernut.de/en/documents/arm-inline-asm.html – auselen

回答

6

你實際上在做什麼有裝載從輸出指針的值,然後使用移,將其存儲到一個地址的結果。請注意,你還需要告訴編譯器,你使用的寄存器比它所知道的更多,並且改變內存中的值,或者最終微妙的bug會咬你。相當於什麼,我想正在試圖做會是這樣的 -

void asmfunc(short *pOut, short *pIn) { 
    asm volatile(
      "ldr r3, %[in]\n" 
      "lsr r3, r3, #1\n" 
      "str r3, %[out]\n" 
      :[out] "=m" (*pOut) 
      :[in] "m" (*pIn) 
      :"r3", "memory" 
    ); 
} 
+0

+1,挑選:一個很好的例子也不應該使用r0作爲clobber,因爲它是開始的。 – auselen

+0

@auselen非常真實的,感謝提醒 - 我已經使它更EABI友好。 – Notlikethat

+0

我不能讓它工作它會導致以下錯誤 jni/opensl_mic.c:129:5:錯誤:'asm'中未知的寄存器名'r3' make.exe:*** [obj/local/x86 /objs/opensl_mic/opensl_mic.o]錯誤1 你知道它爲什麼可能嗎? – alexm