这是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
为什么每次加法我都会得到多个 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.