逆流杀 发表于 2015-4-17 18:24:51

win32第一个程序,在线求问

为什么两个都是自己定义的子程序,_ProcWinMain要声明参数, _WinMain        proc为却不需要声明, ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Sample code for < Win32ASM Programming 2nd Edition>
; by 罗云彬, http://asm.yeah.net
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; FirstWindow.asm
; 窗口程序的模板代码
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 使用 nmake 或下列命令进行编译和链接:
; ml /c /coff FirstWindow.asm
; Link /subsystem:windows FirstWindow.obj
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
                .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?
hInstance        dd                ?
hWinMain        dd                ?

                .const
szClassName        db        'MyClass',0
szCaptionMain        db        'My first Window !',0
szText                db        'Win32 Assembly,   !',0
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 代码段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
                .code
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 窗口过程
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
<span style="background-color: red;">_ProcWinMain        proc        uses ebx edi esi hWnd,uMsg,wParam,lParam</span>
                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
;********************************************************************
                xor        eax,eax
                ret

_ProcWinMain        endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
<span style="background-color: red;">_WinMain        proc</span>
                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.lpfnWndProc,offset _ProcWinMain
                mov        @stWndClass.hbrBackground,COLOR_WINDOW + 1
                mov        @stWndClass.lpszClassName,offset szClassName
                invoke        RegisterClassEx,addr @stWndClass
;********************************************************************
; 建立并显示窗口
;********************************************************************
                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
;********************************************************************
; 消息循环
;********************************************************************
                .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


freeparty 发表于 2015-4-17 18:24:52

    .386
    .model flat, stdcall
    option casemap:none
   
include      windows.inc
include      kernel32.inc
includelib   kernel32.lib
include      user32.inc
includelib   user32.lib

    .data
AppLoadMsgTitle db"装载应用程序", 0
AppLoadMsgTextdb"收到WM_CREATE消息", 0

PopupTitle      db"弹出窗口", 0
PopupText       db"您已经按下鼠标左键", 0

GreetTitle      db"主窗口激活", 0
GreetText       db"将显示主窗口", 0

CloseMsg      db"收到WM_CLOSE消息", 0
CloseWinMsg   db"关闭窗口", 0

ErrorTitle      db"错误", 0
WindowName      db"鱼C工作室(www.fishc.com)Win32案例演示程序"
ClassName       db"类名", 0

MainWin WNDCLASS <CS_HREDRAW or CS_VREDRAW,\
                WinProc,\
                NULL,\
                NULL,\
                NULL,\
                NULL,\
                NULL,\
                COLOR_WINDOW+1,\
                NULL,\
                ClassName>
                  
msg MSG <>          ; 消息结构
winRect RECT    <>; 矩形坐标结构
hMainWnd    dd?   ; 主窗口的句柄
hInstance   dd?   ; 模块的句柄

    .code
WinMain PROC                        ; 主程序入口点

    invokeGetModuleHandle, NULL   ; 获取本模块句柄
    mov hInstance, eax
    mov MainWin.hInstance, eax
   
    invoke LoadIcon, NULL, IDI_APPLICATION; 载入图标并填充
    mov MainWin.hIcon, eax
   
    invoke LoadCursor, NULL, IDC_ARROW      ; 载入鼠标光标并填充
    mov MainWin.hCursor, eax
   
    invoke RegisterClass, addr MainWin      ; 注册窗口
    .if eax == 0
      call ErrorHandler         ; 显示错误信息,该过程在后边定义
      jmp Exit_Program
    .endif
   
    invoke      CreateWindowEx,WS_EX_CLIENTEDGE,offset ClassName,offset WindowName,\
      WS_OVERLAPPEDWINDOW,\
      100,100,600,400,\
      NULL,NULL,hInstance,NULL
    mov hMainWnd, eax
    .if eax == 0
      call ErrorHandler
      jmp Exit_Program
    .endif
   
    invoke ShowWindow, hMainWnd, SW_SHOW
   
    invoke UpdateWindow, hMainWnd
   
    invoke MessageBox,
      hMainWnd,
      addr GreetText,
      addr GreetTitle,
      MB_OK
      
    @@:
      invoke GetMessage,      ; 从消息队列取消息
            addr msg,         ; 传入待填充的消息结构的地址
            NULL,               ; NULL代表要取本程序所属的窗口的消息
            NULL,               
            NULL
            
      .if eax == 0            ; 没有获得消息
            jmp Exit_Program
      .endif
      
      invoke DispatchMessage,
            addr msg
      jmp @B
      
Exit_Program:
    invoke ExitProcess, 0
   
WinMain ENDP
   
WinProc PROC, hWnd:DWORD, localMsg:DWORD, wParam:DWORD, lParam:DWORD

    mov eax, localMsg
   
    .if eax == WM_LBUTTONDOWN
      invoke MessageBox, hWnd, addr PopupText, addr PopupTitle, MB_OK
      jmp WinProcExit
   
    .elseif eax == WM_CLOSE
      invoke MessageBox, hWnd, addr CloseMsg, addr CloseWinMsg, MB_OK
      invoke PostQuitMessage, 0
      jmp WinProcExit
   
    .elseif eax == WM_CREATE
      invoke MessageBox, hWnd, addr AppLoadMsgText, addr AppLoadMsgTitle, MB_OK
      jmp WinProcExit
      
    .else
      invoke DefWindowProc, hWnd, localMsg, wParam, lParam
      jmp WinProcExit
    .endif
   
WinProcExit:
    ret

WinProc ENDP

ErrorHandler    PROC

    local pErrorMsg:DWORD
    local messageID:DWORD
   
    invoke GetLastError   
    mov messageID, eax
   
    invoke FormatMessage,
      FORMAT_MESSAGE_ALLOCATE_BUFFER + FORMAT_MESSAGE_FROM_SYSTEM,
      NULL,
      messageID,
      NULL,
      addr pErrorMsg,
      NULL,
      NULL
      
    invoke MessageBox, NULL, pErrorMsg, addr ErrorTitle, MB_ICONERROR + MB_OK
   
    invoke LocalFree, pErrorMsg
   
    ret
   
ErrorHandler ENDP

END WinMain
这是基于win32汇编的一个窗口代码,求最佳答案{:5_110:}

freeparty 发表于 2015-4-17 22:36:06

楼主代码乱了哦

freeparty 发表于 2015-4-17 22:44:09

楼主这个帖子的内容属于汇编windows程序设计,不知道我可以解决的了吗。明天给你看看

freeparty 发表于 2015-4-17 22:47:09

是不是和函数放的位置有关,把被调用的函数过程写在调用这个函数之前试一试。

逆流杀 发表于 2015-4-17 23:18:36

freeparty 发表于 2015-4-17 22:36
楼主代码乱了哦

那我重新发给你吧,其实我是不理解,为什么同样都是子程序,也就是_ProcWinMain和_WinMain这两个用户定义的函数,前者是按照书上说的,后面带了许多参数_ProcWinMain        proc        uses ebx edi esi hWnd,uMsg,wParam,lParam;;;;;;;;也就是所谓的声明,另一个_WinMain则没有按照书上子程序的
的定义方式,

我之前想可能是因为_WinMain不是子程序,然后上网自己查了,然后看都有人写了,_WinMain也是用户定义的子程序,然后我蛋疼了;

我语文是体育老师教的,不知道这样表述你能不能清楚我问的

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Sample code for < Win32ASM Programming 2nd Edition>
; by 罗云彬, http://asm.yeah.net
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; FirstWindow.asm
; 窗口程序的模板代码
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 使用 nmake 或下列命令进行编译和链接:
; ml /c /coff FirstWindow.asm
; Link /subsystem:windows FirstWindow.obj
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
                .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?
hInstance        dd                ?
hWinMain        dd                ?

                .const
szClassName        db        'MyClass',0
szCaptionMain        db        'My first Window !',0
szText                db        'Win32 Assembly,   !',0
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 代码段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
                .code
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 窗口过程
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>






_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
;********************************************************************
                xor        eax,eax
                ret

_ProcWinMain        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.lpfnWndProc,offset _ProcWinMain
                mov        @stWndClass.hbrBackground,COLOR_WINDOW + 1
                mov        @stWndClass.lpszClassName,offset szClassName
                invoke        RegisterClassEx,addr @stWndClass
;********************************************************************
; 建立并显示窗口
;********************************************************************
                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
;********************************************************************
; 消息循环
;********************************************************************
                .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

逆流杀 发表于 2015-4-17 23:27:19

freeparty 发表于 2015-4-17 22:47
是不是和函数放的位置有关,把被调用的函数过程写在调用这个函数之前试一试。

这是从网上找的注释;


_ProcWinMain   proc   uses ebx edi esi,hWnd,uMsg,wParam,lparam   ;定义_ProcWinMain子程序.保存ebx,edi,esi的值,uMsg参数,指定的消息有一定的范围,wParam,lparam参数是消息所附带的参数,它随消息的不同而不同,

_WinMain proc                                                                                                   ;定义子程序名为_WinMain

都是子程序,为什么一个遵从书上子程序的定义,另个貌似不用遵循;

freeparty 发表于 2015-4-18 03:48:25

逆流杀 发表于 2015-4-17 23:27
这是从网上找的注释;




最简单实用的方法就是拿C写一个窗口,然后调试的时候看一下反汇编代码

逆流杀 发表于 2015-4-19 22:57:24

freeparty 发表于 2015-4-19 17:12
这是基于win32汇编的一个窗口代码,求最佳答案

看的出来,版主很用心,辛苦了,但我还是想说,我不是想要源代码,我只是纠结,为什么,_ProcWinMain   后面有这些东西proc   uses ebx edi esi,hWnd,uMsg,wParam,lparam   这些参数;而——WinMain proc    后面没有这些玩意,不管怎么说,还是谢谢版主的解答,辛苦了,我自己再慢慢往后面看看,可能以后就会懂了,谢谢了

santaclaus 发表于 2015-4-20 00:55:48

本帖最后由 santaclaus 于 2015-4-20 01:02 编辑

因为一个消息的回调函数,一个是win32程序入口函数,都是函数,但系统要求的形参不同!

逆流杀 发表于 2015-4-20 12:31:49

santaclaus 发表于 2015-4-20 00:55
因为一个消息的回调函数,一个是win32程序入口函数,都是函数,但系统要求的形参不同!

嗯嗯, 非常感谢,

xubo 发表于 2015-4-22 09:45:30

{:7_113:}
页: [1]
查看完整版本: win32第一个程序,在线求问