2011-08-15 4 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-thread

私は制約のかなりの組み合わせを試しましたが(私が言ったように)、私はあまり運がありません。

目的は、アセンブリ内の3つの関数パラメータすべてにアクセスすることです。 a読み取り専用、bは読み取りと書き込み、cは読み取り専用です。
ご覧のとおり、3つはすべてCの文字配列です。しかし、abはともに16バイト長で、それぞれXMMレジスタに格納することができます(これは私の目標の1つです)。
cはこのような変数の配列なので、それぞれの変数をXMMレジスタに格納することもできます。

また、GCCが(「x」制約と同じように)レジスタに物をロードしないで、むしろそれを私に残しておきたいと思います。

誰かが私のために制約を書く(そしてあなたはそれのように感じる場合は、短い説明を追加します。)することができれば、私は本当にappriciateだろう

+7

生成されたアセンブリを見ましたか?読んだ場所に '' m "(* a)'を与える必要があると思います。それ以外の場合は_pointer_自体を '%xmm0'にロードしようとします。これはあなたのsegfaultを説明するものではありません。 –

+0

Henning Makholmが正しいです。あなたが望むものに応じて、 'asm __volatile__(movdqa(%0)、%% xmm0":: "r"(a): "%xmm0"); ' – user786653

+0

@Henning Makholm実際には、溶液;それは今働く。ありがとう! – exscape

答えて

5

ソリューションは、(質問へのコメントで掲示される)単純にしましたasmブロックに渡す前にポインタを逆参照してください。そうすることで、すべてがうまくいくようになりました。

私は質問にコメントだけで答えるとマークすることができないので、回答として投稿しています。 (また、私は昨日私の低所長のために私をさせてくれないので少し遅れて答えています)

関連する問題