私は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-thread
私は制約のかなりの組み合わせを試しましたが(私が言ったように)、私はあまり運がありません。
目的は、アセンブリ内の3つの関数パラメータすべてにアクセスすることです。 a
読み取り専用、b
は読み取りと書き込み、c
は読み取り専用です。
ご覧のとおり、3つはすべてCの文字配列です。しかし、a
とb
はともに16バイト長で、それぞれXMMレジスタに格納することができます(これは私の目標の1つです)。
c
はこのような変数の配列なので、それぞれの変数をXMMレジスタに格納することもできます。
また、GCCが(「x」制約と同じように)レジスタに物をロードしないで、むしろそれを私に残しておきたいと思います。
誰かが私のために制約を書く(そしてあなたはそれのように感じる場合は、短い説明を追加します。)することができれば、私は本当にappriciateだろう
生成されたアセンブリを見ましたか?読んだ場所に '' m "(* a)'を与える必要があると思います。それ以外の場合は_pointer_自体を '%xmm0'にロードしようとします。これはあなたのsegfaultを説明するものではありません。 –
Henning Makholmが正しいです。あなたが望むものに応じて、 'asm __volatile__(movdqa(%0)、%% xmm0":: "r"(a): "%xmm0"); ' – user786653
@Henning Makholm実際には、溶液;それは今働く。ありがとう! – exscape