gpt4 book ai didi

c++ - 被这段汇编代码搞糊涂了

转载 作者:搜寻专家 更新时间:2023-10-31 01:00:03 24 4
gpt4 key购买 nike

我试图更好地理解汇编,所以我在调试代码时一直关注 CDB 的汇编输出。我的平台是装有 Windows 7 的 Intel Xeon。

以下 C++ 代码:

int main()
{
int a = 30;
int b = 0;
b = ++a;
return 0;
}

为带有增量运算符的行生成以下程序集:

            b = ++a;
0x13f441023 <+0x0013> mov eax,dword ptr [rsp]
0x13f441026 <+0x0016> inc eax
0x13f441028 <+0x0018> mov dword ptr [rsp],eax //Move eax to some memory address
0x13f44102b <+0x001b> mov eax,dword ptr [rsp] //Move it back to eax?
0x13f44102e <+0x001e> mov dword ptr [rsp+4],eax

我的问题是,将 eax 中的值移动到内存,然后立即将相同的值移回 eax 的目的是什么,如注释所示?这是为了线程安全,还是只是调试构建的一些产物?

最佳答案

编译器最初使用 static single assignment 将您的指令翻译成汇编值(SSA),这意味着每个操作都会获得一个临时值来存储其结果。只有在稍后的后端阶段,这些值才会根据您的目标机器转换为机器寄存器,并在必要时可能转换为内存位置(明确要求或由于缺少寄存器而溢出)。

在这些阶段之间,优化器可能会消除部分值,但最初++a 是一个操作,将 a(后增量)分配给 b 是第二个操作。由于 a 和 b 都是局部变量,它们将存储在堆栈中(并且必须在那里可见,例如,如果您使用调试器进行步进),a 将驻留在 [rsp] 中,b 将驻留在 [rsp+4] 中。

所以你的编译器,在某些时候,可能有(在一些中间表示中):

    value1 = a
value2 = value1 + 1
a = value2 //self increment
b = a

或类似的东西。 a 和 b 必须是内存驻留的,但是操作通常是在寄存器上完成的,所以首先编译器会做 -

    value1 = a
value2 = value1 + 1
0x13f441023 <+0x0013> mov eax,dword ptr [rsp]
0x13f441026 <+0x0016> inc eax

a = value2
0x13f441028 <+0x0018> mov dword ptr [rsp],eax

b = a
0x13f44102b <+0x001b> mov eax,dword ptr [rsp]
0x13f44102e <+0x001e> mov dword ptr [rsp+4],eax

请注意,中间值保存在寄存器中 - 在正常编译中,它们可能会被优化过程之一完全消除(在寄存器分配和代码生成之前)。

关于c++ - 被这段汇编代码搞糊涂了,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32051085/

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