执行后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)
在64位模式下,mov在32位寄存器上使用的指令将使目标寄存器的高32位归零.
所以:
mov %edi, %edi
Run Code Online (Sandbox Code Playgroud)
清除前32位rdi.
http://en.wikipedia.org/wiki/MOV_%28x86_instruction%29(向下滚动)
| 归档时间: |
|
| 查看次数: |
132 次 |
| 最近记录: |