读书人

WIN32ASM一个程序运行不了解决方案

发布时间: 2012-05-09 12:13:59 作者: rapoo

WIN32ASM一个程序运行不了
在WIN7的环境下运行不了。兼容模式也弄了。菜鸟不懂什么原因。

Assembly code
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>        .386        .model    flat,stdcall        option    casemap:none;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>;equ 值定义APP_ICON EQU 1200;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>;include文件定义;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>include        windows.incinclude        kernel32.incinclude        user32.incinclude        gdi32.incincludelib    kernel32.libincludelib    user32.libincludelib    gdi32.lib;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>;数据段;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>            .data?hInstance    dd        ?hWinMain        dd        ?hEdit            dd        ?            .constszClassName        db    'MyTextClass',0szCaptionMain    db    'MyTextClass~',0szEditClass        db    'edit',0;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>;代码段;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>        .code;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>;窗口过程;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>_ProcMain    proc    hWnd,uMsg,wParam,lParam                    pushad                mov    eax,uMsg                                .if    eax ==    WM_CREATE                                        invoke LoadIcon, hInstance, APP_ICON                                    invoke SendMessage, hWnd, WM_SETICON, ICON_BIG, eax                    ;创建文本编辑框                    invoke    CreateWindowEx,WS_EX_CLIENTEDGE,offset szEditClass,NULL,WS_CHILDWINDOW or WS_VISIBLE or WS_VSCROLL or WS_HSCROLL,0,0,500,500,hWnd,NULL,hInstance,NULL                    mov    hEdit,eax                .elseif    eax ==    WM_DESTROY                    invoke    DestroyWindow,hWinMain                                    .elseif    eax ==    WM_CLOSE                    invoke    PostQuitMessage,NULL                .else                    invoke    DefWindowProc,hWnd,uMsg,wParam,lParam                    ret                .endif                                xor eax,eax                popad                ret_ProcMain endp;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>_WinMain    proc            LOCAL    @stWndClass:WNDCLASSEX        LOCAL    @stMsg:MSG                        invoke    GetModuleHandle,NULL        mov        hInstance,eax        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.style,CS_HREDRAW or    CS_VREDRAW         mov    @stWndClass.cbClsExtra,NULL        mov    @stWndClass.cbWndExtra,NULL                mov    @stWndClass.hbrBackground,COLOR_WINDOW + 1        mov    @stWndClass.lpszMenuName,NULL        mov    @stWndClass.lpszClassName,offset szClassName                invoke    LoadIcon,NULL,APP_ICON        mov    @stWndClass.hIcon,eax        mov    @stWndClass.hIconSm,eax                invoke    RegisterClassEx,addr @stWndClass;******************************************************************;建立现实窗口;******************************************************************        invoke    CreateWindowEx,NULL,\                    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        ;******************************************************************;消息循环;******************************************************************        .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 


大家帮忙看看,谢谢大家了。

[解决办法]
上述的程序在XP下也不能正常运行,但经过修改后可以运行你:
.386
.model flat,stdcall
option casemap:none
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;equ 值定义
APP_ICON EQU 1200
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;include文件定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

include windows.inc
include kernel32.inc
include user32.inc
include gdi32.inc

includelib kernel32.lib
includelib user32.lib
includelib gdi32.lib

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;数据段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.data?
hInstance dd ?
hWinMain dd ?
hEdit dd ?

.const
szClassName db 'MyTextClass',0
szCaptionMain db 'MyTextClass~',0
szEditClass db 'edit',0

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;代码段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.code
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;窗口过程
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_ProcMain proc hWnd,uMsg,wParam,lParam

pushad
mov eax,uMsg

.if eax == WM_CREATE

invoke LoadIcon, hInstance, APP_ICON
invoke SendMessage, hWnd, WM_SETICON, ICON_BIG, eax
;创建文本编辑框
invoke CreateWindowEx,WS_EX_CLIENTEDGE,offset szEditClass,NULL,WS_CHILDWINDOW or WS_VISIBLE or WS_VSCROLL or WS_HSCROLL,0,0,500,500,hWnd,NULL,hInstance,NULL


mov hEdit,eax
.elseif eax == WM_DESTROY
invoke DestroyWindow,hWinMain

.elseif eax == WM_CLOSE
invoke PostQuitMessage,NULL
.else
invoke DefWindowProc,hWnd,uMsg,wParam,lParam
ret
.endif

xor eax,eax
popad
ret

_ProcMain endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_WinMain proc

LOCAL @stWndClass:WNDCLASSEX
LOCAL @stMsg:MSG


invoke GetModuleHandle,NULL
mov hInstance,eax
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.style,CS_HREDRAW or CS_VREDRAW
mov @stWndClass.cbClsExtra,NULL
mov @stWndClass.cbWndExtra,NULL

mov @stWndClass.hbrBackground,COLOR_WINDOW + 1
mov @stWndClass.lpszMenuName,NULL
invokeMessageBox,NULL,offset szClassName,offset szCaptionMain,MB_OK
invoke LoadIcon,NULL,APP_ICON
mov @stWndClass.hIcon,eax
mov @stWndClass.hIconSm,eax

invoke RegisterClassEx,addr @stWndClass
;******************************************************************
;建立现实窗口
;******************************************************************

invoke CreateWindowEx,NULL,\
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

;******************************************************************
;消息循环
;******************************************************************
.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



[解决办法]
正解?楼主的问题,主要是因为在 RegisterClassEx() 之前没有设置正确的窗口类回调函数吧,即应该有 mov @stWndClass.lpfnWndProc, _ProcMain 这一指令。而 #1 楼的代码并没有解决这个问题并正常地显示出楼主所想要的窗口来吧。

读书人网 >汇编语言

热点推荐