为什么这个大会产生了?:

时间:2012-02-02 22:45:59

标签: assembly x86-64

执行gcc -m64 -O test.c -save-temps后,我注意到: mov %edi, %edi 出现在生成的程序集中。这条指令甚至做了什么吗?它将%edi移动到自身,有效地完成任何事情。

所有优化级别都会生成此程序集,但在某些情况下,它的放置方式不同。

如果您需要我提供更多背景信息,请与我们联系。在发布这个问题时,我觉得不需要进一步的背景,但我可能是不正确的。

程序守则:

 subl    $400, %edi
 cmpl    $20, %edi
 ja      .L4
 mov     %edi, %edi
 jmp     *.L11(,%rdi,8)

这是引用switch语句的跳转表。

C来源:

int main()
{

}

int thing(int x)
{

   switch(x)
   {
        case 400:
        return  1;
        break;
        case 404:
        return  2;
        break;
        case 408:
        return  3;
        break;
        case 412:
        return  4;
        break;
        case 416:
        return  5;
        break;
        case 420:
        return  6;
        break;
   }

}

1 个答案:

答案 0 :(得分:5)

在64位模式下,在32位寄存器上使用时,mov指令将使目标寄存器的高32位归零。

所以:

mov %edi, %edi

清除rdi的前32位。

http://en.wikipedia.org/wiki/MOV_%28x86_instruction%29(一直向下滚动)