对于许多编译器,它们是相同的。 (请注意,我说的是 许多 编译器 - 请参阅下面的免责声明)。例如,对于以下 C++ 代码,Test 1 和 Test 2 将产生相同的汇编语言:
int main()
{
int test = 0;
// Test 1
test++;
// Test 2
test += 1;
return 0;
}
许多编译器(包括 Visual Studio)都可以配置为显示生成的汇编语言,这是解决此类问题的最佳方式。例如,在 Visual Studio 中,我右键单击项目文件,转到“属性”,然后执行以下操作:
在这种情况下,如下图所示,Visual Studio确实,实际上是将它们编译成相同的汇编语言:
; Line 8
push ebp
mov ebp, esp
sub esp, 204 ; 000000ccH
push ebx
push esi
push edi
lea edi, DWORD PTR [ebp-204]
mov ecx, 51 ; 00000033H
mov eax, -858993460 ; ccccccccH
rep stosd
; Line 9
mov DWORD PTR _test$[ebp], 0
; Line 12 - this is Test 1
mov eax, DWORD PTR _test$[ebp]
add eax, 1
mov DWORD PTR _test$[ebp], eax
; Line 15 - This is Test 2 - note that the assembly is identical
mov eax, DWORD PTR _test$[ebp]
add eax, 1
mov DWORD PTR _test$[ebp], eax
; Line 17
xor eax, eax
; Line 18
pop edi
pop esi
pop ebx
mov esp, ebp
pop ebp
ret 0
_main ENDP
_TEXT ENDS
END
有趣的是,它的 C# 编译器还为类似的 C# 代码生成相同的 MSIL(这是 C# 的“等效”汇编语言),因此这显然也适用于多种语言。
顺便说一句,如果您使用的是 gcc 等其他编译器,您可以按照指示 here 获取汇编语言输出。根据接受的答案,您应该使用-S 选项,如下所示:
gcc -S helloworld.c
如果您使用 Java 编写并想做类似的事情,您可以关注 these directions 使用 javap 获取字节码,可以说是 Java 的“等效”汇编语言。
同样有趣的是,由于这个问题最初是关于 Java 和 C++,this question 讨论了 Java 代码、字节码和最终的机器代码(如果有的话)之间的关系。
警告:不同的编译器可能会产生不同的汇编语言,尤其是当您针对不同的处理器和平台进行编译时。您是否打开优化也会影响事情。因此,严格来说,Visual Studio“足够聪明”知道这两个语句“意味着”同一件事并不一定意味着 all 编译器适用于 all 可能的平台会那么聪明。