0

次のような 32 ビット コードを生成しようとしています: gcc -S -m32 BMPTransformer.c -o BMPTransformer.s

Ubuntu 13.04 を使用しています。同様の問題を抱えている人は、libc6-dev-i386 をインストールすることで問題を解決したようです。しかし、それは私にはうまくいきませんでした。

コンパイラは不平を言います:

BMPTransformer.c:243:6: エラー: 'asm' のリロード中にクラス 'GENERAL_REGS' でレジスタが見つかりません BMPTransformer.c:243:6: エラー: 'asm' オペランドに不可能な制約があります

そのままのコード:

216 static void ASM_reverse_image(BMPImage *image)
217 {
218      asm (
219             "movl $0, %%eax\n"
220 
221             "cmpl %%eax, %1\n"
222             "jl end\n"
223 
224             "row:\n"
225                  "movl (%0, %%eax, 4), %%edx\n"
226                  "decl %1\n"
227                  "movl (%0, %1, 4), %%esi\n"
228                  "movl %%esi, (%0,%%eax, 4)\n"
229                  "incl %%eax\n"
230                  "movl %%edx, (%0, %1, 4)\n"
231                  "cmpl %%eax, %1\n"
232                  "jg row\n"
233 
234             "end:\n"
235 
236             : : "r"(image->pixel_data), "r"(image->header.height): "%eax", "%edx", "%esi"
237       );
238 }

64 ビットの a、b、c レジスタを使用するコードは完全に機能していました。しかし、32ビット版が必要です。

4

2 に答える 2

2

エラーは通常、コンパイラがレジスタを使い果たしたことを示します。あなたが投稿した小さな断片から、そうではないはずです。実際、私にとってはうまくコンパイルされます。重要な詳細を伝えていない可能性があります。

とにかく、これを現在の形式でインライン asm に記述する理由はまったくありません。コンパイラは、より優れた (そして機能する) コードを簡単に生成できます。最初の比較は確かに C で行う必要があります。

補足: gcc inline asm を使用する場合、一般的な考え方は、可能な限り多くの可能性をコンパイラーに任せることです。たとえば、特にレジスターを必要としない場合は、一般的な制約を使用できます。

于 2013-10-22T22:36:55.190 に答える