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

Zéy*_*hin 2 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)
Run Code Online (Sandbox Code Playgroud)

这是引用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;
   }

}
Run Code Online (Sandbox Code Playgroud)

Mys*_*ial 5

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

所以:

mov %edi, %edi
Run Code Online (Sandbox Code Playgroud)

清除前32位rdi.

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