我编写了这个简单的C代码,并使用Visual Studio 2010编译它,并使用汇编程序输出。
int main(){
int x=1;
int y=2;
int z=x+y;
return 0;
}
这是装配输出..
; Listing generated by Microsoft (R) Optimizing Compiler Version 16.00.40219.01
TITLE foobar.cpp
.686P
.XMM
include listing.inc
.model flat
INCLUDELIB OLDNAMES
EXTRN @__security_check_cookie@4:PROC
PUBLIC _main
; Function compile flags: /Ogtp
; File foobar.cpp
; COMDAT _main
_TEXT SEGMENT
_main PROC ; COMDAT
; 2 : int x=1;
; 3 : int y=2;
; 4 : int z=x+y;
; 5 : return 0;
xor eax, eax
; 6 : }
ret 0
_main ENDP
_TEXT ENDS
END
这完整吗?我没有看到任何ADD
声明。可以使用什么编译器来编译它?
答案 0 :(得分:7)
由于您的代码不执行任何具有这些值的内容,因此编译器已对其中的大部分进行了优化。正如Carl所提到的,剩下的就是xor eax, eax
,它将eax归零,即返回值的寄存器。
即使您是printf("%d", z)
,您的结果z
也是编译时常量(3),这就是您在汇编列表中看到的全部内容。
您可以做的是在项目C ++属性中禁用优化,您应该看到预期的程序集。此外,在发布模式下构建应该最小化您在asm中看到的额外调试内容。