次のような 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ビット版が必要です。