本人对汇编一点不了解,最近学习C++语言,想看看VC下的程序输出的汇编代码,无奈汇编基础太差,看不懂,请高手指点一下,这些汇编代码的基本语法意思,或者能推荐相应的学习材料(请注明网址),感谢万分。
如果哪位高手能逐句解释一下汇编代码的语法意思,500分送上,决不食言!!最好推荐一下VC下相关汇编代码的语法材料。下面是我在VC下编译成的汇编代码:
TITLE D:\VC\InsideC\Point\CPoint.cpp
.386P
include listing.inc
if @Version gt 510
.model FLAT
else
_TEXT SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT ENDS
_DATA SEGMENT DWORD USE32 PUBLIC 'DATA'
_DATA ENDS
CONST SEGMENT DWORD USE32 PUBLIC 'CONST'
CONST ENDS
_BSS SEGMENT DWORD USE32 PUBLIC 'BSS'
_BSS ENDS
$$SYMBOLS SEGMENT BYTE USE32 'DEBSYM'
$$SYMBOLS ENDS
$$TYPES SEGMENT BYTE USE32 'DEBTYP'
$$TYPES ENDS
_TLS SEGMENT DWORD USE32 PUBLIC 'TLS'
_TLS ENDS
; COMDAT ??_C@_0BG@BGJM@call?5XX?8s?5constructor?$AA@
CONST SEGMENT DWORD USE32 PUBLIC 'CONST'
CONST ENDS
; COMDAT ?lock@ios@@QAAXXZ
_TEXT SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT ENDS
; COMDAT ?unlock@ios@@QAAXXZ
_TEXT SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT ENDS
; COMDAT ?unlockbuf@ios@@QAAXXZ
_TEXT SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT ENDS
; COMDAT ?gptr@streambuf@@IBEPADXZ
_TEXT SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT ENDS
; COMDAT ?setf@ios@@QAEJJJ@Z
_TEXT SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT ENDS
; COMDAT ?rdbuf@ios@@QBEPAVstreambuf@@XZ
_TEXT SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT ENDS
; COMDAT ??4istream@@IAEAAV0@ABV0@@Z
_TEXT SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT ENDS
; COMDAT ??6ostream@@QAEAAV0@P6AAAV0@AAV0@@Z@Z
_TEXT SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT ENDS
; COMDAT ??6ostream@@QAEAAV0@D@Z
_TEXT SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT ENDS
; COMDAT ?flush@@YAAAVostream@@AAV1@@Z
_TEXT SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT ENDS
; COMDAT ??4iostream@@IAEAAV0@PAVstreambuf@@@Z
_TEXT SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT ENDS
; COMDAT ??0XX@@QAE@H@Z
_TEXT SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT ENDS
; COMDAT _main
_TEXT SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT ENDS
FLAT GROUP _DATA, CONST, _BSS
ASSUME CS: FLAT, DS: FLAT, SS: FLAT
endif
PUBLIC ??0XX@@QAE@H@Z ; XX::XX
PUBLIC _main
EXTRN __chkesp:NEAR
; COMDAT _main
_TEXT SEGMENT
_x$ = -4
_main PROC NEAR ; COMDAT; 20 : { push ebp
mov ebp, esp
sub esp, 68 ; 00000044H
push ebx
push esi
push edi
lea edi, DWORD PTR [ebp-68]
mov ecx, 17 ; 00000011H
mov eax, -858993460 ; ccccccccH
rep stosd; 21 : XX x(1); push 1
lea ecx, DWORD PTR _x$[ebp]
call ??0XX@@QAE@H@Z ; XX::XX; 22 :
; 23 : } pop edi
pop esi
pop ebx
add esp, 68 ; 00000044H
cmp ebp, esp
call __chkesp
mov esp, ebp
pop ebp
ret 0
_main ENDP
_TEXT ENDS
PUBLIC ??_C@_0BG@BGJM@call?5XX?8s?5constructor?$AA@ ; `string'
PUBLIC ??6ostream@@QAEAAV0@D@Z ; ostream::operator<<
EXTRN ?cout@@3Vostream_withassign@@A:BYTE ; cout
EXTRN ??6ostream@@QAEAAV0@PBD@Z:NEAR ; ostream::operator<<
; COMDAT ??_C@_0BG@BGJM@call?5XX?8s?5constructor?$AA@
; File D:\VC\InsideC\Point\CPoint.cpp
CONST SEGMENT
??_C@_0BG@BGJM@call?5XX?8s?5constructor?$AA@ DB 'call XX''s constructor', 00H ; `string'
CONST ENDS
; COMDAT ??0XX@@QAE@H@Z
_TEXT SEGMENT
_x$ = 8
_this$ = -4
??0XX@@QAE@H@Z PROC NEAR ; XX::XX, COMDAT; 6 : XX(int x) push ebp
mov ebp, esp
sub esp, 68 ; 00000044H
push ebx
push esi
push edi
push ecx
lea edi, DWORD PTR [ebp-68]
mov ecx, 17 ; 00000011H
mov eax, -858993460 ; ccccccccH
rep stosd
pop ecx
mov DWORD PTR _this$[ebp], ecx; 7 : {
; 8 : _x = x ; mov eax, DWORD PTR _this$[ebp]
mov ecx, DWORD PTR _x$[ebp]
mov DWORD PTR [eax], ecx; 9 : cout<<"call XX's constructor"<<'\n'; push 10 ; 0000000aH
push OFFSET FLAT:??_C@_0BG@BGJM@call?5XX?8s?5constructor?$AA@ ; `string'
mov ecx, OFFSET FLAT:?cout@@3Vostream_withassign@@A
call ??6ostream@@QAEAAV0@PBD@Z ; ostream::operator<<
mov ecx, eax
call ??6ostream@@QAEAAV0@D@Z ; ostream::operator<<; 10 : } mov eax, DWORD PTR _this$[ebp]
pop edi
pop esi
pop ebx
add esp, 68 ; 00000044H
cmp ebp, esp
call __chkesp
mov esp, ebp
pop ebp
ret 4
??0XX@@QAE@H@Z ENDP ; XX::XX
_TEXT ENDS
EXTRN ??6ostream@@QAEAAV0@E@Z:NEAR ; ostream::operator<<
; COMDAT ??6ostream@@QAEAAV0@D@Z
_TEXT SEGMENT
__c$ = 8
_this$ = -4
??6ostream@@QAEAAV0@D@Z PROC NEAR ; ostream::operator<<, COMDAT; 115 : inline ostream& ostream::operator<<(char _c) { return operator<<((unsigned char) _c); } push ebp
mov ebp, esp
sub esp, 68 ; 00000044H
push ebx
push esi
push edi
push ecx
lea edi, DWORD PTR [ebp-68]
mov ecx, 17 ; 00000011H
mov eax, -858993460 ; ccccccccH
rep stosd
pop ecx
mov DWORD PTR _this$[ebp], ecx
mov al, BYTE PTR __c$[ebp]
push eax
mov ecx, DWORD PTR _this$[ebp]
call ??6ostream@@QAEAAV0@E@Z ; ostream::operator<<
pop edi
pop esi
pop ebx
add esp, 68 ; 00000044H
cmp ebp, esp
call __chkesp
mov esp, ebp
pop ebp
ret 4
??6ostream@@QAEAAV0@D@Z ENDP ; ostream::operator<<
_TEXT ENDS
END
下面是源程序:
#include <iostream.h>class XX
{
public:
XX(int x)
{
_x = x ;
cout<<"call XX's constructor"<<'\n';
}
private:
int _x;
};void main()
{
XX x(1);}
如果哪位高手能逐句解释一下汇编代码的语法意思,500分送上,决不食言!!最好推荐一下VC下相关汇编代码的语法材料。下面是我在VC下编译成的汇编代码:
TITLE D:\VC\InsideC\Point\CPoint.cpp
.386P
include listing.inc
if @Version gt 510
.model FLAT
else
_TEXT SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT ENDS
_DATA SEGMENT DWORD USE32 PUBLIC 'DATA'
_DATA ENDS
CONST SEGMENT DWORD USE32 PUBLIC 'CONST'
CONST ENDS
_BSS SEGMENT DWORD USE32 PUBLIC 'BSS'
_BSS ENDS
$$SYMBOLS SEGMENT BYTE USE32 'DEBSYM'
$$SYMBOLS ENDS
$$TYPES SEGMENT BYTE USE32 'DEBTYP'
$$TYPES ENDS
_TLS SEGMENT DWORD USE32 PUBLIC 'TLS'
_TLS ENDS
; COMDAT ??_C@_0BG@BGJM@call?5XX?8s?5constructor?$AA@
CONST SEGMENT DWORD USE32 PUBLIC 'CONST'
CONST ENDS
; COMDAT ?lock@ios@@QAAXXZ
_TEXT SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT ENDS
; COMDAT ?unlock@ios@@QAAXXZ
_TEXT SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT ENDS
; COMDAT ?unlockbuf@ios@@QAAXXZ
_TEXT SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT ENDS
; COMDAT ?gptr@streambuf@@IBEPADXZ
_TEXT SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT ENDS
; COMDAT ?setf@ios@@QAEJJJ@Z
_TEXT SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT ENDS
; COMDAT ?rdbuf@ios@@QBEPAVstreambuf@@XZ
_TEXT SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT ENDS
; COMDAT ??4istream@@IAEAAV0@ABV0@@Z
_TEXT SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT ENDS
; COMDAT ??6ostream@@QAEAAV0@P6AAAV0@AAV0@@Z@Z
_TEXT SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT ENDS
; COMDAT ??6ostream@@QAEAAV0@D@Z
_TEXT SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT ENDS
; COMDAT ?flush@@YAAAVostream@@AAV1@@Z
_TEXT SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT ENDS
; COMDAT ??4iostream@@IAEAAV0@PAVstreambuf@@@Z
_TEXT SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT ENDS
; COMDAT ??0XX@@QAE@H@Z
_TEXT SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT ENDS
; COMDAT _main
_TEXT SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT ENDS
FLAT GROUP _DATA, CONST, _BSS
ASSUME CS: FLAT, DS: FLAT, SS: FLAT
endif
PUBLIC ??0XX@@QAE@H@Z ; XX::XX
PUBLIC _main
EXTRN __chkesp:NEAR
; COMDAT _main
_TEXT SEGMENT
_x$ = -4
_main PROC NEAR ; COMDAT; 20 : { push ebp
mov ebp, esp
sub esp, 68 ; 00000044H
push ebx
push esi
push edi
lea edi, DWORD PTR [ebp-68]
mov ecx, 17 ; 00000011H
mov eax, -858993460 ; ccccccccH
rep stosd; 21 : XX x(1); push 1
lea ecx, DWORD PTR _x$[ebp]
call ??0XX@@QAE@H@Z ; XX::XX; 22 :
; 23 : } pop edi
pop esi
pop ebx
add esp, 68 ; 00000044H
cmp ebp, esp
call __chkesp
mov esp, ebp
pop ebp
ret 0
_main ENDP
_TEXT ENDS
PUBLIC ??_C@_0BG@BGJM@call?5XX?8s?5constructor?$AA@ ; `string'
PUBLIC ??6ostream@@QAEAAV0@D@Z ; ostream::operator<<
EXTRN ?cout@@3Vostream_withassign@@A:BYTE ; cout
EXTRN ??6ostream@@QAEAAV0@PBD@Z:NEAR ; ostream::operator<<
; COMDAT ??_C@_0BG@BGJM@call?5XX?8s?5constructor?$AA@
; File D:\VC\InsideC\Point\CPoint.cpp
CONST SEGMENT
??_C@_0BG@BGJM@call?5XX?8s?5constructor?$AA@ DB 'call XX''s constructor', 00H ; `string'
CONST ENDS
; COMDAT ??0XX@@QAE@H@Z
_TEXT SEGMENT
_x$ = 8
_this$ = -4
??0XX@@QAE@H@Z PROC NEAR ; XX::XX, COMDAT; 6 : XX(int x) push ebp
mov ebp, esp
sub esp, 68 ; 00000044H
push ebx
push esi
push edi
push ecx
lea edi, DWORD PTR [ebp-68]
mov ecx, 17 ; 00000011H
mov eax, -858993460 ; ccccccccH
rep stosd
pop ecx
mov DWORD PTR _this$[ebp], ecx; 7 : {
; 8 : _x = x ; mov eax, DWORD PTR _this$[ebp]
mov ecx, DWORD PTR _x$[ebp]
mov DWORD PTR [eax], ecx; 9 : cout<<"call XX's constructor"<<'\n'; push 10 ; 0000000aH
push OFFSET FLAT:??_C@_0BG@BGJM@call?5XX?8s?5constructor?$AA@ ; `string'
mov ecx, OFFSET FLAT:?cout@@3Vostream_withassign@@A
call ??6ostream@@QAEAAV0@PBD@Z ; ostream::operator<<
mov ecx, eax
call ??6ostream@@QAEAAV0@D@Z ; ostream::operator<<; 10 : } mov eax, DWORD PTR _this$[ebp]
pop edi
pop esi
pop ebx
add esp, 68 ; 00000044H
cmp ebp, esp
call __chkesp
mov esp, ebp
pop ebp
ret 4
??0XX@@QAE@H@Z ENDP ; XX::XX
_TEXT ENDS
EXTRN ??6ostream@@QAEAAV0@E@Z:NEAR ; ostream::operator<<
; COMDAT ??6ostream@@QAEAAV0@D@Z
_TEXT SEGMENT
__c$ = 8
_this$ = -4
??6ostream@@QAEAAV0@D@Z PROC NEAR ; ostream::operator<<, COMDAT; 115 : inline ostream& ostream::operator<<(char _c) { return operator<<((unsigned char) _c); } push ebp
mov ebp, esp
sub esp, 68 ; 00000044H
push ebx
push esi
push edi
push ecx
lea edi, DWORD PTR [ebp-68]
mov ecx, 17 ; 00000011H
mov eax, -858993460 ; ccccccccH
rep stosd
pop ecx
mov DWORD PTR _this$[ebp], ecx
mov al, BYTE PTR __c$[ebp]
push eax
mov ecx, DWORD PTR _this$[ebp]
call ??6ostream@@QAEAAV0@E@Z ; ostream::operator<<
pop edi
pop esi
pop ebx
add esp, 68 ; 00000044H
cmp ebp, esp
call __chkesp
mov esp, ebp
pop ebp
ret 4
??6ostream@@QAEAAV0@D@Z ENDP ; ostream::operator<<
_TEXT ENDS
END
下面是源程序:
#include <iostream.h>class XX
{
public:
XX(int x)
{
_x = x ;
cout<<"call XX's constructor"<<'\n';
}
private:
int _x;
};void main()
{
XX x(1);}
解决方案 »
- .ocx组件在html调用 问题?在线等待!来位大侠吧%>_<%
- 昨天,不应该是前天 见了 10年前的大学同学
- 请问各位大虾如何读取USB游戏手柄的按键信息???
- 求书!MXX,SEE,SEE2的书
- 网络选择子难题
- 为什么控件中的全局变量能够在不同页面的实例中共享啊?大家帮我看一下下面的问题是什么原因啊?
- 一个对话框程序,如何启动时使它最大化?
- 进程注入器
- 如何将一个ip地址付给一个dword类型?
- 可以在内存中生成icon吗?
- 如何得到一个可执行文件运行后的进程名,能不能从pe结构里面得到?
- 如何保存一个指定的超文本链接(已获得其IHTMLAnchorElement)到剪贴板(不一定要用剪贴板,如果可以直接用IDM_COPY也可以)
asm.yeah.net
写起的程序爽的哩
//否则按段组模式编译(间接实现平坦模式)
//由此可见,VC5.1以下版不识别.model FLAT伪指令
.model FLAT
else
_TEXT SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT ENDS
..............//这部分是按段组模式编译时的各段声明,它们被分成若于个组
//如‘CODE’,‘DATA’,‘CONST’,‘BSS’等
//同一组的各段在内存中连续存放,但它们都按平坦模式计算地址偏移量endif
PUBLIC ??0XX@@QAE@H@Z ; XX::XX //这是XX类的构造函数声明
PUBLIC _main //这是函数main声明
EXTRN __chkesp:NEAR //这是用于调试版中检查调用约定的
//C运行库函数声明
; COMDAT _main
_TEXT SEGMENT
_x$ = -4 //main函数中的对象x的栈中偏移量
_main PROC NEAR ; COMDAT; 20 : {
push ebp //这一块代码只存在于调试版中,
//用于函数调用时形成栈保护地带
mov ebp, esp
sub esp, 68 ; 00000044H
push ebx
push esi
push edi
lea edi, DWORD PTR [ebp-68]
mov ecx, 17 ; 00000011H
mov eax, -858993460 ; ccccccccH
rep stosd; 21 : XX x(1); push 1 //对象构造函数参数压栈
lea ecx, DWORD PTR _x$[ebp] //取this指针
call ??0XX@@QAE@H@Z ; XX::XX //调用构造函数; 22 :
; 23 : } //退出函数处理(同进入时相反并检查
//堆栈指针以确保调用约定正确)
pop edi
pop esi
pop ebx
add esp, 68 ; 00000044H
cmp ebp, esp
call __chkesp
mov esp, ebp
pop ebp ret 0 //main函数返回
_main ENDP
_TEXT ENDS从这以下的程序的常量,变量和其它函数的定义,楼主可仿上进行分析。