c - GCC 无法从具有内联汇编的函数生成 32 位代码

标签 c gcc assembly inline-assembly att

我尝试像这样生成 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 位版本。

最佳答案

该错误通常表示编译器已用完寄存器。从您发布的小片段来看,情况并非如此,而且它确实对我来说编译得很好。您可能没有说出一些重要的细节。

无论如何,绝对没有理由以当前形式将其写入内联汇编。编译器可以轻松生成更好(和工作)的代码。最初的比较当然应该在 C 中。

旁注:当使用 gcc inline asm 时,一般的想法是将尽可能多的可能性留给编译器。例如,您并不特别需要任何寄存器,您可以使用通用约束。

关于c - GCC 无法从具有内联汇编的函数生成 32 位代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19526651/

相关文章:

c - 重用 strtok 为 null

c - 使用 Windows SEH 和 GCC 标签即值跳转到本地错误处理程序

linux - gcc -llibname 和操作系统如何找到 lib 路径?

c++ - 将 .o 文件转换为 .exe

linux - 如何创建一个基本的 NASM Assembly (Linux) 计算器来添加两个整数?

c - 打包/解包缓冲区

c - 来自 scanf 函数的输入给出了意外的结果

c - 抑制 lint 消息 9007

assembly - 在 ARM Arch64 寄存器中移动 32 位常量

assembly - 为什么需要内存对齐?