vs2005 生成汇编代码

利用VC编译器的一个选项/FAs来生成对应的汇编代码。/FAs还会在汇编代码中加入注释注明和C++代码的对应关系,十分有助于分析。在VS2005中可以这样打开/FAs:

 项目 ---》属性 ---》 配置属性 ---》 c/c++ ---》 输出文件 ---》 右边内容项:汇编输出 ---》带源代码的程序集(/FAs )。

这样在项目里面生成后缀为*.asm  的文件。里面还有注释,有利于分析。

 

如以下代码:

 

 // Overflow.cpp : 定义控制台应用程序的入口点。

//

#include "stdafx.h"


int _tmain(int argc, _TCHAR* argv[])
{
printf("this is a new line.\n");

return 0;
}

 

 

编译后,用vs2005生成的汇编代码为:

 

 ; Listing generated by Microsoft (R) Optimizing Compiler Version 14.00.50727.42 

;头
TITLE e:\testSource\CTest\Overflow\Overflow\Overflow.cpp
.686P
.XMM
include listing.inc
.model flat

 

INCLUDELIB MSVCRTD
INCLUDELIB OLDNAMES

PUBLIC ??_C@_0BF@KCEKAGNN@this?5is?5a?5new?5line?4?6?$AA@ ; `string'                       ;在这里指出  
??_C@_0BF@KCEKAGNN@this?5is?5a?5new?5line?4?6?$AA@ 是一个变量
PUBLIC _wmain                                                                                                                   ;引出的函数
EXTRN __imp__printf:PROC                                                                                                 ;使用的一些函数,申明
EXTRN __RTC_CheckEsp:PROC
EXTRN __RTC_Shutdown:PROC
EXTRN __RTC_InitBase:PROC
; COMDAT ??_C@_0BF@KCEKAGNN@this?5is?5a?5new?5line?4?6?$AA@
; File e:\testsource\ctest\overflow\overflow\overflow.cpp

 

CONSTSEGMENT                                                                                                                ;const 段

??_C@_0BF@KCEKAGNN@this?5is?5a?5new?5line?4?6?$AA@ DB 'this is a new line'                 ;定义
??_C@_0BF@KCEKAGNN@this?5is?5a?5new?5line?4?6?$AA@变量
DB '.', 0aH, 00H ; `string'                                                                                                   ;变量
??_C@_0BF@KCEKAGNN@this?5is?5a?5new?5line?4?6?$AA@的结尾
CONST ENDS

 

; COMDAT rtc$TMZ                                                                                                            ;其它段
rtc$TMZ SEGMENT 
__RTC_Shutdown.rtc$TMZ DD FLAT:__RTC_Shutdown
rtc$TMZ ENDS

 

;COMDAT rtc$IMZ

rtc$IMZSEGMENT

__RTC_InitBase.rtc$IMZ DD FLAT:__RTC_InitBase
; Function compile flags: /Odtp /RTCsu /ZI
rtc$IMZ ENDS

 

;COMDAT _wmain

_TEXT SEGMENT
_argc$ = 8 ; size = 4
_argv$ = 12 ; size = 4
_wmain PROC ; COMDAT

; 8    : {

push ebp
mov ebp, esp
sub esp, 192 ; 000000c0H

 

push ebx
push esi
push edi

 

 ;抬高栈顶,防止溢出

lea edi, DWORD PTR [ebp-192]                                         
mov ecx, 48 ; 00000030H
mov eax, -858993460 ; ccccccccH                           ;将这些栈初始化。用cc是int软中断
rep stosd

; 9    : printf("this is a new line.\n");

mov esi, esp
push OFFSET ??_C@_0BF@KCEKAGNN@this?5is?5a?5new?5line?4?6?$AA@
call DWORD PTR __imp__printf
add esp, 4
cmp esi, esp
call __RTC_CheckEsp

; 10   : 
; 11   : return 0;

xor eax, eax

; 12   : }

pop edi
pop esi
pop ebx
add esp, 192 ; 000000c0H
cmp ebp, esp
call __RTC_CheckEsp
mov esp, ebp
pop ebp
ret 0

 

 

_wmain ENDP
_TEXT ENDS
END

 

posted @ 2011-09-20 09:40  keepfocus  阅读(728)  评论(0编辑  收藏  举报