lyoal 发表于 2013-1-8 17:40:24

WIN32第四章的第一程序窗口代码,我照着敲出来,但编译不能过?

WIN32第四章的第一程序窗口代码,我照着敲出来,但编译不能过。
我一行一行的对照,发了几处打错了,又对照了两遍,确认没了,便编译还是不通过。
   .386 ;CPU支持的指令集
   .model flat,stdcall;定义内存寻址模式及子程序的调用方式
   option casemap:none;选项,设置变量是否区分大小写,支持
   
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;Include 文件定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
includewindows.inc;包含系统类库
includegdi32.inc;图形相关函数库
includelib gdi32.lib;图形函数导入库
includeuser32.inc;用户函数函数库
includelib user32.lib;用户导入库
includekernel32.inc ;核心库
includelib kernel32.lib ;核心类库
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;数据段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
   .data?   ;定义数据段
hInstance dd?;
hWinMain dd?;   .const   ;定义常量数据段
   
SzClassNamedd'MyClass',0
SzCaptionMain dd'My first Window!',0
SzText   dd'Win32 Assembly,Simple and powerful !',0
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;代码段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    .code
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;窗口过程
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_ProcWinMain proc USES ebx edi esi,hWnd,uMsg,wParam,lParam;uses这关键字的作用是,无论哪个函数的返回值都永远都是放在eax中的。
    local @stPs:PAINTSTRUCT
    local @stRect:RECT
    local @hDc
   
    mov eax,uMsg
;**********************************************************************
    .ifeax == WM_PAINT
      invoke BeginPaint,hWnd,addr @stPs
      mov@hDc,eax
      
      invoke GetClientRect,hWnd,addr @stRect
      invoke DrawText,@hDc,addr szText,-1,\
      addr @stRect,\
      DT_SINGLELINE or DT_CENTER or DT_VCENTER
      
      invoke EndPaint,hWnd,addr @stPs
;**********************************************************************
    .elseif eax == WM_CLOSE
      invoke DestroyWindow,hWinMain
      invoke PostQuitMessage,NULL
;**********************************************************************
    .else
      invoke DefWindowProc,hWnd,uMsg,wParam,lParam
      ret
    .endif
;**********************************************************************
    xoreax,eax
    ret
   
_ProcWinMain endp
;**********************************************************************
_WinMainproc
    local @stWndClass:WNDCLASSEX;冒号的含义是什么?
    local @stMsg:MSG
   
    invoke GetModuleHandle,NULL
    movhInstance,eax
    invoke RtlZeroMemory,addr @stWndClass,sizeof @stWndClass
;**********************************************************************
;注册窗口类
;**********************************************************************
    invokeLoadCursor,0,IDC_ARROW
    mov@stWndClass.hCursor,eax
    pushhInstance
    pop@stWndClass.hInstance
    mov@stWndClass.cbSize,sizeof WNDCLASSEX
    mov@stWndClass.style,CS_HREDRAW OR CS_VREDRAW
    mov@stWndClass.lpfnWndProc,offset _ProcWinMain
    mov@stWndClass.hbrBackground,COLOR_WINDOW + 1
    mov@stWndClass.lpszClassName,offset szClassName
    invoke RegisterClassEx,add @stWndClass
;**********************************************************************
;建立并显示窗口
;**********************************************************************
    invoke CreatewindowEx,WS_EX_CLIENTEDGE,\
      offset szClassName,offset szCaptionMain,\
      WS_OVERLAPPEDWINDOW,\
      100,100,600,400,\
      NULL,NULL,hInstance,NULL
    movhWinMain,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
      ret
_WinMain    endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
start:
    call _WinMain
    invoke ExitProcess,NULL
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    endstart

编译结果


1236 发表于 2013-1-8 17:40:25

46:   szText用db定义szText   db   "Win32 Assembly,Simple and powerful !",0
85:把83行的add改成addr
89:是CreateWindowEx
96:    是UpdateWindow
24,25,26:    22 23 24行的代码 都用db定义

lyoal 发表于 2013-1-9 00:54:52

1236 发表于 2013-1-9 00:40 static/image/common/back.gif
46:   szText用db定义szText   db   "Win32 Assembly,Simple and powerful !",0
85:把83行的add改成 ...

刚开始学,看这么多代都头大,照办下来,没想检查几遍也没检查出来,天资太差了点。谢谢指点!
页: [1]
查看完整版本: WIN32第四章的第一程序窗口代码,我照着敲出来,但编译不能过?