news 2026/4/16 18:30:44

汇编语言全接触-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/4/16 14:50:23

基于javaweb的学生用品采购系统毕业论文+PPT(附源代码+演示视频)

文章目录基于javaweb的学生用品采购系统一、项目简介&#xff08;源代码在文末&#xff09;1.运行视频2.&#x1f680; 项目技术栈3.✅ 环境要求说明4.包含的文件列表&#xff08;含论文&#xff09;数据库结构与测试用例系统功能结构前端运行截图后端运行截图项目部署源码下载…

作者头像 李华
网站建设 2026/4/16 14:50:21

M2FP模型在影视特效中的绿幕替代技术

M2FP模型在影视特效中的绿幕替代技术 引言&#xff1a;从传统绿幕到AI驱动的语义级人体解析 在影视制作与虚拟制片领域&#xff0c;绿幕抠像&#xff08;Chroma Keying&#xff09;长期以来是实现背景替换的核心技术。然而&#xff0c;传统绿幕流程依赖严格的拍摄环境——均匀打…

作者头像 李华
网站建设 2026/4/15 20:21:51

M2FP模型在虚拟试衣中的关键技术解析

M2FP模型在虚拟试衣中的关键技术解析 &#x1f9e9; M2FP 多人人体解析服务&#xff1a;虚拟试衣的视觉基石 在虚拟试衣系统中&#xff0c;精准的人体结构理解是实现“所见即所得”换装体验的核心前提。传统图像分割方法在处理多人场景时常常面临边界模糊、部件错配和遮挡误判等…

作者头像 李华
网站建设 2026/4/16 14:49:14

多任务学习:M2FP同时实现分割与姿态估计

多任务学习&#xff1a;M2FP同时实现分割与姿态估计 &#x1f4cc; 引言&#xff1a;从单任务到多任务——人体理解的新范式 在计算机视觉领域&#xff0c;人体解析&#xff08;Human Parsing&#xff09; 一直是智能交互、虚拟试衣、安防监控等场景的核心技术。传统方法往往将…

作者头像 李华
网站建设 2026/4/16 14:50:18

本地部署服务器搭建工具 PHPStudy 并实现外部访问

PHStudy 是一款便携的服务器环境搭建工具&#xff0c;能够减少 单独部署各个软件的麻烦。能够一键创建网站、FTP、数据库等功能&#xff0c;支持安全管理、计划任务、文件管理。是用于个人、小型团队和初学者。本文将详细介绍如何在本地安装 PHStudy 以及结合路由侠内网穿透实现…

作者头像 李华
网站建设 2026/4/16 14:50:27

emupedia游戏开发:M2FP为角色动画提供姿态参考数据

emupedia游戏开发&#xff1a;M2FP为角色动画提供姿态参考数据 在现代游戏与动画制作中&#xff0c;高精度的角色姿态捕捉与语义理解是提升内容生产效率的关键环节。传统动作捕捉依赖昂贵设备和专业演员&#xff0c;而基于视觉的自动化人体解析技术正逐步成为低成本、高可用的替…

作者头像 李华