生成的汇编代码是否完整?

que*_*ons 3 c assembly gcc visual-studio-2010

我编写了这个简单的C代码,并使用Visual Studio 2010编译它,带有汇编程序输出.

int main(){
    int x=1;
    int y=2;
    int z=x+y;
    return 0;
}  
Run Code Online (Sandbox Code Playgroud)

这是装配输出..

; 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
Run Code Online (Sandbox Code Playgroud)

这完整吗?我没有看到任何ADD声明.可以使用什么编译器来编译它?

Jon*_*art 7

由于您的代码不对这些值执行任何操作,因此编译器已对其中的大部分进行了优化.正如卡尔所提到的,剩下的就是将xor eax, eaxeax归零,即返回值的寄存器.

即使你是printf("%d", z),你的结果z是编译时常量(3),这就是你在汇编列表中看到的所有内容.

您可以做的是在项目C++属性中禁用优化,您应该看到预期的程序集.此外,在Release模式下构建应该最小化您在asm中看到的额外调试内容.

  • 事实上,它优化了除"返回0"之外的所有内容. (4认同)