本人对汇编一点不了解,最近学习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);}

解决方案 »

  1.   

    不介意的话,windows环境下汇编可以写本压死人的书的,罗云彬不是有本《windows环境下32位汇编程序设计》吗.7x元,去买吧,我见过最好的了。
      

  2.   

    罗云彬的站点是
    asm.yeah.net
      

  3.   

    自己up一下,关键是看《inside》的时候,许多不懂,所以才想侃侃汇编,没想到不懂的更多。
      

  4.   

    没有必要;难到你想到微软去写windows kernel?
      

  5.   

    不单单是你写的代码编译出汇编,还有C运行时为了启动main函数,编译器自动也为你加了许多辅助代码。自己可以写只有这一行代码void main(){}的项目,然后编译后看看,会发现出现许多代码的。还可以改变预编译指令来看编译器输出的内容。
      

  6.   

    to what2say3:兄台此言差矣,不过希望给点实际的指点。to MyNameEPC:就是想看明白那些东西,但是现在看不懂基本的汇编语句,也没有找到合适的资料,所以希望各位能推荐一下啊。
      

  7.   

    32位会编可强了,调用windows api 
    写起的程序爽的哩
      

  8.   

    if @Version gt 510 //VC版本>5.1,则直接按平坦模式编译,
              //否则按段组模式编译(间接实现平坦模式)
              //由此可见,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从这以下的程序的常量,变量和其它函数的定义,楼主可仿上进行分析。
      

  9.   

    对zhukeke(zhukeke) 感激涕零,我会重新开贴给分的。决不食言。