为什么每次添加都会得到多个 ASM 指令? (Visual Studio 2022 社区)

问题描述 投票:0回答:1

这是C程序,我使用带有MSVC编译器的Visual Studio Community 2022。这些 mov 指令是什么?我没有使用任何编译器优化标志。


#include <stdio.h>
int main(void) {
    int a = 11;
    int b = 13;
    a += b;
    a += 15;
    a += 17;
    a += 23;
    return 0;
}

这是运行程序的反汇编视图。

    int a = 11;
00007FF75AB9175D  mov         dword ptr [a],0Bh  
    int b = 13;
00007FF75AB91764  mov         dword ptr [b],0Dh  
    a += b;
00007FF75AB9176B  mov         eax,dword ptr [b]  
00007FF75AB9176E  mov         ecx,dword ptr [a]  
00007FF75AB91771  add         ecx,eax  
00007FF75AB91773  mov         eax,ecx  
00007FF75AB91775  mov         dword ptr [a],eax  
    a += 15;
00007FF75AB91778  mov         eax,dword ptr [a]  
00007FF75AB9177B  add         eax,0Fh  
00007FF75AB9177E  mov         dword ptr [a],eax  
    a += 17;
00007FF75AB91781  mov         eax,dword ptr [a]  
00007FF75AB91784  add         eax,11h  
00007FF75AB91787  mov         dword ptr [a],eax  
    a += 23;
00007FF75AB9178A  mov         eax,dword ptr [a]  
00007FF75AB9178D  add         eax,17h  
00007FF75AB91790  mov         dword ptr [a],eax 
c assembly x86
1个回答
0
投票

为什么每次加法我都会得到多个 ASM 指令?

生成的程序集每次添加时不包含多个指令。大多数情况下,每个 C“操作”都有一条指令。

语句

a += 15;
不只是说加15。首先,
a += 15
被定义为与
a = a + 15
相同(除了
a
的位置仅确定一次)。然后,C 标准的规范规定将执行这些操作:

  • 对于
    a
    中的
    a + 15
    ,将从内存中取出
    a
    的值。
  • 对于
    +
    ,将添加
    a
    和15的值。
  • 对于
    a =
    +
    产生的值将存储在
    a
    中。

这实际上是一个加载、一个存储和一个添加,这正是我们在生成的程序集中看到的:

mov         eax,dword ptr [a]  //  Load the value of a.
add         eax,0Fh            //  Add the value of a and 15.
mov         dword ptr [a],eax  //  Store the new value into a.
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.