2011-08-15 177 views
2

我想在C/x86_64內聯彙編中編寫一個函數,但我沒有太多的運氣。GCC內聯彙編中的C數組?

我們可以煮一切歸因於這樣的:

void f(const unsigned char *a, unsigned char *b, const unsigned char *c) { 
    asm __volatile__ ("movdqa %0, %%xmm0" : : "m"(a) : "%xmm0"); 
} 

(該函數正確調用,順便說一下,我試圖取代C代碼,當我用現在註釋的輸出C代碼,它工作得很好)

這種崩潰:

異常類型:EXC_BAD_ACCESS(SIGSEGV)
異常代碼:0x000000000000000d,0x0000000000000000
墜毀Threa d:0調度隊列:com.apple.main線程

我已經嘗試了幾個約束的組合,但(正如我所說),我沒有太多的運氣。

目標是有權訪問程序集中的所有三個函數參數; a只讀,b爲可讀寫,c爲只讀。如你所見,所有三個都是C中的char數組;然而,ab都是16字節長,可以存儲在XMM寄存器中(這是我的目標之一)。
c是一個這樣的變量數組,所以每個這些變量也可以存儲在XMM寄存器中。另外,我應該指出,如果GCC沒有將東西加載到寄存器中(因爲它看起來與「x」約束)有關,但它將它留給了我。

我真的並欣賞,如果有人能寫的約束,我(如果你喜歡它的感覺,添加一個簡短的說明。)

+7

你看過生成的程序集嗎?我希望你需要給''m「(* a)'作爲讀取位置;否則它會嘗試將_pointer_本身加載到'%xmm0'中 - 但這不能解釋您的段錯誤。 –

+0

Henning Makholm是正確的。取決於你想要什麼,你也可以做'asm __volatile__(「movdqa(%0),%% xmm0」::「r」(a):「%xmm0」);' – user786653

+0

@亨寧Makholm其實,那是整個解;它現在有效。謝謝! – exscape

回答

5

解決方案(如張貼在評論的問題)是簡單地在傳遞給asm塊之前解引用指針。這樣做可以讓所有事情都按照原樣進行。

我只發佈這個答案,因爲我不能將它標記爲只回答問題的評論。 (另外,我回答的有點遲,因爲它不會讓我昨天,由於我的低代表。)