先不说了,直接上代码吧,妹的,调了好长时间就是不知道那里的错误,可,等发现了,却不知是哭是笑哈

;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
 ;程序平台定义


 .386


 .Model Flat,StdCall


 Option CaseMap:None


 ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<


 ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
 ;文件包含
 include windows.inc


 include kernel32.inc


 include user32.inc


 include gdi32.inc


 includelib gdi32.lib


 includelib kernel32.lib


 includelib user32.lib
 ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<








 ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
 ;数据段定义
 .const


 szTitle db "计算器",0


 szClassName db "MyClass",0


 szText    db  "beginPaint",0


 szButton  db   "Button",0;我们创建按钮的类的名称


 szCaption db "hehe",0


 szError1  db "Instance error",0


 szError2  db "CreateWindowEx error",0


 szError3 db  "RegisterWindow Error",0


 szError4 db  "ShowWIndow Error",0
 ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<






 ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
 ;常量段的定义
 .data


 hInstance dd ?;本程序的句柄所在


 hWinMain  dd ?;主窗口的句柄


 hButton    dd ?;按钮的句柄


 ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<






 ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
 ;代码段定义
 .code


 ;******************************************************************************************************
 ;**窗口消息的处理函数


 WinProc proc uses ebx edi esi,hWnd,uMsg,wParam,lParam


 ;定义局部变量
 local @stPaint:PAINTSTRUCT;


 local @stRect:RECT;


 local @hDC;


 mov eax,uMsg;


 .if eax==WM_PAINT


     invoke BeginPaint,hWnd,addr @stPaint;hWnd(输入参数,指向窗口句柄,@stPaint输出参数,接收绘画信息)
 
mov @hDC,eax


invoke GetClientRect,hWnd,addr @stRect;


invoke DrawText,@hDC,addr szText,-1,addr @stPaint, DT_SINGLELINE or DT_CENTER or DT_VCENTER;


invoke EndPaint,hWnd,addr @stPaint;s   


 .elseif eax==WM_CREATE
    
invoke CreateWindowEx,NULL, offset szButton,offset szCaption,WS_CHILD or WS_VISIBLE,10,10,65,22, hWnd,  1001, hInstance,NULL;
 
mov hButton,eax;


 .elseif eax==WM_COMMAND


      MOV eax,wParam;
 
 .if ax==1001


 invoke MessageBox,NULL,addr szCaption,NULL,NULL;


 .endif


 .elseif eax==WM_CLOSE
      
 invoke DestroyWindow,hWinMain;


 invoke PostQuitMessage,0;


 .else
    
 invoke DefWindowProc,hWnd,uMsg,wParam,lParam;


 ret;


 .endif
    
 xor eax,eax


 ret;


 WinProc endp;   




 ;******************************************************************************************************




 ;******************************************************************************************************
 ;**主函数,主要作用是创建窗口类,注册,创建主窗口
 ;**以及分发消息


 _WinMain proc


 local @stWndClass:WNDCLASSEX;


 local @stMsg:MSG;


 invoke GetModuleHandle,NULL


 mov  hInstance,eax;保存本进程句柄




 ;这里需要注意的是取地址操作符是addr
 invoke RtlZeroMemory,addr @stWndClass,sizeof @stWndClass;


 invoke LoadCursor,0,IDC_ARROW;指定鼠标的形状


 mov @stWndClass.hCursor,eax;


 push hInstance


 pop @stWndClass.hInstance;通过堆栈进行值的传递


 mov @stWndClass.cbSize,sizeof WNDCLASSEX;


 mov @stWndClass.lpfnWndProc,offset WinProc;


 mov @stWndClass.lpszClassName,offset szClassName


 mov @stWndClass.hbrBackground,COLOR_WINDOW+1;


 mov @stWndClass.style,CS_HREDRAW or CS_VREDRAW


 ;进行窗口的注册
 invoke RegisterClassEx,addr @stWndClass;


 ;进行窗口的显示
 invoke CreateWindowEx,WS_EX_CLIENTEDGE, offset szClassName,offset szTitle,WS_OVERLAPPED,1,1,500,200,NULL,NULL,hInstance,NULL;


 ;invoke GetLastError;


 .if eax==0


 invoke MessageBox,NULL,addr szError2,NULL,MB_OK


 invoke ExitProcess,0


 .endif


 mov hWinMain,eax;获得主窗口的句柄


 invoke ShowWindow,hWinMain,SW_SHOWNORMAL;


 invoke UpdateWindow,hWinMain;


 ;消息循环


 .while TRUE


     invoke GetMessage,addr @stMsg,NULL,0,0
     
.break .if eax==0


invoke TranslateMessage,addr @stMsg


invoke DispatchMessage,addr @stMsg


 .endw


 _WinMain endp


 ;******************************************************************************************************


 start:


 call _WinMain;


 invoke MessageBox,NULL,offset szError1,NULL,0


 invoke ExitProcess,0


 end start;
 ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<


;PS:顺便说下addr和offset的区别,addr用于将标号的地址传递给被调用的函数,addr不可以处理向前引用,即如果想


;要使用变量或者标号必须在使用之前定义,addr可以处理局部变量,offset则不行,局部变量在堆栈中分配,而offset


;则在程序编译时编译器解释,即全局变量,也就是说,offset只能作用于全局变量,而addr则均可


PS;好了说下答案吧,原来我的出函数中没有错误,但是在WinProc中的.IF EAX==WM_CLOSE成了 .IF WM_CLOSE,WinProc

所以啊告诫大家,以后如果出现这种错误,也有可能是在WinProc中的,呵呵,到一段落了,看下别的