gpt4 book ai didi

c - gcc 输出反汇编中的 data32 data32 nopw %cs :0x0(%rax, %rax,1) 指令的含义是什么?

转载 作者:太空狗 更新时间:2023-10-29 17:06:38 28 4
gpt4 key购买 nike

在为 gcc 编译器的 -O2 优化运行一些测试时,我在函数的反汇编代码中观察到以下指令:

data32 data32 data32 data32 nopw %cs:0x0(%rax,%rax,1)

这条指令是做什么的?

更详细地说,我试图了解编译器如何使用 O2 优化来优化无用的递归,如下所示:

int foo(void)
{
return foo();
}
int main (void)
{
return foo();
}

上述代码在未经优化编译时会导致堆栈溢出,但适用于 O2 优化代码。

我认为 O2 完全消除了函数 foo 的压栈,但为什么需要 data32 data32 data32 data32 nopw %cs:0x0(%rax,%rax,1)

0000000000400480 <foo>:
foo():
400480: eb fe jmp 400480 <foo>
400482: 66 66 66 66 66 2e 0f data32 data32 data32 data32 nopw %cs:0x0(%rax,%rax,1)
400489: 1f 84 00 00 00 00 00

0000000000400490 <main>:
main():
400490: eb fe jmp 400490 <main>

最佳答案

你看到一个 operand forwarding优化 cpu 流水线。

虽然这是一个空循环,但 gcc 也会尝试对其进行优化:-)。

您正在运行的 cpu 有一个 superscalar建筑学。这意味着,它有一个管道,并且连续指令执行的不同阶段并行发生。例如,如果有一个

mov eax, ebx ;(#1)
mov ecx, edx ;(#2)

然后指令#2 的加载和解码可以在执行#1 时发生。

流水线在分支的情况下有主要问题需要解决,即使它们是无条件的。

例如,当 jmp 正在解码时,下一条指令已经预取到流水线中。但是 jmp 改变了下一条指令的位置。在这种情况下,管道需要清空和重新填充,大量有值(value)的 cpu 周期将丢失。

在这种情况下,如果管道中充满空操作,看起来这个空循环会运行得更快,尽管它永远不会被执行。它实际上是对 x86 管道的一些不常见特性的优化。

较早的 dec alpha 甚至可以从这些事情中产生段错误,空循环中必须有很多空操作。 x86 只会更慢。这是因为它们必须与 intel 8086 兼容。

Here您可以从流水线中分支指令的处理中读到很多内容。

关于c - gcc 输出反汇编中的 data32 data32 nopw %cs :0x0(%rax, %rax,1) 指令的含义是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29871947/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com