GCC和乘法指令

时间:2016-03-14 23:37:06

标签: c gcc x86

我在cygwin下的Windows 7机器上以32位模式使用GCC。我有以下功能:

  unsigned f1(unsigned x, unsigned y)
  {
      return x*y;
  }

我希望代码执行无符号乘法,因此我希望它生成mul指令,而不是imul指令。我编译程序 使用以下命令:

 gcc -m32 -S t4.c

生成的汇编代码为:

     .file   "t4.c"
     .text
     .globl  _f1
     .def    _f1;    .scl    2;  .type   32; .endef
_f1:
     pushl   %ebp
     movl    %esp, %ebp
     movl    8(%ebp), %eax
     imull   12(%ebp), %eax
     popl    %ebp
     ret
    .ident  "GCC: (GNU) 4.8.2"

我相信生成的代码中有错误的乘法指令,但我发现很难相信GCC有这么简单的错误。请评论。

1 个答案:

答案 0 :(得分:6)

编译器依赖于“as-if”规则:没有标准的符合程序可以检测到该程序执行的操作与程序应该执行的操作之间的差异,因为两个指令的结果的最低32位是相同的。