c++到汇编再到VC++中执行
vc++下如下简单代码:
#include "stdio.h "
void main()
{
printf( "hello,world\n ");
}
生成的汇编代码如下:
TITLED:\PVC\汇编\huibian.cpp
.386P
include listing.inc
if @Version gt 510
.model FLAT
else
_TEXTSEGMENT PARA USE32 PUBLIC 'CODE '
_TEXTENDS
_DATASEGMENT DWORD USE32 PUBLIC 'DATA '
_DATAENDS
CONSTSEGMENT DWORD USE32 PUBLIC 'CONST '
CONSTENDS
_BSSSEGMENT DWORD USE32 PUBLIC 'BSS '
_BSSENDS
_TLSSEGMENT DWORD USE32 PUBLIC 'TLS '
_TLSENDS
;COMDAT ??_C@_0N@OAGM@hello?0world?6?$AA@
_DATASEGMENT DWORD USE32 PUBLIC 'DATA '
_DATAENDS
;COMDAT _main
_TEXTSEGMENT PARA USE32 PUBLIC 'CODE '
_TEXTENDS
FLATGROUP _DATA, CONST, _BSS
ASSUMECS: FLAT, DS: FLAT, SS: FLAT
endif
PUBLIC_main
PUBLIC??_C@_0N@OAGM@hello?0world?6?$AA@; `string '
EXTRN_printf:NEAR
;COMDAT ??_C@_0N@OAGM@hello?0world?6?$AA@
; File D:\PVC\汇编\huibian.cpp
_DATASEGMENT
??_C@_0N@OAGM@hello?0world?6?$AA@ DB 'hello,world ', 0aH, 00H ; `string '
_DATAENDS
;COMDAT _main
_TEXTSEGMENT
_mainPROC NEAR; COMDAT
; File D:\PVC\汇编\huibian.cpp
; Line 4
pushOFFSET FLAT:??_C@_0N@OAGM@hello?0world?6?$AA@ ; `string '
call_printf
popecx
; Line 5
ret0
_mainENDP
_TEXTENDS
END
请问各位大侠,怎样使得上面的汇编代码能够重新在VC中运行??
谢谢!!!
[解决办法]
下面是我从VC6.0中弄到的源代码和汇编代码:
C语言源代码:
#include "stdafx.h "
int main(int argc, char* argv[])
{
printf( "Hello World!\n ");
return 0;
}
汇编窗口中输入的汇编代码:
--- C:\MyProjects\hello\hello.cpp ------------------------------------------------
1: // hello.cpp : Defines the entry point for the console application.
2: //
3:
4: #include "stdafx.h "
5:
6: int main(int argc, char* argv[])
7: {
00401010 push ebp
00401011 mov ebp,esp
00401013 sub esp,40h
00401016 push ebx
00401017 push esi
00401018 push edi
00401019 lea edi,[ebp-40h]
0040101C mov ecx,10h
00401021 mov eax,0CCCCCCCCh
00401026 rep stos dword ptr [edi]
8: printf( "Hello World!\n ");
00401028 push offset string "Hello World!\n " (0042201c)
0040102D call printf (00401060)
00401032 add esp,4
9: return 0;
00401035 xor eax,eax
10: }
00401037 pop edi
00401038 pop esi
00401039 pop ebx
0040103A add esp,40h
0040103D cmp ebp,esp
0040103F call __chkesp (004010e0)
00401044 mov esp,ebp
00401046 pop ebp
00401047 ret
怎么跟你弄到的差距这么大呢,你用的哪个编译器?
你弄到的汇编代码到处是标号,没有几句像样的汇编指令。好像还不是底层的汇编代码。
真正的汇编指令也只有下面的几条而已。
push OFFSET FLAT:??_C@_0N@OAGM@hello?0world?6?$AA@ ; `string '
call _printf
pop ecx
ret 0
好像也不用解释什么,功能显而易见!
[解决办法]
http://blog.csdn.net/fallblood/archive/2006/12/13/1441917.aspx