news 2026/11/2 14:14:35

汇编语言全接触-76.用汇编编 Windows 程序

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
汇编语言全接触-76.用汇编编 Windows 程序

概述:

用汇编编制一般的 Windows 程序需要的不是汇编编程的资料,而是 Windows 函数调用的资料,你分析一下下面的源程序就会发现,程序的结构跟用 BC++ 编 Windows 程序几乎一模一样,原来用 C++ 函数的地方,变成了一个 Call 外部子程序,而函数的参数是由 PUSH 指令先压入堆栈,先由最后一个参数压起。同样,用汇编编 Windows 程序也需要 .DEF 文件和 .RES 文件,这是由 Windows 程序的结构决定的。本文是一个最简单的 Windows 程序,仅仅开了一个窗口,说一句话:"Hello, Windows 95!",这个声音文件是我从别的地方拷来的,你可以把它换成其他声音文件。

用于编译的工具请到软件下载中找,本文要用到的是 Tasm.exe,Tlink.exe,Make.exe 和库文件 Import32.lib。这儿是源程序和编译好的可执行文件的压缩档:Hellowin.zip

源程序:

文件 Makefile 的内容,这个文件是给 Make.exe 用的,告诉它用什么库文件,什么 .RES 文件等等:

NAME = hellowin

OBJS = $(NAME).obj

DEF = $(NAME).def

RES = $(NAME).res

IMPORT=IMPORT32

$(NAME).EXE: $(OBJS) $(DEF)

tlink32 /Tpe /aa /c $(LINKDEBUG) $(OBJS),,, $(IMPORT), $(DEF),

.asm.obj:

tasm32 /ml /m2 $&.asm,,,

文件 Hellowin.def 的内容,同编 C++ 程序一样,定义了数据段,代码段的属性等内容:

NAME HELLOWIN

DESCRIPTION '(C) Copyright by Lyb'

CODE PRELOAD MOVEABLE DISCARDABLE

DATA PRELOAD MOVEABLE MULTIPLE

EXETYPE WINDOWS

HEAPSIZE 8192

STACKSIZE 8192

EXPORTS WndProc

HelloWin 的源程序:

.486p

.model flat,STDCALL

include windows.inc ;外部子程序,常量的定义等

;**************************************************

.data

msg MSGSTRUCT <?> ;消息

wndclass WNDCLASS <?> ;Windows 类

ptstr PAINTSTRUCT <?> ;用于屏幕刷新的句柄

rect RECT <?> ;

h_dc dd ? ;DC 句柄,用于屏幕刷新的句柄

h_inst dd ? ;handle of module

h_win dd ? ;handle of window

d_class db "hello win",0

t_title db "Hello, windows 95 !",0

t_copy db 'A copy of program is already running, continue ? ',0

paint_x dd ?

paint_y dd ?

wav_filename db 'hellowin.wav',0

;**************************************************

.code

start:

push 0

call GetModuleHandle ;取模块句柄

mov h_inst,eax

find_class:

push 0

push offset d_class

call FindWindow ;查找有无程序副本在运行

or eax,eax

jz register_class

push MB_YESNO or MB_ICONQUESTION

push offset t_title

push offset t_copy

push 0

call MessageBox ;显示一个对话框

cmp eax,IDNO

jz end_loop

register_class:

push IDC_ARROW

push 0

call LoadCursor ;装入光标

mov wndclass.clsHCursor,eax

mov wndclass.clsStyle,CS_HREDRAW or CS_VREDRAW

mov wndclass.clsLpfnWndProc,offset WndProc

mov wndclass.clsCbClsExtra,0

mov wndclass.clsCbWndExtra,0

mov eax,h_inst

mov wndclass.clsHInstance,eax

mov wndclass.clsHIcon,0

mov wndclass.clsHbrBackground,COLOR_WINDOW+1

mov wndclass.clsLpszMenuName,0

mov wndclass.clsLpszClassName,offset d_class

push offset wndclass

call RegisterClass ;注册窗口类

; create new window

push 0

push h_inst

push 0

push 0

push CW_USEDEFAULT

push CW_USEDEFAULT

push CW_USEDEFAULT

push CW_USEDEFAULT

mov eax,WS_OVERLAPPEDWINDOW or WS_MINIMIZE

push eax

push offset t_title

push offset d_class

push 0

call CreateWindowEx ;创建一个窗口

mov h_win,eax

; show new window

push SW_SHOWNORMAL

; push SW_SHOWMINNOACTIVE ;show in task bar

push h_win

call ShowWindow ;显示窗口

push h_win

call UpdateWindow ;刷新窗口

msg_loop:

push 0

push 0

push 0

push offset msg

call GetMessage ;取消息循环

cmp ax,0

jz end_loop

push offset msg

call TranslateMessage ;把消息传给 WndProc 子程序

push offset msg

call DispatchMessage

jmp msg_loop

end_loop:

push msg.msWPARAM

call ExitProcess

;********************************************************************

; WndProc

;消息处理程序

;********************************************************************

WndProc proc uses ebx edi esi,hwnd:DWORD,wmsg:DWORD,wparam:DWORD,lparam:DWORD

LOCAL theDC:DWORD

;注意,以上的结构是固定的,因为 Windows 自己回先把 EBX,EDI,ESI 压入 STACK

mov eax,wmsg

cmp eax,WM_CREATE ;判断消息类型并执行响应程序

jz wm_create

cmp eax,WM_DESTROY

jz wm_destroy

cmp eax,WM_PAINT

jz wm_paint

push lparam ;return with default windows proc

push wparam

push wmsg

push hwnd

call DefWindowProc

ret

wm_create:

push 20000h or 1 ;snd_filename | snd_async

push 0

push offset wav_filename

call PlaySound

xor eax,eax

ret

wm_paint:

push offset ptstr

push hwnd

call BeginPaint

mov h_dc,eax

push offset rect

push hwnd

call GetClientRect

push 20h or 1 or 4 ;dt_singleline | dt_enter | DT_VCENTEr

push offset rect

push -1

push offset t_title

push h_dc

call DrawText

push offset ptstr

push hwnd

call EndPaint

xor eax,eax

ret

wm_destroy:

push 0

call PostQuitMessage

xor eax,eax

ret

WndProc endp

public WndProc

ends

end start

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/11/2 2:57:55

M2FP文档精读:理解Flask服务结构与API接口设计逻辑

M2FP文档精读&#xff1a;理解Flask服务结构与API接口设计逻辑 &#x1f4cc; 引言&#xff1a;为何需要一个稳定可部署的人体解析Web服务&#xff1f; 在计算机视觉领域&#xff0c;人体解析&#xff08;Human Parsing&#xff09; 是一项细粒度的语义分割任务&#xff0c;目标…

作者头像 李华
网站建设 2026/11/2 2:58:12

轻量级AI应用崛起:M2FP CPU版成中小企业首选方案

轻量级AI应用崛起&#xff1a;M2FP CPU版成中小企业首选方案 随着人工智能技术从“大模型、重算力”向“轻量化、可落地”演进&#xff0c;越来越多的中小企业开始关注低成本、高稳定性、无需GPU即可运行的AI解决方案。在图像语义分割领域&#xff0c;M2FP&#xff08;Mask2For…

作者头像 李华
网站建设 2026/11/1 11:50:49

人体部位分割新标杆:M2FP支持19类精细语义标签输出

人体部位分割新标杆&#xff1a;M2FP支持19类精细语义标签输出 &#x1f4d6; 技术背景与行业痛点 在计算机视觉领域&#xff0c;人体解析&#xff08;Human Parsing&#xff09; 是一项关键的细粒度语义分割任务&#xff0c;目标是将人体图像中的每个像素精确归类到具体的解剖…

作者头像 李华
网站建设 2026/11/2 1:49:43

真实项目落地分享:基于M2FP的健身动作识别系统开发全过程

真实项目落地分享&#xff1a;基于M2FP的健身动作识别系统开发全过程 在智能健身、远程运动指导等新兴场景中&#xff0c;精准的人体动作理解能力已成为核心技术瓶颈。传统姿态估计算法&#xff08;如OpenPose&#xff09;虽能提取关键点&#xff0c;但难以区分衣物、身体部位重…

作者头像 李华
网站建设 2026/11/1 15:19:16

从图片到3D:M2FP助力人体建模流程

从图片到3D&#xff1a;M2FP助力人体建模流程 &#x1f9e9; M2FP 多人人体解析服务 (WebUI API) &#x1f4d6; 项目简介 在三维数字人、虚拟试衣、动作捕捉等前沿应用中&#xff0c;高精度的人体语义分割是构建完整建模流程的关键第一步。传统方法往往受限于多人场景下的遮挡…

作者头像 李华