Win32汇编学习笔记(三)

简介:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Sender.asm
; 从一个程序向另一个窗口程序发送消息 之 发送程序
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
        .386
        .model flat,stdcall
        option casemap:none
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Include 文件定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include        windows.inc
include        user32.inc
includelib    user32.lib
include        kernel32.inc
includelib    kernel32.lib
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 数据段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
        .data
hWnd        dd    ?
szBuffer    db    256 dup (?)

        .const
szCaption    db    'SendMessage',0
szStart        db    'Press OK to start SendMessage, param: %08x!',0
szReturn    db    'SendMessage returned!',0
szDestClass    db    'MyClass',0    ;目标窗口的窗口类
szText        db    'Text send to other windows',0
szNotFound    db    'Receive Message Window not found!',0
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 代码段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
        .code
start:
        invoke    FindWindow,addr szDestClass,NULL
        .if    eax
            mov    hWnd,eax    ;找到目标窗口则发送消息
            invoke    wsprintf,addr szBuffer,addr szStart,addr szText
            invoke    MessageBox,NULL,offset szBuffer,offset szCaption,MB_OK
            invoke    SendMessage,hWnd,WM_SETTEXT,0,addr szText
            invoke    MessageBox,NULL,offset szReturn,offset szCaption,MB_OK
        .else
            invoke    MessageBox,NULL,offset szNotFound,offset szCaption,MB_OK
        .endif
        invoke    ExitProcess,NULL
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
        end    start
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>


消息发送者代码:
; Receiver.asm
; 从一个程序向另一个窗口程序发送消息 之 消息接收程序
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

        .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    ?
szBuffer    db    512 dup (?)

        .const
szClassName    db    'MyClass',0
szCaptionMain    db    'Receive Message',0

szReceive    db    'Receive WM_SETTEXT message',0dh,0ah
        db    'param: %08x',0dh,0ah
        db    'text: "%s"',0dh,0ah,0
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 代码段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
        .code
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 窗口过程
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_ProcWinMain    proc    uses ebx edi esi,hWnd,uMsg,wParam,lParam

        mov    eax,uMsg
;****************************************************************
        .if    eax ==    WM_CLOSE
            invoke    DestroyWindow,hWinMain
            invoke    PostQuitMessage,NULL
;****************************************************************
; 收到 WM_SETTEXT 消息则将消息字符串和字符串地址显示出来
;****************************************************************
        .elseif    eax ==    WM_SETTEXT
            invoke    wsprintf,addr szBuffer,addr szReceive,\
                lParam,lParam
            invoke    MessageBox,hWnd,offset szBuffer,addr szCaptionMain,MB_OK
;****************************************************************
        .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,\
            50,50,200,150,\
            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


MakeFile文件:
LINK_FLAG = /subsystem:windows
ML_FLAG = /c /coff
all: Sender.exe Receiver.exe
Sender.exe: Sender.obj
    Link $(LINK_FLAG) Sender.obj
Receiver.exe: Receiver.obj
    Link $(LINK_FLAG) Receiver.obj
.asm.obj:
    ml $(ML_FLAG) $<
clean:
    del *.obj


本文转自Phinecos(洞庭散人)博客园博客,原文链接:http://www.cnblogs.com/phinecos/archive/2008/03/07/1094999.html,如需转载请自行联系原作者
目录
相关文章
|
IDE API 开发工具
Win32汇编开发环境介绍和RadAsm简明教程
Win32汇编开发环境介绍和RadAsm简明教程 现在很多朋友都在学习汇编语言,一方面汇编语言是大学计算机课程的必修课,另一方面则是为了从其它语言转到汇编语言来,无论什么原因,我认为学习汇编语言是 件很有趣的事,学习它不但可以深入了解编程语言的内部表现,也是进一步了解操作系统的途径。
970 0
|
IDE API 开发工具
Win32汇编开发环境介绍和RadAsm简明教程
Win32汇编开发环境介绍和RadAsm简明教程 现在很多朋友都在学习汇编语言,一方面汇编语言是大学计算机课程的必修课,另一方面则是为了从其它语言转到汇编语言来,无论什么原因,我认为学习汇编语言是 件很有趣的事,学习它不但可以深入了解编程语言的内部表现,也是进一步了解操作系统的途径。
1027 0
|
IDE API 开发工具
Win32汇编开发环境介绍和RadAsm简明教程
Win32汇编开发环境介绍和RadAsm简明教程 现在很多朋友都在学习汇编语言,一方面汇编语言是大学计算机课程的必修课,另一方面则是为了从其它语言转到汇编语言来,无论什么原因,我认为学习汇编语言是 件很有趣的事,学习它不但可以深入了解编程语言的内部表现,也是进一步了解操作系统的途径。
1965 0
|
6月前
|
存储 Unix 编译器
汇编语言----X86汇编指令
汇编语言----X86汇编指令
224 2
|
1月前
|
存储 移动开发 C语言
【ARM汇编速成】零基础入门汇编语言之指令集(三)
【ARM汇编速成】零基础入门汇编语言之指令集(三)
|
1月前
|
编译器 C语言 计算机视觉
【ARM汇编速成】零基础入门汇编语言之指令集(二)
【ARM汇编速成】零基础入门汇编语言之指令集(二)
146 0
|
6月前
|
存储 机器学习/深度学习 移动开发
汇编语言指令系列
汇编语言指令系列
672 0