执行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;
}
}
答案 0 :(得分:5)
在64位模式下,在32位寄存器上使用时,mov
指令将使目标寄存器的高32位归零。
所以:
mov %edi, %edi
清除rdi
的前32位。
http://en.wikipedia.org/wiki/MOV_%28x86_instruction%29(一直向下滚动)