用Visual Studio 2015 编写 MASM 汇编程序(二)从头开发一个Win32汇编程序
一,建立一个VC的控制台类型的空工程:
1,从VS菜单中选择“文件”->“新建”->“项目”。
2,在新建项目中选择:“Visual c++”->"Win32"->"Win32控制台应用程序",随后输入工程名称,随后点击“确定”按钮。
3,随后点击“下一步”按钮。
4,随后选择“控制台应用程序”->"空项目",随后点击“完成”按钮。
到这里,我们就创建了一个VC的控制台类型的空项目。
二,编写第一个MASM的Win32汇编窗口程序。
1,在工程名称上面鼠标右键,随后在右键菜单上点击“添加”->“新建项”。
2,在“添加新项”对话框中选择“C++文件(.cpp)”,随后在下面的文件名称中输入你想要的文件名,注意文件的扩展名一定是“asm”,我使用的文件名称是“FirstWindow.asm”,随后点击“添加”按钮。
3,这是创建了我要创建的汇编程序的截图,已经创建了一个空白的汇编程序,需要在这里加入汇编程序代码。
三,对Win32汇编工程设置,编写汇编程序,编译这个汇编程序。
1,设置工程的依赖性。
A,鼠标右键工程名称,在右键菜单中选择“生成依赖项”->“生成自定义”。
B,随后选中“masm”,随后点击“确定”按钮。
2,添加汇编程序文件,编写汇编程序。
A,工程名称上面鼠标右键,在右键菜单中点击“添加”->"新建项"。
B,选择“C++文件(.cpp)”,随后在下面的名称中输入我们要使用的程序文件名称,注意这个文件扩展名必须是“asm”,我使用的文件名是"FirstWindow.asm",随后点击“添加”按钮。
C,编写汇编代码。
全部汇编源码:
.
.model flat,stdcall
option casemap:none
;---------------------------------------------------------------------------------
; Include 文件定义 comment * 多行注释
include \masm32\include\windows.inc
include \masm32\include\gdi32.inc
includelib \masm32\includelib\gdi32.lib
include \masm32\include\user32.inc
includelib \masm32\includelib\user32.lib
include \masm32\include\kernel32.inc
includelib \masm32\includelib\kernel32.lib
* ;当前正在引入的inc和lib
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 ? bResult dd ? ;运行结果 .const
szClassName db 'MyClass',
szCaptionMain db 'My first Window !',
szText db 'Win32 Assembly, Simple and powerful !', szRegisterSuccess db '注册窗口成功!', ;操作成功的提示信息 szAppName db 'FirstMASM', ;---------------------------------------------------------------------------------
; 代码段
.code ;---------------------------------------------------------------------------------
;windows窗口程序的入口函数
WinMainProc proc
local @stWndClass:WNDCLASSEX
local @stMsg:MSG ;得到当前程序的句柄
invoke GetModuleHandle,NULL
mov hInstance,eax ;给当前操作分配内存
invoke RtlZeroMemory,addr @stWndClass,sizeof @stWndClass ;得到光标
invoke LoadCursor,,IDC_ARROW
mov @stWndClass.hCursor,eax ;从eax中取出光标句柄,并设置到窗口类中
push hInstance
pop @stWndClass.hInstance
mov @stWndClass.cbSize,sizeof WNDCLASSEX
mov @stWndClass.style,CS_HREDRAW or CS_VREDRAW
mov @stWndClass.lpfnWndProc,offset DoMessageProc
mov @stWndClass.hbrBackground,COLOR_WINDOW +
mov @stWndClass.lpszClassName,offset szClassName invoke RegisterClassEx,addr @stWndClass ;注册窗口类 mov bResult,eax ;得到注册窗口结果 ;对注册窗口类结果判断
.if bResult==
invoke ExitProcess,NULL ;注册窗口类失败,直接退出当前程序
.else
invoke MessageBox,NULL,offset szRegisterSuccess,offset szAppName,MB_OK
.endif ;---------------------------------------------------------------------------------
; 建立并显示窗口
invoke CreateWindowEx,WS_EX_CLIENTEDGE,offset szClassName,offset szCaptionMain,\
WS_OVERLAPPEDWINDOW,\
,,,,\
NULL,NULL,hInstance,NULL
mov hWinMain,eax
invoke ShowWindow,hWinMain,SW_SHOWNORMAL
invoke UpdateWindow,hWinMain ; 消息循环
.while TRUE
invoke GetMessage,addr @stMsg,NULL,, .if eax ==
.break
.endif invoke TranslateMessage,addr @stMsg
invoke DispatchMessage,addr @stMsg
.endw
ret WinMainProc endp ;---------------------------------------------------------------------------------
; 处理windows消息的过程,Windows的回调函数
DoMessageProc 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,-,\
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 DoMessageProc endp ;---------------------------------------------------------------------------------
;程序入口点,启动WinMainProc函数
start:
call WinMainProc
invoke ExitProcess,NULL
end start
到这里,建立一个汇编工程,并且编写了汇编程序代码,但是还是不能编译,需要进一步对工程设置。
3,对"Microsoft Macro Assembler"的设置。
用Visual Studio 2015 编写 MASM 汇编程序(二)从头开发一个Win32汇编程序的更多相关文章
- (英文版)使用Visual Studio 2015 编写 MASM 汇编程序!
原文地址:http://kipirvine.com/asm/gettingStartedVS2015/index.htm#CreatingProject Getting Started with MA ...
- 用Visual Studio 2015 编写 MASM 汇编程序(一)环境配置
原文地址:http://kipirvine.com/asm/gettingStartedVS2015/index.htm#CreatingProject 下面内容根据上面文章翻译整理而来! 开发32位 ...
- 用Visual Studio 2015 编写驱动之前一定要注意的问题!!!
如果你确定要使用Visual Studio 2015 编写驱动,那么在你安装Visual Studio 2015 和WDK之前,一定一定要注意一件事情,那就是确保SDK和WDK版本保持一致,切记切记! ...
- ASP.NET 5系列教程 (五):在Visual Studio 2015中使用Grunt、Bower开发Web程序
基于Visual Studio 2015,你可以: 方便的管理前端包,如jQuery, Bootstrap, 或Angular. 自动运行任务,如LESS.JavaScript压缩.JSLint.Ja ...
- 用Visual Studio 2015 编写第一个UMDF驱动遇到的问题!!
前提:Visual Studio 2015已经成功安装了驱动环境,WDK都已经完全正常安装了,在Visual Studio 2015的菜单可以看到"Driver"菜单项了.这说明已 ...
- Visual Studio 2015 预览版 - 支持跨平台开发Android/iOS应用程序(内置安卓模拟器)
微软最近的惊人举动真多,对普通消费者Office 移动版宣布免费,对开发者也发布了完全免费的 VS2013 社区版! 不仅如此,就连 .Net 开发框架环境也竟然「开源」并且跨平台支持 Mac 及 L ...
- Windows 10和Visual Studio 2015 能给.Net方向的开发从业者带来什么?
.Net 多年前我们选择了你,现在在当前的移动互联网热火朝天的时代,你能给我们什么样的惊喜?面对IOS和android的势头,windows的移动端能否实现三国鼎立? windows 10 号称统一各 ...
- Visual Studio 2015 使用ODP.net进行EF开发
刚转了新公司,以前公司都是用VS+MSSQL作为开发工具的 现在新公司由于数据库是Oracle,而且新公司比较小规模,开发团队也没有什么规范 访问数据库的方式一直使用ADO.net的DataTable ...
- Visual Studio 2015 前端开发工作流
Visual Studio 2015 CTP 5,全称为 Visual Studio 2015 Community Technology Preview 5,意为社区技术预览版,之前的版本为:Visu ...
随机推荐
- POST请求BODY格式区别
在PostMan中用Post方式,Body有form-data,x-www-form-urlencoded,raw,binary四种. Request Header示例:POST /upload.do ...
- PostMan Request Export
- AnnotatedElementUtils.findMergedAnnotation作用
// 在element上查询annotationType类型注解 // 将查询出的多个annotationType类型注解属性合并到查询的第一个注解中 // # 多个相同注解合并 org.spring ...
- c#修改webservice 的地址和端口(修改配置文件)
修改服务引用的地址和端口有两种方法: 1.直接修改配置文件web.config 2.动态修改: 右击转到实现 发现五个构造方法,通过第三个构造方法即可进行URL的初始化 IIS修改IP地址后 直接在初 ...
- how-does-mysql-replication-really-work/ what-causes-replication-lag
https://www.cnblogs.com/kevingrace/p/6274073.html https://www.cnblogs.com/kevingrace/p/6261091.html ...
- CEF CefSettings 结构体 详解
1. single_process: 设置为ture时,browser和render使用同一个进程.Chromium 不正是支持此运行模式,并且不如默认的多进程稳定. 2. no_sandbox: 沙 ...
- 【Linux】walle 部署上线单报错:mv: cannot overwrite directory ‘/www’ with non-directory
错误截图 问题分析:项目设置中. 目标集群部署路径错误, 举例: 假设你 项目名称:laofan 在目标服务器的路径: /www/wwwdata/laofan 那么你在标集群部署路径 就可以写: /w ...
- [LeetCode] 249. Group Shifted Strings 分组偏移字符串
Given a string, we can "shift" each of its letter to its successive letter, for example: & ...
- oracle 添加字段
alter table 表名 add 新增字段名(类型+长度); #添加字段 alter table asset_orders add remark varchar2(255); #查看 descri ...
- linux 保留yum安装后的rpm包
在linux上,使用yum安装,默认安装完成之后会删除下载的rpm包:想要yum安装软件后,还保留安装包,那么需要修改/etc/yum.conf配置文件中的keepcache参数. [root@bog ...