Assembly 为什么生成此程序集?:

Assembly 为什么生成此程序集?:,assembly,x86-64,Assembly,X86 64,在执行了gcc-m64-O test.c-save temps之后,我注意到: mov%edi,%edi 显示在生成的程序集中。这个指令有什么作用吗?它将%edi移动到自身中,实际上什么也做不到 所有优化级别都会生成此部件,尽管在某些情况下它的放置方式不同 请让我知道,如果你需要我提供进一步的背景。在发布这个问题时,我觉得没有必要进一步解释,但我可能是不正确的 程序守则: subl $400, %edi cmpl $20, %edi ja .L4 mov %

在执行了
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;
   }

}

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

因此:

清除rdi的前32位


(向下滚动)

尝试更高的优化级别
-O2
?实际上,您可以围绕该指令显示更多的程序集吗?(包括地址)嗯。。。您还可以显示此代码段的源代码吗?我已使用其他信息更新了我的问题。已使用C源代码更新。请注意:这不是为了实际使用。我们正在我的大学研究GCC生成的跳转表的代码策略。我没有把这个问题标记为家庭作业,因为这个问题对我完成作业毫无帮助。我只是不明白为什么会生成这个指令。Doh!我应该意识到。谢谢你的帮助。我需要一段时间来适应这种架构。我从一开始就怀疑这一点,但我很难找到它的来源。然后,当您发布源代码(没有64位值)时,它就变得清晰了。我将扩展它,说64位模式下的所有32位指令都会清除相应寄存器的高位(63-32)。资料来源:《英特尔优化指南》第9.2.1章“数据大小为32位时使用传统的32位指令”。为什么需要这样做?
subl
可能已经清除了右上方的位?@harold它可能只是优化的产物。或者可能有一个跳转到那个位置。(这似乎有点像,因为它是一个带有跳转表的开关)
mov %edi, %edi