news 2026/6/15 3:57:39

汇编语言全接触-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/6/13 10:47:55

基于M2FP的智能健身教练:实时动作分析系统开发

基于M2FP的智能健身教练&#xff1a;实时动作分析系统开发 &#x1f4cc; 引言&#xff1a;从人体解析到智能健身指导的技术跃迁 在智能健身设备快速发展的今天&#xff0c;用户不再满足于简单的计步或心率监测&#xff0c;而是期望获得专业级的动作反馈与纠正建议。传统基于可…

作者头像 李华
网站建设 2026/6/13 11:34:02

M2FP扩展性探讨:能否支持动物或物体解析?

M2FP扩展性探讨&#xff1a;能否支持动物或物体解析&#xff1f; &#x1f4d6; 项目背景与核心能力 M2FP&#xff08;Mask2Former-Parsing&#xff09;是基于ModelScope平台构建的多人人体解析服务&#xff0c;专注于对图像中多个人物的身体部位进行像素级语义分割。该模型在人…

作者头像 李华
网站建设 2026/6/12 16:08:06

leetcode 859. Buddy Strings 亲密字符串-耗时100

Problem: 859. Buddy Strings 亲密字符串 解题过程 耗时100%&#xff0c;首先检查长度是否相等&#xff0c;然后检查字母统计次数是否相同&#xff0c;最后统计相同索引不同字母的总数&#xff0c;若不同字母总数sum0&#xff0c;则判断是否有字母个数>1&#xff0c;若sum2则…

作者头像 李华
网站建设 2026/6/12 15:32:03

科研数据共享:实验记录自动翻译促进国际合作

科研数据共享&#xff1a;实验记录自动翻译促进国际合作 &#x1f310; AI 智能中英翻译服务 (WebUI API) &#x1f4d6; 项目简介 在全球科研合作日益紧密的背景下&#xff0c;语言障碍成为制约跨国团队高效协作的重要瓶颈。尤其在实验数据记录、论文撰写与成果交流过程中&am…

作者头像 李华
网站建设 2026/6/12 15:14:35

Z-Image-Turbo模型融合技术可行性研究

Z-Image-Turbo模型融合技术可行性研究 引言&#xff1a;从二次开发到模型融合的技术跃迁 阿里通义Z-Image-Turbo WebUI图像快速生成模型&#xff0c;作为基于DiffSynth Studio框架构建的高效AI图像生成工具&#xff0c;已在本地部署与快速推理方面展现出卓越性能。该项目由开…

作者头像 李华
网站建设 2026/6/12 15:58:58

M2FP模型部署实战:Flask Web服务搭建全流程

M2FP模型部署实战&#xff1a;Flask Web服务搭建全流程 &#x1f9e9; 项目背景与核心价值 在计算机视觉领域&#xff0c;人体解析&#xff08;Human Parsing&#xff09; 是一项关键的细粒度语义分割任务&#xff0c;旨在将人体分解为多个语义明确的身体部位&#xff0c;如头…

作者头像 李华