首页
社区
课程
招聘
[旧帖] [求助]Win32ASM窗口程序 0.00雪花
发表于: 2008-10-17 18:29 2666

[旧帖] [求助]Win32ASM窗口程序 0.00雪花

2008-10-17 18:29
2666
照着《Windows环境下32位汇编语言设计程序》上的例子,写了个HelloWorld的程序。就是让它弹出来一个窗口,中间写着“HelloWorld”,但生成的exe文件运行后会一下出来38个叠在一起的窗口。不知道是哪里写错了,望指点,谢谢!

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
        .386
        .model flat, stdcall
        option casemap:none
;------------------include----------------------------------
include     windows.inc
include     gdi32.inc
includelib  gdi32.lib
include     user32.inc
includelib  user32.lib
include     kernel32.inc
includelib  kernel32.lib
;-------------------data---------------------------------
        .data?
hInstance   dd  ?
hWinMain    dd  ?
 
        .const
szClassName db  'MyClass', 0
szCaptionMain   db  'Hello World in Win32 ASM', 0
szText      db  'Hello World!', 0
;-------------------code------------------------------
        .code
    ;----------Window callback function--------
_ProcWinMain    proc    uses ebx edi esi, hwnd, uMsg, wParam, lParam
        local   @stPs: PAINTSTRUCT
        local   @stRect: RECT
        local   @hdc
         
        mov eax, uMsg
        ;-------------------
        .if eax == 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
        ;---------------------
_ProcWinMain    endp
;--------------------------_WinMain--------------------
_WinMain    proc
        local   @stWndClass: WNDCLASSEX
        local   @stMsg: MSG
         
        invoke  GetModuleHandle, NULL
        mov hInstance, eax
        invoke  RtlZeroMemory, addr @stWndClass, sizeof @stWndClass
        ;--------------Register Window Class-----------
        invoke  LoadCursor, 0, IDC_ARROW
        mov @stWndClass.hCursor, eax
        push    hInstance
        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, addr @stWndClass
        ;--------------Create Window-------------------
        invoke  CreateWindowEx, WS_EX_CLIENTEDGE,\
            offset szClassName, offset szCaptionMain, \
            WS_OVERLAPPEDWINDOW,\
            100, 100, 600, 400,\
            NULL, NULL, hInstance, NULL
        mov hWinMain, eax
        invoke  ShowWindow, hWinMain, SW_SHOWNORMAL
        invoke  UpdateWindow, hWinMain
        ;-----------------Message loop-------------------
        .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
;------------------------------------
        end start

[注意]看雪招聘,专注安全领域的专业人才平台!

收藏
免费
支持
分享
最新回复 (2)
雪    币: 293
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
是不是应为
_ProcWinMain  proc
    ...
    ...
    ...
_ProcWinMain  endp
最后没有写 ret,貌似不是每个分支都有ret。
2008-10-17 19:27
0
雪    币: 197
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
的确是在_ProcWinMain中没有ret,谢谢!
2008-10-17 20:22
0
游客
登录 | 注册 方可回帖
返回

账号登录
验证码登录

忘记密码?
没有账号?立即免费注册