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