我想在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數組;然而,a
和b
都是16字節長,可以存儲在XMM寄存器中(這是我的目標之一)。
c
是一個這樣的變量數組,所以每個這些變量也可以存儲在XMM寄存器中。另外,我應該指出,如果GCC沒有將東西加載到寄存器中(因爲它看起來與「x」約束)有關,但它將它留給了我。
我真的並欣賞,如果有人能寫的約束,我(如果你喜歡它的感覺,添加一個簡短的說明。)
你看過生成的程序集嗎?我希望你需要給''m「(* a)'作爲讀取位置;否則它會嘗試將_pointer_本身加載到'%xmm0'中 - 但這不能解釋您的段錯誤。 –
Henning Makholm是正確的。取決於你想要什麼,你也可以做'asm __volatile__(「movdqa(%0),%% xmm0」::「r」(a):「%xmm0」);' – user786653
@亨寧Makholm其實,那是整個解;它現在有效。謝謝! – exscape