这个汇编代码生成完整了吗?

3

我编写了这段简单的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语句。可以用哪个编译器来编译它?


1
将“return 0;”更改为“return z+x+y;”,然后再查看输出。 - Java42
1个回答

7
由于您的代码没有对这些值进行任何处理,编译器已经将大部分内容优化掉了。正如Carl所提到的那样,剩下的只有“xor eax, eax”,它将eax清零,eax是返回值所放置的寄存器。
即使您使用“printf(”%d“,z)”,您的结果“z”也是编译时常量(3),在汇编清单中只会看到这个。
您可以在项目C ++属性中禁用优化,然后您应该会看到预期的汇编代码。此外,在发布模式下构建应该可以最小化您在asm中看到的额外调试信息。

4
实际上,它已优化掉了除return 0之外的所有内容。 - Carl Norum
哇..这真是快速完成了。谢谢。 - questions
我看到代码明确地返回0(ret 0)...为什么要将EAX清零? - questions
1
对于x86上的几乎所有函数调用约定,返回值都在eax中。ret 0并不意味着“返回零”。它意味着返回,并从堆栈帧中清除0字节。 - Jonathon Reinhart
1
如果您想查看加法的汇编代码,您有两种选择:要么添加使输入变量的内容(例如使用scanf读取它,或者您可以声明变量为volatile),并使用输出(例如printf结果或返回加法的结果)。另一种方法是禁用所有代码优化。 - flolo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接